{"version":3,"sources":["../src/memory/types.ts","../src/agent/state-signals.ts","../src/agent/thread-stream-runtime.ts","../src/notifications/signals.ts","../src/notifications/dispatcher.ts","../src/notifications/storage.ts"],"names":["isPlainObject","mastraDBMessageToSignal","createSignal","signal","EventEmitterPubSub","randomUUID","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","createMessageSignal","resolveDeliveryAttributes","StorageDomain","now"],"mappings":"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","file":"chunk-RSEQPLUG.cjs","sourcesContent":["import type { AssistantContent, CoreMessage, ToolContent, UserContent } from '@internal/ai-sdk-v4';\n\nimport type { AgentExecutionOptions } from '../agent/agent.types';\nimport type { AgentConfig } from '../agent/types';\nexport type { MastraDBMessage } from '../agent';\nimport type { EmbeddingModelId } from '../llm/model/index.js';\nimport type { ModelRouterModelId } from '../llm/model/provider-registry.js';\nimport type { MastraLanguageModel, MastraModelConfig } from '../llm/model/shared.types';\nimport type { RequestContext } from '../request-context';\nimport type { PublicSchema } from '../schema';\nimport type { MastraCompositeStore } from '../storage';\nimport type { DynamicArgument } from '../types';\nimport type { MastraEmbeddingModel, MastraEmbeddingOptions, MastraVector } from '../vector';\nimport type { VectorFilter } from '../vector/filter/base';\nimport type { MemoryProcessor } from '.';\n\nexport type { Message as AiMessageType } from '@internal/ai-sdk-v4';\nexport type { MastraLanguageModel };\n\n// Types for the memory system\nexport type MastraMessageV1 = {\n  id: string;\n  content: string | UserContent | AssistantContent | ToolContent;\n  role: 'system' | 'user' | 'assistant' | 'tool' | 'signal';\n  createdAt: Date;\n  threadId?: string;\n  resourceId?: string;\n  toolCallIds?: string[];\n  toolCallArgs?: Record<string, unknown>[];\n  toolNames?: string[];\n  type: 'text' | 'tool-call' | 'tool-result';\n};\n\n/**\n * @deprecated use MastraMessageV1 or MastraDBMessage\n */\nexport type MessageType = MastraMessageV1;\n\nexport type StorageThreadType = {\n  id: string;\n  title?: string;\n  resourceId: string;\n  createdAt: Date;\n  updatedAt: Date;\n  metadata?: Record<string, unknown>;\n};\n\n/**\n * Thread-specific Observational Memory metadata.\n * Stored on thread.metadata.mastra.om to keep thread-specific data\n * separate from the shared resource-level OM record.\n */\nexport type ThreadOMMetadata = {\n  /** The current task being worked on in this thread */\n  currentTask?: string;\n  /** Suggested response for continuing this thread's conversation */\n  suggestedResponse?: string;\n  /** Observer-generated thread title */\n  threadTitle?: string;\n  /** Timestamp of the last observed message in this thread (ISO string for JSON serialization) */\n  lastObservedAt?: string;\n  /** Cursor pointing at the last observed message (for replay pruning fallback) */\n  lastObservedMessageCursor?: { createdAt: string; id: string };\n  // Note: Patterns are stored on the ObservationalMemoryRecord (resource-level), not thread metadata\n};\n\n/**\n * Structure for Mastra-specific thread metadata.\n * Stored on thread.metadata.mastra\n */\nexport type ThreadMastraMetadata = {\n  om?: ThreadOMMetadata;\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Helper to get OM metadata from a thread's metadata object.\n * Returns undefined if not present or if the structure is invalid.\n */\nexport function getThreadOMMetadata(threadMetadata?: Record<string, unknown>): ThreadOMMetadata | undefined {\n  if (!threadMetadata) return undefined;\n  const mastra = threadMetadata.mastra;\n  if (!isPlainObject(mastra)) return undefined;\n  const om = mastra.om;\n  if (!isPlainObject(om)) return undefined;\n  return om as ThreadOMMetadata;\n}\n\n/**\n * Helper to set OM metadata on a thread's metadata object.\n * Creates the nested structure if it doesn't exist.\n * Returns a new metadata object (does not mutate the original).\n * Safely handles cases where existing mastra/om values are not objects.\n */\nexport function setThreadOMMetadata(\n  threadMetadata: Record<string, unknown> | undefined,\n  omMetadata: ThreadOMMetadata,\n): Record<string, unknown> {\n  const existing = threadMetadata ?? {};\n  const existingMastra = isPlainObject(existing.mastra) ? existing.mastra : {};\n  const existingOM = isPlainObject(existingMastra.om) ? existingMastra.om : {};\n\n  return {\n    ...existing,\n    mastra: {\n      ...existingMastra,\n      om: {\n        ...existingOM,\n        ...omMetadata,\n      },\n    },\n  };\n}\n\n/**\n * Memory-specific context passed via RequestContext under the 'MastraMemory' key\n * This provides processors with access to memory-related execution context\n */\nexport type MemoryRequestContext = {\n  thread?: Partial<StorageThreadType> & { id: string };\n  resourceId?: string;\n  memoryConfig?: MemoryConfigInternal;\n};\n\n/**\n * Parse and validate memory runtime context from RequestContext\n * @param requestContext - The RequestContext to extract memory context from\n * @returns The validated MemoryRequestContext or null if not available\n * @throws Error if the context exists but is malformed\n */\nexport function parseMemoryRequestContext(requestContext?: RequestContext): MemoryRequestContext | null {\n  if (!requestContext) {\n    return null;\n  }\n\n  const memoryContext = requestContext.get('MastraMemory');\n  if (!memoryContext) {\n    return null;\n  }\n\n  // Validate the structure\n  if (typeof memoryContext !== 'object' || memoryContext === null) {\n    throw new Error(`Invalid MemoryRequestContext: expected object, got ${typeof memoryContext}`);\n  }\n\n  const ctx = memoryContext as Record<string, unknown>;\n\n  // Validate thread if present\n  if (ctx.thread !== undefined) {\n    if (typeof ctx.thread !== 'object' || ctx.thread === null) {\n      throw new Error(`Invalid MemoryRequestContext.thread: expected object, got ${typeof ctx.thread}`);\n    }\n    const thread = ctx.thread as Record<string, unknown>;\n    if (typeof thread.id !== 'string') {\n      throw new Error(`Invalid MemoryRequestContext.thread.id: expected string, got ${typeof thread.id}`);\n    }\n  }\n\n  // Validate resourceId if present\n  if (ctx.resourceId !== undefined && typeof ctx.resourceId !== 'string') {\n    throw new Error(`Invalid MemoryRequestContext.resourceId: expected string, got ${typeof ctx.resourceId}`);\n  }\n\n  return memoryContext as MemoryRequestContext;\n}\n\nexport type MessageResponse<T extends 'raw' | 'core_message'> = {\n  raw: MastraMessageV1[];\n  core_message: CoreMessage[];\n}[T];\n\ntype BaseWorkingMemory = {\n  enabled: boolean;\n  /**\n   * Scope for working memory storage.\n   * - 'resource': Memory persists across all threads for the same resource/user (default)\n   * - 'thread': Memory is isolated per conversation thread\n   *\n   * @default 'resource'\n   */\n  scope?: 'thread' | 'resource';\n  /**\n   * Experimental: deliver working memory to the model as a state signal instead of folding\n   * it into the system message. Storage is unchanged. When `true`, `Memory` auto-attaches\n   * a state-signal processor that emits snapshots or deltas with dedup via `cacheKey`, and\n   * registers the working-memory tool as `setWorkingMemory` instead of `updateWorkingMemory`.\n   *\n   * Not supported with template working memory `version: 'vnext'`.\n   *\n   * @default false\n   * @see docs/src/content/en/docs/agents/signals.mdx\n   */\n  useStateSignals?: boolean;\n  /** @deprecated The `use` option has been removed. Working memory always uses tool-call mode. */\n  use?: never;\n};\n\ntype TemplateWorkingMemory =\n  | (BaseWorkingMemory & {\n      template: string;\n      schema?: never;\n      version?: 'stable';\n    })\n  | (Omit<BaseWorkingMemory, 'useStateSignals'> & {\n      template: string;\n      schema?: never;\n      version: 'vnext';\n      useStateSignals?: false;\n    });\n\ntype SchemaWorkingMemory = BaseWorkingMemory & {\n  schema: PublicSchema;\n  template?: never;\n};\n\ntype WorkingMemoryNone = BaseWorkingMemory & {\n  template?: never;\n  schema?: never;\n};\n\nexport type WorkingMemory = TemplateWorkingMemory | SchemaWorkingMemory | WorkingMemoryNone;\n\n/**\n * Vector index configuration for optimizing semantic recall performance.\n *\n * These settings are primarily supported by PostgreSQL with pgvector extension.\n * Other vector stores (Pinecone, Qdrant, Chroma, etc.) will use their default\n * configurations and ignore these settings.\n *\n * @see https://mastra.ai/docs/memory/semantic-recall#postgresql-index-optimization\n */\nexport type VectorIndexConfig = {\n  /**\n   * Type of vector index to create (PostgreSQL/pgvector only).\n   * - 'ivfflat': Inverted file index, good balance of speed and recall\n   * - 'hnsw': Hierarchical Navigable Small World, best performance for most cases\n   * - 'flat': Exact nearest neighbor search, slow but 100% recall\n   *\n   * @default 'ivfflat'\n   * @example\n   * ```typescript\n   * type: 'hnsw' // Recommended for production\n   * ```\n   */\n  type?: 'ivfflat' | 'hnsw' | 'flat';\n\n  /**\n   * Distance metric for similarity calculations.\n   * - 'cosine': Normalized dot product, good for text similarity\n   * - 'euclidean': L2 distance, geometric distance in vector space\n   * - 'dotproduct': Inner product, best for OpenAI embeddings\n   *\n   * Note: While defined here, most vector stores have their own metric configuration.\n   *\n   * @default 'cosine'\n   * @example\n   * ```typescript\n   * metric: 'dotproduct' // Optimal for OpenAI embeddings\n   * ```\n   */\n  metric?: 'cosine' | 'euclidean' | 'dotproduct';\n\n  /**\n   * Configuration for IVFFlat index (PostgreSQL only).\n   * Controls the number of inverted lists for clustering vectors.\n   */\n  ivf?: {\n    /**\n     * Number of inverted lists (clusters) to create.\n     * Higher values mean better recall but slower build time.\n     * Recommended: rows/1000 for tables with > 1M rows.\n     *\n     * @default 100\n     */\n    lists?: number;\n  };\n\n  /**\n   * Configuration for HNSW index (PostgreSQL only).\n   * Hierarchical graph-based index with superior query performance.\n   */\n  hnsw?: {\n    /**\n     * Maximum number of bi-directional links per node.\n     * Higher values increase recall and index size.\n     *\n     * @default 16\n     * @example\n     * ```typescript\n     * m: 32 // Higher recall, larger index\n     * ```\n     */\n    m?: number;\n\n    /**\n     * Size of dynamic candidate list during index construction.\n     * Higher values mean better recall but slower index creation.\n     *\n     * @default 64\n     * @example\n     * ```typescript\n     * efConstruction: 128 // Better quality, slower build\n     * ```\n     */\n    efConstruction?: number;\n  };\n};\n\n/**\n * Configuration for semantic recall using RAG-based retrieval.\n *\n * Enables agents to retrieve relevant messages from past conversations using vector similarity search.\n * Retrieved messages provide context from beyond the recent conversation history, helping agents\n * maintain continuity across longer interactions.\n *\n * @see https://mastra.ai/docs/memory/semantic-recall\n */\nexport type SemanticRecall = {\n  /**\n   * Number of semantically similar messages to retrieve from the vector database.\n   * Higher values provide more context but increase token usage.\n   *\n   * @example\n   * ```typescript\n   * topK: 3 // Retrieve 3 most similar messages\n   * ```\n   */\n  topK: number;\n\n  /**\n   * Amount of surrounding context to include with each retrieved message.\n   * Can be a single number (same before/after) or an object with separate values.\n   * Helps provide conversational flow around the matched message.\n   *\n   * @example\n   * ```typescript\n   * messageRange: 2 // Include 2 messages before and after\n   * messageRange: { before: 1, after: 3 } // 1 before, 3 after\n   * ```\n   */\n  messageRange: number | { before: number; after: number };\n\n  /**\n   * Scope for semantic search queries.\n   * - 'resource': Search across all threads owned by the same resource/user (default)\n   * - 'thread': Search only within the current conversation thread\n   *\n   * @default 'resource'\n   * @example\n   * ```typescript\n   * scope: 'thread' // Limit recall to current thread only\n   * ```\n   */\n  scope?: 'thread' | 'resource';\n\n  /**\n   * Vector index configuration (PostgreSQL/pgvector specific).\n   * Other vector stores will use their default index configurations.\n   * HNSW indexes typically provide better performance than IVFFlat.\n   *\n   * @example\n   * ```typescript\n   * indexConfig: {\n   *   type: 'hnsw',\n   *   metric: 'dotproduct', // Best for OpenAI embeddings\n   *   hnsw: { m: 16, efConstruction: 64 }\n   * }\n   * ```\n   */\n  indexConfig?: VectorIndexConfig;\n\n  /**\n   * Metadata filter for semantic search queries.\n   * Allows filtering results by metadata fields using MongoDB-style query syntax.\n   * Works in combination with scope-based filtering (resource_id/thread_id).\n   *\n   * @example\n   * ```typescript\n   * filter: {\n   *   projectId: { $eq: 'project-a' },\n   *   category: { $in: ['work', 'personal'] }\n   * }\n   * ```\n   */\n  filter?: VectorFilter;\n\n  /**\n   * Minimum similarity score threshold (0-1).\n   * Messages below this threshold will be filtered out from semantic search results.\n   *\n   * @example\n   * ```typescript\n   * threshold: 0.7 // Only include messages with 70%+ similarity\n   * ```\n   */\n  threshold?: number;\n\n  /**\n   * Index name for the vector store.\n   * If not provided, will be auto-generated based on embedder model.\n   *\n   * @example\n   * ```typescript\n   * indexName: 'my-custom-index'\n   * ```\n   */\n  indexName?: string;\n};\n\n/**\n * Model settings for Observer/Reflector agents in Observational Memory.\n * Uses the same settings as Agent.generate() modelSettings (temperature, maxOutputTokens, topP, etc.).\n */\nexport type ObservationalMemoryModelSettings = AgentExecutionOptions['modelSettings'];\n\nexport type ObservationalMemoryActivationTTL = number | string | 'auto' | false;\n\n/**\n * Configuration for the observation step in Observational Memory.\n */\nexport interface ObservationalMemoryObservationConfig {\n  /**\n   * Model for the Observer agent.\n   * Can be a model ID string (e.g., 'openai/gpt-4o'), a LanguageModel instance,\n   * a function that returns either (for dynamic model selection),\n   * or an array of ModelWithRetries for fallback support.\n   *\n   * Cannot be set if a top-level `model` is also provided.\n   *\n   * @default 'google/gemini-2.5-flash'\n   */\n  model?: AgentConfig['model'];\n\n  /**\n   * Token count of unobserved messages that triggers observation.\n   * When unobserved message tokens exceed this, the Observer is called.\n   *\n   * @default 30000\n   */\n  messageTokens?: number;\n\n  /**\n   * Model settings for the Observer agent.\n   * @default { temperature: 0.3, maxOutputTokens: 100_000 }\n   */\n  modelSettings?: ObservationalMemoryModelSettings;\n\n  /**\n   * Provider-specific options passed to the Observer model.\n   * Use this for provider features like thinking budgets, safety settings, etc.\n   *\n   * @example\n   * ```ts\n   * providerOptions: {\n   *   google: { thinkingConfig: { thinkingBudget: 215 } }\n   * }\n   * ```\n   *\n   * @default { google: { thinkingConfig: { thinkingBudget: 215 } } }\n   */\n  providerOptions?: Record<string, Record<string, unknown> | undefined>;\n\n  /**\n   * Maximum tokens per batch when observing multiple threads.\n   * Threads are chunked into batches of this size and processed in parallel.\n   * Lower values = more parallelism but more API calls.\n   * Higher values = fewer API calls but less parallelism.\n   *\n   * @default 10000\n   */\n  maxTokensPerBatch?: number;\n\n  /**\n   * Token interval for async background observation buffering.\n   * Observations run asynchronously in the background at this interval,\n   * storing results in a buffer. When the main `messageTokens` threshold is reached,\n   * buffered observations are activated instantly (no blocking LLM call).\n   *\n   * Can be an absolute token count (e.g. `5_000`) or a fraction of `messageTokens`\n   * (e.g. `0.25` means buffer every 25% of the threshold).\n   *\n   * Set to `false` to explicitly disable async buffering.\n   *\n   * Must resolve to less than `messageTokens`.\n   *\n   * @default 0.2 (buffer every 20% of messageTokens)\n   * @example\n   * ```ts\n   * // Buffer every 5k tokens, activate at 20k\n   * observation: {\n   *   messageTokens: 20_000,\n   *   bufferTokens: 5_000,\n   * }\n   * // Or equivalently, using a fraction:\n   * observation: {\n   *   messageTokens: 20_000,\n   *   bufferTokens: 0.25,\n   * }\n   * // Disable async buffering (use synchronous observation)\n   * observation: {\n   *   bufferTokens: false,\n   * }\n   * ```\n   */\n  bufferTokens?: number | false;\n\n  /**\n   * Ratio (0-1) of buffered observations to activate when threshold is reached.\n   * Setting this below 1 keeps some observations in reserve, which helps maintain\n   * conversation continuity and provides a buffer for the next activation cycle.\n   *\n   * Requires `bufferTokens` to also be set.\n   *\n   * @default 0.8 (activate 80% of buffered observations, keeping 20% in reserve)\n   * @example\n   * ```ts\n   * // Activate 70% of buffered observations, keep 30% in reserve\n   * observation: {\n   *   messageTokens: 20_000,\n   *   bufferTokens: 0.25,\n   *   bufferActivation: 0.7,\n   * }\n   * ```\n   */\n  bufferActivation?: number;\n\n  /**\n   * Time before buffered observations are force-activated after inactivity.\n   * Accepts milliseconds as a number, a duration string like `\"5m\"` or `\"1hr\"`,\n   * `\"auto\"` to choose a provider-aware TTL from the actor model's prompt-cache behavior,\n   * or `false` to disable top-level `activateAfterIdle` for observations.\n   * If unset, top-level `activateAfterIdle` is used for observations.\n   */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n\n  /**\n   * Force-activate buffered observations when the actor provider/model changes.\n   * If unset, top-level `activateOnProviderChange` is used for observations.\n   */\n  activateOnProviderChange?: boolean;\n\n  /**\n   * Token threshold above which synchronous (blocking) observation is forced.\n   * When set, the system will never block for observation between `messageTokens`\n   * and `blockAfter` — only async buffering and activation are used in that range.\n   * Once unobserved tokens exceed `blockAfter`, a synchronous observation runs as a\n   * last resort to prevent context window overflow.\n   *\n   * Accepts either:\n   * - A **multiplier** (1 < value < 2): multiplied by `messageTokens`.\n   *   e.g. `blockAfter: 1.5` with `messageTokens: 20_000` → blocks at 30,000 tokens.\n   * - An **absolute token count** (≥ 2): must be greater than `messageTokens`.\n   *   e.g. `blockAfter: 80_000` → blocks at 80,000 tokens.\n   *\n   * Only relevant when `bufferTokens` is set. When `bufferTokens` is not set,\n   * synchronous observation is used directly at `messageTokens` and this setting has no effect.\n   *\n   * @default 1.2 (120% of `messageTokens`) when `bufferTokens` is set.\n   *\n   * @example\n   * ```ts\n   * // Multiplier: 1.5x messageTokens\n   * observation: {\n   *   messageTokens: 20_000,\n   *   bufferTokens: 0.25,\n   *   blockAfter: 1.5, // resolves to 30,000\n   * }\n   * // Absolute: explicit token count\n   * observation: {\n   *   messageTokens: 20_000,\n   *   bufferTokens: 5_000,\n   *   blockAfter: 80_000,\n   * }\n   * ```\n   */\n  blockAfter?: number;\n\n  /**\n   * Optional token budget for observer context.\n   * When set, the \"Previous Observations\" section is truncated from the end\n   * to keep the most recent observations within this budget, and pending\n   * buffered reflections replace the raw observations they summarized.\n   * Set to `0` for full truncation (omit previous observations entirely), or `false` to disable.\n   *\n   * @default undefined (disabled)\n   */\n  previousObserverTokens?: number | false;\n\n  /**\n   * Custom instructions appended to the Observer agent's system prompt.\n   * Use this to customize what the Observer focuses on or how it formats observations.\n   *\n   * @example\n   * ```ts\n   * observation: {\n   *   instruction: 'Focus on user dietary preferences and allergies.',\n   * }\n   * ```\n   */\n  instruction?: string;\n\n  /**\n   * When enabled, the Observer suggests a short thread title based on the conversation.\n   * The title is updated on the thread whenever the Observer runs.\n   *\n   * @default false\n   */\n  threadTitle?: boolean;\n\n  /**\n   * Whether image/file attachment parts are forwarded to the Observer LLM.\n   * - `true` forwards attachments\n   * - `false` drops attachments and leaves placeholder text\n   * - `'auto'` checks model capabilities to decide\n   *\n   * @default true\n   */\n  observeAttachments?: 'auto' | boolean;\n}\n\n/**\n * Configuration for the reflection step in Observational Memory.\n */\nexport interface ObservationalMemoryReflectionConfig {\n  /**\n   * Model for the Reflector agent.\n   * Can be a model ID string (e.g., 'openai/gpt-4o'), a LanguageModel instance,\n   * a function that returns either (for dynamic model selection),\n   * or an array of ModelWithRetries for fallback support.\n   *\n   * Cannot be set if a top-level `model` is also provided.\n   *\n   * @default 'google/gemini-2.5-flash'\n   */\n  model?: AgentConfig['model'];\n\n  /**\n   * Token count of observations that triggers reflection.\n   * When observation tokens exceed this, the Reflector is called to condense them.\n   *\n   * @default 40000\n   */\n  observationTokens?: number;\n\n  /**\n   * Model settings for the Reflector agent.\n   * @default { temperature: 0, maxOutputTokens: 100_000 }\n   */\n  modelSettings?: ObservationalMemoryModelSettings;\n\n  /**\n   * Provider-specific options passed to the Reflector model.\n   * Use this for provider features like thinking budgets, safety settings, etc.\n   *\n   * @example\n   * ```ts\n   * providerOptions: {\n   *   google: { thinkingConfig: { thinkingBudget: 1024 } }\n   * }\n   * ```\n   *\n   * @default { google: { thinkingConfig: { thinkingBudget: 1024 } } }\n   */\n  providerOptions?: Record<string, Record<string, unknown> | undefined>;\n\n  /**\n   * Token threshold above which synchronous (blocking) reflection is forced.\n   * When set with async reflection enabled, the system will not block for\n   * reflection between `observationTokens` and `blockAfter` — only async\n   * buffering and activation are used in that range. Once observation tokens\n   * exceed `blockAfter`, a synchronous reflection runs as a last resort.\n   *\n   * Accepts either:\n   * - A **multiplier** (1 < value < 2): multiplied by `observationTokens`.\n   *   e.g. `blockAfter: 1.5` with `observationTokens: 30_000` → blocks at 45,000 tokens.\n   * - An **absolute token count** (≥ 2): must be greater than `observationTokens`.\n   *   e.g. `blockAfter: 50_000` → blocks at 50,000 tokens.\n   *\n   * Only relevant when `bufferActivation` is set. When `bufferActivation` is not set,\n   * synchronous reflection is used directly at `observationTokens` and this setting has no effect.\n   *\n   * @default 1.2 (120% of `observationTokens`) when `bufferActivation` is set.\n   */\n  blockAfter?: number;\n\n  /**\n   * Time before buffered reflections are force-activated after inactivity.\n   * Accepts milliseconds as a number, a duration string like `\"5m\"` or `\"1hr\"`,\n   * `\"auto\"` to choose a provider-aware TTL from the actor model's prompt-cache behavior,\n   * or `false` to disable idle activation for reflections.\n   * Reflections do not inherit top-level `activateAfterIdle`; set this explicitly to enable.\n   */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n\n  /**\n   * Force-activate buffered reflections when the actor provider/model changes.\n   * Reflections do not inherit top-level `activateOnProviderChange`; set this explicitly to enable.\n   */\n  activateOnProviderChange?: boolean;\n\n  /**\n   * Ratio (0-1) controlling when async reflection buffering starts.\n   * When observation tokens reach `observationTokens * bufferActivation`,\n   * reflection runs asynchronously in the background. When the full\n   * `observationTokens` threshold is reached, the buffered reflection\n   * is spliced into the observation content instantly (no blocking LLM call).\n   *\n   * Only one buffered reflection is maintained at a time. On activation,\n   * the buffered reflection replaces the line range it was generated from,\n   * and any new observations appended after that range are preserved.\n   *\n   * Requires `observation.bufferTokens` to also be set (async observation).\n   *\n   * @example\n   * ```ts\n   * reflection: {\n   *   observationTokens: 30_000,\n   *   bufferActivation: 0.5, // Start buffering at 15k tokens\n   * }\n   * ```\n   */\n  bufferActivation?: number;\n\n  /**\n   * Custom instructions appended to the Reflector agent's system prompt.\n   * Use this to customize how the Reflector consolidates observations.\n   *\n   * @example\n   * ```ts\n   * reflection: {\n   *   instruction: 'Consolidate observations and remove duplicates.',\n   * }\n   * ```\n   */\n  instruction?: string;\n}\n\n/**\n * Configuration for Observational Memory.\n *\n * Observational Memory is a three-tier memory system that uses an Observer agent\n * to extract observations from conversations and a Reflector agent to compress them.\n * This enables efficient long-term memory with minimal context usage.\n *\n * Can be set to `true` to enable with defaults, or an object to customize.\n *\n * @example\n * ```typescript\n * // Enable with defaults\n * observationalMemory: true\n *\n * // Custom configuration\n * observationalMemory: {\n *   scope: 'resource',\n *   model: 'google/gemini-2.5-flash',\n *   observation: {\n *     messageTokens: 20_000,\n *   },\n *   reflection: {\n *     observationTokens: 90_000,\n *   },\n * }\n * ```\n */\nexport interface ObservationalMemoryOptions {\n  /**\n   * Enable or disable Observational Memory.\n   * When omitted, defaults to `true` (enabled).\n   * Only `enabled: false` explicitly disables it.\n   *\n   * @default true\n   */\n  enabled?: boolean;\n\n  /**\n   * Model for both Observer and Reflector agents.\n   * Sets the model for both agents at once. Cannot be used together with\n   * `observation.model` or `reflection.model` — an error will be thrown.\n   *\n   * @default 'google/gemini-2.5-flash'\n   */\n  model?: AgentConfig['model'];\n\n  /**\n   * Observation step configuration for extracting observations from conversations.\n   */\n  observation?: ObservationalMemoryObservationConfig;\n\n  /**\n   * Reflection step configuration for compressing observations.\n   */\n  reflection?: ObservationalMemoryReflectionConfig;\n\n  /**\n   * Memory scope for observations.\n   * - 'resource': Observations span all threads for a resource (cross-thread memory)\n   * - 'thread': Observations are per-thread (default)\n   *\n   * @default 'thread'\n   */\n  scope?: 'resource' | 'thread';\n\n  /**\n   * Time before buffered observations are force-activated after inactivity.\n   * Accepts milliseconds as a number, a duration string like `\"5m\"` or `\"1hr\"`,\n   * or `\"auto\"` to choose a provider-aware TTL from the actor model's prompt-cache behavior.\n   * When the gap between the current time and the last assistant message part's `createdAt`\n   * exceeds this value, buffered observations activate regardless of whether the\n   * token threshold has been reached. Useful to align with prompt cache TTLs.\n   *\n   * Reflections do not inherit this setting. Use `reflection.activateAfterIdle` to\n   * opt reflections into idle activation.\n   *\n   * @example 300_000\n   * @example \"5m\"\n   * @example \"1hr\"\n   * @example \"auto\"\n   */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n\n  /**\n   * Force-activate buffered observations when the actor provider/model changes.\n   * Useful when switching between models that do not share prompt caches.\n   *\n   * Reflections do not inherit this setting. Use `reflection.activateOnProviderChange`\n   * to opt reflections into provider-change activation.\n   */\n  activateOnProviderChange?: boolean;\n\n  /**\n   * Share the token budget between messages and observations.\n   * When true, the total budget = observation.messageTokens + reflection.observationTokens.\n   * - Messages can use more space when observations are small\n   * - Observations can use more space when messages are small\n   *\n   * This helps maximize context usage by allowing flexible allocation.\n   *\n   * @default false\n   */\n  shareTokenBudget?: boolean;\n\n  /**\n   * When true, inserts temporal-gap reminder markers before new user messages after\n   * significant inactivity. These markers are persisted in memory and also emitted\n   * as inline reminder events for clients that want to render them specially.\n   *\n   * @default false\n   */\n  temporalMarkers?: boolean;\n\n  /**\n   * **Experimental.** Enable retrieval-mode observation groups as durable pointers\n   * to raw message history. When enabled, observation groups keep `_range`\n   * metadata visible in context and a `recall` tool is registered so the actor\n   * can inspect raw messages behind a stored observation summary.\n   *\n   * - `true` — recall tool with cross-thread browsing by default\n   * - `{ vector: true }` — also enables semantic search using Memory-level vector/embedder\n   * - `{ scope: 'thread' }` — restricts the recall tool to the current thread only\n   * - `{ vector: true, scope: 'thread' }` — current-thread browsing + semantic search\n   *\n   * `scope` defaults to `'resource'` (cross-thread browsing, thread listing, and search).\n   * Set to `'thread'` to restrict to the current thread only.\n   *\n   * @experimental\n   * @default false\n   */\n  retrieval?: boolean | { vector?: boolean; scope?: 'thread' | 'resource' };\n}\n\n/**\n * Check if observational memory is enabled from a `boolean | ObservationalMemoryOptions` value.\n *\n * - `true` → enabled\n * - `false` → disabled\n * - `{ enabled: false }` → disabled\n * - `{ ... }` (without `enabled: false`) → enabled\n * - `undefined` → disabled\n */\nexport function isObservationalMemoryEnabled(\n  config: boolean | ObservationalMemoryOptions | undefined,\n): config is true | ObservationalMemoryOptions {\n  if (config === true) return true;\n  if (config === false || config === undefined) return false;\n  return config.enabled !== false;\n}\n\n/**\n * Configuration for memory behaviors and retrieval strategies.\n *\n * Controls three types of memory: conversation history (recent messages), semantic recall\n * (RAG-based retrieval of relevant past messages), and working memory (persistent user data).\n * All memory types are combined into a single context window for the LLM.\n *\n * @see https://mastra.ai/docs/memory/overview\n */\ntype BaseMemoryConfig = {\n  /**\n   * When true, prevents memory from saving new messages.\n   * Useful for internal agents (like routing agents) that should read memory but not modify it.\n   *\n   * @default false\n   * @example\n   * ```typescript\n   * readOnly: true // Agent can read memory but won't save new messages\n   * ```\n   */\n  readOnly?: boolean;\n\n  /**\n   * Number of recent messages from the current thread to include in context.\n   * Provides short-term conversational continuity.\n   * Set to false to disable conversation history entirely.\n   *\n   * @default 10\n   * @example\n   * ```typescript\n   * lastMessages: 5 // Include last 5 messages\n   * lastMessages: false // Disable conversation history\n   * ```\n   */\n  lastMessages?: number | false;\n\n  /**\n   * Semantic recall configuration for RAG-based retrieval of relevant past messages.\n   * Uses vector embeddings for similarity search across conversation history.\n   * Can be a boolean to enable/disable with defaults, or an object for detailed configuration.\n   *\n   * @default false (disabled by default)\n   * @example\n   * ```typescript\n   * semanticRecall: false // Disable semantic recall\n   * semanticRecall: {\n   *   topK: 5,\n   *   messageRange: 2,\n   *   scope: 'resource' // Search across all resource (user) threads\n   * }\n   * ```\n   */\n  semanticRecall?: boolean | SemanticRecall;\n\n  /**\n   * Working memory configuration for persistent user data and preferences.\n   * Maintains a structured record (Markdown or schema-based) that agents update over time.\n   * Can be thread-scoped (per conversation) or resource-scoped (across all user threads).\n   *\n   * @example\n   * ```typescript\n   * workingMemory: {\n   *   enabled: true,\n   *   scope: 'resource', // Persist across all resource (user) conversations\n   *   template: '# User Profile\\n- **Name**:\\n- **Preferences**:',\n   *   schema: z.object({\n   *     name: z.string(),\n   *     preferences: z.object({\n   *       communicationStyle: z.string(),\n   *       projectGoal: z.string(),\n   *       deadlines: z.array(z.string()),\n   *     }),\n   *   }),\n   * }\n   * ```\n   */\n  workingMemory?: WorkingMemory;\n\n  /**\n   * Observational Memory configuration for long-term memory with automatic observation and reflection.\n   *\n   * Uses an Observer agent to extract observations from conversations and a Reflector agent\n   * to compress them when they grow too large. This enables efficient long-term memory\n   * that maintains context across many conversations.\n   *\n   * Set to `true` to enable with defaults, `false` to disable, or an object to customize.\n   *\n   * @example\n   * ```typescript\n   * // Enable with defaults\n   * observationalMemory: true\n   *\n   * // Custom configuration\n   * observationalMemory: {\n   *   scope: 'resource',\n   *   model: 'google/gemini-2.5-flash',\n   *   observation: {\n   *     messageTokens: 20_000,\n   *   },\n   *   reflection: {\n   *     observationTokens: 90_000,\n   *   },\n   * }\n   * ```\n   */\n  observationalMemory?: boolean | ObservationalMemoryOptions;\n\n  /**\n   * Automatically generate descriptive thread titles based on the first user message.\n   * Can be a boolean to enable with defaults, or an object to customize the model and instructions.\n   * Title generation runs asynchronously and doesn't affect response time.\n   *\n   * @default false\n   * @example\n   * ```typescript\n   * generateTitle: true // Use agent's model for title generation\n   * generateTitle: {\n   *   model: openai(\"gpt-4o-mini\"),\n   *   instructions: \"Generate a concise title (max 5 words)\"\n   * }\n   * ```\n   */\n  generateTitle?:\n    | boolean\n    | {\n        /**\n         * Language model to use for title generation.\n         * Can be static or a function that receives request context for dynamic selection.\n         * Accepts both Mastra models and standard AI SDK LanguageModelV1/V2.\n         */\n        model: DynamicArgument<MastraModelConfig>;\n        /**\n         * Custom instructions for title generation.\n         * Can be static or a function that receives request context for dynamic customization.\n         */\n        instructions?: DynamicArgument<string>;\n      };\n\n  /**\n   * Whether to filter out incomplete (suspended) tool calls when sending messages to the LLM.\n   * When true, tool calls in `input-available` state are stripped from the prompt,\n   * preventing the agent from seeing its own suspended tool calls in thread history.\n   *\n   * Set to false to allow the agent to see suspended tool calls in context.\n   * This is useful for suspend/resume patterns where the agent should be aware of pending interactions.\n   *\n   * Note: Some providers (e.g. OpenAI) may return errors when incomplete tool calls are included.\n   * Anthropic handles incomplete tool calls without issues.\n   *\n   * @default true\n   * @example\n   * ```typescript\n   * filterIncompleteToolCalls: false // Keep suspended tool calls visible in context\n   * ```\n   */\n  filterIncompleteToolCalls?: boolean;\n\n  /**\n   * Thread management configuration.\n   * @deprecated The `threads` object is deprecated. Use top-level `generateTitle` instead of `threads.generateTitle`.\n   */\n  threads?: {\n    /**\n     * @deprecated Moved to top-level `generateTitle`. Using `threads.generateTitle` will throw an error.\n     */\n    generateTitle?:\n      | boolean\n      | {\n          model: DynamicArgument<MastraModelConfig>;\n          instructions?: DynamicArgument<string>;\n        };\n  };\n};\n\nexport type MemoryConfigInternal = BaseMemoryConfig & {\n  /**\n   * Working memory configuration for persistent user data and preferences.\n   * Maintains a structured record (Markdown or schema-based) that agents update over time.\n   * Can be thread-scoped (per conversation) or resource-scoped (across all user threads).\n   *\n   * @example\n   * ```typescript\n   * workingMemory: {\n   *   enabled: true,\n   *   scope: 'resource', // Persist across all resource (user) conversations\n   *   template: '# User Profile\\n- **Name**:\\n- **Preferences**:',\n   *   schema: z.object({\n   *     name: z.string(),\n   *     preferences: z.object({\n   *       communicationStyle: z.string(),\n   *       projectGoal: z.string(),\n   *       deadlines: z.array(z.string()),\n   *     }),\n   *   }),\n   * }\n   * ```\n   */\n  workingMemory?: WorkingMemory;\n};\n\nexport type MemoryConfig = BaseMemoryConfig & {\n  /**\n   * Working memory configuration for persistent user data and preferences.\n   * Maintains a structured record (Markdown or schema-based) that agents update over time.\n   * Can be thread-scoped (per conversation) or resource-scoped (across all user threads).\n   *\n   * @example\n   * ```typescript\n   * workingMemory: {\n   *   enabled: true,\n   *   scope: 'resource', // Persist across all resource (user) conversations\n   *   template: '# User Profile\\n- **Name**:\\n- **Preferences**:',\n   *   schema: z.object({\n   *     name: z.string(),\n   *     preferences: z.object({\n   *       communicationStyle: z.string(),\n   *       projectGoal: z.string(),\n   *       deadlines: z.array(z.string()),\n   *     }),\n   *   }),\n   * }\n   * ```\n   */\n  workingMemory?: TemplateWorkingMemory | SchemaWorkingMemory | WorkingMemoryNone;\n};\n\n/**\n * Configuration for Mastra's memory system.\n *\n * Enables agents to persist and recall information across conversations using storage providers,\n * vector databases for semantic search, and processors for context management. Memory can be\n * scoped to individual threads or shared across all conversations for a resource (user).\n *\n * @see https://mastra.ai/docs/memory/overview\n */\nexport type SharedMemoryConfig = {\n  /**\n   * Storage adapter for persisting conversation threads, messages, and working memory.\n   *\n   * @example\n   * ```typescript\n   * storage: new LibSQLStore({ id: 'agent-memory-storage', url: \"file:./agent-memory.db\" })\n   * ```\n   */\n  storage?: MastraCompositeStore;\n\n  /**\n   * Configuration for memory behaviors including conversation history, semantic recall,\n   * working memory, and thread management. Controls how messages are retrieved and\n   * what context is included in the LLM's prompt.\n   */\n  options?: MemoryConfigInternal;\n\n  /**\n   * Vector database for semantic recall capabilities using RAG-based search.\n   * Enables retrieval of relevant messages from past conversations based on semantic similarity.\n   * Set to false to disable vector search entirely.\n   *\n   * @example\n   * ```typescript\n   * vector: new PgVector({ connectionString: process.env.DATABASE_URL })\n   * ```\n   */\n  vector?: MastraVector | false;\n\n  /**\n   * Embedding model for converting messages into vector representations for semantic search.\n   * Compatible with any AI SDK embedding model. FastEmbed provides local embeddings,\n   * while providers like OpenAI offer cloud-based models.\n   *\n   * Can be specified as:\n   * - A string in the format \"provider/model\" (e.g., \"openai/text-embedding-3-small\")\n   * - An EmbeddingModel or EmbeddingModelV2 instance\n   *\n   * @example\n   * ```typescript\n   * // Using a string (model router format)\n   * embedder: \"openai/text-embedding-3-small\"\n   *\n   * // Using an AI SDK model directly\n   * embedder: openai.embedding(\"text-embedding-3-small\")\n   * ```\n   */\n  embedder?: EmbeddingModelId | MastraEmbeddingModel<string> | string;\n\n  /**\n   * Options to pass to the embedder when generating embeddings.\n   * Use this to pass provider-specific options like outputDimensionality for Google models.\n   *\n   * @example\n   * ```typescript\n   * // Control embedding dimensions for Google models\n   * embedderOptions: {\n   *   providerOptions: {\n   *     google: {\n   *       outputDimensionality: 768,\n   *       taskType: 'RETRIEVAL_DOCUMENT'\n   *     }\n   *   }\n   * }\n   * ```\n   */\n  embedderOptions?: MastraEmbeddingOptions;\n\n  /**\n   * @deprecated This option is deprecated and will throw an error if used.\n   * Use the new Input/Output processor system instead.\n   *\n   * See: https://mastra.ai/en/docs/memory/processors\n   *\n   * @example\n   * ```typescript\n   * // OLD (throws error):\n   * new Memory({\n   *   processors: [new TokenLimiter(100000)]\n   * })\n   *\n   * // NEW (use this):\n   * new Agent({\n   *   memory,\n   *   outputProcessors: [new TokenLimiterProcessor(100000)]\n   * })\n   * ```\n   */\n  processors?: MemoryProcessor[];\n};\n\n/** @deprecated Use the `format` field on `WorkingMemoryTemplate` discriminated union instead. */\nexport type WorkingMemoryFormat = 'json' | 'markdown';\n\nexport type WorkingMemoryTemplate =\n  | { format: 'markdown'; content: string }\n  | { format: 'json'; content: string | Record<string, unknown> };\n\n// Type for flexible message deletion input\nexport type MessageDeleteInput = string[] | { id: string }[];\n\n/**\n * Serialized memory configuration that can be stored in the database\n * This is a subset of SharedMemoryConfig with serializable types only\n */\nexport type SerializedMemoryConfig = {\n  /**\n   * Vector database identifier. The vector instance should be registered\n   * with the Mastra instance to resolve from this ID.\n   * Set to false to disable vector search entirely.\n   */\n  vector?: string | false;\n\n  /**\n   * Configuration for memory behaviors, omitting WorkingMemory and threads\n   */\n  options?: {\n    /** Treat memory as read-only (no new messages stored) */\n    readOnly?: boolean;\n\n    /** Number of recent messages to include, or false to disable */\n    lastMessages?: number | false;\n\n    /** Semantic recall configuration */\n    semanticRecall?: boolean | SemanticRecall;\n\n    /** Title generation configuration (serialized form) */\n    generateTitle?:\n      | boolean\n      | {\n          /** Model ID in format provider/model-name */\n          model: ModelRouterModelId;\n          /** Custom instructions for title generation */\n          instructions?: string;\n        };\n  };\n\n  /**\n   * Embedding model ID in the format \"provider/model\"\n   * (e.g., \"openai/text-embedding-3-small\")\n   * Can be a predefined EmbeddingModelId or a custom string\n   */\n  embedder?: EmbeddingModelId | string;\n\n  /**\n   * Options to pass to the embedder, omitting telemetry\n   */\n  embedderOptions?: Omit<MastraEmbeddingOptions, 'telemetry'>;\n\n  /**\n   * Serialized observational memory configuration.\n   * `true` to enable with defaults, or a config object for customization.\n   * Only JSON-safe fields are included (model IDs as strings, numeric/boolean settings).\n   */\n  observationalMemory?: boolean | SerializedObservationalMemoryConfig;\n};\n\n/**\n * JSON-serializable subset of ObservationalMemoryOptions for storage.\n * Model references are stored as string IDs (e.g., \"google/gemini-2.5-flash\").\n */\nexport type SerializedObservationalMemoryConfig = {\n  /** Model ID for both Observer and Reflector (e.g., \"google/gemini-2.5-flash\") */\n  model?: string;\n\n  /** Memory scope: 'resource' or 'thread' */\n  scope?: 'resource' | 'thread';\n\n  /** Inactivity TTL before forcing buffered observation activation */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n\n  /** Force-activate buffered observation activation when the actor model changes */\n  activateOnProviderChange?: boolean;\n\n  /** Share the token budget between messages and observations */\n  shareTokenBudget?: boolean;\n\n  /** Persist inline temporal gap markers for long pauses between messages */\n  temporalMarkers?: boolean;\n\n  /**\n   * **Experimental.** Enable retrieval-mode observation groups as durable pointers to raw message history.\n   * @experimental\n   */\n  retrieval?: boolean | { vector?: boolean; scope?: 'thread' | 'resource' };\n\n  /** Observation step configuration */\n  observation?: SerializedObservationalMemoryObservationConfig;\n\n  /** Reflection step configuration */\n  reflection?: SerializedObservationalMemoryReflectionConfig;\n};\n\n/** Serializable subset of ObservationalMemoryObservationConfig */\nexport type SerializedObservationalMemoryObservationConfig = {\n  /** Observer model ID */\n  model?: string;\n  /** Token count threshold that triggers observation */\n  messageTokens?: number;\n  /** Model settings (temperature, maxOutputTokens, etc.) */\n  modelSettings?: Record<string, unknown>;\n  /** Provider-specific options */\n  providerOptions?: Record<string, Record<string, unknown> | undefined>;\n  /** Maximum tokens per batch */\n  maxTokensPerBatch?: number;\n  /** Token interval for async buffering, or false to disable */\n  bufferTokens?: number | false;\n  /** Ratio of buffered observations to activate */\n  bufferActivation?: number;\n  /** Inactivity TTL before forcing buffered observation activation */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n  /** Force-activate buffered observation activation when the actor model changes */\n  activateOnProviderChange?: boolean;\n  /** Token threshold for synchronous blocking */\n  blockAfter?: number;\n  /** Optional token budget for observer context (0 = full truncation, false = disabled) */\n  previousObserverTokens?: number | false;\n  /** Whether the Observer should suggest thread titles */\n  threadTitle?: boolean;\n  /** Whether image/file attachment parts are forwarded to the Observer LLM */\n  observeAttachments?: 'auto' | boolean;\n};\n\n/** Serializable subset of ObservationalMemoryReflectionConfig */\nexport type SerializedObservationalMemoryReflectionConfig = {\n  /** Reflector model ID */\n  model?: string;\n  /** Token count threshold that triggers reflection */\n  observationTokens?: number;\n  /** Model settings (temperature, maxOutputTokens, etc.) */\n  modelSettings?: Record<string, unknown>;\n  /** Provider-specific options */\n  providerOptions?: Record<string, Record<string, unknown> | undefined>;\n  /** Token threshold for synchronous blocking */\n  blockAfter?: number;\n  /** Inactivity TTL before forcing buffered reflection activation */\n  activateAfterIdle?: ObservationalMemoryActivationTTL;\n  /** Force-activate buffered reflection activation when the actor model changes */\n  activateOnProviderChange?: boolean;\n  /** Ratio for async reflection buffering */\n  bufferActivation?: number;\n};\n","import type { MastraMemory } from '../memory/memory';\nimport type { MemoryConfigInternal, StorageThreadType } from '../memory/types';\nimport type { MessageList } from './message-list';\nimport type { MastraDBMessage } from './message-list/state/types';\nimport { createSignal, mastraDBMessageToSignal } from './signals';\nimport type { AgentStateSignalInput, CreatedAgentSignal } from './signals';\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport type StateSignalTracking = {\n  currentCacheKey?: string;\n  currentMode?: 'snapshot' | 'delta';\n  version?: number;\n  lastSignalId?: string;\n  lastSnapshotSignalId?: string;\n  updatedAt?: string;\n  activeCopies?: Array<{ id: string; cacheKey?: string; mode?: 'snapshot' | 'delta'; version?: number }>;\n};\n\nexport type ActiveStateSignal = CreatedAgentSignal & {\n  type: 'state';\n  metadata?: Record<string, unknown> & {\n    state?: {\n      id?: string;\n      threadId?: string;\n      cacheKey?: string;\n      version?: number;\n      mode?: 'snapshot' | 'delta';\n    };\n  };\n};\n\nexport type StateSignalHistory = {\n  activeStateSignals: ActiveStateSignal[];\n  contextWindow: {\n    hasSnapshot: boolean;\n  };\n  lastSnapshot?: ActiveStateSignal;\n  deltasSinceSnapshot: ActiveStateSignal[];\n};\n\nexport type ApplyStateSignalResult =\n  | { skipped: true; reason: 'unchanged'; stateId: string; tracking?: StateSignalTracking }\n  | { skipped: false; signal: CreatedAgentSignal; stateId: string; version: number; tracking: StateSignalTracking };\n\nexport function getStateSignalsMetadata(threadMetadata?: Record<string, unknown>): Record<string, StateSignalTracking> {\n  if (!threadMetadata) return {};\n  const mastra = threadMetadata.mastra;\n  if (!isPlainObject(mastra)) return {};\n  const stateSignals = mastra.stateSignals;\n  return isPlainObject(stateSignals) ? (stateSignals as Record<string, StateSignalTracking>) : {};\n}\n\nexport function setStateSignalMetadata(\n  threadMetadata: Record<string, unknown> | undefined,\n  stateId: string,\n  tracking: StateSignalTracking,\n): Record<string, unknown> {\n  const existing = threadMetadata ?? {};\n  const existingMastra = isPlainObject(existing.mastra) ? existing.mastra : {};\n  const existingStateSignals = isPlainObject(existingMastra.stateSignals) ? existingMastra.stateSignals : {};\n\n  return {\n    ...existing,\n    mastra: {\n      ...existingMastra,\n      stateSignals: {\n        ...existingStateSignals,\n        [stateId]: tracking,\n      },\n    },\n  };\n}\n\nfunction signalCreatedAt(signal: ActiveStateSignal): number {\n  const createdAt = signal.createdAt instanceof Date ? signal.createdAt : new Date(signal.createdAt);\n  const timestamp = createdAt.getTime();\n  return Number.isNaN(timestamp) ? 0 : timestamp;\n}\n\nexport function sortStateSignals(signals: ActiveStateSignal[]): ActiveStateSignal[] {\n  return signals\n    .map((signal, index) => ({ signal, index }))\n    .sort((left, right) => signalCreatedAt(left.signal) - signalCreatedAt(right.signal) || left.index - right.index)\n    .map(({ signal }) => signal);\n}\n\nexport function dbMessagesToStateSignals(\n  messages: MastraDBMessage[],\n  stateId: string | undefined,\n  threadId: string,\n): ActiveStateSignal[] {\n  return sortStateSignals(\n    messages\n      .filter(message => message.role === 'signal')\n      .map(message => {\n        try {\n          return mastraDBMessageToSignal(message);\n        } catch {\n          return undefined;\n        }\n      })\n      .filter(\n        (signal): signal is ActiveStateSignal =>\n          signal?.type === 'state' &&\n          isPlainObject(signal.metadata?.state) &&\n          (!stateId || signal.metadata.state.id === stateId) &&\n          signal.metadata.state.threadId === threadId,\n      ),\n  );\n}\n\nexport function getActiveStateSignals(\n  messageList: MessageList,\n  stateId: string | undefined,\n  threadId: string,\n): ActiveStateSignal[] {\n  return dbMessagesToStateSignals(messageList.get.all.db(), stateId, threadId);\n}\n\nexport function mergeStateSignals(...signalGroups: ActiveStateSignal[][]): ActiveStateSignal[] {\n  const signalsById = new Map<string, ActiveStateSignal>();\n  for (const signal of signalGroups.flat()) {\n    signalsById.set(signal.id, signal);\n  }\n  return sortStateSignals([...signalsById.values()]);\n}\n\nexport function deriveStateSignalHistory(activeStateSignals: ActiveStateSignal[]): StateSignalHistory {\n  const sortedStateSignals = sortStateSignals(activeStateSignals);\n  const lastSnapshotIndex = sortedStateSignals.findLastIndex(signal => signal.metadata?.state?.mode === 'snapshot');\n  const lastSnapshot = lastSnapshotIndex >= 0 ? sortedStateSignals[lastSnapshotIndex] : undefined;\n  const deltasSinceSnapshot = sortedStateSignals\n    .slice(lastSnapshotIndex + 1)\n    .filter(signal => signal.metadata?.state?.mode === 'delta');\n\n  return {\n    activeStateSignals: sortedStateSignals,\n    contextWindow: {\n      hasSnapshot: Boolean(lastSnapshot),\n    },\n    lastSnapshot,\n    deltasSinceSnapshot,\n  };\n}\n\nexport async function resolveStateSignalHistory({\n  messageList,\n  memory,\n  threadId,\n  resourceId,\n  stateId,\n  tracking,\n}: {\n  messageList: MessageList;\n  memory: MastraMemory;\n  threadId: string;\n  resourceId: string;\n  stateId: string;\n  tracking?: StateSignalTracking;\n}): Promise<StateSignalHistory> {\n  const localStateSignals = getActiveStateSignals(messageList, stateId, threadId);\n  const localHistory = deriveStateSignalHistory(localStateSignals);\n  const contextWindow = localHistory.contextWindow;\n\n  if (localHistory.contextWindow.hasSnapshot || !tracking?.lastSnapshotSignalId) {\n    return { ...localHistory, contextWindow };\n  }\n\n  const memoryStore = await memory.storage.getStore('memory');\n  if (!memoryStore) return { ...localHistory, contextWindow };\n\n  const storedMessages = await memoryStore.listMessages({\n    threadId,\n    resourceId,\n    perPage: false,\n    orderBy: { field: 'createdAt', direction: 'ASC' },\n  });\n  const storedStateSignals = dbMessagesToStateSignals(storedMessages.messages, stateId, threadId);\n  const resolvedStateSignals = mergeStateSignals(storedStateSignals, localStateSignals);\n\n  return {\n    ...deriveStateSignalHistory(resolvedStateSignals.length > 0 ? resolvedStateSignals : localStateSignals),\n    contextWindow,\n  };\n}\n\nexport function createStateSignalInput(\n  input: AgentStateSignalInput | (Omit<AgentStateSignalInput, 'id'> & { id?: string }),\n  options?: { defaultId?: string; acceptedAt?: Date },\n): { stateId: string; signal: CreatedAgentSignal; mode: 'snapshot' | 'delta'; cacheKey: string } {\n  const stateId = input.id ?? options?.defaultId;\n  if (!stateId) {\n    throw new Error('state signal id is required');\n  }\n  if (!input.cacheKey) {\n    throw new Error('state signal cacheKey is required');\n  }\n\n  const mode = input.mode ?? 'snapshot';\n  const { id: _stateId, cacheKey, mode: _mode, value, delta, metadata, ...signalInput } = input;\n  const signal = createSignal({\n    ...signalInput,\n    type: 'state',\n    tagName: signalInput.tagName ?? 'state',\n    acceptedAt: options?.acceptedAt,\n    metadata: {\n      ...metadata,\n      state: {\n        ...(isPlainObject(metadata?.state) ? metadata.state : {}),\n        id: stateId,\n        cacheKey,\n        mode,\n      },\n      ...(value !== undefined ? { value } : {}),\n      ...(delta !== undefined ? { delta } : {}),\n    },\n  });\n\n  return { stateId, signal, mode, cacheKey };\n}\n\nexport async function applyStateSignal({\n  input,\n  memory,\n  thread,\n  resourceId,\n  threadId,\n  memoryConfig,\n  messageList,\n  activeStateSignals,\n  defaultId,\n  acceptedAt,\n  writeSignal,\n}: {\n  input: AgentStateSignalInput | (Omit<AgentStateSignalInput, 'id'> & { id?: string });\n  memory: MastraMemory;\n  thread: StorageThreadType;\n  resourceId: string;\n  threadId: string;\n  memoryConfig?: MemoryConfigInternal;\n  messageList?: MessageList;\n  activeStateSignals?: ActiveStateSignal[];\n  defaultId?: string;\n  acceptedAt?: Date;\n  writeSignal?: (signal: CreatedAgentSignal) => Promise<void> | void;\n}): Promise<ApplyStateSignalResult> {\n  const { stateId, signal, cacheKey, mode } = createStateSignalInput(input, { defaultId, acceptedAt });\n  const activeSignals =\n    activeStateSignals ?? (messageList ? getActiveStateSignals(messageList, stateId, threadId) : []);\n  const tracking = getStateSignalsMetadata(thread.metadata)[stateId];\n\n  const usesActiveWindow = Boolean(messageList || activeStateSignals);\n  const hasActiveCopy = activeSignals.some(\n    signal => signal.metadata?.state?.cacheKey === cacheKey && signal.metadata?.state?.mode === mode,\n  );\n  const matchesCurrentState =\n    tracking?.currentCacheKey === cacheKey &&\n    (tracking.currentMode === mode || (!tracking.currentMode && hasActiveCopy));\n  if (matchesCurrentState && (!usesActiveWindow || hasActiveCopy)) {\n    return { skipped: true, reason: 'unchanged', stateId, tracking };\n  }\n\n  const previousVersion = typeof tracking?.version === 'number' ? tracking.version : 0;\n  const version = matchesCurrentState ? previousVersion || 1 : previousVersion + 1;\n  const updatedSignal = createSignal({\n    ...signal,\n    metadata: {\n      ...signal.metadata,\n      state: {\n        ...(isPlainObject(signal.metadata?.state) ? signal.metadata.state : {}),\n        id: stateId,\n        threadId,\n        cacheKey,\n        version,\n        mode,\n      },\n    },\n  });\n\n  if (messageList) {\n    messageList.addSignal(updatedSignal);\n  }\n  await writeSignal?.(updatedSignal);\n\n  const updatedAt = new Date().toISOString();\n  const updatedActiveSignals = [...activeSignals, updatedSignal];\n  const nextTracking: StateSignalTracking = {\n    currentCacheKey: cacheKey,\n    currentMode: mode,\n    version,\n    lastSignalId: updatedSignal.id,\n    lastSnapshotSignalId: mode === 'snapshot' ? updatedSignal.id : tracking?.lastSnapshotSignalId,\n    updatedAt,\n    activeCopies: updatedActiveSignals.map(activeSignal => {\n      const activeStateMetadata = isPlainObject(activeSignal.metadata?.state) ? activeSignal.metadata.state : {};\n      return {\n        id: activeSignal.id,\n        ...(typeof activeStateMetadata.cacheKey === 'string' ? { cacheKey: activeStateMetadata.cacheKey } : {}),\n        ...(activeStateMetadata.mode === 'snapshot' || activeStateMetadata.mode === 'delta'\n          ? { mode: activeStateMetadata.mode }\n          : {}),\n        ...(typeof activeStateMetadata.version === 'number' ? { version: activeStateMetadata.version } : {}),\n      };\n    }),\n  };\n\n  await memory.saveThread({\n    thread: {\n      ...thread,\n      id: threadId,\n      resourceId: thread.resourceId ?? resourceId,\n      createdAt: thread.createdAt ?? new Date(),\n      updatedAt: new Date(updatedAt),\n      metadata: setStateSignalMetadata(thread.metadata, stateId, nextTracking),\n    },\n    memoryConfig,\n  });\n\n  return { skipped: false, signal: updatedSignal, stateId, version, tracking: nextTracking };\n}\n","import { randomUUID } from 'node:crypto';\n\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<string, unknown>),\n    resource: (memory as { resource?: string } | undefined)?.resource ?? resourceId,\n    thread: (memory as { thread?: string } | undefined)?.thread ?? threadId,\n  };\n}\n\ntype AgentThreadRunRecord<OUTPUT = unknown> = {\n  agent: Agent<any, any, any, any>;\n  output: MastraModelOutput<OUTPUT>;\n  runId: string;\n  threadId: string;\n  resourceId?: string;\n  streamOptions: AgentExecutionOptions<OUTPUT>;\n  createSubscriberStream?: () => ReadableStream<unknown>;\n};\n\ntype PreparedThreadRun = {\n  abortController: AbortController;\n  cleanup: () => void;\n};\n\ntype PendingIdleSignal<OUTPUT = unknown> = {\n  agent: Agent<any, any, any, any>;\n  signal: CreatedAgentSignal;\n  runId: string;\n  resourceId: string;\n  threadId: string;\n  streamOptions?: AgentExecutionOptions<OUTPUT>;\n};\n\ntype PendingContinuation<OUTPUT = unknown> = {\n  agent: Agent<any, any, any, any>;\n  messages: MessageListInput;\n  runId: string;\n  resourceId: string;\n  threadId: string;\n  streamOptions?: AgentExecutionOptions<OUTPUT>;\n};\n\ntype AgentThreadRuntimeState = {\n  threadRunsById: Map<string, AgentThreadRunRecord<any>>;\n  threadKeysByRunId: Map<string, string>;\n  activeThreadRunIds: Map<string, string>;\n  approvalSuspendedRunIds: Set<string>;\n  pendingSignalsByThread: Map<string, CreatedAgentSignal[]>;\n  pendingIdleSignalsByThread: Map<string, PendingIdleSignal<any>[]>;\n  pendingContinuationsByThread: Map<string, PendingContinuation<any>[]>;\n  watchedThreadRunIds: Set<string>;\n  preparedRunsById: Map<string, PreparedThreadRun>;\n  abortedRunIds: Set<string>;\n};\n\nexport type AgentThreadState = 'active' | 'idle';\n\ntype SerializableAgentSignal = AgentSignal & Pick<CreatedAgentSignal, 'id' | 'createdAt'>;\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: 'signal-enqueued'; runId: string; signal: SerializableAgentSignal; sourceId: string };\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    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<PubSub, AgentThreadRuntimeState>();\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<any>) {\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>(output: MastraModelOutput<OUTPUT>, 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<unknown> | 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<void>(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<any>['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<OUTPUT>(options: AgentExecutionOptions<OUTPUT>, pubsub?: PubSub): AgentExecutionOptions<OUTPUT> {\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<void> }).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.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<any, any, any, any>,\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<void>(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<any>;\n    const {\n      output: outputForSubscribers,\n      createSubscriberStream,\n      startBroadcast,\n    } = this.#withBroadcastStream(output, pubsub, key);\n    const record: AgentThreadRunRecord<any> = {\n      agent: { id: `persisted-signal:${signal.id}` } as Agent<any, any, any, any>,\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<any, any, any, any>,\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<OUTPUT>(\n    agent: Agent<any, any, any, any>,\n    output: MastraModelOutput<OUTPUT>,\n    streamOptions: AgentExecutionOptions<OUTPUT>,\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<OUTPUT> = {\n      agent,\n      output: outputForSubscribers,\n      runId: output.runId,\n      threadId,\n      resourceId,\n      streamOptions: streamOptions as AgentThreadRunRecord<OUTPUT>['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<any>,\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<any>,\n  ) {\n    if (state.activeThreadRunIds.has(key)) {\n      return;\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<any>,\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(() => {\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        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<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    messages: MessageListInput,\n    target: { resourceId: string; threadId: string; streamOptions?: AgentExecutionOptions<OUTPUT>; 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<OUTPUT> = {\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 {\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    }\n  }\n\n  drainPendingSignals(runId: string, pubsub?: PubSub) {\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 queue = state.pendingSignalsByThread.get(key);\n    if (!queue || queue.length === 0) {\n      return [];\n    }\n\n    state.pendingSignalsByThread.delete(key);\n    return queue;\n  }\n\n  async waitForCrossAgentThreadRun(\n    agent: Agent<any, any, any, any>,\n    options: { memory?: AgentExecutionOptions<any>['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<void>(resolve => {\n      const onEvent: EventCallback = event => {\n        const data = event.data as AgentThreadStreamRuntimeEvent | undefined;\n        if ((data?.type === 'run-completed' || data?.type === 'run-aborted') && data.runId === runId) {\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<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    options: AgentSubscribeToThreadOptions,\n    pubsub?: PubSub,\n  ): Promise<AgentThreadSubscription<OUTPUT>> {\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<string>();\n    const pendingRuns: AgentThreadRunRecord<any>[] = [];\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<unknown>;\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<any>) => {\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<any> => {\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<unknown>,\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<void>(resolve => remoteRun.finishWaiters.push(resolve));\n          },\n        } as MastraModelOutput<any>,\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        const remoteRun = remoteRuns.get(data.runId);\n        if (!remoteRun) return;\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 queue = state.pendingSignalsByThread.get(key) ?? [];\n        queue.push(createSignal(data.signal));\n        state.pendingSignalsByThread.set(key, queue);\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<any> | 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<void>(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<any>;\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<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    message: AgentMessageInput,\n    target: SendAgentMessageOptions<OUTPUT>,\n    pubsub?: PubSub,\n  ): SendAgentMessageResult {\n    return this.sendSignal(agent, createMessageSignal(message, { acceptedAt: new Date() }), target, pubsub);\n  }\n\n  queueMessage<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    message: AgentMessageInput,\n    target: QueueAgentMessageOptions<OUTPUT>,\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<any> | 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<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    stateInput: AgentStateSignalInput,\n    target: SendAgentStateSignalOptions<OUTPUT>,\n    pubsub?: PubSub,\n  ): Promise<SendAgentStateSignalResult> {\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<OUTPUT = unknown>(\n    agent: Agent<any, any, any, any>,\n    signalInput: AgentSignal,\n    target: SendAgentSignalOptions<OUTPUT>,\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<any> | 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      if (activeRecord?.output.status === 'running') {\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        // Reserved local runs need a local queue until registerRun() attaches the stream record.\n        // Remote active runs only need the PubSub event; the owning process queues it locally.\n        if (state.threadKeysByRunId.get(runId) === key) {\n          const queue = state.pendingSignalsByThread.get(key) ?? [];\n          queue.push(signal);\n          state.pendingSignalsByThread.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        });\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(() => {\n        state.threadKeysByRunId.delete(runId);\n        this.#cleanupPreparedRun(state, runId);\n        if (state.activeThreadRunIds.get(key) === runId) {\n          state.activeThreadRunIds.delete(key);\n        }\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<Record<NotificationPriority, number>>): 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<NotificationSummary>(\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 { 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<void>;\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 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}: {\n  mastra: Mastra;\n  storage: NotificationsStorage;\n  record: NotificationRecord;\n  now: Date;\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 = 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\nexport async function dispatchDueNotifications({\n  mastra,\n  storage,\n  now = new Date(),\n  limit = 100,\n}: DispatchDueNotificationsInput): Promise<DispatchDueNotificationsResult> {\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 summaryGroups = new Map<string, NotificationRecord[]>();\n  const individual: NotificationRecord[] = [];\n\n  for (const record of due) {\n    if (isSummaryDue(record, now)) {\n      const key = groupKey(record);\n      if (!key) {\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        continue;\n      }\n      const group = summaryGroups.get(key) ?? [];\n      group.push(record);\n      summaryGroups.set(key, group);\n    } else {\n      individual.push(record);\n    }\n  }\n\n  for (const records of summaryGroups.values()) {\n    try {\n      const result = await sendNotificationSummary({ mastra, storage, records, now });\n      delivered.push(...result.records);\n      signals.push(result.signal);\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    }\n  }\n\n  for (const record of individual) {\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<NotificationRecord>;\n  abstract listNotifications(input: ListNotificationsInput): Promise<NotificationRecord[]>;\n  abstract listDueNotifications(input: ListDueNotificationsInput): Promise<NotificationRecord[]>;\n  abstract getNotification(input: { threadId: string; id: string }): Promise<NotificationRecord | null>;\n  abstract updateNotification(input: UpdateNotificationInput): Promise<NotificationRecord>;\n}\n\nconst cloneDate = (value?: Date) => (value ? new Date(value) : undefined);\nconst notificationKey = (threadId: string, id: string) => `${threadId}\\0${id}`;\nconst cloneValue = <T>(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 = <T extends string>(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<string, NotificationRecord>();\n\n  async createNotification(input: CreateNotificationInput): Promise<NotificationRecord> {\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<NotificationRecord[]> {\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<NotificationRecord[]> {\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<NotificationRecord | null> {\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<NotificationRecord> {\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<void> {\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"]}