@mastra/core 1.31.0-alpha.4 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +118 -0
- package/dist/agent/durable/index.cjs +22 -22
- package/dist/agent/durable/index.js +4 -4
- package/dist/agent/index.cjs +9 -9
- package/dist/agent/index.js +1 -1
- package/dist/browser/index.cjs +2 -2
- package/dist/browser/index.js +1 -1
- package/dist/channels/index.cjs +4 -4
- package/dist/channels/index.js +1 -1
- package/dist/{chunk-2J3YSWHO.cjs → chunk-3LHTPHZP.cjs} +59 -59
- package/dist/{chunk-2J3YSWHO.cjs.map → chunk-3LHTPHZP.cjs.map} +1 -1
- package/dist/{chunk-UADG5CCD.js → chunk-43WNQPFP.js} +4 -4
- package/dist/{chunk-UADG5CCD.js.map → chunk-43WNQPFP.js.map} +1 -1
- package/dist/{chunk-W6E5CCSB.js → chunk-53NCBZKI.js} +4 -4
- package/dist/{chunk-W6E5CCSB.js.map → chunk-53NCBZKI.js.map} +1 -1
- package/dist/{chunk-WRJUVUIZ.cjs → chunk-5B6LXG5O.cjs} +389 -389
- package/dist/{chunk-WRJUVUIZ.cjs.map → chunk-5B6LXG5O.cjs.map} +1 -1
- package/dist/{chunk-GB2U2Y3P.js → chunk-5QMK4T3X.js} +3 -3
- package/dist/{chunk-GB2U2Y3P.js.map → chunk-5QMK4T3X.js.map} +1 -1
- package/dist/{chunk-BLU4IC6F.cjs → chunk-6MVINWPK.cjs} +14 -14
- package/dist/{chunk-BLU4IC6F.cjs.map → chunk-6MVINWPK.cjs.map} +1 -1
- package/dist/{chunk-7LKPZXDM.js → chunk-7AX25YLX.js} +4 -4
- package/dist/{chunk-7LKPZXDM.js.map → chunk-7AX25YLX.js.map} +1 -1
- package/dist/{chunk-QABIZQB7.js → chunk-BME3IGZD.js} +3 -3
- package/dist/{chunk-QABIZQB7.js.map → chunk-BME3IGZD.js.map} +1 -1
- package/dist/{chunk-CDS2VUE2.cjs → chunk-DNNICOYK.cjs} +20 -20
- package/dist/{chunk-CDS2VUE2.cjs.map → chunk-DNNICOYK.cjs.map} +1 -1
- package/dist/{chunk-VR5VNHNZ.js → chunk-FAPA556P.js} +8 -8
- package/dist/{chunk-VR5VNHNZ.js.map → chunk-FAPA556P.js.map} +1 -1
- package/dist/{chunk-AUQH3O4N.js → chunk-HAU2MDSW.js} +4 -4
- package/dist/{chunk-AUQH3O4N.js.map → chunk-HAU2MDSW.js.map} +1 -1
- package/dist/{chunk-3734AUDT.js → chunk-J72QZMTT.js} +6 -6
- package/dist/{chunk-3734AUDT.js.map → chunk-J72QZMTT.js.map} +1 -1
- package/dist/{chunk-IFC3YAVV.cjs → chunk-JH7D3XKB.cjs} +19 -19
- package/dist/{chunk-IFC3YAVV.cjs.map → chunk-JH7D3XKB.cjs.map} +1 -1
- package/dist/{chunk-XBCX5E3N.js → chunk-KXI7J3FZ.js} +3 -3
- package/dist/chunk-KXI7J3FZ.js.map +1 -0
- package/dist/{chunk-UCSM3GWM.js → chunk-LD7UCH6D.js} +3 -3
- package/dist/{chunk-UCSM3GWM.js.map → chunk-LD7UCH6D.js.map} +1 -1
- package/dist/{chunk-YBNPB36J.cjs → chunk-OSMMAURN.cjs} +9 -9
- package/dist/{chunk-YBNPB36J.cjs.map → chunk-OSMMAURN.cjs.map} +1 -1
- package/dist/{chunk-WDCXTDRR.cjs → chunk-SI6NWTR2.cjs} +7 -7
- package/dist/{chunk-WDCXTDRR.cjs.map → chunk-SI6NWTR2.cjs.map} +1 -1
- package/dist/{chunk-EE2UB4VX.js → chunk-TRVPCCVP.js} +3 -3
- package/dist/{chunk-EE2UB4VX.js.map → chunk-TRVPCCVP.js.map} +1 -1
- package/dist/{chunk-PBKTHAF5.cjs → chunk-TSGU2S4P.cjs} +5 -5
- package/dist/{chunk-PBKTHAF5.cjs.map → chunk-TSGU2S4P.cjs.map} +1 -1
- package/dist/{chunk-HTAWEZ7M.cjs → chunk-TUZTUFQO.cjs} +3 -3
- package/dist/{chunk-HTAWEZ7M.cjs.map → chunk-TUZTUFQO.cjs.map} +1 -1
- package/dist/{chunk-2CAB6LW3.cjs → chunk-V4RZ4FO4.cjs} +224 -224
- package/dist/{chunk-2CAB6LW3.cjs.map → chunk-V4RZ4FO4.cjs.map} +1 -1
- package/dist/{chunk-GUYKZ5U2.cjs → chunk-VWZ44FD3.cjs} +7 -7
- package/dist/{chunk-GUYKZ5U2.cjs.map → chunk-VWZ44FD3.cjs.map} +1 -1
- package/dist/{chunk-AVBQJTYL.cjs → chunk-W7C7RY6I.cjs} +3 -3
- package/dist/chunk-W7C7RY6I.cjs.map +1 -0
- package/dist/{chunk-JS344OAI.js → chunk-X6ETALRU.js} +9 -9
- package/dist/{chunk-JS344OAI.js.map → chunk-X6ETALRU.js.map} +1 -1
- package/dist/datasets/index.cjs +17 -17
- package/dist/datasets/index.js +2 -2
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +203 -203
- package/dist/docs/references/docs-agents-adding-voice.md +14 -13
- package/dist/docs/references/docs-voice-overview.md +66 -0
- package/dist/docs/references/docs-voice-speech-to-speech.md +45 -1
- package/dist/docs/references/reference.md +1 -0
- package/dist/evals/index.cjs +6 -6
- package/dist/evals/index.js +2 -2
- package/dist/evals/scoreTraces/index.cjs +3 -3
- package/dist/evals/scoreTraces/index.js +1 -1
- package/dist/harness/index.cjs +7 -7
- package/dist/harness/index.js +5 -5
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/llm/index.cjs +20 -20
- package/dist/llm/index.js +5 -5
- package/dist/loop/index.cjs +14 -14
- package/dist/loop/index.js +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.js +1 -1
- package/dist/mastra-JCF3EDEH.js +3 -0
- package/dist/{mastra-4ITVIM3P.js.map → mastra-JCF3EDEH.js.map} +1 -1
- package/dist/mastra-R4MQZGKL.cjs +12 -0
- package/dist/{mastra-AJ5FVVJV.cjs.map → mastra-R4MQZGKL.cjs.map} +1 -1
- package/dist/memory/index.cjs +19 -19
- package/dist/memory/index.js +1 -1
- package/dist/models-dev-KZS6GJRC.js +3 -0
- package/dist/{models-dev-IPZ3ZBDT.js.map → models-dev-KZS6GJRC.js.map} +1 -1
- package/dist/models-dev-QVOQXYGC.cjs +12 -0
- package/dist/{models-dev-26D6O63V.cjs.map → models-dev-QVOQXYGC.cjs.map} +1 -1
- package/dist/netlify-2O6B3H7A.cjs +12 -0
- package/dist/{netlify-PK7PYQ7D.cjs.map → netlify-2O6B3H7A.cjs.map} +1 -1
- package/dist/netlify-IWBQ6YNZ.js +3 -0
- package/dist/{netlify-HN66KZY4.js.map → netlify-IWBQ6YNZ.js.map} +1 -1
- package/dist/processor-provider/index.cjs +10 -10
- package/dist/processor-provider/index.js +1 -1
- package/dist/processors/index.cjs +49 -49
- package/dist/processors/index.js +1 -1
- package/dist/provider-registry-2OT653BC.cjs +44 -0
- package/dist/{provider-registry-43OJC4SQ.cjs.map → provider-registry-2OT653BC.cjs.map} +1 -1
- package/dist/provider-registry-Z7LJZZQR.js +3 -0
- package/dist/{provider-registry-5SZ7C4YH.js.map → provider-registry-Z7LJZZQR.js.map} +1 -1
- package/dist/relevance/index.cjs +3 -3
- package/dist/relevance/index.js +1 -1
- package/dist/runner-2MI65OOJ.js +3 -0
- package/dist/{runner-OHTFIP4Q.js.map → runner-2MI65OOJ.js.map} +1 -1
- package/dist/runner-CDSZZZQS.cjs +16 -0
- package/dist/{runner-2UOLTUSW.cjs.map → runner-CDSZZZQS.cjs.map} +1 -1
- package/dist/storage/index.cjs +61 -61
- package/dist/storage/index.js +2 -2
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +1 -1
- package/dist/tool-loop-agent/index.cjs +4 -4
- package/dist/tool-loop-agent/index.js +1 -1
- package/dist/vector/index.cjs +7 -7
- package/dist/vector/index.js +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/index.cjs +24 -24
- package/dist/workflows/index.js +1 -1
- package/package.json +9 -9
- package/dist/chunk-AVBQJTYL.cjs.map +0 -1
- package/dist/chunk-XBCX5E3N.js.map +0 -1
- package/dist/mastra-4ITVIM3P.js +0 -3
- package/dist/mastra-AJ5FVVJV.cjs +0 -12
- package/dist/models-dev-26D6O63V.cjs +0 -12
- package/dist/models-dev-IPZ3ZBDT.js +0 -3
- package/dist/netlify-HN66KZY4.js +0 -3
- package/dist/netlify-PK7PYQ7D.cjs +0 -12
- package/dist/provider-registry-43OJC4SQ.cjs +0 -44
- package/dist/provider-registry-5SZ7C4YH.js +0 -3
- package/dist/runner-2UOLTUSW.cjs +0 -16
- package/dist/runner-OHTFIP4Q.js +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/domains/observability/base.ts","../src/storage/utils.ts","../src/storage/domains/observability/inmemory.ts","../src/storage/domains/observability/record-builders.ts","../src/storage/domains/background-tasks/base.ts","../src/storage/domains/background-tasks/inmemory.ts","../src/storage/domains/blobs/base.ts","../src/storage/domains/blobs/inmemory.ts","../src/storage/domains/channels/base.ts","../src/storage/domains/channels/inmemory.ts","../src/datasets/validation/errors.ts","../src/datasets/validation/validator.ts","../src/storage/domains/datasets/base.ts","../src/storage/domains/datasets/inmemory.ts","../src/storage/domains/experiments/base.ts","../src/storage/domains/experiments/inmemory.ts","../src/storage/domains/inmemory-db.ts","../src/storage/domains/memory/base.ts","../src/storage/domains/memory/inmemory.ts","../src/storage/domains/scores/base.ts","../src/storage/domains/scores/inmemory.ts","../src/workflows/evented/types.ts","../src/storage/domains/workflows/base.ts","../src/storage/domains/workflows/inmemory.ts","../src/storage/mock.ts","../src/storage/filesystem-db.ts","../src/storage/filesystem.ts","../src/storage/domains/operations/base.ts","../src/storage/domains/operations/inmemory.ts"],"names":["StorageDomain","MastraError","TABLE_SCHEMAS","TABLE_SCORERS","listTracesArgsSchema","toTraceSpans","listMetricsArgsSchema","bucketMap","costSummary","EntityType","listLogsArgsSchema","listScoresArgsSchema","listFeedbackArgsSchema","MastraBase","z","jsonSchemaToZod","normalizePerPage","calculatePagination","MessageList","id","MastraCompositeStore","InMemoryAgentsStorage","InMemoryPromptBlocksStorage","InMemoryScorerDefinitionsStorage","InMemoryMCPClientsStorage","InMemoryMCPServersStorage","InMemoryWorkspacesStorage","InMemorySkillsStorage","existsSync","mkdirSync","join","readFileSync","dirname","writeFileSync","renameSync","resolve","sep","relative","rmSync","readdirSync","statSync","FilesystemAgentsStorage","FilesystemPromptBlocksStorage","FilesystemScorerDefinitionsStorage","FilesystemMCPClientsStorage","FilesystemMCPServersStorage","FilesystemWorkspacesStorage","FilesystemSkillsStorage","TABLE_WORKFLOW_SNAPSHOT"],"mappings":"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","file":"chunk-HTAWEZ7M.cjs","sourcesContent":["import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { StorageDomain } from '../base';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n} from './discovery';\nimport type {\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n} from './feedback';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from './logs';\nimport type {\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n} from './metrics';\nimport type {\n BatchCreateScoresArgs,\n CreateScoreArgs,\n ListScoresArgs,\n ListScoresResponse,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n} from './scores';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateSpanArgs,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n ListTracesArgs,\n ListTracesResponse,\n UpdateSpanArgs,\n} from './tracing';\nimport type { ObservabilityStorageStrategy, TracingStorageStrategy } from './types';\n\n/**\n * Base storage class for observability data (traces, metrics, logs, scores, feedback).\n * Not abstract -- provides default implementations that throw \"not implemented\" errors.\n * Storage adapters override only the methods they support.\n */\nexport class ObservabilityStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'OBSERVABILITY',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n /**\n * Provides hints for tracing strategy selection by the DefaultExporter.\n * Storage adapters can override this to specify their preferred and supported strategies.\n */\n public get observabilityStrategy(): {\n preferred: ObservabilityStorageStrategy;\n supported: ObservabilityStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates', // Default for most SQL stores\n supported: ['realtime', 'batch-with-updates', 'insert-only'],\n };\n }\n\n /**\n * Provides hints for tracing strategy selection by the DefaultExporter.\n * Storage adapters can override this to specify their preferred and supported strategies.\n * @deprecated Use {@link observabilityStrategy} instead.\n * @see {@link observabilityStrategy} for the replacement property.\n */\n public get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return this.observabilityStrategy;\n }\n\n /**\n * Reports the tracing strategy currently in effect for this attached observability store.\n *\n * Single-strategy stores can rely on the default implementation. Multi-strategy stores\n * should override this getter only when they can determine the actual configured mode\n * from storage-owned configuration, not exporter state.\n */\n public get runtimeTracingStrategy(): TracingStorageStrategy | undefined {\n const supportedStrategies = this.observabilityStrategy.supported;\n return supportedStrategies.length === 1 ? supportedStrategies[0] : undefined;\n }\n\n /**\n * Creates a single Span record in the storage provider.\n */\n async createSpan(_args: CreateSpanArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_CREATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating spans',\n });\n }\n\n /**\n * Updates a single Span with partial data. Primarily used for realtime trace creation.\n *\n * @deprecated This method only works with stores that support span updates,\n * It will be removed in the future. Instead try to add all data to a span before\n * ending it.\n */\n async updateSpan(_args: UpdateSpanArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_UPDATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support updating spans',\n });\n }\n\n /**\n * Retrieves a single span.\n */\n async getSpan(_args: GetSpanArgs): Promise<GetSpanResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting spans',\n });\n }\n\n /**\n * Retrieves a single root span.\n */\n async getRootSpan(_args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ROOT_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting root spans',\n });\n }\n\n /**\n * Retrieves a single trace with all its associated spans.\n */\n async getTrace(_args: GetTraceArgs): Promise<GetTraceResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TRACE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting traces',\n });\n }\n\n /**\n * Retrieves a lightweight trace with only the fields needed for timeline rendering.\n * Excludes heavy fields: input, output, attributes, metadata, tags, links.\n */\n async getTraceLight(_args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TRACE_LIGHT_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting lightweight traces',\n });\n }\n\n /**\n * Retrieves a list of traces with optional filtering.\n */\n async listTraces(_args: ListTracesArgs): Promise<ListTracesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_TRACES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing traces',\n });\n }\n\n /**\n * Creates multiple Spans in a single batch.\n */\n async batchCreateSpans(_args: BatchCreateSpansArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating spans',\n });\n }\n\n /**\n * Updates multiple Spans in a single batch.\n */\n async batchUpdateSpans(_args: BatchUpdateSpansArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_UPDATE_SPANS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch updating spans',\n });\n }\n\n /**\n * Deletes multiple traces and all their associated spans in a single batch operation.\n */\n async batchDeleteTraces(_args: BatchDeleteTracesArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_DELETE_TRACES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch deleting traces',\n });\n }\n\n // ============================================================================\n // Logs\n // ============================================================================\n\n /**\n * Creates multiple log records in a single batch.\n */\n async batchCreateLogs(_args: BatchCreateLogsArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_LOGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating logs',\n });\n }\n\n /**\n * Retrieves a list of logs with optional filtering.\n */\n async listLogs(_args: ListLogsArgs): Promise<ListLogsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_LOGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing logs',\n });\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n /**\n * Creates multiple metric observations in a single batch.\n */\n async batchCreateMetrics(_args: BatchCreateMetricsArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_METRICS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating metrics',\n });\n }\n\n async listMetrics(_args: ListMetricsArgs): Promise<ListMetricsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_METRICS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing metrics',\n });\n }\n\n async getMetricAggregate(_args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric aggregation',\n });\n }\n\n async getMetricBreakdown(_args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric breakdown',\n });\n }\n\n async getMetricTimeSeries(_args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric time series',\n });\n }\n\n async getMetricPercentiles(_args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric percentiles',\n });\n }\n\n // ============================================================================\n // Discovery / Metadata Methods\n // ============================================================================\n\n async getMetricNames(_args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric name discovery',\n });\n }\n\n async getMetricLabelKeys(_args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_LABEL_KEYS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric label key discovery',\n });\n }\n\n async getMetricLabelValues(_args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_LABEL_VALUES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support label value discovery',\n });\n }\n\n async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENTITY_TYPES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support entity type discovery',\n });\n }\n\n async getEntityNames(_args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENTITY_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support entity name discovery',\n });\n }\n\n async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SERVICE_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support service name discovery',\n });\n }\n\n async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENVIRONMENTS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support environment discovery',\n });\n }\n\n async getTags(_args: GetTagsArgs): Promise<GetTagsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TAGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support tag discovery',\n });\n }\n\n // ============================================================================\n // Scores\n // ============================================================================\n\n /**\n * Creates a single score record.\n */\n async createScore(_args: CreateScoreArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_CREATE_SCORE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating scores',\n });\n }\n\n /**\n * Creates multiple score observations in a single batch.\n */\n async batchCreateScores(_args: BatchCreateScoresArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SCORES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating scores',\n });\n }\n\n /**\n * Retrieves a list of scores with optional filtering.\n */\n async listScores(_args: ListScoresArgs): Promise<ListScoresResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_SCORES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing scores',\n });\n }\n\n async getScoreAggregate(_args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score aggregation',\n });\n }\n\n async getScoreBreakdown(_args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score breakdown',\n });\n }\n\n async getScoreTimeSeries(_args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score time series',\n });\n }\n\n async getScorePercentiles(_args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score percentiles',\n });\n }\n\n // ============================================================================\n // Feedback\n // ============================================================================\n\n /**\n * Creates a single feedback record.\n */\n async createFeedback(_args: CreateFeedbackArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating feedback',\n });\n }\n\n /**\n * Creates multiple feedback observations in a single batch.\n */\n async batchCreateFeedback(_args: BatchCreateFeedbackArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating feedback',\n });\n }\n\n /**\n * Retrieves a list of feedback with optional filtering.\n */\n async listFeedback(_args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing feedback',\n });\n }\n\n async getFeedbackAggregate(_args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback aggregation',\n });\n }\n\n async getFeedbackBreakdown(_args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback breakdown',\n });\n }\n\n async getFeedbackTimeSeries(_args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback time series',\n });\n }\n\n async getFeedbackPercentiles(_args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback percentiles',\n });\n }\n}\n","import type { ScoreRowData } from '../evals/types';\nimport { TABLE_SCHEMAS, TABLE_SCORERS } from './constants';\nimport type { TABLE_NAMES } from './constants';\nimport type { StorageColumn } from './types';\n\n/**\n * Canonical store names for type safety.\n * Provides autocomplete suggestions while still accepting any string.\n */\nexport type StoreName =\n | 'PG'\n | 'MSSQL'\n | 'LIBSQL'\n | 'MONGODB'\n | 'CLICKHOUSE'\n | 'CLOUDFLARE'\n | 'CLOUDFLARE_D1'\n | 'DYNAMODB'\n | 'LANCE'\n | 'UPSTASH'\n | 'ASTRA'\n | 'CHROMA'\n | 'COUCHBASE'\n | 'OPENSEARCH'\n | 'PINECONE'\n | 'QDRANT'\n | 'S3'\n | 'TURBOPUFFER'\n | 'VECTORIZE'\n | (string & {});\n\nexport function safelyParseJSON(input: any): any {\n // If already an object (and not null), return as-is\n if (input && typeof input === 'object') return input;\n if (input == null) return {};\n // If it's a string, try to parse\n if (typeof input === 'string') {\n try {\n return JSON.parse(input);\n } catch {\n return input;\n }\n }\n // For anything else (number, boolean, etc.), return empty object\n return {};\n}\n\n/**\n * Options for transforming storage rows\n */\nexport interface TransformRowOptions {\n /**\n * Preferred source fields for timestamps (e.g., { createdAt: 'createdAtZ' } means use createdAtZ if available, else createdAt)\n */\n preferredTimestampFields?: Record<string, string>;\n\n /**\n * Convert timestamp strings to Date objects (default: false for backwards compatibility)\n */\n convertTimestamps?: boolean;\n\n /**\n * Pattern to treat as null (e.g., '_null_' for ClickHouse)\n */\n nullValuePattern?: string;\n\n /**\n * Custom field mappings from source to target (e.g., { entity: 'entityData' } for DynamoDB)\n */\n fieldMappings?: Record<string, string>;\n}\n\n/**\n * Generic schema-driven row transformer.\n * Uses TABLE_SCHEMAS to determine field types and apply appropriate transformations:\n * - 'jsonb' fields: parsed from JSON strings using safelyParseJSON\n * - 'timestamp' fields: optionally converted to Date objects\n *\n * @param row - The raw row from storage\n * @param tableName - The table name to look up schema from TABLE_SCHEMAS\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed row with proper types\n */\nexport function transformRow<T = Record<string, any>>(\n row: Record<string, any>,\n tableName: TABLE_NAMES,\n options: TransformRowOptions = {},\n): T {\n const { preferredTimestampFields = {}, convertTimestamps = false, nullValuePattern, fieldMappings = {} } = options;\n\n const tableSchema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n for (const [key, columnSchema] of Object.entries(tableSchema)) {\n // Handle field mappings (e.g., entityData -> entity for DynamoDB)\n const sourceKey = fieldMappings[key] ?? key;\n let value = row[sourceKey];\n\n // Handle preferred timestamp sources (e.g., use createdAtZ if available, else createdAt)\n if (preferredTimestampFields[key]) {\n value = row[preferredTimestampFields[key]] ?? value;\n }\n\n // Skip null/undefined values\n if (value === undefined || value === null) {\n continue;\n }\n\n // Skip null pattern values (e.g., ClickHouse's '_null_')\n if (nullValuePattern && value === nullValuePattern) {\n continue;\n }\n\n // Transform based on column type\n if (columnSchema.type === 'jsonb') {\n if (typeof value === 'string') {\n result[key] = safelyParseJSON(value);\n } else if (typeof value === 'object') {\n result[key] = value; // Already parsed\n } else {\n result[key] = value;\n }\n } else if (columnSchema.type === 'timestamp' && convertTimestamps && typeof value === 'string') {\n result[key] = new Date(value);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Transform a raw score row from storage to ScoreRowData.\n * Convenience wrapper around transformRow for the scores table (TABLE_SCORERS).\n *\n * @param row - The raw row from storage\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed ScoreRowData\n */\nexport function transformScoreRow(row: Record<string, any>, options: TransformRowOptions = {}): ScoreRowData {\n return transformRow<ScoreRowData>(row, TABLE_SCORERS, options);\n}\n\n/**\n * Converts a string to UPPER_SNAKE_CASE, preserving word boundaries from camelCase, PascalCase, kebab-case, etc.\n */\nfunction toUpperSnakeCase(str: string): string {\n return (\n str\n // Insert underscore before uppercase letters that follow lowercase letters (camelCase -> camel_Case)\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n // Insert underscore before uppercase letters that are followed by lowercase letters (XMLParser -> XML_Parser)\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n // Convert to uppercase\n .toUpperCase()\n // Replace any non-alphanumeric characters with underscore\n .replace(/[^A-Z0-9]+/g, '_')\n // Remove leading/trailing underscores\n .replace(/^_+|_+$/g, '')\n );\n}\n\n/**\n * Generates a standardized error ID for storage and vector operations.\n *\n * Formats:\n * - Storage: MASTRA_STORAGE_{STORE}_{OPERATION}_{STATUS}\n * - Vector: MASTRA_VECTOR_{STORE}_{OPERATION}_{STATUS}\n *\n * This function auto-normalizes inputs to UPPER_SNAKE_CASE for flexibility.\n * The store parameter is type-checked against canonical store names for IDE autocomplete.\n *\n * @param type - The operation type ('storage' or 'vector')\n * @param store - The store adapter name (type-checked canonical names)\n * @param operation - The operation that failed (e.g., 'LIST_THREADS_BY_RESOURCE_ID', 'QUERY')\n * @param status - The status/error type (e.g., 'FAILED', 'INVALID_THREAD_ID', 'DUPLICATE_KEY')\n *\n * @example\n * ```ts\n * // Storage operations\n * createStoreErrorId('storage', 'PG', 'LIST_THREADS', 'FAILED')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_THREADS_FAILED'\n *\n * // Vector operations\n * createStoreErrorId('vector', 'CHROMA', 'QUERY', 'FAILED')\n * // Returns: 'MASTRA_VECTOR_CHROMA_QUERY_FAILED'\n *\n * // Auto-normalizes any casing\n * createStoreErrorId('storage', 'PG', 'listMessagesById', 'failed')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_MESSAGES_BY_ID_FAILED'\n * ```\n */\nexport function createStoreErrorId(\n type: 'storage' | 'vector',\n store: StoreName,\n operation: string,\n status: string,\n): Uppercase<string> {\n const normalizedStore = toUpperSnakeCase(store);\n const normalizedOperation = toUpperSnakeCase(operation);\n const normalizedStatus = toUpperSnakeCase(status);\n const typePrefix = type === 'storage' ? 'STORAGE' : 'VECTOR';\n\n return `MASTRA_${typePrefix}_${normalizedStore}_${normalizedOperation}_${normalizedStatus}` as Uppercase<string>;\n}\n\nexport function createStorageErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n return createStoreErrorId('storage', store, operation, status);\n}\n\nexport function createVectorErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n return createStoreErrorId('vector', store, operation, status);\n}\n\nexport function getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'TEXT';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'float':\n return 'FLOAT';\n case 'integer':\n return 'INTEGER';\n case 'bigint':\n return 'BIGINT';\n case 'jsonb':\n return 'JSONB';\n case 'boolean':\n return 'BOOLEAN';\n default:\n return 'TEXT';\n }\n}\n\nexport function getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n case 'boolean':\n return 'DEFAULT FALSE';\n default:\n return \"DEFAULT ''\";\n }\n}\n\nexport function ensureDate(date: Date | string | undefined): Date | undefined {\n if (!date) return undefined;\n return date instanceof Date ? date : new Date(date);\n}\n\nexport function serializeDate(date: Date | string | undefined): string | undefined {\n if (!date) return undefined;\n const dateObj = ensureDate(date);\n return dateObj?.toISOString();\n}\n\n/**\n * Date range filter configuration for in-memory filtering operations.\n */\nexport interface DateRangeFilter {\n start?: Date | string;\n end?: Date | string;\n startExclusive?: boolean;\n endExclusive?: boolean;\n}\n\n/**\n * Filter an array of items by date range. Used by in-memory storage adapters.\n *\n * This provides a consistent implementation of date range filtering with\n * support for inclusive/exclusive bounds across all storage adapters.\n *\n * @param items - Array of items to filter\n * @param getCreatedAt - Function to extract the createdAt date from an item\n * @param dateRange - Optional date range filter configuration\n * @returns Filtered array of items\n *\n * @example\n * ```ts\n * const filtered = filterByDateRange(\n * messages,\n * (msg) => new Date(msg.createdAt),\n * { start: new Date('2024-01-01'), startExclusive: true }\n * );\n * ```\n */\nexport function filterByDateRange<T>(items: T[], getCreatedAt: (item: T) => Date, dateRange?: DateRangeFilter): T[] {\n if (!dateRange) return items;\n\n let result = items;\n\n if (dateRange.start) {\n const startTime = ensureDate(dateRange.start)!.getTime();\n result = result.filter(item => {\n const itemTime = getCreatedAt(item).getTime();\n return dateRange.startExclusive ? itemTime > startTime : itemTime >= startTime;\n });\n }\n\n if (dateRange.end) {\n const endTime = ensureDate(dateRange.end)!.getTime();\n result = result.filter(item => {\n const itemTime = getCreatedAt(item).getTime();\n return dateRange.endExclusive ? itemTime < endTime : itemTime <= endTime;\n });\n }\n\n return result;\n}\n\n/**\n * Deep equality check for JSON values.\n * Compares primitives, arrays, objects, and Date instances recursively.\n *\n * @param a - First value to compare\n * @param b - Second value to compare\n * @returns true if values are deeply equal, false otherwise\n */\nexport function jsonValueEquals(a: unknown, b: unknown): boolean {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n if (a === null || b === null) {\n return a === b;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n // Handle Date objects\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (a instanceof Date || b instanceof Date) {\n return false; // One is Date, other is not\n }\n if (typeof a === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => jsonValueEquals(val, b[i]));\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(key =>\n jsonValueEquals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n }\n return a === b;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { EntityType } from '../../../observability';\nimport { jsonValueEquals } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ObservabilityStorage } from './base';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n} from './discovery';\nimport { listFeedbackArgsSchema } from './feedback';\nimport type {\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n FeedbackFilter,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n ListFeedbackArgs,\n ListFeedbackResponse,\n FeedbackRecord,\n} from './feedback';\nimport { listLogsArgsSchema } from './logs';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse, LogRecord } from './logs';\nimport type {\n BatchCreateMetricsArgs,\n MetricRecord,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n AggregationType,\n} from './metrics';\nimport { listMetricsArgsSchema } from './metrics';\nimport { listScoresArgsSchema } from './scores';\nimport type {\n BatchCreateScoresArgs,\n CreateScoreArgs,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n} from './scores';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateSpanArgs,\n CreateSpanRecord,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n SpanRecord,\n UpdateSpanArgs,\n} from './tracing';\n\nimport { listTracesArgsSchema, TraceStatus, toTraceSpans } from './tracing';\n\n/**\n * Internal structure for storing a trace with computed properties for efficient filtering\n */\nexport interface TraceEntry {\n /** All spans in this trace, keyed by spanId */\n spans: Record<string, SpanRecord>;\n /** Root span for this trace (parentSpanId === null) */\n rootSpan: SpanRecord | null;\n /** Computed trace status based on root span state */\n status: TraceStatus;\n /** True if any span in the trace has an error */\n hasChildError: boolean;\n}\n\n/** In-memory implementation of ObservabilityStorage for testing and development. */\nexport class ObservabilityInMemory extends ObservabilityStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.traces.clear();\n this.db.metricRecords.length = 0;\n this.db.logRecords.length = 0;\n this.db.scoreRecords.length = 0;\n this.db.feedbackRecords.length = 0;\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n this.validateCreateSpan(span);\n const now = new Date();\n const record: SpanRecord = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n\n this.upsertSpanToTrace(record);\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n const now = new Date();\n for (const span of args.records) {\n this.validateCreateSpan(span);\n const record: SpanRecord = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n this.upsertSpanToTrace(record);\n }\n }\n\n private validateCreateSpan(record: CreateSpanRecord): void {\n if (!record.spanId) {\n throw new MastraError({\n id: 'OBSERVABILITY_SPAN_ID_REQUIRED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Span ID is required for creating a span',\n });\n }\n\n if (!record.traceId) {\n throw new MastraError({\n id: 'OBSERVABILITY_TRACE_ID_REQUIRED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Trace ID is required for creating a span',\n });\n }\n }\n\n /**\n * Inserts or updates a span in the trace and recomputes trace-level properties\n */\n private upsertSpanToTrace(span: SpanRecord): void {\n const { traceId, spanId } = span;\n let traceEntry = this.db.traces.get(traceId);\n\n if (!traceEntry) {\n traceEntry = {\n spans: {},\n rootSpan: null,\n status: TraceStatus.RUNNING,\n hasChildError: false,\n };\n this.db.traces.set(traceId, traceEntry);\n }\n\n traceEntry.spans[spanId] = span;\n\n // Update root span if this is a root span\n if (span.parentSpanId == null) {\n traceEntry.rootSpan = span;\n }\n\n this.recomputeTraceProperties(traceEntry);\n }\n\n /**\n * Recomputes derived trace properties from all spans\n */\n private recomputeTraceProperties(traceEntry: TraceEntry): void {\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) return;\n\n // Compute hasChildError (use != null to catch both null and undefined)\n traceEntry.hasChildError = spans.some(s => s.error != null);\n\n // Compute status from root span\n const rootSpan = traceEntry.rootSpan;\n if (rootSpan) {\n if (rootSpan.error != null) {\n traceEntry.status = TraceStatus.ERROR;\n } else if (rootSpan.endedAt == null) {\n traceEntry.status = TraceStatus.RUNNING;\n } else {\n traceEntry.status = TraceStatus.SUCCESS;\n }\n } else {\n // No root span yet, consider it running\n traceEntry.status = TraceStatus.RUNNING;\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const span = traceEntry.spans[spanId];\n if (!span) {\n return null;\n }\n\n return { span };\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry || !traceEntry.rootSpan) {\n return null;\n }\n\n return { span: traceEntry.rootSpan };\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) {\n return null;\n }\n\n // Sort spans by startedAt\n spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n return {\n traceId,\n spans,\n };\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) {\n return null;\n }\n\n // Sort spans by startedAt\n spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n return {\n traceId,\n spans: spans.map(\n (span): LightSpanRecord => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n spanType: span.spanType,\n isEvent: span.isEvent,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n error: span.error,\n entityType: span.entityType,\n entityId: span.entityId,\n entityName: span.entityName,\n createdAt: span.createdAt,\n updatedAt: span.updatedAt,\n }),\n ),\n };\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n\n // Collect all traces that match filters\n const matchingRootSpans: SpanRecord[] = [];\n\n for (const [, traceEntry] of this.db.traces) {\n if (!traceEntry.rootSpan) continue;\n\n if (this.traceMatchesFilters(traceEntry, filters)) {\n matchingRootSpans.push(traceEntry.rootSpan);\n }\n }\n\n // Sort by orderBy field\n const { field: sortField, direction: sortDirection } = orderBy;\n\n matchingRootSpans.sort((a, b) => {\n if (sortField === 'endedAt') {\n const aVal = a.endedAt;\n const bVal = b.endedAt;\n\n // Handle nullish values (running spans with null endedAt)\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return sortDirection === 'DESC' ? -1 : 1;\n if (bVal == null) return sortDirection === 'DESC' ? 1 : -1;\n\n const diff = aVal.getTime() - bVal.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n } else {\n // startedAt is never null (required field)\n const diff = a.startedAt.getTime() - b.startedAt.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n }\n });\n\n // Apply pagination\n const total = matchingRootSpans.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n\n const paged = matchingRootSpans.slice(start, end);\n\n return {\n spans: toTraceSpans(paged),\n pagination: { total, page, perPage, hasMore: end < total },\n };\n }\n\n /**\n * Check if a trace matches all provided filters\n */\n private traceMatchesFilters(traceEntry: TraceEntry, filters: ListTracesArgs['filters']): boolean {\n if (!filters) return true;\n\n const rootSpan = traceEntry.rootSpan;\n if (!rootSpan) return false;\n\n // Date range filters on startedAt (based on root span)\n if (filters.startedAt) {\n if (filters.startedAt.start && rootSpan.startedAt < filters.startedAt.start) {\n return false;\n }\n if (filters.startedAt.end && rootSpan.startedAt > filters.startedAt.end) {\n return false;\n }\n }\n\n // Date range filters on endedAt (based on root span)\n if (filters.endedAt) {\n // If root span is still running (endedAt is nullish), it doesn't match endedAt filters\n if (rootSpan.endedAt == null) {\n return false;\n }\n if (filters.endedAt.start && rootSpan.endedAt < filters.endedAt.start) {\n return false;\n }\n if (filters.endedAt.end && rootSpan.endedAt > filters.endedAt.end) {\n return false;\n }\n }\n\n // Span type filter (on root span)\n if (filters.spanType !== undefined && rootSpan.spanType !== filters.spanType) {\n return false;\n }\n\n // Entity filters\n if (filters.entityType !== undefined && rootSpan.entityType !== filters.entityType) {\n return false;\n }\n if (filters.entityId !== undefined && rootSpan.entityId !== filters.entityId) {\n return false;\n }\n if (filters.entityName !== undefined && rootSpan.entityName !== filters.entityName) {\n return false;\n }\n if (filters.entityVersionId !== undefined && rootSpan.entityVersionId !== filters.entityVersionId) {\n return false;\n }\n\n // Experimentation\n if (filters.experimentId !== undefined && rootSpan.experimentId !== filters.experimentId) {\n return false;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined && rootSpan.userId !== filters.userId) {\n return false;\n }\n if (filters.organizationId !== undefined && rootSpan.organizationId !== filters.organizationId) {\n return false;\n }\n if (filters.resourceId !== undefined && rootSpan.resourceId !== filters.resourceId) {\n return false;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined && rootSpan.runId !== filters.runId) {\n return false;\n }\n if (filters.sessionId !== undefined && rootSpan.sessionId !== filters.sessionId) {\n return false;\n }\n if (filters.threadId !== undefined && rootSpan.threadId !== filters.threadId) {\n return false;\n }\n if (filters.requestId !== undefined && rootSpan.requestId !== filters.requestId) {\n return false;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined && rootSpan.environment !== filters.environment) {\n return false;\n }\n if (filters.source !== undefined && rootSpan.source !== filters.source) {\n return false;\n }\n if (filters.serviceName !== undefined && rootSpan.serviceName !== filters.serviceName) {\n return false;\n }\n\n // Scope filter (partial match - all provided keys must match)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.scope != null && rootSpan.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n if (!jsonValueEquals(rootSpan.scope[key], value)) {\n return false;\n }\n }\n } else if (filters.scope != null && rootSpan.scope == null) {\n return false;\n }\n\n // Metadata filter (partial match - all provided keys must match)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.metadata != null && rootSpan.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n if (!jsonValueEquals(rootSpan.metadata[key], value)) {\n return false;\n }\n }\n } else if (filters.metadata != null && rootSpan.metadata == null) {\n return false;\n }\n\n // Tags filter (all provided tags must be present)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.tags != null && filters.tags.length > 0) {\n if (rootSpan.tags == null) {\n return false;\n }\n for (const tag of filters.tags) {\n if (!rootSpan.tags.includes(tag)) {\n return false;\n }\n }\n }\n\n // Derived status filter\n if (filters.status !== undefined && traceEntry.status !== filters.status) {\n return false;\n }\n\n // Has child error filter\n if (filters.hasChildError !== undefined && traceEntry.hasChildError !== filters.hasChildError) {\n return false;\n }\n\n return true;\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n const traceEntry = this.db.traces.get(traceId);\n\n if (!traceEntry) {\n throw new MastraError({\n id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Trace not found for span update',\n });\n }\n\n const span = traceEntry.spans[spanId];\n if (!span) {\n throw new MastraError({\n id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Span not found for update',\n });\n }\n\n const updatedSpan: SpanRecord = {\n ...span,\n ...updates,\n updatedAt: new Date(),\n };\n\n traceEntry.spans[spanId] = updatedSpan;\n\n // Update root span reference if this is the root span\n if (updatedSpan.parentSpanId == null) {\n traceEntry.rootSpan = updatedSpan;\n }\n\n this.recomputeTraceProperties(traceEntry);\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n for (const record of args.records) {\n await this.updateSpan(record);\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n for (const traceId of args.traceIds) {\n this.db.traces.delete(traceId);\n }\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n for (const metric of args.metrics) {\n this.db.metricRecords.push(metric as MetricRecord);\n }\n }\n\n async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n const { filters, pagination, orderBy } = listMetricsArgsSchema.parse(args);\n\n let matching = this.filterMetrics(filters as Record<string, unknown>);\n\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n metrics: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private filterMetrics(filters?: Record<string, unknown>): MetricRecord[] {\n if (!filters) return [...this.db.metricRecords];\n return this.db.metricRecords.filter(m => {\n if (filters.timestamp) {\n const ts = filters.timestamp as { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean };\n if (ts.start && (ts.startExclusive ? m.timestamp <= ts.start : m.timestamp < ts.start)) return false;\n if (ts.end && (ts.endExclusive ? m.timestamp >= ts.end : m.timestamp > ts.end)) return false;\n }\n if (filters.name != null) {\n if (!(filters.name as string[]).includes(m.name)) return false;\n }\n if (filters.traceId !== undefined && m.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && m.spanId !== filters.spanId) return false;\n if (filters.provider !== undefined && m.provider !== filters.provider) return false;\n if (filters.model !== undefined && m.model !== filters.model) return false;\n if (filters.costUnit !== undefined && m.costUnit !== filters.costUnit) return false;\n if (filters.entityType !== undefined && m.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && m.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && m.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && m.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && m.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && m.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && m.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && m.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && m.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && m.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && m.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && m.requestId !== filters.requestId) return false;\n if (filters.experimentId !== undefined && m.experimentId !== filters.experimentId) return false;\n if (filters.serviceName !== undefined && m.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && m.environment !== filters.environment) return false;\n const metricExecutionSource = m.executionSource ?? m.source ?? null;\n if (filters.executionSource !== undefined && metricExecutionSource !== filters.executionSource) return false;\n if (filters.source !== undefined && metricExecutionSource !== filters.source) return false;\n if (filters.parentEntityType !== undefined && m.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && m.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && m.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && m.rootEntityName !== filters.rootEntityName) return false;\n if (filters.tags != null && Array.isArray(filters.tags) && filters.tags.length > 0) {\n if (m.tags == null) return false;\n for (const tag of filters.tags) {\n if (!m.tags.includes(tag)) return false;\n }\n }\n if (filters.labels) {\n const labelFilters = filters.labels as Record<string, string>;\n for (const [k, v] of Object.entries(labelFilters)) {\n if (m.labels[k] !== v) return false;\n }\n }\n return true;\n });\n }\n\n private aggregate(values: number[], type: AggregationType, timestamps?: number[]): number | null {\n if (values.length === 0) return null;\n switch (type) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'avg':\n return values.reduce((a, b) => a + b, 0) / values.length;\n case 'min':\n return Math.min(...values);\n case 'max':\n return Math.max(...values);\n case 'count':\n return values.length;\n case 'last': {\n if (!timestamps || timestamps.length !== values.length) {\n return values[values.length - 1]!;\n }\n\n let latestIndex = 0;\n let latestTimestamp = timestamps[0]!;\n\n for (let i = 1; i < timestamps.length; i++) {\n const timestamp = timestamps[i]!;\n if (timestamp >= latestTimestamp) {\n latestTimestamp = timestamp;\n latestIndex = i;\n }\n }\n\n return values[latestIndex]!;\n }\n default:\n return values.reduce((a, b) => a + b, 0);\n }\n }\n\n private interpolatePercentile(sortedValues: number[], percentile: number): number {\n if (sortedValues.length === 0) return 0;\n\n const position = percentile * (sortedValues.length - 1);\n const lowerIndex = Math.floor(position);\n const upperIndex = Math.ceil(position);\n const lowerValue = sortedValues[lowerIndex]!;\n const upperValue = sortedValues[upperIndex]!;\n\n if (lowerIndex === upperIndex) {\n return lowerValue;\n }\n\n return lowerValue + (upperValue - lowerValue) * (position - lowerIndex);\n }\n\n /**\n * Cost is returned alongside value-based OLAP results so callers can derive\n * token and monetary views from the same filtered scan.\n */\n private summarizeCost(records: MetricRecord[]): { estimatedCost: number | null; costUnit: string | null } {\n const costValues = records\n .map(record => record.estimatedCost)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n const costUnits = new Set(\n records.map(record => record.costUnit).filter((unit): unit is string => typeof unit === 'string'),\n );\n\n return {\n estimatedCost: costValues.length > 0 ? costValues.reduce((sum, value) => sum + value, 0) : null,\n costUnit: costUnits.size === 1 ? Array.from(costUnits)[0]! : null,\n };\n }\n\n async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n const value = this.aggregate(\n filtered.map(m => m.value),\n args.aggregation,\n );\n const costSummary = this.summarizeCost(filtered);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n }\n\n const prevFiltered = this.filterMetrics({\n ...(args.filters as Record<string, unknown>),\n timestamp: { ...ts, start: prevStart, end: prevEnd },\n }).filter(m => names.includes(m.name));\n const previousValue = this.aggregate(\n prevFiltered.map(m => m.value),\n args.aggregation,\n );\n const previousCostSummary = this.summarizeCost(prevFiltered);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n let costChangePercent: number | null = null;\n if (\n previousCostSummary.estimatedCost !== null &&\n previousCostSummary.estimatedCost !== 0 &&\n costSummary.estimatedCost !== null\n ) {\n costChangePercent =\n ((costSummary.estimatedCost - previousCostSummary.estimatedCost) /\n Math.abs(previousCostSummary.estimatedCost)) *\n 100;\n }\n\n return {\n value,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n previousValue,\n previousEstimatedCost: previousCostSummary.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n }\n\n return { value, estimatedCost: costSummary.estimatedCost, costUnit: costSummary.costUnit };\n }\n\n async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n const groupMap = new Map<string, MetricRecord[]>();\n for (const m of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n dims[col] = ((m as Record<string, unknown>)[col] as string | null | undefined) ?? m.labels[col] ?? null;\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(m);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => {\n const costSummary = this.summarizeCost(records);\n return {\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n };\n });\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, MetricRecord[]>>();\n for (const m of filtered) {\n const key = args.groupBy\n .map(col => String((m as Record<string, unknown>)[col] ?? m.labels[col] ?? ''))\n .join('|');\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([name, bucketMap]) => {\n const seriesRecords = Array.from(bucketMap.values()).flat();\n const costSummary = this.summarizeCost(seriesRecords);\n return {\n name,\n costUnit: costSummary.costUnit,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n };\n }),\n };\n }\n\n const bucketMap = new Map<number, MetricRecord[]>();\n for (const m of filtered) {\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m);\n }\n\n const metricName = Array.isArray(args.name) ? args.name.join(',') : args.name;\n const costSummary = this.summarizeCost(filtered);\n return {\n series: [\n {\n name: metricName,\n costUnit: costSummary.costUnit,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n },\n ],\n };\n }\n\n async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => m.name === args.name);\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const m of filtered) {\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m.value);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(p => ({\n percentile: p,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n const idx = Math.min(Math.floor(p * sorted.length), sorted.length - 1);\n return { timestamp: new Date(ts), value: sorted[idx] ?? 0 };\n }),\n })),\n };\n }\n\n private intervalToMs(interval: string): number {\n switch (interval) {\n case '1m':\n return 60_000;\n case '5m':\n return 300_000;\n case '15m':\n return 900_000;\n case '1h':\n return 3_600_000;\n case '1d':\n return 86_400_000;\n default:\n return 3_600_000;\n }\n }\n\n // ============================================================================\n // Discovery / Metadata Methods\n // ============================================================================\n\n async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n const nameSet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (args.prefix && !m.name.startsWith(args.prefix)) continue;\n nameSet.add(m.name);\n }\n let names = Array.from(nameSet).sort();\n if (args.limit) names = names.slice(0, args.limit);\n return { names };\n }\n\n async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n const keySet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (m.name !== args.metricName) continue;\n for (const key of Object.keys(m.labels)) {\n keySet.add(key);\n }\n }\n return { keys: Array.from(keySet).sort() };\n }\n\n async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n const valueSet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (m.name !== args.metricName) continue;\n const val = m.labels[args.labelKey];\n if (val === undefined) continue;\n if (args.prefix && !val.startsWith(args.prefix)) continue;\n valueSet.add(val);\n }\n let values = Array.from(valueSet).sort();\n if (args.limit) values = values.slice(0, args.limit);\n return { values };\n }\n\n async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n const validTypes = new Set(Object.values(EntityType));\n const typeSet = new Set<EntityType>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.entityType && validTypes.has(span.entityType as EntityType)) {\n typeSet.add(span.entityType as EntityType);\n }\n }\n }\n return { entityTypes: Array.from(typeSet).sort() };\n }\n\n async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n const nameSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (!span.entityName) continue;\n if (args.entityType && span.entityType !== args.entityType) continue;\n nameSet.add(span.entityName);\n }\n }\n return { names: Array.from(nameSet).sort() };\n }\n\n async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n const nameSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.serviceName) nameSet.add(span.serviceName);\n }\n }\n return { serviceNames: Array.from(nameSet).sort() };\n }\n\n async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n const envSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.environment) envSet.add(span.environment);\n }\n }\n return { environments: Array.from(envSet).sort() };\n }\n\n async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n const tagSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (!span.tags) continue;\n if (args.entityType && span.entityType !== args.entityType) continue;\n for (const tag of span.tags) {\n tagSet.add(tag);\n }\n }\n }\n return { tags: Array.from(tagSet).sort() };\n }\n\n // ============================================================================\n // Logs\n // ============================================================================\n\n async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n for (const log of args.logs) {\n this.db.logRecords.push(log as LogRecord);\n }\n }\n\n async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n const { filters, pagination, orderBy } = listLogsArgsSchema.parse(args);\n\n let matching = this.db.logRecords.filter(log => this.logMatchesFilters(log, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n logs: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private logMatchesFilters(log: LogRecord, filters?: ListLogsArgs['filters']): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (\n filters.timestamp.start &&\n (filters.timestamp.startExclusive\n ? log.timestamp <= filters.timestamp.start\n : log.timestamp < filters.timestamp.start)\n ) {\n return false;\n }\n if (\n filters.timestamp.end &&\n (filters.timestamp.endExclusive\n ? log.timestamp >= filters.timestamp.end\n : log.timestamp > filters.timestamp.end)\n ) {\n return false;\n }\n }\n if (filters.level !== undefined) {\n const levels = Array.isArray(filters.level) ? filters.level : [filters.level];\n if (!levels.includes(log.level)) return false;\n }\n if (filters.traceId !== undefined && log.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && log.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && log.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && log.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && log.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && log.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && log.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && log.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && log.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && log.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && log.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && log.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && log.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && log.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && log.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && log.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && log.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && log.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && log.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && log.environment !== filters.environment) return false;\n const logExecutionSource = log.executionSource ?? log.source ?? null;\n if (filters.executionSource !== undefined && logExecutionSource !== filters.executionSource) return false;\n if (filters.source !== undefined && logExecutionSource !== filters.source) return false;\n if (filters.experimentId !== undefined && log.experimentId !== filters.experimentId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (log.tags == null) return false;\n for (const tag of filters.tags) {\n if (!log.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n\n // ============================================================================\n // Scores\n // ============================================================================\n\n async createScore(args: CreateScoreArgs): Promise<void> {\n const scoreSource = args.score.scoreSource ?? args.score.source ?? null;\n this.db.scoreRecords.push({\n ...args.score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord);\n }\n\n async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n for (const score of args.scores) {\n const scoreSource = score.scoreSource ?? score.source ?? null;\n this.db.scoreRecords.push({\n ...score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord);\n }\n }\n\n async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n const { filters, pagination, orderBy } = listScoresArgsSchema.parse(args);\n\n let matching = this.db.scoreRecords.filter(score => this.scoreMatchesFilters(score, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n if (orderBy.field === 'score') {\n matching.sort((a, b) => dir * (a.score - b.score));\n } else {\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n }\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n scores: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private scoreMatchesFilters(score: ScoreRecord, filters?: ListScoresArgs['filters']): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (filters.timestamp.start && score.timestamp < filters.timestamp.start) return false;\n if (filters.timestamp.end && score.timestamp > filters.timestamp.end) return false;\n }\n if (filters.traceId !== undefined && score.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && score.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && score.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && score.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && score.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && score.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && score.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && score.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && score.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && score.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && score.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && score.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && score.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && score.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && score.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && score.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && score.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && score.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && score.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && score.environment !== filters.environment) return false;\n if (filters.executionSource !== undefined && score.executionSource !== filters.executionSource) return false;\n if (filters.scorerId !== undefined) {\n const names = Array.isArray(filters.scorerId) ? filters.scorerId : [filters.scorerId];\n if (!names.includes(score.scorerId)) return false;\n }\n const scoreSource = score.scoreSource ?? score.source ?? null;\n if (filters.scoreSource !== undefined && scoreSource !== filters.scoreSource) return false;\n if (filters.source !== undefined && scoreSource !== filters.source) return false;\n if (filters.experimentId !== undefined && score.experimentId !== filters.experimentId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (score.tags == null) return false;\n for (const tag of filters.tags) {\n if (!score.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n\n async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const value = this.aggregate(\n filtered.map(score => score.score),\n args.aggregation,\n filtered.map(score => score.timestamp.getTime()),\n );\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n if (previousRange) {\n const previousFiltered = this.db.scoreRecords\n .filter(score =>\n this.scoreMatchesFilters(score, {\n ...(args.filters ?? {}),\n timestamp: previousRange,\n }),\n )\n .filter(score => score.scorerId === args.scorerId)\n .filter(score =>\n args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true,\n );\n\n const previousValue = this.aggregate(\n previousFiltered.map(score => score.score),\n args.aggregation,\n previousFiltered.map(score => score.timestamp.getTime()),\n );\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n }\n\n async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n\n const groupMap = new Map<string, ScoreRecord[]>();\n for (const score of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n const value = (score as Record<string, unknown>)[col];\n dims[col] = value === null || value === undefined ? null : String(value);\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(score);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n }));\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, ScoreRecord[]>>();\n const seriesNames = new Map<string, string>();\n\n for (const score of filtered) {\n const values = args.groupBy.map(col => (score as Record<string, unknown>)[col] ?? '');\n const key = JSON.stringify(values);\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n if (!seriesNames.has(key)) {\n seriesNames.set(\n key,\n values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n );\n }\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n name: seriesNames.get(key)!,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n })),\n })),\n };\n }\n\n const bucketMap = new Map<number, ScoreRecord[]>();\n for (const score of filtered) {\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score);\n }\n\n return {\n series: [\n {\n name: args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n })),\n },\n ],\n };\n }\n\n async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const score of filtered) {\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score.score);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(percentile => ({\n percentile,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n }),\n })),\n };\n }\n\n private getNumericFeedbackValue(value: FeedbackRecord['value']): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length === 0) return null;\n const numeric = Number(trimmed);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return null;\n }\n\n private getComparisonDateRange(\n comparePeriod: 'previous_period' | 'previous_day' | 'previous_week',\n timestamp: { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean },\n ): { start: Date; end: Date; startExclusive?: boolean; endExclusive?: boolean } | null {\n if (!timestamp.start || !timestamp.end) return null;\n\n const duration = timestamp.end.getTime() - timestamp.start.getTime();\n switch (comparePeriod) {\n case 'previous_period':\n return {\n start: new Date(timestamp.start.getTime() - duration),\n end: new Date(timestamp.end.getTime() - duration),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n case 'previous_day':\n return {\n start: new Date(timestamp.start.getTime() - 86_400_000),\n end: new Date(timestamp.end.getTime() - 86_400_000),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n case 'previous_week':\n return {\n start: new Date(timestamp.start.getTime() - 604_800_000),\n end: new Date(timestamp.end.getTime() - 604_800_000),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n }\n }\n\n // ============================================================================\n // Feedback\n // ============================================================================\n\n async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n this.db.feedbackRecords.push({\n ...args.feedback,\n feedbackSource: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n source: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n feedbackUserId:\n args.feedback.feedbackUserId ??\n args.feedback.userId ??\n (typeof args.feedback.metadata?.userId === 'string' ? args.feedback.metadata.userId : null),\n } as FeedbackRecord);\n }\n\n async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n for (const fb of args.feedbacks) {\n this.db.feedbackRecords.push({\n ...fb,\n feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n source: fb.feedbackSource ?? fb.source ?? '',\n feedbackUserId:\n fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n } as FeedbackRecord);\n }\n }\n\n async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n const { filters, pagination, orderBy } = listFeedbackArgsSchema.parse(args);\n\n let matching = this.db.feedbackRecords.filter(fb => this.feedbackMatchesFilters(fb, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n feedback: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n );\n const numericEntries = filtered.flatMap(feedback => {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n });\n const value = this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n );\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n if (previousRange) {\n const previousNumericEntries = this.db.feedbackRecords\n .filter(feedback =>\n this.feedbackMatchesFilters(feedback, {\n ...(args.filters ?? {}),\n timestamp: previousRange,\n }),\n )\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .flatMap(feedback => {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n });\n\n const previousValue = this.aggregate(\n previousNumericEntries.map(entry => entry.numericValue),\n args.aggregation,\n previousNumericEntries.map(entry => entry.timestamp),\n );\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n }\n\n async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n\n const groupMap = new Map<string, FeedbackRecord[]>();\n for (const feedback of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n const rawValue = (feedback as Record<string, unknown>)[col];\n dims[col] = rawValue === null || rawValue === undefined ? null : String(rawValue);\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(feedback);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n }));\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, FeedbackRecord[]>>();\n const seriesNames = new Map<string, string>();\n\n for (const feedback of filtered) {\n const values = args.groupBy.map(col => (feedback as Record<string, unknown>)[col] ?? '');\n const key = JSON.stringify(values);\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n if (!seriesNames.has(key)) {\n seriesNames.set(\n key,\n values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n );\n }\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(feedback);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n name: seriesNames.get(key)!,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n })),\n })),\n };\n }\n\n const bucketMap = new Map<number, FeedbackRecord[]>();\n for (const feedback of filtered) {\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(feedback);\n }\n\n return {\n series: [\n {\n name: args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n })),\n },\n ],\n };\n }\n\n async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n );\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const feedback of filtered) {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n if (numericValue === null) continue;\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(numericValue);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(percentile => ({\n percentile,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n }),\n })),\n };\n }\n\n private feedbackMatchesFilters(fb: FeedbackRecord, filters?: FeedbackFilter): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (filters.timestamp.start && fb.timestamp < filters.timestamp.start) return false;\n if (filters.timestamp.end && fb.timestamp > filters.timestamp.end) return false;\n }\n if (filters.traceId !== undefined && fb.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && fb.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && fb.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && fb.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && fb.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && fb.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && fb.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && fb.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && fb.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && fb.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && fb.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && fb.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && fb.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && fb.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && fb.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && fb.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && fb.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && fb.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && fb.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && fb.environment !== filters.environment) return false;\n if (filters.executionSource !== undefined && fb.executionSource !== filters.executionSource) return false;\n if (filters.feedbackType !== undefined) {\n const types = Array.isArray(filters.feedbackType) ? filters.feedbackType : [filters.feedbackType];\n if (!types.includes(fb.feedbackType)) return false;\n }\n const feedbackSource = fb.feedbackSource ?? fb.source ?? '';\n if (filters.feedbackSource !== undefined && feedbackSource !== filters.feedbackSource) return false;\n if (filters.source !== undefined && feedbackSource !== filters.source) return false;\n if (filters.experimentId !== undefined && fb.experimentId !== filters.experimentId) return false;\n if (filters.feedbackUserId !== undefined && fb.feedbackUserId !== filters.feedbackUserId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (fb.tags == null) return false;\n for (const tag of filters.tags) {\n if (!fb.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n}\n","import type {\n AnyExportedSpan,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '../../../observability/index.js';\nimport type { CorrelationContext } from '../../../observability/types/core.js';\nimport { EntityType } from '../../../observability/types/tracing.js';\nimport type { CreateFeedbackRecord } from './feedback.js';\nimport type { CreateLogRecord } from './logs.js';\nimport type { CreateMetricRecord } from './metrics.js';\nimport type { CreateScoreRecord } from './scores.js';\nimport type { CreateSpanRecord, UpdateSpanRecord } from './tracing.js';\n\n// ============================================================================\n// Shared helpers for extracting typed fields from untyped metadata/labels\n// ============================================================================\n\nconst entityTypeValues = new Set(Object.values(EntityType));\n\n/** Safely cast string to EntityType, returning null if invalid */\nexport function toEntityType(value: string | undefined | null): EntityType | null {\n if (value && entityTypeValues.has(value as EntityType)) {\n return value as EntityType;\n }\n return null;\n}\n\n/** Extract a string from an unknown value, returning null if not a string. */\nexport function getStringOrNull(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Extract a plain object from an unknown value, returning null if not an object. */\nexport function getObjectOrNull(value: unknown): Record<string, any> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, any>) : null;\n}\n\n// ============================================================================\n// Span attribute serialization\n// ============================================================================\n\n/**\n * Serializes span attributes to a plain JSON-safe object.\n * Handles Date objects and nested structures.\n */\nexport function serializeSpanAttributes(span: AnyExportedSpan): Record<string, any> | null {\n if (!span.attributes) {\n return null;\n }\n\n try {\n return JSON.parse(\n JSON.stringify(span.attributes, (_key, value) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }),\n );\n } catch {\n return null;\n }\n}\n\ntype CorrelationRecordFields = Pick<\n CreateLogRecord,\n | 'tags'\n | 'entityType'\n | 'entityId'\n | 'entityName'\n | 'entityVersionId'\n | 'parentEntityType'\n | 'parentEntityId'\n | 'parentEntityName'\n | 'parentEntityVersionId'\n | 'rootEntityType'\n | 'rootEntityId'\n | 'rootEntityName'\n | 'rootEntityVersionId'\n | 'userId'\n | 'organizationId'\n | 'resourceId'\n | 'runId'\n | 'sessionId'\n | 'threadId'\n | 'requestId'\n | 'environment'\n | 'executionSource'\n | 'serviceName'\n | 'experimentId'\n>;\n\nfunction buildCorrelationRecordFields(context: CorrelationContext | undefined): CorrelationRecordFields {\n return {\n tags: context?.tags ?? null,\n entityType: context?.entityType ?? null,\n entityId: context?.entityId ?? null,\n entityName: context?.entityName ?? null,\n entityVersionId: context?.entityVersionId ?? null,\n parentEntityType: context?.parentEntityType ?? null,\n parentEntityId: context?.parentEntityId ?? null,\n parentEntityName: context?.parentEntityName ?? null,\n parentEntityVersionId: context?.parentEntityVersionId ?? null,\n rootEntityType: context?.rootEntityType ?? null,\n rootEntityId: context?.rootEntityId ?? null,\n rootEntityName: context?.rootEntityName ?? null,\n rootEntityVersionId: context?.rootEntityVersionId ?? null,\n userId: context?.userId ?? null,\n organizationId: context?.organizationId ?? null,\n resourceId: context?.resourceId ?? null,\n runId: context?.runId ?? null,\n sessionId: context?.sessionId ?? null,\n threadId: context?.threadId ?? null,\n requestId: context?.requestId ?? null,\n environment: context?.environment ?? null,\n executionSource: context?.source ?? null,\n serviceName: context?.serviceName ?? null,\n experimentId: context?.experimentId ?? null,\n };\n}\n\nfunction buildLegacyMetricLabelCorrelationFields(labels: Record<string, string>): Partial<CorrelationRecordFields> {\n return {\n entityType: toEntityType(labels.entity_type),\n entityName: getStringOrNull(labels.entity_name),\n parentEntityType: toEntityType(labels.parent_type),\n parentEntityName: getStringOrNull(labels.parent_name),\n serviceName: getStringOrNull(labels.service_name),\n };\n}\n\nfunction stripLegacyMetricCorrelationLabels(labels: Record<string, string>): Record<string, string> {\n const sanitized = { ...labels };\n delete sanitized.entity_type;\n delete sanitized.entity_name;\n delete sanitized.parent_type;\n delete sanitized.parent_name;\n delete sanitized.service_name;\n return sanitized;\n}\n\nfunction buildLegacyLogMetadataCorrelationFields(\n metadata: Record<string, any> | null,\n): Partial<CorrelationRecordFields> {\n return {\n entityType: toEntityType(getStringOrNull(metadata?.entity_type) ?? undefined),\n entityName: getStringOrNull(metadata?.entity_name),\n parentEntityType: toEntityType(getStringOrNull(metadata?.parent_type) ?? undefined),\n parentEntityName: getStringOrNull(metadata?.parent_name),\n rootEntityType: toEntityType(getStringOrNull(metadata?.root_type) ?? undefined),\n rootEntityName: getStringOrNull(metadata?.root_name),\n environment: getStringOrNull(metadata?.environment),\n executionSource: getStringOrNull(metadata?.source),\n serviceName: getStringOrNull(metadata?.service_name),\n };\n}\n\n// ============================================================================\n// Event → Record builders\n// ============================================================================\n\n/** Convert an exported span to a CreateSpanRecord */\nexport function buildCreateSpanRecord(span: AnyExportedSpan): CreateSpanRecord {\n const metadata = span.metadata ?? {};\n\n return {\n traceId: span.traceId,\n spanId: span.id,\n parentSpanId: span.parentSpanId ?? null,\n name: span.name,\n\n // Entity identification - from span\n entityType: span.entityType ?? null,\n entityId: span.entityId ?? null,\n entityName: span.entityName ?? null,\n entityVersionId: getStringOrNull(metadata.entityVersionId),\n\n // Identity & Tenancy - extracted from metadata if present\n userId: getStringOrNull(metadata.userId),\n organizationId: getStringOrNull(metadata.organizationId),\n resourceId: getStringOrNull(metadata.resourceId),\n\n // Correlation IDs - extracted from metadata if present\n runId: getStringOrNull(metadata.runId),\n sessionId: getStringOrNull(metadata.sessionId),\n threadId: getStringOrNull(metadata.threadId),\n requestId: getStringOrNull(metadata.requestId),\n\n // Deployment context - extracted from metadata if present\n environment: getStringOrNull(metadata.environment),\n source: getStringOrNull(metadata.source),\n serviceName: getStringOrNull(metadata.serviceName),\n scope: getObjectOrNull(metadata.scope),\n\n // Experimentation\n experimentId: getStringOrNull(metadata.experimentId),\n\n // Span data\n spanType: span.type,\n attributes: serializeSpanAttributes(span),\n metadata: span.metadata ?? null,\n tags: span.tags ?? null,\n links: null,\n input: span.input ?? null,\n output: span.output ?? null,\n error: span.errorInfo ?? null,\n isEvent: span.isEvent,\n\n // Request context\n requestContext: span.requestContext ?? null,\n\n // Timestamps\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n };\n}\n\n/** Convert an exported span to a partial UpdateSpanRecord */\nexport function buildUpdateSpanRecord(span: AnyExportedSpan): Partial<UpdateSpanRecord> {\n return {\n name: span.name,\n scope: null,\n attributes: serializeSpanAttributes(span),\n metadata: span.metadata ?? null,\n links: null,\n endedAt: span.endTime ?? null,\n input: span.input,\n output: span.output,\n error: span.errorInfo ?? null,\n };\n}\n\n/** Convert a MetricEvent to a CreateMetricRecord. */\nexport function buildMetricRecord(event: MetricEvent): CreateMetricRecord {\n const m = event.metric;\n const labels = stripLegacyMetricCorrelationLabels(m.labels);\n const correlationFields = buildCorrelationRecordFields(m.correlationContext);\n const legacyCorrelationFields = buildLegacyMetricLabelCorrelationFields(m.labels);\n const cost = m.costContext;\n\n return {\n metricId: m.metricId,\n timestamp: m.timestamp,\n name: m.name,\n value: m.value,\n labels,\n traceId: m.traceId ?? m.correlationContext?.traceId ?? null,\n spanId: m.spanId ?? m.correlationContext?.spanId ?? null,\n ...correlationFields,\n scope: null,\n entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n provider: cost?.provider ?? null,\n model: cost?.model ?? null,\n estimatedCost: cost?.estimatedCost ?? null,\n costUnit: cost?.costUnit ?? null,\n costMetadata: cost?.costMetadata ?? null,\n metadata: m.metadata ?? null,\n };\n}\n\n/** Convert a LogEvent to a CreateLogRecord */\nexport function buildLogRecord(event: LogEvent): CreateLogRecord {\n const l = event.log;\n const correlationFields = buildCorrelationRecordFields(l.correlationContext);\n const legacyCorrelationFields = buildLegacyLogMetadataCorrelationFields(l.metadata ?? null);\n\n return {\n logId: l.logId,\n timestamp: l.timestamp,\n level: l.level,\n message: l.message,\n data: l.data ?? null,\n ...correlationFields,\n traceId: l.traceId ?? l.correlationContext?.traceId ?? null,\n spanId: l.spanId ?? l.correlationContext?.spanId ?? null,\n tags: correlationFields.tags ?? l.tags ?? null,\n entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n rootEntityType: correlationFields.rootEntityType ?? legacyCorrelationFields.rootEntityType ?? null,\n rootEntityName: correlationFields.rootEntityName ?? legacyCorrelationFields.rootEntityName ?? null,\n environment: correlationFields.environment ?? legacyCorrelationFields.environment ?? null,\n executionSource: correlationFields.executionSource ?? legacyCorrelationFields.executionSource ?? null,\n serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n scope: null,\n metadata: l.metadata ?? null,\n };\n}\n\n/** Convert a ScoreEvent to a CreateScoreRecord */\nexport function buildScoreRecord(event: ScoreEvent): CreateScoreRecord {\n const s = event.score;\n const correlationFields = buildCorrelationRecordFields(s.correlationContext);\n return {\n scoreId: s.scoreId,\n timestamp: s.timestamp,\n traceId: s.traceId ?? s.correlationContext?.traceId ?? null,\n spanId: s.spanId ?? s.correlationContext?.spanId ?? null,\n scorerId: s.scorerId,\n scorerVersion: s.scorerVersion ?? null,\n scoreSource: s.scoreSource ?? s.source ?? null,\n source: s.scoreSource ?? s.source ?? null,\n score: s.score,\n reason: s.reason ?? null,\n ...correlationFields,\n entityType: correlationFields.entityType ?? s.targetEntityType ?? null,\n experimentId: correlationFields.experimentId ?? s.experimentId ?? null,\n scope: null,\n scoreTraceId: s.scoreTraceId ?? null,\n metadata: s.scorerName ? { ...(s.metadata ?? {}), scorerName: s.scorerName } : (s.metadata ?? null),\n };\n}\n\n/** Convert a FeedbackEvent to a CreateFeedbackRecord */\nexport function buildFeedbackRecord(event: FeedbackEvent): CreateFeedbackRecord {\n const fb = event.feedback;\n const correlationFields = buildCorrelationRecordFields(fb.correlationContext);\n return {\n feedbackId: fb.feedbackId,\n timestamp: fb.timestamp,\n traceId: fb.traceId ?? fb.correlationContext?.traceId ?? null,\n spanId: fb.spanId ?? fb.correlationContext?.spanId ?? null,\n feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n source: fb.feedbackSource ?? fb.source ?? '',\n feedbackType: fb.feedbackType,\n value: fb.value,\n comment: fb.comment ?? null,\n ...correlationFields,\n experimentId: correlationFields.experimentId ?? fb.experimentId ?? null,\n feedbackUserId:\n fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n scope: null,\n sourceId: fb.sourceId ?? null,\n metadata: fb.metadata ?? null,\n };\n}\n","import type { BackgroundTask, TaskFilter, TaskListResult, UpdateBackgroundTask } from '../../../background-tasks/types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract storage domain for background tasks.\n * Handles persistence of task state — creation, status updates, querying, and cleanup.\n */\nexport abstract class BackgroundTasksStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'BACKGROUND_TASKS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n /** Insert a new task record. */\n abstract createTask(task: BackgroundTask): Promise<void>;\n\n /**\n * Partial update of a task record.\n * Only the provided fields are updated; others are left unchanged.\n */\n abstract updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void>;\n\n /** Get a single task by ID. Returns null if not found. */\n abstract getTask(taskId: string): Promise<BackgroundTask | null>;\n\n /**\n * Query tasks with filters, ordering, and pagination.\n * Returns tasks matching all provided filter criteria.\n */\n abstract listTasks(filter: TaskFilter): Promise<TaskListResult>;\n\n /**\n * Delete a particular task by ID.\n * Used for cleanup of old completed/failed records.\n */\n abstract deleteTask(taskId: string): Promise<void>;\n\n /**\n * Delete tasks matching the filter criteria.\n * Used for cleanup of old completed/failed records.\n */\n abstract deleteTasks(filter: TaskFilter): Promise<void>;\n\n /** Count tasks currently in 'running' status across all agents. */\n abstract getRunningCount(): Promise<number>;\n\n /** Count tasks currently in 'running' status for a specific agent. */\n abstract getRunningCountByAgent(agentId: string): Promise<number>;\n}\n","import type { BackgroundTask, TaskFilter, TaskListResult, UpdateBackgroundTask } from '../../../background-tasks/types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { BackgroundTasksStorage } from './base';\n\nexport class BackgroundTasksInMemory extends BackgroundTasksStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.backgroundTasks.clear();\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n this.db.backgroundTasks.set(task.id, { ...task });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const existing = this.db.backgroundTasks.get(taskId);\n if (!existing) return;\n this.db.backgroundTasks.set(taskId, { ...existing, ...update });\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const task = this.db.backgroundTasks.get(taskId);\n return task ? { ...task } : null;\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n let tasks = Array.from(this.db.backgroundTasks.values());\n\n // Apply filters\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n tasks = tasks.filter(t => statuses.includes(t.status));\n }\n if (filter.agentId) {\n tasks = tasks.filter(t => t.agentId === filter.agentId);\n }\n if (filter.threadId) {\n tasks = tasks.filter(t => t.threadId === filter.threadId);\n }\n if (filter.resourceId) {\n tasks = tasks.filter(t => t.resourceId === filter.resourceId);\n }\n if (filter.toolName) {\n tasks = tasks.filter(t => t.toolName === filter.toolName);\n }\n if (filter.runId) {\n tasks = tasks.filter(t => t.runId === filter.runId);\n }\n\n // Date range filtering\n const dateCol = filter.dateFilterBy ?? 'createdAt';\n if (filter.fromDate) {\n tasks = tasks.filter(t => {\n const val = t[dateCol];\n return val != null && val >= filter.fromDate!;\n });\n }\n if (filter.toDate) {\n tasks = tasks.filter(t => {\n const val = t[dateCol];\n return val != null && val < filter.toDate!;\n });\n }\n\n // Sort\n const orderBy = filter.orderBy ?? 'createdAt';\n const direction = filter.orderDirection ?? 'asc';\n tasks.sort((a, b) => {\n const aVal = a[orderBy]?.getTime() ?? 0;\n const bVal = b[orderBy]?.getTime() ?? 0;\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n });\n\n // Total count before pagination\n const total = tasks.length;\n\n // Pagination\n if (filter.page != null && filter.perPage != null) {\n const start = filter.page * filter.perPage;\n tasks = tasks.slice(start, start + filter.perPage);\n } else if (filter.perPage != null) {\n tasks = tasks.slice(0, filter.perPage);\n }\n\n // Return copies to prevent external mutation\n return { tasks: tasks.map(t => ({ ...t })), total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n this.db.backgroundTasks.delete(taskId);\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const { tasks } = await this.listTasks(filter);\n for (const task of tasks) {\n this.db.backgroundTasks.delete(task.id);\n }\n }\n\n async getRunningCount(): Promise<number> {\n let count = 0;\n for (const task of this.db.backgroundTasks.values()) {\n if (task.status === 'running') count++;\n }\n return count;\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n let count = 0;\n for (const task of this.db.backgroundTasks.values()) {\n if (task.status === 'running' && task.agentId === agentId) count++;\n }\n return count;\n }\n}\n","import { MastraBase } from '../../../base';\nimport type { StorageBlobEntry } from '../../types';\n\n/**\n * Abstract base class for content-addressable blob storage.\n * Used to store file contents for skill versioning.\n *\n * Blobs are keyed by their SHA-256 hash, providing natural deduplication.\n */\nexport abstract class BlobStore extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'BLOBS',\n });\n }\n\n /**\n * Initialize the blob store (create tables, etc).\n */\n abstract init(): Promise<void>;\n\n /**\n * Store a blob. If the hash already exists, this is a no-op.\n */\n abstract put(entry: StorageBlobEntry): Promise<void>;\n\n /**\n * Retrieve a blob by its hash.\n * Returns null if not found.\n */\n abstract get(hash: string): Promise<StorageBlobEntry | null>;\n\n /**\n * Check if a blob exists by hash.\n */\n abstract has(hash: string): Promise<boolean>;\n\n /**\n * Delete a blob by hash.\n * Returns true if the blob was deleted, false if it didn't exist.\n */\n abstract delete(hash: string): Promise<boolean>;\n\n /**\n * Store multiple blobs in a batch. Skips any that already exist.\n */\n abstract putMany(entries: StorageBlobEntry[]): Promise<void>;\n\n /**\n * Retrieve multiple blobs by their hashes.\n * Returns a Map of hash -> entry. Missing hashes are omitted.\n */\n abstract getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>>;\n\n /**\n * Delete all blobs. Used for testing.\n */\n abstract dangerouslyClearAll(): Promise<void>;\n}\n","import type { StorageBlobEntry } from '../../types';\nimport { BlobStore } from './base';\n\n/**\n * In-memory implementation of BlobStore for testing.\n */\nexport class InMemoryBlobStore extends BlobStore {\n readonly #blobs = new Map<string, StorageBlobEntry>();\n\n async init(): Promise<void> {\n // No-op for in-memory store\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n if (!this.#blobs.has(entry.hash)) {\n this.#blobs.set(entry.hash, entry);\n }\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n return this.#blobs.get(hash) ?? null;\n }\n\n async has(hash: string): Promise<boolean> {\n return this.#blobs.has(hash);\n }\n\n async delete(hash: string): Promise<boolean> {\n return this.#blobs.delete(hash);\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n for (const entry of entries) {\n await this.put(entry);\n }\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n for (const hash of hashes) {\n const blob = this.#blobs.get(hash);\n if (blob) {\n result.set(hash, blob);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.#blobs.clear();\n }\n}\n","import { StorageDomain } from '../base';\n\n/**\n * Generic channel installation record.\n * Stores platform-specific data as JSON for flexibility.\n */\nexport interface ChannelInstallation {\n /** Unique installation ID */\n id: string;\n /** Platform identifier (e.g., 'slack', 'discord') */\n platform: string;\n /** Agent ID this installation is for */\n agentId: string;\n /** Installation status */\n status: 'pending' | 'active' | 'error';\n /** Webhook ID for routing inbound requests */\n webhookId?: string;\n /** Platform-specific data (tokens, team info, etc.) - stored encrypted */\n data: Record<string, unknown>;\n /** Hash of the agent's channel config + baseUrl - used to detect changes */\n configHash?: string;\n /** Error message if status is 'error' */\n error?: string;\n /** When the installation was created */\n createdAt: Date;\n /** When the installation was last updated */\n updatedAt: Date;\n}\n\n/**\n * Platform-level configuration for channel integrations.\n * Stores admin credentials needed for app factory (e.g., Slack App Configuration Tokens).\n * Each platform defines its own config shape - stored as encrypted JSON.\n */\nexport interface ChannelConfig {\n /** Platform identifier (e.g., 'slack', 'telegram', 'discord') */\n platform: string;\n /** Platform-specific configuration data - stored encrypted */\n data: Record<string, unknown>;\n /** When the config was last updated */\n updatedAt: Date;\n}\n\n/**\n * Storage domain for channel installations and configuration.\n * Provides persistence for multi-platform channel integrations.\n */\nexport abstract class ChannelsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'CHANNELS',\n });\n }\n\n /**\n * Save or update a channel installation.\n */\n abstract saveInstallation(installation: ChannelInstallation): Promise<void>;\n\n /**\n * Get an installation by ID.\n */\n abstract getInstallation(id: string): Promise<ChannelInstallation | null>;\n\n /**\n * Get an installation by platform and agent ID.\n */\n abstract getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null>;\n\n /**\n * Get an installation by webhook ID (for routing inbound requests).\n */\n abstract getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null>;\n\n /**\n * List all installations for a platform.\n */\n abstract listInstallations(platform: string): Promise<ChannelInstallation[]>;\n\n /**\n * Delete an installation.\n */\n abstract deleteInstallation(id: string): Promise<void>;\n\n /**\n * Save platform configuration (e.g., Slack App Configuration Tokens, Telegram parent bot token).\n */\n abstract saveConfig(config: ChannelConfig): Promise<void>;\n\n /**\n * Get platform configuration.\n */\n abstract getConfig(platform: string): Promise<ChannelConfig | null>;\n\n /**\n * Delete platform configuration.\n */\n abstract deleteConfig(platform: string): Promise<void>;\n}\n","import type { ChannelInstallation, ChannelConfig } from './base';\nimport { ChannelsStorage } from './base';\n\n/**\n * In-memory implementation of ChannelsStorage.\n * Useful for development and testing.\n */\nexport class InMemoryChannelsStorage extends ChannelsStorage {\n #installations = new Map<string, ChannelInstallation>();\n #configs = new Map<string, ChannelConfig>();\n\n async saveInstallation(installation: ChannelInstallation): Promise<void> {\n this.#installations.set(installation.id, { ...installation });\n }\n\n async getInstallation(id: string): Promise<ChannelInstallation | null> {\n const inst = this.#installations.get(id);\n return inst ? { ...inst } : null;\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n const statusPriority = { active: 0, pending: 1, error: 2 } as const;\n let best: ChannelInstallation | null = null;\n for (const installation of this.#installations.values()) {\n if (installation.platform === platform && installation.agentId === agentId) {\n if (!best || (statusPriority[installation.status] ?? 3) < (statusPriority[best.status] ?? 3)) {\n best = installation;\n }\n }\n }\n return best ? { ...best } : null;\n }\n\n async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n for (const installation of this.#installations.values()) {\n if (installation.webhookId === webhookId) {\n return { ...installation };\n }\n }\n return null;\n }\n\n async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n const results: ChannelInstallation[] = [];\n for (const installation of this.#installations.values()) {\n if (installation.platform === platform) {\n results.push({ ...installation });\n }\n }\n return results;\n }\n\n async deleteInstallation(id: string): Promise<void> {\n this.#installations.delete(id);\n }\n\n async saveConfig(config: ChannelConfig): Promise<void> {\n this.#configs.set(config.platform, { ...config });\n }\n\n async getConfig(platform: string): Promise<ChannelConfig | null> {\n const config = this.#configs.get(platform);\n return config ? { ...config } : null;\n }\n\n async deleteConfig(platform: string): Promise<void> {\n this.#configs.delete(platform);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.#installations.clear();\n this.#configs.clear();\n }\n}\n","/** Field-level validation error */\nexport interface FieldError {\n /** JSON Pointer path, e.g., \"/name\" or \"/address/city\" */\n path: string;\n /** Zod error code, e.g., \"invalid_type\", \"too_small\" */\n code: string;\n /** Human-readable error message */\n message: string;\n}\n\n/** Schema validation error with field details */\nexport class SchemaValidationError extends Error {\n constructor(\n public readonly field: 'input' | 'groundTruth',\n public readonly errors: FieldError[],\n ) {\n const summary = errors\n .slice(0, 3)\n .map(e => e.message)\n .join('; ');\n super(`Validation failed for ${field}: ${summary}`);\n this.name = 'SchemaValidationError';\n }\n}\n\n/** Batch validation result for multiple items */\nexport interface BatchValidationResult {\n valid: Array<{ index: number; data: unknown }>;\n invalid: Array<{\n index: number;\n data: unknown;\n field: 'input' | 'groundTruth';\n errors: FieldError[];\n }>;\n}\n\n/** Error thrown when schema update would invalidate existing items */\nexport class SchemaUpdateValidationError extends Error {\n constructor(\n public readonly failingItems: Array<{\n index: number;\n data: unknown;\n field: 'input' | 'groundTruth';\n errors: FieldError[];\n }>,\n ) {\n const count = failingItems.length;\n super(`Cannot update schema: ${count} existing item(s) would fail validation`);\n this.name = 'SchemaUpdateValidationError';\n }\n}\n","import { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ZodSchema, ZodError, ZodIssue } from 'zod/v4';\nimport { z } from 'zod/v4';\nimport { SchemaValidationError } from './errors';\nimport type { FieldError, BatchValidationResult } from './errors';\n\n/**\n * Convert JSON Schema string to runtime Zod schema.\n * Uses Function() to evaluate the generated Zod code - same pattern as workflow validation.\n */\nfunction resolveZodSchema(zodString: string): ZodSchema {\n return Function('z', `\"use strict\";return (${zodString});`)(z);\n}\n\n/** Schema validator with compilation caching */\nexport class SchemaValidator {\n private cache = new Map<string, ZodSchema>();\n\n /** Get or compile validator for schema */\n private getValidator(schema: JSONSchema7, cacheKey: string): ZodSchema {\n let zodSchema = this.cache.get(cacheKey);\n if (!zodSchema) {\n const zodString = jsonSchemaToZod(schema);\n zodSchema = resolveZodSchema(zodString);\n this.cache.set(cacheKey, zodSchema);\n }\n return zodSchema;\n }\n\n /** Clear cached validator (call when schema changes) */\n clearCache(cacheKey: string): void {\n this.cache.delete(cacheKey);\n }\n\n /** Validate data against schema */\n validate(data: unknown, schema: JSONSchema7, field: 'input' | 'groundTruth', cacheKey: string): void {\n const zodSchema = this.getValidator(schema, cacheKey);\n const result = zodSchema.safeParse(data);\n if (!result.success) {\n throw new SchemaValidationError(field, this.formatErrors(result.error));\n }\n }\n\n /** Validate multiple items, returning valid/invalid split */\n validateBatch(\n items: Array<{ input: unknown; groundTruth?: unknown }>,\n inputSchema: JSONSchema7 | null | undefined,\n outputSchema: JSONSchema7 | null | undefined,\n cacheKeyPrefix: string,\n maxErrors = 10,\n ): BatchValidationResult {\n const result: BatchValidationResult = { valid: [], invalid: [] };\n\n // Pre-compile schemas for performance\n const inputValidator = inputSchema ? this.getValidator(inputSchema, `${cacheKeyPrefix}:input`) : null;\n const outputValidator = outputSchema ? this.getValidator(outputSchema, `${cacheKeyPrefix}:output`) : null;\n\n for (const [i, item] of items.entries()) {\n let hasError = false;\n\n // Validate input if schema enabled\n if (inputValidator) {\n const inputResult = inputValidator.safeParse(item.input);\n if (!inputResult.success) {\n result.invalid.push({\n index: i,\n data: item,\n field: 'input',\n errors: this.formatErrors(inputResult.error),\n });\n hasError = true;\n if (result.invalid.length >= maxErrors) break;\n }\n }\n\n // Validate groundTruth if schema enabled and value provided\n if (!hasError && outputValidator && item.groundTruth !== undefined) {\n const outputResult = outputValidator.safeParse(item.groundTruth);\n if (!outputResult.success) {\n result.invalid.push({\n index: i,\n data: item,\n field: 'groundTruth',\n errors: this.formatErrors(outputResult.error),\n });\n hasError = true;\n if (result.invalid.length >= maxErrors) break;\n }\n }\n\n if (!hasError) {\n result.valid.push({ index: i, data: item });\n }\n }\n\n return result;\n }\n\n /** Format Zod errors to FieldError array */\n private formatErrors(error: ZodError): FieldError[] {\n return error.issues.slice(0, 5).map((issue: ZodIssue) => ({\n // Convert Zod path array to JSON Pointer string\n path: issue.path.length > 0 ? '/' + issue.path.join('/') : '/',\n code: issue.code,\n message: issue.message,\n }));\n }\n}\n\n/** Singleton validator instance */\nlet validatorInstance: SchemaValidator | null = null;\n\n/** Get or create validator instance */\nexport function getSchemaValidator(): SchemaValidator {\n if (!validatorInstance) {\n validatorInstance = new SchemaValidator();\n }\n return validatorInstance;\n}\n\n/** Create new validator (for testing) */\nexport function createValidator(): SchemaValidator {\n return new SchemaValidator();\n}\n","import { getSchemaValidator, SchemaUpdateValidationError } from '../../../datasets/validation';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for datasets storage domain.\n * Provides the contract for dataset and dataset item CRUD operations.\n *\n * Schema validation is handled in this base class via Template Method pattern.\n * Subclasses implement protected _do* methods for actual storage operations,\n * including SCD-2 versioning (version bump, row ops, dataset_version insert).\n */\nexport abstract class DatasetsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'DATASETS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n // Dataset CRUD\n abstract createDataset(input: CreateDatasetInput): Promise<DatasetRecord>;\n abstract getDatasetById(args: { id: string }): Promise<DatasetRecord | null>;\n abstract deleteDataset(args: { id: string }): Promise<void>;\n abstract listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput>;\n\n /**\n * Update a dataset. Validates existing items against new schemas if schemas are changing.\n * Subclasses implement _doUpdateDataset for actual storage operation.\n */\n async updateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n const existing = await this.getDatasetById({ id: args.id });\n if (!existing) {\n throw new Error(`Dataset not found: ${args.id}`);\n }\n\n // Check if schemas are being added or modified\n const inputSchemaChanging =\n args.inputSchema !== undefined && JSON.stringify(args.inputSchema) !== JSON.stringify(existing.inputSchema);\n const groundTruthSchemaChanging =\n args.groundTruthSchema !== undefined &&\n JSON.stringify(args.groundTruthSchema) !== JSON.stringify(existing.groundTruthSchema);\n\n // If schemas changing, validate all existing items against new schemas\n if (inputSchemaChanging || groundTruthSchemaChanging) {\n const itemsResult = await this.listItems({\n datasetId: args.id,\n pagination: { page: 0, perPage: false }, // Get all items\n });\n const items = itemsResult.items;\n\n if (items.length > 0) {\n const validator = getSchemaValidator();\n const newInputSchema = args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema;\n const newOutputSchema =\n args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema;\n\n const result = validator.validateBatch(\n items.map(i => ({ input: i.input, groundTruth: i.groundTruth })),\n newInputSchema,\n newOutputSchema,\n `dataset:${args.id}:schema-update`,\n 10, // Max 10 errors to report\n );\n\n if (result.invalid.length > 0) {\n throw new SchemaUpdateValidationError(result.invalid);\n }\n\n // Clear old cache since schema changed\n validator.clearCache(`dataset:${args.id}:input`);\n validator.clearCache(`dataset:${args.id}:output`);\n }\n }\n\n return this._doUpdateDataset(args);\n }\n\n /** Subclasses implement actual storage update logic */\n protected abstract _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord>;\n\n /**\n * Add an item to a dataset. Validates input/groundTruth against dataset schemas.\n * Subclasses implement _doAddItem which handles SCD-2 versioning internally.\n */\n async addItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n const dataset = await this.getDatasetById({ id: args.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Validate against schemas if enabled\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${args.datasetId}`;\n\n if (dataset.inputSchema) {\n validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n\n if (dataset.groundTruthSchema && args.groundTruth !== undefined) {\n validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n\n return this._doAddItem(args);\n }\n\n /** Subclasses implement actual storage add logic with SCD-2 versioning */\n protected abstract _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem>;\n\n /**\n * Update an item in a dataset. Validates changed fields against dataset schemas.\n * Subclasses implement _doUpdateItem which handles SCD-2 versioning internally.\n */\n async updateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n const dataset = await this.getDatasetById({ id: args.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Validate new values against schemas if enabled\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${args.datasetId}`;\n\n if (args.input !== undefined && dataset.inputSchema) {\n validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n\n if (args.groundTruth !== undefined && dataset.groundTruthSchema) {\n validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n\n return this._doUpdateItem(args);\n }\n\n /** Subclasses implement actual storage update logic with SCD-2 versioning */\n protected abstract _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem>;\n\n /**\n * Delete an item from a dataset. Creates a tombstone row via SCD-2.\n * Subclasses implement _doDeleteItem which handles SCD-2 versioning internally.\n */\n async deleteItem(args: { id: string; datasetId: string }): Promise<void> {\n return this._doDeleteItem(args);\n }\n\n /** Subclasses implement actual storage delete logic with SCD-2 versioning */\n protected abstract _doDeleteItem(args: { id: string; datasetId: string }): Promise<void>;\n\n abstract listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput>;\n abstract getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null>;\n\n // SCD-2 queries\n abstract getItemsByVersion(args: { datasetId: string; version: number }): Promise<DatasetItem[]>;\n abstract getItemHistory(itemId: string): Promise<DatasetItemRow[]>;\n\n // Dataset version methods\n abstract createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion>;\n abstract listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput>;\n\n /**\n * Batch insert items to a dataset. Validates all items against dataset schemas,\n * then delegates to subclass which handles SCD-2 versioning internally.\n */\n async batchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // Validate all items against schemas\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${input.datasetId}`;\n\n for (const itemData of input.items) {\n if (dataset.inputSchema) {\n validator.validate(itemData.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n if (dataset.groundTruthSchema && itemData.groundTruth !== undefined) {\n validator.validate(itemData.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n }\n\n return this._doBatchInsertItems(input);\n }\n\n /** Subclasses implement batch insert with SCD-2 versioning */\n protected abstract _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]>;\n\n /**\n * Batch delete items from a dataset. Creates tombstone rows via SCD-2.\n * Subclasses implement _doBatchDeleteItems which handles SCD-2 versioning internally.\n */\n async batchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n return this._doBatchDeleteItems(input);\n }\n\n /** Subclasses implement batch delete with SCD-2 versioning */\n protected abstract _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { DatasetsStorage } from './base';\n\n/** Convert a storage row to the public DatasetItem type (strips validTo/isDeleted) */\nfunction toDatasetItem(row: DatasetItemRow): DatasetItem {\n return {\n id: row.id,\n datasetId: row.datasetId,\n datasetVersion: row.datasetVersion,\n input: row.input,\n groundTruth: row.groundTruth,\n expectedTrajectory: row.expectedTrajectory,\n requestContext: row.requestContext,\n metadata: row.metadata,\n source: row.source,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n\n/** Internal record that allows null schemas (for \"clear schema\" semantics) */\ntype InternalDatasetRecord = Omit<DatasetRecord, 'inputSchema' | 'groundTruthSchema' | 'requestContextSchema'> & {\n inputSchema?: Record<string, unknown> | null;\n groundTruthSchema?: Record<string, unknown> | null;\n requestContextSchema?: Record<string, unknown> | null;\n};\n\n/** Normalize internal record (which may have null schemas) to public DatasetRecord */\nfunction toDatasetRecord(record: InternalDatasetRecord): DatasetRecord {\n return {\n ...record,\n inputSchema: record.inputSchema ?? undefined,\n groundTruthSchema: record.groundTruthSchema ?? undefined,\n requestContextSchema: record.requestContextSchema ?? undefined,\n };\n}\n\nexport class DatasetsInMemory extends DatasetsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.datasets.clear();\n this.db.datasetItems.clear();\n this.db.datasetVersions.clear();\n }\n\n // Dataset CRUD\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n const id = crypto.randomUUID();\n const now = new Date();\n const dataset = {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n inputSchema: input.inputSchema,\n groundTruthSchema: input.groundTruthSchema,\n requestContextSchema: input.requestContextSchema,\n targetType: input.targetType,\n targetIds: input.targetIds,\n scorerIds: input.scorerIds ?? null,\n version: 0,\n createdAt: now,\n updatedAt: now,\n } as DatasetRecord;\n this.db.datasets.set(id, dataset);\n return toDatasetRecord(dataset);\n }\n\n async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n const record = this.db.datasets.get(id);\n return record ? toDatasetRecord(record) : null;\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n const existing = this.db.datasets.get(args.id);\n if (!existing) {\n throw new Error(`Dataset not found: ${args.id}`);\n }\n\n const updated = {\n ...existing,\n name: args.name ?? existing.name,\n description: args.description ?? existing.description,\n metadata: args.metadata ?? existing.metadata,\n inputSchema: args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema,\n groundTruthSchema: args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema,\n requestContextSchema:\n args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema,\n tags: args.tags !== undefined ? args.tags : existing.tags,\n targetType: args.targetType !== undefined ? args.targetType : existing.targetType,\n targetIds: args.targetIds !== undefined ? args.targetIds : existing.targetIds,\n scorerIds: args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds,\n updatedAt: new Date(),\n } as DatasetRecord;\n this.db.datasets.set(args.id, updated);\n return toDatasetRecord(updated);\n }\n\n async deleteDataset({ id }: { id: string }): Promise<void> {\n // Cascade: delete items and versions\n for (const [itemId, rows] of this.db.datasetItems) {\n if (rows.length > 0 && rows[0]!.datasetId === id) {\n this.db.datasetItems.delete(itemId);\n }\n }\n for (const [vId, v] of this.db.datasetVersions) {\n if (v.datasetId === id) {\n this.db.datasetVersions.delete(vId);\n }\n }\n\n // F3 fix: detach experiments (SET NULL) instead of deleting them\n for (const [expId, exp] of this.db.experiments) {\n if (exp.datasetId === id) {\n this.db.experiments.set(expId, { ...exp, datasetId: null, datasetVersion: null });\n }\n }\n\n this.db.datasets.delete(id);\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n const datasets = Array.from(this.db.datasets.values());\n // Sort by createdAt descending (newest first)\n datasets.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? datasets.length : start + perPage;\n\n return {\n datasets: datasets.slice(start, end).map(toDatasetRecord),\n pagination: {\n total: datasets.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : datasets.length > end,\n },\n };\n }\n\n // --- SCD-2 item mutations ---\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n const dataset = this.db.datasets.get(args.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Bump version (T3.7, T3.26 — only bumps version, not updatedAt)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n const id = crypto.randomUUID();\n const row: DatasetItemRow = {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: args.input,\n groundTruth: args.groundTruth,\n expectedTrajectory: args.expectedTrajectory,\n requestContext: args.requestContext,\n metadata: args.metadata,\n source: args.source,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db.datasetItems.set(id, [row]);\n\n // T3.11 — every mutation inserts exactly one dataset_version row\n await this.createDatasetVersion(args.datasetId, newVersion);\n\n return toDatasetItem(row);\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n const rows = this.db.datasetItems.get(args.id);\n if (!rows || rows.length === 0) {\n throw new Error(`Item not found: ${args.id}`);\n }\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow) {\n throw new Error(`Item not found: ${args.id}`);\n }\n if (currentRow.datasetId !== args.datasetId) {\n throw new Error(`Item ${args.id} does not belong to dataset ${args.datasetId}`);\n }\n\n const dataset = this.db.datasets.get(args.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Bump version (T3.26)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n // T3.8 — close old row\n currentRow.validTo = newVersion;\n\n // T3.8 — insert new row with same id\n const now = new Date();\n const newRow: DatasetItemRow = {\n id: args.id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: args.input !== undefined ? args.input : currentRow.input,\n groundTruth: args.groundTruth !== undefined ? args.groundTruth : currentRow.groundTruth,\n expectedTrajectory:\n args.expectedTrajectory !== undefined ? args.expectedTrajectory : currentRow.expectedTrajectory,\n requestContext: args.requestContext !== undefined ? args.requestContext : currentRow.requestContext,\n metadata: args.metadata !== undefined ? args.metadata : currentRow.metadata,\n source: args.source !== undefined ? args.source : currentRow.source,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n };\n rows.push(newRow);\n\n // T3.11\n await this.createDatasetVersion(args.datasetId, newVersion);\n\n return toDatasetItem(newRow);\n }\n\n protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n const rows = this.db.datasetItems.get(id);\n if (!rows || rows.length === 0) {\n return; // no-op if item doesn't exist\n }\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow) {\n return; // already deleted\n }\n if (currentRow.datasetId !== datasetId) {\n throw new Error(`Item ${id} does not belong to dataset ${datasetId}`);\n }\n\n const dataset = this.db.datasets.get(datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${datasetId}`);\n }\n\n // Bump version (T3.26)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(datasetId, { ...dataset, version: newVersion });\n\n // T3.9 — close old row\n currentRow.validTo = newVersion;\n\n // T3.9 — insert tombstone\n const now = new Date();\n rows.push({\n id,\n datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: currentRow.input,\n groundTruth: currentRow.groundTruth,\n requestContext: currentRow.requestContext,\n metadata: currentRow.metadata,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n });\n\n // T3.11\n await this.createDatasetVersion(datasetId, newVersion);\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n const rows = this.db.datasetItems.get(args.id);\n if (!rows || rows.length === 0) return null;\n\n if (args.datasetVersion !== undefined) {\n // T3.13 — exact version match, exclude deleted\n const row = rows.find(r => r.datasetVersion === args.datasetVersion && !r.isDeleted);\n return row ? toDatasetItem(row) : null;\n }\n\n // T3.12 — current row (validTo IS NULL AND isDeleted = false)\n const current = rows.find(r => r.validTo === null && !r.isDeleted);\n return current ? toDatasetItem(current) : null;\n }\n\n async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n // T3.14 — SCD-2 range query: items visible at version N\n const items: DatasetItem[] = [];\n\n for (const rows of this.db.datasetItems.values()) {\n if (rows.length === 0 || rows[0]!.datasetId !== datasetId) continue;\n\n // Find the row visible at this version:\n // datasetVersion <= N AND (validTo IS NULL OR validTo > N) AND isDeleted = false\n const visible = rows.find(\n r => r.datasetVersion <= version && (r.validTo === null || r.validTo > version) && !r.isDeleted,\n );\n if (visible) {\n items.push(toDatasetItem(visible));\n }\n }\n\n items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n return items;\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n // ALL rows including tombstones, ordered by datasetVersion DESC (newest first)\n const rows = this.db.datasetItems.get(itemId);\n if (!rows) return [];\n return [...rows].sort((a, b) => b.datasetVersion - a.datasetVersion);\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n let items: DatasetItem[];\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query\n items = await this.getItemsByVersion({ datasetId: args.datasetId, version: args.version });\n } else {\n // T3.16 — current items only (validTo IS NULL AND isDeleted = false)\n items = [];\n for (const rows of this.db.datasetItems.values()) {\n if (rows.length === 0 || rows[0]!.datasetId !== args.datasetId) continue;\n const current = rows.find(r => r.validTo === null && !r.isDeleted);\n if (current) {\n items.push(toDatasetItem(current));\n }\n }\n }\n\n // Filter by search term if specified (case-insensitive partial match on input/groundTruth)\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n items = items.filter(item => {\n const inputStr = typeof item.input === 'string' ? item.input : JSON.stringify(item.input);\n const outputStr = item.groundTruth\n ? typeof item.groundTruth === 'string'\n ? item.groundTruth\n : JSON.stringify(item.groundTruth)\n : '';\n return inputStr.toLowerCase().includes(searchLower) || outputStr.toLowerCase().includes(searchLower);\n });\n }\n\n // Sort by createdAt descending, then by id descending for stability\n items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? items.length : start + perPage;\n\n return {\n items: items.slice(start, end),\n pagination: {\n total: items.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : items.length > end,\n },\n };\n }\n\n // --- Dataset version methods ---\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n const id = crypto.randomUUID();\n const dsVersion: DatasetVersion = {\n id,\n datasetId,\n version,\n createdAt: new Date(),\n };\n this.db.datasetVersions.set(id, dsVersion);\n return dsVersion;\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n const versions: DatasetVersion[] = [];\n for (const v of this.db.datasetVersions.values()) {\n if (v.datasetId === input.datasetId) {\n versions.push(v);\n }\n }\n versions.sort((a, b) => b.version - a.version);\n\n const { page, perPage: perPageInput } = input.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? versions.length : start + perPage;\n\n return {\n versions: versions.slice(start, end),\n pagination: {\n total: versions.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : versions.length > end,\n },\n };\n }\n\n // --- Bulk operations (SCD-2 internally) ---\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n const dataset = this.db.datasets.get(input.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // T3.19 — single version increment for all items\n const newVersion = dataset.version + 1;\n this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n const items: DatasetItem[] = [];\n\n for (const itemInput of input.items) {\n const id = crypto.randomUUID();\n const row: DatasetItemRow = {\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: itemInput.input,\n groundTruth: itemInput.groundTruth,\n expectedTrajectory: itemInput.expectedTrajectory,\n requestContext: itemInput.requestContext,\n metadata: itemInput.metadata,\n source: itemInput.source,\n createdAt: now,\n updatedAt: now,\n };\n this.db.datasetItems.set(id, [row]);\n items.push(toDatasetItem(row));\n }\n\n // T3.11 — single dataset version for the bulk operation\n await this.createDatasetVersion(input.datasetId, newVersion);\n\n return items;\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = this.db.datasets.get(input.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // T3.20 — single version increment\n const newVersion = dataset.version + 1;\n this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n\n for (const itemId of input.itemIds) {\n const rows = this.db.datasetItems.get(itemId);\n if (!rows) continue;\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow || currentRow.datasetId !== input.datasetId) continue;\n\n // Close old row\n currentRow.validTo = newVersion;\n\n // Insert tombstone\n rows.push({\n id: itemId,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: currentRow.input,\n groundTruth: currentRow.groundTruth,\n requestContext: currentRow.requestContext,\n metadata: currentRow.metadata,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n });\n }\n\n // T3.11\n await this.createDatasetVersion(input.datasetId, newVersion);\n }\n}\n","import type {\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for dataset experiments storage domain.\n * Provides the contract for experiment lifecycle and result tracking.\n */\nexport abstract class ExperimentsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'EXPERIMENTS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n // Experiment lifecycle\n abstract createExperiment(input: CreateExperimentInput): Promise<Experiment>;\n abstract updateExperiment(input: UpdateExperimentInput): Promise<Experiment>;\n abstract getExperimentById(args: { id: string }): Promise<Experiment | null>;\n abstract listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput>;\n abstract deleteExperiment(args: { id: string }): Promise<void>;\n\n // Results (per-item)\n abstract addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult>;\n abstract updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult>;\n abstract getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null>;\n abstract listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput>;\n abstract deleteExperimentResults(args: { experimentId: string }): Promise<void>;\n\n // Aggregation\n abstract getReviewSummary(): Promise<ExperimentReviewCounts[]>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ExperimentsStorage } from './base';\n\nexport class ExperimentsInMemory extends ExperimentsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.experiments.clear();\n this.db.experimentResults.clear();\n }\n\n // Experiment lifecycle\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n const now = new Date();\n const experiment: Experiment = {\n id: input.id ?? crypto.randomUUID(),\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n agentVersion: input.agentVersion ?? null,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n this.db.experiments.set(experiment.id, experiment);\n return experiment;\n }\n\n async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n const existing = this.db.experiments.get(input.id);\n if (!existing) {\n throw new Error(`Experiment not found: ${input.id}`);\n }\n const updated: Experiment = {\n ...existing,\n status: input.status ?? existing.status,\n totalItems: input.totalItems ?? existing.totalItems,\n succeededCount: input.succeededCount ?? existing.succeededCount,\n failedCount: input.failedCount ?? existing.failedCount,\n skippedCount: input.skippedCount ?? existing.skippedCount,\n startedAt: input.startedAt ?? existing.startedAt,\n completedAt: input.completedAt ?? existing.completedAt,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n metadata: input.metadata ?? existing.metadata,\n updatedAt: new Date(),\n };\n this.db.experiments.set(input.id, updated);\n return updated;\n }\n\n async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n return this.db.experiments.get(args.id) ?? null;\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n let experiments = Array.from(this.db.experiments.values());\n\n // Apply filters\n if (args.datasetId) {\n experiments = experiments.filter(r => r.datasetId === args.datasetId);\n }\n if (args.targetType) {\n experiments = experiments.filter(r => r.targetType === args.targetType);\n }\n if (args.targetId) {\n experiments = experiments.filter(r => r.targetId === args.targetId);\n }\n if (args.agentVersion) {\n experiments = experiments.filter(r => r.agentVersion === args.agentVersion);\n }\n if (args.status) {\n experiments = experiments.filter(r => r.status === args.status);\n }\n\n // Sort by createdAt descending (newest first)\n experiments.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? experiments.length : start + perPage;\n\n return {\n experiments: experiments.slice(start, end),\n pagination: {\n total: experiments.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : experiments.length > end,\n },\n };\n }\n\n async deleteExperiment(args: { id: string }): Promise<void> {\n this.db.experiments.delete(args.id);\n // Also delete associated results\n for (const [resultId, result] of this.db.experimentResults) {\n if (result.experimentId === args.id) {\n this.db.experimentResults.delete(resultId);\n }\n }\n }\n\n // Results (per-item)\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n const now = new Date();\n const result: ExperimentResult = {\n id: input.id ?? crypto.randomUUID(),\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n status: input.status ?? null,\n tags: input.tags ?? null,\n createdAt: now,\n };\n this.db.experimentResults.set(result.id, result);\n return result;\n }\n\n async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n const existing = this.db.experimentResults.get(input.id);\n if (!existing) {\n throw new Error(`Experiment result not found: ${input.id}`);\n }\n if (input.experimentId && existing.experimentId !== input.experimentId) {\n throw new Error(`Experiment result ${input.id} does not belong to experiment ${input.experimentId}`);\n }\n const updated: ExperimentResult = {\n ...existing,\n status: input.status !== undefined ? input.status : existing.status,\n tags: input.tags !== undefined ? input.tags : existing.tags,\n };\n this.db.experimentResults.set(input.id, updated);\n return updated;\n }\n\n async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n return this.db.experimentResults.get(args.id) ?? null;\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n let results = Array.from(this.db.experimentResults.values()).filter(r => r.experimentId === args.experimentId);\n\n // Apply filters\n if (args.traceId) {\n results = results.filter(r => r.traceId === args.traceId);\n }\n if (args.status) {\n results = results.filter(r => r.status === args.status);\n }\n\n // Sort by startedAt ascending (execution order)\n results.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? results.length : start + perPage;\n\n return {\n results: results.slice(start, end),\n pagination: {\n total: results.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : results.length > end,\n },\n };\n }\n\n async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n for (const [resultId, result] of this.db.experimentResults) {\n if (result.experimentId === args.experimentId) {\n this.db.experimentResults.delete(resultId);\n }\n }\n }\n\n async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n const counts = new Map<string, ExperimentReviewCounts>();\n\n for (const result of this.db.experimentResults.values()) {\n let entry = counts.get(result.experimentId);\n if (!entry) {\n entry = { experimentId: result.experimentId, total: 0, needsReview: 0, reviewed: 0, complete: 0 };\n counts.set(result.experimentId, entry);\n }\n entry.total++;\n if (result.status === 'needs-review') entry.needsReview++;\n else if (result.status === 'reviewed') entry.reviewed++;\n else if (result.status === 'complete') entry.complete++;\n }\n\n return Array.from(counts.values());\n }\n}\n","import type { BackgroundTask } from '../../background-tasks/types';\nimport type { ScoreRowData } from '../../evals/types';\nimport type { StorageThreadType } from '../../memory/types';\nimport type {\n StorageAgentType,\n StorageMCPClientType,\n StorageMCPServerType,\n StorageMessageType,\n StoragePromptBlockType,\n StorageResourceType,\n StorageScorerDefinitionType,\n StorageWorkspaceType,\n StorageSkillType,\n StorageWorkflowRun,\n ObservationalMemoryRecord,\n DatasetRecord,\n DatasetItemRow,\n DatasetVersion,\n Experiment,\n ExperimentResult,\n} from '../types';\nimport type { AgentVersion } from './agents';\nimport type { MCPClientVersion } from './mcp-clients';\nimport type { MCPServerVersion } from './mcp-servers';\nimport type { TraceEntry } from './observability';\nimport type { FeedbackRecord } from './observability/feedback';\nimport type { LogRecord } from './observability/logs';\nimport type { MetricRecord } from './observability/metrics';\nimport type { ScoreRecord } from './observability/scores';\nimport type { PromptBlockVersion } from './prompt-blocks';\nimport type { ScorerDefinitionVersion } from './scorer-definitions';\nimport type { SkillVersion } from './skills';\nimport type { WorkspaceVersion } from './workspaces';\n\n/**\n * InMemoryDB is a thin database layer for in-memory storage.\n * It holds all the Maps that store data, similar to how a real database\n * connection (pg-promise client, libsql client) is shared across domains.\n *\n * Each domain receives a reference to this db and operates on the relevant Maps.\n */\nexport class InMemoryDB {\n readonly threads = new Map<string, StorageThreadType>();\n readonly messages = new Map<string, StorageMessageType>();\n readonly resources = new Map<string, StorageResourceType>();\n readonly workflows = new Map<string, StorageWorkflowRun>();\n readonly scores = new Map<string, ScoreRowData>();\n readonly traces = new Map<string, TraceEntry>();\n readonly metricRecords: MetricRecord[] = [];\n readonly logRecords: LogRecord[] = [];\n readonly scoreRecords: ScoreRecord[] = [];\n readonly feedbackRecords: FeedbackRecord[] = [];\n readonly agents = new Map<string, StorageAgentType>();\n readonly agentVersions = new Map<string, AgentVersion>();\n readonly promptBlocks = new Map<string, StoragePromptBlockType>();\n readonly promptBlockVersions = new Map<string, PromptBlockVersion>();\n readonly scorerDefinitions = new Map<string, StorageScorerDefinitionType>();\n readonly scorerDefinitionVersions = new Map<string, ScorerDefinitionVersion>();\n readonly mcpClients = new Map<string, StorageMCPClientType>();\n readonly mcpClientVersions = new Map<string, MCPClientVersion>();\n readonly mcpServers = new Map<string, StorageMCPServerType>();\n readonly mcpServerVersions = new Map<string, MCPServerVersion>();\n readonly workspaces = new Map<string, StorageWorkspaceType>();\n readonly workspaceVersions = new Map<string, WorkspaceVersion>();\n readonly skills = new Map<string, StorageSkillType>();\n readonly skillVersions = new Map<string, SkillVersion>();\n /** Observational memory records, keyed by resourceId, each holding array of records (generations) */\n readonly observationalMemory = new Map<string, ObservationalMemoryRecord[]>();\n\n // Dataset domain maps\n readonly datasets = new Map<string, DatasetRecord>();\n readonly datasetItems = new Map<string, DatasetItemRow[]>();\n readonly datasetVersions = new Map<string, DatasetVersion>();\n\n // Experiment domain maps\n readonly experiments = new Map<string, Experiment>();\n readonly experimentResults = new Map<string, ExperimentResult>();\n\n // Background tasks domain\n readonly backgroundTasks = new Map<string, BackgroundTask>();\n\n /**\n * Clears all data from all collections.\n * Useful for testing.\n */\n clear(): void {\n this.threads.clear();\n this.messages.clear();\n this.resources.clear();\n this.workflows.clear();\n this.scores.clear();\n this.traces.clear();\n this.metricRecords.length = 0;\n this.logRecords.length = 0;\n this.scoreRecords.length = 0;\n this.feedbackRecords.length = 0;\n this.agents.clear();\n this.agentVersions.clear();\n this.promptBlocks.clear();\n this.promptBlockVersions.clear();\n this.scorerDefinitions.clear();\n this.scorerDefinitionVersions.clear();\n this.mcpClients.clear();\n this.mcpClientVersions.clear();\n this.mcpServers.clear();\n this.mcpServerVersions.clear();\n this.workspaces.clear();\n this.workspaceVersions.clear();\n this.skills.clear();\n this.skillVersions.clear();\n this.observationalMemory.clear();\n this.datasets.clear();\n this.datasetItems.clear();\n this.datasetVersions.clear();\n this.experiments.clear();\n this.experimentResults.clear();\n this.backgroundTasks.clear();\n }\n}\n","import type { MastraMessageContentV2 } from '../../../agent';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport type {\n StorageResourceType,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageOrderBy,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ObservationalMemoryRecord,\n ObservationalMemoryHistoryOptions,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\nfunction isPlainObj(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Constants for metadata key validation\nconst SAFE_METADATA_KEY_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\nconst MAX_METADATA_KEY_LENGTH = 128;\nconst DISALLOWED_METADATA_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\nexport abstract class MemoryStorage extends StorageDomain {\n /**\n * Whether this storage adapter supports Observational Memory.\n * Adapters that implement OM methods should set this to true.\n * Defaults to false for backwards compatibility with custom adapters.\n */\n readonly supportsObservationalMemory?: boolean = false;\n\n constructor() {\n super({\n component: 'STORAGE',\n name: 'MEMORY',\n });\n }\n\n abstract getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null>;\n\n abstract saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType>;\n\n abstract updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType>;\n\n abstract deleteThread({ threadId }: { threadId: string }): Promise<void>;\n\n abstract listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput>;\n\n /**\n * List messages by resource ID only (across all threads).\n * Used by Observational Memory and LongMemEval for resource-scoped queries.\n *\n * @param args - Resource ID and pagination/filtering options\n * @returns Paginated list of messages for the resource\n */\n async listMessagesByResourceId(_args: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n throw new Error(\n `Resource-scoped message listing is not implemented by this storage adapter (${this.constructor.name}). ` +\n `Use an adapter that supports Observational Memory (pg, libsql, mongodb) or disable observational memory.`,\n );\n }\n\n abstract listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n abstract saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n abstract updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]>;\n\n async deleteMessages(_messageIds: string[]): Promise<void> {\n throw new Error(\n `Message deletion is not supported by this storage adapter (${this.constructor.name}). ` +\n `The deleteMessages method needs to be implemented in the storage adapter.`,\n );\n }\n\n /**\n * List threads with optional filtering by resourceId and metadata.\n *\n * @param args - Filter, pagination, and ordering options\n * @param args.filter - Optional filters for resourceId and/or metadata\n * @param args.filter.resourceId - Optional resource ID to filter by\n * @param args.filter.metadata - Optional metadata key-value pairs to filter by (AND logic)\n * @returns Paginated list of threads matching the filters\n */\n abstract listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;\n\n /**\n * Clone a thread and its messages to create a new independent thread.\n * The cloned thread will have clone metadata stored in its metadata field.\n *\n * @param args - Clone configuration options\n * @returns The newly created thread and the cloned messages\n */\n async cloneThread(_args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n throw new Error(\n `Thread cloning is not implemented by this storage adapter (${this.constructor.name}). ` +\n `The cloneThread method needs to be implemented in the storage adapter.`,\n );\n }\n\n async getResourceById(_: { resourceId: string }): Promise<StorageResourceType | null> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n async saveResource(_: { resource: StorageResourceType }): Promise<StorageResourceType> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n async updateResource(_: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n protected parseOrderBy(\n orderBy?: StorageOrderBy,\n defaultDirection: ThreadSortDirection = 'DESC',\n ): { field: ThreadOrderBy; direction: ThreadSortDirection } {\n return {\n field: orderBy?.field && orderBy.field in THREAD_ORDER_BY_SET ? orderBy.field : 'createdAt',\n direction:\n orderBy?.direction && orderBy.direction in THREAD_THREAD_SORT_DIRECTION_SET\n ? orderBy.direction\n : defaultDirection,\n };\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n /**\n * Get the current observational memory record for a thread/resource.\n * Returns the most recent active record.\n */\n async getObservationalMemory(\n _threadId: string | null,\n _resourceId: string,\n ): Promise<ObservationalMemoryRecord | null> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Get observational memory history (previous generations).\n * Returns records in reverse chronological order (newest first).\n */\n async getObservationalMemoryHistory(\n _threadId: string | null,\n _resourceId: string,\n _limit?: number,\n _options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Create a new observational memory record.\n * Called when starting observations for a new thread/resource.\n */\n async initializeObservationalMemory(_input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update active observations.\n * Called when observations are created and immediately activated (no buffering).\n */\n async updateActiveObservations(_input: UpdateActiveObservationsInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n // ============================================\n // Buffering Methods (for async observation/reflection)\n // These methods support async buffering when `bufferTokens` is configured.\n // ============================================\n\n /**\n * Update buffered observations.\n * Called when observations are created asynchronously via `bufferTokens`.\n */\n async updateBufferedObservations(_input: UpdateBufferedObservationsInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Swap buffered observations to active.\n * Atomic operation that:\n * 1. Appends bufferedObservations → activeObservations (based on activationRatio)\n * 2. Moves activated bufferedMessageIds → observedMessageIds\n * 3. Keeps remaining buffered content if activationRatio < 100\n * 4. Updates lastObservedAt\n *\n * Returns info about what was activated for UI feedback.\n */\n async swapBufferedToActive(_input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Create a new generation from a reflection.\n * Creates a new record with:\n * - originType: 'reflection'\n * - activeObservations containing the reflection\n * - generationCount incremented from the current record\n */\n async createReflectionGeneration(_input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update buffered reflection (async reflection in progress).\n * Called when reflection runs asynchronously via `bufferTokens`.\n */\n async updateBufferedReflection(_input: UpdateBufferedReflectionInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Swap buffered reflection to active observations.\n * Creates a new generation where activeObservations = bufferedReflection + unreflected observations.\n * The `tokenCount` in input is the processor-computed token count for the combined content.\n */\n async swapBufferedReflectionToActive(\n _input: SwapBufferedReflectionToActiveInput,\n ): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isReflecting flag.\n */\n async setReflectingFlag(_id: string, _isReflecting: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isObserving flag.\n */\n async setObservingFlag(_id: string, _isObserving: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isBufferingObservation flag and update lastBufferedAtTokens.\n * Called when async observation buffering starts (true) or ends/fails (false).\n * @param id - Record ID\n * @param isBuffering - Whether buffering is in progress\n * @param lastBufferedAtTokens - The pending token count at which this buffer was triggered (only set when isBuffering=true)\n */\n async setBufferingObservationFlag(_id: string, _isBuffering: boolean, _lastBufferedAtTokens?: number): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isBufferingReflection flag.\n * Called when async reflection buffering starts (true) or ends/fails (false).\n */\n async setBufferingReflectionFlag(_id: string, _isBuffering: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Insert a fully-formed observational memory record.\n * Used by thread cloning to copy OM state with remapped IDs.\n */\n async insertObservationalMemoryRecord(_record: ObservationalMemoryRecord): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Clear all observational memory for a thread/resource.\n * Removes all records and history.\n */\n async clearObservationalMemory(_threadId: string | null, _resourceId: string): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the pending message token count.\n * Called at the end of each OM processing step to persist the current\n * context window token count so the UI can display it on page load.\n */\n async setPendingMessageTokens(_id: string, _tokenCount: number): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update the config of an existing observational memory record.\n * The provided config is deep-merged into the record's existing config.\n */\n async updateObservationalMemoryConfig(_input: UpdateObservationalMemoryConfigInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Deep-merge two plain objects. Available for subclasses to merge\n * partial config overrides into existing record configs.\n */\n protected deepMergeConfig(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const output: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const tVal = target[key];\n const sVal = source[key];\n if (isPlainObj(tVal) && isPlainObj(sVal)) {\n output[key] = this.deepMergeConfig(tVal, sVal);\n } else if (sVal !== undefined) {\n output[key] = sVal;\n }\n }\n return output;\n }\n\n /**\n * Validates metadata keys to prevent SQL injection attacks and prototype pollution.\n * Keys must start with a letter or underscore, followed by alphanumeric characters or underscores.\n * @param metadata - The metadata object to validate\n * @throws Error if any key contains invalid characters or is a disallowed key\n */\n protected validateMetadataKeys(metadata: Record<string, unknown> | undefined): void {\n if (!metadata) return;\n\n for (const key of Object.keys(metadata)) {\n // First check for disallowed prototype pollution keys\n if (DISALLOWED_METADATA_KEYS.has(key)) {\n throw new Error(`Invalid metadata key: \"${key}\".`);\n }\n\n // Then check pattern\n if (!SAFE_METADATA_KEY_PATTERN.test(key)) {\n throw new Error(\n `Invalid metadata key: \"${key}\". Keys must start with a letter or underscore and contain only alphanumeric characters and underscores.`,\n );\n }\n\n // Also limit key length to prevent potential issues\n if (key.length > MAX_METADATA_KEY_LENGTH) {\n throw new Error(`Metadata key \"${key}\" exceeds maximum length of ${MAX_METADATA_KEY_LENGTH} characters.`);\n }\n }\n }\n\n /**\n * Validates pagination parameters and returns safe offset.\n * @param page - Page number (0-indexed)\n * @param perPage - Items per page (0 is allowed and returns empty results)\n * @throws Error if page is negative, perPage is negative/invalid, or offset would overflow\n */\n protected validatePagination(page: number, perPage: number): void {\n if (!Number.isFinite(page) || !Number.isSafeInteger(page) || page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // perPage: 0 is allowed (returns empty results), negative values are rejected\n if (!Number.isFinite(perPage) || !Number.isSafeInteger(perPage) || perPage < 0) {\n throw new Error('perPage must be >= 0');\n }\n\n // Skip overflow check when perPage is 0 (no offset needed)\n if (perPage === 0) {\n return;\n }\n\n // Prevent overflow when calculating offset\n const offset = page * perPage;\n if (!Number.isSafeInteger(offset) || offset > Number.MAX_SAFE_INTEGER) {\n throw new Error('page value too large');\n }\n }\n\n /**\n * Validates pagination input before normalization.\n * Use this when accepting raw perPageInput (number | false) from callers.\n *\n * When perPage is false (fetch all), page must be 0 since pagination is disabled.\n * When perPage is a number, delegates to validatePagination for full validation.\n *\n * @param page - Page number (0-indexed)\n * @param perPageInput - Items per page as number, or false to fetch all results\n * @throws Error if perPageInput is false and page !== 0\n * @throws Error if perPageInput is invalid (not false or a non-negative safe integer)\n * @throws Error if page is invalid or offset would overflow\n */\n protected validatePaginationInput(page: number, perPageInput: number | false): void {\n // Validate perPageInput type first\n if (perPageInput !== false) {\n if (typeof perPageInput !== 'number' || !Number.isFinite(perPageInput) || !Number.isSafeInteger(perPageInput)) {\n throw new Error('perPage must be false or a safe integer');\n }\n if (perPageInput < 0) {\n throw new Error('perPage must be >= 0');\n }\n }\n\n // When fetching all (perPage: false), only page 0 is valid\n if (perPageInput === false) {\n if (page !== 0) {\n throw new Error('page must be 0 when perPage is false');\n }\n // Still validate page is a valid integer\n if (!Number.isFinite(page) || !Number.isSafeInteger(page)) {\n throw new Error('page must be >= 0');\n }\n return;\n }\n\n // For numeric perPage, delegate to existing validation\n this.validatePagination(page, perPageInput);\n }\n}\n\nconst THREAD_ORDER_BY_SET: Record<ThreadOrderBy, true> = {\n createdAt: true,\n updatedAt: true,\n};\n\nconst THREAD_THREAD_SORT_DIRECTION_SET: Record<ThreadSortDirection, true> = {\n ASC: true,\n DESC: true,\n};\n","import { MessageList } from '../../../agent/message-list';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n StorageMessageType,\n StorageResourceType,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n ObservationalMemoryHistoryOptions,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { filterByDateRange, jsonValueEquals, safelyParseJSON } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { MemoryStorage } from './base';\n\nexport class InMemoryMemory extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.threads.clear();\n this.db.messages.clear();\n this.db.resources.clear();\n this.db.observationalMemory.clear();\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const thread = this.db.threads.get(threadId);\n return thread ? { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata } : null;\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n const key = thread.id;\n this.db.threads.set(key, thread);\n return 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 const thread = this.db.threads.get(id);\n\n if (!thread) {\n throw new Error(`Thread with id ${id} not found`);\n }\n\n if (thread) {\n thread.title = title;\n thread.metadata = { ...thread.metadata, ...metadata };\n thread.updatedAt = new Date();\n }\n return thread;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n this.db.threads.delete(threadId);\n\n this.db.messages.forEach((msg, key) => {\n if (msg.thread_id === threadId) {\n this.db.messages.delete(key);\n }\n });\n }\n\n async listMessages({\n threadId,\n resourceId: optionalResourceId,\n include,\n filter,\n perPage: perPageInput,\n page = 0,\n orderBy,\n }: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new Error('threadId must be a non-empty string or array of non-empty strings');\n }\n\n const threadIdSet = new Set(threadIds);\n\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n const perPage = normalizePerPage(perPageInput, 40);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values that could cause performance issues\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Calculate offset from page\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Step 1: Get messages matching threadId(s) and optionally resourceId\n let threadMessages = Array.from(this.db.messages.values()).filter((msg: any) => {\n // Message must be in one of the specified threads\n if (threadIdSet && !threadIdSet.has(msg.thread_id)) return false;\n // If optionalResourceId provided, message must match it\n if (optionalResourceId && msg.resourceId !== optionalResourceId) return false;\n return true;\n });\n\n // Apply date filtering\n threadMessages = filterByDateRange(threadMessages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n // Sort thread messages before pagination\n threadMessages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Get total count of thread messages (for pagination metadata)\n const totalThreadMessages = threadMessages.length;\n\n // Apply pagination to thread messages\n const start = offset;\n const end = start + perPage;\n const paginatedThreadMessages = threadMessages.slice(start, end);\n\n // Convert paginated thread messages to MastraDBMessage\n const messages: MastraDBMessage[] = [];\n const messageIds = new Set<string>();\n\n for (const msg of paginatedThreadMessages) {\n const convertedMessage = this.parseStoredMessage(msg);\n messages.push(convertedMessage);\n messageIds.add(msg.id);\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n if (include && include.length > 0) {\n for (const includeItem of include) {\n const targetMessage = this.db.messages.get(includeItem.id);\n if (targetMessage) {\n // Convert StorageMessageType to MastraDBMessage\n const convertedMessage = {\n id: targetMessage.id,\n threadId: targetMessage.thread_id,\n content: safelyParseJSON(targetMessage.content),\n role: targetMessage.role as 'user' | 'assistant' | 'system' | 'tool',\n type: targetMessage.type,\n createdAt: targetMessage.createdAt,\n resourceId: targetMessage.resourceId,\n } as MastraDBMessage;\n\n // Only add if not already in messages array (deduplication)\n if (!messageIds.has(convertedMessage.id)) {\n messages.push(convertedMessage);\n messageIds.add(convertedMessage.id);\n }\n\n // Add previous messages if requested\n if (includeItem.withPreviousMessages) {\n const allThreadMessages = Array.from(this.db.messages.values())\n .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n if (targetIndex !== -1) {\n const startIndex = Math.max(0, targetIndex - (includeItem.withPreviousMessages || 0));\n for (let i = startIndex; i < targetIndex; i++) {\n const message = allThreadMessages[i];\n if (message && !messageIds.has(message.id)) {\n const convertedPrevMessage = {\n id: message.id,\n threadId: message.thread_id,\n content: safelyParseJSON(message.content),\n role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n type: message.type,\n createdAt: message.createdAt,\n resourceId: message.resourceId,\n } as MastraDBMessage;\n messages.push(convertedPrevMessage);\n messageIds.add(message.id);\n }\n }\n }\n }\n\n // Add next messages if requested\n if (includeItem.withNextMessages) {\n const allThreadMessages = Array.from(this.db.messages.values())\n .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n if (targetIndex !== -1) {\n const endIndex = Math.min(\n allThreadMessages.length,\n targetIndex + (includeItem.withNextMessages || 0) + 1,\n );\n for (let i = targetIndex + 1; i < endIndex; i++) {\n const message = allThreadMessages[i];\n if (message && !messageIds.has(message.id)) {\n const convertedNextMessage = {\n id: message.id,\n threadId: message.thread_id,\n content: safelyParseJSON(message.content),\n role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n type: message.type,\n createdAt: message.createdAt,\n resourceId: message.resourceId,\n } as MastraDBMessage;\n messages.push(convertedNextMessage);\n messageIds.add(message.id);\n }\n }\n }\n }\n }\n }\n }\n\n // Sort all messages (paginated + included) for final output\n messages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Calculate hasMore\n let hasMore;\n if (include && include.length > 0) {\n // When using include, check if we've returned all messages from the thread\n // because include might bring in messages beyond the pagination window\n const returnedThreadMessageIds = new Set(messages.filter(m => m.threadId === threadId).map(m => m.id));\n hasMore = returnedThreadMessageIds.size < totalThreadMessages;\n } else {\n // Standard pagination: check if there are more pages\n hasMore = end < totalThreadMessages;\n }\n\n return {\n messages,\n total: totalThreadMessages,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n async listMessagesByResourceId({\n resourceId,\n filter,\n perPage: perPageInput,\n page = 0,\n orderBy,\n }: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n const perPage = normalizePerPage(perPageInput, 40);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values that could cause performance issues\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Get all messages matching the resourceId (across all threads)\n let messages = Array.from(this.db.messages.values()).filter((msg: any) => msg.resourceId === resourceId);\n\n // Apply date filtering\n messages = filterByDateRange(messages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n // Sort messages\n messages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Get total count for pagination\n const total = messages.length;\n\n // Apply pagination\n const paginatedMessages = messages.slice(offset, offset + perPage);\n\n const list = new MessageList().add(\n paginatedMessages.map(m => this.parseStoredMessage(m)),\n 'memory',\n );\n\n const hasMore = offset + paginatedMessages.length < total;\n\n return {\n messages: list.get.all.db(),\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n protected parseStoredMessage(message: StorageMessageType): MastraDBMessage {\n const { resourceId, content, role, thread_id, ...rest } = message;\n\n // Parse content using safelyParseJSON utility\n let parsedContent = safelyParseJSON(content);\n\n // If the result is a plain string (V1 format), wrap it in V2 structure\n if (typeof parsedContent === 'string') {\n parsedContent = {\n format: 2,\n content: parsedContent,\n parts: [{ type: 'text', text: parsedContent }],\n };\n }\n\n return {\n ...rest,\n threadId: thread_id,\n ...(message.resourceId && { resourceId: message.resourceId }),\n content: parsedContent,\n role: role as MastraDBMessage['role'],\n } satisfies MastraDBMessage;\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n const rawMessages = messageIds.map(id => this.db.messages.get(id)).filter(message => !!message);\n\n const list = new MessageList().add(\n rawMessages.map(m => this.parseStoredMessage(m)),\n 'memory',\n );\n return { messages: list.get.all.db() };\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n // Simulate error handling for testing - check before saving\n if (messages.some(msg => msg.id === 'error-message' || msg.resourceId === null)) {\n throw new Error('Simulated error for testing');\n }\n\n // Update thread timestamps for each unique threadId\n const threadIds = new Set(messages.map(msg => msg.threadId).filter((id): id is string => Boolean(id)));\n for (const threadId of threadIds) {\n const thread = this.db.threads.get(threadId);\n if (thread) {\n thread.updatedAt = new Date();\n }\n }\n\n for (const message of messages) {\n const key = message.id;\n // Convert MastraDBMessage to StorageMessageType\n const storageMessage: StorageMessageType = {\n id: message.id,\n thread_id: message.threadId || '',\n content: JSON.stringify(message.content),\n role: message.role || 'user',\n type: message.type || 'text',\n createdAt: message.createdAt,\n resourceId: message.resourceId || null,\n };\n this.db.messages.set(key, storageMessage);\n }\n\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async updateMessages(args: { messages: (Partial<MastraDBMessage> & { id: string })[] }): Promise<MastraDBMessage[]> {\n const updatedMessages: MastraDBMessage[] = [];\n for (const update of args.messages) {\n const storageMsg = this.db.messages.get(update.id);\n if (!storageMsg) continue;\n\n // Track old threadId for possible move\n const oldThreadId = storageMsg.thread_id;\n const newThreadId = update.threadId || oldThreadId;\n let threadIdChanged = false;\n if (update.threadId && update.threadId !== oldThreadId) {\n threadIdChanged = true;\n }\n\n // Update fields\n if (update.role !== undefined) storageMsg.role = update.role;\n if (update.type !== undefined) storageMsg.type = update.type;\n if (update.createdAt !== undefined) storageMsg.createdAt = update.createdAt;\n if (update.resourceId !== undefined) storageMsg.resourceId = update.resourceId;\n // Deep merge content if present\n if (update.content !== undefined) {\n let oldContent = safelyParseJSON(storageMsg.content);\n let newContent = update.content;\n if (typeof newContent === 'object' && typeof oldContent === 'object') {\n // Deep merge for metadata/content fields\n newContent = { ...oldContent, ...newContent };\n if (oldContent.metadata && newContent.metadata) {\n newContent.metadata = { ...oldContent.metadata, ...newContent.metadata };\n }\n }\n storageMsg.content = JSON.stringify(newContent);\n }\n // Handle threadId change\n if (threadIdChanged) {\n storageMsg.thread_id = newThreadId;\n // Update updatedAt for both threads, ensuring strictly greater and not equal\n const base = Date.now();\n let oldThreadNewTime: number | undefined;\n const oldThread = this.db.threads.get(oldThreadId);\n if (oldThread) {\n const prev = new Date(oldThread.updatedAt).getTime();\n oldThreadNewTime = Math.max(base, prev + 1);\n oldThread.updatedAt = new Date(oldThreadNewTime);\n }\n const newThread = this.db.threads.get(newThreadId);\n if (newThread) {\n const prev = new Date(newThread.updatedAt).getTime();\n let newThreadNewTime = Math.max(base + 1, prev + 1);\n if (oldThreadNewTime !== undefined && newThreadNewTime <= oldThreadNewTime) {\n newThreadNewTime = oldThreadNewTime + 1;\n }\n newThread.updatedAt = new Date(newThreadNewTime);\n }\n } else {\n // Only update the thread's updatedAt if not a move\n const thread = this.db.threads.get(oldThreadId);\n if (thread) {\n const prev = new Date(thread.updatedAt).getTime();\n let newTime = Date.now();\n if (newTime <= prev) newTime = prev + 1;\n thread.updatedAt = new Date(newTime);\n }\n }\n // Save the updated message\n this.db.messages.set(update.id, storageMsg);\n // Return as MastraDBMessage\n updatedMessages.push({\n id: storageMsg.id,\n threadId: storageMsg.thread_id,\n content: safelyParseJSON(storageMsg.content),\n role: storageMsg.role === 'user' || storageMsg.role === 'assistant' ? storageMsg.role : 'user',\n type: storageMsg.type,\n createdAt: storageMsg.createdAt,\n resourceId: storageMsg.resourceId === null ? undefined : storageMsg.resourceId,\n });\n }\n return updatedMessages;\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n // Collect thread IDs to update\n const threadIds = new Set<string>();\n\n for (const messageId of messageIds) {\n const message = this.db.messages.get(messageId);\n if (message && message.thread_id) {\n threadIds.add(message.thread_id);\n }\n // Delete the message\n this.db.messages.delete(messageId);\n }\n\n // Update thread timestamps\n const now = new Date();\n for (const threadId of threadIds) {\n const thread = this.db.threads.get(threadId);\n if (thread) {\n thread.updatedAt = now;\n }\n }\n }\n\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy);\n\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Start with all threads\n let threads = Array.from(this.db.threads.values());\n\n // Apply resourceId filter if provided\n if (filter?.resourceId) {\n threads = threads.filter((t: any) => t.resourceId === filter.resourceId);\n }\n\n // Validate metadata keys before filtering\n this.validateMetadataKeys(filter?.metadata);\n\n // Apply metadata filter if provided (AND logic - all key-value pairs must match)\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n threads = threads.filter(thread => {\n if (!thread.metadata) return false;\n return Object.entries(filter.metadata!).every(([key, value]) => jsonValueEquals(thread.metadata![key], value));\n });\n }\n\n const sortedThreads = this.sortThreads(threads, field, direction);\n const clonedThreads = sortedThreads.map(thread => ({\n ...thread,\n metadata: thread.metadata ? { ...thread.metadata } : thread.metadata,\n })) as StorageThreadType[];\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n threads: clonedThreads.slice(offset, offset + perPage),\n total: clonedThreads.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < clonedThreads.length,\n };\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const resource = this.db.resources.get(resourceId);\n return resource\n ? { ...resource, metadata: resource.metadata ? { ...resource.metadata } : resource.metadata }\n : null;\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n this.db.resources.set(resource.id, resource);\n return 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 let resource = this.db.resources.get(resourceId);\n\n if (!resource) {\n // Create new resource if it doesn't exist\n resource = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n } else {\n resource = {\n ...resource,\n workingMemory: workingMemory !== undefined ? workingMemory : resource.workingMemory,\n metadata: {\n ...resource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n }\n\n this.db.resources.set(resourceId, resource);\n return resource;\n }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = this.db.threads.get(sourceThreadId);\n if (!sourceThread) {\n throw new Error(`Source thread with id ${sourceThreadId} not found`);\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n if (this.db.threads.has(newThreadId)) {\n throw new Error(`Thread with id ${newThreadId} already exists`);\n }\n\n // Get messages from the source thread\n let sourceMessages = Array.from(this.db.messages.values())\n .filter((msg: StorageMessageType) => msg.thread_id === sourceThreadId)\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n // Apply message filters if provided\n if (options?.messageFilter) {\n const { startDate, endDate, messageIds } = options.messageFilter;\n\n if (messageIds && messageIds.length > 0) {\n const messageIdSet = new Set(messageIds);\n sourceMessages = sourceMessages.filter(msg => messageIdSet.has(msg.id));\n }\n\n if (startDate) {\n sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) >= startDate);\n }\n\n if (endDate) {\n sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) <= endDate);\n }\n }\n\n // Apply message limit (take from the end to get most recent)\n if (options?.messageLimit && options.messageLimit > 0 && sourceMessages.length > options.messageLimit) {\n sourceMessages = sourceMessages.slice(-options.messageLimit);\n }\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Save the new thread\n this.db.threads.set(newThreadId, newThread);\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const messageIdMap: Record<string, string> = {};\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n messageIdMap[sourceMsg.id] = newMessageId;\n const parsedContent = safelyParseJSON(sourceMsg.content);\n\n // Create storage message\n const newStorageMessage: StorageMessageType = {\n id: newMessageId,\n thread_id: newThreadId,\n content: sourceMsg.content,\n role: sourceMsg.role,\n type: sourceMsg.type,\n createdAt: sourceMsg.createdAt,\n resourceId: resourceId || sourceMsg.resourceId,\n };\n\n this.db.messages.set(newMessageId, newStorageMessage);\n\n // Create MastraDBMessage for return\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: sourceMsg.role as MastraDBMessage['role'],\n type: sourceMsg.type,\n createdAt: sourceMsg.createdAt,\n resourceId: resourceId || sourceMsg.resourceId || undefined,\n });\n }\n\n return {\n thread: newThread,\n clonedMessages,\n messageIdMap,\n };\n }\n\n private sortThreads(threads: any[], field: ThreadOrderBy, direction: ThreadSortDirection): any[] {\n return threads.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n if (direction === 'ASC') {\n return aValue - bValue;\n } else {\n return bValue - aValue;\n }\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n }\n\n // ============================================\n // Observational Memory Implementation\n // ============================================\n\n private getObservationalMemoryKey(threadId: string | null, resourceId: string): string {\n if (threadId) {\n return `thread:${threadId}`;\n }\n return `resource:${resourceId}`;\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n const records = this.db.observationalMemory.get(key);\n return records?.[0] ?? null;\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit?: number,\n options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n let records = this.db.observationalMemory.get(key) ?? [];\n\n if (options?.from) {\n records = records.filter(r => r.createdAt >= options.from!);\n }\n if (options?.to) {\n records = records.filter(r => r.createdAt <= options.to!);\n }\n if (options?.offset != null) {\n records = records.slice(options.offset);\n }\n\n return limit != null ? records.slice(0, limit) : records;\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n const { threadId, resourceId, scope, config, observedTimezone } = input;\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n const now = new Date();\n\n const record: ObservationalMemoryRecord = {\n id: crypto.randomUUID(),\n scope,\n threadId,\n resourceId,\n // Timestamps at top level\n createdAt: now,\n updatedAt: now,\n // lastObservedAt starts undefined - all messages are \"unobserved\" initially\n // This ensures historical data (like LongMemEval fixtures) works correctly\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n // Buffering (for async observation/reflection)\n bufferedObservations: undefined,\n bufferedReflection: undefined,\n // Message tracking\n // Note: Message ID tracking removed in favor of cursor-based lastObservedAt\n // Token tracking\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n // State flags\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n // Configuration\n config,\n // Timezone used for observation date formatting\n observedTimezone,\n // Extensible metadata (optional)\n metadata: {},\n };\n\n // Add as first record (most recent)\n const existing = this.db.observationalMemory.get(key) ?? [];\n this.db.observationalMemory.set(key, [record, ...existing]);\n\n return record;\n }\n\n async insertObservationalMemoryRecord(record: ObservationalMemoryRecord): Promise<void> {\n const key = this.getObservationalMemoryKey(record.threadId, record.resourceId);\n const existing = this.db.observationalMemory.get(key) ?? [];\n // Insert in order by generationCount descending (newest first)\n let inserted = false;\n for (let i = 0; i < existing.length; i++) {\n if (record.generationCount >= existing[i]!.generationCount) {\n existing.splice(i, 0, record);\n inserted = true;\n break;\n }\n }\n if (!inserted) existing.push(record);\n this.db.observationalMemory.set(key, existing);\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n const { id, observations, tokenCount, lastObservedAt, observedMessageIds } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.activeObservations = observations;\n record.observationTokenCount = tokenCount;\n record.totalTokensObserved += tokenCount;\n // Reset pending tokens since we've now observed them\n record.pendingMessageTokens = 0;\n\n // Update timestamps (top-level, not in metadata)\n record.lastObservedAt = lastObservedAt;\n record.updatedAt = new Date();\n\n // Store observed message IDs as safeguard against re-observation\n if (observedMessageIds) {\n record.observedMessageIds = observedMessageIds;\n }\n }\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n const { id, chunk } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n // Create a new chunk with generated id and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${crypto.randomUUID()}`,\n cycleId: chunk.cycleId,\n observations: chunk.observations,\n tokenCount: chunk.tokenCount,\n messageIds: chunk.messageIds,\n messageTokens: chunk.messageTokens,\n lastObservedAt: chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: chunk.suggestedContinuation,\n currentTask: chunk.currentTask,\n threadTitle: chunk.threadTitle,\n };\n\n // Add chunk to the array\n const existingChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n record.bufferedObservationChunks = [...existingChunks, newChunk];\n\n if (input.lastBufferedAtTime) {\n record.lastBufferedAtTime = input.lastBufferedAtTime;\n }\n\n record.updatedAt = new Date();\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n const { id, activationRatio, lastObservedAt } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n // Use caller-provided refreshed chunks (with up-to-date token weights) for\n // activation math, falling back to persisted chunks otherwise.\n // Keep refreshed chunks local — don't overwrite the stored buffer.\n const persistedChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n const chunks = Array.isArray(input.bufferedChunks) ? input.bufferedChunks : persistedChunks;\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target: how many message tokens to remove so that\n // (1 - activationRatio) * threshold worth of raw messages remain.\n // e.g., ratio=0.8, threshold=5000, pending=6000 → remove 6000 - 1000 = 5000\n const retentionFloor = input.messageTokensThreshold * (1 - activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased over (prefer removing\n // slightly more than the target so remaining context lands at or below retentionFloor).\n // Track both best-over and best-under boundaries so we can fall back to under\n // if the over boundary would overshoot by too much.\n let cumulativeMessageTokens = 0;\n let bestOverBoundary = 0;\n let bestOverTokens = 0;\n let bestUnderBoundary = 0;\n let bestUnderTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n if (cumulativeMessageTokens >= targetMessageTokens) {\n // Over or equal — track the closest (lowest) over boundary\n if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n // Under — track the closest (highest) under boundary\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n // Safeguard: if the over boundary would eat into more than 95% of the\n // retention floor, fall back to the best under boundary instead.\n // This prevents edge cases where a large chunk overshoots dramatically.\n // When forceMaxActivation is set (above blockAfter), still prefer the over\n // boundary, but never if it would leave fewer than the smaller of 1000\n // tokens or the retention floor remaining.\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;\n // When activationRatio ≈ 1.0, retentionFloor is 0 and minRemaining becomes 0 — intentional for \"activate everything\" configs.\n const minRemaining = Math.min(1000, retentionFloor);\n\n let chunksToActivate: number;\n if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n chunksToActivate = bestUnderBoundary;\n } else if (bestOverBoundary > 0) {\n // All boundaries are over and exceed the safeguard — still activate\n // the closest over boundary (better than nothing)\n chunksToActivate = bestOverBoundary;\n } else {\n chunksToActivate = 1;\n }\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated chunks into content\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const derivedLastObservedAt =\n lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n\n // Append activated content to active observations with message boundary for cache stability\n if (record.activeObservations) {\n const boundary = `\\n\\n--- message boundary (${derivedLastObservedAt.toISOString()}) ---\\n\\n`;\n record.activeObservations = `${record.activeObservations}${boundary}${activatedContent}`;\n } else {\n record.activeObservations = activatedContent;\n }\n\n // Update observation token count\n record.observationTokenCount = (record.observationTokenCount ?? 0) + activatedTokens;\n\n // Decrement pending message tokens (clamped to zero)\n record.pendingMessageTokens = Math.max(0, (record.pendingMessageTokens ?? 0) - activatedMessageTokens);\n\n // NOTE: We intentionally do NOT add activatedMessageIds to record.observedMessageIds.\n // observedMessageIds is used by getUnobservedMessages to filter future messages.\n // Since AI SDK may reuse message IDs for new content, adding them here would\n // permanently block new content from being observed. Instead, we return\n // activatedMessageIds so the caller can remove them from messageList directly.\n\n // Update buffered state with remaining chunks\n record.bufferedObservationChunks = remainingChunks.length > 0 ? remainingChunks : undefined;\n\n // Update timestamps\n record.lastObservedAt = derivedLastObservedAt;\n record.updatedAt = new Date();\n\n // Use hints from the most recent activated chunk only — stale hints from older chunks are discarded\n const latestChunkHints = activatedChunks[activatedChunks.length - 1];\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n suggestedContinuation: latestChunkHints?.suggestedContinuation ?? undefined,\n currentTask: latestChunkHints?.currentTask ?? undefined,\n };\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n const { currentRecord, reflection, tokenCount } = input;\n const key = this.getObservationalMemoryKey(currentRecord.threadId, currentRecord.resourceId);\n const now = new Date();\n\n const newRecord: ObservationalMemoryRecord = {\n id: crypto.randomUUID(),\n scope: currentRecord.scope,\n threadId: currentRecord.threadId,\n resourceId: currentRecord.resourceId,\n // Timestamps at top level\n createdAt: now,\n updatedAt: now,\n lastObservedAt: currentRecord.lastObservedAt ?? now, // Carry over from observation (which always runs before reflection)\n originType: 'reflection',\n generationCount: currentRecord.generationCount + 1,\n activeObservations: reflection,\n config: currentRecord.config,\n totalTokensObserved: currentRecord.totalTokensObserved,\n observationTokenCount: tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n // Timezone used for observation date formatting\n observedTimezone: currentRecord.observedTimezone,\n // Extensible metadata (optional)\n metadata: {},\n };\n\n // Add as first record (most recent)\n const existing = this.db.observationalMemory.get(key) ?? [];\n this.db.observationalMemory.set(key, [newRecord, ...existing]);\n\n return newRecord;\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n const { id, reflection, tokenCount, inputTokenCount, reflectedObservationLineCount } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n const existing = record.bufferedReflection || '';\n record.bufferedReflection = existing ? `${existing}\\n\\n${reflection}` : reflection;\n record.bufferedReflectionTokens = (record.bufferedReflectionTokens || 0) + tokenCount;\n record.bufferedReflectionInputTokens = (record.bufferedReflectionInputTokens || 0) + inputTokenCount;\n record.reflectedObservationLineCount = reflectedObservationLineCount;\n record.updatedAt = new Date();\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n const { currentRecord } = input;\n const record = this.findObservationalMemoryRecordById(currentRecord.id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${currentRecord.id}`);\n }\n\n if (!record.bufferedReflection) {\n throw new Error('No buffered reflection to swap');\n }\n\n const bufferedReflection = record.bufferedReflection;\n const reflectedLineCount = record.reflectedObservationLineCount ?? 0;\n\n // Split current activeObservations by the boundary line count.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = record.activeObservations ?? '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent ? `${bufferedReflection}\\n\\n${unreflectedContent}` : bufferedReflection;\n\n // Create a new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: record,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n record.bufferedReflection = undefined;\n record.bufferedReflectionTokens = undefined;\n record.bufferedReflectionInputTokens = undefined;\n record.reflectedObservationLineCount = undefined;\n\n return newRecord;\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isReflecting = isReflecting;\n record.updatedAt = new Date();\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isObserving = isObserving;\n record.updatedAt = new Date();\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isBufferingObservation = isBuffering;\n if (lastBufferedAtTokens !== undefined) {\n record.lastBufferedAtTokens = lastBufferedAtTokens;\n }\n record.updatedAt = new Date();\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isBufferingReflection = isBuffering;\n record.updatedAt = new Date();\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n this.db.observationalMemory.delete(key);\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.pendingMessageTokens = tokenCount;\n record.updatedAt = new Date();\n }\n\n async updateObservationalMemoryConfig(input: UpdateObservationalMemoryConfigInput): Promise<void> {\n const record = this.findObservationalMemoryRecordById(input.id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${input.id}`);\n }\n\n record.config = this.deepMergeConfig(record.config as Record<string, unknown>, input.config);\n record.updatedAt = new Date();\n }\n\n /**\n * Helper to find an observational memory record by ID across all keys\n */\n private findObservationalMemoryRecordById(id: string): ObservationalMemoryRecord | null {\n for (const records of this.db.observationalMemory.values()) {\n const record = records.find(r => r.id === id);\n if (record) return record;\n }\n return null;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport type { StoragePagination } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class ScoresStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'SCORES',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n abstract getScoreById({ id }: { id: string }): Promise<ScoreRowData | null>;\n\n abstract saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }>;\n\n abstract 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<ListScoresResponse>;\n\n abstract listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse>;\n\n abstract listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse>;\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination: _pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n throw new MastraError({\n id: 'SCORES_STORAGE_GET_SCORES_BY_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: { traceId, spanId },\n });\n }\n}\n","import type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport { calculatePagination, normalizePerPage } from '../../base';\nimport type { StoragePagination } from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ScoresStorage } from './base';\n\nexport class ScoresInMemory extends ScoresStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.scores.clear();\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.db.scores.get(id) ?? null;\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n const newScore = { id: crypto.randomUUID(), createdAt: new Date(), updatedAt: new Date(), ...score };\n this.db.scores.set(newScore.id, newScore);\n return { score: newScore };\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<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => {\n let baseFilter = score.scorerId === scorerId;\n\n if (entityId) {\n baseFilter = baseFilter && score.entityId === entityId;\n }\n\n if (entityType) {\n baseFilter = baseFilter && score.entityType === entityType;\n }\n\n if (source) {\n baseFilter = baseFilter && score.source === source;\n }\n\n return baseFilter;\n });\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => score.runId === runId);\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n entityId: string;\n entityType: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => {\n const baseFilter = score.entityId === entityId && score.entityType === entityType;\n\n return baseFilter;\n });\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(\n score => score.traceId === traceId && score.spanId === spanId,\n );\n scores.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n}\n","/**\n * Types and utilities for evented workflow execution.\n */\n\n/**\n * String key used to mark pending forEach iterations.\n * Using a string key (not Symbol) ensures the marker survives JSON serialization\n * which is critical for distributed execution where state is persisted to storage\n * and loaded by different engine instances.\n */\nexport const PENDING_MARKER_KEY = '__mastra_pending__' as const;\n\n/**\n * Type for the pending marker object used in forEach iteration tracking.\n */\nexport type PendingMarker = { [PENDING_MARKER_KEY]: true };\n\n/**\n * Creates a new pending marker object.\n * Used to mark forEach iterations that are about to be resumed.\n */\nexport function createPendingMarker(): PendingMarker {\n return { [PENDING_MARKER_KEY]: true };\n}\n\n/**\n * Type guard to check if a value is a pending marker.\n * Works correctly after JSON serialization/deserialization.\n * @param val - The value to check\n * @returns True if the value is a PendingMarker\n */\nexport function isPendingMarker(val: unknown): val is PendingMarker {\n return (\n val !== null &&\n typeof val === 'object' &&\n PENDING_MARKER_KEY in val &&\n (val as Record<string, unknown>)[PENDING_MARKER_KEY] === true\n );\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport type { UpdateWorkflowStateOptions, WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class WorkflowsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'WORKFLOWS',\n });\n }\n\n abstract supportsConcurrentUpdates(): boolean;\n\n abstract 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\n abstract updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined>;\n\n abstract persistWorkflowSnapshot(_: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void>;\n\n abstract loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null>;\n\n abstract listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns>;\n\n abstract getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<WorkflowRun | null>;\n\n abstract deleteWorkflowRunById(args: { runId: string; workflowName: string }): Promise<void>;\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport { isPendingMarker } from '../../../workflows/evented/types';\nimport { normalizePerPage } from '../../base';\nimport type {\n StorageWorkflowRun,\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { WorkflowsStorage } from './base';\n\nexport class WorkflowsInMemory extends WorkflowsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.workflows.clear();\n }\n\n private getWorkflowKey(workflowName: string, runId: string): string {\n return `${workflowName}-${runId}`;\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 const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return {};\n }\n\n let snapshot: WorkflowRunState;\n if (!run.snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: run.run_id,\n } as WorkflowRunState;\n\n this.db.workflows.set(key, {\n ...run,\n snapshot,\n });\n } else {\n snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n }\n\n if (!snapshot || !snapshot?.context) {\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n // For foreach steps with array outputs, merge the arrays atomically\n // This handles concurrent iteration completions\n const existingResult = snapshot.context[stepId];\n if (\n existingResult &&\n 'output' in existingResult &&\n Array.isArray(existingResult.output) &&\n result &&\n typeof result === 'object' &&\n 'output' in result &&\n Array.isArray(result.output)\n ) {\n const existingOutput = existingResult.output as unknown[];\n const newOutput = result.output as unknown[];\n // ForEach iteration result merge logic:\n //\n // When forEach runs with concurrency > 1, multiple iterations execute in parallel.\n // Each iteration writes its result to the same output array. We need to merge carefully:\n //\n // - null in newOutput means \"iteration started but not finished\" - keep existing result\n // - non-null in newOutput means \"iteration completed\" - use the new result\n // - PendingMarker ({ __mastra_pending__: true }) means \"force reset to null\"\n //\n // The PendingMarker is needed for bulk resume: when resuming suspended iterations,\n // we must reset them to null before re-running. Without the marker, the merge logic\n // would preserve the old suspended result (since null means \"keep existing\").\n //\n // Why a string key instead of Symbol? Symbols don't survive JSON serialization.\n // In distributed execution where state is persisted to storage and loaded by\n // different engine instances, a Symbol marker would be silently dropped.\n const mergedOutput = [...existingOutput];\n for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {\n if (i < newOutput.length) {\n const newVal = newOutput[i];\n if (isPendingMarker(newVal)) {\n // PendingMarker: force reset to null (for bulk resume of suspended iterations)\n mergedOutput[i] = null;\n } else if (newVal !== null) {\n // Completed result: always use the new value\n mergedOutput[i] = newVal;\n }\n // null: iteration in progress, keep existing result (from spread above)\n }\n // Index beyond newOutput length: keep existing (from spread above)\n }\n snapshot.context[stepId] = {\n ...existingResult,\n ...(result as any),\n output: mergedOutput,\n };\n } else {\n snapshot.context[stepId] = result;\n }\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n this.db.workflows.set(key, {\n ...run,\n snapshot: snapshot,\n });\n\n return JSON.parse(JSON.stringify(snapshot.context));\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return;\n }\n\n let snapshot: WorkflowRunState;\n if (!run.snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: run.run_id,\n } as WorkflowRunState;\n\n this.db.workflows.set(key, {\n ...run,\n snapshot,\n });\n } else {\n snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n }\n\n if (!snapshot || !snapshot?.context) {\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n snapshot = { ...snapshot, ...opts };\n this.db.workflows.set(key, {\n ...run,\n snapshot: snapshot,\n });\n\n return snapshot;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const key = this.getWorkflowKey(workflowName, runId);\n const now = new Date();\n const data: StorageWorkflowRun = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: createdAt ?? now,\n updatedAt: updatedAt ?? now,\n };\n\n this.db.workflows.set(key, data);\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return null;\n }\n\n const snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n // Return a deep copy to prevent mutation\n return snapshot ? JSON.parse(JSON.stringify(snapshot)) : null;\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n if (page !== undefined && page < 0) {\n throw new Error('page must be >= 0');\n }\n\n let runs = Array.from(this.db.workflows.values());\n\n if (workflowName) runs = runs.filter((run: any) => run.workflow_name === workflowName);\n if (status) {\n runs = runs.filter((run: any) => {\n let snapshot: WorkflowRunState | string = run?.snapshot!;\n\n if (!snapshot) {\n return false;\n }\n\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch {\n return false;\n }\n } else {\n snapshot = JSON.parse(JSON.stringify(snapshot)) as WorkflowRunState;\n }\n\n return snapshot.status === status;\n });\n }\n\n if (fromDate && toDate) {\n runs = runs.filter(\n (run: any) =>\n new Date(run.createdAt).getTime() >= fromDate.getTime() &&\n new Date(run.createdAt).getTime() <= toDate.getTime(),\n );\n } else if (fromDate) {\n runs = runs.filter((run: any) => new Date(run.createdAt).getTime() >= fromDate.getTime());\n } else if (toDate) {\n runs = runs.filter((run: any) => new Date(run.createdAt).getTime() <= toDate.getTime());\n }\n if (resourceId) runs = runs.filter((run: any) => run.resourceId === resourceId);\n\n const total = runs.length;\n\n // Sort by createdAt\n runs.sort((a: any, b: any) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Apply pagination\n if (perPage !== undefined && page !== undefined) {\n // Use MAX_SAFE_INTEGER as default to maintain \"no pagination\" behavior when undefined\n const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalizedPerPage;\n const start = offset;\n const end = start + normalizedPerPage;\n runs = runs.slice(start, end);\n }\n\n // Deserialize snapshot if it's a string\n const parsedRuns = runs.map((run: any) => ({\n ...run,\n snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n runId: run.run_id,\n workflowName: run.workflow_name,\n resourceId: run.resourceId,\n }));\n\n return { runs: parsedRuns as WorkflowRun[], total };\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const runs = Array.from(this.db.workflows.values()).filter((r: any) => r.run_id === runId);\n let run = runs.find((r: any) => r.workflow_name === workflowName);\n\n if (!run) return null;\n\n // Return a deep copy to prevent mutation\n const parsedRun = {\n ...run,\n snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n runId: run.run_id,\n workflowName: run.workflow_name,\n resourceId: run.resourceId,\n };\n\n return parsedRun as WorkflowRun;\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const key = this.getWorkflowKey(workflowName, runId);\n this.db.workflows.delete(key);\n }\n}\n","import { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { InMemoryAgentsStorage } from './domains/agents/inmemory';\nimport { BackgroundTasksInMemory } from './domains/background-tasks/inmemory';\nimport { InMemoryBlobStore } from './domains/blobs/inmemory';\nimport { InMemoryChannelsStorage } from './domains/channels/inmemory';\nimport { DatasetsInMemory } from './domains/datasets/inmemory';\nimport { ExperimentsInMemory } from './domains/experiments/inmemory';\nimport { InMemoryDB } from './domains/inmemory-db';\nimport { InMemoryMCPClientsStorage } from './domains/mcp-clients/inmemory';\nimport { InMemoryMCPServersStorage } from './domains/mcp-servers/inmemory';\nimport { InMemoryMemory } from './domains/memory/inmemory';\nimport { ObservabilityInMemory } from './domains/observability/inmemory';\nimport { InMemoryPromptBlocksStorage } from './domains/prompt-blocks/inmemory';\nimport { InMemoryScorerDefinitionsStorage } from './domains/scorer-definitions/inmemory';\nimport { ScoresInMemory } from './domains/scores/inmemory';\nimport { InMemorySkillsStorage } from './domains/skills/inmemory';\nimport { WorkflowsInMemory } from './domains/workflows/inmemory';\nimport { InMemoryWorkspacesStorage } from './domains/workspaces/inmemory';\n/**\n * In-memory storage implementation for testing and development.\n *\n * All data is stored in memory and will be lost when the process ends.\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new InMemoryStore();\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class InMemoryStore extends MastraCompositeStore {\n stores: StorageDomains;\n\n /**\n * Internal database layer shared across all domains.\n * This is an implementation detail - domains interact with this\n * rather than managing their own data structures.\n */\n #db: InMemoryDB;\n\n constructor({ id = 'in-memory' }: { id?: string } = {}) {\n super({ id, name: 'InMemoryStorage' });\n // InMemoryStore doesn't need async initialization\n this.hasInitialized = Promise.resolve(true);\n\n // Create internal db layer - shared across all domains\n this.#db = new InMemoryDB();\n\n // Create all domain instances with the shared db\n this.stores = {\n memory: new InMemoryMemory({ db: this.#db }),\n workflows: new WorkflowsInMemory({ db: this.#db }),\n scores: new ScoresInMemory({ db: this.#db }),\n observability: new ObservabilityInMemory({ db: this.#db }),\n agents: new InMemoryAgentsStorage({ db: this.#db }),\n channels: new InMemoryChannelsStorage(),\n datasets: new DatasetsInMemory({ db: this.#db }),\n experiments: new ExperimentsInMemory({ db: this.#db }),\n promptBlocks: new InMemoryPromptBlocksStorage({ db: this.#db }),\n scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db }),\n mcpClients: new InMemoryMCPClientsStorage({ db: this.#db }),\n mcpServers: new InMemoryMCPServersStorage({ db: this.#db }),\n workspaces: new InMemoryWorkspacesStorage({ db: this.#db }),\n skills: new InMemorySkillsStorage({ db: this.#db }),\n blobs: new InMemoryBlobStore(),\n backgroundTasks: new BackgroundTasksInMemory({ db: this.#db }),\n };\n }\n\n /**\n * Clears all data from the in-memory database.\n * Useful for testing.\n * @deprecated Use dangerouslyClearAll() on individual domains instead.\n */\n clear(): void {\n this.#db.clear();\n // InMemoryChannelsStorage doesn't share the InMemoryDB\n void this.stores.channels?.dangerouslyClearAll?.();\n }\n}\n\nexport const MockStore = InMemoryStore;\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, readdirSync, statSync, rmSync } from 'node:fs';\nimport { join, dirname, relative, resolve, sep } from 'node:path';\n\n/**\n * FilesystemDB is a thin I/O layer for filesystem-based storage.\n * It manages reading/writing JSON files in a directory, similar to how\n * InMemoryDB holds Maps for in-memory storage.\n *\n * Each editor domain gets its own JSON file (e.g., `agents.json`, `prompt-blocks.json`).\n * Skills use a real file tree under `skills/` instead of JSON.\n */\nexport class FilesystemDB {\n readonly dir: string;\n\n /** In-memory cache of parsed domain data, keyed by filename */\n private cache = new Map<string, Record<string, unknown>>();\n\n private initialized = false;\n\n constructor(dir: string) {\n this.dir = dir;\n }\n\n /**\n * Initialize the storage directory. Called once; subsequent calls are no-ops.\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n this.ensureDir();\n this.initialized = true;\n }\n\n /**\n * Ensure the storage directory and skills subdirectory exist.\n */\n ensureDir(): void {\n if (!existsSync(this.dir)) {\n mkdirSync(this.dir, { recursive: true });\n }\n const skillsDir = join(this.dir, 'skills');\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n }\n\n // ==========================================================================\n // Domain-level JSON operations\n // ==========================================================================\n\n /**\n * Read a domain JSON file and return its entity map.\n * Uses in-memory cache; reads from disk on first access.\n */\n readDomain<T = Record<string, unknown>>(filename: string): Record<string, T> {\n if (this.cache.has(filename)) {\n return this.cache.get(filename) as Record<string, T>;\n }\n\n const filePath = join(this.dir, filename);\n let data: Record<string, T> = {};\n\n if (existsSync(filePath)) {\n try {\n const raw = readFileSync(filePath, 'utf-8');\n data = JSON.parse(raw, dateReviver) as Record<string, T>;\n } catch {\n // If the file is corrupted, start fresh\n data = {};\n }\n }\n\n this.cache.set(filename, data as Record<string, unknown>);\n return data;\n }\n\n /**\n * Write a domain's full entity map to its JSON file.\n * Uses atomic write (write to .tmp, then rename) to prevent corruption.\n */\n writeDomain<T = Record<string, unknown>>(filename: string, data: Record<string, T>): void {\n this.cache.set(filename, data as Record<string, unknown>);\n\n const filePath = join(this.dir, filename);\n const tmpPath = filePath + '.tmp';\n\n // Ensure parent directory exists\n const parentDir = dirname(filePath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\n renameSync(tmpPath, filePath);\n }\n\n /**\n * Clear all data from a domain JSON file.\n */\n clearDomain(filename: string): void {\n this.writeDomain(filename, {});\n }\n\n /**\n * Invalidate the in-memory cache for a domain, forcing a re-read from disk on next access.\n */\n invalidateCache(filename?: string): void {\n if (filename) {\n this.cache.delete(filename);\n } else {\n this.cache.clear();\n }\n }\n\n // ==========================================================================\n // Entity-level convenience methods (used by FilesystemVersionedHelpers)\n // ==========================================================================\n\n /**\n * Get a single entity by ID from a domain JSON file.\n */\n get<T>(filename: string, id: string): T | null {\n const data = this.readDomain<T>(filename);\n return data[id] ?? null;\n }\n\n /**\n * Get all entities from a domain JSON file as an array.\n */\n getAll<T>(filename: string): T[] {\n const data = this.readDomain<T>(filename);\n return Object.values(data);\n }\n\n /**\n * Set (create or update) an entity in a domain JSON file.\n */\n set<T>(filename: string, id: string, entity: T): void {\n const data = this.readDomain<T>(filename);\n data[id] = entity;\n this.writeDomain(filename, data);\n }\n\n /**\n * Remove an entity by ID from a domain JSON file. No-op if not found.\n */\n remove(filename: string, id: string): void {\n const data = this.readDomain(filename);\n if (id in data) {\n delete data[id];\n this.writeDomain(filename, data);\n }\n }\n\n // =========================================================================\n // Skills directory operations (real file tree, not JSON)\n // =========================================================================\n\n /**\n * Get the path to a skill's directory.\n */\n skillDir(skillName: string): string {\n const skillsBase = join(this.dir, 'skills');\n const dir = resolve(skillsBase, skillName);\n if (!dir.startsWith(skillsBase + sep) && dir !== skillsBase) {\n throw new Error(`Path traversal detected: skill name \"${skillName}\" escapes skills directory`);\n }\n return dir;\n }\n\n /**\n * Resolve a file path within a skill directory, throwing if it escapes.\n */\n private safeSkillPath(skillName: string, relativePath: string): string {\n const base = this.skillDir(skillName);\n const resolved = resolve(base, relativePath);\n if (!resolved.startsWith(base + sep) && resolved !== base) {\n throw new Error(`Path traversal detected: \"${relativePath}\" escapes skill directory`);\n }\n return resolved;\n }\n\n /**\n * List all files in a skill's directory, returning relative paths.\n */\n listSkillFiles(skillName: string): string[] {\n const dir = this.skillDir(skillName);\n if (!existsSync(dir)) return [];\n return walkDir(dir).map(abs => relative(dir, abs).split(sep).join('/'));\n }\n\n /**\n * Read a file from a skill's directory.\n */\n readSkillFile(skillName: string, relativePath: string): Buffer | null {\n const filePath = this.safeSkillPath(skillName, relativePath);\n if (!existsSync(filePath)) return null;\n try {\n return readFileSync(filePath);\n } catch {\n return null;\n }\n }\n\n /**\n * Write a file to a skill's directory.\n */\n writeSkillFile(skillName: string, relativePath: string, content: Buffer | string): void {\n const filePath = this.safeSkillPath(skillName, relativePath);\n const parentDir = dirname(filePath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n writeFileSync(filePath, content);\n }\n\n /**\n * Delete a skill's entire directory.\n */\n deleteSkillDir(skillName: string): void {\n const dir = this.skillDir(skillName);\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * JSON reviver that converts ISO date strings back to Date objects.\n */\nfunction dateReviver(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)) {\n const d = new Date(value);\n if (!isNaN(d.getTime())) return d;\n }\n return value;\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nfunction walkDir(dir: string): string[] {\n const results: string[] = [];\n for (const entry of readdirSync(dir)) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n results.push(...walkDir(fullPath));\n } else {\n results.push(fullPath);\n }\n }\n return results;\n}\n","import { resolve } from 'node:path';\n\nimport { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { FilesystemAgentsStorage } from './domains/agents/filesystem';\nimport { FilesystemMCPClientsStorage } from './domains/mcp-clients/filesystem';\nimport { FilesystemMCPServersStorage } from './domains/mcp-servers/filesystem';\nimport { FilesystemPromptBlocksStorage } from './domains/prompt-blocks/filesystem';\nimport { FilesystemScorerDefinitionsStorage } from './domains/scorer-definitions/filesystem';\nimport { FilesystemSkillsStorage } from './domains/skills/filesystem';\nimport { FilesystemWorkspacesStorage } from './domains/workspaces/filesystem';\nimport { FilesystemDB } from './filesystem-db';\n\nexport interface FilesystemStoreConfig {\n /**\n * Directory to store JSON files in.\n * Defaults to `.mastra-storage/` relative to `process.cwd()`.\n */\n dir?: string;\n}\n\n/**\n * Filesystem-based storage adapter for the Mastra Editor.\n *\n * Stores editor primitives (agents, prompt blocks, scorer definitions,\n * MCP clients, MCP servers, workspaces, skills) as JSON files on disk.\n * This enables Git-based version tracking instead of database-based versioning.\n *\n * Only implements the 7 editor domains — other domains (memory, workflows, scores,\n * observability, datasets, experiments, blobs) are left undefined and should be\n * provided by a separate store via the `editor` shorthand on `MastraCompositeStore`.\n *\n * @example\n * ```typescript\n * import { FilesystemStore, MastraCompositeStore } from '@mastra/core/storage';\n *\n * const storage = new MastraCompositeStore({\n * id: 'my-storage',\n * default: postgresStore,\n * editor: new FilesystemStore({ dir: '.mastra-storage' }),\n * });\n * ```\n */\nexport class FilesystemStore extends MastraCompositeStore {\n #db: FilesystemDB;\n #dir: string;\n\n constructor(config: FilesystemStoreConfig = {}) {\n const dir = resolve(config.dir ?? '.mastra-storage');\n\n super({ id: 'filesystem', name: 'FilesystemStore' });\n\n this.#dir = dir;\n this.#db = new FilesystemDB(dir);\n\n // Only editor domains are provided; other domains (workflows, scores, memory, etc.)\n // should come from a default store when using the `editor` shorthand on MastraCompositeStore.\n this.stores = {\n agents: new FilesystemAgentsStorage({ db: this.#db }),\n promptBlocks: new FilesystemPromptBlocksStorage({ db: this.#db }),\n scorerDefinitions: new FilesystemScorerDefinitionsStorage({ db: this.#db }),\n mcpClients: new FilesystemMCPClientsStorage({ db: this.#db }),\n mcpServers: new FilesystemMCPServersStorage({ db: this.#db }),\n workspaces: new FilesystemWorkspacesStorage({ db: this.#db }),\n skills: new FilesystemSkillsStorage({ db: this.#db }),\n } as unknown as StorageDomains;\n }\n\n /**\n * The absolute path to the storage directory.\n */\n get dir(): string {\n return this.#dir;\n }\n}\n","import { MastraBase } from '../../../base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { TABLE_NAMES } from '../../constants';\nimport type { StorageColumn, CreateIndexOptions, IndexInfo, StorageIndexStats } from '../../types';\n\nexport abstract class StoreOperations extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'OPERATIONS',\n });\n }\n\n abstract hasColumn(table: string, column: string): Promise<boolean>;\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'TEXT';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'float':\n return 'FLOAT';\n case 'integer':\n return 'INTEGER';\n case 'bigint':\n return 'BIGINT';\n case 'jsonb':\n return 'JSONB';\n default:\n return 'TEXT';\n }\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n default:\n return \"DEFAULT ''\";\n }\n }\n\n abstract createTable({ tableName }: { tableName: TABLE_NAMES; schema: Record<string, StorageColumn> }): Promise<void>;\n\n abstract clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n abstract dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n abstract alterTable(args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void>;\n\n abstract insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void>;\n\n abstract batchInsert({\n tableName,\n records,\n }: {\n tableName: TABLE_NAMES;\n records: Record<string, any>[];\n }): Promise<void>;\n\n abstract load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null>;\n\n /**\n * DATABASE INDEX MANAGEMENT\n * Optional methods for database index management.\n * Storage adapters can override these to provide index management capabilities.\n */\n\n /**\n * Creates a database index on specified columns\n * @throws {MastraError} if not supported by the storage adapter\n */\n async createIndex(_options: CreateIndexOptions): Promise<void> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_CREATE_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Drops a database index by name\n * @throws {MastraError} if not supported by the storage adapter\n */\n async dropIndex(_indexName: string): Promise<void> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_DROP_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Lists database indexes for a table or all tables\n * @throws {MastraError} if not supported by the storage adapter\n */\n async listIndexes(_tableName?: string): Promise<IndexInfo[]> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_LIST_INDEXES_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Gets detailed statistics for a specific index\n * @throws {MastraError} if not supported by the storage adapter\n */\n async describeIndex(_indexName: string): Promise<StorageIndexStats> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_DESCRIBE_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Returns definitions for automatic performance indexes\n * Storage adapters can override this to define indexes that should be created during initialization\n * @returns Array of index definitions to create automatically\n */\n protected getAutomaticIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n}\n","import { TABLE_WORKFLOW_SNAPSHOT } from '../../constants';\nimport type { TABLE_NAMES, TABLE_OBSERVATIONAL_MEMORY } from '../../constants';\nimport type { StorageColumn } from '../../types';\nimport { StoreOperations } from './base';\n\n// InMemory storage supports all tables including observational memory\ntype InMemoryTableNames = TABLE_NAMES | typeof TABLE_OBSERVATIONAL_MEMORY;\n\nexport class StoreOperationsInMemory extends StoreOperations {\n data: Record<InMemoryTableNames, Map<string, Record<string, any>>>;\n\n constructor() {\n super();\n this.data = {\n mastra_workflow_snapshot: new Map(),\n mastra_messages: new Map(),\n mastra_threads: new Map(),\n mastra_traces: new Map(),\n mastra_resources: new Map(),\n mastra_scorers: new Map(),\n mastra_ai_spans: new Map(),\n mastra_agents: new Map(),\n mastra_agent_versions: new Map(),\n mastra_observational_memory: new Map(),\n mastra_prompt_blocks: new Map(),\n mastra_prompt_block_versions: new Map(),\n mastra_scorer_definitions: new Map(),\n mastra_scorer_definition_versions: new Map(),\n mastra_mcp_clients: new Map(),\n mastra_mcp_client_versions: new Map(),\n mastra_mcp_servers: new Map(),\n mastra_mcp_server_versions: new Map(),\n mastra_workspaces: new Map(),\n mastra_workspace_versions: new Map(),\n mastra_skills: new Map(),\n mastra_skill_versions: new Map(),\n mastra_skill_blobs: new Map(),\n mastra_datasets: new Map(),\n mastra_dataset_items: new Map(),\n mastra_dataset_versions: new Map(),\n mastra_experiments: new Map(),\n mastra_experiment_results: new Map(),\n mastra_background_tasks: new Map(),\n mastra_channel_installations: new Map(),\n mastra_channel_config: new Map(),\n };\n }\n\n getDatabase() {\n return this.data;\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const table = this.data[tableName];\n let key = record.id;\n if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n key = record.workflow_name ? `${record.workflow_name}-${record.run_id}` : record.run_id;\n record.id = key;\n } else if (!record.id) {\n key = `auto-${Date.now()}-${Math.random()}`;\n record.id = key;\n }\n table.set(key, record);\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const table = this.data[tableName];\n for (const record of records) {\n let key = record.id;\n if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n key = record.run_id;\n record.id = key;\n } else if (!record.id) {\n key = `auto-${Date.now()}-${Math.random()}`;\n record.id = key;\n }\n table.set(key, record);\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const table = this.data[tableName];\n\n const records = Array.from(table.values());\n\n return records.filter(record => Object.keys(keys).every(key => record[key] === keys[key]))?.[0] as R | null;\n }\n\n async createTable({\n tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n this.data[tableName] = new Map();\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n this.data[tableName].clear();\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n this.data[tableName].clear();\n }\n\n async alterTable({\n tableName: _tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {}\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n return true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/domains/observability/base.ts","../src/storage/utils.ts","../src/storage/domains/observability/inmemory.ts","../src/storage/domains/observability/record-builders.ts","../src/storage/domains/background-tasks/base.ts","../src/storage/domains/background-tasks/inmemory.ts","../src/storage/domains/blobs/base.ts","../src/storage/domains/blobs/inmemory.ts","../src/storage/domains/channels/base.ts","../src/storage/domains/channels/inmemory.ts","../src/datasets/validation/errors.ts","../src/datasets/validation/validator.ts","../src/storage/domains/datasets/base.ts","../src/storage/domains/datasets/inmemory.ts","../src/storage/domains/experiments/base.ts","../src/storage/domains/experiments/inmemory.ts","../src/storage/domains/inmemory-db.ts","../src/storage/domains/memory/base.ts","../src/storage/domains/memory/inmemory.ts","../src/storage/domains/scores/base.ts","../src/storage/domains/scores/inmemory.ts","../src/workflows/evented/types.ts","../src/storage/domains/workflows/base.ts","../src/storage/domains/workflows/inmemory.ts","../src/storage/mock.ts","../src/storage/filesystem-db.ts","../src/storage/filesystem.ts","../src/storage/domains/operations/base.ts","../src/storage/domains/operations/inmemory.ts"],"names":["StorageDomain","MastraError","TABLE_SCHEMAS","TABLE_SCORERS","listTracesArgsSchema","toTraceSpans","listMetricsArgsSchema","bucketMap","costSummary","EntityType","listLogsArgsSchema","listScoresArgsSchema","listFeedbackArgsSchema","MastraBase","z","jsonSchemaToZod","normalizePerPage","calculatePagination","MessageList","id","MastraCompositeStore","InMemoryAgentsStorage","InMemoryPromptBlocksStorage","InMemoryScorerDefinitionsStorage","InMemoryMCPClientsStorage","InMemoryMCPServersStorage","InMemoryWorkspacesStorage","InMemorySkillsStorage","existsSync","mkdirSync","join","readFileSync","dirname","writeFileSync","renameSync","resolve","sep","relative","rmSync","readdirSync","statSync","FilesystemAgentsStorage","FilesystemPromptBlocksStorage","FilesystemScorerDefinitionsStorage","FilesystemMCPClientsStorage","FilesystemMCPServersStorage","FilesystemWorkspacesStorage","FilesystemSkillsStorage","TABLE_WORKFLOW_SNAPSHOT"],"mappings":"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","file":"chunk-TUZTUFQO.cjs","sourcesContent":["import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { StorageDomain } from '../base';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n} from './discovery';\nimport type {\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n ListFeedbackArgs,\n ListFeedbackResponse,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n} from './feedback';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse } from './logs';\nimport type {\n BatchCreateMetricsArgs,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n} from './metrics';\nimport type {\n BatchCreateScoresArgs,\n CreateScoreArgs,\n ListScoresArgs,\n ListScoresResponse,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n} from './scores';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateSpanArgs,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n ListTracesArgs,\n ListTracesResponse,\n UpdateSpanArgs,\n} from './tracing';\nimport type { ObservabilityStorageStrategy, TracingStorageStrategy } from './types';\n\n/**\n * Base storage class for observability data (traces, metrics, logs, scores, feedback).\n * Not abstract -- provides default implementations that throw \"not implemented\" errors.\n * Storage adapters override only the methods they support.\n */\nexport class ObservabilityStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'OBSERVABILITY',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n /**\n * Provides hints for tracing strategy selection by the DefaultExporter.\n * Storage adapters can override this to specify their preferred and supported strategies.\n */\n public get observabilityStrategy(): {\n preferred: ObservabilityStorageStrategy;\n supported: ObservabilityStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates', // Default for most SQL stores\n supported: ['realtime', 'batch-with-updates', 'insert-only'],\n };\n }\n\n /**\n * Provides hints for tracing strategy selection by the DefaultExporter.\n * Storage adapters can override this to specify their preferred and supported strategies.\n * @deprecated Use {@link observabilityStrategy} instead.\n * @see {@link observabilityStrategy} for the replacement property.\n */\n public get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return this.observabilityStrategy;\n }\n\n /**\n * Reports the tracing strategy currently in effect for this attached observability store.\n *\n * Single-strategy stores can rely on the default implementation. Multi-strategy stores\n * should override this getter only when they can determine the actual configured mode\n * from storage-owned configuration, not exporter state.\n */\n public get runtimeTracingStrategy(): TracingStorageStrategy | undefined {\n const supportedStrategies = this.observabilityStrategy.supported;\n return supportedStrategies.length === 1 ? supportedStrategies[0] : undefined;\n }\n\n /**\n * Creates a single Span record in the storage provider.\n */\n async createSpan(_args: CreateSpanArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_CREATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating spans',\n });\n }\n\n /**\n * Updates a single Span with partial data. Primarily used for realtime trace creation.\n *\n * @deprecated This method only works with stores that support span updates,\n * It will be removed in the future. Instead try to add all data to a span before\n * ending it.\n */\n async updateSpan(_args: UpdateSpanArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_UPDATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support updating spans',\n });\n }\n\n /**\n * Retrieves a single span.\n */\n async getSpan(_args: GetSpanArgs): Promise<GetSpanResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting spans',\n });\n }\n\n /**\n * Retrieves a single root span.\n */\n async getRootSpan(_args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ROOT_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting root spans',\n });\n }\n\n /**\n * Retrieves a single trace with all its associated spans.\n */\n async getTrace(_args: GetTraceArgs): Promise<GetTraceResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TRACE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting traces',\n });\n }\n\n /**\n * Retrieves a lightweight trace with only the fields needed for timeline rendering.\n * Excludes heavy fields: input, output, attributes, metadata, tags, links.\n */\n async getTraceLight(_args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TRACE_LIGHT_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting lightweight traces',\n });\n }\n\n /**\n * Retrieves a list of traces with optional filtering.\n */\n async listTraces(_args: ListTracesArgs): Promise<ListTracesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_TRACES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing traces',\n });\n }\n\n /**\n * Creates multiple Spans in a single batch.\n */\n async batchCreateSpans(_args: BatchCreateSpansArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating spans',\n });\n }\n\n /**\n * Updates multiple Spans in a single batch.\n */\n async batchUpdateSpans(_args: BatchUpdateSpansArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_UPDATE_SPANS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch updating spans',\n });\n }\n\n /**\n * Deletes multiple traces and all their associated spans in a single batch operation.\n */\n async batchDeleteTraces(_args: BatchDeleteTracesArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_DELETE_TRACES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch deleting traces',\n });\n }\n\n // ============================================================================\n // Logs\n // ============================================================================\n\n /**\n * Creates multiple log records in a single batch.\n */\n async batchCreateLogs(_args: BatchCreateLogsArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_LOGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating logs',\n });\n }\n\n /**\n * Retrieves a list of logs with optional filtering.\n */\n async listLogs(_args: ListLogsArgs): Promise<ListLogsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_LOGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing logs',\n });\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n /**\n * Creates multiple metric observations in a single batch.\n */\n async batchCreateMetrics(_args: BatchCreateMetricsArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_METRICS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating metrics',\n });\n }\n\n async listMetrics(_args: ListMetricsArgs): Promise<ListMetricsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_METRICS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing metrics',\n });\n }\n\n async getMetricAggregate(_args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric aggregation',\n });\n }\n\n async getMetricBreakdown(_args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric breakdown',\n });\n }\n\n async getMetricTimeSeries(_args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric time series',\n });\n }\n\n async getMetricPercentiles(_args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric percentiles',\n });\n }\n\n // ============================================================================\n // Discovery / Metadata Methods\n // ============================================================================\n\n async getMetricNames(_args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric name discovery',\n });\n }\n\n async getMetricLabelKeys(_args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_METRIC_LABEL_KEYS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support metric label key discovery',\n });\n }\n\n async getMetricLabelValues(_args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_LABEL_VALUES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support label value discovery',\n });\n }\n\n async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENTITY_TYPES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support entity type discovery',\n });\n }\n\n async getEntityNames(_args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENTITY_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support entity name discovery',\n });\n }\n\n async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SERVICE_NAMES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support service name discovery',\n });\n }\n\n async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_ENVIRONMENTS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support environment discovery',\n });\n }\n\n async getTags(_args: GetTagsArgs): Promise<GetTagsResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_TAGS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support tag discovery',\n });\n }\n\n // ============================================================================\n // Scores\n // ============================================================================\n\n /**\n * Creates a single score record.\n */\n async createScore(_args: CreateScoreArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_CREATE_SCORE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating scores',\n });\n }\n\n /**\n * Creates multiple score observations in a single batch.\n */\n async batchCreateScores(_args: BatchCreateScoresArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_SCORES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating scores',\n });\n }\n\n /**\n * Retrieves a list of scores with optional filtering.\n */\n async listScores(_args: ListScoresArgs): Promise<ListScoresResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_SCORES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing scores',\n });\n }\n\n async getScoreAggregate(_args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score aggregation',\n });\n }\n\n async getScoreBreakdown(_args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score breakdown',\n });\n }\n\n async getScoreTimeSeries(_args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score time series',\n });\n }\n\n async getScorePercentiles(_args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support score percentiles',\n });\n }\n\n // ============================================================================\n // Feedback\n // ============================================================================\n\n /**\n * Creates a single feedback record.\n */\n async createFeedback(_args: CreateFeedbackArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support creating feedback',\n });\n }\n\n /**\n * Creates multiple feedback observations in a single batch.\n */\n async batchCreateFeedback(_args: BatchCreateFeedbackArgs): Promise<void> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_BATCH_CREATE_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch creating feedback',\n });\n }\n\n /**\n * Retrieves a list of feedback with optional filtering.\n */\n async listFeedback(_args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_FEEDBACK_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing feedback',\n });\n }\n\n async getFeedbackAggregate(_args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_AGGREGATE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback aggregation',\n });\n }\n\n async getFeedbackBreakdown(_args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_BREAKDOWN_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback breakdown',\n });\n }\n\n async getFeedbackTimeSeries(_args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_TIME_SERIES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback time series',\n });\n }\n\n async getFeedbackPercentiles(_args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_FEEDBACK_PERCENTILES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support feedback percentiles',\n });\n }\n}\n","import type { ScoreRowData } from '../evals/types';\nimport { TABLE_SCHEMAS, TABLE_SCORERS } from './constants';\nimport type { TABLE_NAMES } from './constants';\nimport type { StorageColumn } from './types';\n\n/**\n * Canonical store names for type safety.\n * Provides autocomplete suggestions while still accepting any string.\n */\nexport type StoreName =\n | 'PG'\n | 'MSSQL'\n | 'LIBSQL'\n | 'MONGODB'\n | 'CLICKHOUSE'\n | 'CLOUDFLARE'\n | 'CLOUDFLARE_D1'\n | 'DYNAMODB'\n | 'LANCE'\n | 'UPSTASH'\n | 'ASTRA'\n | 'CHROMA'\n | 'COUCHBASE'\n | 'OPENSEARCH'\n | 'PINECONE'\n | 'QDRANT'\n | 'S3'\n | 'TURBOPUFFER'\n | 'VECTORIZE'\n | (string & {});\n\nexport function safelyParseJSON(input: any): any {\n // If already an object (and not null), return as-is\n if (input && typeof input === 'object') return input;\n if (input == null) return {};\n // If it's a string, try to parse\n if (typeof input === 'string') {\n try {\n return JSON.parse(input);\n } catch {\n return input;\n }\n }\n // For anything else (number, boolean, etc.), return empty object\n return {};\n}\n\n/**\n * Options for transforming storage rows\n */\nexport interface TransformRowOptions {\n /**\n * Preferred source fields for timestamps (e.g., { createdAt: 'createdAtZ' } means use createdAtZ if available, else createdAt)\n */\n preferredTimestampFields?: Record<string, string>;\n\n /**\n * Convert timestamp strings to Date objects (default: false for backwards compatibility)\n */\n convertTimestamps?: boolean;\n\n /**\n * Pattern to treat as null (e.g., '_null_' for ClickHouse)\n */\n nullValuePattern?: string;\n\n /**\n * Custom field mappings from source to target (e.g., { entity: 'entityData' } for DynamoDB)\n */\n fieldMappings?: Record<string, string>;\n}\n\n/**\n * Generic schema-driven row transformer.\n * Uses TABLE_SCHEMAS to determine field types and apply appropriate transformations:\n * - 'jsonb' fields: parsed from JSON strings using safelyParseJSON\n * - 'timestamp' fields: optionally converted to Date objects\n *\n * @param row - The raw row from storage\n * @param tableName - The table name to look up schema from TABLE_SCHEMAS\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed row with proper types\n */\nexport function transformRow<T = Record<string, any>>(\n row: Record<string, any>,\n tableName: TABLE_NAMES,\n options: TransformRowOptions = {},\n): T {\n const { preferredTimestampFields = {}, convertTimestamps = false, nullValuePattern, fieldMappings = {} } = options;\n\n const tableSchema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n for (const [key, columnSchema] of Object.entries(tableSchema)) {\n // Handle field mappings (e.g., entityData -> entity for DynamoDB)\n const sourceKey = fieldMappings[key] ?? key;\n let value = row[sourceKey];\n\n // Handle preferred timestamp sources (e.g., use createdAtZ if available, else createdAt)\n if (preferredTimestampFields[key]) {\n value = row[preferredTimestampFields[key]] ?? value;\n }\n\n // Skip null/undefined values\n if (value === undefined || value === null) {\n continue;\n }\n\n // Skip null pattern values (e.g., ClickHouse's '_null_')\n if (nullValuePattern && value === nullValuePattern) {\n continue;\n }\n\n // Transform based on column type\n if (columnSchema.type === 'jsonb') {\n if (typeof value === 'string') {\n result[key] = safelyParseJSON(value);\n } else if (typeof value === 'object') {\n result[key] = value; // Already parsed\n } else {\n result[key] = value;\n }\n } else if (columnSchema.type === 'timestamp' && convertTimestamps && typeof value === 'string') {\n result[key] = new Date(value);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Transform a raw score row from storage to ScoreRowData.\n * Convenience wrapper around transformRow for the scores table (TABLE_SCORERS).\n *\n * @param row - The raw row from storage\n * @param options - Optional configuration for store-specific behavior\n * @returns Transformed ScoreRowData\n */\nexport function transformScoreRow(row: Record<string, any>, options: TransformRowOptions = {}): ScoreRowData {\n return transformRow<ScoreRowData>(row, TABLE_SCORERS, options);\n}\n\n/**\n * Converts a string to UPPER_SNAKE_CASE, preserving word boundaries from camelCase, PascalCase, kebab-case, etc.\n */\nfunction toUpperSnakeCase(str: string): string {\n return (\n str\n // Insert underscore before uppercase letters that follow lowercase letters (camelCase -> camel_Case)\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n // Insert underscore before uppercase letters that are followed by lowercase letters (XMLParser -> XML_Parser)\n .replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')\n // Convert to uppercase\n .toUpperCase()\n // Replace any non-alphanumeric characters with underscore\n .replace(/[^A-Z0-9]+/g, '_')\n // Remove leading/trailing underscores\n .replace(/^_+|_+$/g, '')\n );\n}\n\n/**\n * Generates a standardized error ID for storage and vector operations.\n *\n * Formats:\n * - Storage: MASTRA_STORAGE_{STORE}_{OPERATION}_{STATUS}\n * - Vector: MASTRA_VECTOR_{STORE}_{OPERATION}_{STATUS}\n *\n * This function auto-normalizes inputs to UPPER_SNAKE_CASE for flexibility.\n * The store parameter is type-checked against canonical store names for IDE autocomplete.\n *\n * @param type - The operation type ('storage' or 'vector')\n * @param store - The store adapter name (type-checked canonical names)\n * @param operation - The operation that failed (e.g., 'LIST_THREADS_BY_RESOURCE_ID', 'QUERY')\n * @param status - The status/error type (e.g., 'FAILED', 'INVALID_THREAD_ID', 'DUPLICATE_KEY')\n *\n * @example\n * ```ts\n * // Storage operations\n * createStoreErrorId('storage', 'PG', 'LIST_THREADS', 'FAILED')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_THREADS_FAILED'\n *\n * // Vector operations\n * createStoreErrorId('vector', 'CHROMA', 'QUERY', 'FAILED')\n * // Returns: 'MASTRA_VECTOR_CHROMA_QUERY_FAILED'\n *\n * // Auto-normalizes any casing\n * createStoreErrorId('storage', 'PG', 'listMessagesById', 'failed')\n * // Returns: 'MASTRA_STORAGE_PG_LIST_MESSAGES_BY_ID_FAILED'\n * ```\n */\nexport function createStoreErrorId(\n type: 'storage' | 'vector',\n store: StoreName,\n operation: string,\n status: string,\n): Uppercase<string> {\n const normalizedStore = toUpperSnakeCase(store);\n const normalizedOperation = toUpperSnakeCase(operation);\n const normalizedStatus = toUpperSnakeCase(status);\n const typePrefix = type === 'storage' ? 'STORAGE' : 'VECTOR';\n\n return `MASTRA_${typePrefix}_${normalizedStore}_${normalizedOperation}_${normalizedStatus}` as Uppercase<string>;\n}\n\nexport function createStorageErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n return createStoreErrorId('storage', store, operation, status);\n}\n\nexport function createVectorErrorId(store: StoreName, operation: string, status: string): Uppercase<string> {\n return createStoreErrorId('vector', store, operation, status);\n}\n\nexport function getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'TEXT';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'float':\n return 'FLOAT';\n case 'integer':\n return 'INTEGER';\n case 'bigint':\n return 'BIGINT';\n case 'jsonb':\n return 'JSONB';\n case 'boolean':\n return 'BOOLEAN';\n default:\n return 'TEXT';\n }\n}\n\nexport function getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n case 'boolean':\n return 'DEFAULT FALSE';\n default:\n return \"DEFAULT ''\";\n }\n}\n\nexport function ensureDate(date: Date | string | undefined): Date | undefined {\n if (!date) return undefined;\n return date instanceof Date ? date : new Date(date);\n}\n\nexport function serializeDate(date: Date | string | undefined): string | undefined {\n if (!date) return undefined;\n const dateObj = ensureDate(date);\n return dateObj?.toISOString();\n}\n\n/**\n * Date range filter configuration for in-memory filtering operations.\n */\nexport interface DateRangeFilter {\n start?: Date | string;\n end?: Date | string;\n startExclusive?: boolean;\n endExclusive?: boolean;\n}\n\n/**\n * Filter an array of items by date range. Used by in-memory storage adapters.\n *\n * This provides a consistent implementation of date range filtering with\n * support for inclusive/exclusive bounds across all storage adapters.\n *\n * @param items - Array of items to filter\n * @param getCreatedAt - Function to extract the createdAt date from an item\n * @param dateRange - Optional date range filter configuration\n * @returns Filtered array of items\n *\n * @example\n * ```ts\n * const filtered = filterByDateRange(\n * messages,\n * (msg) => new Date(msg.createdAt),\n * { start: new Date('2024-01-01'), startExclusive: true }\n * );\n * ```\n */\nexport function filterByDateRange<T>(items: T[], getCreatedAt: (item: T) => Date, dateRange?: DateRangeFilter): T[] {\n if (!dateRange) return items;\n\n let result = items;\n\n if (dateRange.start) {\n const startTime = ensureDate(dateRange.start)!.getTime();\n result = result.filter(item => {\n const itemTime = getCreatedAt(item).getTime();\n return dateRange.startExclusive ? itemTime > startTime : itemTime >= startTime;\n });\n }\n\n if (dateRange.end) {\n const endTime = ensureDate(dateRange.end)!.getTime();\n result = result.filter(item => {\n const itemTime = getCreatedAt(item).getTime();\n return dateRange.endExclusive ? itemTime < endTime : itemTime <= endTime;\n });\n }\n\n return result;\n}\n\n/**\n * Deep equality check for JSON values.\n * Compares primitives, arrays, objects, and Date instances recursively.\n *\n * @param a - First value to compare\n * @param b - Second value to compare\n * @returns true if values are deeply equal, false otherwise\n */\nexport function jsonValueEquals(a: unknown, b: unknown): boolean {\n if (a === undefined || b === undefined) {\n return a === b;\n }\n if (a === null || b === null) {\n return a === b;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n // Handle Date objects\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (a instanceof Date || b instanceof Date) {\n return false; // One is Date, other is not\n }\n if (typeof a === 'object') {\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => jsonValueEquals(val, b[i]));\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(key =>\n jsonValueEquals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n }\n return a === b;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { EntityType } from '../../../observability';\nimport { jsonValueEquals } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ObservabilityStorage } from './base';\nimport type {\n GetEntityTypesArgs,\n GetEntityTypesResponse,\n GetEntityNamesArgs,\n GetEntityNamesResponse,\n GetServiceNamesArgs,\n GetServiceNamesResponse,\n GetEnvironmentsArgs,\n GetEnvironmentsResponse,\n GetTagsArgs,\n GetTagsResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n} from './discovery';\nimport { listFeedbackArgsSchema } from './feedback';\nimport type {\n BatchCreateFeedbackArgs,\n CreateFeedbackArgs,\n FeedbackFilter,\n GetFeedbackAggregateArgs,\n GetFeedbackAggregateResponse,\n GetFeedbackBreakdownArgs,\n GetFeedbackBreakdownResponse,\n GetFeedbackPercentilesArgs,\n GetFeedbackPercentilesResponse,\n GetFeedbackTimeSeriesArgs,\n GetFeedbackTimeSeriesResponse,\n ListFeedbackArgs,\n ListFeedbackResponse,\n FeedbackRecord,\n} from './feedback';\nimport { listLogsArgsSchema } from './logs';\nimport type { BatchCreateLogsArgs, ListLogsArgs, ListLogsResponse, LogRecord } from './logs';\nimport type {\n BatchCreateMetricsArgs,\n MetricRecord,\n ListMetricsArgs,\n ListMetricsResponse,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n AggregationType,\n} from './metrics';\nimport { listMetricsArgsSchema } from './metrics';\nimport { listScoresArgsSchema } from './scores';\nimport type {\n BatchCreateScoresArgs,\n CreateScoreArgs,\n GetScoreAggregateArgs,\n GetScoreAggregateResponse,\n GetScoreBreakdownArgs,\n GetScoreBreakdownResponse,\n GetScorePercentilesArgs,\n GetScorePercentilesResponse,\n GetScoreTimeSeriesArgs,\n GetScoreTimeSeriesResponse,\n ListScoresArgs,\n ListScoresResponse,\n ScoreRecord,\n} from './scores';\nimport type {\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateSpanArgs,\n CreateSpanRecord,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n SpanRecord,\n UpdateSpanArgs,\n} from './tracing';\n\nimport { listTracesArgsSchema, TraceStatus, toTraceSpans } from './tracing';\n\n/**\n * Internal structure for storing a trace with computed properties for efficient filtering\n */\nexport interface TraceEntry {\n /** All spans in this trace, keyed by spanId */\n spans: Record<string, SpanRecord>;\n /** Root span for this trace (parentSpanId === null) */\n rootSpan: SpanRecord | null;\n /** Computed trace status based on root span state */\n status: TraceStatus;\n /** True if any span in the trace has an error */\n hasChildError: boolean;\n}\n\n/** In-memory implementation of ObservabilityStorage for testing and development. */\nexport class ObservabilityInMemory extends ObservabilityStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.traces.clear();\n this.db.metricRecords.length = 0;\n this.db.logRecords.length = 0;\n this.db.scoreRecords.length = 0;\n this.db.feedbackRecords.length = 0;\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n this.validateCreateSpan(span);\n const now = new Date();\n const record: SpanRecord = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n\n this.upsertSpanToTrace(record);\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n const now = new Date();\n for (const span of args.records) {\n this.validateCreateSpan(span);\n const record: SpanRecord = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n this.upsertSpanToTrace(record);\n }\n }\n\n private validateCreateSpan(record: CreateSpanRecord): void {\n if (!record.spanId) {\n throw new MastraError({\n id: 'OBSERVABILITY_SPAN_ID_REQUIRED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Span ID is required for creating a span',\n });\n }\n\n if (!record.traceId) {\n throw new MastraError({\n id: 'OBSERVABILITY_TRACE_ID_REQUIRED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Trace ID is required for creating a span',\n });\n }\n }\n\n /**\n * Inserts or updates a span in the trace and recomputes trace-level properties\n */\n private upsertSpanToTrace(span: SpanRecord): void {\n const { traceId, spanId } = span;\n let traceEntry = this.db.traces.get(traceId);\n\n if (!traceEntry) {\n traceEntry = {\n spans: {},\n rootSpan: null,\n status: TraceStatus.RUNNING,\n hasChildError: false,\n };\n this.db.traces.set(traceId, traceEntry);\n }\n\n traceEntry.spans[spanId] = span;\n\n // Update root span if this is a root span\n if (span.parentSpanId == null) {\n traceEntry.rootSpan = span;\n }\n\n this.recomputeTraceProperties(traceEntry);\n }\n\n /**\n * Recomputes derived trace properties from all spans\n */\n private recomputeTraceProperties(traceEntry: TraceEntry): void {\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) return;\n\n // Compute hasChildError (use != null to catch both null and undefined)\n traceEntry.hasChildError = spans.some(s => s.error != null);\n\n // Compute status from root span\n const rootSpan = traceEntry.rootSpan;\n if (rootSpan) {\n if (rootSpan.error != null) {\n traceEntry.status = TraceStatus.ERROR;\n } else if (rootSpan.endedAt == null) {\n traceEntry.status = TraceStatus.RUNNING;\n } else {\n traceEntry.status = TraceStatus.SUCCESS;\n }\n } else {\n // No root span yet, consider it running\n traceEntry.status = TraceStatus.RUNNING;\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const span = traceEntry.spans[spanId];\n if (!span) {\n return null;\n }\n\n return { span };\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry || !traceEntry.rootSpan) {\n return null;\n }\n\n return { span: traceEntry.rootSpan };\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) {\n return null;\n }\n\n // Sort spans by startedAt\n spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n return {\n traceId,\n spans,\n };\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return null;\n }\n\n const spans = Object.values(traceEntry.spans);\n if (spans.length === 0) {\n return null;\n }\n\n // Sort spans by startedAt\n spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n return {\n traceId,\n spans: spans.map(\n (span): LightSpanRecord => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n spanType: span.spanType,\n isEvent: span.isEvent,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n error: span.error,\n entityType: span.entityType,\n entityId: span.entityId,\n entityName: span.entityName,\n createdAt: span.createdAt,\n updatedAt: span.updatedAt,\n }),\n ),\n };\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n\n // Collect all traces that match filters\n const matchingRootSpans: SpanRecord[] = [];\n\n for (const [, traceEntry] of this.db.traces) {\n if (!traceEntry.rootSpan) continue;\n\n if (this.traceMatchesFilters(traceEntry, filters)) {\n matchingRootSpans.push(traceEntry.rootSpan);\n }\n }\n\n // Sort by orderBy field\n const { field: sortField, direction: sortDirection } = orderBy;\n\n matchingRootSpans.sort((a, b) => {\n if (sortField === 'endedAt') {\n const aVal = a.endedAt;\n const bVal = b.endedAt;\n\n // Handle nullish values (running spans with null endedAt)\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return sortDirection === 'DESC' ? -1 : 1;\n if (bVal == null) return sortDirection === 'DESC' ? 1 : -1;\n\n const diff = aVal.getTime() - bVal.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n } else {\n // startedAt is never null (required field)\n const diff = a.startedAt.getTime() - b.startedAt.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n }\n });\n\n // Apply pagination\n const total = matchingRootSpans.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n\n const paged = matchingRootSpans.slice(start, end);\n\n return {\n spans: toTraceSpans(paged),\n pagination: { total, page, perPage, hasMore: end < total },\n };\n }\n\n /**\n * Check if a trace matches all provided filters\n */\n private traceMatchesFilters(traceEntry: TraceEntry, filters: ListTracesArgs['filters']): boolean {\n if (!filters) return true;\n\n const rootSpan = traceEntry.rootSpan;\n if (!rootSpan) return false;\n\n // Date range filters on startedAt (based on root span)\n if (filters.startedAt) {\n if (filters.startedAt.start && rootSpan.startedAt < filters.startedAt.start) {\n return false;\n }\n if (filters.startedAt.end && rootSpan.startedAt > filters.startedAt.end) {\n return false;\n }\n }\n\n // Date range filters on endedAt (based on root span)\n if (filters.endedAt) {\n // If root span is still running (endedAt is nullish), it doesn't match endedAt filters\n if (rootSpan.endedAt == null) {\n return false;\n }\n if (filters.endedAt.start && rootSpan.endedAt < filters.endedAt.start) {\n return false;\n }\n if (filters.endedAt.end && rootSpan.endedAt > filters.endedAt.end) {\n return false;\n }\n }\n\n // Span type filter (on root span)\n if (filters.spanType !== undefined && rootSpan.spanType !== filters.spanType) {\n return false;\n }\n\n // Entity filters\n if (filters.entityType !== undefined && rootSpan.entityType !== filters.entityType) {\n return false;\n }\n if (filters.entityId !== undefined && rootSpan.entityId !== filters.entityId) {\n return false;\n }\n if (filters.entityName !== undefined && rootSpan.entityName !== filters.entityName) {\n return false;\n }\n if (filters.entityVersionId !== undefined && rootSpan.entityVersionId !== filters.entityVersionId) {\n return false;\n }\n\n // Experimentation\n if (filters.experimentId !== undefined && rootSpan.experimentId !== filters.experimentId) {\n return false;\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined && rootSpan.userId !== filters.userId) {\n return false;\n }\n if (filters.organizationId !== undefined && rootSpan.organizationId !== filters.organizationId) {\n return false;\n }\n if (filters.resourceId !== undefined && rootSpan.resourceId !== filters.resourceId) {\n return false;\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined && rootSpan.runId !== filters.runId) {\n return false;\n }\n if (filters.sessionId !== undefined && rootSpan.sessionId !== filters.sessionId) {\n return false;\n }\n if (filters.threadId !== undefined && rootSpan.threadId !== filters.threadId) {\n return false;\n }\n if (filters.requestId !== undefined && rootSpan.requestId !== filters.requestId) {\n return false;\n }\n\n // Deployment context filters\n if (filters.environment !== undefined && rootSpan.environment !== filters.environment) {\n return false;\n }\n if (filters.source !== undefined && rootSpan.source !== filters.source) {\n return false;\n }\n if (filters.serviceName !== undefined && rootSpan.serviceName !== filters.serviceName) {\n return false;\n }\n\n // Scope filter (partial match - all provided keys must match)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.scope != null && rootSpan.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n if (!jsonValueEquals(rootSpan.scope[key], value)) {\n return false;\n }\n }\n } else if (filters.scope != null && rootSpan.scope == null) {\n return false;\n }\n\n // Metadata filter (partial match - all provided keys must match)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.metadata != null && rootSpan.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n if (!jsonValueEquals(rootSpan.metadata[key], value)) {\n return false;\n }\n }\n } else if (filters.metadata != null && rootSpan.metadata == null) {\n return false;\n }\n\n // Tags filter (all provided tags must be present)\n // Use != null to handle both null and undefined (nullish filter fields)\n if (filters.tags != null && filters.tags.length > 0) {\n if (rootSpan.tags == null) {\n return false;\n }\n for (const tag of filters.tags) {\n if (!rootSpan.tags.includes(tag)) {\n return false;\n }\n }\n }\n\n // Derived status filter\n if (filters.status !== undefined && traceEntry.status !== filters.status) {\n return false;\n }\n\n // Has child error filter\n if (filters.hasChildError !== undefined && traceEntry.hasChildError !== filters.hasChildError) {\n return false;\n }\n\n return true;\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n const traceEntry = this.db.traces.get(traceId);\n\n if (!traceEntry) {\n throw new MastraError({\n id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Trace not found for span update',\n });\n }\n\n const span = traceEntry.spans[spanId];\n if (!span) {\n throw new MastraError({\n id: 'OBSERVABILITY_UPDATE_SPAN_NOT_FOUND',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'Span not found for update',\n });\n }\n\n const updatedSpan: SpanRecord = {\n ...span,\n ...updates,\n updatedAt: new Date(),\n };\n\n traceEntry.spans[spanId] = updatedSpan;\n\n // Update root span reference if this is the root span\n if (updatedSpan.parentSpanId == null) {\n traceEntry.rootSpan = updatedSpan;\n }\n\n this.recomputeTraceProperties(traceEntry);\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n for (const record of args.records) {\n await this.updateSpan(record);\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n for (const traceId of args.traceIds) {\n this.db.traces.delete(traceId);\n }\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n for (const metric of args.metrics) {\n this.db.metricRecords.push(metric as MetricRecord);\n }\n }\n\n async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n const { filters, pagination, orderBy } = listMetricsArgsSchema.parse(args);\n\n let matching = this.filterMetrics(filters as Record<string, unknown>);\n\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n metrics: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private filterMetrics(filters?: Record<string, unknown>): MetricRecord[] {\n if (!filters) return [...this.db.metricRecords];\n return this.db.metricRecords.filter(m => {\n if (filters.timestamp) {\n const ts = filters.timestamp as { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean };\n if (ts.start && (ts.startExclusive ? m.timestamp <= ts.start : m.timestamp < ts.start)) return false;\n if (ts.end && (ts.endExclusive ? m.timestamp >= ts.end : m.timestamp > ts.end)) return false;\n }\n if (filters.name != null) {\n if (!(filters.name as string[]).includes(m.name)) return false;\n }\n if (filters.traceId !== undefined && m.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && m.spanId !== filters.spanId) return false;\n if (filters.provider !== undefined && m.provider !== filters.provider) return false;\n if (filters.model !== undefined && m.model !== filters.model) return false;\n if (filters.costUnit !== undefined && m.costUnit !== filters.costUnit) return false;\n if (filters.entityType !== undefined && m.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && m.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && m.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && m.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && m.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && m.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && m.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && m.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && m.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && m.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && m.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && m.requestId !== filters.requestId) return false;\n if (filters.experimentId !== undefined && m.experimentId !== filters.experimentId) return false;\n if (filters.serviceName !== undefined && m.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && m.environment !== filters.environment) return false;\n const metricExecutionSource = m.executionSource ?? m.source ?? null;\n if (filters.executionSource !== undefined && metricExecutionSource !== filters.executionSource) return false;\n if (filters.source !== undefined && metricExecutionSource !== filters.source) return false;\n if (filters.parentEntityType !== undefined && m.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && m.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && m.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && m.rootEntityName !== filters.rootEntityName) return false;\n if (filters.tags != null && Array.isArray(filters.tags) && filters.tags.length > 0) {\n if (m.tags == null) return false;\n for (const tag of filters.tags) {\n if (!m.tags.includes(tag)) return false;\n }\n }\n if (filters.labels) {\n const labelFilters = filters.labels as Record<string, string>;\n for (const [k, v] of Object.entries(labelFilters)) {\n if (m.labels[k] !== v) return false;\n }\n }\n return true;\n });\n }\n\n private aggregate(values: number[], type: AggregationType, timestamps?: number[]): number | null {\n if (values.length === 0) return null;\n switch (type) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'avg':\n return values.reduce((a, b) => a + b, 0) / values.length;\n case 'min':\n return Math.min(...values);\n case 'max':\n return Math.max(...values);\n case 'count':\n return values.length;\n case 'last': {\n if (!timestamps || timestamps.length !== values.length) {\n return values[values.length - 1]!;\n }\n\n let latestIndex = 0;\n let latestTimestamp = timestamps[0]!;\n\n for (let i = 1; i < timestamps.length; i++) {\n const timestamp = timestamps[i]!;\n if (timestamp >= latestTimestamp) {\n latestTimestamp = timestamp;\n latestIndex = i;\n }\n }\n\n return values[latestIndex]!;\n }\n default:\n return values.reduce((a, b) => a + b, 0);\n }\n }\n\n private interpolatePercentile(sortedValues: number[], percentile: number): number {\n if (sortedValues.length === 0) return 0;\n\n const position = percentile * (sortedValues.length - 1);\n const lowerIndex = Math.floor(position);\n const upperIndex = Math.ceil(position);\n const lowerValue = sortedValues[lowerIndex]!;\n const upperValue = sortedValues[upperIndex]!;\n\n if (lowerIndex === upperIndex) {\n return lowerValue;\n }\n\n return lowerValue + (upperValue - lowerValue) * (position - lowerIndex);\n }\n\n /**\n * Cost is returned alongside value-based OLAP results so callers can derive\n * token and monetary views from the same filtered scan.\n */\n private summarizeCost(records: MetricRecord[]): { estimatedCost: number | null; costUnit: string | null } {\n const costValues = records\n .map(record => record.estimatedCost)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n const costUnits = new Set(\n records.map(record => record.costUnit).filter((unit): unit is string => typeof unit === 'string'),\n );\n\n return {\n estimatedCost: costValues.length > 0 ? costValues.reduce((sum, value) => sum + value, 0) : null,\n costUnit: costUnits.size === 1 ? Array.from(costUnits)[0]! : null,\n };\n }\n\n async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n const value = this.aggregate(\n filtered.map(m => m.value),\n args.aggregation,\n );\n const costSummary = this.summarizeCost(filtered);\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const ts = args.filters.timestamp;\n if (ts.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n\n switch (args.comparePeriod) {\n case 'previous_period':\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86400000);\n prevEnd = new Date(ts.end.getTime() - 86400000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604800000);\n prevEnd = new Date(ts.end.getTime() - 604800000);\n break;\n }\n\n const prevFiltered = this.filterMetrics({\n ...(args.filters as Record<string, unknown>),\n timestamp: { ...ts, start: prevStart, end: prevEnd },\n }).filter(m => names.includes(m.name));\n const previousValue = this.aggregate(\n prevFiltered.map(m => m.value),\n args.aggregation,\n );\n const previousCostSummary = this.summarizeCost(prevFiltered);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n let costChangePercent: number | null = null;\n if (\n previousCostSummary.estimatedCost !== null &&\n previousCostSummary.estimatedCost !== 0 &&\n costSummary.estimatedCost !== null\n ) {\n costChangePercent =\n ((costSummary.estimatedCost - previousCostSummary.estimatedCost) /\n Math.abs(previousCostSummary.estimatedCost)) *\n 100;\n }\n\n return {\n value,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n previousValue,\n previousEstimatedCost: previousCostSummary.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n }\n\n return { value, estimatedCost: costSummary.estimatedCost, costUnit: costSummary.costUnit };\n }\n\n async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n const groupMap = new Map<string, MetricRecord[]>();\n for (const m of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n dims[col] = ((m as Record<string, unknown>)[col] as string | null | undefined) ?? m.labels[col] ?? null;\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(m);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => {\n const costSummary = this.summarizeCost(records);\n return {\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n };\n });\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => names.includes(m.name));\n\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, MetricRecord[]>>();\n for (const m of filtered) {\n const key = args.groupBy\n .map(col => String((m as Record<string, unknown>)[col] ?? m.labels[col] ?? ''))\n .join('|');\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([name, bucketMap]) => {\n const seriesRecords = Array.from(bucketMap.values()).flat();\n const costSummary = this.summarizeCost(seriesRecords);\n return {\n name,\n costUnit: costSummary.costUnit,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n };\n }),\n };\n }\n\n const bucketMap = new Map<number, MetricRecord[]>();\n for (const m of filtered) {\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m);\n }\n\n const metricName = Array.isArray(args.name) ? args.name.join(',') : args.name;\n const costSummary = this.summarizeCost(filtered);\n return {\n series: [\n {\n name: metricName,\n costUnit: costSummary.costUnit,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n },\n ],\n };\n }\n\n async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n const filtered = this.filterMetrics(args.filters as Record<string, unknown>).filter(m => m.name === args.name);\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const m of filtered) {\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(m.value);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(p => ({\n percentile: p,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n const idx = Math.min(Math.floor(p * sorted.length), sorted.length - 1);\n return { timestamp: new Date(ts), value: sorted[idx] ?? 0 };\n }),\n })),\n };\n }\n\n private intervalToMs(interval: string): number {\n switch (interval) {\n case '1m':\n return 60_000;\n case '5m':\n return 300_000;\n case '15m':\n return 900_000;\n case '1h':\n return 3_600_000;\n case '1d':\n return 86_400_000;\n default:\n return 3_600_000;\n }\n }\n\n // ============================================================================\n // Discovery / Metadata Methods\n // ============================================================================\n\n async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n const nameSet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (args.prefix && !m.name.startsWith(args.prefix)) continue;\n nameSet.add(m.name);\n }\n let names = Array.from(nameSet).sort();\n if (args.limit) names = names.slice(0, args.limit);\n return { names };\n }\n\n async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n const keySet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (m.name !== args.metricName) continue;\n for (const key of Object.keys(m.labels)) {\n keySet.add(key);\n }\n }\n return { keys: Array.from(keySet).sort() };\n }\n\n async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n const valueSet = new Set<string>();\n for (const m of this.db.metricRecords) {\n if (m.name !== args.metricName) continue;\n const val = m.labels[args.labelKey];\n if (val === undefined) continue;\n if (args.prefix && !val.startsWith(args.prefix)) continue;\n valueSet.add(val);\n }\n let values = Array.from(valueSet).sort();\n if (args.limit) values = values.slice(0, args.limit);\n return { values };\n }\n\n async getEntityTypes(_args: GetEntityTypesArgs): Promise<GetEntityTypesResponse> {\n const validTypes = new Set(Object.values(EntityType));\n const typeSet = new Set<EntityType>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.entityType && validTypes.has(span.entityType as EntityType)) {\n typeSet.add(span.entityType as EntityType);\n }\n }\n }\n return { entityTypes: Array.from(typeSet).sort() };\n }\n\n async getEntityNames(args: GetEntityNamesArgs): Promise<GetEntityNamesResponse> {\n const nameSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (!span.entityName) continue;\n if (args.entityType && span.entityType !== args.entityType) continue;\n nameSet.add(span.entityName);\n }\n }\n return { names: Array.from(nameSet).sort() };\n }\n\n async getServiceNames(_args: GetServiceNamesArgs): Promise<GetServiceNamesResponse> {\n const nameSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.serviceName) nameSet.add(span.serviceName);\n }\n }\n return { serviceNames: Array.from(nameSet).sort() };\n }\n\n async getEnvironments(_args: GetEnvironmentsArgs): Promise<GetEnvironmentsResponse> {\n const envSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (span.environment) envSet.add(span.environment);\n }\n }\n return { environments: Array.from(envSet).sort() };\n }\n\n async getTags(args: GetTagsArgs): Promise<GetTagsResponse> {\n const tagSet = new Set<string>();\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (!span.tags) continue;\n if (args.entityType && span.entityType !== args.entityType) continue;\n for (const tag of span.tags) {\n tagSet.add(tag);\n }\n }\n }\n return { tags: Array.from(tagSet).sort() };\n }\n\n // ============================================================================\n // Logs\n // ============================================================================\n\n async batchCreateLogs(args: BatchCreateLogsArgs): Promise<void> {\n for (const log of args.logs) {\n this.db.logRecords.push(log as LogRecord);\n }\n }\n\n async listLogs(args: ListLogsArgs): Promise<ListLogsResponse> {\n const { filters, pagination, orderBy } = listLogsArgsSchema.parse(args);\n\n let matching = this.db.logRecords.filter(log => this.logMatchesFilters(log, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n logs: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private logMatchesFilters(log: LogRecord, filters?: ListLogsArgs['filters']): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (\n filters.timestamp.start &&\n (filters.timestamp.startExclusive\n ? log.timestamp <= filters.timestamp.start\n : log.timestamp < filters.timestamp.start)\n ) {\n return false;\n }\n if (\n filters.timestamp.end &&\n (filters.timestamp.endExclusive\n ? log.timestamp >= filters.timestamp.end\n : log.timestamp > filters.timestamp.end)\n ) {\n return false;\n }\n }\n if (filters.level !== undefined) {\n const levels = Array.isArray(filters.level) ? filters.level : [filters.level];\n if (!levels.includes(log.level)) return false;\n }\n if (filters.traceId !== undefined && log.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && log.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && log.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && log.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && log.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && log.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && log.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && log.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && log.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && log.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && log.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && log.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && log.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && log.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && log.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && log.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && log.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && log.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && log.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && log.environment !== filters.environment) return false;\n const logExecutionSource = log.executionSource ?? log.source ?? null;\n if (filters.executionSource !== undefined && logExecutionSource !== filters.executionSource) return false;\n if (filters.source !== undefined && logExecutionSource !== filters.source) return false;\n if (filters.experimentId !== undefined && log.experimentId !== filters.experimentId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (log.tags == null) return false;\n for (const tag of filters.tags) {\n if (!log.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n\n // ============================================================================\n // Scores\n // ============================================================================\n\n async createScore(args: CreateScoreArgs): Promise<void> {\n const scoreSource = args.score.scoreSource ?? args.score.source ?? null;\n this.db.scoreRecords.push({\n ...args.score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord);\n }\n\n async batchCreateScores(args: BatchCreateScoresArgs): Promise<void> {\n for (const score of args.scores) {\n const scoreSource = score.scoreSource ?? score.source ?? null;\n this.db.scoreRecords.push({\n ...score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord);\n }\n }\n\n async listScores(args: ListScoresArgs): Promise<ListScoresResponse> {\n const { filters, pagination, orderBy } = listScoresArgsSchema.parse(args);\n\n let matching = this.db.scoreRecords.filter(score => this.scoreMatchesFilters(score, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n if (orderBy.field === 'score') {\n matching.sort((a, b) => dir * (a.score - b.score));\n } else {\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n }\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n scores: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n private scoreMatchesFilters(score: ScoreRecord, filters?: ListScoresArgs['filters']): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (filters.timestamp.start && score.timestamp < filters.timestamp.start) return false;\n if (filters.timestamp.end && score.timestamp > filters.timestamp.end) return false;\n }\n if (filters.traceId !== undefined && score.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && score.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && score.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && score.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && score.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && score.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && score.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && score.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && score.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && score.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && score.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && score.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && score.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && score.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && score.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && score.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && score.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && score.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && score.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && score.environment !== filters.environment) return false;\n if (filters.executionSource !== undefined && score.executionSource !== filters.executionSource) return false;\n if (filters.scorerId !== undefined) {\n const names = Array.isArray(filters.scorerId) ? filters.scorerId : [filters.scorerId];\n if (!names.includes(score.scorerId)) return false;\n }\n const scoreSource = score.scoreSource ?? score.source ?? null;\n if (filters.scoreSource !== undefined && scoreSource !== filters.scoreSource) return false;\n if (filters.source !== undefined && scoreSource !== filters.source) return false;\n if (filters.experimentId !== undefined && score.experimentId !== filters.experimentId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (score.tags == null) return false;\n for (const tag of filters.tags) {\n if (!score.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n\n async getScoreAggregate(args: GetScoreAggregateArgs): Promise<GetScoreAggregateResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const value = this.aggregate(\n filtered.map(score => score.score),\n args.aggregation,\n filtered.map(score => score.timestamp.getTime()),\n );\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n if (previousRange) {\n const previousFiltered = this.db.scoreRecords\n .filter(score =>\n this.scoreMatchesFilters(score, {\n ...(args.filters ?? {}),\n timestamp: previousRange,\n }),\n )\n .filter(score => score.scorerId === args.scorerId)\n .filter(score =>\n args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true,\n );\n\n const previousValue = this.aggregate(\n previousFiltered.map(score => score.score),\n args.aggregation,\n previousFiltered.map(score => score.timestamp.getTime()),\n );\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n }\n\n async getScoreBreakdown(args: GetScoreBreakdownArgs): Promise<GetScoreBreakdownResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n\n const groupMap = new Map<string, ScoreRecord[]>();\n for (const score of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n const value = (score as Record<string, unknown>)[col];\n dims[col] = value === null || value === undefined ? null : String(value);\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(score);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n }));\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getScoreTimeSeries(args: GetScoreTimeSeriesArgs): Promise<GetScoreTimeSeriesResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, ScoreRecord[]>>();\n const seriesNames = new Map<string, string>();\n\n for (const score of filtered) {\n const values = args.groupBy.map(col => (score as Record<string, unknown>)[col] ?? '');\n const key = JSON.stringify(values);\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n if (!seriesNames.has(key)) {\n seriesNames.set(\n key,\n values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n );\n }\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n name: seriesNames.get(key)!,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n })),\n })),\n };\n }\n\n const bucketMap = new Map<number, ScoreRecord[]>();\n for (const score of filtered) {\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score);\n }\n\n return {\n series: [\n {\n name: args.scoreSource ? `${args.scorerId}|${args.scoreSource}` : args.scorerId,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value:\n this.aggregate(\n records.map(record => record.score),\n args.aggregation,\n records.map(record => record.timestamp.getTime()),\n ) ?? 0,\n })),\n },\n ],\n };\n }\n\n async getScorePercentiles(args: GetScorePercentilesArgs): Promise<GetScorePercentilesResponse> {\n const filtered = this.db.scoreRecords\n .filter(score => this.scoreMatchesFilters(score, args.filters))\n .filter(score => score.scorerId === args.scorerId)\n .filter(score => (args.scoreSource ? (score.scoreSource ?? score.source ?? null) === args.scoreSource : true));\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const score of filtered) {\n const bucket = Math.floor(score.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(score.score);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(percentile => ({\n percentile,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n }),\n })),\n };\n }\n\n private getNumericFeedbackValue(value: FeedbackRecord['value']): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length === 0) return null;\n const numeric = Number(trimmed);\n return Number.isFinite(numeric) ? numeric : null;\n }\n\n return null;\n }\n\n private getComparisonDateRange(\n comparePeriod: 'previous_period' | 'previous_day' | 'previous_week',\n timestamp: { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean },\n ): { start: Date; end: Date; startExclusive?: boolean; endExclusive?: boolean } | null {\n if (!timestamp.start || !timestamp.end) return null;\n\n const duration = timestamp.end.getTime() - timestamp.start.getTime();\n switch (comparePeriod) {\n case 'previous_period':\n return {\n start: new Date(timestamp.start.getTime() - duration),\n end: new Date(timestamp.end.getTime() - duration),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n case 'previous_day':\n return {\n start: new Date(timestamp.start.getTime() - 86_400_000),\n end: new Date(timestamp.end.getTime() - 86_400_000),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n case 'previous_week':\n return {\n start: new Date(timestamp.start.getTime() - 604_800_000),\n end: new Date(timestamp.end.getTime() - 604_800_000),\n startExclusive: timestamp.startExclusive,\n endExclusive: timestamp.endExclusive,\n };\n }\n }\n\n // ============================================================================\n // Feedback\n // ============================================================================\n\n async createFeedback(args: CreateFeedbackArgs): Promise<void> {\n this.db.feedbackRecords.push({\n ...args.feedback,\n feedbackSource: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n source: args.feedback.feedbackSource ?? args.feedback.source ?? '',\n feedbackUserId:\n args.feedback.feedbackUserId ??\n args.feedback.userId ??\n (typeof args.feedback.metadata?.userId === 'string' ? args.feedback.metadata.userId : null),\n } as FeedbackRecord);\n }\n\n async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise<void> {\n for (const fb of args.feedbacks) {\n this.db.feedbackRecords.push({\n ...fb,\n feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n source: fb.feedbackSource ?? fb.source ?? '',\n feedbackUserId:\n fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n } as FeedbackRecord);\n }\n }\n\n async listFeedback(args: ListFeedbackArgs): Promise<ListFeedbackResponse> {\n const { filters, pagination, orderBy } = listFeedbackArgsSchema.parse(args);\n\n let matching = this.db.feedbackRecords.filter(fb => this.feedbackMatchesFilters(fb, filters));\n\n // Sort\n const dir = orderBy.direction === 'DESC' ? -1 : 1;\n matching.sort((a, b) => dir * (a.timestamp.getTime() - b.timestamp.getTime()));\n\n // Paginate\n const total = matching.length;\n const page = Number(pagination.page);\n const perPage = Number(pagination.perPage);\n const start = page * perPage;\n\n return {\n feedback: matching.slice(start, start + perPage),\n pagination: { total, page, perPage, hasMore: start + perPage < total },\n };\n }\n\n async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise<GetFeedbackAggregateResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n );\n const numericEntries = filtered.flatMap(feedback => {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n });\n const value = this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n );\n\n if (args.comparePeriod && args.filters?.timestamp) {\n const previousRange = this.getComparisonDateRange(args.comparePeriod, args.filters.timestamp);\n if (previousRange) {\n const previousNumericEntries = this.db.feedbackRecords\n .filter(feedback =>\n this.feedbackMatchesFilters(feedback, {\n ...(args.filters ?? {}),\n timestamp: previousRange,\n }),\n )\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .flatMap(feedback => {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: feedback.timestamp.getTime() }];\n });\n\n const previousValue = this.aggregate(\n previousNumericEntries.map(entry => entry.numericValue),\n args.aggregation,\n previousNumericEntries.map(entry => entry.timestamp),\n );\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n\n return { value, previousValue, changePercent };\n }\n }\n\n return { value };\n }\n\n async getFeedbackBreakdown(args: GetFeedbackBreakdownArgs): Promise<GetFeedbackBreakdownResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n\n const groupMap = new Map<string, FeedbackRecord[]>();\n for (const feedback of filtered) {\n const dims: Record<string, string | null> = {};\n for (const col of args.groupBy) {\n const rawValue = (feedback as Record<string, unknown>)[col];\n dims[col] = rawValue === null || rawValue === undefined ? null : String(rawValue);\n }\n const key = JSON.stringify(dims);\n if (!groupMap.has(key)) groupMap.set(key, []);\n groupMap.get(key)!.push(feedback);\n }\n\n const groups = Array.from(groupMap.entries()).map(([key, records]) => ({\n dimensions: JSON.parse(key) as Record<string, string | null>,\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n }));\n groups.sort((a, b) => b.value - a.value);\n\n return { groups };\n }\n\n async getFeedbackTimeSeries(args: GetFeedbackTimeSeriesArgs): Promise<GetFeedbackTimeSeriesResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n )\n .filter(feedback => this.getNumericFeedbackValue(feedback.value) !== null);\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n const seriesMap = new Map<string, Map<number, FeedbackRecord[]>>();\n const seriesNames = new Map<string, string>();\n\n for (const feedback of filtered) {\n const values = args.groupBy.map(col => (feedback as Record<string, unknown>)[col] ?? '');\n const key = JSON.stringify(values);\n if (!seriesMap.has(key)) seriesMap.set(key, new Map());\n if (!seriesNames.has(key)) {\n seriesNames.set(\n key,\n values.map(value => (value === null || value === undefined ? '' : String(value))).join('|'),\n );\n }\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n const bucketMap = seriesMap.get(key)!;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(feedback);\n }\n\n return {\n series: Array.from(seriesMap.entries()).map(([key, bucketMap]) => ({\n name: seriesNames.get(key)!,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n })),\n })),\n };\n }\n\n const bucketMap = new Map<number, FeedbackRecord[]>();\n for (const feedback of filtered) {\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(feedback);\n }\n\n return {\n series: [\n {\n name: args.feedbackSource ? `${args.feedbackType}|${args.feedbackSource}` : args.feedbackType,\n points: Array.from(bucketMap.entries())\n .sort(([a], [b]) => a - b)\n .map(([ts, records]) => ({\n timestamp: new Date(ts),\n value: (() => {\n const numericEntries = records.flatMap(record => {\n const numericValue = this.getNumericFeedbackValue(record.value);\n return numericValue === null ? [] : [{ numericValue, timestamp: record.timestamp.getTime() }];\n });\n\n return (\n this.aggregate(\n numericEntries.map(entry => entry.numericValue),\n args.aggregation,\n numericEntries.map(entry => entry.timestamp),\n ) ?? 0\n );\n })(),\n })),\n },\n ],\n };\n }\n\n async getFeedbackPercentiles(args: GetFeedbackPercentilesArgs): Promise<GetFeedbackPercentilesResponse> {\n const filtered = this.db.feedbackRecords\n .filter(feedback => this.feedbackMatchesFilters(feedback, args.filters))\n .filter(feedback => feedback.feedbackType === args.feedbackType)\n .filter(feedback =>\n args.feedbackSource ? (feedback.feedbackSource ?? feedback.source ?? '') === args.feedbackSource : true,\n );\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map<number, number[]>();\n for (const feedback of filtered) {\n const numericValue = this.getNumericFeedbackValue(feedback.value);\n if (numericValue === null) continue;\n const bucket = Math.floor(feedback.timestamp.getTime() / intervalMs) * intervalMs;\n if (!bucketMap.has(bucket)) bucketMap.set(bucket, []);\n bucketMap.get(bucket)!.push(numericValue);\n }\n\n const sortedBuckets = Array.from(bucketMap.entries()).sort(([a], [b]) => a - b);\n\n return {\n series: args.percentiles.map(percentile => ({\n percentile,\n points: sortedBuckets.map(([ts, values]) => {\n const sorted = [...values].sort((a, b) => a - b);\n return { timestamp: new Date(ts), value: this.interpolatePercentile(sorted, percentile) };\n }),\n })),\n };\n }\n\n private feedbackMatchesFilters(fb: FeedbackRecord, filters?: FeedbackFilter): boolean {\n if (!filters) return true;\n\n if (filters.timestamp) {\n if (filters.timestamp.start && fb.timestamp < filters.timestamp.start) return false;\n if (filters.timestamp.end && fb.timestamp > filters.timestamp.end) return false;\n }\n if (filters.traceId !== undefined && fb.traceId !== filters.traceId) return false;\n if (filters.spanId !== undefined && fb.spanId !== filters.spanId) return false;\n if (filters.entityType !== undefined && fb.entityType !== filters.entityType) return false;\n if (filters.entityName !== undefined && fb.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && fb.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityVersionId !== undefined && fb.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityVersionId !== undefined && fb.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n if (filters.userId !== undefined && fb.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && fb.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && fb.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && fb.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && fb.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && fb.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && fb.requestId !== filters.requestId) return false;\n if (filters.parentEntityType !== undefined && fb.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityName !== undefined && fb.parentEntityName !== filters.parentEntityName) return false;\n if (filters.rootEntityType !== undefined && fb.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityName !== undefined && fb.rootEntityName !== filters.rootEntityName) return false;\n if (filters.serviceName !== undefined && fb.serviceName !== filters.serviceName) return false;\n if (filters.environment !== undefined && fb.environment !== filters.environment) return false;\n if (filters.executionSource !== undefined && fb.executionSource !== filters.executionSource) return false;\n if (filters.feedbackType !== undefined) {\n const types = Array.isArray(filters.feedbackType) ? filters.feedbackType : [filters.feedbackType];\n if (!types.includes(fb.feedbackType)) return false;\n }\n const feedbackSource = fb.feedbackSource ?? fb.source ?? '';\n if (filters.feedbackSource !== undefined && feedbackSource !== filters.feedbackSource) return false;\n if (filters.source !== undefined && feedbackSource !== filters.source) return false;\n if (filters.experimentId !== undefined && fb.experimentId !== filters.experimentId) return false;\n if (filters.feedbackUserId !== undefined && fb.feedbackUserId !== filters.feedbackUserId) return false;\n if (filters.tags != null && filters.tags.length > 0) {\n if (fb.tags == null) return false;\n for (const tag of filters.tags) {\n if (!fb.tags.includes(tag)) return false;\n }\n }\n\n return true;\n }\n}\n","import type {\n AnyExportedSpan,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '../../../observability/index.js';\nimport type { CorrelationContext } from '../../../observability/types/core.js';\nimport { EntityType } from '../../../observability/types/tracing.js';\nimport type { CreateFeedbackRecord } from './feedback.js';\nimport type { CreateLogRecord } from './logs.js';\nimport type { CreateMetricRecord } from './metrics.js';\nimport type { CreateScoreRecord } from './scores.js';\nimport type { CreateSpanRecord, UpdateSpanRecord } from './tracing.js';\n\n// ============================================================================\n// Shared helpers for extracting typed fields from untyped metadata/labels\n// ============================================================================\n\nconst entityTypeValues = new Set(Object.values(EntityType));\n\n/** Safely cast string to EntityType, returning null if invalid */\nexport function toEntityType(value: string | undefined | null): EntityType | null {\n if (value && entityTypeValues.has(value as EntityType)) {\n return value as EntityType;\n }\n return null;\n}\n\n/** Extract a string from an unknown value, returning null if not a string. */\nexport function getStringOrNull(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Extract a plain object from an unknown value, returning null if not an object. */\nexport function getObjectOrNull(value: unknown): Record<string, any> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, any>) : null;\n}\n\n// ============================================================================\n// Span attribute serialization\n// ============================================================================\n\n/**\n * Serializes span attributes to a plain JSON-safe object.\n * Handles Date objects and nested structures.\n */\nexport function serializeSpanAttributes(span: AnyExportedSpan): Record<string, any> | null {\n if (!span.attributes) {\n return null;\n }\n\n try {\n return JSON.parse(\n JSON.stringify(span.attributes, (_key, value) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }),\n );\n } catch {\n return null;\n }\n}\n\ntype CorrelationRecordFields = Pick<\n CreateLogRecord,\n | 'tags'\n | 'entityType'\n | 'entityId'\n | 'entityName'\n | 'entityVersionId'\n | 'parentEntityType'\n | 'parentEntityId'\n | 'parentEntityName'\n | 'parentEntityVersionId'\n | 'rootEntityType'\n | 'rootEntityId'\n | 'rootEntityName'\n | 'rootEntityVersionId'\n | 'userId'\n | 'organizationId'\n | 'resourceId'\n | 'runId'\n | 'sessionId'\n | 'threadId'\n | 'requestId'\n | 'environment'\n | 'executionSource'\n | 'serviceName'\n | 'experimentId'\n>;\n\nfunction buildCorrelationRecordFields(context: CorrelationContext | undefined): CorrelationRecordFields {\n return {\n tags: context?.tags ?? null,\n entityType: context?.entityType ?? null,\n entityId: context?.entityId ?? null,\n entityName: context?.entityName ?? null,\n entityVersionId: context?.entityVersionId ?? null,\n parentEntityType: context?.parentEntityType ?? null,\n parentEntityId: context?.parentEntityId ?? null,\n parentEntityName: context?.parentEntityName ?? null,\n parentEntityVersionId: context?.parentEntityVersionId ?? null,\n rootEntityType: context?.rootEntityType ?? null,\n rootEntityId: context?.rootEntityId ?? null,\n rootEntityName: context?.rootEntityName ?? null,\n rootEntityVersionId: context?.rootEntityVersionId ?? null,\n userId: context?.userId ?? null,\n organizationId: context?.organizationId ?? null,\n resourceId: context?.resourceId ?? null,\n runId: context?.runId ?? null,\n sessionId: context?.sessionId ?? null,\n threadId: context?.threadId ?? null,\n requestId: context?.requestId ?? null,\n environment: context?.environment ?? null,\n executionSource: context?.source ?? null,\n serviceName: context?.serviceName ?? null,\n experimentId: context?.experimentId ?? null,\n };\n}\n\nfunction buildLegacyMetricLabelCorrelationFields(labels: Record<string, string>): Partial<CorrelationRecordFields> {\n return {\n entityType: toEntityType(labels.entity_type),\n entityName: getStringOrNull(labels.entity_name),\n parentEntityType: toEntityType(labels.parent_type),\n parentEntityName: getStringOrNull(labels.parent_name),\n serviceName: getStringOrNull(labels.service_name),\n };\n}\n\nfunction stripLegacyMetricCorrelationLabels(labels: Record<string, string>): Record<string, string> {\n const sanitized = { ...labels };\n delete sanitized.entity_type;\n delete sanitized.entity_name;\n delete sanitized.parent_type;\n delete sanitized.parent_name;\n delete sanitized.service_name;\n return sanitized;\n}\n\nfunction buildLegacyLogMetadataCorrelationFields(\n metadata: Record<string, any> | null,\n): Partial<CorrelationRecordFields> {\n return {\n entityType: toEntityType(getStringOrNull(metadata?.entity_type) ?? undefined),\n entityName: getStringOrNull(metadata?.entity_name),\n parentEntityType: toEntityType(getStringOrNull(metadata?.parent_type) ?? undefined),\n parentEntityName: getStringOrNull(metadata?.parent_name),\n rootEntityType: toEntityType(getStringOrNull(metadata?.root_type) ?? undefined),\n rootEntityName: getStringOrNull(metadata?.root_name),\n environment: getStringOrNull(metadata?.environment),\n executionSource: getStringOrNull(metadata?.source),\n serviceName: getStringOrNull(metadata?.service_name),\n };\n}\n\n// ============================================================================\n// Event → Record builders\n// ============================================================================\n\n/** Convert an exported span to a CreateSpanRecord */\nexport function buildCreateSpanRecord(span: AnyExportedSpan): CreateSpanRecord {\n const metadata = span.metadata ?? {};\n\n return {\n traceId: span.traceId,\n spanId: span.id,\n parentSpanId: span.parentSpanId ?? null,\n name: span.name,\n\n // Entity identification - from span\n entityType: span.entityType ?? null,\n entityId: span.entityId ?? null,\n entityName: span.entityName ?? null,\n entityVersionId: getStringOrNull(metadata.entityVersionId),\n\n // Identity & Tenancy - extracted from metadata if present\n userId: getStringOrNull(metadata.userId),\n organizationId: getStringOrNull(metadata.organizationId),\n resourceId: getStringOrNull(metadata.resourceId),\n\n // Correlation IDs - extracted from metadata if present\n runId: getStringOrNull(metadata.runId),\n sessionId: getStringOrNull(metadata.sessionId),\n threadId: getStringOrNull(metadata.threadId),\n requestId: getStringOrNull(metadata.requestId),\n\n // Deployment context - extracted from metadata if present\n environment: getStringOrNull(metadata.environment),\n source: getStringOrNull(metadata.source),\n serviceName: getStringOrNull(metadata.serviceName),\n scope: getObjectOrNull(metadata.scope),\n\n // Experimentation\n experimentId: getStringOrNull(metadata.experimentId),\n\n // Span data\n spanType: span.type,\n attributes: serializeSpanAttributes(span),\n metadata: span.metadata ?? null,\n tags: span.tags ?? null,\n links: null,\n input: span.input ?? null,\n output: span.output ?? null,\n error: span.errorInfo ?? null,\n isEvent: span.isEvent,\n\n // Request context\n requestContext: span.requestContext ?? null,\n\n // Timestamps\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n };\n}\n\n/** Convert an exported span to a partial UpdateSpanRecord */\nexport function buildUpdateSpanRecord(span: AnyExportedSpan): Partial<UpdateSpanRecord> {\n return {\n name: span.name,\n scope: null,\n attributes: serializeSpanAttributes(span),\n metadata: span.metadata ?? null,\n links: null,\n endedAt: span.endTime ?? null,\n input: span.input,\n output: span.output,\n error: span.errorInfo ?? null,\n };\n}\n\n/** Convert a MetricEvent to a CreateMetricRecord. */\nexport function buildMetricRecord(event: MetricEvent): CreateMetricRecord {\n const m = event.metric;\n const labels = stripLegacyMetricCorrelationLabels(m.labels);\n const correlationFields = buildCorrelationRecordFields(m.correlationContext);\n const legacyCorrelationFields = buildLegacyMetricLabelCorrelationFields(m.labels);\n const cost = m.costContext;\n\n return {\n metricId: m.metricId,\n timestamp: m.timestamp,\n name: m.name,\n value: m.value,\n labels,\n traceId: m.traceId ?? m.correlationContext?.traceId ?? null,\n spanId: m.spanId ?? m.correlationContext?.spanId ?? null,\n ...correlationFields,\n scope: null,\n entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n provider: cost?.provider ?? null,\n model: cost?.model ?? null,\n estimatedCost: cost?.estimatedCost ?? null,\n costUnit: cost?.costUnit ?? null,\n costMetadata: cost?.costMetadata ?? null,\n metadata: m.metadata ?? null,\n };\n}\n\n/** Convert a LogEvent to a CreateLogRecord */\nexport function buildLogRecord(event: LogEvent): CreateLogRecord {\n const l = event.log;\n const correlationFields = buildCorrelationRecordFields(l.correlationContext);\n const legacyCorrelationFields = buildLegacyLogMetadataCorrelationFields(l.metadata ?? null);\n\n return {\n logId: l.logId,\n timestamp: l.timestamp,\n level: l.level,\n message: l.message,\n data: l.data ?? null,\n ...correlationFields,\n traceId: l.traceId ?? l.correlationContext?.traceId ?? null,\n spanId: l.spanId ?? l.correlationContext?.spanId ?? null,\n tags: correlationFields.tags ?? l.tags ?? null,\n entityType: correlationFields.entityType ?? legacyCorrelationFields.entityType ?? null,\n entityName: correlationFields.entityName ?? legacyCorrelationFields.entityName ?? null,\n parentEntityType: correlationFields.parentEntityType ?? legacyCorrelationFields.parentEntityType ?? null,\n parentEntityName: correlationFields.parentEntityName ?? legacyCorrelationFields.parentEntityName ?? null,\n rootEntityType: correlationFields.rootEntityType ?? legacyCorrelationFields.rootEntityType ?? null,\n rootEntityName: correlationFields.rootEntityName ?? legacyCorrelationFields.rootEntityName ?? null,\n environment: correlationFields.environment ?? legacyCorrelationFields.environment ?? null,\n executionSource: correlationFields.executionSource ?? legacyCorrelationFields.executionSource ?? null,\n serviceName: correlationFields.serviceName ?? legacyCorrelationFields.serviceName ?? null,\n scope: null,\n metadata: l.metadata ?? null,\n };\n}\n\n/** Convert a ScoreEvent to a CreateScoreRecord */\nexport function buildScoreRecord(event: ScoreEvent): CreateScoreRecord {\n const s = event.score;\n const correlationFields = buildCorrelationRecordFields(s.correlationContext);\n return {\n scoreId: s.scoreId,\n timestamp: s.timestamp,\n traceId: s.traceId ?? s.correlationContext?.traceId ?? null,\n spanId: s.spanId ?? s.correlationContext?.spanId ?? null,\n scorerId: s.scorerId,\n scorerVersion: s.scorerVersion ?? null,\n scoreSource: s.scoreSource ?? s.source ?? null,\n source: s.scoreSource ?? s.source ?? null,\n score: s.score,\n reason: s.reason ?? null,\n ...correlationFields,\n entityType: correlationFields.entityType ?? s.targetEntityType ?? null,\n experimentId: correlationFields.experimentId ?? s.experimentId ?? null,\n scope: null,\n scoreTraceId: s.scoreTraceId ?? null,\n metadata: s.scorerName ? { ...(s.metadata ?? {}), scorerName: s.scorerName } : (s.metadata ?? null),\n };\n}\n\n/** Convert a FeedbackEvent to a CreateFeedbackRecord */\nexport function buildFeedbackRecord(event: FeedbackEvent): CreateFeedbackRecord {\n const fb = event.feedback;\n const correlationFields = buildCorrelationRecordFields(fb.correlationContext);\n return {\n feedbackId: fb.feedbackId,\n timestamp: fb.timestamp,\n traceId: fb.traceId ?? fb.correlationContext?.traceId ?? null,\n spanId: fb.spanId ?? fb.correlationContext?.spanId ?? null,\n feedbackSource: fb.feedbackSource ?? fb.source ?? '',\n source: fb.feedbackSource ?? fb.source ?? '',\n feedbackType: fb.feedbackType,\n value: fb.value,\n comment: fb.comment ?? null,\n ...correlationFields,\n experimentId: correlationFields.experimentId ?? fb.experimentId ?? null,\n feedbackUserId:\n fb.feedbackUserId ?? fb.userId ?? (typeof fb.metadata?.userId === 'string' ? fb.metadata.userId : null),\n scope: null,\n sourceId: fb.sourceId ?? null,\n metadata: fb.metadata ?? null,\n };\n}\n","import type { BackgroundTask, TaskFilter, TaskListResult, UpdateBackgroundTask } from '../../../background-tasks/types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract storage domain for background tasks.\n * Handles persistence of task state — creation, status updates, querying, and cleanup.\n */\nexport abstract class BackgroundTasksStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'BACKGROUND_TASKS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n /** Insert a new task record. */\n abstract createTask(task: BackgroundTask): Promise<void>;\n\n /**\n * Partial update of a task record.\n * Only the provided fields are updated; others are left unchanged.\n */\n abstract updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void>;\n\n /** Get a single task by ID. Returns null if not found. */\n abstract getTask(taskId: string): Promise<BackgroundTask | null>;\n\n /**\n * Query tasks with filters, ordering, and pagination.\n * Returns tasks matching all provided filter criteria.\n */\n abstract listTasks(filter: TaskFilter): Promise<TaskListResult>;\n\n /**\n * Delete a particular task by ID.\n * Used for cleanup of old completed/failed records.\n */\n abstract deleteTask(taskId: string): Promise<void>;\n\n /**\n * Delete tasks matching the filter criteria.\n * Used for cleanup of old completed/failed records.\n */\n abstract deleteTasks(filter: TaskFilter): Promise<void>;\n\n /** Count tasks currently in 'running' status across all agents. */\n abstract getRunningCount(): Promise<number>;\n\n /** Count tasks currently in 'running' status for a specific agent. */\n abstract getRunningCountByAgent(agentId: string): Promise<number>;\n}\n","import type { BackgroundTask, TaskFilter, TaskListResult, UpdateBackgroundTask } from '../../../background-tasks/types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { BackgroundTasksStorage } from './base';\n\nexport class BackgroundTasksInMemory extends BackgroundTasksStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.backgroundTasks.clear();\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n this.db.backgroundTasks.set(task.id, { ...task });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const existing = this.db.backgroundTasks.get(taskId);\n if (!existing) return;\n this.db.backgroundTasks.set(taskId, { ...existing, ...update });\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const task = this.db.backgroundTasks.get(taskId);\n return task ? { ...task } : null;\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n let tasks = Array.from(this.db.backgroundTasks.values());\n\n // Apply filters\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n tasks = tasks.filter(t => statuses.includes(t.status));\n }\n if (filter.agentId) {\n tasks = tasks.filter(t => t.agentId === filter.agentId);\n }\n if (filter.threadId) {\n tasks = tasks.filter(t => t.threadId === filter.threadId);\n }\n if (filter.resourceId) {\n tasks = tasks.filter(t => t.resourceId === filter.resourceId);\n }\n if (filter.toolName) {\n tasks = tasks.filter(t => t.toolName === filter.toolName);\n }\n if (filter.runId) {\n tasks = tasks.filter(t => t.runId === filter.runId);\n }\n\n // Date range filtering\n const dateCol = filter.dateFilterBy ?? 'createdAt';\n if (filter.fromDate) {\n tasks = tasks.filter(t => {\n const val = t[dateCol];\n return val != null && val >= filter.fromDate!;\n });\n }\n if (filter.toDate) {\n tasks = tasks.filter(t => {\n const val = t[dateCol];\n return val != null && val < filter.toDate!;\n });\n }\n\n // Sort\n const orderBy = filter.orderBy ?? 'createdAt';\n const direction = filter.orderDirection ?? 'asc';\n tasks.sort((a, b) => {\n const aVal = a[orderBy]?.getTime() ?? 0;\n const bVal = b[orderBy]?.getTime() ?? 0;\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n });\n\n // Total count before pagination\n const total = tasks.length;\n\n // Pagination\n if (filter.page != null && filter.perPage != null) {\n const start = filter.page * filter.perPage;\n tasks = tasks.slice(start, start + filter.perPage);\n } else if (filter.perPage != null) {\n tasks = tasks.slice(0, filter.perPage);\n }\n\n // Return copies to prevent external mutation\n return { tasks: tasks.map(t => ({ ...t })), total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n this.db.backgroundTasks.delete(taskId);\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const { tasks } = await this.listTasks(filter);\n for (const task of tasks) {\n this.db.backgroundTasks.delete(task.id);\n }\n }\n\n async getRunningCount(): Promise<number> {\n let count = 0;\n for (const task of this.db.backgroundTasks.values()) {\n if (task.status === 'running') count++;\n }\n return count;\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n let count = 0;\n for (const task of this.db.backgroundTasks.values()) {\n if (task.status === 'running' && task.agentId === agentId) count++;\n }\n return count;\n }\n}\n","import { MastraBase } from '../../../base';\nimport type { StorageBlobEntry } from '../../types';\n\n/**\n * Abstract base class for content-addressable blob storage.\n * Used to store file contents for skill versioning.\n *\n * Blobs are keyed by their SHA-256 hash, providing natural deduplication.\n */\nexport abstract class BlobStore extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'BLOBS',\n });\n }\n\n /**\n * Initialize the blob store (create tables, etc).\n */\n abstract init(): Promise<void>;\n\n /**\n * Store a blob. If the hash already exists, this is a no-op.\n */\n abstract put(entry: StorageBlobEntry): Promise<void>;\n\n /**\n * Retrieve a blob by its hash.\n * Returns null if not found.\n */\n abstract get(hash: string): Promise<StorageBlobEntry | null>;\n\n /**\n * Check if a blob exists by hash.\n */\n abstract has(hash: string): Promise<boolean>;\n\n /**\n * Delete a blob by hash.\n * Returns true if the blob was deleted, false if it didn't exist.\n */\n abstract delete(hash: string): Promise<boolean>;\n\n /**\n * Store multiple blobs in a batch. Skips any that already exist.\n */\n abstract putMany(entries: StorageBlobEntry[]): Promise<void>;\n\n /**\n * Retrieve multiple blobs by their hashes.\n * Returns a Map of hash -> entry. Missing hashes are omitted.\n */\n abstract getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>>;\n\n /**\n * Delete all blobs. Used for testing.\n */\n abstract dangerouslyClearAll(): Promise<void>;\n}\n","import type { StorageBlobEntry } from '../../types';\nimport { BlobStore } from './base';\n\n/**\n * In-memory implementation of BlobStore for testing.\n */\nexport class InMemoryBlobStore extends BlobStore {\n readonly #blobs = new Map<string, StorageBlobEntry>();\n\n async init(): Promise<void> {\n // No-op for in-memory store\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n if (!this.#blobs.has(entry.hash)) {\n this.#blobs.set(entry.hash, entry);\n }\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n return this.#blobs.get(hash) ?? null;\n }\n\n async has(hash: string): Promise<boolean> {\n return this.#blobs.has(hash);\n }\n\n async delete(hash: string): Promise<boolean> {\n return this.#blobs.delete(hash);\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n for (const entry of entries) {\n await this.put(entry);\n }\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n for (const hash of hashes) {\n const blob = this.#blobs.get(hash);\n if (blob) {\n result.set(hash, blob);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.#blobs.clear();\n }\n}\n","import { StorageDomain } from '../base';\n\n/**\n * Generic channel installation record.\n * Stores platform-specific data as JSON for flexibility.\n */\nexport interface ChannelInstallation {\n /** Unique installation ID */\n id: string;\n /** Platform identifier (e.g., 'slack', 'discord') */\n platform: string;\n /** Agent ID this installation is for */\n agentId: string;\n /** Installation status */\n status: 'pending' | 'active' | 'error';\n /** Webhook ID for routing inbound requests */\n webhookId?: string;\n /** Platform-specific data (tokens, team info, etc.) - stored encrypted */\n data: Record<string, unknown>;\n /** Hash of the agent's channel config + baseUrl - used to detect changes */\n configHash?: string;\n /** Error message if status is 'error' */\n error?: string;\n /** When the installation was created */\n createdAt: Date;\n /** When the installation was last updated */\n updatedAt: Date;\n}\n\n/**\n * Platform-level configuration for channel integrations.\n * Stores admin credentials needed for app factory (e.g., Slack App Configuration Tokens).\n * Each platform defines its own config shape - stored as encrypted JSON.\n */\nexport interface ChannelConfig {\n /** Platform identifier (e.g., 'slack', 'telegram', 'discord') */\n platform: string;\n /** Platform-specific configuration data - stored encrypted */\n data: Record<string, unknown>;\n /** When the config was last updated */\n updatedAt: Date;\n}\n\n/**\n * Storage domain for channel installations and configuration.\n * Provides persistence for multi-platform channel integrations.\n */\nexport abstract class ChannelsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'CHANNELS',\n });\n }\n\n /**\n * Save or update a channel installation.\n */\n abstract saveInstallation(installation: ChannelInstallation): Promise<void>;\n\n /**\n * Get an installation by ID.\n */\n abstract getInstallation(id: string): Promise<ChannelInstallation | null>;\n\n /**\n * Get an installation by platform and agent ID.\n */\n abstract getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null>;\n\n /**\n * Get an installation by webhook ID (for routing inbound requests).\n */\n abstract getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null>;\n\n /**\n * List all installations for a platform.\n */\n abstract listInstallations(platform: string): Promise<ChannelInstallation[]>;\n\n /**\n * Delete an installation.\n */\n abstract deleteInstallation(id: string): Promise<void>;\n\n /**\n * Save platform configuration (e.g., Slack App Configuration Tokens, Telegram parent bot token).\n */\n abstract saveConfig(config: ChannelConfig): Promise<void>;\n\n /**\n * Get platform configuration.\n */\n abstract getConfig(platform: string): Promise<ChannelConfig | null>;\n\n /**\n * Delete platform configuration.\n */\n abstract deleteConfig(platform: string): Promise<void>;\n}\n","import type { ChannelInstallation, ChannelConfig } from './base';\nimport { ChannelsStorage } from './base';\n\n/**\n * In-memory implementation of ChannelsStorage.\n * Useful for development and testing.\n */\nexport class InMemoryChannelsStorage extends ChannelsStorage {\n #installations = new Map<string, ChannelInstallation>();\n #configs = new Map<string, ChannelConfig>();\n\n async saveInstallation(installation: ChannelInstallation): Promise<void> {\n this.#installations.set(installation.id, { ...installation });\n }\n\n async getInstallation(id: string): Promise<ChannelInstallation | null> {\n const inst = this.#installations.get(id);\n return inst ? { ...inst } : null;\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n const statusPriority = { active: 0, pending: 1, error: 2 } as const;\n let best: ChannelInstallation | null = null;\n for (const installation of this.#installations.values()) {\n if (installation.platform === platform && installation.agentId === agentId) {\n if (!best || (statusPriority[installation.status] ?? 3) < (statusPriority[best.status] ?? 3)) {\n best = installation;\n }\n }\n }\n return best ? { ...best } : null;\n }\n\n async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n for (const installation of this.#installations.values()) {\n if (installation.webhookId === webhookId) {\n return { ...installation };\n }\n }\n return null;\n }\n\n async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n const results: ChannelInstallation[] = [];\n for (const installation of this.#installations.values()) {\n if (installation.platform === platform) {\n results.push({ ...installation });\n }\n }\n return results;\n }\n\n async deleteInstallation(id: string): Promise<void> {\n this.#installations.delete(id);\n }\n\n async saveConfig(config: ChannelConfig): Promise<void> {\n this.#configs.set(config.platform, { ...config });\n }\n\n async getConfig(platform: string): Promise<ChannelConfig | null> {\n const config = this.#configs.get(platform);\n return config ? { ...config } : null;\n }\n\n async deleteConfig(platform: string): Promise<void> {\n this.#configs.delete(platform);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.#installations.clear();\n this.#configs.clear();\n }\n}\n","/** Field-level validation error */\nexport interface FieldError {\n /** JSON Pointer path, e.g., \"/name\" or \"/address/city\" */\n path: string;\n /** Zod error code, e.g., \"invalid_type\", \"too_small\" */\n code: string;\n /** Human-readable error message */\n message: string;\n}\n\n/** Schema validation error with field details */\nexport class SchemaValidationError extends Error {\n constructor(\n public readonly field: 'input' | 'groundTruth',\n public readonly errors: FieldError[],\n ) {\n const summary = errors\n .slice(0, 3)\n .map(e => e.message)\n .join('; ');\n super(`Validation failed for ${field}: ${summary}`);\n this.name = 'SchemaValidationError';\n }\n}\n\n/** Batch validation result for multiple items */\nexport interface BatchValidationResult {\n valid: Array<{ index: number; data: unknown }>;\n invalid: Array<{\n index: number;\n data: unknown;\n field: 'input' | 'groundTruth';\n errors: FieldError[];\n }>;\n}\n\n/** Error thrown when schema update would invalidate existing items */\nexport class SchemaUpdateValidationError extends Error {\n constructor(\n public readonly failingItems: Array<{\n index: number;\n data: unknown;\n field: 'input' | 'groundTruth';\n errors: FieldError[];\n }>,\n ) {\n const count = failingItems.length;\n super(`Cannot update schema: ${count} existing item(s) would fail validation`);\n this.name = 'SchemaUpdateValidationError';\n }\n}\n","import { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ZodSchema, ZodError, ZodIssue } from 'zod/v4';\nimport { z } from 'zod/v4';\nimport { SchemaValidationError } from './errors';\nimport type { FieldError, BatchValidationResult } from './errors';\n\n/**\n * Convert JSON Schema string to runtime Zod schema.\n * Uses Function() to evaluate the generated Zod code - same pattern as workflow validation.\n */\nfunction resolveZodSchema(zodString: string): ZodSchema {\n return Function('z', `\"use strict\";return (${zodString});`)(z);\n}\n\n/** Schema validator with compilation caching */\nexport class SchemaValidator {\n private cache = new Map<string, ZodSchema>();\n\n /** Get or compile validator for schema */\n private getValidator(schema: JSONSchema7, cacheKey: string): ZodSchema {\n let zodSchema = this.cache.get(cacheKey);\n if (!zodSchema) {\n const zodString = jsonSchemaToZod(schema);\n zodSchema = resolveZodSchema(zodString);\n this.cache.set(cacheKey, zodSchema);\n }\n return zodSchema;\n }\n\n /** Clear cached validator (call when schema changes) */\n clearCache(cacheKey: string): void {\n this.cache.delete(cacheKey);\n }\n\n /** Validate data against schema */\n validate(data: unknown, schema: JSONSchema7, field: 'input' | 'groundTruth', cacheKey: string): void {\n const zodSchema = this.getValidator(schema, cacheKey);\n const result = zodSchema.safeParse(data);\n if (!result.success) {\n throw new SchemaValidationError(field, this.formatErrors(result.error));\n }\n }\n\n /** Validate multiple items, returning valid/invalid split */\n validateBatch(\n items: Array<{ input: unknown; groundTruth?: unknown }>,\n inputSchema: JSONSchema7 | null | undefined,\n outputSchema: JSONSchema7 | null | undefined,\n cacheKeyPrefix: string,\n maxErrors = 10,\n ): BatchValidationResult {\n const result: BatchValidationResult = { valid: [], invalid: [] };\n\n // Pre-compile schemas for performance\n const inputValidator = inputSchema ? this.getValidator(inputSchema, `${cacheKeyPrefix}:input`) : null;\n const outputValidator = outputSchema ? this.getValidator(outputSchema, `${cacheKeyPrefix}:output`) : null;\n\n for (const [i, item] of items.entries()) {\n let hasError = false;\n\n // Validate input if schema enabled\n if (inputValidator) {\n const inputResult = inputValidator.safeParse(item.input);\n if (!inputResult.success) {\n result.invalid.push({\n index: i,\n data: item,\n field: 'input',\n errors: this.formatErrors(inputResult.error),\n });\n hasError = true;\n if (result.invalid.length >= maxErrors) break;\n }\n }\n\n // Validate groundTruth if schema enabled and value provided\n if (!hasError && outputValidator && item.groundTruth !== undefined) {\n const outputResult = outputValidator.safeParse(item.groundTruth);\n if (!outputResult.success) {\n result.invalid.push({\n index: i,\n data: item,\n field: 'groundTruth',\n errors: this.formatErrors(outputResult.error),\n });\n hasError = true;\n if (result.invalid.length >= maxErrors) break;\n }\n }\n\n if (!hasError) {\n result.valid.push({ index: i, data: item });\n }\n }\n\n return result;\n }\n\n /** Format Zod errors to FieldError array */\n private formatErrors(error: ZodError): FieldError[] {\n return error.issues.slice(0, 5).map((issue: ZodIssue) => ({\n // Convert Zod path array to JSON Pointer string\n path: issue.path.length > 0 ? '/' + issue.path.join('/') : '/',\n code: issue.code,\n message: issue.message,\n }));\n }\n}\n\n/** Singleton validator instance */\nlet validatorInstance: SchemaValidator | null = null;\n\n/** Get or create validator instance */\nexport function getSchemaValidator(): SchemaValidator {\n if (!validatorInstance) {\n validatorInstance = new SchemaValidator();\n }\n return validatorInstance;\n}\n\n/** Create new validator (for testing) */\nexport function createValidator(): SchemaValidator {\n return new SchemaValidator();\n}\n","import { getSchemaValidator, SchemaUpdateValidationError } from '../../../datasets/validation';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for datasets storage domain.\n * Provides the contract for dataset and dataset item CRUD operations.\n *\n * Schema validation is handled in this base class via Template Method pattern.\n * Subclasses implement protected _do* methods for actual storage operations,\n * including SCD-2 versioning (version bump, row ops, dataset_version insert).\n */\nexport abstract class DatasetsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'DATASETS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n // Dataset CRUD\n abstract createDataset(input: CreateDatasetInput): Promise<DatasetRecord>;\n abstract getDatasetById(args: { id: string }): Promise<DatasetRecord | null>;\n abstract deleteDataset(args: { id: string }): Promise<void>;\n abstract listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput>;\n\n /**\n * Update a dataset. Validates existing items against new schemas if schemas are changing.\n * Subclasses implement _doUpdateDataset for actual storage operation.\n */\n async updateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n const existing = await this.getDatasetById({ id: args.id });\n if (!existing) {\n throw new Error(`Dataset not found: ${args.id}`);\n }\n\n // Check if schemas are being added or modified\n const inputSchemaChanging =\n args.inputSchema !== undefined && JSON.stringify(args.inputSchema) !== JSON.stringify(existing.inputSchema);\n const groundTruthSchemaChanging =\n args.groundTruthSchema !== undefined &&\n JSON.stringify(args.groundTruthSchema) !== JSON.stringify(existing.groundTruthSchema);\n\n // If schemas changing, validate all existing items against new schemas\n if (inputSchemaChanging || groundTruthSchemaChanging) {\n const itemsResult = await this.listItems({\n datasetId: args.id,\n pagination: { page: 0, perPage: false }, // Get all items\n });\n const items = itemsResult.items;\n\n if (items.length > 0) {\n const validator = getSchemaValidator();\n const newInputSchema = args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema;\n const newOutputSchema =\n args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema;\n\n const result = validator.validateBatch(\n items.map(i => ({ input: i.input, groundTruth: i.groundTruth })),\n newInputSchema,\n newOutputSchema,\n `dataset:${args.id}:schema-update`,\n 10, // Max 10 errors to report\n );\n\n if (result.invalid.length > 0) {\n throw new SchemaUpdateValidationError(result.invalid);\n }\n\n // Clear old cache since schema changed\n validator.clearCache(`dataset:${args.id}:input`);\n validator.clearCache(`dataset:${args.id}:output`);\n }\n }\n\n return this._doUpdateDataset(args);\n }\n\n /** Subclasses implement actual storage update logic */\n protected abstract _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord>;\n\n /**\n * Add an item to a dataset. Validates input/groundTruth against dataset schemas.\n * Subclasses implement _doAddItem which handles SCD-2 versioning internally.\n */\n async addItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n const dataset = await this.getDatasetById({ id: args.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Validate against schemas if enabled\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${args.datasetId}`;\n\n if (dataset.inputSchema) {\n validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n\n if (dataset.groundTruthSchema && args.groundTruth !== undefined) {\n validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n\n return this._doAddItem(args);\n }\n\n /** Subclasses implement actual storage add logic with SCD-2 versioning */\n protected abstract _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem>;\n\n /**\n * Update an item in a dataset. Validates changed fields against dataset schemas.\n * Subclasses implement _doUpdateItem which handles SCD-2 versioning internally.\n */\n async updateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n const dataset = await this.getDatasetById({ id: args.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Validate new values against schemas if enabled\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${args.datasetId}`;\n\n if (args.input !== undefined && dataset.inputSchema) {\n validator.validate(args.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n\n if (args.groundTruth !== undefined && dataset.groundTruthSchema) {\n validator.validate(args.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n\n return this._doUpdateItem(args);\n }\n\n /** Subclasses implement actual storage update logic with SCD-2 versioning */\n protected abstract _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem>;\n\n /**\n * Delete an item from a dataset. Creates a tombstone row via SCD-2.\n * Subclasses implement _doDeleteItem which handles SCD-2 versioning internally.\n */\n async deleteItem(args: { id: string; datasetId: string }): Promise<void> {\n return this._doDeleteItem(args);\n }\n\n /** Subclasses implement actual storage delete logic with SCD-2 versioning */\n protected abstract _doDeleteItem(args: { id: string; datasetId: string }): Promise<void>;\n\n abstract listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput>;\n abstract getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null>;\n\n // SCD-2 queries\n abstract getItemsByVersion(args: { datasetId: string; version: number }): Promise<DatasetItem[]>;\n abstract getItemHistory(itemId: string): Promise<DatasetItemRow[]>;\n\n // Dataset version methods\n abstract createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion>;\n abstract listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput>;\n\n /**\n * Batch insert items to a dataset. Validates all items against dataset schemas,\n * then delegates to subclass which handles SCD-2 versioning internally.\n */\n async batchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // Validate all items against schemas\n const validator = getSchemaValidator();\n const cacheKey = `dataset:${input.datasetId}`;\n\n for (const itemData of input.items) {\n if (dataset.inputSchema) {\n validator.validate(itemData.input, dataset.inputSchema, 'input', `${cacheKey}:input`);\n }\n if (dataset.groundTruthSchema && itemData.groundTruth !== undefined) {\n validator.validate(itemData.groundTruth, dataset.groundTruthSchema, 'groundTruth', `${cacheKey}:output`);\n }\n }\n\n return this._doBatchInsertItems(input);\n }\n\n /** Subclasses implement batch insert with SCD-2 versioning */\n protected abstract _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]>;\n\n /**\n * Batch delete items from a dataset. Creates tombstone rows via SCD-2.\n * Subclasses implement _doBatchDeleteItems which handles SCD-2 versioning internally.\n */\n async batchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n return this._doBatchDeleteItems(input);\n }\n\n /** Subclasses implement batch delete with SCD-2 versioning */\n protected abstract _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { DatasetsStorage } from './base';\n\n/** Convert a storage row to the public DatasetItem type (strips validTo/isDeleted) */\nfunction toDatasetItem(row: DatasetItemRow): DatasetItem {\n return {\n id: row.id,\n datasetId: row.datasetId,\n datasetVersion: row.datasetVersion,\n input: row.input,\n groundTruth: row.groundTruth,\n expectedTrajectory: row.expectedTrajectory,\n requestContext: row.requestContext,\n metadata: row.metadata,\n source: row.source,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n\n/** Internal record that allows null schemas (for \"clear schema\" semantics) */\ntype InternalDatasetRecord = Omit<DatasetRecord, 'inputSchema' | 'groundTruthSchema' | 'requestContextSchema'> & {\n inputSchema?: Record<string, unknown> | null;\n groundTruthSchema?: Record<string, unknown> | null;\n requestContextSchema?: Record<string, unknown> | null;\n};\n\n/** Normalize internal record (which may have null schemas) to public DatasetRecord */\nfunction toDatasetRecord(record: InternalDatasetRecord): DatasetRecord {\n return {\n ...record,\n inputSchema: record.inputSchema ?? undefined,\n groundTruthSchema: record.groundTruthSchema ?? undefined,\n requestContextSchema: record.requestContextSchema ?? undefined,\n };\n}\n\nexport class DatasetsInMemory extends DatasetsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.datasets.clear();\n this.db.datasetItems.clear();\n this.db.datasetVersions.clear();\n }\n\n // Dataset CRUD\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n const id = crypto.randomUUID();\n const now = new Date();\n const dataset = {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n inputSchema: input.inputSchema,\n groundTruthSchema: input.groundTruthSchema,\n requestContextSchema: input.requestContextSchema,\n targetType: input.targetType,\n targetIds: input.targetIds,\n scorerIds: input.scorerIds ?? null,\n version: 0,\n createdAt: now,\n updatedAt: now,\n } as DatasetRecord;\n this.db.datasets.set(id, dataset);\n return toDatasetRecord(dataset);\n }\n\n async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n const record = this.db.datasets.get(id);\n return record ? toDatasetRecord(record) : null;\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n const existing = this.db.datasets.get(args.id);\n if (!existing) {\n throw new Error(`Dataset not found: ${args.id}`);\n }\n\n const updated = {\n ...existing,\n name: args.name ?? existing.name,\n description: args.description ?? existing.description,\n metadata: args.metadata ?? existing.metadata,\n inputSchema: args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema,\n groundTruthSchema: args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema,\n requestContextSchema:\n args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema,\n tags: args.tags !== undefined ? args.tags : existing.tags,\n targetType: args.targetType !== undefined ? args.targetType : existing.targetType,\n targetIds: args.targetIds !== undefined ? args.targetIds : existing.targetIds,\n scorerIds: args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds,\n updatedAt: new Date(),\n } as DatasetRecord;\n this.db.datasets.set(args.id, updated);\n return toDatasetRecord(updated);\n }\n\n async deleteDataset({ id }: { id: string }): Promise<void> {\n // Cascade: delete items and versions\n for (const [itemId, rows] of this.db.datasetItems) {\n if (rows.length > 0 && rows[0]!.datasetId === id) {\n this.db.datasetItems.delete(itemId);\n }\n }\n for (const [vId, v] of this.db.datasetVersions) {\n if (v.datasetId === id) {\n this.db.datasetVersions.delete(vId);\n }\n }\n\n // F3 fix: detach experiments (SET NULL) instead of deleting them\n for (const [expId, exp] of this.db.experiments) {\n if (exp.datasetId === id) {\n this.db.experiments.set(expId, { ...exp, datasetId: null, datasetVersion: null });\n }\n }\n\n this.db.datasets.delete(id);\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n const datasets = Array.from(this.db.datasets.values());\n // Sort by createdAt descending (newest first)\n datasets.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? datasets.length : start + perPage;\n\n return {\n datasets: datasets.slice(start, end).map(toDatasetRecord),\n pagination: {\n total: datasets.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : datasets.length > end,\n },\n };\n }\n\n // --- SCD-2 item mutations ---\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n const dataset = this.db.datasets.get(args.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Bump version (T3.7, T3.26 — only bumps version, not updatedAt)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n const id = crypto.randomUUID();\n const row: DatasetItemRow = {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: args.input,\n groundTruth: args.groundTruth,\n expectedTrajectory: args.expectedTrajectory,\n requestContext: args.requestContext,\n metadata: args.metadata,\n source: args.source,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db.datasetItems.set(id, [row]);\n\n // T3.11 — every mutation inserts exactly one dataset_version row\n await this.createDatasetVersion(args.datasetId, newVersion);\n\n return toDatasetItem(row);\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n const rows = this.db.datasetItems.get(args.id);\n if (!rows || rows.length === 0) {\n throw new Error(`Item not found: ${args.id}`);\n }\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow) {\n throw new Error(`Item not found: ${args.id}`);\n }\n if (currentRow.datasetId !== args.datasetId) {\n throw new Error(`Item ${args.id} does not belong to dataset ${args.datasetId}`);\n }\n\n const dataset = this.db.datasets.get(args.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${args.datasetId}`);\n }\n\n // Bump version (T3.26)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });\n\n // T3.8 — close old row\n currentRow.validTo = newVersion;\n\n // T3.8 — insert new row with same id\n const now = new Date();\n const newRow: DatasetItemRow = {\n id: args.id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: args.input !== undefined ? args.input : currentRow.input,\n groundTruth: args.groundTruth !== undefined ? args.groundTruth : currentRow.groundTruth,\n expectedTrajectory:\n args.expectedTrajectory !== undefined ? args.expectedTrajectory : currentRow.expectedTrajectory,\n requestContext: args.requestContext !== undefined ? args.requestContext : currentRow.requestContext,\n metadata: args.metadata !== undefined ? args.metadata : currentRow.metadata,\n source: args.source !== undefined ? args.source : currentRow.source,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n };\n rows.push(newRow);\n\n // T3.11\n await this.createDatasetVersion(args.datasetId, newVersion);\n\n return toDatasetItem(newRow);\n }\n\n protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n const rows = this.db.datasetItems.get(id);\n if (!rows || rows.length === 0) {\n return; // no-op if item doesn't exist\n }\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow) {\n return; // already deleted\n }\n if (currentRow.datasetId !== datasetId) {\n throw new Error(`Item ${id} does not belong to dataset ${datasetId}`);\n }\n\n const dataset = this.db.datasets.get(datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${datasetId}`);\n }\n\n // Bump version (T3.26)\n const newVersion = dataset.version + 1;\n this.db.datasets.set(datasetId, { ...dataset, version: newVersion });\n\n // T3.9 — close old row\n currentRow.validTo = newVersion;\n\n // T3.9 — insert tombstone\n const now = new Date();\n rows.push({\n id,\n datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: currentRow.input,\n groundTruth: currentRow.groundTruth,\n requestContext: currentRow.requestContext,\n metadata: currentRow.metadata,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n });\n\n // T3.11\n await this.createDatasetVersion(datasetId, newVersion);\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n const rows = this.db.datasetItems.get(args.id);\n if (!rows || rows.length === 0) return null;\n\n if (args.datasetVersion !== undefined) {\n // T3.13 — exact version match, exclude deleted\n const row = rows.find(r => r.datasetVersion === args.datasetVersion && !r.isDeleted);\n return row ? toDatasetItem(row) : null;\n }\n\n // T3.12 — current row (validTo IS NULL AND isDeleted = false)\n const current = rows.find(r => r.validTo === null && !r.isDeleted);\n return current ? toDatasetItem(current) : null;\n }\n\n async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n // T3.14 — SCD-2 range query: items visible at version N\n const items: DatasetItem[] = [];\n\n for (const rows of this.db.datasetItems.values()) {\n if (rows.length === 0 || rows[0]!.datasetId !== datasetId) continue;\n\n // Find the row visible at this version:\n // datasetVersion <= N AND (validTo IS NULL OR validTo > N) AND isDeleted = false\n const visible = rows.find(\n r => r.datasetVersion <= version && (r.validTo === null || r.validTo > version) && !r.isDeleted,\n );\n if (visible) {\n items.push(toDatasetItem(visible));\n }\n }\n\n items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n return items;\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n // ALL rows including tombstones, ordered by datasetVersion DESC (newest first)\n const rows = this.db.datasetItems.get(itemId);\n if (!rows) return [];\n return [...rows].sort((a, b) => b.datasetVersion - a.datasetVersion);\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n let items: DatasetItem[];\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query\n items = await this.getItemsByVersion({ datasetId: args.datasetId, version: args.version });\n } else {\n // T3.16 — current items only (validTo IS NULL AND isDeleted = false)\n items = [];\n for (const rows of this.db.datasetItems.values()) {\n if (rows.length === 0 || rows[0]!.datasetId !== args.datasetId) continue;\n const current = rows.find(r => r.validTo === null && !r.isDeleted);\n if (current) {\n items.push(toDatasetItem(current));\n }\n }\n }\n\n // Filter by search term if specified (case-insensitive partial match on input/groundTruth)\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n items = items.filter(item => {\n const inputStr = typeof item.input === 'string' ? item.input : JSON.stringify(item.input);\n const outputStr = item.groundTruth\n ? typeof item.groundTruth === 'string'\n ? item.groundTruth\n : JSON.stringify(item.groundTruth)\n : '';\n return inputStr.toLowerCase().includes(searchLower) || outputStr.toLowerCase().includes(searchLower);\n });\n }\n\n // Sort by createdAt descending, then by id descending for stability\n items.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime() || b.id.localeCompare(a.id));\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? items.length : start + perPage;\n\n return {\n items: items.slice(start, end),\n pagination: {\n total: items.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : items.length > end,\n },\n };\n }\n\n // --- Dataset version methods ---\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n const id = crypto.randomUUID();\n const dsVersion: DatasetVersion = {\n id,\n datasetId,\n version,\n createdAt: new Date(),\n };\n this.db.datasetVersions.set(id, dsVersion);\n return dsVersion;\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n const versions: DatasetVersion[] = [];\n for (const v of this.db.datasetVersions.values()) {\n if (v.datasetId === input.datasetId) {\n versions.push(v);\n }\n }\n versions.sort((a, b) => b.version - a.version);\n\n const { page, perPage: perPageInput } = input.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? versions.length : start + perPage;\n\n return {\n versions: versions.slice(start, end),\n pagination: {\n total: versions.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : versions.length > end,\n },\n };\n }\n\n // --- Bulk operations (SCD-2 internally) ---\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n const dataset = this.db.datasets.get(input.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // T3.19 — single version increment for all items\n const newVersion = dataset.version + 1;\n this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n const items: DatasetItem[] = [];\n\n for (const itemInput of input.items) {\n const id = crypto.randomUUID();\n const row: DatasetItemRow = {\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: itemInput.input,\n groundTruth: itemInput.groundTruth,\n expectedTrajectory: itemInput.expectedTrajectory,\n requestContext: itemInput.requestContext,\n metadata: itemInput.metadata,\n source: itemInput.source,\n createdAt: now,\n updatedAt: now,\n };\n this.db.datasetItems.set(id, [row]);\n items.push(toDatasetItem(row));\n }\n\n // T3.11 — single dataset version for the bulk operation\n await this.createDatasetVersion(input.datasetId, newVersion);\n\n return items;\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = this.db.datasets.get(input.datasetId);\n if (!dataset) {\n throw new Error(`Dataset not found: ${input.datasetId}`);\n }\n\n // T3.20 — single version increment\n const newVersion = dataset.version + 1;\n this.db.datasets.set(input.datasetId, { ...dataset, version: newVersion });\n\n const now = new Date();\n\n for (const itemId of input.itemIds) {\n const rows = this.db.datasetItems.get(itemId);\n if (!rows) continue;\n\n const currentRow = rows.find(r => r.validTo === null && !r.isDeleted);\n if (!currentRow || currentRow.datasetId !== input.datasetId) continue;\n\n // Close old row\n currentRow.validTo = newVersion;\n\n // Insert tombstone\n rows.push({\n id: itemId,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: currentRow.input,\n groundTruth: currentRow.groundTruth,\n requestContext: currentRow.requestContext,\n metadata: currentRow.metadata,\n createdAt: currentRow.createdAt,\n updatedAt: now,\n });\n }\n\n // T3.11\n await this.createDatasetVersion(input.datasetId, newVersion);\n }\n}\n","import type {\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\n/**\n * Abstract base class for dataset experiments storage domain.\n * Provides the contract for experiment lifecycle and result tracking.\n */\nexport abstract class ExperimentsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'EXPERIMENTS',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n // Experiment lifecycle\n abstract createExperiment(input: CreateExperimentInput): Promise<Experiment>;\n abstract updateExperiment(input: UpdateExperimentInput): Promise<Experiment>;\n abstract getExperimentById(args: { id: string }): Promise<Experiment | null>;\n abstract listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput>;\n abstract deleteExperiment(args: { id: string }): Promise<void>;\n\n // Results (per-item)\n abstract addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult>;\n abstract updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult>;\n abstract getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null>;\n abstract listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput>;\n abstract deleteExperimentResults(args: { experimentId: string }): Promise<void>;\n\n // Aggregation\n abstract getReviewSummary(): Promise<ExperimentReviewCounts[]>;\n}\n","import { calculatePagination, normalizePerPage } from '../../base';\nimport type {\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ExperimentsStorage } from './base';\n\nexport class ExperimentsInMemory extends ExperimentsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.experiments.clear();\n this.db.experimentResults.clear();\n }\n\n // Experiment lifecycle\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n const now = new Date();\n const experiment: Experiment = {\n id: input.id ?? crypto.randomUUID(),\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n agentVersion: input.agentVersion ?? null,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n this.db.experiments.set(experiment.id, experiment);\n return experiment;\n }\n\n async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n const existing = this.db.experiments.get(input.id);\n if (!existing) {\n throw new Error(`Experiment not found: ${input.id}`);\n }\n const updated: Experiment = {\n ...existing,\n status: input.status ?? existing.status,\n totalItems: input.totalItems ?? existing.totalItems,\n succeededCount: input.succeededCount ?? existing.succeededCount,\n failedCount: input.failedCount ?? existing.failedCount,\n skippedCount: input.skippedCount ?? existing.skippedCount,\n startedAt: input.startedAt ?? existing.startedAt,\n completedAt: input.completedAt ?? existing.completedAt,\n name: input.name ?? existing.name,\n description: input.description ?? existing.description,\n metadata: input.metadata ?? existing.metadata,\n updatedAt: new Date(),\n };\n this.db.experiments.set(input.id, updated);\n return updated;\n }\n\n async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n return this.db.experiments.get(args.id) ?? null;\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n let experiments = Array.from(this.db.experiments.values());\n\n // Apply filters\n if (args.datasetId) {\n experiments = experiments.filter(r => r.datasetId === args.datasetId);\n }\n if (args.targetType) {\n experiments = experiments.filter(r => r.targetType === args.targetType);\n }\n if (args.targetId) {\n experiments = experiments.filter(r => r.targetId === args.targetId);\n }\n if (args.agentVersion) {\n experiments = experiments.filter(r => r.agentVersion === args.agentVersion);\n }\n if (args.status) {\n experiments = experiments.filter(r => r.status === args.status);\n }\n\n // Sort by createdAt descending (newest first)\n experiments.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? experiments.length : start + perPage;\n\n return {\n experiments: experiments.slice(start, end),\n pagination: {\n total: experiments.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : experiments.length > end,\n },\n };\n }\n\n async deleteExperiment(args: { id: string }): Promise<void> {\n this.db.experiments.delete(args.id);\n // Also delete associated results\n for (const [resultId, result] of this.db.experimentResults) {\n if (result.experimentId === args.id) {\n this.db.experimentResults.delete(resultId);\n }\n }\n }\n\n // Results (per-item)\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n const now = new Date();\n const result: ExperimentResult = {\n id: input.id ?? crypto.randomUUID(),\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n status: input.status ?? null,\n tags: input.tags ?? null,\n createdAt: now,\n };\n this.db.experimentResults.set(result.id, result);\n return result;\n }\n\n async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n const existing = this.db.experimentResults.get(input.id);\n if (!existing) {\n throw new Error(`Experiment result not found: ${input.id}`);\n }\n if (input.experimentId && existing.experimentId !== input.experimentId) {\n throw new Error(`Experiment result ${input.id} does not belong to experiment ${input.experimentId}`);\n }\n const updated: ExperimentResult = {\n ...existing,\n status: input.status !== undefined ? input.status : existing.status,\n tags: input.tags !== undefined ? input.tags : existing.tags,\n };\n this.db.experimentResults.set(input.id, updated);\n return updated;\n }\n\n async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n return this.db.experimentResults.get(args.id) ?? null;\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n let results = Array.from(this.db.experimentResults.values()).filter(r => r.experimentId === args.experimentId);\n\n // Apply filters\n if (args.traceId) {\n results = results.filter(r => r.traceId === args.traceId);\n }\n if (args.status) {\n results = results.filter(r => r.status === args.status);\n }\n\n // Sort by startedAt ascending (execution order)\n results.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n\n const { page, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? results.length : start + perPage;\n\n return {\n results: results.slice(start, end),\n pagination: {\n total: results.length,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : results.length > end,\n },\n };\n }\n\n async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n for (const [resultId, result] of this.db.experimentResults) {\n if (result.experimentId === args.experimentId) {\n this.db.experimentResults.delete(resultId);\n }\n }\n }\n\n async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n const counts = new Map<string, ExperimentReviewCounts>();\n\n for (const result of this.db.experimentResults.values()) {\n let entry = counts.get(result.experimentId);\n if (!entry) {\n entry = { experimentId: result.experimentId, total: 0, needsReview: 0, reviewed: 0, complete: 0 };\n counts.set(result.experimentId, entry);\n }\n entry.total++;\n if (result.status === 'needs-review') entry.needsReview++;\n else if (result.status === 'reviewed') entry.reviewed++;\n else if (result.status === 'complete') entry.complete++;\n }\n\n return Array.from(counts.values());\n }\n}\n","import type { BackgroundTask } from '../../background-tasks/types';\nimport type { ScoreRowData } from '../../evals/types';\nimport type { StorageThreadType } from '../../memory/types';\nimport type {\n StorageAgentType,\n StorageMCPClientType,\n StorageMCPServerType,\n StorageMessageType,\n StoragePromptBlockType,\n StorageResourceType,\n StorageScorerDefinitionType,\n StorageWorkspaceType,\n StorageSkillType,\n StorageWorkflowRun,\n ObservationalMemoryRecord,\n DatasetRecord,\n DatasetItemRow,\n DatasetVersion,\n Experiment,\n ExperimentResult,\n} from '../types';\nimport type { AgentVersion } from './agents';\nimport type { MCPClientVersion } from './mcp-clients';\nimport type { MCPServerVersion } from './mcp-servers';\nimport type { TraceEntry } from './observability';\nimport type { FeedbackRecord } from './observability/feedback';\nimport type { LogRecord } from './observability/logs';\nimport type { MetricRecord } from './observability/metrics';\nimport type { ScoreRecord } from './observability/scores';\nimport type { PromptBlockVersion } from './prompt-blocks';\nimport type { ScorerDefinitionVersion } from './scorer-definitions';\nimport type { SkillVersion } from './skills';\nimport type { WorkspaceVersion } from './workspaces';\n\n/**\n * InMemoryDB is a thin database layer for in-memory storage.\n * It holds all the Maps that store data, similar to how a real database\n * connection (pg-promise client, libsql client) is shared across domains.\n *\n * Each domain receives a reference to this db and operates on the relevant Maps.\n */\nexport class InMemoryDB {\n readonly threads = new Map<string, StorageThreadType>();\n readonly messages = new Map<string, StorageMessageType>();\n readonly resources = new Map<string, StorageResourceType>();\n readonly workflows = new Map<string, StorageWorkflowRun>();\n readonly scores = new Map<string, ScoreRowData>();\n readonly traces = new Map<string, TraceEntry>();\n readonly metricRecords: MetricRecord[] = [];\n readonly logRecords: LogRecord[] = [];\n readonly scoreRecords: ScoreRecord[] = [];\n readonly feedbackRecords: FeedbackRecord[] = [];\n readonly agents = new Map<string, StorageAgentType>();\n readonly agentVersions = new Map<string, AgentVersion>();\n readonly promptBlocks = new Map<string, StoragePromptBlockType>();\n readonly promptBlockVersions = new Map<string, PromptBlockVersion>();\n readonly scorerDefinitions = new Map<string, StorageScorerDefinitionType>();\n readonly scorerDefinitionVersions = new Map<string, ScorerDefinitionVersion>();\n readonly mcpClients = new Map<string, StorageMCPClientType>();\n readonly mcpClientVersions = new Map<string, MCPClientVersion>();\n readonly mcpServers = new Map<string, StorageMCPServerType>();\n readonly mcpServerVersions = new Map<string, MCPServerVersion>();\n readonly workspaces = new Map<string, StorageWorkspaceType>();\n readonly workspaceVersions = new Map<string, WorkspaceVersion>();\n readonly skills = new Map<string, StorageSkillType>();\n readonly skillVersions = new Map<string, SkillVersion>();\n /** Observational memory records, keyed by resourceId, each holding array of records (generations) */\n readonly observationalMemory = new Map<string, ObservationalMemoryRecord[]>();\n\n // Dataset domain maps\n readonly datasets = new Map<string, DatasetRecord>();\n readonly datasetItems = new Map<string, DatasetItemRow[]>();\n readonly datasetVersions = new Map<string, DatasetVersion>();\n\n // Experiment domain maps\n readonly experiments = new Map<string, Experiment>();\n readonly experimentResults = new Map<string, ExperimentResult>();\n\n // Background tasks domain\n readonly backgroundTasks = new Map<string, BackgroundTask>();\n\n /**\n * Clears all data from all collections.\n * Useful for testing.\n */\n clear(): void {\n this.threads.clear();\n this.messages.clear();\n this.resources.clear();\n this.workflows.clear();\n this.scores.clear();\n this.traces.clear();\n this.metricRecords.length = 0;\n this.logRecords.length = 0;\n this.scoreRecords.length = 0;\n this.feedbackRecords.length = 0;\n this.agents.clear();\n this.agentVersions.clear();\n this.promptBlocks.clear();\n this.promptBlockVersions.clear();\n this.scorerDefinitions.clear();\n this.scorerDefinitionVersions.clear();\n this.mcpClients.clear();\n this.mcpClientVersions.clear();\n this.mcpServers.clear();\n this.mcpServerVersions.clear();\n this.workspaces.clear();\n this.workspaceVersions.clear();\n this.skills.clear();\n this.skillVersions.clear();\n this.observationalMemory.clear();\n this.datasets.clear();\n this.datasetItems.clear();\n this.datasetVersions.clear();\n this.experiments.clear();\n this.experimentResults.clear();\n this.backgroundTasks.clear();\n }\n}\n","import type { MastraMessageContentV2 } from '../../../agent';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport type {\n StorageResourceType,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageOrderBy,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ObservationalMemoryRecord,\n ObservationalMemoryHistoryOptions,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { StorageDomain } from '../base';\n\nfunction isPlainObj(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Constants for metadata key validation\nconst SAFE_METADATA_KEY_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\nconst MAX_METADATA_KEY_LENGTH = 128;\nconst DISALLOWED_METADATA_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\nexport abstract class MemoryStorage extends StorageDomain {\n /**\n * Whether this storage adapter supports Observational Memory.\n * Adapters that implement OM methods should set this to true.\n * Defaults to false for backwards compatibility with custom adapters.\n */\n readonly supportsObservationalMemory?: boolean = false;\n\n constructor() {\n super({\n component: 'STORAGE',\n name: 'MEMORY',\n });\n }\n\n abstract getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null>;\n\n abstract saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType>;\n\n abstract updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType>;\n\n abstract deleteThread({ threadId }: { threadId: string }): Promise<void>;\n\n abstract listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput>;\n\n /**\n * List messages by resource ID only (across all threads).\n * Used by Observational Memory and LongMemEval for resource-scoped queries.\n *\n * @param args - Resource ID and pagination/filtering options\n * @returns Paginated list of messages for the resource\n */\n async listMessagesByResourceId(_args: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n throw new Error(\n `Resource-scoped message listing is not implemented by this storage adapter (${this.constructor.name}). ` +\n `Use an adapter that supports Observational Memory (pg, libsql, mongodb) or disable observational memory.`,\n );\n }\n\n abstract listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n abstract saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }>;\n\n abstract updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]>;\n\n async deleteMessages(_messageIds: string[]): Promise<void> {\n throw new Error(\n `Message deletion is not supported by this storage adapter (${this.constructor.name}). ` +\n `The deleteMessages method needs to be implemented in the storage adapter.`,\n );\n }\n\n /**\n * List threads with optional filtering by resourceId and metadata.\n *\n * @param args - Filter, pagination, and ordering options\n * @param args.filter - Optional filters for resourceId and/or metadata\n * @param args.filter.resourceId - Optional resource ID to filter by\n * @param args.filter.metadata - Optional metadata key-value pairs to filter by (AND logic)\n * @returns Paginated list of threads matching the filters\n */\n abstract listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;\n\n /**\n * Clone a thread and its messages to create a new independent thread.\n * The cloned thread will have clone metadata stored in its metadata field.\n *\n * @param args - Clone configuration options\n * @returns The newly created thread and the cloned messages\n */\n async cloneThread(_args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n throw new Error(\n `Thread cloning is not implemented by this storage adapter (${this.constructor.name}). ` +\n `The cloneThread method needs to be implemented in the storage adapter.`,\n );\n }\n\n async getResourceById(_: { resourceId: string }): Promise<StorageResourceType | null> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n async saveResource(_: { resource: StorageResourceType }): Promise<StorageResourceType> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n async updateResource(_: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n throw new Error(\n `Resource working memory is not implemented by this storage adapter (${this.constructor.name}). ` +\n `This is likely a bug - all Mastra storage adapters should implement resource support. ` +\n `Please report this issue at https://github.com/mastra-ai/mastra/issues`,\n );\n }\n\n protected parseOrderBy(\n orderBy?: StorageOrderBy,\n defaultDirection: ThreadSortDirection = 'DESC',\n ): { field: ThreadOrderBy; direction: ThreadSortDirection } {\n return {\n field: orderBy?.field && orderBy.field in THREAD_ORDER_BY_SET ? orderBy.field : 'createdAt',\n direction:\n orderBy?.direction && orderBy.direction in THREAD_THREAD_SORT_DIRECTION_SET\n ? orderBy.direction\n : defaultDirection,\n };\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n /**\n * Get the current observational memory record for a thread/resource.\n * Returns the most recent active record.\n */\n async getObservationalMemory(\n _threadId: string | null,\n _resourceId: string,\n ): Promise<ObservationalMemoryRecord | null> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Get observational memory history (previous generations).\n * Returns records in reverse chronological order (newest first).\n */\n async getObservationalMemoryHistory(\n _threadId: string | null,\n _resourceId: string,\n _limit?: number,\n _options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Create a new observational memory record.\n * Called when starting observations for a new thread/resource.\n */\n async initializeObservationalMemory(_input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update active observations.\n * Called when observations are created and immediately activated (no buffering).\n */\n async updateActiveObservations(_input: UpdateActiveObservationsInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n // ============================================\n // Buffering Methods (for async observation/reflection)\n // These methods support async buffering when `bufferTokens` is configured.\n // ============================================\n\n /**\n * Update buffered observations.\n * Called when observations are created asynchronously via `bufferTokens`.\n */\n async updateBufferedObservations(_input: UpdateBufferedObservationsInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Swap buffered observations to active.\n * Atomic operation that:\n * 1. Appends bufferedObservations → activeObservations (based on activationRatio)\n * 2. Moves activated bufferedMessageIds → observedMessageIds\n * 3. Keeps remaining buffered content if activationRatio < 100\n * 4. Updates lastObservedAt\n *\n * Returns info about what was activated for UI feedback.\n */\n async swapBufferedToActive(_input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Create a new generation from a reflection.\n * Creates a new record with:\n * - originType: 'reflection'\n * - activeObservations containing the reflection\n * - generationCount incremented from the current record\n */\n async createReflectionGeneration(_input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update buffered reflection (async reflection in progress).\n * Called when reflection runs asynchronously via `bufferTokens`.\n */\n async updateBufferedReflection(_input: UpdateBufferedReflectionInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Swap buffered reflection to active observations.\n * Creates a new generation where activeObservations = bufferedReflection + unreflected observations.\n * The `tokenCount` in input is the processor-computed token count for the combined content.\n */\n async swapBufferedReflectionToActive(\n _input: SwapBufferedReflectionToActiveInput,\n ): Promise<ObservationalMemoryRecord> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isReflecting flag.\n */\n async setReflectingFlag(_id: string, _isReflecting: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isObserving flag.\n */\n async setObservingFlag(_id: string, _isObserving: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isBufferingObservation flag and update lastBufferedAtTokens.\n * Called when async observation buffering starts (true) or ends/fails (false).\n * @param id - Record ID\n * @param isBuffering - Whether buffering is in progress\n * @param lastBufferedAtTokens - The pending token count at which this buffer was triggered (only set when isBuffering=true)\n */\n async setBufferingObservationFlag(_id: string, _isBuffering: boolean, _lastBufferedAtTokens?: number): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the isBufferingReflection flag.\n * Called when async reflection buffering starts (true) or ends/fails (false).\n */\n async setBufferingReflectionFlag(_id: string, _isBuffering: boolean): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Insert a fully-formed observational memory record.\n * Used by thread cloning to copy OM state with remapped IDs.\n */\n async insertObservationalMemoryRecord(_record: ObservationalMemoryRecord): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Clear all observational memory for a thread/resource.\n * Removes all records and history.\n */\n async clearObservationalMemory(_threadId: string | null, _resourceId: string): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Set the pending message token count.\n * Called at the end of each OM processing step to persist the current\n * context window token count so the UI can display it on page load.\n */\n async setPendingMessageTokens(_id: string, _tokenCount: number): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Update the config of an existing observational memory record.\n * The provided config is deep-merged into the record's existing config.\n */\n async updateObservationalMemoryConfig(_input: UpdateObservationalMemoryConfigInput): Promise<void> {\n throw new Error(`Observational memory is not implemented by this storage adapter (${this.constructor.name}).`);\n }\n\n /**\n * Deep-merge two plain objects. Available for subclasses to merge\n * partial config overrides into existing record configs.\n */\n protected deepMergeConfig(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const output: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const tVal = target[key];\n const sVal = source[key];\n if (isPlainObj(tVal) && isPlainObj(sVal)) {\n output[key] = this.deepMergeConfig(tVal, sVal);\n } else if (sVal !== undefined) {\n output[key] = sVal;\n }\n }\n return output;\n }\n\n /**\n * Validates metadata keys to prevent SQL injection attacks and prototype pollution.\n * Keys must start with a letter or underscore, followed by alphanumeric characters or underscores.\n * @param metadata - The metadata object to validate\n * @throws Error if any key contains invalid characters or is a disallowed key\n */\n protected validateMetadataKeys(metadata: Record<string, unknown> | undefined): void {\n if (!metadata) return;\n\n for (const key of Object.keys(metadata)) {\n // First check for disallowed prototype pollution keys\n if (DISALLOWED_METADATA_KEYS.has(key)) {\n throw new Error(`Invalid metadata key: \"${key}\".`);\n }\n\n // Then check pattern\n if (!SAFE_METADATA_KEY_PATTERN.test(key)) {\n throw new Error(\n `Invalid metadata key: \"${key}\". Keys must start with a letter or underscore and contain only alphanumeric characters and underscores.`,\n );\n }\n\n // Also limit key length to prevent potential issues\n if (key.length > MAX_METADATA_KEY_LENGTH) {\n throw new Error(`Metadata key \"${key}\" exceeds maximum length of ${MAX_METADATA_KEY_LENGTH} characters.`);\n }\n }\n }\n\n /**\n * Validates pagination parameters and returns safe offset.\n * @param page - Page number (0-indexed)\n * @param perPage - Items per page (0 is allowed and returns empty results)\n * @throws Error if page is negative, perPage is negative/invalid, or offset would overflow\n */\n protected validatePagination(page: number, perPage: number): void {\n if (!Number.isFinite(page) || !Number.isSafeInteger(page) || page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // perPage: 0 is allowed (returns empty results), negative values are rejected\n if (!Number.isFinite(perPage) || !Number.isSafeInteger(perPage) || perPage < 0) {\n throw new Error('perPage must be >= 0');\n }\n\n // Skip overflow check when perPage is 0 (no offset needed)\n if (perPage === 0) {\n return;\n }\n\n // Prevent overflow when calculating offset\n const offset = page * perPage;\n if (!Number.isSafeInteger(offset) || offset > Number.MAX_SAFE_INTEGER) {\n throw new Error('page value too large');\n }\n }\n\n /**\n * Validates pagination input before normalization.\n * Use this when accepting raw perPageInput (number | false) from callers.\n *\n * When perPage is false (fetch all), page must be 0 since pagination is disabled.\n * When perPage is a number, delegates to validatePagination for full validation.\n *\n * @param page - Page number (0-indexed)\n * @param perPageInput - Items per page as number, or false to fetch all results\n * @throws Error if perPageInput is false and page !== 0\n * @throws Error if perPageInput is invalid (not false or a non-negative safe integer)\n * @throws Error if page is invalid or offset would overflow\n */\n protected validatePaginationInput(page: number, perPageInput: number | false): void {\n // Validate perPageInput type first\n if (perPageInput !== false) {\n if (typeof perPageInput !== 'number' || !Number.isFinite(perPageInput) || !Number.isSafeInteger(perPageInput)) {\n throw new Error('perPage must be false or a safe integer');\n }\n if (perPageInput < 0) {\n throw new Error('perPage must be >= 0');\n }\n }\n\n // When fetching all (perPage: false), only page 0 is valid\n if (perPageInput === false) {\n if (page !== 0) {\n throw new Error('page must be 0 when perPage is false');\n }\n // Still validate page is a valid integer\n if (!Number.isFinite(page) || !Number.isSafeInteger(page)) {\n throw new Error('page must be >= 0');\n }\n return;\n }\n\n // For numeric perPage, delegate to existing validation\n this.validatePagination(page, perPageInput);\n }\n}\n\nconst THREAD_ORDER_BY_SET: Record<ThreadOrderBy, true> = {\n createdAt: true,\n updatedAt: true,\n};\n\nconst THREAD_THREAD_SORT_DIRECTION_SET: Record<ThreadSortDirection, true> = {\n ASC: true,\n DESC: true,\n};\n","import { MessageList } from '../../../agent/message-list';\nimport type { MastraDBMessage, StorageThreadType } from '../../../memory/types';\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n StorageMessageType,\n StorageResourceType,\n ThreadOrderBy,\n ThreadSortDirection,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n ObservationalMemoryHistoryOptions,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n UpdateObservationalMemoryConfigInput,\n} from '../../types';\nimport { filterByDateRange, jsonValueEquals, safelyParseJSON } from '../../utils';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { MemoryStorage } from './base';\n\nexport class InMemoryMemory extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.threads.clear();\n this.db.messages.clear();\n this.db.resources.clear();\n this.db.observationalMemory.clear();\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const thread = this.db.threads.get(threadId);\n return thread ? { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata } : null;\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n const key = thread.id;\n this.db.threads.set(key, thread);\n return 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 const thread = this.db.threads.get(id);\n\n if (!thread) {\n throw new Error(`Thread with id ${id} not found`);\n }\n\n if (thread) {\n thread.title = title;\n thread.metadata = { ...thread.metadata, ...metadata };\n thread.updatedAt = new Date();\n }\n return thread;\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n this.db.threads.delete(threadId);\n\n this.db.messages.forEach((msg, key) => {\n if (msg.thread_id === threadId) {\n this.db.messages.delete(key);\n }\n });\n }\n\n async listMessages({\n threadId,\n resourceId: optionalResourceId,\n include,\n filter,\n perPage: perPageInput,\n page = 0,\n orderBy,\n }: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new Error('threadId must be a non-empty string or array of non-empty strings');\n }\n\n const threadIdSet = new Set(threadIds);\n\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n const perPage = normalizePerPage(perPageInput, 40);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values that could cause performance issues\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Calculate offset from page\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Step 1: Get messages matching threadId(s) and optionally resourceId\n let threadMessages = Array.from(this.db.messages.values()).filter((msg: any) => {\n // Message must be in one of the specified threads\n if (threadIdSet && !threadIdSet.has(msg.thread_id)) return false;\n // If optionalResourceId provided, message must match it\n if (optionalResourceId && msg.resourceId !== optionalResourceId) return false;\n return true;\n });\n\n // Apply date filtering\n threadMessages = filterByDateRange(threadMessages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n // Sort thread messages before pagination\n threadMessages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Get total count of thread messages (for pagination metadata)\n const totalThreadMessages = threadMessages.length;\n\n // Apply pagination to thread messages\n const start = offset;\n const end = start + perPage;\n const paginatedThreadMessages = threadMessages.slice(start, end);\n\n // Convert paginated thread messages to MastraDBMessage\n const messages: MastraDBMessage[] = [];\n const messageIds = new Set<string>();\n\n for (const msg of paginatedThreadMessages) {\n const convertedMessage = this.parseStoredMessage(msg);\n messages.push(convertedMessage);\n messageIds.add(msg.id);\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n if (include && include.length > 0) {\n for (const includeItem of include) {\n const targetMessage = this.db.messages.get(includeItem.id);\n if (targetMessage) {\n // Convert StorageMessageType to MastraDBMessage\n const convertedMessage = {\n id: targetMessage.id,\n threadId: targetMessage.thread_id,\n content: safelyParseJSON(targetMessage.content),\n role: targetMessage.role as 'user' | 'assistant' | 'system' | 'tool',\n type: targetMessage.type,\n createdAt: targetMessage.createdAt,\n resourceId: targetMessage.resourceId,\n } as MastraDBMessage;\n\n // Only add if not already in messages array (deduplication)\n if (!messageIds.has(convertedMessage.id)) {\n messages.push(convertedMessage);\n messageIds.add(convertedMessage.id);\n }\n\n // Add previous messages if requested\n if (includeItem.withPreviousMessages) {\n const allThreadMessages = Array.from(this.db.messages.values())\n .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n if (targetIndex !== -1) {\n const startIndex = Math.max(0, targetIndex - (includeItem.withPreviousMessages || 0));\n for (let i = startIndex; i < targetIndex; i++) {\n const message = allThreadMessages[i];\n if (message && !messageIds.has(message.id)) {\n const convertedPrevMessage = {\n id: message.id,\n threadId: message.thread_id,\n content: safelyParseJSON(message.content),\n role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n type: message.type,\n createdAt: message.createdAt,\n resourceId: message.resourceId,\n } as MastraDBMessage;\n messages.push(convertedPrevMessage);\n messageIds.add(message.id);\n }\n }\n }\n }\n\n // Add next messages if requested\n if (includeItem.withNextMessages) {\n const allThreadMessages = Array.from(this.db.messages.values())\n .filter((msg: any) => msg.thread_id === (includeItem.threadId || threadId))\n .sort((a: any, b: any) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n const targetIndex = allThreadMessages.findIndex(msg => msg.id === includeItem.id);\n if (targetIndex !== -1) {\n const endIndex = Math.min(\n allThreadMessages.length,\n targetIndex + (includeItem.withNextMessages || 0) + 1,\n );\n for (let i = targetIndex + 1; i < endIndex; i++) {\n const message = allThreadMessages[i];\n if (message && !messageIds.has(message.id)) {\n const convertedNextMessage = {\n id: message.id,\n threadId: message.thread_id,\n content: safelyParseJSON(message.content),\n role: message.role as 'user' | 'assistant' | 'system' | 'tool',\n type: message.type,\n createdAt: message.createdAt,\n resourceId: message.resourceId,\n } as MastraDBMessage;\n messages.push(convertedNextMessage);\n messageIds.add(message.id);\n }\n }\n }\n }\n }\n }\n }\n\n // Sort all messages (paginated + included) for final output\n messages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Calculate hasMore\n let hasMore;\n if (include && include.length > 0) {\n // When using include, check if we've returned all messages from the thread\n // because include might bring in messages beyond the pagination window\n const returnedThreadMessageIds = new Set(messages.filter(m => m.threadId === threadId).map(m => m.id));\n hasMore = returnedThreadMessageIds.size < totalThreadMessages;\n } else {\n // Standard pagination: check if there are more pages\n hasMore = end < totalThreadMessages;\n }\n\n return {\n messages,\n total: totalThreadMessages,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n async listMessagesByResourceId({\n resourceId,\n filter,\n perPage: perPageInput,\n page = 0,\n orderBy,\n }: StorageListMessagesByResourceIdInput): Promise<StorageListMessagesOutput> {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 40)\n const perPage = normalizePerPage(perPageInput, 40);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values that could cause performance issues\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n // Get all messages matching the resourceId (across all threads)\n let messages = Array.from(this.db.messages.values()).filter((msg: any) => msg.resourceId === resourceId);\n\n // Apply date filtering\n messages = filterByDateRange(messages, (msg: any) => new Date(msg.createdAt), filter?.dateRange);\n\n // Sort messages\n messages.sort((a: any, b: any) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n // Get total count for pagination\n const total = messages.length;\n\n // Apply pagination\n const paginatedMessages = messages.slice(offset, offset + perPage);\n\n const list = new MessageList().add(\n paginatedMessages.map(m => this.parseStoredMessage(m)),\n 'memory',\n );\n\n const hasMore = offset + paginatedMessages.length < total;\n\n return {\n messages: list.get.all.db(),\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n }\n\n protected parseStoredMessage(message: StorageMessageType): MastraDBMessage {\n const { resourceId, content, role, thread_id, ...rest } = message;\n\n // Parse content using safelyParseJSON utility\n let parsedContent = safelyParseJSON(content);\n\n // If the result is a plain string (V1 format), wrap it in V2 structure\n if (typeof parsedContent === 'string') {\n parsedContent = {\n format: 2,\n content: parsedContent,\n parts: [{ type: 'text', text: parsedContent }],\n };\n }\n\n return {\n ...rest,\n threadId: thread_id,\n ...(message.resourceId && { resourceId: message.resourceId }),\n content: parsedContent,\n role: role as MastraDBMessage['role'],\n } satisfies MastraDBMessage;\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n const rawMessages = messageIds.map(id => this.db.messages.get(id)).filter(message => !!message);\n\n const list = new MessageList().add(\n rawMessages.map(m => this.parseStoredMessage(m)),\n 'memory',\n );\n return { messages: list.get.all.db() };\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n // Simulate error handling for testing - check before saving\n if (messages.some(msg => msg.id === 'error-message' || msg.resourceId === null)) {\n throw new Error('Simulated error for testing');\n }\n\n // Update thread timestamps for each unique threadId\n const threadIds = new Set(messages.map(msg => msg.threadId).filter((id): id is string => Boolean(id)));\n for (const threadId of threadIds) {\n const thread = this.db.threads.get(threadId);\n if (thread) {\n thread.updatedAt = new Date();\n }\n }\n\n for (const message of messages) {\n const key = message.id;\n // Convert MastraDBMessage to StorageMessageType\n const storageMessage: StorageMessageType = {\n id: message.id,\n thread_id: message.threadId || '',\n content: JSON.stringify(message.content),\n role: message.role || 'user',\n type: message.type || 'text',\n createdAt: message.createdAt,\n resourceId: message.resourceId || null,\n };\n this.db.messages.set(key, storageMessage);\n }\n\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n }\n\n async updateMessages(args: { messages: (Partial<MastraDBMessage> & { id: string })[] }): Promise<MastraDBMessage[]> {\n const updatedMessages: MastraDBMessage[] = [];\n for (const update of args.messages) {\n const storageMsg = this.db.messages.get(update.id);\n if (!storageMsg) continue;\n\n // Track old threadId for possible move\n const oldThreadId = storageMsg.thread_id;\n const newThreadId = update.threadId || oldThreadId;\n let threadIdChanged = false;\n if (update.threadId && update.threadId !== oldThreadId) {\n threadIdChanged = true;\n }\n\n // Update fields\n if (update.role !== undefined) storageMsg.role = update.role;\n if (update.type !== undefined) storageMsg.type = update.type;\n if (update.createdAt !== undefined) storageMsg.createdAt = update.createdAt;\n if (update.resourceId !== undefined) storageMsg.resourceId = update.resourceId;\n // Deep merge content if present\n if (update.content !== undefined) {\n let oldContent = safelyParseJSON(storageMsg.content);\n let newContent = update.content;\n if (typeof newContent === 'object' && typeof oldContent === 'object') {\n // Deep merge for metadata/content fields\n newContent = { ...oldContent, ...newContent };\n if (oldContent.metadata && newContent.metadata) {\n newContent.metadata = { ...oldContent.metadata, ...newContent.metadata };\n }\n }\n storageMsg.content = JSON.stringify(newContent);\n }\n // Handle threadId change\n if (threadIdChanged) {\n storageMsg.thread_id = newThreadId;\n // Update updatedAt for both threads, ensuring strictly greater and not equal\n const base = Date.now();\n let oldThreadNewTime: number | undefined;\n const oldThread = this.db.threads.get(oldThreadId);\n if (oldThread) {\n const prev = new Date(oldThread.updatedAt).getTime();\n oldThreadNewTime = Math.max(base, prev + 1);\n oldThread.updatedAt = new Date(oldThreadNewTime);\n }\n const newThread = this.db.threads.get(newThreadId);\n if (newThread) {\n const prev = new Date(newThread.updatedAt).getTime();\n let newThreadNewTime = Math.max(base + 1, prev + 1);\n if (oldThreadNewTime !== undefined && newThreadNewTime <= oldThreadNewTime) {\n newThreadNewTime = oldThreadNewTime + 1;\n }\n newThread.updatedAt = new Date(newThreadNewTime);\n }\n } else {\n // Only update the thread's updatedAt if not a move\n const thread = this.db.threads.get(oldThreadId);\n if (thread) {\n const prev = new Date(thread.updatedAt).getTime();\n let newTime = Date.now();\n if (newTime <= prev) newTime = prev + 1;\n thread.updatedAt = new Date(newTime);\n }\n }\n // Save the updated message\n this.db.messages.set(update.id, storageMsg);\n // Return as MastraDBMessage\n updatedMessages.push({\n id: storageMsg.id,\n threadId: storageMsg.thread_id,\n content: safelyParseJSON(storageMsg.content),\n role: storageMsg.role === 'user' || storageMsg.role === 'assistant' ? storageMsg.role : 'user',\n type: storageMsg.type,\n createdAt: storageMsg.createdAt,\n resourceId: storageMsg.resourceId === null ? undefined : storageMsg.resourceId,\n });\n }\n return updatedMessages;\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n // Collect thread IDs to update\n const threadIds = new Set<string>();\n\n for (const messageId of messageIds) {\n const message = this.db.messages.get(messageId);\n if (message && message.thread_id) {\n threadIds.add(message.thread_id);\n }\n // Delete the message\n this.db.messages.delete(messageId);\n }\n\n // Update thread timestamps\n const now = new Date();\n for (const threadId of threadIds) {\n const thread = this.db.threads.get(threadId);\n if (thread) {\n thread.updatedAt = now;\n }\n }\n }\n\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy);\n\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Start with all threads\n let threads = Array.from(this.db.threads.values());\n\n // Apply resourceId filter if provided\n if (filter?.resourceId) {\n threads = threads.filter((t: any) => t.resourceId === filter.resourceId);\n }\n\n // Validate metadata keys before filtering\n this.validateMetadataKeys(filter?.metadata);\n\n // Apply metadata filter if provided (AND logic - all key-value pairs must match)\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n threads = threads.filter(thread => {\n if (!thread.metadata) return false;\n return Object.entries(filter.metadata!).every(([key, value]) => jsonValueEquals(thread.metadata![key], value));\n });\n }\n\n const sortedThreads = this.sortThreads(threads, field, direction);\n const clonedThreads = sortedThreads.map(thread => ({\n ...thread,\n metadata: thread.metadata ? { ...thread.metadata } : thread.metadata,\n })) as StorageThreadType[];\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n threads: clonedThreads.slice(offset, offset + perPage),\n total: clonedThreads.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < clonedThreads.length,\n };\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const resource = this.db.resources.get(resourceId);\n return resource\n ? { ...resource, metadata: resource.metadata ? { ...resource.metadata } : resource.metadata }\n : null;\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n this.db.resources.set(resource.id, resource);\n return 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 let resource = this.db.resources.get(resourceId);\n\n if (!resource) {\n // Create new resource if it doesn't exist\n resource = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n } else {\n resource = {\n ...resource,\n workingMemory: workingMemory !== undefined ? workingMemory : resource.workingMemory,\n metadata: {\n ...resource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n }\n\n this.db.resources.set(resourceId, resource);\n return resource;\n }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = this.db.threads.get(sourceThreadId);\n if (!sourceThread) {\n throw new Error(`Source thread with id ${sourceThreadId} not found`);\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n if (this.db.threads.has(newThreadId)) {\n throw new Error(`Thread with id ${newThreadId} already exists`);\n }\n\n // Get messages from the source thread\n let sourceMessages = Array.from(this.db.messages.values())\n .filter((msg: StorageMessageType) => msg.thread_id === sourceThreadId)\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());\n\n // Apply message filters if provided\n if (options?.messageFilter) {\n const { startDate, endDate, messageIds } = options.messageFilter;\n\n if (messageIds && messageIds.length > 0) {\n const messageIdSet = new Set(messageIds);\n sourceMessages = sourceMessages.filter(msg => messageIdSet.has(msg.id));\n }\n\n if (startDate) {\n sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) >= startDate);\n }\n\n if (endDate) {\n sourceMessages = sourceMessages.filter(msg => new Date(msg.createdAt) <= endDate);\n }\n }\n\n // Apply message limit (take from the end to get most recent)\n if (options?.messageLimit && options.messageLimit > 0 && sourceMessages.length > options.messageLimit) {\n sourceMessages = sourceMessages.slice(-options.messageLimit);\n }\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Save the new thread\n this.db.threads.set(newThreadId, newThread);\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const messageIdMap: Record<string, string> = {};\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n messageIdMap[sourceMsg.id] = newMessageId;\n const parsedContent = safelyParseJSON(sourceMsg.content);\n\n // Create storage message\n const newStorageMessage: StorageMessageType = {\n id: newMessageId,\n thread_id: newThreadId,\n content: sourceMsg.content,\n role: sourceMsg.role,\n type: sourceMsg.type,\n createdAt: sourceMsg.createdAt,\n resourceId: resourceId || sourceMsg.resourceId,\n };\n\n this.db.messages.set(newMessageId, newStorageMessage);\n\n // Create MastraDBMessage for return\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: sourceMsg.role as MastraDBMessage['role'],\n type: sourceMsg.type,\n createdAt: sourceMsg.createdAt,\n resourceId: resourceId || sourceMsg.resourceId || undefined,\n });\n }\n\n return {\n thread: newThread,\n clonedMessages,\n messageIdMap,\n };\n }\n\n private sortThreads(threads: any[], field: ThreadOrderBy, direction: ThreadSortDirection): any[] {\n return threads.sort((a, b) => {\n const isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date(a[field]).getTime() : a[field];\n const bValue = isDateField ? new Date(b[field]).getTime() : b[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n if (direction === 'ASC') {\n return aValue - bValue;\n } else {\n return bValue - aValue;\n }\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n }\n\n // ============================================\n // Observational Memory Implementation\n // ============================================\n\n private getObservationalMemoryKey(threadId: string | null, resourceId: string): string {\n if (threadId) {\n return `thread:${threadId}`;\n }\n return `resource:${resourceId}`;\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n const records = this.db.observationalMemory.get(key);\n return records?.[0] ?? null;\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit?: number,\n options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n let records = this.db.observationalMemory.get(key) ?? [];\n\n if (options?.from) {\n records = records.filter(r => r.createdAt >= options.from!);\n }\n if (options?.to) {\n records = records.filter(r => r.createdAt <= options.to!);\n }\n if (options?.offset != null) {\n records = records.slice(options.offset);\n }\n\n return limit != null ? records.slice(0, limit) : records;\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n const { threadId, resourceId, scope, config, observedTimezone } = input;\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n const now = new Date();\n\n const record: ObservationalMemoryRecord = {\n id: crypto.randomUUID(),\n scope,\n threadId,\n resourceId,\n // Timestamps at top level\n createdAt: now,\n updatedAt: now,\n // lastObservedAt starts undefined - all messages are \"unobserved\" initially\n // This ensures historical data (like LongMemEval fixtures) works correctly\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n // Buffering (for async observation/reflection)\n bufferedObservations: undefined,\n bufferedReflection: undefined,\n // Message tracking\n // Note: Message ID tracking removed in favor of cursor-based lastObservedAt\n // Token tracking\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n // State flags\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n // Configuration\n config,\n // Timezone used for observation date formatting\n observedTimezone,\n // Extensible metadata (optional)\n metadata: {},\n };\n\n // Add as first record (most recent)\n const existing = this.db.observationalMemory.get(key) ?? [];\n this.db.observationalMemory.set(key, [record, ...existing]);\n\n return record;\n }\n\n async insertObservationalMemoryRecord(record: ObservationalMemoryRecord): Promise<void> {\n const key = this.getObservationalMemoryKey(record.threadId, record.resourceId);\n const existing = this.db.observationalMemory.get(key) ?? [];\n // Insert in order by generationCount descending (newest first)\n let inserted = false;\n for (let i = 0; i < existing.length; i++) {\n if (record.generationCount >= existing[i]!.generationCount) {\n existing.splice(i, 0, record);\n inserted = true;\n break;\n }\n }\n if (!inserted) existing.push(record);\n this.db.observationalMemory.set(key, existing);\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n const { id, observations, tokenCount, lastObservedAt, observedMessageIds } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.activeObservations = observations;\n record.observationTokenCount = tokenCount;\n record.totalTokensObserved += tokenCount;\n // Reset pending tokens since we've now observed them\n record.pendingMessageTokens = 0;\n\n // Update timestamps (top-level, not in metadata)\n record.lastObservedAt = lastObservedAt;\n record.updatedAt = new Date();\n\n // Store observed message IDs as safeguard against re-observation\n if (observedMessageIds) {\n record.observedMessageIds = observedMessageIds;\n }\n }\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n const { id, chunk } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n // Create a new chunk with generated id and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${crypto.randomUUID()}`,\n cycleId: chunk.cycleId,\n observations: chunk.observations,\n tokenCount: chunk.tokenCount,\n messageIds: chunk.messageIds,\n messageTokens: chunk.messageTokens,\n lastObservedAt: chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: chunk.suggestedContinuation,\n currentTask: chunk.currentTask,\n threadTitle: chunk.threadTitle,\n };\n\n // Add chunk to the array\n const existingChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n record.bufferedObservationChunks = [...existingChunks, newChunk];\n\n if (input.lastBufferedAtTime) {\n record.lastBufferedAtTime = input.lastBufferedAtTime;\n }\n\n record.updatedAt = new Date();\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n const { id, activationRatio, lastObservedAt } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n // Use caller-provided refreshed chunks (with up-to-date token weights) for\n // activation math, falling back to persisted chunks otherwise.\n // Keep refreshed chunks local — don't overwrite the stored buffer.\n const persistedChunks = Array.isArray(record.bufferedObservationChunks) ? record.bufferedObservationChunks : [];\n const chunks = Array.isArray(input.bufferedChunks) ? input.bufferedChunks : persistedChunks;\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target: how many message tokens to remove so that\n // (1 - activationRatio) * threshold worth of raw messages remain.\n // e.g., ratio=0.8, threshold=5000, pending=6000 → remove 6000 - 1000 = 5000\n const retentionFloor = input.messageTokensThreshold * (1 - activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased over (prefer removing\n // slightly more than the target so remaining context lands at or below retentionFloor).\n // Track both best-over and best-under boundaries so we can fall back to under\n // if the over boundary would overshoot by too much.\n let cumulativeMessageTokens = 0;\n let bestOverBoundary = 0;\n let bestOverTokens = 0;\n let bestUnderBoundary = 0;\n let bestUnderTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n if (cumulativeMessageTokens >= targetMessageTokens) {\n // Over or equal — track the closest (lowest) over boundary\n if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n // Under — track the closest (highest) under boundary\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n // Safeguard: if the over boundary would eat into more than 95% of the\n // retention floor, fall back to the best under boundary instead.\n // This prevents edge cases where a large chunk overshoots dramatically.\n // When forceMaxActivation is set (above blockAfter), still prefer the over\n // boundary, but never if it would leave fewer than the smaller of 1000\n // tokens or the retention floor remaining.\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;\n // When activationRatio ≈ 1.0, retentionFloor is 0 and minRemaining becomes 0 — intentional for \"activate everything\" configs.\n const minRemaining = Math.min(1000, retentionFloor);\n\n let chunksToActivate: number;\n if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n chunksToActivate = bestUnderBoundary;\n } else if (bestOverBoundary > 0) {\n // All boundaries are over and exceed the safeguard — still activate\n // the closest over boundary (better than nothing)\n chunksToActivate = bestOverBoundary;\n } else {\n chunksToActivate = 1;\n }\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated chunks into content\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const derivedLastObservedAt =\n lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n\n // Append activated content to active observations with message boundary for cache stability\n if (record.activeObservations) {\n const boundary = `\\n\\n--- message boundary (${derivedLastObservedAt.toISOString()}) ---\\n\\n`;\n record.activeObservations = `${record.activeObservations}${boundary}${activatedContent}`;\n } else {\n record.activeObservations = activatedContent;\n }\n\n // Update observation token count\n record.observationTokenCount = (record.observationTokenCount ?? 0) + activatedTokens;\n\n // Decrement pending message tokens (clamped to zero)\n record.pendingMessageTokens = Math.max(0, (record.pendingMessageTokens ?? 0) - activatedMessageTokens);\n\n // NOTE: We intentionally do NOT add activatedMessageIds to record.observedMessageIds.\n // observedMessageIds is used by getUnobservedMessages to filter future messages.\n // Since AI SDK may reuse message IDs for new content, adding them here would\n // permanently block new content from being observed. Instead, we return\n // activatedMessageIds so the caller can remove them from messageList directly.\n\n // Update buffered state with remaining chunks\n record.bufferedObservationChunks = remainingChunks.length > 0 ? remainingChunks : undefined;\n\n // Update timestamps\n record.lastObservedAt = derivedLastObservedAt;\n record.updatedAt = new Date();\n\n // Use hints from the most recent activated chunk only — stale hints from older chunks are discarded\n const latestChunkHints = activatedChunks[activatedChunks.length - 1];\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n suggestedContinuation: latestChunkHints?.suggestedContinuation ?? undefined,\n currentTask: latestChunkHints?.currentTask ?? undefined,\n };\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n const { currentRecord, reflection, tokenCount } = input;\n const key = this.getObservationalMemoryKey(currentRecord.threadId, currentRecord.resourceId);\n const now = new Date();\n\n const newRecord: ObservationalMemoryRecord = {\n id: crypto.randomUUID(),\n scope: currentRecord.scope,\n threadId: currentRecord.threadId,\n resourceId: currentRecord.resourceId,\n // Timestamps at top level\n createdAt: now,\n updatedAt: now,\n lastObservedAt: currentRecord.lastObservedAt ?? now, // Carry over from observation (which always runs before reflection)\n originType: 'reflection',\n generationCount: currentRecord.generationCount + 1,\n activeObservations: reflection,\n config: currentRecord.config,\n totalTokensObserved: currentRecord.totalTokensObserved,\n observationTokenCount: tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n // Timezone used for observation date formatting\n observedTimezone: currentRecord.observedTimezone,\n // Extensible metadata (optional)\n metadata: {},\n };\n\n // Add as first record (most recent)\n const existing = this.db.observationalMemory.get(key) ?? [];\n this.db.observationalMemory.set(key, [newRecord, ...existing]);\n\n return newRecord;\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n const { id, reflection, tokenCount, inputTokenCount, reflectedObservationLineCount } = input;\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n const existing = record.bufferedReflection || '';\n record.bufferedReflection = existing ? `${existing}\\n\\n${reflection}` : reflection;\n record.bufferedReflectionTokens = (record.bufferedReflectionTokens || 0) + tokenCount;\n record.bufferedReflectionInputTokens = (record.bufferedReflectionInputTokens || 0) + inputTokenCount;\n record.reflectedObservationLineCount = reflectedObservationLineCount;\n record.updatedAt = new Date();\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n const { currentRecord } = input;\n const record = this.findObservationalMemoryRecordById(currentRecord.id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${currentRecord.id}`);\n }\n\n if (!record.bufferedReflection) {\n throw new Error('No buffered reflection to swap');\n }\n\n const bufferedReflection = record.bufferedReflection;\n const reflectedLineCount = record.reflectedObservationLineCount ?? 0;\n\n // Split current activeObservations by the boundary line count.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = record.activeObservations ?? '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent ? `${bufferedReflection}\\n\\n${unreflectedContent}` : bufferedReflection;\n\n // Create a new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: record,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n record.bufferedReflection = undefined;\n record.bufferedReflectionTokens = undefined;\n record.bufferedReflectionInputTokens = undefined;\n record.reflectedObservationLineCount = undefined;\n\n return newRecord;\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isReflecting = isReflecting;\n record.updatedAt = new Date();\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isObserving = isObserving;\n record.updatedAt = new Date();\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isBufferingObservation = isBuffering;\n if (lastBufferedAtTokens !== undefined) {\n record.lastBufferedAtTokens = lastBufferedAtTokens;\n }\n record.updatedAt = new Date();\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.isBufferingReflection = isBuffering;\n record.updatedAt = new Date();\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n this.db.observationalMemory.delete(key);\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n const record = this.findObservationalMemoryRecordById(id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${id}`);\n }\n\n record.pendingMessageTokens = tokenCount;\n record.updatedAt = new Date();\n }\n\n async updateObservationalMemoryConfig(input: UpdateObservationalMemoryConfigInput): Promise<void> {\n const record = this.findObservationalMemoryRecordById(input.id);\n if (!record) {\n throw new Error(`Observational memory record not found: ${input.id}`);\n }\n\n record.config = this.deepMergeConfig(record.config as Record<string, unknown>, input.config);\n record.updatedAt = new Date();\n }\n\n /**\n * Helper to find an observational memory record by ID across all keys\n */\n private findObservationalMemoryRecordById(id: string): ObservationalMemoryRecord | null {\n for (const records of this.db.observationalMemory.values()) {\n const record = records.find(r => r.id === id);\n if (record) return record;\n }\n return null;\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport type { StoragePagination } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class ScoresStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'SCORES',\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n // Default no-op - subclasses override\n }\n\n abstract getScoreById({ id }: { id: string }): Promise<ScoreRowData | null>;\n\n abstract saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }>;\n\n abstract 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<ListScoresResponse>;\n\n abstract listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse>;\n\n abstract listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse>;\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination: _pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n throw new MastraError({\n id: 'SCORES_STORAGE_GET_SCORES_BY_SPAN_NOT_IMPLEMENTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: { traceId, spanId },\n });\n }\n}\n","import type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '../../../evals/types';\nimport { calculatePagination, normalizePerPage } from '../../base';\nimport type { StoragePagination } from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ScoresStorage } from './base';\n\nexport class ScoresInMemory extends ScoresStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.scores.clear();\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.db.scores.get(id) ?? null;\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n const newScore = { id: crypto.randomUUID(), createdAt: new Date(), updatedAt: new Date(), ...score };\n this.db.scores.set(newScore.id, newScore);\n return { score: newScore };\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<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => {\n let baseFilter = score.scorerId === scorerId;\n\n if (entityId) {\n baseFilter = baseFilter && score.entityId === entityId;\n }\n\n if (entityType) {\n baseFilter = baseFilter && score.entityType === entityType;\n }\n\n if (source) {\n baseFilter = baseFilter && score.source === source;\n }\n\n return baseFilter;\n });\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => score.runId === runId);\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER); // false → MAX_SAFE_INTEGER\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n entityId: string;\n entityType: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(score => {\n const baseFilter = score.entityId === entityId && score.entityType === entityType;\n\n return baseFilter;\n });\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n const scores = Array.from(this.db.scores.values()).filter(\n score => score.traceId === traceId && score.spanId === spanId,\n );\n scores.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, Number.MAX_SAFE_INTEGER);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const end = perPageInput === false ? scores.length : start + perPage;\n\n return {\n scores: scores.slice(start, end),\n pagination: {\n total: scores.length,\n page: page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : scores.length > end,\n },\n };\n }\n}\n","/**\n * Types and utilities for evented workflow execution.\n */\n\n/**\n * String key used to mark pending forEach iterations.\n * Using a string key (not Symbol) ensures the marker survives JSON serialization\n * which is critical for distributed execution where state is persisted to storage\n * and loaded by different engine instances.\n */\nexport const PENDING_MARKER_KEY = '__mastra_pending__' as const;\n\n/**\n * Type for the pending marker object used in forEach iteration tracking.\n */\nexport type PendingMarker = { [PENDING_MARKER_KEY]: true };\n\n/**\n * Creates a new pending marker object.\n * Used to mark forEach iterations that are about to be resumed.\n */\nexport function createPendingMarker(): PendingMarker {\n return { [PENDING_MARKER_KEY]: true };\n}\n\n/**\n * Type guard to check if a value is a pending marker.\n * Works correctly after JSON serialization/deserialization.\n * @param val - The value to check\n * @returns True if the value is a PendingMarker\n */\nexport function isPendingMarker(val: unknown): val is PendingMarker {\n return (\n val !== null &&\n typeof val === 'object' &&\n PENDING_MARKER_KEY in val &&\n (val as Record<string, unknown>)[PENDING_MARKER_KEY] === true\n );\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport type { UpdateWorkflowStateOptions, WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '../../types';\nimport { StorageDomain } from '../base';\n\nexport abstract class WorkflowsStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'WORKFLOWS',\n });\n }\n\n abstract supportsConcurrentUpdates(): boolean;\n\n abstract 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\n abstract updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined>;\n\n abstract persistWorkflowSnapshot(_: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void>;\n\n abstract loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null>;\n\n abstract listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns>;\n\n abstract getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<WorkflowRun | null>;\n\n abstract deleteWorkflowRunById(args: { runId: string; workflowName: string }): Promise<void>;\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport { isPendingMarker } from '../../../workflows/evented/types';\nimport { normalizePerPage } from '../../base';\nimport type {\n StorageWorkflowRun,\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { WorkflowsStorage } from './base';\n\nexport class WorkflowsInMemory extends WorkflowsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.workflows.clear();\n }\n\n private getWorkflowKey(workflowName: string, runId: string): string {\n return `${workflowName}-${runId}`;\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 const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return {};\n }\n\n let snapshot: WorkflowRunState;\n if (!run.snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: run.run_id,\n } as WorkflowRunState;\n\n this.db.workflows.set(key, {\n ...run,\n snapshot,\n });\n } else {\n snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n }\n\n if (!snapshot || !snapshot?.context) {\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n // For foreach steps with array outputs, merge the arrays atomically\n // This handles concurrent iteration completions\n const existingResult = snapshot.context[stepId];\n if (\n existingResult &&\n 'output' in existingResult &&\n Array.isArray(existingResult.output) &&\n result &&\n typeof result === 'object' &&\n 'output' in result &&\n Array.isArray(result.output)\n ) {\n const existingOutput = existingResult.output as unknown[];\n const newOutput = result.output as unknown[];\n // ForEach iteration result merge logic:\n //\n // When forEach runs with concurrency > 1, multiple iterations execute in parallel.\n // Each iteration writes its result to the same output array. We need to merge carefully:\n //\n // - null in newOutput means \"iteration started but not finished\" - keep existing result\n // - non-null in newOutput means \"iteration completed\" - use the new result\n // - PendingMarker ({ __mastra_pending__: true }) means \"force reset to null\"\n //\n // The PendingMarker is needed for bulk resume: when resuming suspended iterations,\n // we must reset them to null before re-running. Without the marker, the merge logic\n // would preserve the old suspended result (since null means \"keep existing\").\n //\n // Why a string key instead of Symbol? Symbols don't survive JSON serialization.\n // In distributed execution where state is persisted to storage and loaded by\n // different engine instances, a Symbol marker would be silently dropped.\n const mergedOutput = [...existingOutput];\n for (let i = 0; i < Math.max(existingOutput.length, newOutput.length); i++) {\n if (i < newOutput.length) {\n const newVal = newOutput[i];\n if (isPendingMarker(newVal)) {\n // PendingMarker: force reset to null (for bulk resume of suspended iterations)\n mergedOutput[i] = null;\n } else if (newVal !== null) {\n // Completed result: always use the new value\n mergedOutput[i] = newVal;\n }\n // null: iteration in progress, keep existing result (from spread above)\n }\n // Index beyond newOutput length: keep existing (from spread above)\n }\n snapshot.context[stepId] = {\n ...existingResult,\n ...(result as any),\n output: mergedOutput,\n };\n } else {\n snapshot.context[stepId] = result;\n }\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n this.db.workflows.set(key, {\n ...run,\n snapshot: snapshot,\n });\n\n return JSON.parse(JSON.stringify(snapshot.context));\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return;\n }\n\n let snapshot: WorkflowRunState;\n if (!run.snapshot) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n value: {},\n waitingPaths: {},\n status: 'pending',\n runId: run.run_id,\n } as WorkflowRunState;\n\n this.db.workflows.set(key, {\n ...run,\n snapshot,\n });\n } else {\n snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n }\n\n if (!snapshot || !snapshot?.context) {\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n snapshot = { ...snapshot, ...opts };\n this.db.workflows.set(key, {\n ...run,\n snapshot: snapshot,\n });\n\n return snapshot;\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const key = this.getWorkflowKey(workflowName, runId);\n const now = new Date();\n const data: StorageWorkflowRun = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: createdAt ?? now,\n updatedAt: updatedAt ?? now,\n };\n\n this.db.workflows.set(key, data);\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n const key = this.getWorkflowKey(workflowName, runId);\n const run = this.db.workflows.get(key);\n\n if (!run) {\n return null;\n }\n\n const snapshot = typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : run.snapshot;\n // Return a deep copy to prevent mutation\n return snapshot ? JSON.parse(JSON.stringify(snapshot)) : null;\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n if (page !== undefined && page < 0) {\n throw new Error('page must be >= 0');\n }\n\n let runs = Array.from(this.db.workflows.values());\n\n if (workflowName) runs = runs.filter((run: any) => run.workflow_name === workflowName);\n if (status) {\n runs = runs.filter((run: any) => {\n let snapshot: WorkflowRunState | string = run?.snapshot!;\n\n if (!snapshot) {\n return false;\n }\n\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch {\n return false;\n }\n } else {\n snapshot = JSON.parse(JSON.stringify(snapshot)) as WorkflowRunState;\n }\n\n return snapshot.status === status;\n });\n }\n\n if (fromDate && toDate) {\n runs = runs.filter(\n (run: any) =>\n new Date(run.createdAt).getTime() >= fromDate.getTime() &&\n new Date(run.createdAt).getTime() <= toDate.getTime(),\n );\n } else if (fromDate) {\n runs = runs.filter((run: any) => new Date(run.createdAt).getTime() >= fromDate.getTime());\n } else if (toDate) {\n runs = runs.filter((run: any) => new Date(run.createdAt).getTime() <= toDate.getTime());\n }\n if (resourceId) runs = runs.filter((run: any) => run.resourceId === resourceId);\n\n const total = runs.length;\n\n // Sort by createdAt\n runs.sort((a: any, b: any) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Apply pagination\n if (perPage !== undefined && page !== undefined) {\n // Use MAX_SAFE_INTEGER as default to maintain \"no pagination\" behavior when undefined\n const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalizedPerPage;\n const start = offset;\n const end = start + normalizedPerPage;\n runs = runs.slice(start, end);\n }\n\n // Deserialize snapshot if it's a string\n const parsedRuns = runs.map((run: any) => ({\n ...run,\n snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n runId: run.run_id,\n workflowName: run.workflow_name,\n resourceId: run.resourceId,\n }));\n\n return { runs: parsedRuns as WorkflowRun[], total };\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const runs = Array.from(this.db.workflows.values()).filter((r: any) => r.run_id === runId);\n let run = runs.find((r: any) => r.workflow_name === workflowName);\n\n if (!run) return null;\n\n // Return a deep copy to prevent mutation\n const parsedRun = {\n ...run,\n snapshot: typeof run.snapshot === 'string' ? JSON.parse(run.snapshot) : JSON.parse(JSON.stringify(run.snapshot)),\n createdAt: new Date(run.createdAt),\n updatedAt: new Date(run.updatedAt),\n runId: run.run_id,\n workflowName: run.workflow_name,\n resourceId: run.resourceId,\n };\n\n return parsedRun as WorkflowRun;\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const key = this.getWorkflowKey(workflowName, runId);\n this.db.workflows.delete(key);\n }\n}\n","import { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { InMemoryAgentsStorage } from './domains/agents/inmemory';\nimport { BackgroundTasksInMemory } from './domains/background-tasks/inmemory';\nimport { InMemoryBlobStore } from './domains/blobs/inmemory';\nimport { InMemoryChannelsStorage } from './domains/channels/inmemory';\nimport { DatasetsInMemory } from './domains/datasets/inmemory';\nimport { ExperimentsInMemory } from './domains/experiments/inmemory';\nimport { InMemoryDB } from './domains/inmemory-db';\nimport { InMemoryMCPClientsStorage } from './domains/mcp-clients/inmemory';\nimport { InMemoryMCPServersStorage } from './domains/mcp-servers/inmemory';\nimport { InMemoryMemory } from './domains/memory/inmemory';\nimport { ObservabilityInMemory } from './domains/observability/inmemory';\nimport { InMemoryPromptBlocksStorage } from './domains/prompt-blocks/inmemory';\nimport { InMemoryScorerDefinitionsStorage } from './domains/scorer-definitions/inmemory';\nimport { ScoresInMemory } from './domains/scores/inmemory';\nimport { InMemorySkillsStorage } from './domains/skills/inmemory';\nimport { WorkflowsInMemory } from './domains/workflows/inmemory';\nimport { InMemoryWorkspacesStorage } from './domains/workspaces/inmemory';\n/**\n * In-memory storage implementation for testing and development.\n *\n * All data is stored in memory and will be lost when the process ends.\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new InMemoryStore();\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class InMemoryStore extends MastraCompositeStore {\n stores: StorageDomains;\n\n /**\n * Internal database layer shared across all domains.\n * This is an implementation detail - domains interact with this\n * rather than managing their own data structures.\n */\n #db: InMemoryDB;\n\n constructor({ id = 'in-memory' }: { id?: string } = {}) {\n super({ id, name: 'InMemoryStorage' });\n // InMemoryStore doesn't need async initialization\n this.hasInitialized = Promise.resolve(true);\n\n // Create internal db layer - shared across all domains\n this.#db = new InMemoryDB();\n\n // Create all domain instances with the shared db\n this.stores = {\n memory: new InMemoryMemory({ db: this.#db }),\n workflows: new WorkflowsInMemory({ db: this.#db }),\n scores: new ScoresInMemory({ db: this.#db }),\n observability: new ObservabilityInMemory({ db: this.#db }),\n agents: new InMemoryAgentsStorage({ db: this.#db }),\n channels: new InMemoryChannelsStorage(),\n datasets: new DatasetsInMemory({ db: this.#db }),\n experiments: new ExperimentsInMemory({ db: this.#db }),\n promptBlocks: new InMemoryPromptBlocksStorage({ db: this.#db }),\n scorerDefinitions: new InMemoryScorerDefinitionsStorage({ db: this.#db }),\n mcpClients: new InMemoryMCPClientsStorage({ db: this.#db }),\n mcpServers: new InMemoryMCPServersStorage({ db: this.#db }),\n workspaces: new InMemoryWorkspacesStorage({ db: this.#db }),\n skills: new InMemorySkillsStorage({ db: this.#db }),\n blobs: new InMemoryBlobStore(),\n backgroundTasks: new BackgroundTasksInMemory({ db: this.#db }),\n };\n }\n\n /**\n * Clears all data from the in-memory database.\n * Useful for testing.\n * @deprecated Use dangerouslyClearAll() on individual domains instead.\n */\n clear(): void {\n this.#db.clear();\n // InMemoryChannelsStorage doesn't share the InMemoryDB\n void this.stores.channels?.dangerouslyClearAll?.();\n }\n}\n\nexport const MockStore = InMemoryStore;\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, readdirSync, statSync, rmSync } from 'node:fs';\nimport { join, dirname, relative, resolve, sep } from 'node:path';\n\n/**\n * FilesystemDB is a thin I/O layer for filesystem-based storage.\n * It manages reading/writing JSON files in a directory, similar to how\n * InMemoryDB holds Maps for in-memory storage.\n *\n * Each editor domain gets its own JSON file (e.g., `agents.json`, `prompt-blocks.json`).\n * Skills use a real file tree under `skills/` instead of JSON.\n */\nexport class FilesystemDB {\n readonly dir: string;\n\n /** In-memory cache of parsed domain data, keyed by filename */\n private cache = new Map<string, Record<string, unknown>>();\n\n private initialized = false;\n\n constructor(dir: string) {\n this.dir = dir;\n }\n\n /**\n * Initialize the storage directory. Called once; subsequent calls are no-ops.\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n this.ensureDir();\n this.initialized = true;\n }\n\n /**\n * Ensure the storage directory and skills subdirectory exist.\n */\n ensureDir(): void {\n if (!existsSync(this.dir)) {\n mkdirSync(this.dir, { recursive: true });\n }\n const skillsDir = join(this.dir, 'skills');\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n }\n\n // ==========================================================================\n // Domain-level JSON operations\n // ==========================================================================\n\n /**\n * Read a domain JSON file and return its entity map.\n * Uses in-memory cache; reads from disk on first access.\n */\n readDomain<T = Record<string, unknown>>(filename: string): Record<string, T> {\n if (this.cache.has(filename)) {\n return this.cache.get(filename) as Record<string, T>;\n }\n\n const filePath = join(this.dir, filename);\n let data: Record<string, T> = {};\n\n if (existsSync(filePath)) {\n try {\n const raw = readFileSync(filePath, 'utf-8');\n data = JSON.parse(raw, dateReviver) as Record<string, T>;\n } catch {\n // If the file is corrupted, start fresh\n data = {};\n }\n }\n\n this.cache.set(filename, data as Record<string, unknown>);\n return data;\n }\n\n /**\n * Write a domain's full entity map to its JSON file.\n * Uses atomic write (write to .tmp, then rename) to prevent corruption.\n */\n writeDomain<T = Record<string, unknown>>(filename: string, data: Record<string, T>): void {\n this.cache.set(filename, data as Record<string, unknown>);\n\n const filePath = join(this.dir, filename);\n const tmpPath = filePath + '.tmp';\n\n // Ensure parent directory exists\n const parentDir = dirname(filePath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\n renameSync(tmpPath, filePath);\n }\n\n /**\n * Clear all data from a domain JSON file.\n */\n clearDomain(filename: string): void {\n this.writeDomain(filename, {});\n }\n\n /**\n * Invalidate the in-memory cache for a domain, forcing a re-read from disk on next access.\n */\n invalidateCache(filename?: string): void {\n if (filename) {\n this.cache.delete(filename);\n } else {\n this.cache.clear();\n }\n }\n\n // ==========================================================================\n // Entity-level convenience methods (used by FilesystemVersionedHelpers)\n // ==========================================================================\n\n /**\n * Get a single entity by ID from a domain JSON file.\n */\n get<T>(filename: string, id: string): T | null {\n const data = this.readDomain<T>(filename);\n return data[id] ?? null;\n }\n\n /**\n * Get all entities from a domain JSON file as an array.\n */\n getAll<T>(filename: string): T[] {\n const data = this.readDomain<T>(filename);\n return Object.values(data);\n }\n\n /**\n * Set (create or update) an entity in a domain JSON file.\n */\n set<T>(filename: string, id: string, entity: T): void {\n const data = this.readDomain<T>(filename);\n data[id] = entity;\n this.writeDomain(filename, data);\n }\n\n /**\n * Remove an entity by ID from a domain JSON file. No-op if not found.\n */\n remove(filename: string, id: string): void {\n const data = this.readDomain(filename);\n if (id in data) {\n delete data[id];\n this.writeDomain(filename, data);\n }\n }\n\n // =========================================================================\n // Skills directory operations (real file tree, not JSON)\n // =========================================================================\n\n /**\n * Get the path to a skill's directory.\n */\n skillDir(skillName: string): string {\n const skillsBase = join(this.dir, 'skills');\n const dir = resolve(skillsBase, skillName);\n if (!dir.startsWith(skillsBase + sep) && dir !== skillsBase) {\n throw new Error(`Path traversal detected: skill name \"${skillName}\" escapes skills directory`);\n }\n return dir;\n }\n\n /**\n * Resolve a file path within a skill directory, throwing if it escapes.\n */\n private safeSkillPath(skillName: string, relativePath: string): string {\n const base = this.skillDir(skillName);\n const resolved = resolve(base, relativePath);\n if (!resolved.startsWith(base + sep) && resolved !== base) {\n throw new Error(`Path traversal detected: \"${relativePath}\" escapes skill directory`);\n }\n return resolved;\n }\n\n /**\n * List all files in a skill's directory, returning relative paths.\n */\n listSkillFiles(skillName: string): string[] {\n const dir = this.skillDir(skillName);\n if (!existsSync(dir)) return [];\n return walkDir(dir).map(abs => relative(dir, abs).split(sep).join('/'));\n }\n\n /**\n * Read a file from a skill's directory.\n */\n readSkillFile(skillName: string, relativePath: string): Buffer | null {\n const filePath = this.safeSkillPath(skillName, relativePath);\n if (!existsSync(filePath)) return null;\n try {\n return readFileSync(filePath);\n } catch {\n return null;\n }\n }\n\n /**\n * Write a file to a skill's directory.\n */\n writeSkillFile(skillName: string, relativePath: string, content: Buffer | string): void {\n const filePath = this.safeSkillPath(skillName, relativePath);\n const parentDir = dirname(filePath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n writeFileSync(filePath, content);\n }\n\n /**\n * Delete a skill's entire directory.\n */\n deleteSkillDir(skillName: string): void {\n const dir = this.skillDir(skillName);\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * JSON reviver that converts ISO date strings back to Date objects.\n */\nfunction dateReviver(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(value)) {\n const d = new Date(value);\n if (!isNaN(d.getTime())) return d;\n }\n return value;\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nfunction walkDir(dir: string): string[] {\n const results: string[] = [];\n for (const entry of readdirSync(dir)) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n results.push(...walkDir(fullPath));\n } else {\n results.push(fullPath);\n }\n }\n return results;\n}\n","import { resolve } from 'node:path';\n\nimport { MastraCompositeStore } from './base';\nimport type { StorageDomains } from './base';\nimport { FilesystemAgentsStorage } from './domains/agents/filesystem';\nimport { FilesystemMCPClientsStorage } from './domains/mcp-clients/filesystem';\nimport { FilesystemMCPServersStorage } from './domains/mcp-servers/filesystem';\nimport { FilesystemPromptBlocksStorage } from './domains/prompt-blocks/filesystem';\nimport { FilesystemScorerDefinitionsStorage } from './domains/scorer-definitions/filesystem';\nimport { FilesystemSkillsStorage } from './domains/skills/filesystem';\nimport { FilesystemWorkspacesStorage } from './domains/workspaces/filesystem';\nimport { FilesystemDB } from './filesystem-db';\n\nexport interface FilesystemStoreConfig {\n /**\n * Directory to store JSON files in.\n * Defaults to `.mastra-storage/` relative to `process.cwd()`.\n */\n dir?: string;\n}\n\n/**\n * Filesystem-based storage adapter for the Mastra Editor.\n *\n * Stores editor primitives (agents, prompt blocks, scorer definitions,\n * MCP clients, MCP servers, workspaces, skills) as JSON files on disk.\n * This enables Git-based version tracking instead of database-based versioning.\n *\n * Only implements the 7 editor domains — other domains (memory, workflows, scores,\n * observability, datasets, experiments, blobs) are left undefined and should be\n * provided by a separate store via the `editor` shorthand on `MastraCompositeStore`.\n *\n * @example\n * ```typescript\n * import { FilesystemStore, MastraCompositeStore } from '@mastra/core/storage';\n *\n * const storage = new MastraCompositeStore({\n * id: 'my-storage',\n * default: postgresStore,\n * editor: new FilesystemStore({ dir: '.mastra-storage' }),\n * });\n * ```\n */\nexport class FilesystemStore extends MastraCompositeStore {\n #db: FilesystemDB;\n #dir: string;\n\n constructor(config: FilesystemStoreConfig = {}) {\n const dir = resolve(config.dir ?? '.mastra-storage');\n\n super({ id: 'filesystem', name: 'FilesystemStore' });\n\n this.#dir = dir;\n this.#db = new FilesystemDB(dir);\n\n // Only editor domains are provided; other domains (workflows, scores, memory, etc.)\n // should come from a default store when using the `editor` shorthand on MastraCompositeStore.\n this.stores = {\n agents: new FilesystemAgentsStorage({ db: this.#db }),\n promptBlocks: new FilesystemPromptBlocksStorage({ db: this.#db }),\n scorerDefinitions: new FilesystemScorerDefinitionsStorage({ db: this.#db }),\n mcpClients: new FilesystemMCPClientsStorage({ db: this.#db }),\n mcpServers: new FilesystemMCPServersStorage({ db: this.#db }),\n workspaces: new FilesystemWorkspacesStorage({ db: this.#db }),\n skills: new FilesystemSkillsStorage({ db: this.#db }),\n } as unknown as StorageDomains;\n }\n\n /**\n * The absolute path to the storage directory.\n */\n get dir(): string {\n return this.#dir;\n }\n}\n","import { MastraBase } from '../../../base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport type { TABLE_NAMES } from '../../constants';\nimport type { StorageColumn, CreateIndexOptions, IndexInfo, StorageIndexStats } from '../../types';\n\nexport abstract class StoreOperations extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'OPERATIONS',\n });\n }\n\n abstract hasColumn(table: string, column: string): Promise<boolean>;\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'TEXT';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'float':\n return 'FLOAT';\n case 'integer':\n return 'INTEGER';\n case 'bigint':\n return 'BIGINT';\n case 'jsonb':\n return 'JSONB';\n default:\n return 'TEXT';\n }\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n default:\n return \"DEFAULT ''\";\n }\n }\n\n abstract createTable({ tableName }: { tableName: TABLE_NAMES; schema: Record<string, StorageColumn> }): Promise<void>;\n\n abstract clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n abstract dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void>;\n\n abstract alterTable(args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void>;\n\n abstract insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void>;\n\n abstract batchInsert({\n tableName,\n records,\n }: {\n tableName: TABLE_NAMES;\n records: Record<string, any>[];\n }): Promise<void>;\n\n abstract load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null>;\n\n /**\n * DATABASE INDEX MANAGEMENT\n * Optional methods for database index management.\n * Storage adapters can override these to provide index management capabilities.\n */\n\n /**\n * Creates a database index on specified columns\n * @throws {MastraError} if not supported by the storage adapter\n */\n async createIndex(_options: CreateIndexOptions): Promise<void> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_CREATE_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Drops a database index by name\n * @throws {MastraError} if not supported by the storage adapter\n */\n async dropIndex(_indexName: string): Promise<void> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_DROP_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Lists database indexes for a table or all tables\n * @throws {MastraError} if not supported by the storage adapter\n */\n async listIndexes(_tableName?: string): Promise<IndexInfo[]> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_LIST_INDEXES_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Gets detailed statistics for a specific index\n * @throws {MastraError} if not supported by the storage adapter\n */\n async describeIndex(_indexName: string): Promise<StorageIndexStats> {\n throw new MastraError({\n id: 'MASTRA_STORAGE_DESCRIBE_INDEX_NOT_SUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Index management is not supported by this storage adapter`,\n });\n }\n\n /**\n * Returns definitions for automatic performance indexes\n * Storage adapters can override this to define indexes that should be created during initialization\n * @returns Array of index definitions to create automatically\n */\n protected getAutomaticIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n}\n","import { TABLE_WORKFLOW_SNAPSHOT } from '../../constants';\nimport type { TABLE_NAMES, TABLE_OBSERVATIONAL_MEMORY } from '../../constants';\nimport type { StorageColumn } from '../../types';\nimport { StoreOperations } from './base';\n\n// InMemory storage supports all tables including observational memory\ntype InMemoryTableNames = TABLE_NAMES | typeof TABLE_OBSERVATIONAL_MEMORY;\n\nexport class StoreOperationsInMemory extends StoreOperations {\n data: Record<InMemoryTableNames, Map<string, Record<string, any>>>;\n\n constructor() {\n super();\n this.data = {\n mastra_workflow_snapshot: new Map(),\n mastra_messages: new Map(),\n mastra_threads: new Map(),\n mastra_traces: new Map(),\n mastra_resources: new Map(),\n mastra_scorers: new Map(),\n mastra_ai_spans: new Map(),\n mastra_agents: new Map(),\n mastra_agent_versions: new Map(),\n mastra_observational_memory: new Map(),\n mastra_prompt_blocks: new Map(),\n mastra_prompt_block_versions: new Map(),\n mastra_scorer_definitions: new Map(),\n mastra_scorer_definition_versions: new Map(),\n mastra_mcp_clients: new Map(),\n mastra_mcp_client_versions: new Map(),\n mastra_mcp_servers: new Map(),\n mastra_mcp_server_versions: new Map(),\n mastra_workspaces: new Map(),\n mastra_workspace_versions: new Map(),\n mastra_skills: new Map(),\n mastra_skill_versions: new Map(),\n mastra_skill_blobs: new Map(),\n mastra_datasets: new Map(),\n mastra_dataset_items: new Map(),\n mastra_dataset_versions: new Map(),\n mastra_experiments: new Map(),\n mastra_experiment_results: new Map(),\n mastra_background_tasks: new Map(),\n mastra_channel_installations: new Map(),\n mastra_channel_config: new Map(),\n };\n }\n\n getDatabase() {\n return this.data;\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const table = this.data[tableName];\n let key = record.id;\n if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n key = record.workflow_name ? `${record.workflow_name}-${record.run_id}` : record.run_id;\n record.id = key;\n } else if (!record.id) {\n key = `auto-${Date.now()}-${Math.random()}`;\n record.id = key;\n }\n table.set(key, record);\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const table = this.data[tableName];\n for (const record of records) {\n let key = record.id;\n if ([TABLE_WORKFLOW_SNAPSHOT].includes(tableName) && !record.id && record.run_id) {\n key = record.run_id;\n record.id = key;\n } else if (!record.id) {\n key = `auto-${Date.now()}-${Math.random()}`;\n record.id = key;\n }\n table.set(key, record);\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const table = this.data[tableName];\n\n const records = Array.from(table.values());\n\n return records.filter(record => Object.keys(keys).every(key => record[key] === keys[key]))?.[0] as R | null;\n }\n\n async createTable({\n tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n this.data[tableName] = new Map();\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n this.data[tableName].clear();\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n this.data[tableName].clear();\n }\n\n async alterTable({\n tableName: _tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {}\n\n async hasColumn(_table: string, _column: string): Promise<boolean> {\n return true;\n }\n}\n"]}
|