{"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/harness/base.ts","../src/storage/domains/harness/inmemory.ts","../src/storage/domains/memory/base.ts","../src/storage/domains/memory/inmemory.ts","../src/agent/thread-stream-runtime.ts","../src/notifications/signals.ts","../src/notifications/dispatcher.ts","../src/notifications/storage.ts","../src/storage/domains/schedules/base.ts","../src/storage/domains/schedules/inmemory.ts","../src/storage/domains/scores/base.ts","../src/storage/domains/scores/inmemory.ts","../src/storage/domains/tool-provider-connections/base.ts","../src/storage/domains/tool-provider-connections/inmemory.ts","../src/storage/workflow-snapshot.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/providers/github.ts","../src/storage/domains/operations/base.ts","../src/storage/domains/operations/inmemory.ts"],"names":["StorageDomain","MastraError","ErrorDomain","ErrorCategory","getBranchArgsSchema","extractBranchSpans","spans","TABLE_SCHEMAS","TABLE_SCORERS","coreFeatures","BRANCH_SPAN_TYPE_SET","listTracesArgsSchema","toTraceSpans","listBranchesArgsSchema","matches","toTraceSpan","diff","listMetricsArgsSchema","costSummary","EntityType","listLogsArgsSchema","listScoresArgsSchema","bucketMap","listFeedbackArgsSchema","MastraBase","z","jsonSchemaToZod","normalizePerPage","calculatePagination","MessageList","id","EventEmitterPubSub","randomUUID","resolve","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","getErrorFromUnknown","createSignal","createMessageSignal","parseMemoryRequestContext","applyStateSignal","resolveDeliveryAttributes","now","out","MastraCompositeStore","InMemoryDB","InMemoryAgentsStorage","InMemoryPromptBlocksStorage","InMemoryScorerDefinitionsStorage","InMemoryMCPClientsStorage","InMemoryMCPServersStorage","InMemoryWorkspacesStorage","InMemorySkillsStorage","InMemoryFavoritesStorage","InMemoryThreadStateStorage","existsSync","mkdirSync","join","readFileSync","dirname","writeFileSync","renameSync","sep","statSync","readdirSync","extname","rmSync","relative","FilesystemAgentsStorage","FilesystemPromptBlocksStorage","FilesystemScorerDefinitionsStorage","FilesystemMCPClientsStorage","FilesystemMCPServersStorage","FilesystemWorkspacesStorage","FilesystemSkillsStorage","TABLE_NOTIFICATIONS","TABLE_WORKFLOW_SNAPSHOT"],"mappings":"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","file":"chunk-TMPKR5YT.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 ScoreRecord,\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 GetBranchArgs,\n GetBranchResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetSpansArgs,\n GetSpansResponse,\n GetStructureResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesLightResponse,\n ListTracesResponse,\n UpdateSpanArgs,\n} from './tracing';\nimport { extractBranchSpans, getBranchArgsSchema } from './tracing';\nimport type { ObservabilityStorageStrategy, TracingStorageStrategy } from './types';\n\nexport type ObservabilityStorageFeature = 'delta-polling';\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 {\n // Default no-op - subclasses override\n }\n\n /**\n * Provides hints for tracing strategy selection by the MastraStorageExporter.\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 MastraStorageExporter.\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 * Optional feature list for observability storage APIs.\n * Stores that implement delta polling should override this and opt in explicitly.\n * Older stores and older package versions will simply omit it, which keeps page mode working.\n */\n public getFeatures(): readonly ObservabilityStorageFeature[] | undefined {\n return undefined;\n }\n\n /**\n * Creates a single Span record in the storage provider.\n */\n async createSpan(_args: CreateSpanArgs): Promise {\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 {\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 {\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 {\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 {\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 the structural skeleton of a trace -- parent/child links, span\n * type, timing, and status -- with heavy fields (input, output, attributes,\n * metadata, tags, links) excluded. Intended for waterfall/timeline rendering\n * where the full payload would be wasteful.\n *\n * Default implementation forwards to {@link getTraceLight} (the legacy\n * override surface). Backends should override either method -- the response\n * shape is identical, and the unimplemented one delegates to the\n * implemented one. The cycle guard is what makes that safe.\n */\n async getStructure(args: GetTraceArgs): Promise {\n if (this.getTraceLight === ObservabilityStorage.prototype.getTraceLight) {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_STRUCTURE_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting trace structure',\n });\n }\n return this.getTraceLight(args);\n }\n\n /**\n * @deprecated Use {@link getStructure} instead. Default implementation\n * forwards to {@link getStructure} so backends that only override the\n * canonical name still work for legacy callers.\n */\n async getTraceLight(args: GetTraceArgs): Promise {\n if (this.getStructure === ObservabilityStorage.prototype.getStructure) {\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 return this.getStructure(args);\n }\n\n /**\n * Retrieves the subtree of spans rooted at a given span, optionally bounded\n * to `depth` levels of descendants.\n *\n * Default implementation prefers a two-step path: fetch the lightweight\n * structure to determine which spans belong to the branch, then batch-fetch\n * only those with full data. This avoids pulling the entire trace when the\n * branch is a small slice of a large trace. Backends that don't yet\n * implement {@link getStructure} or {@link getSpans} fall back to fetching\n * the full trace and walking it in memory.\n */\n async getBranch(args: GetBranchArgs): Promise {\n const parsed = getBranchArgsSchema.parse(args);\n\n // Optimized path: skeleton walk → batch fetch the branch's spans.\n try {\n const skeleton = await this.getStructure({ traceId: parsed.traceId });\n if (!skeleton) return null;\n const branchSpanIds = extractBranchSpans(skeleton.spans, parsed.spanId, parsed.depth).map(s => s.spanId);\n if (branchSpanIds.length === 0) return null;\n const { spans } = await this.getSpans({ traceId: parsed.traceId, spanIds: branchSpanIds });\n if (spans.length === 0) return null;\n spans.sort((a, b) => a.startedAt.getTime() - b.startedAt.getTime());\n return { traceId: parsed.traceId, spans };\n } catch (error) {\n const isFallbackTrigger =\n error instanceof MastraError &&\n (error.id === 'OBSERVABILITY_STORAGE_GET_STRUCTURE_NOT_IMPLEMENTED' ||\n error.id === 'OBSERVABILITY_STORAGE_GET_TRACE_LIGHT_NOT_IMPLEMENTED' ||\n error.id === 'OBSERVABILITY_STORAGE_GET_SPANS_NOT_IMPLEMENTED');\n if (!isFallbackTrigger) throw error;\n }\n\n // Fallback: pull the whole trace, walk in memory.\n const trace = await this.getTrace({ traceId: parsed.traceId });\n if (!trace) return null;\n const spans = extractBranchSpans(trace.spans, parsed.spanId, parsed.depth);\n if (spans.length === 0) return null;\n return { traceId: parsed.traceId, spans };\n }\n\n /**\n * Batch-fetches spans by spanId within a single trace. Used by the\n * optimized {@link getBranch} path to fetch only the spans that belong to\n * the requested branch (after walking the lightweight structure to identify\n * them) instead of pulling the entire trace.\n */\n async getSpans(_args: GetSpansArgs): Promise {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SPANS_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support batch-fetching spans',\n });\n }\n\n /**\n * Retrieves a list of traces with optional filtering.\n */\n async listTraces(_args: ListTracesArgs): Promise {\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 * Retrieves a lightweight list of traces with optional filtering.\n */\n async listTracesLight(_args: ListTracesArgs): Promise {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_TRACES_LIGHT_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing lightweight traces',\n });\n }\n\n /**\n * Lists trace branches across all traces. Unlike {@link listTraces} (which\n * returns one row per root-rooted trace), each row here is a single branch\n * anchor span, including ones nested under a different root entity -- useful\n * for \"show me every run of agent X\" regardless of caller. Pairs with\n * {@link getBranch} to expand a single branch into its subtree.\n */\n async listBranches(_args: ListBranchesArgs): Promise {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support listing trace branches',\n });\n }\n\n /**\n * Creates multiple Spans in a single batch.\n */\n async batchCreateSpans(_args: BatchCreateSpansArgs): Promise {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 /**\n * Retrieves a single score by its score ID.\n */\n async getScoreById(_scoreId: string): Promise {\n throw new MastraError({\n id: 'OBSERVABILITY_STORAGE_GET_SCORE_BY_ID_NOT_IMPLEMENTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support getting scores by ID',\n });\n }\n\n async getScoreAggregate(_args: GetScoreAggregateArgs): Promise {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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;\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;\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>(\n row: Record,\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 = {};\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, options: TransformRowOptions = {}): ScoreRowData {\n return transformRow(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 {\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;\n}\n\nexport function createStorageErrorId(store: StoreName, operation: string, status: string): Uppercase {\n return createStoreErrorId('storage', store, operation, status);\n}\n\nexport function createVectorErrorId(store: StoreName, operation: string, status: string): Uppercase {\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(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)[key], (b as Record)[key]),\n );\n }\n return a === b;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { coreFeatures } from '../../../features';\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 GetSpansArgs,\n GetSpansResponse,\n GetStructureResponse,\n GetTraceArgs,\n GetTraceResponse,\n LightSpanRecord,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesLightResponse,\n ListTracesResponse,\n SpanRecord,\n UpdateSpanArgs,\n} from './tracing';\n\nimport {\n BRANCH_SPAN_TYPE_SET,\n listBranchesArgsSchema,\n listTracesArgsSchema,\n TraceStatus,\n toTraceSpan,\n toTraceSpans,\n} from './tracing';\n\nconst OBSERVABILITY_DELTA_POLLING_FEATURE = 'observability-delta-polling';\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;\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 override getFeatures() {\n if (!this.deltaPollingFeatureEnabled()) {\n return undefined;\n }\n\n return ['delta-polling'] as const;\n }\n\n async dangerouslyClearAll(): Promise {\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 this.db.observabilityNextCursorId = 1;\n this.db.traceCursorIds.clear();\n this.db.branchCursorIds.clear();\n this.db.metricCursorIds.clear();\n this.db.logCursorIds.clear();\n this.db.scoreCursorIds.clear();\n this.db.feedbackCursorIds.clear();\n }\n\n private deltaPollingFeatureEnabled(): boolean {\n return coreFeatures.has(OBSERVABILITY_DELTA_POLLING_FEATURE);\n }\n\n private assertDeltaPollingEnabled(): void {\n if (this.deltaPollingFeatureEnabled()) {\n return;\n }\n\n throw new MastraError({\n id: 'OBSERVABILITY_DELTA_POLLING_NOT_SUPPORTED',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.SYSTEM,\n text: 'This storage provider does not support observability delta polling',\n });\n }\n\n private allocateObservabilityCursorId(): number {\n const cursorId = this.db.observabilityNextCursorId;\n this.db.observabilityNextCursorId += 1;\n return cursorId;\n }\n\n /**\n * Upserts a record into an append-only collection keyed by an id field.\n *\n * If an existing record with the same id is found, it is replaced in place\n * (preserving its cursor id so delta polling does not re-emit it). Otherwise\n * the record is appended and a fresh cursor id is allocated.\n */\n private upsertByIdField>(\n records: T[],\n cursorIds: Map,\n record: T,\n idField: keyof T,\n ): void {\n const id = record[idField];\n if (id == null) {\n throw new MastraError({\n id: 'OBSERVABILITY_MISSING_RECORD_ID',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Observability record is missing required id field '${String(idField)}'`,\n });\n }\n const existingIndex = records.findIndex(existing => existing[idField] === id);\n if (existingIndex !== -1) {\n const previous = records[existingIndex]!;\n const cursorId = cursorIds.get(previous);\n cursorIds.delete(previous);\n records[existingIndex] = record;\n if (cursorId !== undefined) {\n cursorIds.set(record, cursorId);\n }\n return;\n }\n records.push(record);\n cursorIds.set(record, this.allocateObservabilityCursorId());\n }\n\n private encodeDeltaCursor(cursorId?: number | null): string {\n return (cursorId ?? 0).toString();\n }\n\n private decodeDeltaCursor(cursor: string): number {\n if (!/^\\d+$/.test(cursor)) {\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_DELTA_CURSOR',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n text: 'Invalid observability delta cursor',\n });\n }\n\n const cursorId = Number.parseInt(cursor, 10);\n if (!Number.isInteger(cursorId) || cursorId < 0) {\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_DELTA_CURSOR',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n text: 'Invalid observability delta cursor',\n });\n }\n\n return cursorId;\n }\n\n private pageDeltaCursor(cursorId: number | null): { deltaCursor?: string } {\n if (!this.deltaPollingFeatureEnabled()) {\n return {};\n }\n\n return { deltaCursor: this.encodeDeltaCursor(cursorId) };\n }\n\n private maxMatchingCursorId(\n rows: Iterable,\n cursorIds: Map,\n matches: (row: T) => boolean,\n ): number | null {\n let maxCursorId: number | null = null;\n\n for (const row of rows) {\n const cursorId = cursorIds.get(row);\n if (cursorId === undefined || !matches(row)) {\n continue;\n }\n\n if (maxCursorId === null || cursorId > maxCursorId) {\n maxCursorId = cursorId;\n }\n }\n\n return maxCursorId;\n }\n\n private createBranchCursorKey(traceId: string, spanId: string): string {\n return `${traceId}\\u0000${spanId}`;\n }\n\n private maybeRegisterTraceCursor(traceEntry: TraceEntry): void {\n const rootSpan = traceEntry.rootSpan;\n if (!rootSpan) {\n return;\n }\n\n if (!this.db.traceCursorIds.has(rootSpan.traceId)) {\n this.db.traceCursorIds.set(rootSpan.traceId, this.allocateObservabilityCursorId());\n }\n }\n\n private maybeRegisterBranchCursor(span: SpanRecord): void {\n if (!BRANCH_SPAN_TYPE_SET.has(span.spanType)) {\n return;\n }\n\n const key = this.createBranchCursorKey(span.traceId, span.spanId);\n if (!this.db.branchCursorIds.has(key)) {\n this.db.branchCursorIds.set(key, this.allocateObservabilityCursorId());\n }\n }\n\n private buildDeltaResponse(\n rows: Array<{ cursorId: number; row: T }>,\n limit: number,\n fallbackCursorId: number | null,\n ): { rows: T[]; delta: { limit: number; hasMore: boolean }; deltaCursor: string } {\n const visibleRows = rows.slice(0, limit);\n const hasMore = rows.length > limit;\n\n return {\n rows: visibleRows.map(entry => entry.row),\n delta: { limit, hasMore },\n deltaCursor:\n visibleRows.length > 0\n ? this.encodeDeltaCursor(visibleRows[visibleRows.length - 1]!.cursorId)\n : this.encodeDeltaCursor(fallbackCursorId),\n };\n }\n\n private listAppendOnlyDelta(\n rows: T[],\n cursorIds: Map,\n matches: (row: T) => boolean,\n after: string | undefined,\n limit: number,\n ): { rows: T[]; delta: { limit: number; hasMore: boolean }; deltaCursor: string } {\n const currentCursorId = this.maxMatchingCursorId(rows, cursorIds, matches);\n const streamCursorId = this.maxMatchingCursorId(rows, cursorIds, () => true);\n const fallbackCursorId = currentCursorId ?? streamCursorId;\n\n if (after === undefined) {\n return {\n rows: [],\n delta: { limit, hasMore: false },\n deltaCursor: this.encodeDeltaCursor(fallbackCursorId),\n };\n }\n\n const afterCursorId = this.decodeDeltaCursor(after);\n const matchingRows = rows\n .flatMap(row => {\n const cursorId = cursorIds.get(row);\n if (cursorId === undefined || cursorId <= afterCursorId || !matches(row)) {\n return [];\n }\n\n return [{ cursorId, row }];\n })\n .sort((a, b) => a.cursorId - b.cursorId)\n .slice(0, limit + 1);\n\n return this.buildDeltaResponse(matchingRows, limit, fallbackCursorId);\n }\n\n private getTraceCursorId(traceId: string, filters: ListTracesArgs['filters']): number | null {\n const cursorId = this.db.traceCursorIds.get(traceId);\n const traceEntry = this.db.traces.get(traceId);\n if (cursorId === undefined || !traceEntry?.rootSpan || !this.traceMatchesFilters(traceEntry, filters)) {\n return null;\n }\n\n return cursorId;\n }\n\n private getMaxTraceCursorId(filters: ListTracesArgs['filters']): number | null {\n let maxCursorId: number | null = null;\n\n for (const traceId of this.db.traceCursorIds.keys()) {\n const cursorId = this.getTraceCursorId(traceId, filters);\n if (cursorId === null) {\n continue;\n }\n\n if (maxCursorId === null || cursorId > maxCursorId) {\n maxCursorId = cursorId;\n }\n }\n\n return maxCursorId;\n }\n\n private getMaxTraceStreamCursorId(): number | null {\n let maxCursorId: number | null = null;\n\n for (const cursorId of this.db.traceCursorIds.values()) {\n if (maxCursorId === null || cursorId > maxCursorId) {\n maxCursorId = cursorId;\n }\n }\n\n return maxCursorId;\n }\n\n private getBranchCursorId(key: string, filters: ListBranchesArgs['filters']): number | null {\n const cursorId = this.db.branchCursorIds.get(key);\n if (cursorId === undefined) {\n return null;\n }\n\n const [traceId, spanId] = key.split('\\u0000');\n if (!traceId || !spanId) {\n return null;\n }\n\n const traceEntry = this.db.traces.get(traceId);\n const span = traceEntry?.spans[spanId];\n if (!span || !this.spanMatchesBranchFilters(span, filters)) {\n return null;\n }\n\n return cursorId;\n }\n\n private getMaxBranchCursorId(filters: ListBranchesArgs['filters']): number | null {\n let maxCursorId: number | null = null;\n\n for (const key of this.db.branchCursorIds.keys()) {\n const cursorId = this.getBranchCursorId(key, filters);\n if (cursorId === null) {\n continue;\n }\n\n if (maxCursorId === null || cursorId > maxCursorId) {\n maxCursorId = cursorId;\n }\n }\n\n return maxCursorId;\n }\n\n private getMaxBranchStreamCursorId(): number | null {\n let maxCursorId: number | null = null;\n\n for (const cursorId of this.db.branchCursorIds.values()) {\n if (maxCursorId === null || cursorId > maxCursorId) {\n maxCursorId = cursorId;\n }\n }\n\n return maxCursorId;\n }\n\n async createSpan(args: CreateSpanArgs): Promise {\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 {\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 this.maybeRegisterTraceCursor(traceEntry);\n this.maybeRegisterBranchCursor(span);\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 {\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 getSpans(args: GetSpansArgs): Promise {\n const { traceId, spanIds } = args;\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry) {\n return { traceId, spans: [] };\n }\n\n const spans: SpanRecord[] = [];\n for (const spanId of spanIds) {\n const span = traceEntry.spans[spanId];\n if (span) spans.push(span);\n }\n\n return { traceId, spans };\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise {\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 {\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 {\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 private getMatchingRootSpans(args: ListTracesArgs): {\n paged: SpanRecord[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n } {\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\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 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 { paged, total, page, perPage, hasMore: end < total };\n }\n\n async listTraces(args: ListTracesArgs): Promise {\n const { mode, filters, after, limit } = listTracesArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const currentCursorId = this.getMaxTraceCursorId(filters);\n const fallbackCursorId = currentCursorId ?? this.getMaxTraceStreamCursorId();\n\n if (after === undefined) {\n return {\n spans: [],\n delta: { limit, hasMore: false },\n deltaCursor: this.encodeDeltaCursor(fallbackCursorId),\n };\n }\n\n const afterCursorId = this.decodeDeltaCursor(after);\n const matchingRootSpans = Array.from(this.db.traceCursorIds.entries())\n .flatMap(([traceId, cursorId]) => {\n if (cursorId <= afterCursorId) {\n return [];\n }\n\n const traceEntry = this.db.traces.get(traceId);\n if (!traceEntry?.rootSpan || !this.traceMatchesFilters(traceEntry, filters)) {\n return [];\n }\n\n return [{ cursorId, row: traceEntry.rootSpan }];\n })\n .sort((a, b) => a.cursorId - b.cursorId)\n .slice(0, limit + 1);\n\n const deltaResponse = this.buildDeltaResponse(matchingRootSpans, limit, fallbackCursorId);\n return {\n spans: toTraceSpans(deltaResponse.rows),\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\n\n const { paged, total, page, perPage, hasMore } = this.getMatchingRootSpans(args);\n\n return {\n spans: toTraceSpans(paged),\n pagination: { total, page, perPage, hasMore },\n ...this.pageDeltaCursor(this.getMaxTraceCursorId(filters) ?? this.getMaxTraceStreamCursorId()),\n };\n }\n\n async listTracesLight(args: ListTracesArgs): Promise {\n const { paged, total, page, perPage, hasMore } = this.getMatchingRootSpans(args);\n\n return {\n spans: paged.map(span => ({\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 pagination: { total, page, perPage, hasMore },\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 listBranches(args: ListBranchesArgs): Promise {\n const { mode, filters, pagination, orderBy, after, limit } = listBranchesArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const currentCursorId = this.getMaxBranchCursorId(filters);\n const fallbackCursorId = currentCursorId ?? this.getMaxBranchStreamCursorId();\n\n if (after === undefined) {\n return {\n branches: [],\n delta: { limit, hasMore: false },\n deltaCursor: this.encodeDeltaCursor(fallbackCursorId),\n };\n }\n\n const afterCursorId = this.decodeDeltaCursor(after);\n const matches = Array.from(this.db.branchCursorIds.entries())\n .flatMap(([key, cursorId]) => {\n if (cursorId <= afterCursorId) {\n return [];\n }\n\n const [traceId, spanId] = key.split('\\u0000');\n if (!traceId || !spanId) {\n return [];\n }\n\n const traceEntry = this.db.traces.get(traceId);\n const span = traceEntry?.spans[spanId];\n if (!span || !this.spanMatchesBranchFilters(span, filters)) {\n return [];\n }\n\n return [{ cursorId, row: span }];\n })\n .sort((a, b) => a.cursorId - b.cursorId)\n .slice(0, limit + 1);\n\n const deltaResponse = this.buildDeltaResponse(matches, limit, fallbackCursorId);\n return {\n branches: deltaResponse.rows.map(toTraceSpan),\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\n\n const allowedSpanTypes = filters?.spanType\n ? BRANCH_SPAN_TYPE_SET.has(filters.spanType)\n ? new Set([filters.spanType])\n : new Set()\n : BRANCH_SPAN_TYPE_SET;\n\n const matches: SpanRecord[] = [];\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n if (!allowedSpanTypes.has(span.spanType)) continue;\n if (!this.spanMatchesBranchFilters(span, filters)) continue;\n matches.push(span);\n }\n }\n\n const { field: sortField, direction: sortDirection } = orderBy;\n matches.sort((a, b) => {\n if (sortField === 'endedAt') {\n const aVal = a.endedAt;\n const bVal = b.endedAt;\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 const diff = aVal.getTime() - bVal.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n }\n const diff = a.startedAt.getTime() - b.startedAt.getTime();\n return sortDirection === 'DESC' ? -diff : diff;\n });\n\n const total = matches.length;\n const { page, perPage } = pagination;\n const start = page * perPage;\n const end = start + perPage;\n const paged = matches.slice(start, end);\n\n return {\n pagination: { total, page, perPage, hasMore: end < total },\n branches: paged.map(toTraceSpan),\n ...this.pageDeltaCursor(this.getMaxBranchCursorId(filters) ?? this.getMaxBranchStreamCursorId()),\n };\n }\n\n /**\n * Check if a single anchor span matches all provided branch filters. All\n * predicates apply to the span itself (not the trace root) -- this is the\n * key difference from {@link traceMatchesFilters}.\n */\n private spanMatchesBranchFilters(span: SpanRecord, filters: ListBranchesArgs['filters']): boolean {\n if (!filters) return true;\n\n if (filters.startedAt) {\n if (filters.startedAt.start && span.startedAt < filters.startedAt.start) return false;\n if (filters.startedAt.end && span.startedAt > filters.startedAt.end) return false;\n }\n if (filters.endedAt) {\n if (span.endedAt == null) return false;\n if (filters.endedAt.start && span.endedAt < filters.endedAt.start) return false;\n if (filters.endedAt.end && span.endedAt > filters.endedAt.end) return false;\n }\n\n if (filters.traceId !== undefined && span.traceId !== filters.traceId) return false;\n\n if (filters.entityType !== undefined && span.entityType !== filters.entityType) return false;\n if (filters.entityId !== undefined && span.entityId !== filters.entityId) return false;\n if (filters.entityName !== undefined && span.entityName !== filters.entityName) return false;\n if (filters.entityVersionId !== undefined && span.entityVersionId !== filters.entityVersionId) return false;\n if (filters.parentEntityType !== undefined && span.parentEntityType !== filters.parentEntityType) return false;\n if (filters.parentEntityId !== undefined && span.parentEntityId !== filters.parentEntityId) return false;\n if (filters.parentEntityName !== undefined && span.parentEntityName !== filters.parentEntityName) return false;\n if (filters.parentEntityVersionId !== undefined && span.parentEntityVersionId !== filters.parentEntityVersionId)\n return false;\n if (filters.rootEntityType !== undefined && span.rootEntityType !== filters.rootEntityType) return false;\n if (filters.rootEntityId !== undefined && span.rootEntityId !== filters.rootEntityId) return false;\n if (filters.rootEntityName !== undefined && span.rootEntityName !== filters.rootEntityName) return false;\n if (filters.rootEntityVersionId !== undefined && span.rootEntityVersionId !== filters.rootEntityVersionId)\n return false;\n\n if (filters.experimentId !== undefined && span.experimentId !== filters.experimentId) return false;\n if (filters.userId !== undefined && span.userId !== filters.userId) return false;\n if (filters.organizationId !== undefined && span.organizationId !== filters.organizationId) return false;\n if (filters.resourceId !== undefined && span.resourceId !== filters.resourceId) return false;\n if (filters.runId !== undefined && span.runId !== filters.runId) return false;\n if (filters.sessionId !== undefined && span.sessionId !== filters.sessionId) return false;\n if (filters.threadId !== undefined && span.threadId !== filters.threadId) return false;\n if (filters.requestId !== undefined && span.requestId !== filters.requestId) return false;\n if (filters.environment !== undefined && span.environment !== filters.environment) return false;\n if (filters.source !== undefined && span.source !== filters.source) return false;\n if (filters.serviceName !== undefined && span.serviceName !== filters.serviceName) return false;\n\n if (filters.scope != null && span.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n if (!jsonValueEquals(span.scope[key], value)) return false;\n }\n } else if (filters.scope != null && span.scope == null) {\n return false;\n }\n\n if (filters.metadata != null && span.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n if (!jsonValueEquals(span.metadata[key], value)) return false;\n }\n } else if (filters.metadata != null && span.metadata == null) {\n return false;\n }\n\n if (filters.tags != null && filters.tags.length > 0) {\n if (span.tags == null) return false;\n for (const tag of filters.tags) {\n if (!span.tags.includes(tag)) return false;\n }\n }\n\n if (filters.status !== undefined) {\n const spanStatus = toTraceSpan(span).status;\n if (spanStatus !== filters.status) return false;\n }\n\n return true;\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise {\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 this.maybeRegisterTraceCursor(traceEntry);\n this.maybeRegisterBranchCursor(updatedSpan);\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise {\n for (const record of args.records) {\n await this.updateSpan(record);\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise {\n for (const traceId of args.traceIds) {\n const traceEntry = this.db.traces.get(traceId);\n if (traceEntry) {\n this.db.traceCursorIds.delete(traceId);\n for (const spanId of Object.keys(traceEntry.spans)) {\n this.db.branchCursorIds.delete(this.createBranchCursorKey(traceId, spanId));\n }\n }\n this.db.traces.delete(traceId);\n }\n }\n\n // ============================================================================\n // Metrics\n // ============================================================================\n\n async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise {\n for (const metric of args.metrics) {\n const record = metric as MetricRecord;\n this.upsertByIdField(this.db.metricRecords, this.db.metricCursorIds, record, 'metricId');\n }\n }\n\n async listMetrics(args: ListMetricsArgs): Promise {\n const { mode, filters, pagination, orderBy, after, limit } = listMetricsArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const deltaResponse = this.listAppendOnlyDelta(\n this.db.metricRecords,\n this.db.metricCursorIds,\n metric => this.metricMatchesFilters(metric, filters as Record),\n after,\n limit,\n );\n\n return {\n metrics: deltaResponse.rows,\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\n\n let matching = this.filterMetrics(filters as Record);\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 ...this.pageDeltaCursor(\n this.maxMatchingCursorId(this.db.metricRecords, this.db.metricCursorIds, metric =>\n this.metricMatchesFilters(metric, filters as Record),\n ),\n ),\n };\n }\n\n private filterMetrics(filters?: Record): MetricRecord[] {\n if (!filters) return [...this.db.metricRecords];\n return this.db.metricRecords.filter(metric => this.metricMatchesFilters(metric, filters));\n }\n\n private metricMatchesFilters(m: MetricRecord, filters?: Record): boolean {\n if (!filters) return true;\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;\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 private aggregate(\n values: number[],\n type: AggregationType,\n timestamps?: number[],\n distinctValues?: Array,\n ): number | null {\n if (type === 'count_distinct') {\n if (!distinctValues) return 0;\n const set = new Set();\n for (const v of distinctValues) {\n if (v === null || v === undefined) continue;\n set.add(v);\n }\n return set.size;\n }\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 extractDistinctValues(\n records: MetricRecord[],\n distinctColumn: string | undefined,\n ): Array | undefined {\n if (!distinctColumn) return undefined;\n return records.map(r => {\n const raw = (r as unknown as Record)[distinctColumn];\n if (raw === null || raw === undefined) return null;\n if (typeof raw === 'string' || typeof raw === 'number') return raw;\n return String(raw);\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 {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record).filter(m => names.includes(m.name));\n const value = this.aggregate(\n filtered.map(m => m.value),\n args.aggregation,\n undefined,\n this.extractDistinctValues(filtered, args.distinctColumn),\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),\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 undefined,\n this.extractDistinctValues(prevFiltered, args.distinctColumn),\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 {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record).filter(m => names.includes(m.name));\n\n const groupMap = new Map();\n for (const m of filtered) {\n const dims: Record = {};\n for (const col of args.groupBy) {\n dims[col] = ((m as Record)[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,\n value:\n this.aggregate(\n records.map(record => record.value),\n args.aggregation,\n undefined,\n this.extractDistinctValues(records, args.distinctColumn),\n ) ?? 0,\n estimatedCost: costSummary.estimatedCost,\n costUnit: costSummary.costUnit,\n };\n });\n\n const direction = args.orderDirection === 'ASC' ? 1 : -1;\n groups.sort((a, b) => (a.value - b.value) * direction);\n\n const limited = typeof args.limit === 'number' ? groups.slice(0, args.limit) : groups;\n return { groups: limited };\n }\n\n async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise {\n const names = Array.isArray(args.name) ? args.name : [args.name];\n const filtered = this.filterMetrics(args.filters as Record).filter(m => names.includes(m.name));\n\n const intervalMs = this.intervalToMs(args.interval);\n\n if (args.groupBy && args.groupBy.length > 0) {\n // Keep colliding display names (label values containing `|`) on separate\n // series by keying on the original value tuple instead of the joined\n // display string.\n const seriesMap = new Map }>();\n for (const m of filtered) {\n const values = args.groupBy.map(col => String((m as Record)[col] ?? m.labels[col] ?? ''));\n const key = JSON.stringify(values);\n const displayName = values.join('|');\n let entry = seriesMap.get(key);\n if (!entry) {\n entry = { displayName, buckets: new Map() };\n seriesMap.set(key, entry);\n }\n const bucket = Math.floor(m.timestamp.getTime() / intervalMs) * intervalMs;\n if (!entry.buckets.has(bucket)) entry.buckets.set(bucket, []);\n entry.buckets.get(bucket)!.push(m);\n }\n\n return {\n series: Array.from(seriesMap.values()).map(({ displayName, buckets }) => {\n const seriesRecords = Array.from(buckets.values()).flat();\n const costSummary = this.summarizeCost(seriesRecords);\n return {\n name: displayName,\n costUnit: costSummary.costUnit,\n points: Array.from(buckets.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 undefined,\n this.extractDistinctValues(records, args.distinctColumn),\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n };\n }),\n };\n }\n\n const bucketMap = new Map();\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 undefined,\n this.extractDistinctValues(records, args.distinctColumn),\n ) ?? 0,\n estimatedCost: this.summarizeCost(records).estimatedCost,\n })),\n },\n ],\n };\n }\n\n async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise {\n const filtered = this.filterMetrics(args.filters as Record).filter(m => m.name === args.name);\n const intervalMs = this.intervalToMs(args.interval);\n\n const bucketMap = new Map();\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 {\n const nameSet = new Set();\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 {\n const keySet = new Set();\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 {\n const valueSet = new Set();\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 /**\n * Iterates every record across spans, logs, and metrics with shared\n * context fields. Discovery operations need to surface entities and\n * dimensions emitted on any observability surface, not just spans.\n */\n private *iterateObservabilityContextRecords(): Generator<{\n entityType?: string | null;\n entityName?: string | null;\n serviceName?: string | null;\n environment?: string | null;\n tags?: readonly string[] | null;\n }> {\n for (const [, traceEntry] of this.db.traces) {\n for (const span of Object.values(traceEntry.spans)) {\n yield span;\n }\n }\n for (const log of this.db.logRecords) {\n yield log as unknown as { entityType?: string | null };\n }\n for (const metric of this.db.metricRecords) {\n yield metric as unknown as { entityType?: string | null };\n }\n }\n\n async getEntityTypes(_args: GetEntityTypesArgs): Promise {\n const validTypes = new Set(Object.values(EntityType));\n const typeSet = new Set();\n for (const record of this.iterateObservabilityContextRecords()) {\n if (record.entityType && validTypes.has(record.entityType as EntityType)) {\n typeSet.add(record.entityType as EntityType);\n }\n }\n return { entityTypes: Array.from(typeSet).sort() };\n }\n\n async getEntityNames(args: GetEntityNamesArgs): Promise {\n const nameSet = new Set();\n for (const record of this.iterateObservabilityContextRecords()) {\n if (!record.entityName) continue;\n if (args.entityType && record.entityType !== args.entityType) continue;\n nameSet.add(record.entityName);\n }\n return { names: Array.from(nameSet).sort() };\n }\n\n async getServiceNames(_args: GetServiceNamesArgs): Promise {\n const nameSet = new Set();\n for (const record of this.iterateObservabilityContextRecords()) {\n if (record.serviceName) nameSet.add(record.serviceName);\n }\n return { serviceNames: Array.from(nameSet).sort() };\n }\n\n async getEnvironments(_args: GetEnvironmentsArgs): Promise {\n const envSet = new Set();\n for (const record of this.iterateObservabilityContextRecords()) {\n if (record.environment) envSet.add(record.environment);\n }\n return { environments: Array.from(envSet).sort() };\n }\n\n async getTags(args: GetTagsArgs): Promise {\n const tagSet = new Set();\n for (const record of this.iterateObservabilityContextRecords()) {\n if (!record.tags) continue;\n if (args.entityType && record.entityType !== args.entityType) continue;\n for (const tag of record.tags) {\n tagSet.add(tag);\n }\n }\n return { tags: Array.from(tagSet).sort() };\n }\n\n // ============================================================================\n // Logs\n // ============================================================================\n\n async batchCreateLogs(args: BatchCreateLogsArgs): Promise {\n for (const log of args.logs) {\n const record = log as LogRecord;\n this.upsertByIdField(this.db.logRecords, this.db.logCursorIds, record, 'logId');\n }\n }\n\n async listLogs(args: ListLogsArgs): Promise {\n const { mode, filters, pagination, orderBy, after, limit } = listLogsArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const deltaResponse = this.listAppendOnlyDelta(\n this.db.logRecords,\n this.db.logCursorIds,\n log => this.logMatchesFilters(log, filters),\n after,\n limit,\n );\n\n return {\n logs: deltaResponse.rows,\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\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 ...this.pageDeltaCursor(\n this.maxMatchingCursorId(this.db.logRecords, this.db.logCursorIds, log => this.logMatchesFilters(log, filters)),\n ),\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 {\n const scoreSource = args.score.scoreSource ?? args.score.source ?? null;\n const record = {\n ...args.score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord;\n this.upsertByIdField(this.db.scoreRecords, this.db.scoreCursorIds, record, 'scoreId');\n }\n\n async batchCreateScores(args: BatchCreateScoresArgs): Promise {\n for (const score of args.scores) {\n const scoreSource = score.scoreSource ?? score.source ?? null;\n const record = {\n ...score,\n scoreSource,\n source: scoreSource,\n } as ScoreRecord;\n this.upsertByIdField(this.db.scoreRecords, this.db.scoreCursorIds, record, 'scoreId');\n }\n }\n\n async listScores(args: ListScoresArgs): Promise {\n const { mode, filters, pagination, orderBy, after, limit } = listScoresArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const deltaResponse = this.listAppendOnlyDelta(\n this.db.scoreRecords,\n this.db.scoreCursorIds,\n score => this.scoreMatchesFilters(score, filters),\n after,\n limit,\n );\n\n return {\n scores: deltaResponse.rows,\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\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 ...this.pageDeltaCursor(\n this.maxMatchingCursorId(this.db.scoreRecords, this.db.scoreCursorIds, score =>\n this.scoreMatchesFilters(score, filters),\n ),\n ),\n };\n }\n\n async getScoreById(scoreId: string): Promise {\n return this.db.scoreRecords.find(score => score.scoreId === scoreId) ?? null;\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 {\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 {\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();\n for (const score of filtered) {\n const dims: Record = {};\n for (const col of args.groupBy) {\n const value = (score as Record)[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,\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 {\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>();\n const seriesNames = new Map();\n\n for (const score of filtered) {\n const values = args.groupBy.map(col => (score as Record)[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();\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 {\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();\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 {\n const record = {\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 this.upsertByIdField(this.db.feedbackRecords, this.db.feedbackCursorIds, record, 'feedbackId');\n }\n\n async batchCreateFeedback(args: BatchCreateFeedbackArgs): Promise {\n for (const fb of args.feedbacks) {\n const record = {\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 this.upsertByIdField(this.db.feedbackRecords, this.db.feedbackCursorIds, record, 'feedbackId');\n }\n }\n\n async listFeedback(args: ListFeedbackArgs): Promise {\n const { mode, filters, pagination, orderBy, after, limit } = listFeedbackArgsSchema.parse(args);\n\n if (mode === 'delta') {\n this.assertDeltaPollingEnabled();\n const deltaResponse = this.listAppendOnlyDelta(\n this.db.feedbackRecords,\n this.db.feedbackCursorIds,\n feedback => this.feedbackMatchesFilters(feedback, filters),\n after,\n limit,\n );\n\n return {\n feedback: deltaResponse.rows,\n delta: deltaResponse.delta,\n deltaCursor: deltaResponse.deltaCursor,\n };\n }\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 ...this.pageDeltaCursor(\n this.maxMatchingCursorId(this.db.feedbackRecords, this.db.feedbackCursorIds, feedback =>\n this.feedbackMatchesFilters(feedback, filters),\n ),\n ),\n };\n }\n\n async getFeedbackAggregate(args: GetFeedbackAggregateArgs): Promise {\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 {\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();\n for (const feedback of filtered) {\n const dims: Record = {};\n for (const col of args.groupBy) {\n const rawValue = (feedback as Record)[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,\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 {\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>();\n const seriesNames = new Map();\n\n for (const feedback of filtered) {\n const values = args.groupBy.map(col => (feedback as Record)[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();\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 {\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();\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 | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? (value as Record) : 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 | 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): Partial {\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): Record {\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 | null,\n): Partial {\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 {\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 scorerName: s.scorerName ?? null,\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.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 {\n // Default no-op - subclasses override\n }\n\n /** Insert a new task record. */\n abstract createTask(task: BackgroundTask): Promise;\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;\n\n /** Get a single task by ID. Returns null if not found. */\n abstract getTask(taskId: string): Promise;\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;\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;\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;\n\n /** Count tasks currently in 'running' status across all agents. */\n abstract getRunningCount(): Promise;\n\n /** Count tasks currently in 'running' status for a specific agent. */\n abstract getRunningCountByAgent(agentId: string): Promise;\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 {\n this.db.backgroundTasks.clear();\n }\n\n async createTask(task: BackgroundTask): Promise {\n this.db.backgroundTasks.set(task.id, { ...task });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise {\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 {\n const task = this.db.backgroundTasks.get(taskId);\n return task ? { ...task } : null;\n }\n\n async listTasks(filter: TaskFilter): Promise {\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.toolCallId) {\n tasks = tasks.filter(t => t.toolCallId === filter.toolCallId);\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 {\n this.db.backgroundTasks.delete(taskId);\n }\n\n async deleteTasks(filter: TaskFilter): Promise {\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 {\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 {\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;\n\n /**\n * Store a blob. If the hash already exists, this is a no-op.\n */\n abstract put(entry: StorageBlobEntry): Promise;\n\n /**\n * Retrieve a blob by its hash.\n * Returns null if not found.\n */\n abstract get(hash: string): Promise;\n\n /**\n * Check if a blob exists by hash.\n */\n abstract has(hash: string): Promise;\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;\n\n /**\n * Store multiple blobs in a batch. Skips any that already exist.\n */\n abstract putMany(entries: StorageBlobEntry[]): Promise;\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>;\n\n /**\n * Delete all blobs. Used for testing.\n */\n abstract dangerouslyClearAll(): Promise;\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();\n\n async init(): Promise {\n // No-op for in-memory store\n }\n\n async put(entry: StorageBlobEntry): Promise {\n if (!this.#blobs.has(entry.hash)) {\n this.#blobs.set(entry.hash, entry);\n }\n }\n\n async get(hash: string): Promise {\n return this.#blobs.get(hash) ?? null;\n }\n\n async has(hash: string): Promise {\n return this.#blobs.has(hash);\n }\n\n async delete(hash: string): Promise {\n return this.#blobs.delete(hash);\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise {\n for (const entry of entries) {\n await this.put(entry);\n }\n }\n\n async getMany(hashes: string[]): Promise> {\n const result = new Map();\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 {\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;\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;\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;\n\n /**\n * Get an installation by ID.\n */\n abstract getInstallation(id: string): Promise;\n\n /**\n * Get an installation by platform and agent ID.\n */\n abstract getInstallationByAgent(platform: string, agentId: string): Promise;\n\n /**\n * Get an installation by webhook ID (for routing inbound requests).\n */\n abstract getInstallationByWebhookId(webhookId: string): Promise;\n\n /**\n * List all installations for a platform.\n */\n abstract listInstallations(platform: string): Promise;\n\n /**\n * Delete an installation.\n */\n abstract deleteInstallation(id: string): Promise;\n\n /**\n * Save platform configuration (e.g., Slack App Configuration Tokens, Telegram parent bot token).\n */\n abstract saveConfig(config: ChannelConfig): Promise;\n\n /**\n * Get platform configuration.\n */\n abstract getConfig(platform: string): Promise;\n\n /**\n * Delete platform configuration.\n */\n abstract deleteConfig(platform: string): Promise;\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();\n #configs = new Map();\n\n async saveInstallation(installation: ChannelInstallation): Promise {\n this.#installations.set(installation.id, { ...installation });\n }\n\n async getInstallation(id: string): Promise {\n const inst = this.#installations.get(id);\n return inst ? { ...inst } : null;\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise {\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 {\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 {\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 {\n this.#installations.delete(id);\n }\n\n async saveConfig(config: ChannelConfig): Promise {\n this.#configs.set(config.platform, { ...config });\n }\n\n async getConfig(platform: string): Promise {\n const config = this.#configs.get(platform);\n return config ? { ...config } : null;\n }\n\n async deleteConfig(platform: string): Promise {\n this.#configs.delete(platform);\n }\n\n async dangerouslyClearAll(): Promise {\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();\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 {\n // Default no-op - subclasses override\n }\n\n // Dataset CRUD\n abstract createDataset(input: CreateDatasetInput): Promise;\n abstract getDatasetById(args: { id: string }): Promise;\n abstract deleteDataset(args: { id: string }): Promise;\n abstract listDatasets(args: ListDatasetsInput): Promise;\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 {\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;\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 {\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;\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 {\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;\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 {\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;\n\n abstract listItems(args: ListDatasetItemsInput): Promise;\n abstract getItemById(args: { id: string; datasetVersion?: number }): Promise;\n\n // SCD-2 queries\n abstract getItemsByVersion(args: { datasetId: string; version: number }): Promise;\n abstract getItemHistory(itemId: string): Promise;\n\n // Dataset version methods\n abstract createDatasetVersion(datasetId: string, version: number): Promise;\n abstract listDatasetVersions(input: ListDatasetVersionsInput): Promise;\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 {\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;\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 {\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;\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 & {\n inputSchema?: Record | null;\n groundTruthSchema?: Record | null;\n requestContextSchema?: Record | 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 {\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 {\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 {\n const record = this.db.datasets.get(id);\n return record ? toDatasetRecord(record) : null;\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\n // Default no-op - subclasses override\n }\n\n // Experiment lifecycle\n abstract createExperiment(input: CreateExperimentInput): Promise;\n abstract updateExperiment(input: UpdateExperimentInput): Promise;\n abstract getExperimentById(args: { id: string }): Promise;\n abstract listExperiments(args: ListExperimentsInput): Promise;\n abstract deleteExperiment(args: { id: string }): Promise;\n\n // Results (per-item)\n abstract addExperimentResult(input: AddExperimentResultInput): Promise;\n abstract updateExperimentResult(input: UpdateExperimentResultInput): Promise;\n abstract getExperimentResultById(args: { id: string }): Promise;\n abstract listExperimentResults(args: ListExperimentResultsInput): Promise;\n abstract deleteExperimentResults(args: { experimentId: string }): Promise;\n\n // Aggregation\n abstract getReviewSummary(): Promise;\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 {\n this.db.experiments.clear();\n this.db.experimentResults.clear();\n }\n\n // Experiment lifecycle\n async createExperiment(input: CreateExperimentInput): Promise {\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 {\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 {\n return this.db.experiments.get(args.id) ?? null;\n }\n\n async listExperiments(args: ListExperimentsInput): Promise {\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 {\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 {\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 {\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 {\n return this.db.experimentResults.get(args.id) ?? null;\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise {\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 {\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 {\n const counts = new Map();\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 { StorageDomain } from '../base';\nimport type { HarnessPendingItemRecord, SessionRecord, SessionRecordUpdate } from './types';\n\nexport abstract class HarnessStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'HARNESS',\n });\n }\n\n abstract loadSession(sessionId: string): Promise;\n\n abstract saveSession(record: SessionRecord): Promise;\n\n abstract listSessions(): Promise;\n\n async updateSession(sessionId: string, updates: SessionRecordUpdate): Promise {\n const record = await this.loadSession(sessionId);\n if (!record) {\n throw new Error(`Harness session \"${sessionId}\" was not found`);\n }\n\n const next: SessionRecord = {\n ...record,\n ...updates,\n id: record.id,\n createdAt: record.createdAt,\n lastActivityAt: updates.lastActivityAt ?? new Date(),\n };\n await this.saveSession(next);\n return next;\n }\n\n async appendPendingItem(sessionId: string, item: HarnessPendingItemRecord): Promise {\n const record = await this.loadSession(sessionId);\n if (!record) {\n throw new Error(`Harness session \"${sessionId}\" was not found`);\n }\n\n if (record.pending?.some(existing => existing.id === item.id)) {\n throw new Error(`Harness pending item \"${item.id}\" already exists on session \"${sessionId}\"`);\n }\n\n return this.updateSession(sessionId, {\n pending: [...(record.pending ?? []), item],\n });\n }\n\n async updatePendingItem(\n sessionId: string,\n pendingItemId: string,\n updates: Partial>,\n ): Promise {\n const record = await this.loadSession(sessionId);\n if (!record) {\n throw new Error(`Harness session \"${sessionId}\" was not found`);\n }\n\n let found = false;\n const pending = (record.pending ?? []).map(item => {\n if (item.id !== pendingItemId) return item;\n found = true;\n return {\n ...item,\n ...updates,\n id: item.id,\n sessionId: item.sessionId,\n createdAt: item.createdAt,\n updatedAt: new Date(),\n };\n });\n\n if (!found) {\n throw new Error(`Harness pending item \"${pendingItemId}\" was not found on session \"${sessionId}\"`);\n }\n\n return this.updateSession(sessionId, { pending });\n }\n\n async removePendingItem(sessionId: string, pendingItemId: string): Promise {\n const record = await this.loadSession(sessionId);\n if (!record) {\n throw new Error(`Harness session \"${sessionId}\" was not found`);\n }\n\n return this.updateSession(sessionId, {\n pending: (record.pending ?? []).filter(item => item.id !== pendingItemId),\n });\n }\n}\n","import { HarnessStorage } from './base';\nimport type { HarnessPendingItemRecord, SessionRecord, SessionRecordUpdate } from './types';\n\nfunction clonePendingItemRecord(item: HarnessPendingItemRecord): HarnessPendingItemRecord {\n return {\n ...item,\n createdAt: new Date(item.createdAt),\n updatedAt: new Date(item.updatedAt),\n payload: item.payload ? structuredClone(item.payload) : undefined,\n response: item.response ? structuredClone(item.response) : undefined,\n };\n}\n\nfunction cloneSessionRecord(record: SessionRecord): SessionRecord {\n return {\n ...record,\n source: record.source ? { ...record.source } : undefined,\n metadata: record.metadata ? structuredClone(record.metadata) : undefined,\n state: record.state ? structuredClone(record.state) : undefined,\n pending: record.pending ? record.pending.map(clonePendingItemRecord) : undefined,\n createdAt: new Date(record.createdAt),\n lastActivityAt: new Date(record.lastActivityAt),\n closingAt: record.closingAt ? new Date(record.closingAt) : record.closingAt,\n closeDeadlineAt: record.closeDeadlineAt ? new Date(record.closeDeadlineAt) : record.closeDeadlineAt,\n closedAt: record.closedAt ? new Date(record.closedAt) : record.closedAt,\n deletedAt: record.deletedAt ? new Date(record.deletedAt) : record.deletedAt,\n };\n}\n\nexport class InMemoryHarness extends HarnessStorage {\n readonly #sessions = new Map();\n\n async dangerouslyClearAll(): Promise {\n this.#sessions.clear();\n }\n\n async loadSession(sessionId: string): Promise {\n const record = this.#sessions.get(sessionId);\n return record ? cloneSessionRecord(record) : null;\n }\n\n async saveSession(record: SessionRecord): Promise {\n this.#sessions.set(record.id, cloneSessionRecord(record));\n }\n\n async listSessions(): Promise {\n return [...this.#sessions.values()].map(cloneSessionRecord);\n }\n\n override async updateSession(sessionId: string, updates: SessionRecordUpdate): Promise {\n const record = this.#sessions.get(sessionId);\n if (!record) {\n throw new Error(`Harness session \"${sessionId}\" was not found`);\n }\n\n const next = cloneSessionRecord({\n ...record,\n ...updates,\n id: record.id,\n createdAt: record.createdAt,\n lastActivityAt: updates.lastActivityAt ?? new Date(),\n });\n this.#sessions.set(sessionId, next);\n return cloneSessionRecord(next);\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 {\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({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise;\n\n abstract saveThread({ thread }: { thread: StorageThreadType }): Promise;\n\n abstract updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record;\n }): Promise;\n\n abstract deleteThread({ threadId }: { threadId: string }): Promise;\n\n abstract listMessages(args: StorageListMessagesInput): Promise;\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 {\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> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise;\n\n async deleteMessages(_messageIds: string[]): Promise {\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;\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 {\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 {\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 {\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;\n }): Promise {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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, source: Record): Record {\n const output: Record = { ...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 | 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 = {\n createdAt: true,\n updatedAt: true,\n};\n\nconst THREAD_THREAD_SORT_DIRECTION_SET: Record = {\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 {\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({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise {\n const thread = this.db.threads.get(threadId);\n if (!thread || (resourceId !== undefined && thread.resourceId !== resourceId)) return null;\n return { ...thread, metadata: thread.metadata ? { ...thread.metadata } : thread.metadata };\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise {\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;\n }): Promise {\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 {\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 {\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 // When perPage is 0 with no includes, there's nothing to return.\n if (perPage === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\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). When\n // perPage is 0, the count query is skipped so the response total is 0.\n const totalThreadMessages = perPage === 0 ? 0 : threadMessages.length;\n\n // Apply pagination to thread messages. When perPage is 0, skip the main\n // pagination entirely so only included messages are returned.\n const paginatedThreadMessages = perPage === 0 ? [] : threadMessages.slice(offset, offset + perPage);\n\n // Convert paginated thread messages to MastraDBMessage\n const messages: MastraDBMessage[] = [];\n const messageIds = new Set();\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 (perPage === 0) {\n // perPage=0 fast path skips pagination entirely\n hasMore = false;\n } else 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 = offset + perPage < 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 {\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 & { id: string })[] }): Promise {\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 {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n // Collect thread IDs to update\n const threadIds = new Set();\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 {\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 {\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 {\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;\n }): Promise {\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 {\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 = {};\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\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 {\n const key = this.getObservationalMemoryKey(threadId, resourceId);\n this.db.observationalMemory.delete(key);\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise {\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 {\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, 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 { randomUUID } from 'node:crypto';\n\nimport { getErrorFromUnknown } from '../error';\nimport { EventEmitterPubSub } from '../events/event-emitter';\nimport type { PubSub } from '../events/pubsub';\nimport type { EventCallback } from '../events/types';\nimport { parseMemoryRequestContext } from '../memory/types';\nimport type { RequestContext } from '../request-context';\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from '../request-context';\nimport type { MastraModelOutput } from '../stream/base/output';\nimport type { Agent } from './agent';\nimport type { AgentExecutionOptions } from './agent.types';\nimport type { MessageListInput } from './message-list';\nimport { createMessageSignal, createSignal, resolveDeliveryAttributes } from './signals';\nimport type { AgentMessageInput, AgentStateSignalInput, CreatedAgentSignal } from './signals';\nimport { applyStateSignal } from './state-signals';\nimport type {\n AgentSignal,\n AgentSubscribeToThreadOptions,\n AgentThreadSubscription,\n QueueAgentMessageOptions,\n QueueAgentMessageResult,\n SendAgentMessageOptions,\n SendAgentMessageResult,\n SendAgentSignalOptions,\n SendAgentSignalResult,\n SendAgentStateSignalOptions,\n SendAgentStateSignalResult,\n} from './types';\n\nconst AGENT_THREAD_KEY_SEPARATOR = '\\u0000';\nconst AGENT_THREAD_STREAM_TOPIC_PREFIX = 'agent.thread-stream';\n\nexport let defaultAgentThreadPubSub: PubSub = new EventEmitterPubSub();\n\nfunction withThreadMemory(memory: unknown, resourceId: string, threadId: string) {\n return {\n ...((memory && typeof memory === 'object' ? memory : {}) as Record),\n resource: (memory as { resource?: string } | undefined)?.resource ?? resourceId,\n thread: (memory as { thread?: string } | undefined)?.thread ?? threadId,\n };\n}\n\ntype AgentThreadRunRecord = {\n agent: Agent;\n output: MastraModelOutput;\n runId: string;\n threadId: string;\n resourceId?: string;\n streamOptions: AgentExecutionOptions;\n createSubscriberStream?: () => ReadableStream;\n};\n\ntype PreparedThreadRun = {\n abortController: AbortController;\n cleanup: () => void;\n};\n\ntype PendingIdleSignal = {\n agent: Agent;\n signal: CreatedAgentSignal;\n runId: string;\n resourceId: string;\n threadId: string;\n streamOptions?: AgentExecutionOptions;\n};\n\ntype PendingContinuation = {\n agent: Agent;\n messages: MessageListInput;\n runId: string;\n resourceId: string;\n threadId: string;\n streamOptions?: AgentExecutionOptions;\n};\n\ntype AgentThreadRuntimeState = {\n threadRunsById: Map>;\n threadKeysByRunId: Map;\n activeThreadRunIds: Map;\n approvalSuspendedRunIds: Set;\n pendingSignalsByThread: Map;\n // Signals queued for a run that is starting but has not made its first model\n // request yet. The first LLM step drains these and folds them into that\n // request; `pendingSignalsByThread` follow-ups instead become their own turn.\n preRunSignalsByThread: Map;\n pendingIdleSignalsByThread: Map[]>;\n pendingContinuationsByThread: Map[]>;\n watchedThreadRunIds: Set;\n preparedRunsById: Map;\n abortedRunIds: Set;\n};\n\nexport type AgentThreadState = 'active' | 'idle';\n\ntype SerializableAgentSignal = AgentSignal & Pick;\n\ntype AgentThreadStreamRuntimeEvent =\n | { type: 'run-registered'; runId: string }\n | { type: 'stream-part'; runId: string; part: unknown; sourceId: string }\n | { type: 'run-completed'; runId: string }\n | { type: 'run-suspended'; runId: string }\n | { type: 'run-aborted'; runId: string }\n | { type: 'run-failed'; runId: string; error: string }\n | { type: 'signal-enqueued'; runId: string; signal: SerializableAgentSignal; sourceId: string; preRun?: boolean };\n\nfunction createRuntimeState(): AgentThreadRuntimeState {\n return {\n threadRunsById: new Map(),\n threadKeysByRunId: new Map(),\n activeThreadRunIds: new Map(),\n approvalSuspendedRunIds: new Set(),\n pendingSignalsByThread: new Map(),\n preRunSignalsByThread: new Map(),\n pendingIdleSignalsByThread: new Map(),\n pendingContinuationsByThread: new Map(),\n watchedThreadRunIds: new Set(),\n preparedRunsById: new Map(),\n abortedRunIds: new Set(),\n };\n}\n\nexport class AgentThreadStreamRuntime {\n #id?: string;\n #statesByPubSub = new WeakMap();\n\n #getPubSub(pubsub?: PubSub): PubSub {\n return pubsub ?? defaultAgentThreadPubSub;\n }\n\n #getSourceId(): string {\n this.#id ??= randomUUID();\n return this.#id;\n }\n\n #getState(pubsub?: PubSub): AgentThreadRuntimeState {\n const resolvedPubSub = this.#getPubSub(pubsub);\n let state = this.#statesByPubSub.get(resolvedPubSub);\n if (!state) {\n state = createRuntimeState();\n this.#statesByPubSub.set(resolvedPubSub, state);\n }\n return state;\n }\n\n #threadKey(resourceId: string | undefined, threadId: string): string {\n return [resourceId ?? '', threadId].join(AGENT_THREAD_KEY_SEPARATOR);\n }\n\n #threadTopic(key: string): string {\n return `${AGENT_THREAD_STREAM_TOPIC_PREFIX}.${encodeURIComponent(key)}`;\n }\n\n #isApprovalSuspendedRun(state: AgentThreadRuntimeState, runId: string) {\n return state.approvalSuspendedRunIds.has(runId);\n }\n\n #isThreadBlockingRun(state: AgentThreadRuntimeState, record: AgentThreadRunRecord) {\n return record.output.status === 'running' || this.#isApprovalSuspendedRun(state, record.runId);\n }\n\n #serializeSignal(signal: CreatedAgentSignal): SerializableAgentSignal {\n return signal;\n }\n\n getThreadState(options: { resourceId?: string; threadId: string }, pubsub?: PubSub): AgentThreadState {\n const state = this.#getState(pubsub);\n const key = this.#threadKey(options.resourceId, options.threadId);\n const activeRunId = state.activeThreadRunIds.get(key);\n if (!activeRunId) return 'idle';\n\n const activeRecord = state.threadRunsById.get(activeRunId);\n if (activeRecord && !this.#isThreadBlockingRun(state, activeRecord)) {\n state.activeThreadRunIds.delete(key);\n return 'idle';\n }\n\n return 'active';\n }\n\n #publish(pubsub: PubSub | undefined, key: string, event: AgentThreadStreamRuntimeEvent) {\n void this.#publishAndWait(pubsub, key, event).catch(() => {});\n }\n\n async #publishAndWait(pubsub: PubSub | undefined, key: string, event: AgentThreadStreamRuntimeEvent) {\n await this.#getPubSub(pubsub).publish(this.#threadTopic(key), {\n type: event.type,\n runId: event.runId,\n data: event,\n });\n }\n\n #withBroadcastStream(output: MastraModelOutput, pubsub: PubSub | undefined, key: string) {\n const runtime = this;\n\n const parts: unknown[] = [];\n const waiters = new Set<() => void>();\n let started = false;\n let done = false;\n let error: unknown;\n\n const wake = () => {\n const pending = [...waiters];\n waiters.clear();\n for (const waiter of pending) waiter();\n };\n\n const emitPart = async (part: unknown) => {\n if (part && typeof part === 'object' && 'type' in part && part.type === 'tool-call-approval') {\n runtime.#getState(pubsub).approvalSuspendedRunIds.add(output.runId);\n }\n parts.push(part);\n await runtime.#publishAndWait(pubsub, key, {\n type: 'stream-part',\n runId: output.runId,\n part,\n sourceId: runtime.#getSourceId(),\n });\n wake();\n };\n\n const start = () => {\n if (started) return;\n started = true;\n void (async () => {\n try {\n const source = output.fullStream as ReadableStream | undefined;\n if (!source) return;\n\n if (typeof source.getReader === 'function') {\n const reader = source.getReader();\n try {\n while (true) {\n const { value: part, done: streamDone } = await reader.read();\n if (streamDone) break;\n await emitPart(part);\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const part of source as any) {\n await emitPart(part);\n }\n }\n } catch (caught) {\n error = caught;\n } finally {\n done = true;\n wake();\n }\n })();\n };\n\n const createStream = () => {\n let index = 0;\n let closed = false;\n let waiter: (() => void) | undefined;\n return new ReadableStream({\n async pull(controller) {\n start();\n while (!closed) {\n if (index < parts.length) {\n controller.enqueue(parts[index++]);\n return;\n }\n if (error) {\n controller.error(error);\n return;\n }\n if (done) {\n controller.close();\n return;\n }\n await new Promise(resolve => {\n waiter = resolve;\n waiters.add(resolve);\n });\n if (waiter) {\n waiters.delete(waiter);\n waiter = undefined;\n }\n }\n },\n cancel() {\n closed = true;\n if (waiter) {\n waiters.delete(waiter);\n waiter();\n waiter = undefined;\n }\n },\n });\n };\n\n return { output, createSubscriberStream: createStream, startBroadcast: start };\n }\n\n #getThreadTarget(options?: { memory?: AgentExecutionOptions['memory']; requestContext?: RequestContext }) {\n const thread = options?.memory?.thread;\n const threadId =\n (options?.requestContext?.get(MASTRA_THREAD_ID_KEY) as string | undefined) ||\n (typeof thread === 'string' ? thread : thread?.id);\n const resourceId =\n (options?.requestContext?.get(MASTRA_RESOURCE_ID_KEY) as string | undefined) || options?.memory?.resource;\n\n return { threadId, resourceId };\n }\n\n prepareRunOptions(options: AgentExecutionOptions, pubsub?: PubSub): AgentExecutionOptions {\n const { threadId } = this.#getThreadTarget(options);\n if (!threadId || !options.runId) return options;\n\n const state = this.#getState(pubsub);\n const abortController = new AbortController();\n const upstreamAbortSignal = options.abortSignal;\n const abort = () => abortController.abort();\n if (upstreamAbortSignal?.aborted) {\n abort();\n } else {\n upstreamAbortSignal?.addEventListener('abort', abort, { once: true });\n }\n\n state.preparedRunsById.set(options.runId, {\n abortController,\n cleanup: () => upstreamAbortSignal?.removeEventListener('abort', abort),\n });\n\n if (state.abortedRunIds.has(options.runId)) {\n abort();\n }\n\n return {\n ...options,\n abortSignal: abortController.signal,\n };\n }\n\n abortRun(runId: string, pubsub?: PubSub): boolean {\n const state = this.#getState(pubsub);\n const preparedRun = state.preparedRunsById.get(runId);\n if (!preparedRun) {\n state.abortedRunIds.add(runId);\n return false;\n }\n\n preparedRun.abortController.abort();\n state.abortedRunIds.add(runId);\n\n const key = state.threadKeysByRunId.get(runId);\n if (key) {\n this.#publish(pubsub, key, { type: 'run-aborted', runId });\n }\n\n return true;\n }\n\n getActiveThreadRunId(options: AgentSubscribeToThreadOptions, pubsub?: PubSub): string | undefined {\n const state = this.#getState(pubsub);\n const key = this.#threadKey(options.resourceId, options.threadId);\n const activeRunId = state.activeThreadRunIds.get(key);\n if (!activeRunId) return undefined;\n\n const record = state.threadRunsById.get(activeRunId);\n if (record && !this.#isThreadBlockingRun(state, record)) return undefined;\n\n return activeRunId;\n }\n\n abortThread(options: AgentSubscribeToThreadOptions, pubsub?: PubSub): boolean {\n const activeRunId = this.getActiveThreadRunId(options, pubsub);\n if (!activeRunId) return false;\n return this.abortRun(activeRunId, pubsub);\n }\n\n /** @internal */\n resetForTests() {\n for (const pubsub of [defaultAgentThreadPubSub]) {\n this.#resetState(pubsub);\n void (pubsub as { close?: () => Promise }).close?.();\n }\n defaultAgentThreadPubSub = new EventEmitterPubSub();\n }\n\n #resetState(pubsub: PubSub) {\n const state = this.#statesByPubSub.get(pubsub);\n if (!state) return;\n\n state.preparedRunsById.forEach(preparedRun => {\n preparedRun.abortController.abort();\n preparedRun.cleanup();\n });\n state.threadRunsById.clear();\n state.threadKeysByRunId.clear();\n state.activeThreadRunIds.clear();\n state.approvalSuspendedRunIds.clear();\n state.pendingSignalsByThread.clear();\n state.preRunSignalsByThread.clear();\n state.pendingIdleSignalsByThread.clear();\n state.pendingContinuationsByThread.clear();\n state.watchedThreadRunIds.clear();\n state.preparedRunsById.clear();\n state.abortedRunIds.clear();\n }\n\n #cleanupPreparedRun(state: AgentThreadRuntimeState, runId: string) {\n state.preparedRunsById.get(runId)?.cleanup();\n state.preparedRunsById.delete(runId);\n state.abortedRunIds.delete(runId);\n }\n\n async #persistSignal(\n agent: Agent,\n signal: CreatedAgentSignal,\n resourceId: string,\n threadId: string,\n requestContext?: RequestContext,\n ) {\n const memory = await agent.getMemory({ requestContext });\n if (!memory) return;\n await memory.saveMessages({\n messages: [signal.toDBMessage({ resourceId, threadId })],\n });\n }\n\n #broadcastPersistedSignal(\n state: AgentThreadRuntimeState,\n pubsub: PubSub | undefined,\n key: string,\n runId: string,\n signal: CreatedAgentSignal,\n resourceId: string,\n threadId: string,\n ) {\n let finish!: () => void;\n const finished = new Promise(resolve => {\n finish = resolve;\n });\n const parts: any[] = [\n { type: 'start', runId },\n { ...signal.toDataPart(), runId },\n {\n type: 'finish',\n runId,\n payload: {\n stepResult: { reason: 'stop' },\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n },\n },\n ];\n const output = {\n runId,\n status: 'running',\n fullStream: new ReadableStream({\n start(controller) {\n for (const part of parts) controller.enqueue(part);\n controller.close();\n finish();\n },\n }),\n _waitUntilFinished: () => finished,\n } as MastraModelOutput;\n const {\n output: outputForSubscribers,\n createSubscriberStream,\n startBroadcast,\n } = this.#withBroadcastStream(output, pubsub, key);\n const record: AgentThreadRunRecord = {\n agent: { id: `persisted-signal:${signal.id}` } as Agent,\n output: outputForSubscribers,\n runId,\n threadId,\n resourceId,\n streamOptions: {},\n createSubscriberStream,\n };\n\n state.threadRunsById.set(runId, record);\n state.threadKeysByRunId.set(runId, key);\n const registered = this.#publishAndWait(pubsub, key, { type: 'run-registered', runId });\n void registered.then(startBroadcast, startBroadcast);\n void outputForSubscribers._waitUntilFinished().finally(() => {\n setTimeout(() => {\n state.threadRunsById.delete(runId);\n state.threadKeysByRunId.delete(runId);\n if (state.activeThreadRunIds.get(key) === runId) {\n state.activeThreadRunIds.delete(key);\n }\n this.#publish(pubsub, key, { type: 'run-completed', runId });\n }, 0);\n });\n }\n\n async #persistAndBroadcastIdleSignal(\n state: AgentThreadRuntimeState,\n pubsub: PubSub | undefined,\n key: string,\n runId: string,\n agent: Agent,\n signal: CreatedAgentSignal,\n resourceId: string,\n threadId: string,\n requestContext?: RequestContext,\n ) {\n await this.#persistSignal(agent, signal, resourceId, threadId, requestContext);\n this.#broadcastPersistedSignal(state, pubsub, key, runId, signal, resourceId, threadId);\n }\n\n registerRun(\n agent: Agent,\n output: MastraModelOutput,\n streamOptions: AgentExecutionOptions,\n pubsub?: PubSub,\n ) {\n const { threadId, resourceId } = this.#getThreadTarget(streamOptions);\n if (!threadId) return;\n\n const state = this.#getState(pubsub);\n const key = this.#threadKey(resourceId, threadId);\n const {\n output: outputForSubscribers,\n createSubscriberStream,\n startBroadcast,\n } = this.#withBroadcastStream(output, pubsub, key);\n const record: AgentThreadRunRecord = {\n agent,\n output: outputForSubscribers,\n runId: output.runId,\n threadId,\n resourceId,\n streamOptions: streamOptions as AgentThreadRunRecord['streamOptions'],\n createSubscriberStream,\n };\n\n state.threadRunsById.set(output.runId, record);\n state.threadKeysByRunId.set(output.runId, key);\n state.activeThreadRunIds.set(key, output.runId);\n const registered = this.#publishAndWait(pubsub, key, { type: 'run-registered', runId: output.runId });\n void registered.then(startBroadcast, startBroadcast);\n this.#watchThreadRunCompletion(state, pubsub, key, record);\n }\n\n #watchThreadRunCompletion(\n state: AgentThreadRuntimeState,\n pubsub: PubSub | undefined,\n key: string,\n record: AgentThreadRunRecord,\n ) {\n if (state.watchedThreadRunIds.has(record.runId)) return;\n state.watchedThreadRunIds.add(record.runId);\n\n void record.output._waitUntilFinished().finally(() => {\n state.watchedThreadRunIds.delete(record.runId);\n this.#cleanupPreparedRun(state, record.runId);\n\n if (record.output.status === 'suspended' && this.#isApprovalSuspendedRun(state, record.runId)) {\n this.#publish(pubsub, key, { type: 'run-suspended', runId: record.runId });\n return;\n }\n\n state.approvalSuspendedRunIds.delete(record.runId);\n state.threadRunsById.delete(record.runId);\n state.threadKeysByRunId.delete(record.runId);\n if (state.activeThreadRunIds.get(key) === record.runId) {\n state.activeThreadRunIds.delete(key);\n }\n this.#publish(pubsub, key, { type: 'run-completed', runId: record.runId });\n void this.#drainPendingSignals(state, pubsub, key, record);\n });\n }\n\n async #drainPendingSignals(\n state: AgentThreadRuntimeState,\n pubsub: PubSub | undefined,\n key: string,\n previousRun: AgentThreadRunRecord,\n ) {\n if (state.activeThreadRunIds.has(key)) {\n return;\n }\n\n // A run can finish before its first model request drained its pre-run\n // signals (e.g. it errored early). Don't strand them — fold them into the\n // follow-up queue so the next run still picks them up.\n const preRunLeftover = state.preRunSignalsByThread.get(key);\n if (preRunLeftover?.length) {\n state.preRunSignalsByThread.delete(key);\n state.pendingSignalsByThread.set(key, [...preRunLeftover, ...(state.pendingSignalsByThread.get(key) ?? [])]);\n }\n\n const queue = state.pendingSignalsByThread.get(key);\n const signal = queue?.shift();\n if (signal && queue) {\n if (queue.length === 0) {\n state.pendingSignalsByThread.delete(key);\n }\n\n const output = await previousRun.agent.stream(signal, {\n ...(previousRun.streamOptions as any),\n runId: randomUUID(),\n memory: withThreadMemory(\n previousRun.streamOptions.memory,\n previousRun.resourceId ?? '',\n previousRun.threadId ?? '',\n ),\n });\n\n if (queue.length > 0) {\n const nextRecord = state.threadRunsById.get(output.runId);\n if (nextRecord) {\n this.#watchThreadRunCompletion(state, pubsub, key, nextRecord);\n }\n }\n return;\n }\n\n if (await this.#drainPendingContinuations(state, pubsub, key)) {\n return;\n }\n\n await this.#drainPendingIdleSignals(state, pubsub, key);\n }\n\n async #drainPendingContinuations(state: AgentThreadRuntimeState, pubsub: PubSub | undefined, key: string) {\n if (state.activeThreadRunIds.has(key)) {\n return false;\n }\n\n const queue = state.pendingContinuationsByThread.get(key);\n const pending = queue?.shift();\n if (!pending || !queue) {\n return false;\n }\n if (queue.length === 0) {\n state.pendingContinuationsByThread.delete(key);\n }\n\n this.#startContinuation(state, pubsub, key, pending);\n return true;\n }\n\n #startContinuation(\n state: AgentThreadRuntimeState,\n pubsub: PubSub | undefined,\n key: string,\n pending: PendingContinuation,\n ) {\n state.activeThreadRunIds.set(key, pending.runId);\n state.threadKeysByRunId.set(pending.runId, key);\n void pending.agent\n .stream(pending.messages, {\n ...(pending.streamOptions as any),\n runId: pending.runId,\n memory: withThreadMemory(pending.streamOptions?.memory, pending.resourceId, pending.threadId),\n })\n .then(output => {\n if ((state.pendingContinuationsByThread.get(key)?.length ?? 0) > 0) {\n const nextRecord = state.threadRunsById.get(output.runId);\n if (nextRecord) {\n this.#watchThreadRunCompletion(state, pubsub, key, nextRecord);\n }\n }\n })\n .catch(err => {\n state.threadKeysByRunId.delete(pending.runId);\n this.#cleanupPreparedRun(state, pending.runId);\n if (state.activeThreadRunIds.get(key) === pending.runId) {\n state.activeThreadRunIds.delete(key);\n }\n this.#publish(pubsub, key, {\n type: 'run-failed',\n runId: pending.runId,\n error: getErrorFromUnknown(err).message,\n });\n void this.#drainPendingContinuations(state, pubsub, key).then(started => {\n if (!started) {\n void this.#drainPendingIdleSignals(state, pubsub, key);\n }\n });\n });\n }\n\n continueWithMessages(\n agent: Agent,\n messages: MessageListInput,\n target: { resourceId: string; threadId: string; streamOptions?: AgentExecutionOptions; runId?: string },\n pubsub?: PubSub,\n ): { accepted: true; runId: string } {\n const state = this.#getState(pubsub);\n const key = this.#threadKey(target.resourceId, target.threadId);\n const runId = target.runId ?? randomUUID();\n const pending: PendingContinuation = {\n agent,\n messages,\n runId,\n resourceId: target.resourceId,\n threadId: target.threadId,\n streamOptions: target.streamOptions,\n };\n\n const activeRunId = state.activeThreadRunIds.get(key);\n const activeRecord = activeRunId ? state.threadRunsById.get(activeRunId) : undefined;\n if (state.activeThreadRunIds.has(key)) {\n const queue = state.pendingContinuationsByThread.get(key) ?? [];\n queue.push(pending);\n state.pendingContinuationsByThread.set(key, queue);\n if (activeRecord) {\n this.#watchThreadRunCompletion(state, pubsub, key, activeRecord);\n }\n return { accepted: true, runId };\n }\n\n this.#startContinuation(state, pubsub, key, pending);\n return { accepted: true, runId };\n }\n\n async #drainPendingIdleSignals(state: AgentThreadRuntimeState, pubsub: PubSub | undefined, key: string) {\n if (state.activeThreadRunIds.has(key)) {\n return;\n }\n\n const idleQueue = state.pendingIdleSignalsByThread.get(key);\n const pendingIdle = idleQueue?.shift();\n if (!pendingIdle || !idleQueue) {\n return;\n }\n if (idleQueue.length === 0) {\n state.pendingIdleSignalsByThread.delete(key);\n }\n\n state.activeThreadRunIds.set(key, pendingIdle.runId);\n state.threadKeysByRunId.set(pendingIdle.runId, key);\n try {\n const output = await pendingIdle.agent.stream(pendingIdle.signal, {\n ...(pendingIdle.streamOptions as any),\n runId: pendingIdle.runId,\n memory: withThreadMemory(pendingIdle.streamOptions?.memory, pendingIdle.resourceId, pendingIdle.threadId),\n });\n\n if ((idleQueue?.length ?? 0) > 0) {\n const nextRecord = state.threadRunsById.get(output.runId);\n if (nextRecord) {\n this.#watchThreadRunCompletion(state, pubsub, key, nextRecord);\n }\n }\n } catch (err) {\n state.threadKeysByRunId.delete(pendingIdle.runId);\n this.#cleanupPreparedRun(state, pendingIdle.runId);\n if (state.activeThreadRunIds.get(key) === pendingIdle.runId) {\n state.activeThreadRunIds.delete(key);\n }\n this.#publish(pubsub, key, {\n type: 'run-failed',\n runId: pendingIdle.runId,\n error: getErrorFromUnknown(err).message,\n });\n void this.#drainPendingIdleSignals(state, pubsub, key);\n }\n }\n\n /**\n * Drains queued signals for a run.\n *\n * - `scope: 'pending'` (default) returns active-run follow-up signals — each\n * becomes its own model turn via `signalDrainStep`.\n * - `scope: 'pre-run'` returns signals queued before the run's first model\n * request — the first LLM step folds these into that request.\n */\n drainPendingSignals(runId: string, pubsub?: PubSub, scope: 'pending' | 'pre-run' = 'pending'): CreatedAgentSignal[] {\n const state = this.#getState(pubsub);\n const record = state.threadRunsById.get(runId);\n const key = record ? this.#threadKey(record.resourceId, record.threadId) : state.threadKeysByRunId.get(runId);\n if (!key) return [];\n\n const signalsByThread = scope === 'pre-run' ? state.preRunSignalsByThread : state.pendingSignalsByThread;\n const queue = signalsByThread.get(key);\n if (!queue || queue.length === 0) {\n return [];\n }\n\n signalsByThread.delete(key);\n return queue;\n }\n\n async waitForCrossAgentThreadRun(\n agent: Agent,\n options: { memory?: AgentExecutionOptions['memory']; requestContext?: RequestContext },\n pubsub?: PubSub,\n ) {\n const { threadId, resourceId } = this.#getThreadTarget(options);\n if (!threadId) return;\n\n const state = this.#getState(pubsub);\n const key = this.#threadKey(resourceId, threadId);\n while (true) {\n const activeRunId = state.activeThreadRunIds.get(key);\n if (!activeRunId) return;\n\n const activeRecord = state.threadRunsById.get(activeRunId);\n if (activeRecord) {\n if (activeRecord.agent.id === agent.id || !this.#isThreadBlockingRun(state, activeRecord)) {\n return;\n }\n await activeRecord.output._waitUntilFinished().catch(() => {});\n continue;\n }\n\n if (state.threadKeysByRunId.get(activeRunId) === key) return;\n\n await this.#waitForRemoteRunToFinish(pubsub, key, activeRunId);\n }\n }\n\n async #waitForRemoteRunToFinish(pubsub: PubSub | undefined, key: string, runId: string) {\n const resolvedPubSub = this.#getPubSub(pubsub);\n const topic = this.#threadTopic(key);\n await new Promise(resolve => {\n const onEvent: EventCallback = event => {\n const data = event.data as AgentThreadStreamRuntimeEvent | undefined;\n if (\n (data?.type === 'run-completed' || data?.type === 'run-aborted' || data?.type === 'run-failed') &&\n data.runId === runId\n ) {\n void resolvedPubSub.unsubscribe(topic, onEvent).catch(() => {});\n resolve();\n }\n };\n void resolvedPubSub.subscribe(topic, onEvent).catch(() => resolve());\n });\n }\n\n async subscribeToThread(\n agent: Agent,\n options: AgentSubscribeToThreadOptions,\n pubsub?: PubSub,\n ): Promise> {\n void agent;\n const resolvedPubSub = this.#getPubSub(pubsub);\n const state = this.#getState(resolvedPubSub);\n const key = this.#threadKey(options.resourceId, options.threadId);\n const topic = this.#threadTopic(key);\n const seenRunIds = new Set();\n const pendingRuns: AgentThreadRunRecord[] = [];\n const waiters: Array<() => void> = [];\n const remoteRuns = new Map<\n string,\n {\n parts: unknown[];\n waiters: Array<() => void>;\n finishWaiters: Array<() => void>;\n done: boolean;\n stream: ReadableStream;\n }\n >();\n let done = false;\n\n const wake = () => {\n while (waiters.length) waiters.shift()?.();\n };\n\n const activeRunId = () => {\n const runId = state.activeThreadRunIds.get(key);\n if (!runId) return null;\n const record = state.threadRunsById.get(runId);\n // No record yet means either a remote run (record never lives locally) or a local run\n // that sendSignal has reserved but has not yet registered via registerRun. Both are\n // in flight from the subscriber's perspective; treat them as active.\n if (!record) return runId;\n return this.#isThreadBlockingRun(state, record) ? runId : null;\n };\n\n const enqueueRun = (record: AgentThreadRunRecord) => {\n if (done || seenRunIds.has(record.runId)) return;\n seenRunIds.add(record.runId);\n pendingRuns.push(record);\n wake();\n };\n\n const createRemoteRun = (runId: string): AgentThreadRunRecord => {\n const remoteRun = {\n parts: [] as unknown[],\n waiters: [] as Array<() => void>,\n finishWaiters: [] as Array<() => void>,\n done: false,\n stream: undefined as unknown as ReadableStream,\n closed: false,\n };\n remoteRun.stream = new ReadableStream({\n pull(controller) {\n const drain = () => {\n if (remoteRun.closed) return;\n while (remoteRun.parts.length > 0) {\n controller.enqueue(remoteRun.parts.shift());\n }\n if (remoteRun.done) {\n remoteRun.closed = true;\n controller.close();\n }\n };\n drain();\n if (!remoteRun.done && !remoteRun.closed) {\n remoteRun.waiters.push(drain);\n }\n },\n cancel() {\n remoteRun.done = true;\n remoteRun.closed = true;\n remoteRun.waiters.length = 0;\n while (remoteRun.finishWaiters.length) remoteRun.finishWaiters.shift()?.();\n },\n });\n remoteRuns.set(runId, remoteRun);\n return {\n agent,\n output: {\n runId,\n status: 'running',\n fullStream: remoteRun.stream,\n _waitUntilFinished: async () => {\n if (remoteRun.done) return;\n await new Promise(resolve => remoteRun.finishWaiters.push(resolve));\n },\n } as MastraModelOutput,\n runId,\n threadId: options.threadId,\n resourceId: options.resourceId,\n streamOptions: {},\n };\n };\n\n const onEvent: EventCallback = event => {\n const data = event.data as AgentThreadStreamRuntimeEvent | undefined;\n if (!data) return;\n if (data.type === 'run-registered') {\n state.activeThreadRunIds.set(key, data.runId);\n const record = state.threadRunsById.get(data.runId) ?? createRemoteRun(data.runId);\n enqueueRun(record);\n wake();\n return;\n }\n if (data.type === 'stream-part') {\n if (data.sourceId === this.#id) return;\n let remoteRun = remoteRuns.get(data.runId);\n if (!remoteRun) {\n // A subscriber can attach after another runtime already broadcast run-registered.\n // Treat the first stream-part on this thread topic as proof of the remote run and\n // create the local proxy stream from that point forward.\n state.activeThreadRunIds.set(key, data.runId);\n enqueueRun(createRemoteRun(data.runId));\n remoteRun = remoteRuns.get(data.runId);\n if (!remoteRun) return;\n }\n remoteRun.parts.push(data.part);\n while (remoteRun.waiters.length) remoteRun.waiters.shift()?.();\n return;\n }\n if (data.type === 'signal-enqueued') {\n if (data.sourceId === this.#id) return;\n const signalsByThread = data.preRun ? state.preRunSignalsByThread : state.pendingSignalsByThread;\n const queue = signalsByThread.get(key) ?? [];\n queue.push(createSignal(data.signal));\n signalsByThread.set(key, queue);\n return;\n }\n if (data.type === 'run-failed') {\n if (state.activeThreadRunIds.get(key) === data.runId) {\n state.activeThreadRunIds.delete(key);\n }\n const errorRun = createRemoteRun(data.runId);\n const remoteRun = remoteRuns.get(data.runId);\n if (remoteRun) {\n remoteRun.parts.push({ type: 'error', payload: { error: new Error(data.error) } });\n remoteRun.done = true;\n while (remoteRun.waiters.length) remoteRun.waiters.shift()?.();\n while (remoteRun.finishWaiters.length) remoteRun.finishWaiters.shift()?.();\n remoteRuns.delete(data.runId);\n }\n enqueueRun(errorRun);\n seenRunIds.delete(data.runId);\n void this.#drainPendingIdleSignals(state, resolvedPubSub, key);\n wake();\n return;\n }\n if (data.type === 'run-completed' || data.type === 'run-aborted' || data.type === 'run-suspended') {\n if (\n (data.type !== 'run-suspended' || !state.approvalSuspendedRunIds.has(data.runId)) &&\n state.activeThreadRunIds.get(key) === data.runId\n ) {\n state.activeThreadRunIds.delete(key);\n }\n if (data.type !== 'run-suspended') {\n state.approvalSuspendedRunIds.delete(data.runId);\n }\n const remoteRun = remoteRuns.get(data.runId);\n if (remoteRun) {\n remoteRun.done = true;\n while (remoteRun.waiters.length) remoteRun.waiters.shift()?.();\n while (remoteRun.finishWaiters.length) remoteRun.finishWaiters.shift()?.();\n remoteRuns.delete(data.runId);\n }\n // When a run is aborted, cancel the current subscriber stream reader so\n // the generator's inner loop unblocks and can yield the synthetic abort.\n if (data.type === 'run-aborted' && activeReaderRunId === data.runId && currentReader) {\n cancelledByAbort = true;\n try {\n void currentReader.cancel();\n } catch {}\n }\n // Allow the same runId to be re-enqueued when it resumes (e.g. after tool approval).\n seenRunIds.delete(data.runId);\n if (data.type !== 'run-suspended') {\n void this.#drainPendingIdleSignals(state, resolvedPubSub, key);\n }\n wake();\n }\n };\n\n await resolvedPubSub.subscribe(topic, onEvent);\n\n const currentRunId = activeRunId();\n const currentRecord = currentRunId ? state.threadRunsById.get(currentRunId) : undefined;\n if (currentRecord) {\n enqueueRun(currentRecord);\n }\n\n // Mutable ref to the subscriber stream reader currently being consumed by\n // the generator. When a run-aborted event fires, we cancel this reader so\n // the blocked `reader.read()` resolves immediately with {done: true}.\n let currentReader: ReadableStreamDefaultReader | null = null;\n let activeReaderRunId: string | null = null;\n // Set to true when the reader is cancelled explicitly due to a run-aborted\n // event, so the generator can yield a synthetic abort chunk.\n let cancelledByAbort = false;\n\n const unsubscribe = () => {\n if (done) return;\n done = true;\n void resolvedPubSub.unsubscribe(topic, onEvent).catch(() => {});\n // Cancel current reader so the generator's inner loop breaks.\n if (currentReader) {\n try {\n void currentReader.cancel();\n } catch {}\n }\n wake();\n };\n\n return {\n activeRunId,\n abort: () => this.abortThread(options, resolvedPubSub),\n unsubscribe,\n stream: (async function* () {\n try {\n while (!done || pendingRuns.length > 0) {\n if (pendingRuns.length === 0) {\n await new Promise(resolve => waiters.push(resolve));\n continue;\n }\n const run = pendingRuns.shift()!;\n // Local registered runs expose createSubscriberStream, while remote runs are\n // already per-subscription streams. Do not silently skip locked streams here:\n // a locked fallback stream means a caller is sharing a non-multicast stream.\n const subscriberStream = run.createSubscriberStream?.() ?? run.output.fullStream;\n const reader = subscriberStream.getReader();\n currentReader = reader as ReadableStreamDefaultReader;\n activeReaderRunId = run.runId;\n let readerReleased = false;\n try {\n while (true) {\n const { value: part, done: streamDone } = await reader.read();\n if (streamDone) break;\n const typedPart = part as any;\n yield typedPart;\n if (done) break;\n if (\n typedPart.type === 'finish' ||\n typedPart.type === 'error' ||\n typedPart.type === 'abort' ||\n typedPart.type === 'tool-call-suspended'\n ) {\n // After a terminal chunk, drain remaining stream data in the\n // background to prevent backpressure from blocking upstream\n // processing (e.g. OM), while allowing the generator to\n // immediately serve subsequent runs.\n readerReleased = true;\n void (async () => {\n try {\n while (true) {\n const { done: d } = await reader.read();\n if (d) break;\n }\n } catch {}\n reader.releaseLock();\n })();\n break;\n }\n }\n // If the stream closed because we cancelled the reader after a\n // run-aborted event, yield a synthetic abort so subscribers\n // finalize the run.\n if (!readerReleased && !done && cancelledByAbort) {\n yield { type: 'abort', runId: run.runId } as any;\n cancelledByAbort = false;\n }\n } finally {\n currentReader = null;\n activeReaderRunId = null;\n if (!readerReleased) {\n reader.releaseLock();\n }\n }\n }\n } finally {\n unsubscribe();\n }\n })(),\n };\n }\n\n sendMessage(\n agent: Agent,\n message: AgentMessageInput,\n target: SendAgentMessageOptions,\n pubsub?: PubSub,\n ): SendAgentMessageResult {\n return this.sendSignal(agent, createMessageSignal(message, { acceptedAt: new Date() }), target, pubsub);\n }\n\n queueMessage(\n agent: Agent,\n message: AgentMessageInput,\n target: QueueAgentMessageOptions,\n pubsub?: PubSub,\n ): QueueAgentMessageResult {\n const state = this.#getState(pubsub);\n const signal = createMessageSignal(message, { acceptedAt: new Date() });\n let key: string | undefined;\n let runId = target.runId;\n let activeRecord: AgentThreadRunRecord | undefined;\n\n if (target.resourceId && target.threadId) {\n key = this.#threadKey(target.resourceId, target.threadId);\n const activeRunId = state.activeThreadRunIds.get(key);\n activeRecord = activeRunId ? state.threadRunsById.get(activeRunId) : undefined;\n if (activeRecord && !this.#isThreadBlockingRun(state, activeRecord)) {\n state.activeThreadRunIds.delete(key);\n activeRecord = undefined;\n }\n runId ??= activeRunId;\n }\n\n if (runId) {\n activeRecord ??= state.threadRunsById.get(runId);\n if (activeRecord) {\n key ??= this.#threadKey(activeRecord.resourceId, activeRecord.threadId);\n }\n }\n\n const resourceId = target.resourceId ?? activeRecord?.resourceId;\n const threadId = target.threadId ?? activeRecord?.threadId;\n if (!resourceId || !threadId) {\n throw new Error('resourceId and threadId are required to queue a message');\n }\n\n key ??= this.#threadKey(resourceId, threadId);\n const queuedRunId = randomUUID();\n const queuedStreamOptions = target.ifIdle?.streamOptions ?? activeRecord?.streamOptions;\n\n if (activeRecord) {\n const idleQueue = state.pendingIdleSignalsByThread.get(key) ?? [];\n idleQueue.push({ agent, signal, runId: queuedRunId, resourceId, threadId, streamOptions: queuedStreamOptions });\n state.pendingIdleSignalsByThread.set(key, idleQueue);\n this.#watchThreadRunCompletion(state, pubsub, key, activeRecord);\n return { accepted: true, runId: queuedRunId, signal };\n }\n\n return this.sendSignal(\n agent,\n signal,\n { ...target, runId, resourceId, threadId, ifIdle: { ...target.ifIdle, behavior: 'wake' } },\n pubsub,\n );\n }\n\n async sendStateSignal(\n agent: Agent,\n stateInput: AgentStateSignalInput,\n target: SendAgentStateSignalOptions,\n pubsub?: PubSub,\n ): Promise {\n if (!target.resourceId || !target.threadId) {\n throw new Error('resourceId and threadId are required to send a state signal');\n }\n const resourceId = target.resourceId;\n const threadId = target.threadId;\n\n const requestContext = target.ifIdle?.streamOptions?.requestContext;\n const memoryContext = parseMemoryRequestContext(requestContext);\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new Error('sendStateSignal requires Mastra memory');\n }\n\n const loadedThread = (await memory.getThreadById({ threadId })) ?? memoryContext?.thread;\n if (!loadedThread) {\n throw new Error(`sendStateSignal could not load thread ${threadId}`);\n }\n\n const thread = {\n ...loadedThread,\n id: threadId,\n resourceId: loadedThread.resourceId ?? resourceId,\n createdAt: loadedThread.createdAt ?? new Date(),\n updatedAt: loadedThread.updatedAt ?? new Date(),\n metadata: loadedThread.metadata,\n };\n\n const applied = await applyStateSignal({\n input: stateInput,\n memory,\n thread,\n resourceId,\n threadId,\n memoryConfig: memoryContext?.memoryConfig,\n acceptedAt: new Date(),\n });\n\n if (applied.skipped) {\n return { accepted: true, skipped: true, reason: 'unchanged' };\n }\n\n return this.sendSignal(agent, applied.signal, target, pubsub);\n }\n\n /**\n * Routes a signal to an agent thread.\n *\n * Signals can land in three places:\n * - an active same-agent run, where they are queued for the execution loop to drain;\n * - a reserved thread run that has not registered its stream record yet;\n * - a new idle-started run, when the caller opts into `ifIdle`.\n *\n * Cross-agent active runs are intentionally not interrupted here. They either finish first\n * through `waitForCrossAgentThreadRun()` on the stream path, or this method falls through to\n * the idle-start path when the caller provided a resource/thread target and `ifIdle` options.\n */\n sendSignal(\n agent: Agent,\n signalInput: AgentSignal,\n target: SendAgentSignalOptions,\n pubsub?: PubSub,\n ): SendAgentSignalResult {\n const state = this.#getState(pubsub);\n let signal = createSignal({ ...signalInput, acceptedAt: new Date() });\n let key: string | undefined;\n let runId = target.runId;\n const activeBehavior = target.ifActive?.behavior ?? 'deliver';\n const idleBehavior = target.ifIdle?.behavior ?? 'wake';\n\n let activeRecord: AgentThreadRunRecord | undefined;\n if (target.resourceId && target.threadId) {\n key = this.#threadKey(target.resourceId, target.threadId);\n const activeRunId = state.activeThreadRunIds.get(key);\n activeRecord = activeRunId ? state.threadRunsById.get(activeRunId) : undefined;\n if (activeRecord && !this.#isThreadBlockingRun(state, activeRecord)) {\n state.activeThreadRunIds.delete(key);\n activeRecord = undefined;\n }\n\n // Prefer the active same-agent run for thread-targeted signals. This is the normal\n // follow-up path used by clients that know the thread/resource but not the run id.\n if (activeRecord && activeRecord.agent.id === agent.id) {\n runId = activeRecord.runId;\n } else if (activeRunId && !activeRecord) {\n // A run can be reserved before its stream record is registered. Keep the reserved\n // id so early follow-ups still attach to the run that is starting.\n runId = activeRunId;\n }\n }\n\n const isActiveTarget = Boolean(\n runId && (activeRecord?.output.status === 'running' || (key && state.activeThreadRunIds.get(key) === runId)),\n );\n const resourceId = target.resourceId ?? activeRecord?.resourceId;\n const threadId = target.threadId ?? activeRecord?.threadId;\n\n // Resolve conditional delivery attributes now that we know the delivery path.\n signal = resolveDeliveryAttributes(\n signal,\n isActiveTarget ? target.ifActive?.attributes : target.ifIdle?.attributes,\n );\n\n if (isActiveTarget && activeBehavior !== 'deliver') {\n if (activeBehavior === 'persist') {\n if (!resourceId || !threadId) {\n throw new Error('resourceId and threadId are required to persist an active signal');\n }\n const persisted = this.#persistSignal(\n agent,\n signal,\n resourceId,\n threadId,\n target.ifIdle?.streamOptions?.requestContext,\n );\n void persisted.catch(() => {});\n return { accepted: true, runId: runId!, signal, persisted };\n }\n return { accepted: true, runId: runId!, signal };\n }\n\n if (runId) {\n activeRecord ??= state.threadRunsById.get(runId);\n // A run is \"blocking\" while it is running or suspended awaiting tool approval. Both\n // states mean the run has already made model requests, so a follow-up signal must be\n // queued as a pending (next-turn) signal rather than folded into a not-yet-started\n // first request via the pre-run path below.\n if (activeRecord && this.#isThreadBlockingRun(state, activeRecord)) {\n key ??= this.#threadKey(activeRecord.resourceId, activeRecord.threadId);\n if (activeRecord.agent.id === agent.id) {\n // Same-agent active run: queue the signal for in-loop draining so it becomes\n // the next model input instead of waiting for the run to finish.\n const queue = state.pendingSignalsByThread.get(key) ?? [];\n queue.push(signal);\n state.pendingSignalsByThread.set(key, queue);\n this.#publish(pubsub, key, {\n type: 'signal-enqueued',\n runId,\n signal: this.#serializeSignal(signal),\n sourceId: this.#getSourceId(),\n });\n this.#watchThreadRunCompletion(state, pubsub, key, activeRecord);\n return { accepted: true, runId, signal };\n }\n }\n\n if (key && state.activeThreadRunIds.get(key) === runId) {\n // A local reserved run has not registered its stream record yet, so it\n // has not made its first model request — queue the signal as a pre-run\n // signal so the first LLM step folds it into that request. A run owned\n // by another runtime instance is reached only via PubSub; treat it as a\n // follow-up, since the sender cannot see the owner's request state.\n const isLocalReservedRun = state.threadKeysByRunId.get(runId) === key;\n if (isLocalReservedRun) {\n const queue = state.preRunSignalsByThread.get(key) ?? [];\n queue.push(signal);\n state.preRunSignalsByThread.set(key, queue);\n }\n this.#publish(pubsub, key, {\n type: 'signal-enqueued',\n runId,\n signal: this.#serializeSignal(signal),\n sourceId: this.#getSourceId(),\n preRun: isLocalReservedRun,\n });\n return { accepted: true, runId, signal };\n }\n }\n\n if (!resourceId || !threadId) {\n throw new Error('No active agent run found for signal target');\n }\n\n runId = randomUUID();\n key ??= this.#threadKey(resourceId, threadId);\n if (idleBehavior === 'persist') {\n const persisted = this.#persistAndBroadcastIdleSignal(\n state,\n pubsub,\n key,\n runId,\n agent,\n signal,\n resourceId,\n threadId,\n target.ifIdle?.streamOptions?.requestContext,\n );\n void persisted.catch(() => {});\n return { accepted: true, runId, signal, persisted };\n }\n if (idleBehavior !== 'wake') {\n return { accepted: true, runId, signal };\n }\n\n if (state.activeThreadRunIds.has(key)) {\n // Another run owns the thread. Queue this idle-start request and let the watcher\n // launch it only after the active run clears the thread reservation.\n const idleQueue = state.pendingIdleSignalsByThread.get(key) ?? [];\n idleQueue.push({ agent, signal, runId, resourceId, threadId, streamOptions: target.ifIdle?.streamOptions });\n state.pendingIdleSignalsByThread.set(key, idleQueue);\n if (activeRecord) {\n this.#watchThreadRunCompletion(state, pubsub, key, activeRecord);\n }\n return { accepted: true, runId, signal };\n }\n\n // No active same-agent run accepted the signal. Reserve the thread before starting\n // the idle stream so concurrent callers do not launch duplicate runs.\n state.activeThreadRunIds.set(key, runId);\n state.threadKeysByRunId.set(runId, key);\n void agent\n .stream(signal, {\n ...(target.ifIdle?.streamOptions as any),\n runId,\n memory: withThreadMemory(target.ifIdle?.streamOptions?.memory, resourceId, threadId),\n })\n .catch(err => {\n state.threadKeysByRunId.delete(runId);\n this.#cleanupPreparedRun(state, runId);\n if (state.activeThreadRunIds.get(key) === runId) {\n state.activeThreadRunIds.delete(key);\n }\n this.#publish(pubsub, key, {\n type: 'run-failed',\n runId,\n error: getErrorFromUnknown(err).message,\n });\n void this.#drainPendingIdleSignals(state, pubsub, key);\n });\n\n return { accepted: true, runId, signal };\n }\n}\n\nexport const agentThreadStreamRuntime = new AgentThreadStreamRuntime();\n","import { createSignal } from '../agent/signals';\nimport type { AgentSignalAttributes, CreatedAgentSignal } from '../agent/signals';\nimport type {\n NotificationPriority,\n NotificationRecord,\n NotificationSignalMetadata,\n NotificationSummary,\n NotificationSummarySignalMetadata,\n} from './types';\n\nexport function notificationSignalAttributes(notification: NotificationRecord): AgentSignalAttributes {\n return {\n ...notification.attributes,\n id: notification.id,\n source: notification.source,\n type: notification.kind,\n kind: notification.kind,\n priority: notification.priority,\n status: notification.status,\n ...(notification.coalescedCount && notification.coalescedCount > 1\n ? { coalescedCount: notification.coalescedCount }\n : {}),\n };\n}\n\nexport function notificationSummaryContents(summary: NotificationSummary): string {\n const sources = Object.entries(summary.bySource)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([source, count]) => `${source}: ${count}`)\n .join(', ');\n return sources || 'No pending notifications';\n}\n\nconst priorityOrder: NotificationPriority[] = ['low', 'medium', 'high', 'urgent'];\n\nfunction highestPriority(byPriority: Partial>): NotificationPriority | undefined {\n for (let i = priorityOrder.length - 1; i >= 0; i -= 1) {\n const priority = priorityOrder[i];\n if (priority && (byPriority[priority] ?? 0) > 0) return priority;\n }\n return undefined;\n}\n\nexport function notificationSignalMetadata(notification: NotificationRecord): NotificationSignalMetadata {\n return {\n signal: 'notification',\n recordId: notification.id,\n source: notification.source,\n kind: notification.kind,\n priority: notification.priority,\n status: notification.status,\n ...(notification.coalescedCount && notification.coalescedCount > 1\n ? { coalescedCount: notification.coalescedCount }\n : {}),\n ...(notification.deliveredAt ? { deliveredAt: notification.deliveredAt.toISOString() } : {}),\n ...(notification.seenAt ? { seenAt: notification.seenAt.toISOString() } : {}),\n };\n}\n\nexport function notificationSummarySignalMetadata(summary: NotificationSummary): NotificationSummarySignalMetadata {\n const priority = highestPriority(summary.byPriority);\n return {\n signal: 'summary',\n pending: summary.pending,\n groups: Object.entries(summary.bySource)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([source, count]) => ({ source, count })),\n byPriority: summary.byPriority,\n notificationIds: summary.notificationIds,\n ...(priority ? { priority } : {}),\n };\n}\n\nexport function createNotificationSignal(notification: NotificationRecord): CreatedAgentSignal {\n return createSignal({\n type: 'notification',\n tagName: 'notification',\n contents: notification.summary,\n attributes: notificationSignalAttributes(notification),\n metadata: { ...notification.metadata, notification: notificationSignalMetadata(notification) },\n });\n}\n\nexport function createNotificationSummarySignal(summary: NotificationSummary): CreatedAgentSignal {\n const notification = notificationSummarySignalMetadata(summary);\n return createSignal({\n type: 'notification',\n tagName: 'notification-summary',\n contents: notificationSummaryContents(summary),\n attributes: {\n pending: summary.pending,\n ...(notification.priority ? { priority: notification.priority } : {}),\n },\n metadata: { notification, notificationSummary: summary, notificationIds: summary.notificationIds },\n });\n}\n\nexport function summarizeNotifications(notifications: NotificationRecord[]): NotificationSummary {\n const pendingNotifications = notifications.filter(notification => notification.status === 'pending');\n const first = pendingNotifications[0] ?? notifications[0];\n return pendingNotifications.reduce(\n (summary, notification) => {\n summary.pending += 1;\n summary.bySource[notification.source] = (summary.bySource[notification.source] ?? 0) + 1;\n summary.byPriority[notification.priority] = (summary.byPriority[notification.priority] ?? 0) + 1;\n summary.notificationIds.push(notification.id);\n return summary;\n },\n {\n threadId: first?.threadId ?? '',\n resourceId: first?.resourceId,\n agentId: first?.agentId,\n pending: 0,\n bySource: {},\n byPriority: {},\n notificationIds: [],\n },\n );\n}\n","import type { CreatedAgentSignal } from '../agent/signals';\nimport { agentThreadStreamRuntime } from '../agent/thread-stream-runtime';\nimport type { SendAgentSignalOptions } from '../agent/types';\nimport type { PubSub } from '../events';\nimport type { Mastra } from '../mastra';\nimport { createNotificationSignal, createNotificationSummarySignal, summarizeNotifications } from './signals';\nimport type { NotificationsStorage } from './storage';\nimport type { NotificationDeliveryThreadState, NotificationRecord } from './types';\n\ntype NotificationDispatchAgent = {\n id?: string;\n getPubSub?: () => PubSub | undefined;\n sendSignal: (\n signal: CreatedAgentSignal,\n target: SendAgentSignalOptions,\n ) => {\n accepted: boolean;\n runId: string;\n signal: CreatedAgentSignal;\n persisted?: Promise;\n };\n};\n\nexport type DispatchDueNotificationsInput = {\n mastra: Mastra;\n storage: NotificationsStorage;\n now?: Date;\n limit?: number;\n};\n\nexport type DispatchDueNotificationsResult = {\n delivered: NotificationRecord[];\n failed: Array<{ record: NotificationRecord; error: string }>;\n signals: CreatedAgentSignal[];\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\nconst isSummaryDue = (record: NotificationRecord, now: Date): boolean =>\n Boolean(record.summaryAt && record.summaryAt.getTime() <= now.getTime());\n\nconst deliveryPriority: Record = {\n urgent: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\n\ntype DueDispatchGroup = {\n key: string;\n agentId: string;\n resourceId: string;\n threadId: string;\n summaryRecords: NotificationRecord[];\n individualRecords: NotificationRecord[];\n};\n\ntype DueDispatchItem =\n | { type: 'summary'; records: NotificationRecord[]; priority: NotificationRecord['priority']; createdAt: Date }\n | { type: 'individual'; record: NotificationRecord; priority: NotificationRecord['priority']; createdAt: Date };\n\nconst compareDueDispatchItems = (a: DueDispatchItem, b: DueDispatchItem): number =>\n deliveryPriority[a.priority] - deliveryPriority[b.priority] || a.createdAt.getTime() - b.createdAt.getTime();\n\nconst getHighestPriority = (records: NotificationRecord[]): NotificationRecord['priority'] =>\n records.reduce(\n (highest, record) => (deliveryPriority[record.priority] < deliveryPriority[highest] ? record.priority : highest),\n 'low',\n );\n\nconst getEarliestCreatedAt = (records: NotificationRecord[]): Date =>\n records.reduce(\n (earliest, record) => (record.createdAt.getTime() < earliest.getTime() ? record.createdAt : earliest),\n records[0]!.createdAt,\n );\n\nconst groupKey = (record: NotificationRecord): string | undefined => {\n if (!record.agentId || !record.resourceId || !record.threadId) return undefined;\n return [record.agentId, record.resourceId, record.threadId].join('\\0');\n};\n\nasync function recordDeliveryFailure({\n storage,\n record,\n now,\n error,\n}: {\n storage: NotificationsStorage;\n record: NotificationRecord;\n now: Date;\n error: unknown;\n}) {\n await storage.updateNotification({\n id: record.id,\n threadId: record.threadId,\n deliveryAttempts: (record.deliveryAttempts ?? 0) + 1,\n lastDeliveryAttemptAt: now,\n lastDeliveryError: errorMessage(error),\n });\n}\n\nasync function sendNotificationRecord({\n mastra,\n storage,\n record,\n now,\n batchThreadState,\n}: {\n mastra: Mastra;\n storage: NotificationsStorage;\n record: NotificationRecord;\n now: Date;\n batchThreadState?: NotificationDeliveryThreadState;\n}): Promise<{ record: NotificationRecord; signal: CreatedAgentSignal } | null> {\n const current = await storage.getNotification({ threadId: record.threadId, id: record.id });\n if (!current || current.status !== 'pending' || current.deliveredSignalId) return null;\n if (!current.agentId) throw new Error(`Notification ${current.id} is missing agentId`);\n if (!current.resourceId) throw new Error(`Notification ${current.id} is missing resourceId`);\n\n const agent = (await mastra.getAgentById(current.agentId as never)) as NotificationDispatchAgent;\n if (current.priority === 'high' && current.summarySignalId) {\n const threadState =\n batchThreadState ??\n agentThreadStreamRuntime.getThreadState(\n { resourceId: current.resourceId, threadId: current.threadId },\n agent.getPubSub?.(),\n );\n if (threadState === 'active') return null;\n }\n\n const signal = createNotificationSignal({\n ...current,\n status: 'delivered',\n deliveredAt: now,\n lastDeliveryAttemptAt: now,\n });\n const target: SendAgentSignalOptions = { resourceId: current.resourceId, threadId: current.threadId };\n const result = agent.sendSignal(signal, target);\n await result.persisted;\n if (!result.accepted) {\n throw new Error(`Notification ${current.id} signal was rejected`);\n }\n const updated = await storage.updateNotification({\n id: current.id,\n threadId: current.threadId,\n status: 'delivered',\n deliveredSignalId: result.signal.id,\n lastDeliveryAttemptAt: now,\n });\n return { record: updated, signal: result.signal };\n}\n\nasync function sendNotificationSummary({\n mastra,\n storage,\n records,\n now,\n}: {\n mastra: Mastra;\n storage: NotificationsStorage;\n records: NotificationRecord[];\n now: Date;\n}): Promise<{ records: NotificationRecord[]; signal: CreatedAgentSignal }> {\n const first = records[0];\n if (!first?.agentId) throw new Error('Notification summary is missing agentId');\n if (!first.resourceId) throw new Error('Notification summary is missing resourceId');\n\n const agent = await mastra.getAgentById(first.agentId as never);\n const summary = summarizeNotifications(records);\n const signal = createNotificationSummarySignal(summary);\n const target: SendAgentSignalOptions = records.every(record => record.priority === 'low')\n ? { resourceId: first.resourceId, threadId: first.threadId, ifIdle: { behavior: 'persist' } }\n : { resourceId: first.resourceId, threadId: first.threadId };\n const result = (agent as NotificationDispatchAgent).sendSignal(signal, target);\n await result.persisted;\n if (!result.accepted) {\n throw new Error(`Notification summary for thread ${first.threadId} was rejected`);\n }\n\n const updatedRecords: NotificationRecord[] = [];\n for (const record of records) {\n updatedRecords.push(\n await storage.updateNotification({\n id: record.id,\n threadId: record.threadId,\n summaryAt: null,\n summarySignalId: result.signal.id,\n lastDeliveryAttemptAt: now,\n }),\n );\n }\n return { records: updatedRecords, signal: result.signal };\n}\n\nasync function getBatchThreadState({\n mastra,\n group,\n}: {\n mastra: Mastra;\n group: DueDispatchGroup;\n}): Promise {\n const agent = (await mastra.getAgentById(group.agentId as never)) as NotificationDispatchAgent;\n return agentThreadStreamRuntime.getThreadState(\n { resourceId: group.resourceId, threadId: group.threadId },\n agent.getPubSub?.(),\n );\n}\n\nexport async function dispatchDueNotifications({\n mastra,\n storage,\n now = new Date(),\n limit = 100,\n}: DispatchDueNotificationsInput): Promise {\n const due = await storage.listDueNotifications({ now, limit });\n const delivered: NotificationRecord[] = [];\n const failed: Array<{ record: NotificationRecord; error: string }> = [];\n const signals: CreatedAgentSignal[] = [];\n const groups = new Map();\n const ungroupedIndividual: NotificationRecord[] = [];\n\n for (const record of due) {\n const key = groupKey(record);\n if (!key) {\n if (isSummaryDue(record, now)) {\n const error = new Error(\n `Notification ${record.id} cannot be summarized without agentId, resourceId, and threadId`,\n );\n await recordDeliveryFailure({ storage, record, now, error });\n failed.push({ record, error: error.message });\n } else {\n ungroupedIndividual.push(record);\n }\n continue;\n }\n\n const group = groups.get(key) ?? {\n key,\n agentId: record.agentId!,\n resourceId: record.resourceId!,\n threadId: record.threadId,\n summaryRecords: [],\n individualRecords: [],\n };\n if (isSummaryDue(record, now)) {\n group.summaryRecords.push(record);\n } else {\n group.individualRecords.push(record);\n }\n groups.set(key, group);\n }\n\n for (const group of groups.values()) {\n const records = [...group.summaryRecords, ...group.individualRecords];\n let batchThreadState: NotificationDeliveryThreadState;\n try {\n batchThreadState = await getBatchThreadState({ mastra, group });\n } catch (error) {\n for (const record of records) {\n await recordDeliveryFailure({ storage, record, now, error });\n failed.push({ record, error: errorMessage(error) });\n }\n continue;\n }\n\n const items: DueDispatchItem[] = group.individualRecords.map(record => ({\n type: 'individual',\n record,\n priority: record.priority,\n createdAt: record.createdAt,\n }));\n if (group.summaryRecords.length > 0) {\n items.push({\n type: 'summary',\n records: group.summaryRecords,\n priority: getHighestPriority(group.summaryRecords),\n createdAt: getEarliestCreatedAt(group.summaryRecords),\n });\n }\n items.sort(compareDueDispatchItems);\n\n for (const item of items) {\n if (item.type === 'summary') {\n try {\n const result = await sendNotificationSummary({ mastra, storage, records: item.records, now });\n delivered.push(...result.records);\n signals.push(result.signal);\n } catch (error) {\n for (const record of item.records) {\n await recordDeliveryFailure({ storage, record, now, error });\n failed.push({ record, error: errorMessage(error) });\n }\n }\n continue;\n }\n\n try {\n const result = await sendNotificationRecord({ mastra, storage, record: item.record, now, batchThreadState });\n if (!result) continue;\n delivered.push(result.record);\n signals.push(result.signal);\n } catch (error) {\n await recordDeliveryFailure({ storage, record: item.record, now, error });\n failed.push({ record: item.record, error: errorMessage(error) });\n }\n }\n }\n\n ungroupedIndividual.sort((a, b) =>\n compareDueDispatchItems(\n { type: 'individual', record: a, priority: a.priority, createdAt: a.createdAt },\n { type: 'individual', record: b, priority: b.priority, createdAt: b.createdAt },\n ),\n );\n for (const record of ungroupedIndividual) {\n try {\n const result = await sendNotificationRecord({ mastra, storage, record, now });\n if (!result) continue;\n delivered.push(result.record);\n signals.push(result.signal);\n } catch (error) {\n await recordDeliveryFailure({ storage, record, now, error });\n failed.push({ record, error: errorMessage(error) });\n }\n }\n\n return { delivered, failed, signals };\n}\n","import { randomUUID } from 'node:crypto';\nimport { StorageDomain } from '../storage/domains/base';\nimport type {\n CreateNotificationInput,\n ListDueNotificationsInput,\n ListNotificationsInput,\n NotificationRecord,\n NotificationStatus,\n UpdateNotificationInput,\n} from './types';\n\nexport abstract class NotificationsStorage extends StorageDomain {\n constructor() {\n super({ component: 'STORAGE', name: 'NOTIFICATIONS' });\n }\n\n abstract createNotification(input: CreateNotificationInput): Promise;\n abstract listNotifications(input: ListNotificationsInput): Promise;\n abstract listDueNotifications(input: ListDueNotificationsInput): Promise;\n abstract getNotification(input: { threadId: string; id: string }): Promise;\n abstract updateNotification(input: UpdateNotificationInput): Promise;\n}\n\nconst cloneDate = (value?: Date) => (value ? new Date(value) : undefined);\nconst notificationKey = (threadId: string, id: string) => `${threadId}\\0${id}`;\nconst cloneValue = (value: T | undefined): T | undefined =>\n value === undefined ? undefined : structuredClone(value);\n\nconst cloneRecord = (record: NotificationRecord): NotificationRecord => ({\n ...record,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n deliveredAt: cloneDate(record.deliveredAt),\n seenAt: cloneDate(record.seenAt),\n dismissedAt: cloneDate(record.dismissedAt),\n archivedAt: cloneDate(record.archivedAt),\n discardedAt: cloneDate(record.discardedAt),\n deliverAt: cloneDate(record.deliverAt),\n summaryAt: cloneDate(record.summaryAt),\n lastDeliveryAttemptAt: cloneDate(record.lastDeliveryAttemptAt),\n payload: cloneValue(record.payload),\n attributes: cloneValue(record.attributes),\n metadata: cloneValue(record.metadata),\n});\n\nconst statusTimestamp = (status: NotificationStatus, now: Date) => {\n if (status === 'delivered') return { deliveredAt: now };\n if (status === 'seen') return { seenAt: now };\n if (status === 'dismissed') return { dismissedAt: now };\n if (status === 'archived') return { archivedAt: now };\n if (status === 'discarded') return { discardedAt: now };\n return {};\n};\n\nconst valueMatches = (value: T, filter?: T | T[]) => {\n if (!filter) return true;\n return Array.isArray(filter) ? filter.includes(value) : value === filter;\n};\n\nconst dueTime = (record: NotificationRecord): number => {\n const deliverAt = record.deliverAt?.getTime();\n const summaryAt = record.summaryAt?.getTime();\n if (deliverAt !== undefined && summaryAt !== undefined) return Math.min(deliverAt, summaryAt);\n return deliverAt ?? summaryAt ?? Number.POSITIVE_INFINITY;\n};\n\nexport class InMemoryNotificationsStorage extends NotificationsStorage {\n #notifications = new Map();\n\n async createNotification(input: CreateNotificationInput): Promise {\n const existing = this.findCoalescable(input);\n if (existing) {\n const now = new Date();\n const next: NotificationRecord = {\n ...existing,\n summary: input.summary,\n payload: cloneValue(input.payload ?? existing.payload),\n priority: input.priority ?? existing.priority,\n attributes: input.attributes\n ? { ...cloneValue(existing.attributes), ...cloneValue(input.attributes) }\n : cloneValue(existing.attributes),\n updatedAt: now,\n deliverAt: input.deliverAt ?? existing.deliverAt,\n summaryAt: input.summaryAt ?? existing.summaryAt,\n deliveryReason: input.deliveryReason ?? existing.deliveryReason,\n coalescedCount: (existing.coalescedCount ?? 1) + 1,\n metadata: input.metadata\n ? { ...cloneValue(existing.metadata), ...cloneValue(input.metadata) }\n : cloneValue(existing.metadata),\n };\n this.#notifications.set(notificationKey(next.threadId, next.id), next);\n return cloneRecord(next);\n }\n\n const now = input.createdAt ?? new Date();\n const record: NotificationRecord = {\n id: input.id ?? randomUUID(),\n threadId: input.threadId,\n source: input.source,\n kind: input.kind,\n priority: input.priority ?? 'medium',\n status: 'pending',\n summary: input.summary,\n payload: cloneValue(input.payload),\n resourceId: input.resourceId,\n agentId: input.agentId,\n sourceId: input.sourceId,\n dedupeKey: input.dedupeKey,\n coalesceKey: input.coalesceKey,\n coalescedCount: 1,\n attributes: cloneValue(input.attributes),\n createdAt: now,\n updatedAt: now,\n deliverAt: input.deliverAt,\n summaryAt: input.summaryAt,\n deliveryReason: input.deliveryReason,\n deliveryAttempts: 0,\n metadata: cloneValue(input.metadata),\n };\n this.#notifications.set(notificationKey(record.threadId, record.id), record);\n return cloneRecord(record);\n }\n\n async listNotifications(input: ListNotificationsInput): Promise {\n const search = input.search?.toLowerCase();\n const results = [...this.#notifications.values()]\n .filter(record => record.threadId === input.threadId)\n .filter(record => valueMatches(record.status, input.status))\n .filter(record => valueMatches(record.priority, input.priority))\n .filter(record => !input.source || record.source === input.source)\n .filter(record => !input.resourceId || record.resourceId === input.resourceId)\n .filter(record => !input.agentId || record.agentId === input.agentId)\n .filter(\n record =>\n !search ||\n record.summary.toLowerCase().includes(search) ||\n record.kind.toLowerCase().includes(search) ||\n record.source.toLowerCase().includes(search),\n )\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n return results.slice(0, input.limit ?? results.length).map(cloneRecord);\n }\n\n async listDueNotifications(input: ListDueNotificationsInput): Promise {\n const now = input.now.getTime();\n const results = [...this.#notifications.values()]\n .filter(record => record.status === 'pending')\n .filter(record => !input.agentId || record.agentId === input.agentId)\n .filter(record => !input.resourceId || record.resourceId === input.resourceId)\n .filter(record => dueTime(record) <= now)\n .sort((a, b) => dueTime(a) - dueTime(b) || a.updatedAt.getTime() - b.updatedAt.getTime());\n return results.slice(0, input.limit ?? results.length).map(cloneRecord);\n }\n\n async getNotification(input: { threadId: string; id: string }): Promise {\n const record = this.#notifications.get(notificationKey(input.threadId, input.id));\n if (!record) return null;\n return cloneRecord(record);\n }\n\n async updateNotification(input: UpdateNotificationInput): Promise {\n const existing = this.#notifications.get(notificationKey(input.threadId, input.id));\n if (!existing) {\n throw new Error(`Notification ${input.id} was not found for thread ${input.threadId}`);\n }\n const now = new Date();\n const next: NotificationRecord = {\n ...existing,\n ...(input.status ? { status: input.status, ...statusTimestamp(input.status, now) } : {}),\n ...(input.summary !== undefined ? { summary: input.summary } : {}),\n ...(input.payload !== undefined ? { payload: cloneValue(input.payload) } : {}),\n ...(input.attributes !== undefined ? { attributes: cloneValue(input.attributes) } : {}),\n ...(input.metadata !== undefined ? { metadata: cloneValue(input.metadata) } : {}),\n ...(input.deliverAt !== undefined ? { deliverAt: input.deliverAt ?? undefined } : {}),\n ...(input.summaryAt !== undefined ? { summaryAt: input.summaryAt ?? undefined } : {}),\n ...(input.deliveryReason !== undefined ? { deliveryReason: input.deliveryReason } : {}),\n ...(input.deliveryAttempts !== undefined ? { deliveryAttempts: input.deliveryAttempts } : {}),\n ...(input.lastDeliveryAttemptAt !== undefined ? { lastDeliveryAttemptAt: input.lastDeliveryAttemptAt } : {}),\n ...(input.lastDeliveryError !== undefined ? { lastDeliveryError: input.lastDeliveryError } : {}),\n ...(input.deliveredSignalId !== undefined ? { deliveredSignalId: input.deliveredSignalId } : {}),\n ...(input.summarySignalId !== undefined ? { summarySignalId: input.summarySignalId } : {}),\n updatedAt: now,\n };\n this.#notifications.set(notificationKey(next.threadId, next.id), next);\n return cloneRecord(next);\n }\n\n async dangerouslyClearAll(): Promise {\n this.#notifications.clear();\n }\n\n private findCoalescable(input: CreateNotificationInput): NotificationRecord | undefined {\n if (!input.dedupeKey && !input.coalesceKey) return undefined;\n return [...this.#notifications.values()].find(record => {\n if (\n record.threadId !== input.threadId ||\n record.source !== input.source ||\n record.kind !== input.kind ||\n record.status !== 'pending'\n )\n return false;\n if (record.agentId !== input.agentId || record.resourceId !== input.resourceId) return false;\n return Boolean(\n (input.dedupeKey && record.dedupeKey === input.dedupeKey) ||\n (input.coalesceKey && record.coalesceKey === input.coalesceKey),\n );\n });\n }\n}\n","import { StorageDomain } from '../base';\n\n/**\n * Discriminated union describing what a schedule fires.\n *\n * Only the `workflow` variant is implemented in v1. Future targets\n * (e.g. `agent-signal`) can be added without a schema migration.\n */\nexport type ScheduleTarget = {\n type: 'workflow';\n workflowId: string;\n inputData?: unknown;\n initialState?: unknown;\n requestContext?: Record;\n};\n\n/** Lifecycle status of a schedule row. */\nexport type ScheduleStatus = 'active' | 'paused';\n\n/**\n * Polymorphic owner of a schedule. Workflow schedules created via\n * `createWorkflow({ schedule })` leave both fields null. Heartbeat\n * schedules created via `agent.setHeartbeat(...)` set\n * `ownerType: 'agent'` and `ownerId` to the agent id. Future schedule\n * types (tenant-owned, workflow-owned, etc.) can use the same shape\n * without a migration.\n */\nexport type ScheduleOwnerType = 'agent' | (string & {});\n\n/**\n * A persisted schedule.\n *\n * `nextFireAt` is advanced atomically by the scheduler before publishing\n * a trigger event, providing CAS-style dedup across multiple instances\n * polling the same storage.\n */\nexport type Schedule = {\n id: string;\n target: ScheduleTarget;\n cron: string;\n timezone?: string;\n status: ScheduleStatus;\n nextFireAt: number;\n lastFireAt?: number;\n lastRunId?: string;\n createdAt: number;\n updatedAt: number;\n metadata?: Record;\n /** Optional owner classification (e.g. 'agent' for heartbeats). */\n ownerType?: ScheduleOwnerType;\n /** Optional owner identifier paired with `ownerType`. */\n ownerId?: string;\n};\n\n/**\n * Outcome of an individual schedule trigger attempt.\n *\n * `published` and `failed` cover scheduler tick fires. Heartbeat\n * outcomes (`acked`, `alerted`, `deferred`, `appended-from-queue`,\n * `dropped-stale`, `dropped-superseded`, `dropped-busy`, `skipped`)\n * are recorded by the heartbeat workflow. `failed` covers any\n * unhandled error during a fire or drain.\n */\nexport type ScheduleTriggerOutcome =\n | 'published'\n | 'failed'\n | 'skipped'\n | 'acked'\n | 'alerted'\n | 'deferred'\n | 'appended-from-queue'\n | 'dropped-stale'\n | 'dropped-superseded'\n | 'dropped-busy';\n\n/**\n * Distinguishes a tick-loop schedule fire from a deferred drain event.\n * Drain rows reference the original fire via `parentTriggerId`.\n */\nexport type ScheduleTriggerKind = 'schedule-fire' | 'queue-drain';\n\n/** Audit record produced for each trigger attempt. */\nexport type ScheduleTrigger = {\n /** Stable trigger row id. Generated by storage when omitted on write. */\n id?: string;\n scheduleId: string;\n /** May be null for drain rows that have no associated workflow run. */\n runId: string | null;\n scheduledFireAt: number;\n actualFireAt: number;\n outcome: ScheduleTriggerOutcome;\n error?: string;\n /** Defaults to `'schedule-fire'` when omitted. */\n triggerKind?: ScheduleTriggerKind;\n /** Pointer back to the originating fire row when `triggerKind === 'queue-drain'`. */\n parentTriggerId?: string;\n /** Outcome-specific context (alert text, append message id, queue age, etc.). */\n metadata?: Record;\n};\n\n/** Filter options for listing schedules. */\nexport type ScheduleFilter = {\n status?: ScheduleStatus;\n workflowId?: string;\n /** `null` matches schedules with no owner (e.g. workflow-only schedules). */\n ownerType?: ScheduleOwnerType | null;\n /** `null` matches schedules with no owner id. */\n ownerId?: string | null;\n};\n\n/** Filter / pagination options for listing trigger history. */\nexport type ScheduleTriggerListOptions = {\n limit?: number;\n /** Inclusive lower bound on actualFireAt (ms epoch). */\n fromActualFireAt?: number;\n /** Exclusive upper bound on actualFireAt (ms epoch). */\n toActualFireAt?: number;\n};\n\n/** Fields that can be patched via {@link SchedulesStorage.updateSchedule}. */\nexport type ScheduleUpdate = Partial<\n Pick\n>;\n\n/**\n * Abstract storage domain for workflow schedules.\n *\n * Powers the {@link WorkflowScheduler}: the scheduler's tick loop polls\n * `listDueSchedules`, atomically advances `nextFireAt` via\n * `updateScheduleNextFire` (CAS), publishes a `workflow.start` event on\n * the `workflows` pubsub topic, and records the trigger via `recordTrigger`.\n */\nexport abstract class SchedulesStorage extends StorageDomain {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'SCHEDULES',\n });\n }\n\n async dangerouslyClearAll(): Promise {\n // Default no-op — subclasses override\n }\n\n /** Insert a new schedule row. Throws if a row with the same id already exists. Returns the stored row. */\n abstract createSchedule(schedule: Schedule): Promise;\n\n /** Get a single schedule by id. Returns null if not found. */\n abstract getSchedule(id: string): Promise;\n\n /** List schedules matching the filter (no pagination — schedule counts are expected to stay small). */\n abstract listSchedules(filter?: ScheduleFilter): Promise;\n\n /**\n * List schedules whose `nextFireAt <= now` and whose `status === 'active'`.\n * Used by the scheduler tick loop.\n */\n abstract listDueSchedules(now: number, limit?: number): Promise;\n\n /** Partial update of a schedule row. */\n abstract updateSchedule(id: string, patch: ScheduleUpdate): Promise;\n\n /**\n * Compare-and-swap update of `nextFireAt`. Used by the scheduler to claim\n * a fire before publishing — only one tick across many processes will succeed.\n *\n * Returns true if the row's `nextFireAt` matched `expectedNextFireAt` and\n * was advanced to `newNextFireAt`. Returns false if another instance\n * already advanced it (meaning the caller should skip publishing).\n */\n abstract updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n ): Promise;\n\n /** Delete a schedule and its trigger history. */\n abstract deleteSchedule(id: string): Promise;\n\n /** Append an entry to a schedule's trigger history. */\n abstract recordTrigger(trigger: ScheduleTrigger): Promise;\n\n /** List trigger history for a schedule, newest first. */\n abstract listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise;\n}\n","import { randomUUID } from 'node:crypto';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type { Schedule, ScheduleFilter, ScheduleTrigger, ScheduleTriggerListOptions, ScheduleUpdate } from './base';\nimport { SchedulesStorage } from './base';\n\nfunction clone(value: T): T {\n return value == null ? value : (JSON.parse(JSON.stringify(value)) as T);\n}\n\nexport class InMemorySchedulesStorage extends SchedulesStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise {\n this.db.schedules.clear();\n this.db.scheduleTriggers.length = 0;\n }\n\n async createSchedule(schedule: Schedule): Promise {\n if (this.db.schedules.has(schedule.id)) {\n throw new Error(`Schedule ${schedule.id} already exists`);\n }\n const stored = clone(schedule);\n this.db.schedules.set(stored.id, stored);\n return clone(stored);\n }\n\n async getSchedule(id: string): Promise {\n const found = this.db.schedules.get(id);\n return found ? clone(found) : null;\n }\n\n async listSchedules(filter?: ScheduleFilter): Promise {\n let rows = Array.from(this.db.schedules.values());\n if (filter?.status) {\n rows = rows.filter(r => r.status === filter.status);\n }\n if (filter?.workflowId) {\n rows = rows.filter(r => r.target.type === 'workflow' && r.target.workflowId === filter.workflowId);\n }\n if (filter?.ownerType !== undefined) {\n rows = rows.filter(r => (r.ownerType ?? null) === filter.ownerType);\n }\n if (filter?.ownerId !== undefined) {\n rows = rows.filter(r => (r.ownerId ?? null) === filter.ownerId);\n }\n rows.sort((a, b) => a.createdAt - b.createdAt);\n return rows.map(clone);\n }\n\n async listDueSchedules(now: number, limit?: number): Promise {\n const due: Schedule[] = [];\n for (const row of this.db.schedules.values()) {\n if (row.status === 'active' && row.nextFireAt <= now) {\n due.push(row);\n }\n }\n due.sort((a, b) => a.nextFireAt - b.nextFireAt);\n const cap = limit ?? due.length;\n return due.slice(0, cap).map(clone);\n }\n\n async updateSchedule(id: string, patch: ScheduleUpdate): Promise {\n const existing = this.db.schedules.get(id);\n if (!existing) {\n throw new Error(`Schedule ${id} not found`);\n }\n const updated: Schedule = {\n ...existing,\n ...patch,\n target: patch.target !== undefined ? patch.target : existing.target,\n metadata: patch.metadata !== undefined ? patch.metadata : existing.metadata,\n updatedAt: Date.now(),\n };\n const stored = clone(updated);\n this.db.schedules.set(id, stored);\n return clone(stored);\n }\n\n async updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n ): Promise {\n const existing = this.db.schedules.get(id);\n if (!existing) return false;\n if (existing.nextFireAt !== expectedNextFireAt) return false;\n if (existing.status !== 'active') return false;\n const stored: Schedule = {\n ...existing,\n nextFireAt: newNextFireAt,\n lastFireAt,\n lastRunId,\n updatedAt: Date.now(),\n };\n this.db.schedules.set(id, stored);\n return true;\n }\n\n async deleteSchedule(id: string): Promise {\n this.db.schedules.delete(id);\n for (let i = this.db.scheduleTriggers.length - 1; i >= 0; i--) {\n if (this.db.scheduleTriggers[i]!.scheduleId === id) {\n this.db.scheduleTriggers.splice(i, 1);\n }\n }\n }\n\n async recordTrigger(trigger: ScheduleTrigger): Promise {\n const stored: ScheduleTrigger = {\n ...trigger,\n id: trigger.id ?? randomUUID(),\n triggerKind: trigger.triggerKind ?? 'schedule-fire',\n };\n this.db.scheduleTriggers.push(clone(stored));\n }\n\n async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise {\n let rows = this.db.scheduleTriggers.filter(f => f.scheduleId === scheduleId);\n if (opts?.fromActualFireAt != null) {\n rows = rows.filter(f => f.actualFireAt >= opts.fromActualFireAt!);\n }\n if (opts?.toActualFireAt != null) {\n rows = rows.filter(f => f.actualFireAt < opts.toActualFireAt!);\n }\n rows.sort((a, b) => b.actualFireAt - a.actualFireAt);\n if (opts?.limit != null) {\n rows = rows.slice(0, opts.limit);\n }\n return rows.map(clone);\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 {\n // Default no-op - subclasses override\n }\n\n abstract getScoreById({ id }: { id: string }): Promise;\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;\n\n abstract listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise;\n\n abstract listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise;\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination: _pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise {\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 {\n this.db.scores.clear();\n }\n\n async getScoreById({ id }: { id: string }): Promise {\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 {\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 {\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 {\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 {\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","import { MastraBase } from '../../../base';\nimport type {\n StorageDeleteToolProviderConnectionInput,\n StorageListToolProviderConnectionsInput,\n StorageToolProviderConnection,\n StorageToolProviderConnectionKey,\n StorageUpsertToolProviderConnectionInput,\n} from '../../types';\n\n/**\n * Abstract base class for the tool-provider-connections storage domain.\n *\n * Persists a per-author, provider-agnostic registry of authorized tool\n * provider connections so the UI can surface a stable, user-supplied label\n * (e.g. \"Work Gmail\") across agents. Rows are keyed by\n * `(authorId, providerId, connectionId)`. The label is the only mutable field.\n *\n * Adapter-native connection state (status, scopes, expiry) still lives with the\n * provider — this domain is purely a name lookup.\n */\nexport abstract class ToolProviderConnectionsStorage extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'TOOL_PROVIDER_CONNECTIONS',\n });\n }\n\n /** Initialize the store (create tables, indexes, etc). */\n abstract init(): Promise;\n\n /**\n * Fetch a single tool provider connection row. Returns `null` when no row\n * exists for the given `(authorId, providerId, connectionId)`.\n */\n abstract getConnectionById(key: StorageToolProviderConnectionKey): Promise;\n\n /**\n * Insert or update a tool provider connection row. Idempotent on\n * `(authorId, providerId, connectionId)` — the existing label/toolkit are\n * overwritten. `createdAt` is preserved on update.\n */\n abstract upsertConnection(input: StorageUpsertToolProviderConnectionInput): Promise;\n\n /**\n * List tool provider connection rows for the given author. Optionally\n * narrow by `providerId` and/or `toolkit`. Order is not guaranteed.\n */\n abstract listConnectionsByAuthor(\n input: StorageListToolProviderConnectionsInput,\n ): Promise;\n\n /**\n * Remove a single tool provider connection row. Idempotent — returns\n * silently when the row does not exist.\n */\n abstract deleteConnection(input: StorageDeleteToolProviderConnectionInput): Promise;\n\n /**\n * Delete every tool provider connection row. Used by tests.\n */\n abstract dangerouslyClearAll(): Promise;\n}\n","import type {\n StorageDeleteToolProviderConnectionInput,\n StorageListToolProviderConnectionsInput,\n StorageToolProviderConnection,\n StorageToolProviderConnectionKey,\n StorageUpsertToolProviderConnectionInput,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { ToolProviderConnectionsStorage } from './base';\n\n/** Build the composite key used by the in-memory tool-provider-connections Map. */\nfunction connKey(authorId: string, providerId: string, connectionId: string): string {\n return `${authorId}\\u0000${providerId}\\u0000${connectionId}`;\n}\n\n/**\n * In-memory implementation of ToolProviderConnectionsStorage. Backed by the\n * shared InMemoryDB Map so tests can clear and inspect rows alongside other\n * domains.\n *\n * Atomicity is provided by the JavaScript single-threaded event loop.\n */\nexport class InMemoryToolProviderConnectionsStorage extends ToolProviderConnectionsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async init(): Promise {\n // No-op for in-memory store.\n }\n\n async dangerouslyClearAll(): Promise {\n this.db.toolProviderConnections.clear();\n }\n\n async getConnectionById({\n authorId,\n providerId,\n connectionId,\n }: StorageToolProviderConnectionKey): Promise {\n return this.db.toolProviderConnections.get(connKey(authorId, providerId, connectionId)) ?? null;\n }\n\n async upsertConnection(input: StorageUpsertToolProviderConnectionInput): Promise {\n const key = connKey(input.authorId, input.providerId, input.connectionId);\n const existing = this.db.toolProviderConnections.get(key);\n const now = new Date();\n const row: StorageToolProviderConnection = {\n authorId: input.authorId,\n providerId: input.providerId,\n toolkit: input.toolkit,\n connectionId: input.connectionId,\n label: input.label,\n scope: input.scope ?? existing?.scope ?? 'per-author',\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n this.db.toolProviderConnections.set(key, row);\n return row;\n }\n\n async listConnectionsByAuthor({\n authorId,\n providerId,\n toolkit,\n scope,\n }: StorageListToolProviderConnectionsInput): Promise {\n const rows: StorageToolProviderConnection[] = [];\n for (const row of this.db.toolProviderConnections.values()) {\n if (authorId !== undefined && row.authorId !== authorId) continue;\n if (providerId && row.providerId !== providerId) continue;\n if (toolkit && row.toolkit !== toolkit) continue;\n if (scope && row.scope !== scope) continue;\n rows.push(row);\n }\n return rows;\n }\n\n async deleteConnection({\n authorId,\n providerId,\n connectionId,\n }: StorageDeleteToolProviderConnectionInput): Promise {\n this.db.toolProviderConnections.delete(connKey(authorId, providerId, connectionId));\n }\n}\n","import type { StepResult, WorkflowRunState } from '../workflows';\n\n// NOTE: This merge logic is duplicated in stores/convex/src/server/workflow-snapshot.ts\n// for the Convex server runtime. Keep both copies in sync.\nconst PENDING_MARKER_KEY = '__mastra_pending__';\n\nfunction isPendingMarker(val: unknown): boolean {\n return (\n val !== null &&\n typeof val === 'object' &&\n Object.prototype.hasOwnProperty.call(val, PENDING_MARKER_KEY) &&\n (val as Record)[PENDING_MARKER_KEY] === true &&\n Object.keys(val).length === 1\n );\n}\n\n// Suspended forEach iteration results may come from multiple engines. Treat\n// StepResult-shaped suspended entries as resettable without relying only on\n// evented __workflow_meta, but avoid matching plain user outputs with only\n// status/payload fields.\nfunction isSuspendedStepResult(val: unknown): boolean {\n const result = val as Record | null;\n\n return (\n val !== null &&\n typeof val === 'object' &&\n 'status' in val &&\n result?.status === 'suspended' &&\n ('suspendPayload' in val || 'suspendedAt' in val)\n );\n}\n\nfunction canResetWithPendingMarker(val: unknown): boolean {\n if (val == null || isPendingMarker(val)) {\n return true;\n }\n\n return isSuspendedStepResult(val);\n}\n\nexport function createEmptyWorkflowSnapshot(runId: string): WorkflowRunState {\n return {\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,\n } as WorkflowRunState;\n}\n\nexport function mergeWorkflowStepResult({\n snapshot,\n stepId,\n result,\n requestContext,\n}: {\n snapshot: WorkflowRunState;\n stepId: string;\n result: StepResult;\n requestContext: Record;\n}): Record> {\n if (!snapshot?.context) {\n throw new Error(`Snapshot context not found for runId ${snapshot?.runId}`);\n }\n\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 const mergedOutput = [...existingOutput];\n const hasPendingMarker = newOutput.some(isPendingMarker);\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 if (i >= existingOutput.length || canResetWithPendingMarker(existingOutput[i])) {\n mergedOutput[i] = null;\n }\n } else if (newVal !== null && newVal !== undefined && !hasPendingMarker) {\n mergedOutput[i] = newVal;\n } else if (i >= existingOutput.length) {\n mergedOutput[i] = null;\n }\n }\n }\n snapshot.context[stepId] = {\n ...existingResult,\n // Pending-marker writes are reset commands built from an earlier snapshot,\n // so keep existing step-level fields and ignore sibling values they carry.\n ...(hasPendingMarker ? {} : (result as any)),\n output: mergedOutput,\n };\n } else {\n snapshot.context[stepId] = result;\n }\n\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n try {\n return JSON.parse(JSON.stringify(snapshot.context));\n } catch {\n // Step results may contain non-serializable values (circular refs, functions, etc.)\n // when the workflow opts out of full persistence. Return a shallow copy so the\n // caller still gets a usable context without crashing.\n return { ...snapshot.context };\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;\n requestContext: Record;\n }): Promise>>;\n\n abstract updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise;\n\n abstract persistWorkflowSnapshot(_: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise;\n\n abstract loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise;\n\n abstract listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise;\n\n abstract getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise;\n\n abstract deleteWorkflowRunById(args: { runId: string; workflowName: string }): Promise;\n}\n","import type { StepResult, WorkflowRunState } from '../../../workflows';\nimport { normalizePerPage } from '../../base';\nimport type {\n StorageWorkflowRun,\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '../../types';\nimport { createEmptyWorkflowSnapshot, mergeWorkflowStepResult } from '../../workflow-snapshot';\nimport type { InMemoryDB } from '../inmemory-db';\nimport { WorkflowsStorage } from './base';\n\n/**\n * Deep-clone in-memory workflow state.\n *\n * We previously used `JSON.parse(JSON.stringify(x))` here, but the agent loop\n * and workflow engine legitimately place values in step results that don't\n * survive JSON round-tripping:\n * - `Date` instances (e.g. `response.timestamp`) — JSON turns them into ISO\n * strings, downstream consumers that do `.getTime()` then break.\n * - Explicitly-`undefined` properties (e.g. `headers`, `providerMetadata`,\n * `usage.{cacheRead, cacheWrite, reasoning}`) — JSON drops keys with\n * `undefined` values, breaking snapshot assertions that include them.\n * - `Error` instances (e.g. tool execution failures, AssertionErrors from\n * inside `tool.execute`) — JSON strips `message`/`name`/`stack` (non-\n * enumerable). `structuredClone` isn't enough either — it preserves the\n * Error type but drops subclass-specific enumerable props (`actual`,\n * `expected`, `operator`).\n *\n * The custom walk below preserves all of that. It also handles builtins with\n * internal slots explicitly — `Map`, `Set`, `RegExp`, `URL`, `ArrayBuffer`,\n * typed arrays, and `DataView` — because cloning them via `Object.create(proto)`\n * would produce a value that passes `instanceof` but whose methods throw (the\n * internal slots were never initialized). Null-prototype dictionaries keep\n * their null prototype.\n */\n/** @internal Exported for testing only. */\nexport function cloneRunData(value: T): T {\n return deepCloneForRun(value, new WeakMap()) as T;\n}\n\nfunction deepCloneForRun(value: unknown, seen: WeakMap): unknown {\n if (value === null || typeof value !== 'object') return value;\n const cached = seen.get(value as object);\n if (cached !== undefined) return cached;\n\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags);\n }\n\n if (value instanceof URL) {\n return new URL(value.href);\n }\n\n if (value instanceof Map) {\n const out = new Map();\n seen.set(value, out);\n for (const [k, v] of value) {\n out.set(deepCloneForRun(k, seen), deepCloneForRun(v, seen));\n }\n return out;\n }\n\n if (value instanceof Set) {\n const out = new Set();\n seen.set(value, out);\n for (const v of value) {\n out.add(deepCloneForRun(v, seen));\n }\n return out;\n }\n\n if (value instanceof ArrayBuffer) {\n return value.slice(0);\n }\n\n // Typed arrays and DataView — `Object.create(proto)` would yield a shell with\n // no backing buffer, so rebuild against a fresh copy of the underlying bytes.\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength));\n }\n const typed = value as unknown as Uint8Array;\n return new (typed.constructor as Uint8ArrayConstructor)(typed);\n }\n\n if (value instanceof Error) {\n // Clone via Object.create(proto) so `instanceof Error` and subclass\n // branches keep working (e.g. `expect.any(Error)`) without invoking\n // subclass constructors that may have non-standard signatures\n // (AssertionError expects an options object). Surface `message` as an\n // enumerable own prop so Vitest's snapshot serializer renders it\n // alongside subclass-specific fields.\n const out = Object.create(Object.getPrototypeOf(value)) as Error;\n Object.defineProperty(out, 'message', {\n value: value.message,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n Object.defineProperty(out, 'name', { value: value.name, writable: true, configurable: true });\n // For `stack`, defer to the Error's own `toJSON` if present — that's how\n // producers signal whether they want stack persisted (e.g. step-executor\n // wraps via `getErrorFromUnknown(err, { serializeStack: false })` so the\n // attached toJSON omits stack from the JSON form). We only honour\n // toJSON's stack signal here, not its other fields, to avoid pulling in\n // subclass extras like Chai AssertionError.toJSON's name/ok/stack that\n // the agent-loop snapshot tests don't expect.\n const errRecord = value as unknown as Record;\n let includeStack = value.stack !== undefined;\n if (includeStack && typeof errRecord.toJSON === 'function') {\n try {\n const serialized = (errRecord.toJSON as () => unknown)();\n if (serialized && typeof serialized === 'object' && !('stack' in serialized)) {\n includeStack = false;\n }\n } catch {\n // Defensive: if toJSON throws, fall back to default behaviour.\n }\n }\n if (includeStack) {\n Object.defineProperty(out, 'stack', { value: value.stack, writable: true, configurable: true });\n }\n // Register in `seen` BEFORE recursing so cycles (incl. self-referential\n // `cause`) terminate.\n seen.set(value, out);\n const outRecord = out as unknown as Record;\n if (value.cause !== undefined) outRecord.cause = deepCloneForRun(value.cause, seen);\n for (const key of Object.keys(value)) {\n outRecord[key] = deepCloneForRun(errRecord[key], seen);\n }\n return out;\n }\n\n if (Array.isArray(value)) {\n const out: unknown[] = new Array(value.length);\n seen.set(value, out);\n for (let i = 0; i < value.length; i++) {\n out[i] = deepCloneForRun(value[i], seen);\n }\n return out;\n }\n\n // Preserve the prototype so class instances stay recognizable to consumers\n // (e.g. `DefaultStepResult` in the agent loop, anything that uses `instanceof`\n // or Vitest's snapshot serializer which prints the class name) and so\n // null-prototype dictionaries (`Object.create(null)`) keep their null proto\n // rather than silently becoming plain `{}`. Builtins with internal slots\n // (Map/Set/RegExp/typed arrays/Date/Error) are handled explicitly above, so\n // the only objects reaching here are plain objects and plain data-holder\n // class instances — `Object.create(proto)` + an own-property copy reproduces\n // those faithfully.\n const proto = Object.getPrototypeOf(value);\n const out: Record =\n proto === Object.prototype ? {} : (Object.create(proto) as Record);\n seen.set(value, out);\n // `Object.keys` includes keys whose value is `undefined`, so explicitly-undefined\n // properties are preserved (unlike a JSON round-trip).\n for (const key of Object.keys(value as object)) {\n out[key] = deepCloneForRun((value as Record)[key], seen);\n }\n return out;\n}\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 {\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;\n requestContext: Record;\n }): Promise>> {\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 = createEmptyWorkflowSnapshot(run.run_id);\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 const context = mergeWorkflowStepResult({ snapshot, stepId, result, requestContext });\n\n this.db.workflows.set(key, {\n ...run,\n snapshot: snapshot,\n });\n\n return cloneRunData(context);\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise {\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 = createEmptyWorkflowSnapshot(run.run_id);\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 {\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 {\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 ? cloneRunData(snapshot) : null;\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise {\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 = cloneRunData(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) : cloneRunData(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 {\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) : cloneRunData(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 {\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 { InMemoryFavoritesStorage } from './domains/favorites/inmemory';\nimport { InMemoryHarness } from './domains/harness/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 { InMemoryNotificationsStorage } from './domains/notifications';\nimport { ObservabilityInMemory } from './domains/observability/inmemory';\nimport { InMemoryPromptBlocksStorage } from './domains/prompt-blocks/inmemory';\nimport { InMemorySchedulesStorage } from './domains/schedules/inmemory';\nimport { InMemoryScorerDefinitionsStorage } from './domains/scorer-definitions/inmemory';\nimport { ScoresInMemory } from './domains/scores/inmemory';\nimport { InMemorySkillsStorage } from './domains/skills/inmemory';\nimport { InMemoryThreadStateStorage } from './domains/thread-state/inmemory';\nimport { InMemoryToolProviderConnectionsStorage } from './domains/tool-provider-connections/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 notifications: new InMemoryNotificationsStorage(),\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 favorites: new InMemoryFavoritesStorage({ db: this.#db }),\n blobs: new InMemoryBlobStore(),\n backgroundTasks: new BackgroundTasksInMemory({ db: this.#db }),\n schedules: new InMemorySchedulesStorage({ db: this.#db }),\n harness: new InMemoryHarness(),\n toolProviderConnections: new InMemoryToolProviderConnectionsStorage({ db: this.#db }),\n threadState: new InMemoryThreadStateStorage(),\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 // These domains don't share the InMemoryDB\n void this.stores.channels?.dangerouslyClearAll?.();\n void this.stores.harness?.dangerouslyClearAll?.();\n void this.stores.notifications?.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, extname } 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>();\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 {\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>(filename: string): Record {\n if (this.cache.has(filename)) {\n return this.cache.get(filename) as Record;\n }\n\n const filePath = join(this.dir, filename);\n let data: Record = {};\n\n if (existsSync(filePath)) {\n try {\n const raw = readFileSync(filePath, 'utf-8');\n data = JSON.parse(raw, dateReviver) as Record;\n } catch {\n // If the file is corrupted, start fresh\n data = {};\n }\n }\n\n this.cache.set(filename, data as Record);\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>(filename: string, data: Record): void {\n this.cache.set(filename, data as Record);\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 listDomainFiles(directory: string, extension = '.json'): string[] {\n const baseDir = resolve(this.dir, directory);\n const rootDir = resolve(this.dir);\n if (!baseDir.startsWith(rootDir + sep) && baseDir !== rootDir) {\n throw new Error(`Path traversal detected: directory \"${directory}\" escapes storage directory`);\n }\n if (!existsSync(baseDir)) return [];\n if (!statSync(baseDir).isDirectory()) {\n throw new Error(`Configured domain path \"${directory}\" is a file, expected a directory`);\n }\n\n return readdirSync(baseDir)\n .filter(file => extname(file) === extension && statSync(join(baseDir, file)).isFile())\n .map(file => `${directory}/${file}`);\n }\n\n /**\n * Check whether a domain file currently exists on disk.\n */\n domainFileExists(filename: string): boolean {\n const filePath = resolve(this.dir, filename);\n const rootDir = resolve(this.dir);\n if (!filePath.startsWith(rootDir + sep) && filePath !== rootDir) {\n throw new Error(`Path traversal detected: file \"${filename}\" escapes storage directory`);\n }\n return existsSync(filePath);\n }\n\n removeDomainFile(filename: string): void {\n this.cache.delete(filename);\n const filePath = resolve(this.dir, filename);\n const rootDir = resolve(this.dir);\n if (!filePath.startsWith(rootDir + sep) && filePath !== rootDir) {\n throw new Error(`Path traversal detected: file \"${filename}\" escapes storage directory`);\n }\n if (existsSync(filePath)) {\n rmSync(filePath);\n }\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(filename: string, id: string): T | null {\n const data = this.readDomain(filename);\n return data[id] ?? null;\n }\n\n /**\n * Get all entities from a domain JSON file as an array.\n */\n getAll(filename: string): T[] {\n const data = this.readDomain(filename);\n return Object.values(data);\n }\n\n /**\n * Set (create or update) an entity in a domain JSON file.\n */\n set(filename: string, id: string, entity: T): void {\n const data = this.readDomain(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 type {\n SourceChangeRequestInput,\n SourceChangeRequestResult,\n SourceFile,\n SourceFileHistoryEntry,\n SourceFileHistoryInput,\n SourceFileListEntry,\n SourceFileListInput,\n SourceFileRef,\n SourceControlCapabilities,\n SourceControlProvider,\n SourceWriteFileInput,\n SourceWriteResult,\n} from '../source-control';\n\nexport type GitHubSourceControlProviderConfig = {\n endpoint: string;\n token: string;\n pathPrefix?: string;\n fetch?: typeof fetch;\n};\n\ntype BrokerErrorResponse = {\n type?: string;\n detail?: string;\n};\n\nexport class GitHubSourceControlProvider implements SourceControlProvider {\n readonly id = 'github';\n readonly displayName = 'GitHub';\n\n private readonly endpoint: string;\n private readonly token: string;\n private readonly pathPrefix: string;\n private readonly fetch: typeof fetch;\n\n constructor(config: GitHubSourceControlProviderConfig) {\n this.endpoint = normalizeApiEndpoint(config.endpoint);\n this.token = config.token;\n this.pathPrefix = normalizePathPrefix(config.pathPrefix ?? 'mastra/editor');\n this.fetch = config.fetch ?? fetch;\n }\n\n async getCapabilities(): Promise {\n return this.request('/capabilities');\n }\n\n async readFile(input: SourceFileRef): Promise {\n const path = this.sourcePath(input.path);\n const query = new URLSearchParams({ path });\n if (input.ref) query.set('ref', input.ref);\n\n const result = await this.request(`/files?${query.toString()}`);\n return result ? { ...result, path: input.path } : null;\n }\n\n async writeFile(input: SourceWriteFileInput): Promise {\n const result = await this.request('/files', {\n method: 'POST',\n body: JSON.stringify({ ...input, path: this.sourcePath(input.path) }),\n });\n\n return { ...result, path: input.path };\n }\n\n async listFileHistory(input: SourceFileHistoryInput): Promise {\n const query = new URLSearchParams({ path: this.sourcePath(input.path) });\n if (input.ref) query.set('ref', input.ref);\n if (input.limit) query.set('limit', String(input.limit));\n\n return this.request(`/files/history?${query.toString()}`);\n }\n\n async listFiles(input: SourceFileListInput): Promise {\n const query = new URLSearchParams({ path: this.sourcePath(input.path) });\n if (input.ref) query.set('ref', input.ref);\n\n const files = await this.request(`/files/list?${query.toString()}`);\n return files.map(file => ({ ...file, path: this.unsourcePath(file.path) }));\n }\n\n async openChangeRequest(input: SourceChangeRequestInput): Promise {\n return this.request('/change-requests', {\n method: 'POST',\n body: JSON.stringify({\n ...input,\n files: input.files.map(file => ({ ...file, path: this.sourcePath(file.path) })),\n }),\n });\n }\n\n private sourcePath(path: string): string {\n const normalizedPath = stripLeadingSlashes(path);\n return this.pathPrefix ? `${this.pathPrefix}/${normalizedPath}` : normalizedPath;\n }\n\n private unsourcePath(path: string): string {\n const normalizedPath = stripLeadingSlashes(path);\n const prefix = this.pathPrefix ? `${this.pathPrefix}/` : '';\n return prefix && normalizedPath.startsWith(prefix) ? normalizedPath.slice(prefix.length) : normalizedPath;\n }\n\n private async request(path: string, init?: RequestInit): Promise {\n const res = await this.fetch(`${this.endpoint}/v1/server/source-storage/github${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.token}`,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n\n if (!res.ok) {\n let detail = `GitHub source control request failed: ${res.status}`;\n try {\n const body = (await res.json()) as BrokerErrorResponse;\n detail = body.detail ?? detail;\n } catch {\n // Ignore non-JSON error bodies.\n }\n throw new Error(detail);\n }\n\n return (await res.json()) as T;\n }\n}\n\nexport function createGitHubSourceControlProviderFromEnv(\n env: Record = process.env,\n defaults?: { pathPrefix?: string },\n): GitHubSourceControlProvider | undefined {\n if (env.MASTRA_SOURCE_PROVIDER !== 'github') return undefined;\n\n const endpoint = env.MASTRA_SOURCE_PROVIDER_ENDPOINT ?? env.MASTRA_SHARED_API_URL ?? env.MASTRA_CLOUD_API_ENDPOINT;\n const token = env.MASTRA_PLATFORM_ACCESS_TOKEN ?? env.MASTRA_CLOUD_ACCESS_TOKEN;\n\n if (!endpoint || !token) return undefined;\n\n return new GitHubSourceControlProvider({\n endpoint: normalizeApiEndpoint(endpoint),\n token,\n pathPrefix: env.MASTRA_SOURCE_STORAGE_PATH_PREFIX ?? defaults?.pathPrefix,\n });\n}\n\nfunction normalizeApiEndpoint(endpoint: string): string {\n const trimmed = stripTrailingSlashes(endpoint);\n const withoutV1 = trimmed.endsWith('/v1') ? trimmed.slice(0, -3) : trimmed;\n return stripTrailingSlashes(withoutV1);\n}\n\nfunction normalizePathPrefix(pathPrefix: string): string {\n return stripTrailingSlashes(stripLeadingSlashes(pathPrefix));\n}\n\nfunction stripLeadingSlashes(value: string): string {\n let start = 0;\n while (start < value.length && value[start] === '/') start += 1;\n return value.slice(start);\n}\n\nfunction stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value[end - 1] === '/') end -= 1;\n return value.slice(0, end);\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;\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 }): Promise;\n\n abstract clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise;\n\n abstract dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise;\n\n abstract alterTable(args: {\n tableName: TABLE_NAMES;\n schema: Record;\n ifNotExists: string[];\n }): Promise;\n\n abstract insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record }): Promise;\n\n abstract batchInsert({\n tableName,\n records,\n }: {\n tableName: TABLE_NAMES;\n records: Record[];\n }): Promise;\n\n abstract load({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record }): Promise;\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 {\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 {\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 {\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 {\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_NOTIFICATIONS, 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>>;\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_favorites: new Map(),\n mastra_schedules: new Map(),\n mastra_schedule_triggers: new Map(),\n mastra_channel_installations: new Map(),\n mastra_channel_config: new Map(),\n mastra_tool_provider_connections: new Map(),\n mastra_notifications: new Map(),\n mastra_harness_sessions: new Map(),\n mastra_thread_state: new Map(),\n };\n }\n\n getDatabase() {\n return this.data;\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record }): Promise {\n const table = this.data[tableName];\n let key = record.id;\n if (tableName === TABLE_NOTIFICATIONS && record.threadId && record.id) {\n key = `${record.threadId}\\0${record.id}`;\n } else 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[] }): Promise {\n const table = this.data[tableName];\n for (const record of records) {\n let key = record.id;\n if (tableName === TABLE_NOTIFICATIONS && record.threadId && record.id) {\n key = `${record.threadId}\\0${record.id}`;\n } else 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({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record }): Promise {\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;\n }): Promise {\n this.data[tableName] = new Map();\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise {\n this.data[tableName].clear();\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise {\n this.data[tableName].clear();\n }\n\n async alterTable({\n tableName: _tableName,\n schema: _schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record;\n ifNotExists: string[];\n }): Promise {}\n\n async hasColumn(_table: string, _column: string): Promise {\n return true;\n }\n}\n"]}