@mastra/memory 1.15.0-alpha.2 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/processors/observational-memory/debug.ts","../src/processors/observational-memory/operation-registry.ts","../src/processors/observational-memory/buffering-coordinator.ts","../src/processors/observational-memory/date-utils.ts","../src/processors/observational-memory/markers.ts","../src/processors/observational-memory/message-utils.ts","../src/processors/observational-memory/model-by-input-tokens.ts","../src/processors/observational-memory/observation-groups.ts","../src/processors/observational-memory/thresholds.ts","../src/processors/observational-memory/observation-strategies/base.ts","../src/processors/observational-memory/observation-strategies/sync.ts","../src/processors/observational-memory/observation-strategies/async-buffer.ts","../src/processors/observational-memory/observation-strategies/resource-scoped.ts","../src/processors/observational-memory/observation-strategies/index.ts","../src/processors/observational-memory/observation-turn/step.ts","../src/processors/observational-memory/observation-turn/turn.ts","../src/processors/observational-memory/anchor-ids.ts","../src/processors/observational-memory/tool-result-helpers.ts","../src/processors/observational-memory/observer-agent.ts","../src/processors/observational-memory/tracing.ts","../src/processors/observational-memory/observer-runner.ts","../src/processors/observational-memory/reflector-agent.ts","../src/processors/observational-memory/reflector-runner.ts","../src/processors/observational-memory/repro-capture.ts","../src/processors/observational-memory/token-counter.ts","../src/processors/observational-memory/observational-memory.ts","../src/processors/observational-memory/processor.ts","../src/processors/observational-memory/observation-utils.ts"],"names":["join","appendFileSync","randomBytes","xxhash","boundary","getThreadOMMetadata","setThreadOMMetadata","OBSERVATIONAL_MEMORY_DEFAULTS","estimateTokenCount","getOrCreateSpan","SpanType","EntityType","createObservabilityContext","Agent","inspect","randomUUID","mkdirSync","writeFileSync","parseMemoryRequestContext","createHash","imageSize","AsyncLocalStorage","localTokens","coreFeatures","MessageHistory","resolved","resolveModelConfig","OBSERVATION_CONTEXT_PROMPT","OBSERVATION_CONTEXT_INSTRUCTIONS","OBSERVATION_RETRIEVAL_INSTRUCTIONS","ModelRouterLanguageModel","OBSERVATION_CONTINUATION_HINT"],"mappings":"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","file":"chunk-LAYKIEDY.cjs","sourcesContent":["import { appendFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst OM_DEBUG_LOG = process.env.OM_DEBUG ? join(process.cwd(), 'om-debug.log') : null;\n\nexport function omDebug(msg: string) {\n if (!OM_DEBUG_LOG) return;\n try {\n appendFileSync(OM_DEBUG_LOG, `[${new Date().toLocaleString()}] ${msg}\\n`);\n } catch {\n // ignore write errors\n }\n}\n\nexport function omError(msg: string, err?: unknown) {\n const errStr = err instanceof Error ? (err.stack ?? err.message) : err !== undefined ? String(err) : '';\n const full = errStr ? `${msg}: ${errStr}` : msg;\n omDebug(`[OM:ERROR] ${full}`);\n}\n\nomDebug(`[OM:process-start] OM module loaded, pid=${process.pid}`);\n\n// Wrap console.error so any unexpected errors also land in the debug log\nif (OM_DEBUG_LOG) {\n const _origConsoleError = console.error;\n console.error = (...args: unknown[]) => {\n omDebug(\n `[console.error] ${args\n .map(a => {\n if (a instanceof Error) return a.stack ?? a.message;\n if (typeof a === 'object' && a !== null) {\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n }\n return String(a);\n })\n .join(' ')}`,\n );\n _origConsoleError.apply(console, args);\n };\n}\n","/**\n * Process-level operation registry for Observational Memory.\n *\n * Tracks which operations (reflecting, observing, buffering) are actively running\n * in THIS process. Used to detect stale DB flags left by crashed processes.\n *\n * Key format: `${recordId}:${operationType}`\n */\n\nexport type OmOperationName = 'reflecting' | 'observing' | 'bufferingObservation' | 'bufferingReflection';\n\nconst activeOps = new Map<string, number>();\n\nexport function opKey(recordId: string, op: OmOperationName): string {\n return `${recordId}:${op}`;\n}\n\nexport function registerOp(recordId: string, op: OmOperationName): void {\n const key = opKey(recordId, op);\n activeOps.set(key, (activeOps.get(key) ?? 0) + 1);\n}\n\nexport function unregisterOp(recordId: string, op: OmOperationName): void {\n const key = opKey(recordId, op);\n const count = activeOps.get(key);\n if (!count) return;\n if (count <= 1) {\n activeOps.delete(key);\n } else {\n activeOps.set(key, count - 1);\n }\n}\n\nexport function isOpActiveInProcess(recordId: string, op: OmOperationName): boolean {\n return (activeOps.get(opKey(recordId, op)) ?? 0) > 0;\n}\n","import type { ObservationalMemoryRecord } from '@mastra/core/storage';\n\nimport { omDebug } from './debug';\nimport { isOpActiveInProcess } from './operation-registry';\nimport type { ResolvedObservationConfig, ResolvedReflectionConfig } from './types';\n\n/**\n * Manages the static buffering state machine for async observation and reflection.\n *\n * Static maps are shared across all ObservationalMemory instances in a process.\n * This is critical because multiple OM instances are created per agent loop step,\n * and they need to share knowledge of in-flight operations.\n */\nexport class BufferingCoordinator {\n private readonly observationConfig: ResolvedObservationConfig;\n private readonly reflectionConfig: ResolvedReflectionConfig;\n private readonly scope: 'thread' | 'resource';\n\n /**\n * Track in-flight async buffering operations per resource/thread.\n * Key format: \"obs:{lockKey}\" or \"refl:{lockKey}\"\n * Value: Promise that resolves when buffering completes\n */\n static asyncBufferingOps = new Map<string, Promise<void>>();\n\n /**\n * Track the last token boundary at which we started buffering.\n * Key format: \"obs:{lockKey}\" or \"refl:{lockKey}\"\n */\n static lastBufferedBoundary = new Map<string, number>();\n\n /**\n * Track the timestamp cursor for buffered messages.\n * Key format: \"obs:{lockKey}\"\n */\n static lastBufferedAtTime = new Map<string, Date>();\n\n /**\n * Tracks cycleId for in-flight buffered reflections.\n * Key format: \"refl:{lockKey}\"\n */\n static reflectionBufferCycleIds = new Map<string, string>();\n\n constructor(opts: {\n observationConfig: ResolvedObservationConfig;\n reflectionConfig: ResolvedReflectionConfig;\n scope: 'thread' | 'resource';\n }) {\n this.observationConfig = opts.observationConfig;\n this.reflectionConfig = opts.reflectionConfig;\n this.scope = opts.scope;\n }\n\n getLockKey(threadId: string | null | undefined, resourceId: string | null | undefined): string {\n if (this.scope === 'resource' && resourceId) {\n return `resource:${resourceId}`;\n }\n return `thread:${threadId ?? 'unknown'}`;\n }\n\n isAsyncObservationEnabled(): boolean {\n return this.observationConfig.bufferTokens !== undefined && this.observationConfig.bufferTokens > 0;\n }\n\n isAsyncReflectionEnabled(): boolean {\n return this.reflectionConfig.bufferActivation !== undefined && this.reflectionConfig.bufferActivation > 0;\n }\n\n getObservationBufferKey(lockKey: string): string {\n return `obs:${lockKey}`;\n }\n\n getReflectionBufferKey(lockKey: string): string {\n return `refl:${lockKey}`;\n }\n\n isAsyncBufferingInProgress(bufferKey: string): boolean {\n return BufferingCoordinator.asyncBufferingOps.has(bufferKey);\n }\n\n /**\n * Clean up static maps for a thread/resource to prevent memory leaks.\n */\n cleanupStaticMaps(threadId: string, resourceId?: string | null, activatedMessageIds?: string[]): void {\n const lockKey = this.getLockKey(threadId, resourceId);\n const obsBufKey = this.getObservationBufferKey(lockKey);\n const reflBufKey = this.getReflectionBufferKey(lockKey);\n\n if (activatedMessageIds) {\n // Partial cleanup after activation: clear stale boundary/time state for\n // the observation buffer key so the next buffer cycle isn't suppressed.\n BufferingCoordinator.lastBufferedBoundary.delete(obsBufKey);\n BufferingCoordinator.lastBufferedAtTime.delete(obsBufKey);\n } else {\n // Full cleanup: remove all static state for this thread\n BufferingCoordinator.lastBufferedAtTime.delete(obsBufKey);\n BufferingCoordinator.lastBufferedBoundary.delete(obsBufKey);\n BufferingCoordinator.lastBufferedBoundary.delete(reflBufKey);\n BufferingCoordinator.asyncBufferingOps.delete(obsBufKey);\n BufferingCoordinator.asyncBufferingOps.delete(reflBufKey);\n BufferingCoordinator.reflectionBufferCycleIds.delete(reflBufKey);\n }\n }\n\n /**\n * Check if we've crossed a new bufferTokens interval boundary for async observation.\n */\n shouldTriggerAsyncObservation(\n currentTokens: number,\n lockKey: string,\n record: ObservationalMemoryRecord,\n storage?: { setBufferingObservationFlag(id: string, flag: boolean): Promise<void> },\n messageTokensThreshold?: number,\n ): boolean {\n if (!this.isAsyncObservationEnabled()) return false;\n\n if (record.isBufferingObservation) {\n if (isOpActiveInProcess(record.id, 'bufferingObservation')) return false;\n omDebug(`[OM:shouldTriggerAsyncObs] isBufferingObservation=true but stale, clearing`);\n storage?.setBufferingObservationFlag(record.id, false)?.catch(() => {});\n }\n\n const bufferKey = this.getObservationBufferKey(lockKey);\n if (this.isAsyncBufferingInProgress(bufferKey)) return false;\n\n const bufferTokens = this.observationConfig.bufferTokens!;\n const dbBoundary = record.lastBufferedAtTokens ?? 0;\n const memBoundary = BufferingCoordinator.lastBufferedBoundary.get(bufferKey) ?? 0;\n const lastBoundary = Math.max(dbBoundary, memBoundary);\n\n const rampPoint = messageTokensThreshold ? messageTokensThreshold - bufferTokens * 1.1 : Infinity;\n const effectiveBufferTokens = currentTokens >= rampPoint ? bufferTokens / 2 : bufferTokens;\n\n const currentInterval = Math.floor(currentTokens / effectiveBufferTokens);\n const lastInterval = Math.floor(lastBoundary / effectiveBufferTokens);\n\n const shouldTrigger = currentInterval > lastInterval;\n\n omDebug(\n `[OM:shouldTriggerAsyncObs] tokens=${currentTokens}, bufferTokens=${bufferTokens}, effectiveBufferTokens=${effectiveBufferTokens}, rampPoint=${rampPoint}, currentInterval=${currentInterval}, lastInterval=${lastInterval}, lastBoundary=${lastBoundary} (db=${dbBoundary}, mem=${memBoundary}), shouldTrigger=${shouldTrigger}`,\n );\n\n return shouldTrigger;\n }\n\n /**\n * Await any in-flight async buffering operations for a given thread/resource.\n */\n static async awaitBuffering(\n threadId: string | null | undefined,\n resourceId: string | null | undefined,\n scope: 'thread' | 'resource',\n timeoutMs = 30000,\n ): Promise<void> {\n const lockKey = scope === 'resource' && resourceId ? `resource:${resourceId}` : `thread:${threadId ?? 'unknown'}`;\n const obsKey = `obs:${lockKey}`;\n const reflKey = `refl:${lockKey}`;\n\n const promises: Promise<void>[] = [];\n const obsOp = BufferingCoordinator.asyncBufferingOps.get(obsKey);\n if (obsOp) promises.push(obsOp);\n const reflOp = BufferingCoordinator.asyncBufferingOps.get(reflKey);\n if (reflOp) promises.push(reflOp);\n\n if (promises.length === 0) {\n return;\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.allSettled(promises).then(() => undefined),\n new Promise<void>(resolve => {\n timeoutId = setTimeout(resolve, timeoutMs);\n }),\n ]);\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n","/**\n * Date/time utility functions for Observational Memory.\n * Pure functions for formatting relative timestamps and annotating observations.\n */\n\n/**\n * Format a relative time string like \"5 days ago\", \"2 weeks ago\", \"today\", etc.\n */\nexport function formatRelativeTime(date: Date, currentDate: Date): string {\n const diffMs = currentDate.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n const futureDays = Math.abs(diffDays);\n if (futureDays === 1) return 'tomorrow';\n if (futureDays < 7) return `in ${futureDays} days`;\n if (futureDays < 14) return 'in 1 week';\n if (futureDays < 30) return `in ${Math.floor(futureDays / 7)} weeks`;\n if (futureDays < 60) return 'in 1 month';\n if (futureDays < 365) return `in ${Math.floor(futureDays / 30)} months`;\n const years = Math.floor(futureDays / 365);\n return `in ${years} year${years > 1 ? 's' : ''}`;\n }\n\n if (diffDays === 0) return 'today';\n if (diffDays === 1) return 'yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n if (diffDays < 14) return '1 week ago';\n if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;\n if (diffDays < 60) return '1 month ago';\n if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;\n return `${Math.floor(diffDays / 365)} year${Math.floor(diffDays / 365) > 1 ? 's' : ''} ago`;\n}\n\n/**\n * Format the gap between two dates as a human-readable string.\n * Returns null for consecutive days (no gap marker needed).\n */\nexport function formatGapBetweenDates(prevDate: Date, currDate: Date): string | null {\n const diffMs = currDate.getTime() - prevDate.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays <= 1) {\n return null; // No gap marker for consecutive days\n } else if (diffDays < 7) {\n return `[${diffDays} days later]`;\n } else if (diffDays < 14) {\n return `[1 week later]`;\n } else if (diffDays < 30) {\n const weeks = Math.floor(diffDays / 7);\n return `[${weeks} weeks later]`;\n } else if (diffDays < 60) {\n return `[1 month later]`;\n } else {\n const months = Math.floor(diffDays / 30);\n return `[${months} months later]`;\n }\n}\n\n/**\n * Parses a date string like \"May 30, 2023\", \"May 27-28, 2023\", \"late April 2023\", etc.\n * Returns the parsed Date or null if unparseable.\n */\nexport function parseDateFromContent(dateContent: string): Date | null {\n let targetDate: Date | null = null;\n\n // Try simple date format first: \"May 30, 2023\"\n const simpleDateMatch = dateContent.match(/([A-Z][a-z]+)\\s+(\\d{1,2}),?\\s+(\\d{4})/);\n if (simpleDateMatch) {\n const parsed = new Date(`${simpleDateMatch[1]} ${simpleDateMatch[2]}, ${simpleDateMatch[3]}`);\n if (!isNaN(parsed.getTime())) {\n targetDate = parsed;\n }\n }\n\n // Try range format: \"May 27-28, 2023\" - use first date\n if (!targetDate) {\n const rangeMatch = dateContent.match(/([A-Z][a-z]+)\\s+(\\d{1,2})-\\d{1,2},?\\s+(\\d{4})/);\n if (rangeMatch) {\n const parsed = new Date(`${rangeMatch[1]} ${rangeMatch[2]}, ${rangeMatch[3]}`);\n if (!isNaN(parsed.getTime())) {\n targetDate = parsed;\n }\n }\n }\n\n // Try \"late/early/mid Month Year\" format\n if (!targetDate) {\n const vagueMatch = dateContent.match(\n /(late|early|mid)[- ]?(?:to[- ]?(?:late|early|mid)[- ]?)?([A-Z][a-z]+)\\s+(\\d{4})/i,\n );\n if (vagueMatch) {\n const month = vagueMatch[2];\n const year = vagueMatch[3];\n const modifier = vagueMatch[1]!.toLowerCase();\n let day = 15; // default to middle\n if (modifier === 'early') day = 7;\n if (modifier === 'late') day = 23;\n const parsed = new Date(`${month} ${day}, ${year}`);\n if (!isNaN(parsed.getTime())) {\n targetDate = parsed;\n }\n }\n }\n\n // Try \"Month to Month Year\" format (cross-month range)\n if (!targetDate) {\n const crossMonthMatch = dateContent.match(/([A-Z][a-z]+)\\s+to\\s+(?:early\\s+)?([A-Z][a-z]+)\\s+(\\d{4})/i);\n if (crossMonthMatch) {\n // Use the middle of the range - approximate with second month\n const parsed = new Date(`${crossMonthMatch[2]} 1, ${crossMonthMatch[3]}`);\n if (!isNaN(parsed.getTime())) {\n targetDate = parsed;\n }\n }\n }\n\n return targetDate;\n}\n\n/**\n * Detects if an observation line indicates future intent (will do, plans to, looking forward to, etc.)\n */\nexport function isFutureIntentObservation(line: string): boolean {\n const futureIntentPatterns = [\n /\\bwill\\s+(?:be\\s+)?(?:\\w+ing|\\w+)\\b/i,\n /\\bplans?\\s+to\\b/i,\n /\\bplanning\\s+to\\b/i,\n /\\blooking\\s+forward\\s+to\\b/i,\n /\\bgoing\\s+to\\b/i,\n /\\bintends?\\s+to\\b/i,\n /\\bwants?\\s+to\\b/i,\n /\\bneeds?\\s+to\\b/i,\n /\\babout\\s+to\\b/i,\n ];\n return futureIntentPatterns.some(pattern => pattern.test(line));\n}\n\n/**\n * Expand inline estimated dates with relative time.\n * Matches patterns like \"(estimated May 27-28, 2023)\" or \"(meaning May 30, 2023)\"\n * and expands them to \"(meaning May 30, 2023 - which was 3 weeks ago)\"\n */\nexport function expandInlineEstimatedDates(observations: string, currentDate: Date): string {\n // Match patterns like:\n // (estimated May 27-28, 2023)\n // (meaning May 30, 2023)\n // (estimated late April to early May 2023)\n // (estimated mid-to-late May 2023)\n // These should now be at the END of observation lines\n const inlineDateRegex = /\\((estimated|meaning)\\s+([^)]+\\d{4})\\)/gi;\n\n return observations.replace(inlineDateRegex, (match, prefix: string, dateContent: string, offset: number) => {\n const targetDate = parseDateFromContent(dateContent);\n\n if (targetDate) {\n const relative = formatRelativeTime(targetDate, currentDate);\n\n // Check if this is a future-intent observation that's now in the past\n // We need to look at the text BEFORE this match to determine intent\n const lineStart = observations.lastIndexOf('\\n', offset) + 1;\n const lineBeforeDate = observations.slice(lineStart, offset);\n\n const isPastDate = targetDate < currentDate;\n const isFutureIntent = isFutureIntentObservation(lineBeforeDate);\n\n if (isPastDate && isFutureIntent) {\n // This was a planned action that should have happened by now\n return `(${prefix} ${dateContent} - ${relative}, likely already happened)`;\n }\n\n return `(${prefix} ${dateContent} - ${relative})`;\n }\n\n // Couldn't parse, return original\n return match;\n });\n}\n\n/**\n * Add relative time annotations to observations.\n * Transforms \"Date: May 15, 2023\" headers to \"Date: May 15, 2023 (5 days ago)\"\n * and expands inline estimated dates with relative time context.\n */\nexport function addRelativeTimeToObservations(observations: string, currentDate: Date): string {\n // First, expand inline estimated dates with relative time\n const withInlineDates = expandInlineEstimatedDates(observations, currentDate);\n\n // Match date headers like \"Date: May 15, 2023\" or \"Date: January 1, 2024\"\n const dateHeaderRegex = /^(Date:\\s*)([A-Z][a-z]+ \\d{1,2}, \\d{4})$/gm;\n\n // First pass: collect all dates in order\n const dates: { index: number; date: Date; match: string; prefix: string; dateStr: string }[] = [];\n let regexMatch: RegExpExecArray | null;\n while ((regexMatch = dateHeaderRegex.exec(withInlineDates)) !== null) {\n const dateStr = regexMatch[2]!;\n const parsed = new Date(dateStr);\n if (!isNaN(parsed.getTime())) {\n dates.push({\n index: regexMatch.index,\n date: parsed,\n match: regexMatch[0],\n prefix: regexMatch[1]!,\n dateStr,\n });\n }\n }\n\n // If no dates found, return the inline-expanded version\n if (dates.length === 0) {\n return withInlineDates;\n }\n\n // Second pass: build result with relative times and gap markers\n let result = '';\n let lastIndex = 0;\n\n for (let i = 0; i < dates.length; i++) {\n const curr = dates[i]!;\n const prev = i > 0 ? dates[i - 1]! : null;\n\n // Add text before this date header\n result += withInlineDates.slice(lastIndex, curr.index);\n\n // Add gap marker if there's a significant gap from previous date\n if (prev) {\n const gap = formatGapBetweenDates(prev.date, curr.date);\n if (gap) {\n result += `\\n${gap}\\n\\n`;\n }\n }\n\n // Add the date header with relative time\n const relative = formatRelativeTime(curr.date, currentDate);\n result += `${curr.prefix}${curr.dateStr} (${relative})`;\n\n lastIndex = curr.index + curr.match.length;\n }\n\n // Add remaining text after last date header\n result += withInlineDates.slice(lastIndex);\n\n return result;\n}\n","import type {\n DataOmActivationPart,\n DataOmBufferingEndPart,\n DataOmBufferingFailedPart,\n DataOmBufferingStartPart,\n DataOmObservationEndPart,\n DataOmObservationFailedPart,\n DataOmObservationStartPart,\n DataOmThreadUpdatePart,\n ObservationMarkerConfig,\n OmOperationType,\n} from './types';\n\n/**\n * Create a start marker for when observation begins.\n */\nexport function createObservationStartMarker(params: {\n cycleId: string;\n operationType: 'observation' | 'reflection';\n tokensToObserve: number;\n recordId: string;\n threadId: string;\n threadIds: string[];\n config: ObservationMarkerConfig;\n}): DataOmObservationStartPart {\n return {\n type: 'data-om-observation-start',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n startedAt: new Date().toISOString(),\n tokensToObserve: params.tokensToObserve,\n recordId: params.recordId,\n threadId: params.threadId,\n threadIds: params.threadIds,\n config: params.config,\n },\n };\n}\n\n/**\n * Create an end marker for when observation completes successfully.\n */\nexport function createObservationEndMarker(params: {\n cycleId: string;\n operationType: 'observation' | 'reflection';\n startedAt: string;\n tokensObserved: number;\n observationTokens: number;\n observations?: string;\n currentTask?: string;\n suggestedResponse?: string;\n recordId: string;\n threadId: string;\n}): DataOmObservationEndPart {\n const completedAt = new Date().toISOString();\n const durationMs = new Date(completedAt).getTime() - new Date(params.startedAt).getTime();\n\n return {\n type: 'data-om-observation-end',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n completedAt,\n durationMs,\n tokensObserved: params.tokensObserved,\n observationTokens: params.observationTokens,\n observations: params.observations,\n currentTask: params.currentTask,\n suggestedResponse: params.suggestedResponse,\n recordId: params.recordId,\n threadId: params.threadId,\n },\n };\n}\n\n/**\n * Create a failed marker for when observation fails.\n */\nexport function createObservationFailedMarker(params: {\n cycleId: string;\n operationType: 'observation' | 'reflection';\n startedAt: string;\n tokensAttempted: number;\n error: string;\n recordId: string;\n threadId: string;\n}): DataOmObservationFailedPart {\n const failedAt = new Date().toISOString();\n const durationMs = new Date(failedAt).getTime() - new Date(params.startedAt).getTime();\n\n return {\n type: 'data-om-observation-failed',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n failedAt,\n durationMs,\n tokensAttempted: params.tokensAttempted,\n error: params.error,\n recordId: params.recordId,\n threadId: params.threadId,\n },\n };\n}\n\n/**\n * Create a start marker for when async buffering begins.\n */\nexport function createBufferingStartMarker(params: {\n cycleId: string;\n operationType: OmOperationType;\n tokensToBuffer: number;\n recordId: string;\n threadId: string;\n threadIds: string[];\n config: ObservationMarkerConfig;\n}): DataOmBufferingStartPart {\n return {\n type: 'data-om-buffering-start',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n startedAt: new Date().toISOString(),\n tokensToBuffer: params.tokensToBuffer,\n recordId: params.recordId,\n threadId: params.threadId,\n threadIds: params.threadIds,\n config: params.config,\n },\n };\n}\n\n/**\n * Create an end marker for when async buffering completes successfully.\n */\nexport function createBufferingEndMarker(params: {\n cycleId: string;\n operationType: OmOperationType;\n startedAt: string;\n tokensBuffered: number;\n bufferedTokens: number;\n recordId: string;\n threadId: string;\n observations?: string;\n}): DataOmBufferingEndPart {\n const completedAt = new Date().toISOString();\n const durationMs = new Date(completedAt).getTime() - new Date(params.startedAt).getTime();\n\n return {\n type: 'data-om-buffering-end',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n completedAt,\n durationMs,\n tokensBuffered: params.tokensBuffered,\n bufferedTokens: params.bufferedTokens,\n recordId: params.recordId,\n threadId: params.threadId,\n observations: params.observations,\n },\n };\n}\n\n/**\n * Create a failed marker for when async buffering fails.\n */\nexport function createBufferingFailedMarker(params: {\n cycleId: string;\n operationType: OmOperationType;\n startedAt: string;\n tokensAttempted: number;\n error: string;\n recordId: string;\n threadId: string;\n}): DataOmBufferingFailedPart {\n const failedAt = new Date().toISOString();\n const durationMs = new Date(failedAt).getTime() - new Date(params.startedAt).getTime();\n\n return {\n type: 'data-om-buffering-failed',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n failedAt,\n durationMs,\n tokensAttempted: params.tokensAttempted,\n error: params.error,\n recordId: params.recordId,\n threadId: params.threadId,\n },\n };\n}\n\n/**\n * Create an activation marker for when buffered observations are activated.\n */\nexport function createActivationMarker(params: {\n cycleId: string;\n operationType: OmOperationType;\n chunksActivated: number;\n tokensActivated: number;\n observationTokens: number;\n messagesActivated: number;\n recordId: string;\n threadId: string;\n generationCount: number;\n observations?: string;\n config: ObservationMarkerConfig;\n}): DataOmActivationPart {\n return {\n type: 'data-om-activation',\n data: {\n cycleId: params.cycleId,\n operationType: params.operationType,\n activatedAt: new Date().toISOString(),\n chunksActivated: params.chunksActivated,\n tokensActivated: params.tokensActivated,\n observationTokens: params.observationTokens,\n messagesActivated: params.messagesActivated,\n recordId: params.recordId,\n threadId: params.threadId,\n generationCount: params.generationCount,\n config: params.config,\n observations: params.observations,\n },\n };\n}\n\n/**\n * Create a thread update marker when the observer suggests a new thread title.\n */\nexport function createThreadUpdateMarker(params: {\n cycleId: string;\n threadId: string;\n oldTitle?: string;\n newTitle: string;\n}): DataOmThreadUpdatePart {\n return {\n type: 'data-om-thread-update',\n data: {\n cycleId: params.cycleId,\n threadId: params.threadId,\n oldTitle: params.oldTitle,\n newTitle: params.newTitle,\n timestamp: new Date().toISOString(),\n },\n };\n}\n","import type { MastraDBMessage, MessageList } from '@mastra/core/agent';\nimport type { BufferedObservationChunk, ObservationalMemoryRecord } from '@mastra/core/storage';\n\n/**\n * Find the index of the last completed observation boundary (end marker) in a message's parts.\n * Returns -1 if no completed observation is found.\n */\nexport function findLastCompletedObservationBoundary(message: MastraDBMessage): number {\n const parts = message.content?.parts;\n if (!parts || !Array.isArray(parts)) return -1;\n\n // Search from the end to find the most recent end marker\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i] as { type?: string };\n if (part?.type === 'data-om-observation-end') {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * Get unobserved parts from a message.\n * If the message has a completed observation (start + end), only return parts after the end.\n * If observation is in progress (start without end), include parts before the start.\n * Otherwise, return all parts.\n */\nexport function getUnobservedParts(message: MastraDBMessage): MastraDBMessage['content']['parts'] {\n const parts = message.content?.parts;\n if (!parts || !Array.isArray(parts)) return [];\n\n const endMarkerIndex = findLastCompletedObservationBoundary(message);\n if (endMarkerIndex === -1) {\n // No completed observation - all parts are unobserved\n // (This includes the case where observation is in progress)\n return parts.filter(p => {\n const part = p as { type?: string };\n // Exclude start markers that are in progress\n return part?.type !== 'data-om-observation-start';\n });\n }\n\n // Return only parts after the end marker (excluding start/end/failed markers)\n return parts.slice(endMarkerIndex + 1).filter(p => {\n const part = p as { type?: string };\n return !part?.type?.startsWith('data-om-observation-');\n });\n}\n\n/**\n * Check if a message has any unobserved parts.\n */\nexport function hasUnobservedParts(message: MastraDBMessage): boolean {\n return getUnobservedParts(message).length > 0;\n}\n\n/**\n * Compute a cursor pointing at the latest message by createdAt.\n * Used to derive a stable observation boundary for replay pruning.\n */\nexport function getLastObservedMessageCursor(\n messages: MastraDBMessage[],\n): { createdAt: string; id: string } | undefined {\n let latest: MastraDBMessage | undefined;\n for (const msg of messages) {\n if (!msg?.id || !msg.createdAt) continue;\n if (!latest || new Date(msg.createdAt).getTime() > new Date(latest.createdAt!).getTime()) {\n latest = msg;\n }\n }\n return latest ? { createdAt: new Date(latest.createdAt!).toISOString(), id: latest.id } : undefined;\n}\n\n/**\n * Check if a message is at or before a cursor (by createdAt then id).\n */\nexport function isMessageAtOrBeforeCursor(msg: MastraDBMessage, cursor: { createdAt: string; id: string }): boolean {\n if (!msg.createdAt) return false;\n const msgIso = new Date(msg.createdAt).toISOString();\n if (msgIso < cursor.createdAt) return true;\n if (msgIso === cursor.createdAt && msg.id === cursor.id) return true;\n return false;\n}\n\n/**\n * Safely extract buffered observation chunks from a record.\n * Handles both array and JSON-string formats, returning empty array if malformed.\n */\n/**\n * Filter out already-observed messages from the in-memory context.\n * Uses marker-boundary pruning (preferred) or record-based fallback.\n *\n * The `fallbackCursor` is optional — callers that need it should resolve it\n * from thread metadata before calling this function.\n */\nexport function filterObservedMessages(opts: {\n messageList: MessageList;\n record?: ObservationalMemoryRecord;\n useMarkerBoundaryPruning?: boolean;\n fallbackCursor?: { createdAt: string; id: string };\n}): void {\n const { messageList, record } = opts;\n const allMessages = messageList.get.all.db();\n const useMarkerBoundaryPruning = opts.useMarkerBoundaryPruning ?? true;\n\n let markerMessageIndex = -1;\n let markerMessage: MastraDBMessage | null = null;\n\n for (let i = allMessages.length - 1; i >= 0; i--) {\n const msg = allMessages[i];\n if (!msg) continue;\n if (findLastCompletedObservationBoundary(msg) !== -1) {\n markerMessageIndex = i;\n markerMessage = msg;\n break;\n }\n }\n\n if (useMarkerBoundaryPruning && markerMessage && markerMessageIndex !== -1) {\n const messagesToRemove: string[] = [];\n for (let i = 0; i < markerMessageIndex; i++) {\n const msg = allMessages[i];\n if (msg?.id && msg.id !== 'om-continuation') {\n messagesToRemove.push(msg.id);\n }\n }\n\n if (messagesToRemove.length > 0) {\n messageList.removeByIds(messagesToRemove);\n }\n\n const unobserved = getUnobservedParts(markerMessage);\n if (unobserved.length === 0) {\n if (markerMessage.id) messageList.removeByIds([markerMessage.id]);\n } else if (unobserved.length < (markerMessage.content?.parts?.length ?? 0)) {\n markerMessage.content.parts = unobserved;\n }\n } else if (record) {\n const observedIds = new Set<string>(Array.isArray(record.observedMessageIds) ? record.observedMessageIds : []);\n\n const derivedCursor =\n opts.fallbackCursor ??\n getLastObservedMessageCursor(allMessages.filter(msg => !!msg?.id && observedIds.has(msg.id) && !!msg.createdAt));\n const lastObservedAt = record.lastObservedAt;\n const messagesToRemove: string[] = [];\n\n for (const msg of allMessages) {\n if (!msg?.id || msg.id === 'om-continuation') continue;\n\n if (observedIds.has(msg.id)) {\n messagesToRemove.push(msg.id);\n continue;\n }\n\n if (derivedCursor && isMessageAtOrBeforeCursor(msg, derivedCursor)) {\n messagesToRemove.push(msg.id);\n continue;\n }\n\n if (lastObservedAt && msg.createdAt) {\n const msgDate = new Date(msg.createdAt);\n if (msgDate <= lastObservedAt) {\n messagesToRemove.push(msg.id);\n }\n }\n }\n\n if (messagesToRemove.length > 0) {\n messageList.removeByIds(messagesToRemove);\n }\n }\n}\n\nexport function getBufferedChunks(record: ObservationalMemoryRecord | null | undefined): BufferedObservationChunk[] {\n if (!record?.bufferedObservationChunks) return [];\n if (Array.isArray(record.bufferedObservationChunks)) return record.bufferedObservationChunks;\n if (typeof record.bufferedObservationChunks === 'string') {\n try {\n const parsed = JSON.parse(record.bufferedObservationChunks);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n return [];\n}\n\n/**\n * Sort threads by their oldest unobserved message.\n * Returns thread IDs in order from oldest to most recent.\n */\n/**\n * Combine active and buffered observations for the buffering observer context.\n */\nexport function combineObservationsForBuffering(\n activeObservations: string | undefined,\n bufferedObservations: string | undefined,\n): string | undefined {\n if (!activeObservations && !bufferedObservations) return undefined;\n if (!activeObservations) return bufferedObservations;\n if (!bufferedObservations) return activeObservations;\n return `${activeObservations}\\n\\n--- BUFFERED (pending activation) ---\\n\\n${bufferedObservations}`;\n}\n\nexport function sortThreadsByOldestMessage(messagesByThread: Map<string, MastraDBMessage[]>): string[] {\n return Array.from(messagesByThread.entries())\n .map(([threadId, messages]) => ({\n threadId,\n oldestTimestamp: Math.min(...messages.map(m => (m.createdAt ? new Date(m.createdAt).getTime() : Date.now()))),\n }))\n .sort((a, b) => a.oldestTimestamp - b.oldestTimestamp)\n .map(t => t.threadId);\n}\n\n/**\n * Strip any thread tags that the Observer might have added.\n * Thread attribution is handled externally by the system, not by the Observer.\n */\nexport function stripThreadTags(observations: string): string {\n return observations.replace(/<thread[^>]*>|<\\/thread>/gi, '').trim();\n}\n","import type { AgentConfig } from '@mastra/core/agent';\nimport type { MastraModelConfig } from '@mastra/core/llm';\n\ntype TieredModelTarget = MastraModelConfig;\n\nexport interface ModelByInputTokensConfig {\n upTo: Record<number, TieredModelTarget>;\n}\n\nfunction isTieredModelTarget(model: unknown): model is TieredModelTarget {\n if (typeof model === 'string') {\n return true;\n }\n\n if (!model || typeof model !== 'object') {\n return false;\n }\n\n return (\n 'modelId' in model ||\n 'id' in model ||\n 'providerId' in model ||\n 'provider' in model ||\n ('doGenerate' in model && 'doStream' in model)\n );\n}\n\nfunction normalizeThresholds(config: ModelByInputTokensConfig) {\n const entries = Object.entries(config.upTo);\n\n if (entries.length === 0) {\n throw new Error('ModelByInputTokens requires at least one threshold in \"upTo\"');\n }\n\n for (const [limitStr, model] of entries) {\n const limit = Number(limitStr);\n if (!Number.isFinite(limit) || limit <= 0) {\n throw new Error(`ModelByInputTokens threshold keys must be positive numbers. Got: ${limitStr}`);\n }\n\n if (!isTieredModelTarget(model)) {\n throw new Error(`ModelByInputTokens requires a valid model target for threshold ${limitStr}`);\n }\n }\n\n return entries.map(([limitStr, model]) => ({ limit: Number(limitStr), model })).sort((a, b) => a.limit - b.limit);\n}\n\nexport class ModelByInputTokens {\n private readonly thresholds: Array<{ limit: number; model: AgentConfig['model'] }>;\n\n constructor(config: ModelByInputTokensConfig) {\n this.thresholds = normalizeThresholds(config);\n }\n\n resolve(inputTokens: number): AgentConfig['model'] {\n for (const { limit, model } of this.thresholds) {\n if (inputTokens <= limit) {\n return model;\n }\n }\n\n const maxLimit = this.thresholds[this.thresholds.length - 1]!.limit;\n throw new Error(\n `ModelByInputTokens: input token count (${inputTokens}) exceeds the largest configured threshold (${maxLimit}). ` +\n `Please configure a higher threshold or use a larger model.`,\n );\n }\n\n getThresholds(): number[] {\n return this.thresholds.map(t => t.limit);\n }\n}\n","import { randomBytes } from 'node:crypto';\n\nexport interface ObservationGroup {\n id: string;\n range: string;\n content: string;\n kind?: string;\n}\n\ninterface ReflectionObservationGroupSection {\n heading: string;\n body: string;\n}\n\nconst OBSERVATION_GROUP_PATTERN = /<observation-group\\s([^>]*)>([\\s\\S]*?)<\\/observation-group>/g;\nconst ATTRIBUTE_PATTERN = /([\\w][\\w-]*)=\"([^\"]*)\"/g;\nconst REFLECTION_GROUP_SPLIT_PATTERN = /^##\\s+Group\\s+/m;\n\nfunction parseObservationGroupAttributes(attributeString: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n for (const match of attributeString.matchAll(ATTRIBUTE_PATTERN)) {\n const [, key, value] = match;\n if (key && value !== undefined) {\n attributes[key] = value;\n }\n }\n\n return attributes;\n}\n\nfunction parseReflectionObservationGroupSections(content: string): ReflectionObservationGroupSection[] {\n const normalizedContent = content.trim();\n if (!normalizedContent || !REFLECTION_GROUP_SPLIT_PATTERN.test(normalizedContent)) {\n return [];\n }\n\n return normalizedContent\n .split(REFLECTION_GROUP_SPLIT_PATTERN)\n .map(section => section.trim())\n .filter(Boolean)\n .map(section => {\n const newlineIndex = section.indexOf('\\n');\n const heading = (newlineIndex >= 0 ? section.slice(0, newlineIndex) : section).trim();\n const body = (newlineIndex >= 0 ? section.slice(newlineIndex + 1) : '').trim();\n\n return {\n heading,\n body: stripReflectionGroupMetadata(body),\n };\n });\n}\n\nfunction stripReflectionGroupMetadata(body: string): string {\n return body.replace(/^_range:\\s*`[^`]*`_\\s*\\n?/m, '').trim();\n}\n\nexport function generateAnchorId(): string {\n return randomBytes(8).toString('hex');\n}\n\nexport function wrapInObservationGroup(\n observations: string,\n range: string,\n id = generateAnchorId(),\n _sourceGroupIds?: string[],\n kind?: string,\n): string {\n const content = observations.trim();\n const kindAttr = kind ? ` kind=\"${kind}\"` : '';\n return `<observation-group id=\"${id}\" range=\"${range}\"${kindAttr}>\\n${content}\\n</observation-group>`;\n}\n\nexport function parseObservationGroups(observations: string): ObservationGroup[] {\n if (!observations) {\n return [];\n }\n\n const groups: ObservationGroup[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = OBSERVATION_GROUP_PATTERN.exec(observations)) !== null) {\n const attributes = parseObservationGroupAttributes(match[1] ?? '');\n const id = attributes.id;\n const range = attributes.range;\n\n if (!id || !range) {\n continue;\n }\n\n groups.push({\n id,\n range,\n kind: attributes.kind,\n content: match[2]!.trim(),\n });\n }\n\n return groups;\n}\n\nexport function stripObservationGroups(observations: string): string {\n if (!observations) {\n return observations;\n }\n\n return observations\n .replace(OBSERVATION_GROUP_PATTERN, (_match, _attributes, content: string) => content.trim())\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction getRangeSegments(range: string): string[] {\n return range\n .split(',')\n .map(segment => segment.trim())\n .filter(Boolean);\n}\n\nexport function combineObservationGroupRanges(groups: ObservationGroup[]): string {\n const segments = groups.flatMap(group => getRangeSegments(group.range));\n if (segments.length === 0) {\n return '';\n }\n\n const firstSegment = segments[0];\n const lastSegment = segments[segments.length - 1];\n const firstStart = firstSegment?.split(':')[0]?.trim();\n const lastEnd = lastSegment?.split(':').at(-1)?.trim();\n\n if (firstStart && lastEnd) {\n return `${firstStart}:${lastEnd}`;\n }\n\n return Array.from(new Set(segments)).join(',');\n}\n\nexport function renderObservationGroupsForReflection(observations: string): string | null {\n const groups = parseObservationGroups(observations);\n if (groups.length === 0) {\n return null;\n }\n\n // Walk the string positionally: keep ungrouped text in place, replace each\n // <observation-group> tag with the rendered ## Group heading.\n const groupsByContent = new Map(groups.map(g => [g.content.trim(), g]));\n const result = observations.replace(OBSERVATION_GROUP_PATTERN, (_match, _attrs: string, content: string) => {\n const group = groupsByContent.get(content.trim());\n if (!group) return content.trim();\n return `## Group \\`${group.id}\\`\\n_range: \\`${group.range}\\`_\\n\\n${group.content}`;\n });\n\n return result.replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\nfunction getCanonicalGroupId(sectionHeading: string, fallbackIndex: number): string {\n const match = sectionHeading.match(/`([^`]+)`/);\n return match?.[1]?.trim() || `derived-group-${fallbackIndex + 1}`;\n}\n\nexport function deriveObservationGroupProvenance(content: string, groups: ObservationGroup[]): ObservationGroup[] {\n const sections = parseReflectionObservationGroupSections(content);\n if (sections.length === 0 || groups.length === 0) {\n return [];\n }\n\n return sections.map((section, index) => {\n const bodyLines = new Set(\n section.body\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean),\n );\n\n const matchingGroups = groups.filter(group => {\n const groupLines = group.content\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n return groupLines.some(line => bodyLines.has(line));\n });\n\n const fallbackGroup = groups[Math.min(index, groups.length - 1)];\n const resolvedGroups = matchingGroups.length > 0 ? matchingGroups : fallbackGroup ? [fallbackGroup] : [];\n const canonicalGroupId = getCanonicalGroupId(section.heading, index);\n\n return {\n id: canonicalGroupId,\n range: combineObservationGroupRanges(resolvedGroups),\n kind: 'reflection',\n content: section.body,\n };\n });\n}\n\nexport function reconcileObservationGroupsFromReflection(content: string, sourceObservations: string): string | null {\n const sourceGroups = parseObservationGroups(sourceObservations);\n if (sourceGroups.length === 0) {\n return null;\n }\n\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return '';\n }\n\n const derivedGroups = deriveObservationGroupProvenance(normalizedContent, sourceGroups);\n if (derivedGroups.length > 0) {\n return derivedGroups\n .map(group => wrapInObservationGroup(group.content, group.range, group.id, undefined, group.kind))\n .join('\\n\\n');\n }\n\n return wrapInObservationGroup(\n normalizedContent,\n combineObservationGroupRanges(sourceGroups),\n generateAnchorId(),\n undefined,\n 'reflection',\n );\n}\n","import type { BufferedObservationChunk } from '@mastra/core/storage';\n\nimport type { ThresholdRange } from './types';\n\n/**\n * Get the maximum value from a threshold (simple number or range).\n */\nexport function getMaxThreshold(threshold: number | ThresholdRange): number {\n if (typeof threshold === 'number') {\n return threshold;\n }\n return threshold.max;\n}\n\n/**\n * Calculate dynamic threshold based on observation space.\n * When shareTokenBudget is enabled, the message threshold can expand\n * into unused observation space, up to the total context budget.\n *\n * Total budget = messageTokens + observationTokens\n * Effective threshold = totalBudget - currentObservationTokens\n *\n * Example with 30k:40k thresholds (70k total):\n * - 0 observations → messages can use ~70k\n * - 10k observations → messages can use ~60k\n * - 40k observations → messages back to ~30k\n */\nexport function calculateDynamicThreshold(\n threshold: number | ThresholdRange,\n currentObservationTokens: number,\n): number {\n // If not using adaptive threshold (simple number), return as-is\n if (typeof threshold === 'number') {\n return threshold;\n }\n\n // Adaptive threshold: use remaining space in total budget\n // Total budget is stored as threshold.max (base + reflection threshold)\n // Base threshold is stored as threshold.min\n const totalBudget = threshold.max;\n const baseThreshold = threshold.min;\n\n // Effective threshold = total budget minus current observations\n // But never go below the base threshold\n const effectiveThreshold = Math.max(totalBudget - currentObservationTokens, baseThreshold);\n\n return Math.round(effectiveThreshold);\n}\n\n/**\n * Resolve bufferTokens config value.\n * Values in (0, 1) are treated as ratios of the message threshold.\n * e.g. bufferTokens: 0.25 with messageTokens: 20_000 → 5_000\n */\nexport function resolveBufferTokens(\n bufferTokens: number | false | undefined,\n messageTokens: number | ThresholdRange,\n): number | undefined {\n if (bufferTokens === false) return undefined;\n if (bufferTokens === undefined) return undefined;\n if (bufferTokens > 0 && bufferTokens < 1) {\n return Math.round(getMaxThreshold(messageTokens) * bufferTokens);\n }\n return bufferTokens;\n}\n\n/**\n * Resolve blockAfter config value.\n * Values in [1, 100) are treated as multipliers of the threshold.\n * e.g. blockAfter: 1.5 with messageTokens: 20_000 → 30_000\n * Values >= 100 are treated as absolute token counts.\n * Defaults to 1.2 (120% of threshold) when async buffering is enabled but blockAfter is omitted.\n */\nexport function resolveBlockAfter(\n blockAfter: number | undefined,\n messageTokens: number | ThresholdRange,\n): number | undefined {\n if (blockAfter === undefined) return undefined;\n // Values between 1 (inclusive) and 100 (exclusive) are treated as multipliers of the threshold.\n // e.g. blockAfter: 1.5 means 1.5x the threshold. blockAfter: 1 means exactly at threshold.\n // Values >= 100 are treated as absolute token counts.\n if (blockAfter >= 1 && blockAfter < 100) {\n return Math.round(getMaxThreshold(messageTokens) * blockAfter);\n }\n return blockAfter;\n}\n\n/**\n * Convert bufferActivation to an absolute retention floor (tokens to keep after activation).\n * When bufferActivation >= 1000, it's an absolute retention target.\n * Otherwise it's a ratio: retentionFloor = threshold * (1 - ratio).\n */\nexport function resolveRetentionFloor(bufferActivation: number, messageTokensThreshold: number): number {\n if (bufferActivation >= 1000) return bufferActivation;\n const ratio = Math.max(0, Math.min(1, bufferActivation));\n return messageTokensThreshold * (1 - ratio);\n}\n\n/**\n * Convert bufferActivation to the equivalent ratio (0-1) for the storage layer.\n * When bufferActivation >= 1000, it's an absolute retention target, so we compute\n * the equivalent ratio: 1 - (bufferActivation / threshold).\n */\nexport function resolveActivationRatio(bufferActivation: number, messageTokensThreshold: number): number {\n if (bufferActivation >= 1000) {\n return Math.max(0, Math.min(1, 1 - bufferActivation / messageTokensThreshold));\n }\n return Math.max(0, Math.min(1, bufferActivation));\n}\n\n/**\n * Calculate the projected message tokens that would be removed if activation happened now.\n * This replicates the chunk boundary logic in swapBufferedToActive without actually activating.\n */\nexport function calculateProjectedMessageRemoval(\n chunks: BufferedObservationChunk[],\n bufferActivation: number,\n messageTokensThreshold: number,\n currentPendingTokens: number,\n): number {\n if (chunks.length === 0) return 0;\n\n const retentionFloor = resolveRetentionFloor(bufferActivation, messageTokensThreshold);\n const targetMessageTokens = Math.max(0, currentPendingTokens - retentionFloor);\n\n // Already within retention floor — no removal needed\n if (targetMessageTokens === 0) return 0;\n\n // Find the closest chunk boundary to the target, biased over (prefer removing\n // slightly more than the target so remaining context lands at or below retentionFloor).\n // Track both best-over and best-under boundaries so we can fall back to under\n // if the over boundary would overshoot by too much.\n let cumulativeMessageTokens = 0;\n let bestOverBoundary = 0;\n let bestOverTokens = 0;\n let bestUnderBoundary = 0;\n let bestUnderTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n if (cumulativeMessageTokens >= targetMessageTokens) {\n // Over or equal — track the closest (lowest) over boundary\n if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n // Under — track the closest (highest) under boundary\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n // Safeguard: if the over boundary would eat into more than 95% of the\n // retention floor, fall back to the best under boundary instead.\n // This prevents edge cases where a large chunk overshoots dramatically.\n // Additionally, never bias over if it would leave fewer than the smaller of\n // 1000 tokens or the retention floor — at that level the agent may lose\n // all meaningful context.\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = currentPendingTokens - bestOverTokens;\n const remainingAfterUnder = currentPendingTokens - bestUnderTokens;\n // When activationRatio ≈ 1.0, retentionFloor is 0 and minRemaining becomes 0 — intentional for \"activate everything\" configs.\n const minRemaining = Math.min(1000, retentionFloor);\n\n let bestBoundaryMessageTokens: number;\n\n if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n bestBoundaryMessageTokens = bestOverTokens;\n } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n bestBoundaryMessageTokens = bestUnderTokens;\n } else if (bestOverBoundary > 0) {\n // All boundaries are over and exceed the safeguard — still activate\n // the closest over boundary (better than nothing)\n bestBoundaryMessageTokens = bestOverTokens;\n } else {\n return chunks[0]?.messageTokens ?? 0;\n }\n\n return bestBoundaryMessageTokens;\n}\n","import type { MastraDBMessage, MessageList } from '@mastra/core/agent';\nimport type { MessageHistory } from '@mastra/core/processors';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport xxhash from 'xxhash-wasm';\n\nimport { omDebug, omError } from '../debug';\nimport { stripThreadTags } from '../message-utils';\nimport { parseObservationGroups, wrapInObservationGroup } from '../observation-groups';\nimport type { ObserverRunner } from '../observer-runner';\nimport type { ReflectorRunner } from '../reflector-runner';\nimport { getMaxThreshold } from '../thresholds';\nimport type { TokenCounter } from '../token-counter';\nimport type {\n ObservationDebugEvent,\n ObservationMarkerConfig,\n ResolvedObservationConfig,\n ResolvedReflectionConfig,\n} from '../types';\n\nimport type { ObservationRunOpts, ObservationRunResult, ObserverOutput, ProcessedObservation } from './types';\n\n/** Module-level xxhash singleton — loaded once, shared across all strategy instances. */\nconst hasherPromise = xxhash();\n\n/**\n * Dependencies injected into observation strategies.\n * Built by the factory in index.ts from the ObservationalMemory instance.\n */\nexport interface StrategyDeps {\n storage: MemoryStorage;\n messageHistory: MessageHistory;\n tokenCounter: TokenCounter;\n observationConfig: ResolvedObservationConfig;\n reflectionConfig: ResolvedReflectionConfig;\n scope: 'thread' | 'resource';\n retrieval: boolean;\n observer: ObserverRunner;\n reflector: ReflectorRunner;\n observedMessageIds: Set<string>;\n obscureThreadIds: boolean;\n onIndexObservations?: (observation: {\n text: string;\n groupId: string;\n range: string;\n threadId: string;\n resourceId: string;\n observedAt?: Date;\n }) => Promise<void>;\n emitDebugEvent: (event: ObservationDebugEvent) => void;\n}\n\n/**\n * Abstract base class for observation strategies.\n *\n * Each strategy implements the phases of the observation lifecycle\n * (prepare → observe → process → persist) while the base class handles\n * the shared orchestration (lock guard, marker emission, reflection, error handling).\n */\nexport abstract class ObservationStrategy {\n protected readonly storage: MemoryStorage;\n protected readonly messageHistory: MessageHistory;\n protected readonly tokenCounter: TokenCounter;\n protected readonly observationConfig: ResolvedObservationConfig;\n protected readonly reflectionConfig: ResolvedReflectionConfig;\n protected readonly scope: 'thread' | 'resource';\n protected readonly retrieval: boolean;\n\n /** Select the right strategy based on scope and mode. Wired up by index.ts. */\n static create: (om: unknown, opts: ObservationRunOpts) => ObservationStrategy;\n\n constructor(\n protected readonly deps: StrategyDeps,\n protected readonly opts: ObservationRunOpts,\n ) {\n this.storage = deps.storage;\n this.messageHistory = deps.messageHistory;\n this.tokenCounter = deps.tokenCounter;\n this.observationConfig = deps.observationConfig;\n this.reflectionConfig = deps.reflectionConfig;\n this.scope = deps.scope;\n this.retrieval = deps.retrieval;\n }\n\n /**\n * Run the full observation lifecycle.\n * @returns Result with `observed` flag and optional `usage` from the observer LLM call.\n * @throws On sync/resource-scoped observer failure after failed markers (same as pre–Option-A contract).\n */\n async run(): Promise<ObservationRunResult> {\n const { record, threadId, abortSignal, writer, reflectionHooks, requestContext } = this.opts;\n const cycleId = this.generateCycleId();\n\n try {\n if (this.needsLock) {\n const fresh = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n if (fresh?.lastObservedAt && record.lastObservedAt && fresh.lastObservedAt > record.lastObservedAt) {\n return { observed: false };\n }\n }\n\n const { messages, existingObservations } = await this.prepare();\n await this.emitStartMarkers(cycleId);\n const output = await this.observe(existingObservations, messages);\n const processed = await this.process(output, existingObservations);\n await this.persist(processed);\n await this.emitEndMarkers(cycleId, processed);\n\n if (this.needsReflection) {\n await this.deps.reflector.maybeReflect({\n record: { ...record, activeObservations: processed.observations },\n observationTokens: processed.observationTokens,\n threadId,\n writer,\n abortSignal,\n reflectionHooks,\n requestContext,\n observabilityContext: this.opts.observabilityContext,\n });\n }\n\n return { observed: true, usage: output.usage };\n } catch (error) {\n await this.emitFailedMarkers(cycleId, error);\n\n if (!this.rethrowOnFailure) {\n const failedMarkerForStorage = {\n type: 'data-om-observation-failed',\n data: {\n cycleId,\n operationType: 'observation',\n startedAt: new Date().toISOString(),\n error: error instanceof Error ? error.message : String(error),\n recordId: record.id,\n threadId,\n },\n };\n await this.persistMarkerToStorage(failedMarkerForStorage, threadId, this.opts.resourceId).catch(() => {});\n if (abortSignal?.aborted) throw error;\n omError('[OM] Observation failed', error);\n return { observed: false };\n }\n\n // Sync + resource-scoped: same contract as pre-#14453 — rethrow after failed markers.\n omError('[OM] Observation failed', error);\n throw error;\n }\n }\n\n // ── Shared helpers ──────────────────────────────────────────\n\n protected generateCycleId(): string {\n return crypto.randomUUID();\n }\n\n protected async streamMarker(marker: { type: string; data: unknown }): Promise<void> {\n if (this.opts.writer) {\n await this.opts.writer.custom(marker).catch(() => {});\n }\n }\n\n protected getObservationMarkerConfig(): ObservationMarkerConfig {\n return {\n messageTokens: getMaxThreshold(this.observationConfig.messageTokens),\n observationTokens: getMaxThreshold(this.reflectionConfig.observationTokens),\n scope: this.scope,\n };\n }\n\n protected getMaxMessageTimestamp(messages: MastraDBMessage[]): Date {\n let maxTime = 0;\n for (const msg of messages) {\n if (msg.createdAt) {\n const msgTime = new Date(msg.createdAt).getTime();\n if (msgTime > maxTime) {\n maxTime = msgTime;\n }\n }\n }\n return maxTime > 0 ? new Date(maxTime) : new Date();\n }\n\n // ── Observation formatting ──────────────────────────────────\n\n /**\n * Wrap observations in a thread attribution tag.\n * In resource scope, thread IDs can be obscured via xxhash.\n */\n protected async wrapWithThreadTag(threadId: string, observations: string, messageRange?: string): Promise<string> {\n const cleanObservations = stripThreadTags(observations);\n const groupedObservations =\n this.retrieval && messageRange ? wrapInObservationGroup(cleanObservations, messageRange) : cleanObservations;\n let displayId = threadId;\n if (this.deps.obscureThreadIds) {\n const hasher = await hasherPromise;\n displayId = hasher.h32ToString(threadId);\n }\n return `<thread id=\"${displayId}\">\\n${groupedObservations}\\n</thread>`;\n }\n\n /**\n * Create a message boundary delimiter with an ISO 8601 date.\n * Used to separate observation chunks for cache stability.\n */\n protected static createMessageBoundary(date: Date): string {\n return `\\n\\n--- message boundary (${date.toISOString()}) ---\\n\\n`;\n }\n\n /**\n * Wrap raw observations — in resource scope, wraps with thread tag and merges;\n * in thread scope, simply appends with a message boundary delimiter.\n */\n protected wrapObservations(\n rawObservations: string,\n existingObservations: string,\n threadId: string,\n lastObservedAt?: Date,\n messageRange?: string,\n ): Promise<string> | string {\n if (this.scope === 'resource') {\n return (async () => {\n const threadSection = await this.wrapWithThreadTag(threadId, rawObservations, messageRange);\n return this.replaceOrAppendThreadSection(existingObservations, threadId, threadSection, lastObservedAt);\n })();\n }\n const grouped =\n this.retrieval && messageRange ? wrapInObservationGroup(rawObservations, messageRange) : rawObservations;\n if (!existingObservations) return grouped;\n const boundary = lastObservedAt ? ObservationStrategy.createMessageBoundary(lastObservedAt) : '\\n\\n';\n return `${existingObservations}${boundary}${grouped}`;\n }\n\n protected replaceOrAppendThreadSection(\n existingObservations: string,\n _threadId: string,\n newThreadSection: string,\n lastObservedAt?: Date,\n ): string {\n if (!existingObservations) {\n return newThreadSection;\n }\n\n const threadIdMatch = newThreadSection.match(/<thread id=\"([^\"]+)\">/);\n const dateMatch = newThreadSection.match(/Date:\\s*([A-Za-z]+\\s+\\d+,\\s+\\d+)/);\n\n if (!threadIdMatch || !dateMatch) {\n const boundary = lastObservedAt ? ObservationStrategy.createMessageBoundary(lastObservedAt) : '\\n\\n';\n return `${existingObservations}${boundary}${newThreadSection}`;\n }\n\n const newThreadId = threadIdMatch[1]!;\n const newDate = dateMatch[1]!;\n\n const threadOpen = `<thread id=\"${newThreadId}\">`;\n const threadClose = '</thread>';\n const startIdx = existingObservations.indexOf(threadOpen);\n let existingSection: string | null = null;\n let existingSectionStart = -1;\n let existingSectionEnd = -1;\n\n if (startIdx !== -1) {\n const closeIdx = existingObservations.indexOf(threadClose, startIdx);\n if (closeIdx !== -1) {\n existingSectionEnd = closeIdx + threadClose.length;\n existingSectionStart = startIdx;\n const section = existingObservations.slice(startIdx, existingSectionEnd);\n if (section.includes(`Date: ${newDate}`) || section.includes(`Date:${newDate}`)) {\n existingSection = section;\n }\n }\n }\n\n if (existingSection) {\n const dateLineEnd = newThreadSection.indexOf('\\n', newThreadSection.indexOf('Date:'));\n const newCloseIdx = newThreadSection.lastIndexOf(threadClose);\n if (dateLineEnd !== -1 && newCloseIdx !== -1) {\n const newObsContent = newThreadSection.slice(dateLineEnd + 1, newCloseIdx).trim();\n if (newObsContent) {\n const withoutClose = existingSection.slice(0, existingSection.length - threadClose.length).trimEnd();\n const merged = `${withoutClose}\\n${newObsContent}\\n${threadClose}`;\n return (\n existingObservations.slice(0, existingSectionStart) +\n merged +\n existingObservations.slice(existingSectionEnd)\n );\n }\n }\n }\n\n const boundary = lastObservedAt ? ObservationStrategy.createMessageBoundary(lastObservedAt) : '\\n\\n';\n return `${existingObservations}${boundary}${newThreadSection}`;\n }\n\n protected async indexObservationGroups(\n observations: string,\n threadId: string,\n resourceId?: string,\n observedAt?: Date,\n ): Promise<void> {\n if (!resourceId || !this.deps.onIndexObservations) {\n return;\n }\n\n const groups = parseObservationGroups(observations);\n if (groups.length === 0) {\n return;\n }\n\n await Promise.all(\n groups.map(group =>\n this.deps.onIndexObservations!({\n text: group.content,\n groupId: group.id,\n range: group.range,\n threadId,\n resourceId,\n observedAt,\n }),\n ),\n );\n }\n\n // ── Marker persistence ──────────────────────────────────────\n\n /**\n * Persist a marker to the last assistant message in storage.\n * Fetches messages directly from the DB so it works even when\n * no MessageList is available (e.g. async buffering ops).\n */\n protected async persistMarkerToStorage(\n marker: { type: string; data: unknown },\n threadId: string,\n resourceId?: string,\n ): Promise<void> {\n try {\n const result = await this.storage.listMessages({\n threadId,\n perPage: 20,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n const messages = result?.messages ?? [];\n for (const msg of messages) {\n if (msg?.role === 'assistant' && msg.content?.parts && Array.isArray(msg.content.parts)) {\n const markerData = marker.data as { cycleId?: string } | undefined;\n const alreadyPresent =\n markerData?.cycleId &&\n msg.content.parts.some((p: any) => p?.type === marker.type && p?.data?.cycleId === markerData.cycleId);\n if (!alreadyPresent) {\n msg.content.parts.push(marker as any);\n }\n await this.messageHistory.persistMessages({\n messages: [msg],\n threadId,\n resourceId,\n });\n return;\n }\n }\n } catch (e) {\n omDebug(`[OM:persistMarkerToStorage] failed to save marker to DB: ${e}`);\n }\n }\n\n /**\n * Persist a marker part on the last assistant message in a MessageList\n * AND save the updated message to the DB.\n */\n protected async persistMarkerToMessage(\n marker: { type: string; data: unknown },\n messageList: MessageList | undefined,\n threadId: string,\n resourceId?: string,\n ): Promise<void> {\n if (!messageList) return;\n const allMsgs = messageList.get.all.db();\n for (let i = allMsgs.length - 1; i >= 0; i--) {\n const msg = allMsgs[i];\n if (msg?.role === 'assistant' && msg.content?.parts && Array.isArray(msg.content.parts)) {\n const markerData = marker.data as { cycleId?: string } | undefined;\n const alreadyPresent =\n markerData?.cycleId &&\n msg.content.parts.some((p: any) => p?.type === marker.type && p?.data?.cycleId === markerData.cycleId);\n if (!alreadyPresent) {\n msg.content.parts.push(marker as any);\n }\n try {\n await this.messageHistory.persistMessages({\n messages: [msg],\n threadId,\n resourceId,\n });\n } catch (e) {\n omDebug(`[OM:persistMarker] failed to save marker to DB: ${e}`);\n }\n return;\n }\n }\n }\n\n // ── Abstract phase methods ──────────────────────────────────\n\n abstract get needsLock(): boolean;\n abstract get needsReflection(): boolean;\n abstract get rethrowOnFailure(): boolean;\n abstract prepare(): Promise<{ messages: MastraDBMessage[]; existingObservations: string }>;\n abstract observe(existingObservations: string, messages: MastraDBMessage[]): Promise<ObserverOutput>;\n abstract process(output: ObserverOutput, existingObservations: string): Promise<ProcessedObservation>;\n abstract persist(processed: ProcessedObservation): Promise<void>;\n abstract emitStartMarkers(cycleId: string): Promise<void>;\n abstract emitEndMarkers(cycleId: string, processed: ProcessedObservation): Promise<void>;\n abstract emitFailedMarkers(cycleId: string, error: unknown): Promise<void>;\n}\n","import type { MastraDBMessage } from '@mastra/core/agent';\nimport { getThreadOMMetadata, setThreadOMMetadata } from '@mastra/core/memory';\n\nimport { omDebug } from '../debug';\nimport {\n createObservationEndMarker,\n createObservationFailedMarker,\n createObservationStartMarker,\n createThreadUpdateMarker,\n} from '../markers';\nimport { getLastObservedMessageCursor } from '../message-utils';\n\nimport { buildMessageRange } from '../observational-memory';\nimport { ObservationStrategy } from './base';\nimport type { StrategyDeps } from './base';\nimport type { ObservationRunOpts, ObserverOutput, ProcessedObservation } from './types';\n\nexport class SyncObservationStrategy extends ObservationStrategy {\n private readonly startedAt = new Date().toISOString();\n private readonly lastMessage: MastraDBMessage | undefined;\n private cycleId?: string;\n private tokensToObserve = 0;\n private observerResult!: ObserverOutput;\n\n constructor(deps: StrategyDeps, opts: ObservationRunOpts) {\n super(deps, opts);\n this.lastMessage = opts.messages[opts.messages.length - 1];\n }\n\n get needsLock() {\n return true;\n }\n get needsReflection() {\n return true;\n }\n get rethrowOnFailure() {\n return true;\n }\n\n async prepare() {\n const { record, threadId, messages } = this.opts;\n\n this.deps.emitDebugEvent({\n type: 'observation_triggered',\n timestamp: new Date(),\n threadId,\n resourceId: record.resourceId ?? '',\n previousObservations: record.activeObservations,\n messages: messages.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n });\n\n const bufferActivation = this.observationConfig.bufferActivation;\n if (bufferActivation && bufferActivation < 1 && messages.length >= 1) {\n const newestMsg = messages[messages.length - 1];\n if (newestMsg?.content?.parts?.length) {\n // Set message-level sealed flag (same pattern as OM.sealMessagesForBuffering on main)\n if (!newestMsg.content.metadata) {\n newestMsg.content.metadata = {};\n }\n const metadata = newestMsg.content.metadata as { mastra?: { sealed?: boolean } };\n if (!metadata.mastra) {\n metadata.mastra = {};\n }\n metadata.mastra.sealed = true;\n omDebug(\n `[OM:sync-obs] sealed newest message (${newestMsg.role}, ${newestMsg.content.parts.length} parts) for ratio-aware observation`,\n );\n }\n }\n\n this.tokensToObserve = await this.tokenCounter.countMessagesAsync(messages);\n\n const freshRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n const existingObservations = freshRecord?.activeObservations ?? record.activeObservations ?? '';\n return { messages, existingObservations };\n }\n\n async emitStartMarkers(cycleId: string) {\n this.cycleId = cycleId;\n if (this.lastMessage?.id) {\n const startMarker = createObservationStartMarker({\n cycleId,\n operationType: 'observation',\n tokensToObserve: this.tokensToObserve,\n recordId: this.opts.record.id,\n threadId: this.opts.threadId,\n threadIds: [this.opts.threadId],\n config: this.getObservationMarkerConfig(),\n });\n await this.streamMarker(startMarker);\n }\n }\n\n async observe(existingObservations: string, messages: MastraDBMessage[]) {\n // Fetch prior thread metadata for observer prompt continuity\n const thread = await this.storage.getThreadById({ threadId: this.opts.threadId });\n const omMeta = thread ? getThreadOMMetadata(thread.metadata) : undefined;\n\n const result = await this.deps.observer.call(existingObservations, messages, this.opts.abortSignal, {\n requestContext: this.opts.requestContext,\n observabilityContext: this.opts.observabilityContext,\n priorCurrentTask: omMeta?.currentTask,\n priorSuggestedResponse: omMeta?.suggestedResponse,\n priorThreadTitle: omMeta?.threadTitle,\n });\n this.observerResult = result;\n return result;\n }\n\n async process(output: ObserverOutput, existingObservations: string): Promise<ProcessedObservation> {\n const { record, threadId, messages } = this.opts;\n\n const lastObservedAt = this.getMaxMessageTimestamp(messages);\n const messageRange = this.retrieval ? buildMessageRange(messages) : undefined;\n const newObservations = await this.wrapObservations(\n output.observations,\n existingObservations,\n threadId,\n lastObservedAt,\n messageRange,\n );\n const observationTokens = this.tokenCounter.countObservations(newObservations);\n const cycleObservationTokens = this.tokenCounter.countObservations(output.observations);\n\n const newMessageIds = messages.map(m => m.id);\n const existingIds = record.observedMessageIds ?? [];\n const observedMessageIds = [...new Set([...(Array.isArray(existingIds) ? existingIds : []), ...newMessageIds])];\n\n this.deps.emitDebugEvent({\n type: 'observation_complete',\n timestamp: new Date(),\n threadId,\n resourceId: record.resourceId ?? '',\n observations: newObservations,\n rawObserverOutput: output.observations,\n previousObservations: record.activeObservations,\n messages: messages.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n usage: output.usage,\n });\n\n return {\n observations: newObservations,\n observationTokens,\n cycleObservationTokens,\n observedMessageIds,\n lastObservedAt,\n suggestedContinuation: output.suggestedContinuation,\n currentTask: output.currentTask,\n threadTitle: output.threadTitle,\n };\n }\n\n async persist(processed: ProcessedObservation) {\n const { record, threadId, resourceId, messages } = this.opts;\n\n const thread = await this.storage.getThreadById({ threadId });\n let threadUpdateMarker: ReturnType<typeof createThreadUpdateMarker> | undefined;\n\n if (thread) {\n const oldTitle = thread.title?.trim();\n const newTitle = processed.threadTitle?.trim();\n const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;\n const newMetadata = setThreadOMMetadata(thread.metadata, {\n suggestedResponse: processed.suggestedContinuation,\n currentTask: processed.currentTask,\n threadTitle: processed.threadTitle,\n lastObservedMessageCursor: getLastObservedMessageCursor(messages),\n });\n await this.storage.updateThread({\n id: threadId,\n title: shouldUpdateThreadTitle ? newTitle : (thread.title ?? ''),\n metadata: newMetadata,\n });\n\n if (shouldUpdateThreadTitle) {\n threadUpdateMarker = createThreadUpdateMarker({\n cycleId: this.cycleId ?? crypto.randomUUID(),\n threadId,\n oldTitle,\n newTitle,\n });\n }\n }\n\n if (threadUpdateMarker) {\n await this.streamMarker(threadUpdateMarker);\n }\n\n await this.storage.updateActiveObservations({\n id: record.id,\n observations: processed.observations,\n tokenCount: processed.observationTokens,\n lastObservedAt: processed.lastObservedAt,\n observedMessageIds: processed.observedMessageIds,\n });\n\n await this.indexObservationGroups(processed.observations, threadId, resourceId, processed.lastObservedAt);\n }\n\n async emitEndMarkers(cycleId: string, processed: ProcessedObservation) {\n const actualTokensObserved = await this.tokenCounter.countMessagesAsync(this.opts.messages);\n if (this.lastMessage?.id) {\n const endMarker = createObservationEndMarker({\n cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensObserved: actualTokensObserved,\n observationTokens: processed.cycleObservationTokens,\n observations: this.observerResult.observations,\n currentTask: this.observerResult.currentTask,\n suggestedResponse: this.observerResult.suggestedContinuation,\n recordId: this.opts.record.id,\n threadId: this.opts.threadId,\n });\n await this.streamMarker(endMarker);\n }\n }\n\n async emitFailedMarkers(cycleId: string, error: unknown) {\n if (this.lastMessage?.id) {\n const failedMarker = createObservationFailedMarker({\n cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensAttempted: this.tokensToObserve,\n error: error instanceof Error ? error.message : String(error),\n recordId: this.opts.record.id,\n threadId: this.opts.threadId,\n });\n await this.streamMarker(failedMarker);\n }\n }\n}\n","import type { MastraDBMessage } from '@mastra/core/agent';\nimport { setThreadOMMetadata } from '@mastra/core/memory';\n\nimport { omDebug } from '../debug';\nimport { createBufferingEndMarker, createBufferingFailedMarker, createThreadUpdateMarker } from '../markers';\nimport { getBufferedChunks, combineObservationsForBuffering } from '../message-utils';\n\nimport { wrapInObservationGroup } from '../observation-groups';\nimport { buildMessageRange } from '../observational-memory';\nimport { ObservationStrategy } from './base';\nimport type { StrategyDeps } from './base';\nimport type { ObservationRunOpts, ObserverOutput, ProcessedObservation } from './types';\n\nexport class AsyncBufferObservationStrategy extends ObservationStrategy {\n private readonly startedAt: string;\n private readonly cycleId: string;\n\n constructor(deps: StrategyDeps, opts: ObservationRunOpts) {\n super(deps, opts);\n this.cycleId = opts.cycleId!;\n this.startedAt = opts.startedAt ?? new Date().toISOString();\n }\n\n get needsLock() {\n return false;\n }\n get needsReflection() {\n return false;\n }\n get rethrowOnFailure() {\n return false;\n }\n\n protected override generateCycleId(): string {\n return this.cycleId;\n }\n\n async prepare() {\n const { record, messages } = this.opts;\n const bufferedChunks = getBufferedChunks(record);\n const bufferedChunksText = bufferedChunks.map(c => c.observations).join('\\n\\n');\n const existingObservations = combineObservationsForBuffering(record.activeObservations, bufferedChunksText) ?? '';\n return { messages, existingObservations };\n }\n\n async emitStartMarkers(_cycleId: string) {\n // START marker already emitted by the launch chain before strategy runs\n }\n\n async observe(existingObservations: string, messages: MastraDBMessage[]) {\n return this.deps.observer.call(existingObservations, messages, undefined, {\n skipContinuationHints: true,\n requestContext: this.opts.requestContext,\n observabilityContext: this.opts.observabilityContext,\n });\n }\n\n async process(output: ObserverOutput, _existingObservations: string): Promise<ProcessedObservation> {\n const { threadId, messages } = this.opts;\n\n if (!output.observations) {\n omDebug(`[OM:asyncBuffer] empty observations returned, skipping buffer storage`);\n return {\n observations: '',\n observationTokens: 0,\n cycleObservationTokens: 0,\n observedMessageIds: [],\n lastObservedAt: new Date(),\n };\n }\n\n const messageRange = this.retrieval ? buildMessageRange(messages) : undefined;\n let newObservations: string;\n if (this.scope === 'resource') {\n newObservations = await this.wrapWithThreadTag(threadId, output.observations, messageRange);\n } else {\n newObservations =\n this.retrieval && messageRange\n ? wrapInObservationGroup(output.observations, messageRange)\n : output.observations;\n }\n\n const observationTokens = this.tokenCounter.countObservations(newObservations);\n const messageIds = messages.map(m => m.id);\n const maxTs = this.getMaxMessageTimestamp(messages);\n const lastObservedAt = new Date(maxTs.getTime() + 1);\n\n return {\n observations: newObservations,\n observationTokens,\n cycleObservationTokens: observationTokens,\n observedMessageIds: messageIds,\n lastObservedAt,\n suggestedContinuation: output.suggestedContinuation,\n currentTask: output.currentTask,\n threadTitle: output.threadTitle,\n };\n }\n\n async persist(processed: ProcessedObservation) {\n if (!processed.observations) return;\n\n const { record, threadId, resourceId, messages } = this.opts;\n const messageTokens = await this.tokenCounter.countMessagesAsync(messages);\n await this.storage.updateBufferedObservations({\n id: record.id,\n chunk: {\n cycleId: this.cycleId,\n observations: processed.observations,\n tokenCount: processed.observationTokens,\n messageIds: processed.observedMessageIds,\n messageTokens,\n lastObservedAt: processed.lastObservedAt,\n suggestedContinuation: processed.suggestedContinuation,\n currentTask: processed.currentTask,\n threadTitle: processed.threadTitle,\n },\n lastBufferedAtTime: processed.lastObservedAt,\n });\n\n await this.indexObservationGroups(processed.observations, threadId, resourceId, processed.lastObservedAt);\n\n // Update thread title immediately — don't wait for activation.\n const newTitle = processed.threadTitle?.trim();\n if (newTitle && newTitle.length >= 3) {\n const thread = await this.storage.getThreadById({ threadId });\n if (thread) {\n const oldTitle = thread.title?.trim();\n if (newTitle !== oldTitle) {\n const newMetadata = setThreadOMMetadata(thread.metadata, {\n threadTitle: processed.threadTitle,\n });\n await this.storage.updateThread({\n id: threadId,\n title: newTitle,\n metadata: newMetadata,\n });\n\n const marker = createThreadUpdateMarker({\n cycleId: this.cycleId,\n threadId,\n oldTitle,\n newTitle,\n });\n await this.streamMarker(marker);\n }\n }\n }\n }\n\n async emitEndMarkers(_cycleId: string, processed: ProcessedObservation) {\n if (!processed.observations || !this.opts.writer) return;\n\n const { record, threadId, messages } = this.opts;\n const tokensBuffered = await this.tokenCounter.countMessagesAsync(messages);\n const updatedRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n const updatedChunks = getBufferedChunks(updatedRecord);\n const totalBufferedTokens =\n updatedChunks.reduce((sum, c) => sum + (c.tokenCount ?? 0), 0) || processed.observationTokens;\n\n const endMarker = createBufferingEndMarker({\n cycleId: this.cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensBuffered,\n bufferedTokens: totalBufferedTokens,\n recordId: record.id,\n threadId,\n observations: processed.observations,\n });\n void this.opts.writer.custom(endMarker).catch(() => {});\n await this.persistMarkerToStorage(endMarker, threadId, record.resourceId ?? undefined);\n }\n\n async emitFailedMarkers(_cycleId: string, error: unknown) {\n if (!this.opts.writer) return;\n\n const { record, threadId, messages } = this.opts;\n const tokensAttempted = await this.tokenCounter.countMessagesAsync(messages);\n const failedMarker = createBufferingFailedMarker({\n cycleId: this.cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensAttempted,\n error: error instanceof Error ? error.message : String(error),\n recordId: record.id,\n threadId,\n });\n void this.opts.writer.custom(failedMarker).catch(() => {});\n await this.persistMarkerToStorage(failedMarker, threadId, record.resourceId ?? undefined);\n }\n}\n","import type { MastraDBMessage } from '@mastra/core/agent';\nimport { getThreadOMMetadata, setThreadOMMetadata } from '@mastra/core/memory';\n\nimport { OBSERVATIONAL_MEMORY_DEFAULTS } from '../constants';\nimport {\n createObservationEndMarker,\n createObservationFailedMarker,\n createObservationStartMarker,\n createThreadUpdateMarker,\n} from '../markers';\nimport { getLastObservedMessageCursor, sortThreadsByOldestMessage } from '../message-utils';\nimport { buildMessageRange } from '../observational-memory';\nimport { getMaxThreshold } from '../thresholds';\n\nimport { ObservationStrategy } from './base';\nimport type { StrategyDeps } from './base';\nimport type { ObservationRunOpts, ObserverOutput, ProcessedObservation } from './types';\n\nexport class ResourceScopedObservationStrategy extends ObservationStrategy {\n private readonly startedAt = new Date().toISOString();\n private cycleId?: string;\n private readonly resourceId: string;\n\n private threadsWithMessages = new Map<string, MastraDBMessage[]>();\n private threadTokensToObserve = new Map<string, number>();\n private threadTokenCounts = new Map<string, number>();\n private threadOrder: string[] = [];\n private messagesByThread = new Map<string, MastraDBMessage[]>();\n private multiThreadResults = new Map<\n string,\n { observations: string; currentTask?: string; suggestedContinuation?: string; threadTitle?: string }\n >();\n private totalBatchUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n private observationResults: Array<{\n threadId: string;\n threadMessages: MastraDBMessage[];\n result: { observations: string; currentTask?: string; suggestedContinuation?: string; threadTitle?: string };\n }> = [];\n private priorMetadataByThread = new Map<\n string,\n { currentTask?: string; suggestedResponse?: string; threadTitle?: string }\n >();\n\n constructor(deps: StrategyDeps, opts: ObservationRunOpts) {\n super(deps, opts);\n this.resourceId = opts.resourceId!;\n }\n\n get needsLock() {\n return true;\n }\n get needsReflection() {\n return true;\n }\n get rethrowOnFailure() {\n return true;\n }\n\n async prepare() {\n const { record, threadId: currentThreadId, messages: currentThreadMessages } = this.opts;\n\n const { threads: allThreads } = await this.storage.listThreads({ filter: { resourceId: this.resourceId } });\n const threadMetadataMap = new Map<string, { lastObservedAt?: string }>();\n\n for (const thread of allThreads) {\n const omMetadata = getThreadOMMetadata(thread.metadata);\n threadMetadataMap.set(thread.id, { lastObservedAt: omMetadata?.lastObservedAt });\n if (omMetadata?.currentTask || omMetadata?.suggestedResponse || omMetadata?.threadTitle) {\n this.priorMetadataByThread.set(thread.id, {\n currentTask: omMetadata.currentTask,\n suggestedResponse: omMetadata.suggestedResponse,\n threadTitle: omMetadata.threadTitle,\n });\n }\n }\n\n for (const thread of allThreads) {\n const threadLastObservedAt = threadMetadataMap.get(thread.id)?.lastObservedAt;\n const startDate = threadLastObservedAt ? new Date(new Date(threadLastObservedAt).getTime() + 1) : undefined;\n\n const result = await this.storage.listMessages({\n threadId: thread.id,\n perPage: false,\n orderBy: { field: 'createdAt', direction: 'ASC' },\n filter: startDate ? { dateRange: { start: startDate } } : undefined,\n });\n\n if (result.messages.length > 0) {\n this.messagesByThread.set(thread.id, result.messages);\n }\n }\n\n if (currentThreadMessages.length > 0) {\n const existingCurrentThreadMsgs = this.messagesByThread.get(currentThreadId) ?? [];\n const messageMap = new Map<string, MastraDBMessage>();\n\n for (const msg of existingCurrentThreadMsgs) {\n if (msg.id) messageMap.set(msg.id, msg);\n }\n for (const msg of currentThreadMessages) {\n if (msg.id) messageMap.set(msg.id, msg);\n }\n\n this.messagesByThread.set(currentThreadId, Array.from(messageMap.values()));\n }\n\n for (const [tid, msgs] of this.messagesByThread) {\n const filtered = msgs.filter(m => !this.deps.observedMessageIds.has(m.id));\n if (filtered.length > 0) {\n this.messagesByThread.set(tid, filtered);\n } else {\n this.messagesByThread.delete(tid);\n }\n }\n\n let totalMessages = 0;\n for (const msgs of this.messagesByThread.values()) {\n totalMessages += msgs.length;\n }\n\n if (totalMessages === 0) {\n return { messages: [] as MastraDBMessage[], existingObservations: '' };\n }\n\n const threshold = getMaxThreshold(this.observationConfig.messageTokens);\n\n for (const [threadId, msgs] of this.messagesByThread) {\n const tokens = await this.tokenCounter.countMessagesAsync(msgs);\n this.threadTokenCounts.set(threadId, tokens);\n }\n\n const threadsBySize = Array.from(this.messagesByThread.keys()).sort((a, b) => {\n return (this.threadTokenCounts.get(b) ?? 0) - (this.threadTokenCounts.get(a) ?? 0);\n });\n\n let accumulatedTokens = 0;\n const threadsToObserve: string[] = [];\n\n for (const threadId of threadsBySize) {\n const threadTokens = this.threadTokenCounts.get(threadId) ?? 0;\n if (accumulatedTokens >= threshold) break;\n threadsToObserve.push(threadId);\n accumulatedTokens += threadTokens;\n }\n\n if (threadsToObserve.length === 0) {\n return { messages: [] as MastraDBMessage[], existingObservations: '' };\n }\n\n this.threadOrder = sortThreadsByOldestMessage(\n new Map(threadsToObserve.map(tid => [tid, this.messagesByThread.get(tid) ?? []])),\n );\n\n for (const threadId of this.threadOrder) {\n const msgs = this.messagesByThread.get(threadId);\n if (msgs && msgs.length > 0) {\n this.threadsWithMessages.set(threadId, msgs);\n }\n }\n\n this.deps.emitDebugEvent({\n type: 'observation_triggered',\n timestamp: new Date(),\n threadId: this.threadOrder.join(','),\n resourceId: this.resourceId,\n previousObservations: record.activeObservations,\n messages: Array.from(this.threadsWithMessages.values())\n .flat()\n .map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n });\n\n const freshRecord = await this.storage.getObservationalMemory(null, this.resourceId);\n const existingObservations = freshRecord?.activeObservations ?? record.activeObservations ?? '';\n\n const allMessages = Array.from(this.threadsWithMessages.values()).flat();\n return { messages: allMessages, existingObservations };\n }\n\n async emitStartMarkers(cycleId: string) {\n this.cycleId = cycleId;\n const allThreadIds = Array.from(this.threadsWithMessages.keys());\n\n for (const [threadId, msgs] of this.threadsWithMessages) {\n const lastMessage = msgs[msgs.length - 1];\n const tokensToObserve = await this.tokenCounter.countMessagesAsync(msgs);\n this.threadTokensToObserve.set(threadId, tokensToObserve);\n\n if (lastMessage?.id) {\n const startMarker = createObservationStartMarker({\n cycleId,\n operationType: 'observation',\n tokensToObserve,\n recordId: this.opts.record.id,\n threadId,\n threadIds: allThreadIds,\n config: this.getObservationMarkerConfig(),\n });\n await this.streamMarker(startMarker);\n }\n }\n }\n\n async observe(_existingObservations: string, _messages: MastraDBMessage[]) {\n const maxTokensPerBatch =\n this.observationConfig.maxTokensPerBatch ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.maxTokensPerBatch;\n const orderedThreadIds = this.threadOrder.filter(tid => this.threadsWithMessages.has(tid));\n\n const batches: Array<{ threadIds: string[]; threadMap: Map<string, MastraDBMessage[]> }> = [];\n let currentBatch: { threadIds: string[]; threadMap: Map<string, MastraDBMessage[]> } = {\n threadIds: [],\n threadMap: new Map(),\n };\n let currentBatchTokens = 0;\n\n for (const threadId of orderedThreadIds) {\n const msgs = this.threadsWithMessages.get(threadId)!;\n const threadTokens = this.threadTokenCounts.get(threadId) ?? 0;\n\n if (currentBatchTokens + threadTokens > maxTokensPerBatch && currentBatch.threadIds.length > 0) {\n batches.push(currentBatch);\n currentBatch = { threadIds: [], threadMap: new Map() };\n currentBatchTokens = 0;\n }\n\n currentBatch.threadIds.push(threadId);\n currentBatch.threadMap.set(threadId, msgs);\n currentBatchTokens += threadTokens;\n }\n\n if (currentBatch.threadIds.length > 0) {\n batches.push(currentBatch);\n }\n\n const batchResults = await Promise.all(\n batches.map(async batch => {\n return this.deps.observer.callMultiThread(\n _existingObservations,\n batch.threadMap,\n batch.threadIds,\n this.opts.abortSignal,\n this.opts.requestContext,\n this.priorMetadataByThread,\n this.opts.observabilityContext,\n );\n }),\n );\n\n for (const batchResult of batchResults) {\n for (const [threadId, result] of batchResult.results) {\n this.multiThreadResults.set(threadId, result);\n }\n if (batchResult.usage) {\n this.totalBatchUsage.inputTokens += batchResult.usage.inputTokens ?? 0;\n this.totalBatchUsage.outputTokens += batchResult.usage.outputTokens ?? 0;\n this.totalBatchUsage.totalTokens += batchResult.usage.totalTokens ?? 0;\n }\n }\n\n return {\n observations: '',\n usage: this.totalBatchUsage.totalTokens > 0 ? this.totalBatchUsage : undefined,\n };\n }\n\n async process(_output: ObserverOutput, existingObservations: string): Promise<ProcessedObservation> {\n const { record } = this.opts;\n\n this.observationResults = [];\n for (const threadId of this.threadOrder) {\n const threadMessages = this.messagesByThread.get(threadId) ?? [];\n if (threadMessages.length === 0) continue;\n\n const result = this.multiThreadResults.get(threadId);\n if (!result) continue;\n\n this.observationResults.push({ threadId, threadMessages, result });\n }\n\n let currentObservations = existingObservations;\n let cycleObservationTokens = 0;\n const threadMetadataUpdates: ProcessedObservation['threadMetadataUpdates'] = [];\n\n for (const obsResult of this.observationResults) {\n const { threadId, threadMessages, result } = obsResult;\n\n cycleObservationTokens += this.tokenCounter.countObservations(result.observations);\n\n const messageRange = this.retrieval ? buildMessageRange(threadMessages) : undefined;\n const threadSection = await this.wrapWithThreadTag(threadId, result.observations, messageRange);\n const threadLastObservedAt = this.getMaxMessageTimestamp(threadMessages);\n currentObservations = this.replaceOrAppendThreadSection(\n currentObservations,\n threadId,\n threadSection,\n threadLastObservedAt,\n );\n threadMetadataUpdates!.push({\n threadId,\n lastObservedAt: threadLastObservedAt.toISOString(),\n suggestedResponse: result.suggestedContinuation,\n currentTask: result.currentTask,\n threadTitle: result.threadTitle,\n lastObservedMessageCursor: getLastObservedMessageCursor(threadMessages),\n });\n\n const isFirstThread = this.observationResults.indexOf(obsResult) === 0;\n this.deps.emitDebugEvent({\n type: 'observation_complete',\n timestamp: new Date(),\n threadId,\n resourceId: this.resourceId,\n observations: threadSection,\n rawObserverOutput: result.observations,\n previousObservations: record.activeObservations,\n messages: threadMessages.map(m => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n usage: isFirstThread && this.totalBatchUsage.totalTokens > 0 ? this.totalBatchUsage : undefined,\n });\n }\n\n const observedMessages = this.observationResults.flatMap(r => r.threadMessages);\n const lastObservedAt = this.getMaxMessageTimestamp(observedMessages);\n const newMessageIds = observedMessages.map(m => m.id);\n const existingIds = record.observedMessageIds ?? [];\n const observedMessageIds = [...new Set([...existingIds, ...newMessageIds])];\n const observationTokens = this.tokenCounter.countObservations(currentObservations);\n\n return {\n observations: currentObservations,\n observationTokens,\n cycleObservationTokens,\n observedMessageIds,\n lastObservedAt,\n threadMetadataUpdates,\n };\n }\n\n async persist(processed: ProcessedObservation) {\n const { record, resourceId } = this.opts;\n const threadUpdateMarkers: Array<ReturnType<typeof createThreadUpdateMarker>> = [];\n\n if (processed.threadMetadataUpdates) {\n for (const update of processed.threadMetadataUpdates) {\n const thread = await this.storage.getThreadById({ threadId: update.threadId });\n if (thread) {\n const oldTitle = thread.title?.trim();\n const newTitle = update.threadTitle?.trim();\n const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;\n const newMetadata = setThreadOMMetadata(thread.metadata, {\n lastObservedAt: update.lastObservedAt,\n suggestedResponse: update.suggestedResponse,\n currentTask: update.currentTask,\n threadTitle: update.threadTitle,\n lastObservedMessageCursor: update.lastObservedMessageCursor,\n });\n await this.storage.updateThread({\n id: update.threadId,\n title: shouldUpdateThreadTitle ? newTitle : (thread.title ?? ''),\n metadata: newMetadata,\n });\n\n if (shouldUpdateThreadTitle) {\n threadUpdateMarkers.push(\n createThreadUpdateMarker({\n cycleId: this.cycleId ?? crypto.randomUUID(),\n threadId: update.threadId,\n oldTitle,\n newTitle,\n }),\n );\n }\n }\n }\n }\n\n for (const marker of threadUpdateMarkers) {\n await this.streamMarker(marker);\n }\n\n await this.storage.updateActiveObservations({\n id: record.id,\n observations: processed.observations,\n tokenCount: processed.observationTokens,\n lastObservedAt: processed.lastObservedAt,\n observedMessageIds: processed.observedMessageIds,\n });\n\n if (resourceId) {\n await Promise.all(\n this.observationResults.map(({ threadId, threadMessages, result }) =>\n this.indexObservationGroups(\n result.observations,\n threadId,\n resourceId,\n this.getMaxMessageTimestamp(threadMessages),\n ),\n ),\n );\n }\n }\n\n async emitEndMarkers(cycleId: string, processed: ProcessedObservation) {\n for (const obsResult of this.observationResults) {\n const { threadId, threadMessages, result } = obsResult;\n const lastMessage = threadMessages[threadMessages.length - 1];\n if (lastMessage?.id) {\n const tokensObserved =\n this.threadTokensToObserve.get(threadId) ?? (await this.tokenCounter.countMessagesAsync(threadMessages));\n const endMarker = createObservationEndMarker({\n cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensObserved,\n observationTokens: processed.cycleObservationTokens,\n observations: result.observations,\n currentTask: result.currentTask,\n suggestedResponse: result.suggestedContinuation,\n recordId: this.opts.record.id,\n threadId,\n });\n await this.streamMarker(endMarker);\n }\n }\n }\n\n async emitFailedMarkers(cycleId: string, error: unknown) {\n for (const [threadId, msgs] of this.threadsWithMessages) {\n const lastMessage = msgs[msgs.length - 1];\n if (lastMessage?.id) {\n const tokensAttempted = this.threadTokensToObserve.get(threadId) ?? 0;\n const failedMarker = createObservationFailedMarker({\n cycleId,\n operationType: 'observation',\n startedAt: this.startedAt,\n tokensAttempted,\n error: error instanceof Error ? error.message : String(error),\n recordId: this.opts.record.id,\n threadId,\n });\n await this.streamMarker(failedMarker);\n }\n }\n }\n}\n","export { ObservationStrategy } from './base';\nexport type { StrategyDeps } from './base';\nexport type { ObservationRunOpts, ObserverOutput, ProcessedObservation } from './types';\n\n// Re-export concrete classes for direct access if needed\nexport { SyncObservationStrategy } from './sync';\nexport { AsyncBufferObservationStrategy } from './async-buffer';\nexport { ResourceScopedObservationStrategy } from './resource-scoped';\n\n// Wire up the static factory on the base class\nimport type { ObservationalMemory } from '../observational-memory';\nimport { AsyncBufferObservationStrategy } from './async-buffer';\nimport { ObservationStrategy } from './base';\nimport type { StrategyDeps } from './base';\nimport { ResourceScopedObservationStrategy } from './resource-scoped';\nimport { SyncObservationStrategy } from './sync';\nimport type { ObservationRunOpts } from './types';\n\nObservationStrategy.create = ((om: ObservationalMemory, opts: ObservationRunOpts): ObservationStrategy => {\n const deps: StrategyDeps = {\n storage: om.getStorage(),\n messageHistory: om.getMessageHistory(),\n tokenCounter: om.getTokenCounter(),\n observationConfig: om.getObservationConfig(),\n reflectionConfig: om.getReflectionConfig(),\n scope: om.scope,\n retrieval: om.retrieval,\n observer: om.observer,\n reflector: om.reflector,\n observedMessageIds: om.observedMessageIds,\n obscureThreadIds: om.getObscureThreadIds(),\n onIndexObservations: om.onIndexObservations,\n emitDebugEvent: e => om.emitDebugEvent(e),\n };\n\n if (opts.cycleId) return new AsyncBufferObservationStrategy(deps, opts);\n if (deps.scope === 'resource' && opts.resourceId) return new ResourceScopedObservationStrategy(deps, opts);\n return new SyncObservationStrategy(deps, opts);\n}) as (om: unknown, opts: ObservationRunOpts) => ObservationStrategy;\n","import { getThreadOMMetadata } from '@mastra/core/memory';\n\nimport { omDebug } from '../debug';\nimport { filterObservedMessages } from '../message-utils';\nimport { getLatestStepParts } from '../observational-memory';\nimport { resolveRetentionFloor } from '../thresholds';\n\nimport type { ObservationTurn } from './turn';\nimport type { StepContext } from './types';\n\n/**\n * Represents a single step in the agentic loop within an observation turn.\n *\n * Created via `turn.step(stepNumber)`. Call `prepare()` before the agent generates.\n * The previous step's output is finalized automatically when the next step is created\n * or when `turn.end()` is called.\n */\nexport class ObservationStep {\n private _prepared = false;\n private _context?: StepContext;\n\n constructor(\n private readonly turn: ObservationTurn,\n readonly stepNumber: number,\n ) {}\n\n /** Whether this step has been prepared. */\n get prepared() {\n return this._prepared;\n }\n\n /** Step context from prepare(). Throws if prepare() hasn't been called. */\n get context(): StepContext {\n if (!this._context) throw new Error('Step not prepared yet — call prepare() first');\n return this._context;\n }\n\n /**\n * Prepare this step for agent generation.\n *\n * For step 0: activates buffered chunks, checks reflection, builds system message, filters observed.\n * For step > 0: checks thresholds, triggers buffer/observe, saves previous messages,\n * builds system message, filters observed.\n */\n async prepare(): Promise<StepContext> {\n if (this._prepared) throw new Error(`Step ${this.stepNumber} already prepared`);\n\n const { threadId, resourceId, messageList } = this.turn;\n // Cast to any for internal access to private OM methods (Turn/Step are internal consumers)\n const om = this.turn.om;\n let activated = false;\n let observed = false;\n let buffered = false;\n let reflected = false;\n let didThresholdCleanup = false;\n let observerExchange: StepContext['observerExchange'];\n\n // ── Step 0: Activate buffered chunks ──────────────────────\n if (this.stepNumber === 0) {\n const step0Messages = messageList.get.all.db();\n const activation = await om.activate({\n threadId,\n resourceId,\n checkThreshold: true,\n messages: step0Messages,\n writer: this.turn.writer,\n messageList,\n });\n\n if (activation.activated) {\n activated = true;\n if (activation.activatedMessageIds?.length) {\n messageList.removeByIds(activation.activatedMessageIds);\n }\n await om.resetBufferingState({\n threadId,\n resourceId,\n recordId: activation.record.id,\n });\n await this.turn.refreshRecord();\n }\n\n // Check if reflection is needed (whether or not activation happened).\n // maybeReflect handles both sync (above full threshold) and async buffered\n // reflection (above bufferActivation point but below full threshold).\n const record = this.turn.record;\n const preReflectGeneration = record.generationCount;\n const obsTokens = record.observationTokenCount ?? 0;\n await om.reflector.maybeReflect({\n record,\n observationTokens: obsTokens,\n threadId,\n writer: this.turn.writer,\n requestContext: this.turn.requestContext,\n observabilityContext: this.turn.observabilityContext,\n });\n await this.turn.refreshRecord();\n if (this.turn.record.generationCount > preReflectGeneration) {\n reflected = true;\n }\n }\n\n // ── Check for incomplete tool calls ────────────────────────\n // Provider-executed tools (e.g. Anthropic web_search) may still be in state:'call'\n // while the agent loop continues. We must not observe/buffer until they complete.\n const allMsgsForToolCheck = messageList.get.all.db();\n const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];\n const latestStepParts = getLatestStepParts(lastMessage?.content?.parts ?? []);\n const hasIncompleteToolCalls = latestStepParts.some(\n part => part?.type === 'tool-invocation' && (part as any).toolInvocation?.state === 'call',\n );\n omDebug(\n `[OM:deferred-check] hasIncompleteToolCalls=${hasIncompleteToolCalls}, latestStepPartsCount=${latestStepParts.length}`,\n );\n\n // ── Check thresholds + buffer trigger (all steps) ──────────\n let statusSnapshot = await om.getStatus({\n threadId,\n resourceId,\n messages: messageList.get.all.db(),\n });\n\n // Trigger buffering if interval boundary crossed (fire-and-forget, all steps)\n if (statusSnapshot.shouldBuffer && !hasIncompleteToolCalls) {\n const allMessages = messageList.get.all.db();\n const unobservedMessages = om.getUnobservedMessages(allMessages, statusSnapshot.record);\n\n // Seal, rotate, and persist candidates SYNCHRONOUSLY before the fire-and-forget\n // buffer call. The beforeBuffer callback inside buffer() only runs deep in its\n // async chain (after multiple awaits). Meanwhile, the step > 0 save below drains\n // response messages synchronously. If sealing/rotation happens after that drain,\n // the sealed messages get re-added as memory (unsealed) and all new content keeps\n // appending to the same assistant message — producing the \"mega-message\" bug.\n const candidates = om.getUnobservedMessages(unobservedMessages, statusSnapshot.record, {\n excludeBuffered: true,\n });\n if (candidates.length > 0) {\n om.sealMessagesForBuffering(candidates);\n\n try {\n await this.turn.hooks?.onBufferChunkSealed?.();\n } catch (error) {\n omDebug(\n `[OM:buffer] onBufferChunkSealed hook failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (this.turn.memory) {\n await this.turn.memory.persistMessages(candidates);\n }\n\n // Once a buffered chunk has been sealed and persisted, it should no longer\n // remain in the live response/input buckets. Move the exact same messages\n // into memory so later step-save drains don't pull them back out and grow\n // them again under the old response id.\n messageList.removeByIds(candidates.map(msg => msg.id));\n for (const msg of candidates) {\n messageList.add(msg, 'memory');\n }\n }\n\n void om\n .buffer({\n threadId,\n resourceId,\n messages: unobservedMessages,\n pendingTokens: statusSnapshot.pendingTokens,\n record: statusSnapshot.record,\n writer: this.turn.writer,\n requestContext: this.turn.requestContext,\n observabilityContext: this.turn.observabilityContext,\n })\n .catch((err: Error) => {\n omDebug(`[OM:buffer] fire-and-forget buffer failed: ${err?.message}`);\n });\n buffered = true;\n }\n\n // ── Step > 0: Save messages + threshold observation ──────\n if (this.stepNumber > 0) {\n // Save messages from previous step\n const newInput = messageList.clear.input.db();\n const newOutput = messageList.clear.response.db();\n const messagesToSave = [...newInput, ...newOutput];\n if (messagesToSave.length > 0) {\n await om.persistMessages(messagesToSave, threadId, resourceId);\n for (const msg of messagesToSave) {\n messageList.add(msg, 'memory');\n }\n }\n\n // Threshold observation (step > 0 only, skip if tool calls pending)\n if (statusSnapshot.shouldObserve && !hasIncompleteToolCalls) {\n const preObsGeneration = this.turn.record.generationCount;\n const obsResult = await this.runThresholdObservation();\n observerExchange = obsResult.observerExchange;\n if (obsResult.succeeded) {\n observed = true;\n didThresholdCleanup = true;\n\n // Cleanup after observation\n const observedIds = obsResult.activatedMessageIds ?? obsResult.record.observedMessageIds ?? [];\n const minRemaining = resolveRetentionFloor(\n om.getObservationConfig().bufferActivation ?? 1,\n statusSnapshot.threshold,\n );\n\n await om.cleanupMessages({\n threadId,\n resourceId,\n messages: messageList,\n observedMessageIds: observedIds,\n retentionFloor: minRemaining,\n });\n\n if (statusSnapshot.asyncObservationEnabled) {\n await om.resetBufferingState({\n threadId,\n resourceId,\n recordId: obsResult.record.id,\n activatedMessageIds: obsResult.activatedMessageIds,\n });\n }\n\n await this.turn.refreshRecord();\n if (this.turn.record.generationCount > preObsGeneration) {\n reflected = true;\n }\n }\n }\n\n // Re-fetch status after observation/cleanup for the snapshot\n statusSnapshot = await om.getStatus({\n threadId,\n resourceId,\n messages: messageList.get.all.db(),\n });\n }\n\n // ── Refresh cross-thread context (resource scope) ──────────\n const otherThreadsContext = await this.turn.refreshOtherThreadsContext();\n\n // ── Build system messages (one per cache-stable chunk) ────\n const systemMessage = await om.buildContextSystemMessages({\n threadId,\n resourceId,\n record: this.turn.record,\n unobservedContextBlocks: otherThreadsContext,\n });\n\n // ── Filter observed messages ──────────────────────────────\n if (!didThresholdCleanup) {\n const fallbackCursor = this.turn.record.threadId\n ? getThreadOMMetadata((await om.getStorage().getThreadById({ threadId: this.turn.record.threadId }))?.metadata)\n ?.lastObservedMessageCursor\n : undefined;\n\n filterObservedMessages({\n messageList,\n record: this.turn.record,\n useMarkerBoundaryPruning: this.stepNumber === 0,\n fallbackCursor,\n });\n }\n\n this._context = {\n systemMessage,\n observerExchange,\n activated,\n observed,\n buffered,\n reflected,\n status: {\n pendingTokens: statusSnapshot.pendingTokens,\n threshold: statusSnapshot.threshold,\n effectiveObservationTokensThreshold: statusSnapshot.effectiveObservationTokensThreshold,\n shouldObserve: statusSnapshot.shouldObserve,\n shouldBuffer: statusSnapshot.shouldBuffer,\n shouldReflect: statusSnapshot.shouldReflect,\n canActivate: statusSnapshot.canActivate,\n },\n };\n this._prepared = true;\n return this._context;\n }\n\n /**\n * Run the full threshold observation pipeline:\n * waitForBuffering → re-check → activate → reflect → blockAfter gate → observe\n */\n private async runThresholdObservation(): Promise<{\n succeeded: boolean;\n record: any;\n activatedMessageIds?: string[];\n observerExchange?: StepContext['observerExchange'];\n }> {\n const { threadId, resourceId, messageList } = this.turn;\n const om = this.turn.om;\n\n // Wait for any in-flight buffering to settle\n await om.waitForBuffering(threadId, resourceId);\n\n // Re-check status with fresh state\n const freshStatus = await om.getStatus({\n threadId,\n resourceId,\n messages: messageList.get.all.db(),\n });\n\n if (!freshStatus.shouldObserve) {\n return { succeeded: false, record: freshStatus.record };\n }\n\n // Try activation first if buffered chunks exist\n if (freshStatus.canActivate) {\n const activation = await om.activate({\n threadId,\n resourceId,\n messages: messageList.get.all.db(),\n writer: this.turn.writer,\n messageList,\n });\n\n if (activation.activated) {\n // Check reflection after activation — use maybeReflect so that a\n // completed buffered reflection is activated instantly instead of\n // running a redundant sync reflection from scratch.\n const postActivationRecord = activation.record;\n await om.reflector.maybeReflect({\n record: postActivationRecord,\n observationTokens: postActivationRecord.observationTokenCount ?? 0,\n threadId,\n writer: this.turn.writer,\n messageList,\n requestContext: this.turn.requestContext,\n observabilityContext: this.turn.observabilityContext,\n });\n\n return {\n succeeded: true,\n record: activation.record,\n activatedMessageIds: activation.activatedMessageIds,\n };\n }\n }\n\n // Sync observation — we've waited for buffering and tried activation,\n // if we're still above threshold we must observe synchronously.\n const obsResult = await om.observe({\n threadId,\n resourceId,\n messages: messageList.get.all.db(),\n requestContext: this.turn.requestContext,\n writer: this.turn.writer,\n observabilityContext: this.turn.observabilityContext,\n });\n\n return {\n succeeded: obsResult.observed,\n record: obsResult.record,\n observerExchange: om.observer.lastExchange,\n };\n }\n}\n","import type { MessageList } from '@mastra/core/agent';\nimport type { ObservabilityContext } from '@mastra/core/observability';\nimport type { ProcessorStreamWriter } from '@mastra/core/processors';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { ObservationalMemoryRecord } from '@mastra/core/storage';\n\nimport type { ObservationalMemory } from '../observational-memory';\nimport type { MemoryContextProvider } from '../processor';\n\nimport { ObservationStep } from './step';\nimport type { ObservationTurnHooks, TurnContext, TurnResult } from './types';\n\n/**\n * Represents a single turn in the agent conversation — one user message → agent response cycle.\n *\n * The turn manages record caching, context loading, and step lifecycle.\n * Create via `om.beginTurn(...)`, then call `start()` to load context,\n * `step(n)` to create steps, and `end()` to finalize.\n *\n * @example\n * ```ts\n * const turn = om.beginTurn({ threadId, resourceId, messageList });\n * await turn.start(memory);\n *\n * const step0 = turn.step(0);\n * const ctx = await step0.prepare();\n * // ... agent generates ...\n *\n * const step1 = turn.step(1); // finalizes step 0\n * const ctx1 = await step1.prepare();\n * // ... agent generates ...\n *\n * await turn.end(); // finalizes last step, cleanup\n * ```\n */\nexport class ObservationTurn {\n private _record?: ObservationalMemoryRecord;\n private _context?: TurnContext;\n private _currentStep?: ObservationStep;\n private _started = false;\n private _ended = false;\n\n /** Generation count at turn start — used to detect if reflection happened during the turn. */\n private _generationCountAtStart = -1;\n\n /** Memory context provider — set via start(). Used by steps for beforeBuffer persistence. */\n memory?: MemoryContextProvider;\n\n /** Optional stream writer for emitting markers. */\n writer?: ProcessorStreamWriter;\n\n /** Optional request context for observation calls. */\n requestContext?: RequestContext;\n\n /** Optional observability context for nested OM spans. */\n observabilityContext?: ObservabilityContext;\n\n /** Optional processor-provided hooks for turn/step lifecycle integration. */\n readonly hooks?: ObservationTurnHooks;\n\n constructor(opts: {\n om: ObservationalMemory;\n threadId: string;\n resourceId?: string;\n messageList: MessageList;\n observabilityContext?: ObservabilityContext;\n hooks?: ObservationTurnHooks;\n }) {\n this.om = opts.om;\n this.threadId = opts.threadId;\n this.resourceId = opts.resourceId;\n this.messageList = opts.messageList;\n this.observabilityContext = opts.observabilityContext;\n this.hooks = opts.hooks;\n }\n\n readonly om: ObservationalMemory;\n readonly threadId: string;\n readonly resourceId: string | undefined;\n readonly messageList: MessageList;\n\n /** The current cached record. Refreshed after mutations (activate/observe/reflect). */\n get record(): ObservationalMemoryRecord {\n if (!this._record) throw new Error('Turn not started — call start() first');\n return this._record;\n }\n\n /** The context loaded during start(). */\n get context(): TurnContext {\n if (!this._context) throw new Error('Turn not started — call start() first');\n return this._context;\n }\n\n /** The current step, if one exists. */\n get currentStep(): ObservationStep | undefined {\n return this._currentStep;\n }\n\n /**\n * Load context and cache the record. Call once at the start of the turn.\n *\n * If a MemoryContextProvider is passed, loads historical messages and adds\n * them to the MessageList. Without a provider, only fetches/caches the record.\n */\n async start(memory?: MemoryContextProvider): Promise<TurnContext> {\n if (this._started) throw new Error('Turn already started');\n this._started = true;\n\n this._record = await this.om.getOrCreateRecord(this.threadId, this.resourceId);\n this._generationCountAtStart = this._record.generationCount;\n this.memory = memory;\n\n if (memory) {\n const ctx = await memory.getContext({ threadId: this.threadId, resourceId: this.resourceId });\n\n // Add historical messages to the MessageList, filtering out system messages\n for (const msg of ctx.messages) {\n if (msg.role !== 'system') {\n this.messageList.add(msg, 'memory');\n }\n }\n\n this._context = {\n messages: ctx.messages,\n systemMessage: ctx.systemMessage,\n continuation: ctx.continuationMessage,\n otherThreadsContext: ctx.otherThreadsContext,\n record: this._record,\n };\n } else {\n this._context = {\n messages: [],\n systemMessage: undefined,\n continuation: undefined,\n otherThreadsContext: undefined,\n record: this._record,\n };\n }\n\n return this._context;\n }\n\n /**\n * Create a step handle. If a previous step exists, it is finalized\n * (its output messages will be saved at the start of the new step's prepare()).\n */\n step(stepNumber: number): ObservationStep {\n if (!this._started) throw new Error('Turn not started — call start() first');\n if (this._ended) throw new Error('Turn already ended');\n\n this._currentStep = new ObservationStep(this, stepNumber);\n return this._currentStep;\n }\n\n /**\n * Finalize the turn: save any remaining messages and return the latest record state.\n */\n async end(): Promise<TurnResult> {\n if (this._ended) throw new Error('Turn already ended');\n this._ended = true;\n\n // Save any unsaved messages from the last step\n const unsavedInput = this.messageList.get.input.db();\n const unsavedOutput = this.messageList.get.response.db();\n const unsavedMessages = [...unsavedInput, ...unsavedOutput];\n if (unsavedMessages.length > 0) {\n await this.om.persistMessages(unsavedMessages, this.threadId, this.resourceId);\n }\n\n return { record: this._record! };\n }\n\n /**\n * Refresh the cached record from storage. Called internally after mutations.\n * @internal\n */\n async refreshRecord(): Promise<void> {\n this._record = await this.om.getOrCreateRecord(this.threadId, this.resourceId);\n }\n\n /**\n * Refresh cross-thread context for resource scope. Called per-step.\n * @internal\n */\n async refreshOtherThreadsContext(): Promise<string | undefined> {\n if (this.om.scope === 'resource' && this.resourceId) {\n const otherThreadsContext = await this.om.getOtherThreadsContext(this.resourceId!, this.threadId);\n if (this._context) {\n this._context.otherThreadsContext = otherThreadsContext;\n }\n return otherThreadsContext;\n }\n return this._context?.otherThreadsContext;\n }\n}\n","const ANCHOR_ID_PATTERN = /^\\[(O\\d+(?:-N\\d+)?)\\]\\s*/;\nconst OBSERVATION_DATE_HEADER_PATTERN = /^\\s*Date:\\s+/;\nconst XML_TAG_PATTERN = /^\\s*<\\/?[a-z][^>]*>\\s*$/i;\nconst MARKDOWN_GROUP_HEADING_PATTERN = /^\\s*##\\s+Group\\s+`[^`]+`\\s*$/;\nconst MARKDOWN_GROUP_METADATA_PATTERN = /^\\s*_range:\\s*`[^`]*`_\\s*$/;\n\nfunction buildEphemeralAnchorId(topLevelCounter: number, nestedCounter: number): string {\n return nestedCounter === 0 ? `O${topLevelCounter}` : `O${topLevelCounter}-N${nestedCounter}`;\n}\n\nexport function parseAnchorId(line: string): string | null {\n const match = line.match(ANCHOR_ID_PATTERN);\n return match?.[1] ?? null;\n}\n\nfunction shouldAnchorLine(line: string): boolean {\n const trimmed = line.trim();\n\n if (!trimmed) {\n return false;\n }\n\n if (parseAnchorId(trimmed)) {\n return false;\n }\n\n if (OBSERVATION_DATE_HEADER_PATTERN.test(trimmed)) {\n return false;\n }\n\n if (XML_TAG_PATTERN.test(trimmed)) {\n return false;\n }\n\n if (MARKDOWN_GROUP_HEADING_PATTERN.test(trimmed) || MARKDOWN_GROUP_METADATA_PATTERN.test(trimmed)) {\n return false;\n }\n\n return true;\n}\n\nfunction getIndentationDepth(line: string): number {\n const leadingWhitespace = line.match(/^\\s*/)?.[0] ?? '';\n return Math.floor(leadingWhitespace.replace(/\\t/g, ' ').length / 2);\n}\n\nexport function injectAnchorIds(observations: string): string {\n if (!observations) {\n return observations;\n }\n\n const lines = observations.split('\\n');\n let topLevelCounter = 0;\n let nestedCounter = 0;\n let changed = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n\n if (!shouldAnchorLine(line)) {\n continue;\n }\n\n const indentationDepth = getIndentationDepth(line);\n if (indentationDepth === 0) {\n topLevelCounter += 1;\n nestedCounter = 0;\n } else {\n if (topLevelCounter === 0) {\n topLevelCounter = 1;\n }\n nestedCounter += 1;\n }\n\n const anchorId = buildEphemeralAnchorId(topLevelCounter, nestedCounter);\n const leadingWhitespace = line.match(/^\\s*/)?.[0] ?? '';\n lines[i] = `${leadingWhitespace}[${anchorId}] ${line.slice(leadingWhitespace.length)}`;\n changed = true;\n }\n\n return changed ? lines.join('\\n') : observations;\n}\n\nexport function stripEphemeralAnchorIds(observations: string): string {\n if (!observations) {\n return observations;\n }\n\n return observations.replace(/(^|\\n)([^\\S\\n]*)\\[(O\\d+(?:-N\\d+)?)\\][^\\S\\n]*/g, '$1$2');\n}\n","import { estimateTokenCount } from 'tokenx';\n\nconst ENCRYPTED_CONTENT_KEY = 'encryptedContent';\nconst ENCRYPTED_CONTENT_REDACTION_THRESHOLD = 256;\n\nexport const DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS = 10_000;\n\nfunction isObjectLike(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction sanitizeToolResultValue(value: unknown, seen: WeakMap<object, unknown> = new WeakMap()): unknown {\n if (!isObjectLike(value)) {\n return value;\n }\n\n if (seen.has(value)) {\n return seen.get(value);\n }\n\n if (Array.isArray(value)) {\n const sanitizedArray: unknown[] = [];\n seen.set(value, sanitizedArray);\n for (const item of value) {\n sanitizedArray.push(sanitizeToolResultValue(item, seen));\n }\n return sanitizedArray;\n }\n\n const sanitizedObject: Record<string, unknown> = {};\n seen.set(value, sanitizedObject);\n\n for (const [key, entry] of Object.entries(value)) {\n if (\n key === ENCRYPTED_CONTENT_KEY &&\n typeof entry === 'string' &&\n entry.length > ENCRYPTED_CONTENT_REDACTION_THRESHOLD\n ) {\n sanitizedObject[key] = `[stripped encryptedContent: ${entry.length} characters]`;\n continue;\n }\n\n sanitizedObject[key] = sanitizeToolResultValue(entry, seen);\n }\n\n return sanitizedObject;\n}\n\nfunction stringifyToolResult(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n const sanitized = sanitizeToolResultValue(value);\n try {\n return JSON.stringify(sanitized, null, 2);\n } catch {\n return String(sanitized);\n }\n}\n\nexport function resolveToolResultValue(\n part: { providerMetadata?: Record<string, any> } | undefined,\n invocationResult: unknown,\n): {\n value: unknown;\n usingStoredModelOutput: boolean;\n} {\n const mastraMetadata = part?.providerMetadata?.mastra;\n if (mastraMetadata && typeof mastraMetadata === 'object' && 'modelOutput' in mastraMetadata) {\n return {\n value: (mastraMetadata as Record<string, unknown>).modelOutput,\n usingStoredModelOutput: true,\n };\n }\n\n return {\n value: invocationResult,\n usingStoredModelOutput: false,\n };\n}\n\nexport function truncateStringByTokens(text: string, maxTokens: number): string {\n if (!text || maxTokens <= 0) {\n return '';\n }\n\n const totalTokens = estimateTokenCount(text);\n if (totalTokens <= maxTokens) {\n return text;\n }\n\n const buildCandidate = (sliceEnd: number) => {\n const visible = text.slice(0, sliceEnd);\n return `${visible}\\n... [truncated ~${totalTokens - estimateTokenCount(visible)} tokens]`;\n };\n\n let low = 0;\n let high = text.length;\n let best = buildCandidate(0);\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const candidate = buildCandidate(mid);\n const candidateTokens = estimateTokenCount(candidate);\n\n if (candidateTokens <= maxTokens) {\n best = candidate;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return best;\n}\n\nexport function formatToolResultForObserver(\n value: unknown,\n options?: {\n maxTokens?: number;\n },\n): string {\n const serialized = stringifyToolResult(value);\n const maxTokens = options?.maxTokens ?? DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS;\n return truncateStringByTokens(serialized, maxTokens);\n}\n","import type { MastraDBMessage } from '@mastra/core/agent';\nimport type { CoreMessage } from '@mastra/core/llm';\n\nimport { stripEphemeralAnchorIds } from './anchor-ids';\nimport {\n DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS,\n formatToolResultForObserver,\n resolveToolResultValue,\n} from './tool-result-helpers';\n\ntype ObserverFormatOptions = { maxPartLength?: number; maxToolResultTokens?: number };\n\n/**\n * The core extraction instructions for the Observer.\n * This is exported so the Reflector can understand how observations were created.\n */\nexport const OBSERVER_EXTRACTION_INSTRUCTIONS = `CRITICAL: DISTINGUISH USER ASSERTIONS FROM QUESTIONS\n\nWhen the user TELLS you something about themselves, mark it as an assertion:\n- \"I have two kids\" → 🔴 (14:30) User stated has two kids\n- \"I work at Acme Corp\" → 🔴 (14:31) User stated works at Acme Corp\n- \"I graduated in 2019\" → 🔴 (14:32) User stated graduated in 2019\n\nWhen the user ASKS about something, mark it as a question/request:\n- \"Can you help me with X?\" → 🔴 (15:00) User asked help with X\n- \"What's the best way to do Y?\" → 🔴 (15:01) User asked best way to do Y\n\nDistinguish between QUESTIONS and STATEMENTS OF INTENT:\n- \"Can you recommend...\" → Question (extract as \"User asked...\")\n- \"I'm looking forward to [doing X]\" → Statement of intent (extract as \"User stated they will [do X] (include estimated/actual date if mentioned)\")\n- \"I need to [do X]\" → Statement of intent (extract as \"User stated they need to [do X] (again, add date if mentioned)\")\n\nSTATE CHANGES AND UPDATES:\nWhen a user indicates they are changing something, frame it as a state change that supersedes previous information:\n- \"I'm going to start doing X instead of Y\" → \"User will start doing X (changing from Y)\"\n- \"I'm switching from A to B\" → \"User is switching from A to B\"\n- \"I moved my stuff to the new place\" → \"User moved their stuff to the new place (no longer at previous location)\"\n\nIf the new state contradicts or updates previous information, make that explicit:\n- BAD: \"User plans to use the new method\"\n- GOOD: \"User will use the new method (replacing the old approach)\"\n\nThis helps distinguish current state from outdated information.\n\nUSER ASSERTIONS ARE AUTHORITATIVE. The user is the source of truth about their own life.\nIf a user previously stated something and later asks a question about the same topic,\nthe assertion is the answer - the question doesn't invalidate what they already told you.\n\nTEMPORAL ANCHORING:\nEach observation has TWO potential timestamps:\n\n1. BEGINNING: The time the statement was made (from the message timestamp) - ALWAYS include this\n2. END: The time being REFERENCED, if different from when it was said - ONLY when there's a relative time reference\n\nONLY add \"(meaning DATE)\" or \"(estimated DATE)\" at the END when you can provide an ACTUAL DATE:\n- Past: \"last week\", \"yesterday\", \"a few days ago\", \"last month\", \"in March\"\n- Future: \"this weekend\", \"tomorrow\", \"next week\"\n\nDO NOT add end dates for:\n- Present-moment statements with no time reference\n- Vague references like \"recently\", \"a while ago\", \"lately\", \"soon\" - these cannot be converted to actual dates\n\nFORMAT:\n- With time reference: (TIME) [observation]. (meaning/estimated DATE)\n- Without time reference: (TIME) [observation].\n\nGOOD: (09:15) User's friend had a birthday party in March. (meaning March 20XX)\n ^ References a past event - add the referenced date at the end\n\nGOOD: (09:15) User will visit their parents this weekend. (meaning June 17-18, 20XX)\n ^ References a future event - add the referenced date at the end\n\nGOOD: (09:15) User prefers hiking in the mountains.\n ^ Present-moment preference, no time reference - NO end date needed\n\nGOOD: (09:15) User is considering adopting a dog.\n ^ Present-moment thought, no time reference - NO end date needed\n\nBAD: (09:15) User prefers hiking in the mountains. (meaning June 15, 20XX - today)\n ^ No time reference in the statement - don't repeat the message timestamp at the end\n\nIMPORTANT: If an observation contains MULTIPLE events, split them into SEPARATE observation lines.\nEACH split observation MUST have its own date at the end - even if they share the same time context.\n\nExamples (assume message is from June 15, 20XX):\n\nBAD: User will visit their parents this weekend (meaning June 17-18, 20XX) and go to the dentist tomorrow.\nGOOD (split into two observations, each with its date):\n User will visit their parents this weekend. (meaning June 17-18, 20XX)\n User will go to the dentist tomorrow. (meaning June 16, 20XX)\n\nBAD: User needs to clean the garage this weekend and is looking forward to setting up a new workbench.\nGOOD (split, BOTH get the same date since they're related):\n User needs to clean the garage this weekend. (meaning June 17-18, 20XX)\n User will set up a new workbench this weekend. (meaning June 17-18, 20XX)\n\nBAD: User was given a gift by their friend (estimated late May 20XX) last month.\nGOOD: (09:15) User was given a gift by their friend last month. (estimated late May 20XX)\n ^ Message time at START, relative date reference at END - never in the middle\n\nBAD: User started a new job recently and will move to a new apartment next week.\nGOOD (split):\n User started a new job recently.\n User will move to a new apartment next week. (meaning June 21-27, 20XX)\n ^ \"recently\" is too vague for a date - omit the end date. \"next week\" can be calculated.\n\nALWAYS put the date at the END in parentheses - this is critical for temporal reasoning.\nWhen splitting related events that share the same time context, EACH observation must have the date.\n\nPRESERVE UNUSUAL PHRASING:\nWhen the user uses unexpected or non-standard terminology, quote their exact words.\n\nBAD: User exercised.\nGOOD: User stated they did a \"movement session\" (their term for exercise).\n\nUSE PRECISE ACTION VERBS:\nReplace vague verbs like \"getting\", \"got\", \"have\" with specific action verbs that clarify the nature of the action.\nIf the assistant confirms or clarifies the user's action, use the assistant's more precise language.\n\nBAD: User is getting X.\nGOOD: User subscribed to X. (if context confirms recurring delivery)\nGOOD: User purchased X. (if context confirms one-time acquisition)\n\nBAD: User got something.\nGOOD: User purchased / received / was given something. (be specific)\n\nCommon clarifications:\n- \"getting\" something regularly → \"subscribed to\" or \"enrolled in\"\n- \"getting\" something once → \"purchased\" or \"acquired\"\n- \"got\" → \"purchased\", \"received as gift\", \"was given\", \"picked up\"\n- \"signed up\" → \"enrolled in\", \"registered for\", \"subscribed to\"\n- \"stopped getting\" → \"canceled\", \"unsubscribed from\", \"discontinued\"\n\nWhen the assistant interprets or confirms the user's vague language, prefer the assistant's precise terminology.\n\nPRESERVING DETAILS IN ASSISTANT-GENERATED CONTENT:\n\nWhen the assistant provides lists, recommendations, or creative content that the user explicitly requested,\npreserve the DISTINGUISHING DETAILS that make each item unique and queryable later.\n\n1. RECOMMENDATION LISTS - Preserve the key attribute that distinguishes each item:\n BAD: Assistant recommended 5 hotels in the city.\n GOOD: Assistant recommended hotels: Hotel A (near the train station), Hotel B (budget-friendly), \n Hotel C (has rooftop pool), Hotel D (pet-friendly), Hotel E (historic building).\n \n BAD: Assistant listed 3 online stores for craft supplies.\n GOOD: Assistant listed craft stores: Store A (based in Germany, ships worldwide), \n Store B (specializes in vintage fabrics), Store C (offers bulk discounts).\n\n2. NAMES, HANDLES, AND IDENTIFIERS - Always preserve specific identifiers:\n BAD: Assistant provided social media accounts for several photographers.\n GOOD: Assistant provided photographer accounts: @photographer_one (portraits), \n @photographer_two (landscapes), @photographer_three (nature).\n \n BAD: Assistant listed some authors to check out.\n GOOD: Assistant recommended authors: Jane Smith (mystery novels), \n Bob Johnson (science fiction), Maria Garcia (historical romance).\n\n3. CREATIVE CONTENT - Preserve structure and key sequences:\n BAD: Assistant wrote a poem with multiple verses.\n GOOD: Assistant wrote a 3-verse poem. Verse 1 theme: loss. Verse 2 theme: hope. \n Verse 3 theme: renewal. Refrain: \"The light returns.\"\n \n BAD: User shared their lucky numbers from a fortune cookie.\n GOOD: User's fortune cookie lucky numbers: 7, 14, 23, 38, 42, 49.\n\n4. TECHNICAL/NUMERICAL RESULTS - Preserve specific values:\n BAD: Assistant explained the performance improvements from the optimization.\n GOOD: Assistant explained the optimization achieved 43.7% faster load times \n and reduced memory usage from 2.8GB to 940MB.\n \n BAD: Assistant provided statistics about the dataset.\n GOOD: Assistant provided dataset stats: 7,342 samples, 89.6% accuracy, \n 23ms average inference time.\n\n5. QUANTITIES AND COUNTS - Always preserve how many of each item:\n BAD: Assistant listed items with details but no quantities.\n GOOD: Assistant listed items: Item A (4 units, size large), Item B (2 units, size small).\n \n When listing items with attributes, always include the COUNT first before other details.\n\n6. ROLE/PARTICIPATION STATEMENTS - When user mentions their role at an event:\n BAD: User attended the company event.\n GOOD: User was a presenter at the company event.\n \n BAD: User went to the fundraiser.\n GOOD: User volunteered at the fundraiser (helped with registration).\n \n Always capture specific roles: presenter, organizer, volunteer, team lead, \n coordinator, participant, contributor, helper, etc.\n\nCONVERSATION CONTEXT:\n- What the user is working on or asking about\n- Previous topics and their outcomes\n- What user understands or needs clarification on\n- Specific requirements or constraints mentioned\n- Contents of assistant learnings and summaries\n- Answers to users questions including full context to remember detailed summaries and explanations\n- Assistant explanations, especially complex ones. observe the fine details so that the assistant does not forget what they explained\n- Relevant code snippets\n- User preferences (like favourites, dislikes, preferences, etc)\n- Any specifically formatted text or ascii that would need to be reproduced or referenced in later interactions (preserve these verbatim in memory)\n- Sequences, units, measurements, and any kind of specific relevant data\n- Any blocks of any text which the user and assistant are iteratively collaborating back and forth on should be preserved verbatim\n- When who/what/where/when is mentioned, note that in the observation. Example: if the user received went on a trip with someone, observe who that someone was, where the trip was, when it happened, and what happened, not just that the user went on the trip.\n- For any described entity (like a person, place, thing, etc), preserve the attributes that would help identify or describe the specific entity later: location (\"near X\"), specialty (\"focuses on Y\"), unique feature (\"has Z\"), relationship (\"owned by W\"), or other details. The entity's name is important, but so are any additional details that distinguish it. If there are a list of entities, preserve these details for each of them.\n\nUSER MESSAGE CAPTURE:\n- Short and medium-length user messages should be captured nearly verbatim in your own words.\n- For very long user messages, summarize but quote key phrases that carry specific intent or meaning.\n- This is critical for continuity: when the conversation window shrinks, the observations are the only record of what the user said.\n\nAVOIDING REPETITIVE OBSERVATIONS:\n- Do NOT repeat the same observation across multiple turns if there is no new information.\n- When the agent performs repeated similar actions (e.g., browsing files, running the same tool type multiple times), group them into a single parent observation with sub-bullets for each new result.\n\nExample — BAD (repetitive):\n* 🟡 (14:30) Agent used view tool on src/auth.ts\n* 🟡 (14:31) Agent used view tool on src/users.ts\n* 🟡 (14:32) Agent used view tool on src/routes.ts\n\nExample — GOOD (grouped):\n* 🟡 (14:30) Agent browsed source files for auth flow\n * -> viewed src/auth.ts — found token validation logic\n * -> viewed src/users.ts — found user lookup by email\n * -> viewed src/routes.ts — found middleware chain\n\nOnly add a new observation for a repeated action if the NEW result changes the picture.\n\nACTIONABLE INSIGHTS:\n- What worked well in explanations\n- What needs follow-up or clarification\n- User's stated goals or next steps (note if the user tells you not to do a next step, or asks for something specific, other next steps besides the users request should be marked as \"waiting for user\", unless the user explicitly says to continue all next steps)\n\nCOMPLETION TRACKING:\nCompletion observations are not just summaries. They are explicit memory signals to the assistant that a task, question, or subtask has been resolved.\nWithout clear completion markers, the assistant may forget that work is already finished and may repeat, reopen, or continue an already-completed task.\n\nUse ✅ to answer: \"What exactly is now done?\"\nChoose completion observations that help the assistant know what is finished and should not be reworked unless new information appears.\n\nUse ✅ when:\n- The user explicitly confirms something worked or was answered (\"thanks, that fixed it\", \"got it\", \"perfect\")\n- The assistant provided a definitive, complete answer to a factual question and the user moved on\n- A multi-step task reached its stated goal\n- The user acknowledged receipt of requested information\n- A concrete subtask, fix, deliverable, or implementation step became complete during ongoing work\n\nDo NOT use ✅ when:\n- The assistant merely responded — the user might follow up with corrections\n- The topic is paused but not resolved (\"I'll try that later\")\n- The user's reaction is ambiguous\n\nFORMAT:\nAs a sub-bullet under the related observation group:\n* 🔴 (14:30) User asked how to configure auth middleware\n * -> Agent explained JWT setup with code example\n * ✅ User confirmed auth is working\n\nOr as a standalone observation when closing out a broader task:\n* ✅ (14:45) Auth configuration task completed — user confirmed middleware is working\n\nCompletion observations should be terse but specific about WHAT was completed.\nPrefer concrete resolved outcomes over abstract workflow status so the assistant remembers what is already done.`;\n\n/**\n * The output format instructions for the Observer.\n * This is exported so the Reflector can use the same format.\n */\n\n/**\n * Base output format for Observer (without patterns section)\n */\nexport const OBSERVER_OUTPUT_FORMAT_BASE = buildObserverOutputFormat();\n\nexport function buildObserverOutputFormat(includeThreadTitle: boolean = false): string {\n const threadTitleSection = includeThreadTitle\n ? `\n<thread-title>\nA short, noun-phrase title for this conversation (2-5 words). Examples:\n- \"Auth bug fix\" — not \"Fixing the auth bug\"\n- \"Dark mode toggle\" — not \"User wants dark mode toggle added\"\n- \"Deployment pipeline setup\" — not \"Setting up deployment pipeline for project\"\nOnly update when the topic meaningfully changes.\n</thread-title>`\n : '';\n\n return `Use priority levels:\n- 🔴 High: explicit user facts, preferences, unresolved goals, critical context\n- 🟡 Medium: project details, learned information, tool results\n- 🟢 Low: minor details, uncertain observations\n- ✅ Completed: concrete task finished, question answered, issue resolved, goal achieved, or subtask completed in a way that helps the assistant know it is done\n\nGroup related observations (like tool sequences) by indenting:\n* 🔴 (14:33) Agent debugging auth issue\n * -> ran git status, found 3 modified files\n * -> viewed auth.ts:45-60, found missing null check\n * -> applied fix, tests now pass\n * ✅ Tests passing, auth issue resolved\n\nGroup observations by date, then list each with 24-hour time.\n\n<observations>\nDate: Dec 4, 2025\n* 🔴 (14:30) User prefers direct answers\n* 🔴 (14:31) Working on feature X\n* 🟡 (14:32) User might prefer dark mode\n\nDate: Dec 5, 2025\n* 🔴 (09:15) Continued work on feature X\n</observations>\n\n<current-task>\nState the current task(s) explicitly. Can be single or multiple:\n- Primary: What the agent is currently working on\n- Secondary: Other pending tasks (mark as \"waiting for user\" if appropriate)\n\nIf the agent started doing something without user approval, note that it's off-task.\n</current-task>\n\n<suggested-response>\nHint for the agent's immediate next message. Examples:\n- \"I've updated the navigation model. Let me walk you through the changes...\"\n- \"The assistant should wait for the user to respond before continuing.\"\n- Call the view tool on src/example.ts to continue debugging.\n</suggested-response>${threadTitleSection}`;\n}\n\n/**\n * The guidelines for the Observer.\n * This is exported so the Reflector can reference them.\n */\nexport const OBSERVER_GUIDELINES = `- Be specific enough for the assistant to act on\n- Good: \"User prefers short, direct answers without lengthy explanations\"\n- Bad: \"User stated a preference\" (too vague)\n- Add 1 to 5 observations per exchange\n- Use terse language to save tokens. Sentences should be dense without unnecessary words\n- Do not add repetitive observations that have already been observed. Group repeated similar actions (tool calls, file browsing) under a single parent with sub-bullets for new results\n- If the agent calls tools, observe what was called, why, and what was learned\n- When observing files with line numbers, include the line number if useful\n- If the agent provides a detailed response, observe the contents so it could be repeated\n- Make sure you start each observation with a priority emoji (🔴, 🟡, 🟢) or a completion marker (✅)\n- Capture the user's words closely — short/medium messages near-verbatim, long messages summarized with key quotes. User confirmations or explicit resolved outcomes should be ✅ when they clearly signal something is done; unresolved or critical user facts remain 🔴\n- Treat ✅ as a memory signal that tells the assistant something is finished and should not be repeated unless new information changes it\n- Make completion observations answer \"What exactly is now done?\"\n- Prefer concrete resolved outcomes over meta-level workflow or bookkeeping updates\n- When multiple concrete things were completed, capture the concrete completed work rather than collapsing it into a vague progress summary\n- Observe WHAT the agent did and WHAT it means\n- If the user provides detailed messages or code snippets, observe all important details`;\n\n/**\n * Build the complete observer system prompt.\n * @param multiThread - Whether this is for multi-thread batched observation (default: false)\n * @param instruction - Optional custom instructions to append to the prompt\n */\nexport function buildObserverSystemPrompt(\n multiThread: boolean = false,\n instruction?: string,\n includeThreadTitle: boolean = false,\n): string {\n const outputFormat = buildObserverOutputFormat(includeThreadTitle);\n const multiThreadTitleInstruction = includeThreadTitle\n ? ` Each thread's observations, current-task, suggested-response, and thread-title should be nested inside a <thread id=\"...\"> block within <observations>.`\n : ` Each thread's observations, current-task, and suggested-response should be nested inside a <thread id=\"...\"> block within <observations>.`;\n const multiThreadTitleExample = includeThreadTitle\n ? `\n<thread-title>Feature X implementation</thread-title>`\n : '';\n const multiThreadSecondTitleExample = includeThreadTitle\n ? `\n<thread-title>Deployment setup</thread-title>`\n : '';\n\n if (multiThread) {\n return `You are the memory consciousness of an AI assistant. Your observations will be the ONLY information the assistant has about past interactions with this user.\n\nExtract observations that will help the assistant remember:\n\n${OBSERVER_EXTRACTION_INSTRUCTIONS}\n\n=== MULTI-THREAD INPUT ===\n\nYou will receive messages from MULTIPLE conversation threads, each wrapped in <thread id=\"...\"> tags.\nProcess each thread separately and output observations for each thread.\n\n=== OUTPUT FORMAT ===\n\nYour output MUST use XML tags to structure the response.${multiThreadTitleInstruction}\n\nUse this observation format inside each thread block:\n\n${outputFormat}\n\nFor multi-thread output, wrap each thread's observations like this:\n\n<observations>\n<thread id=\"thread_id_1\">\nDate: Dec 4, 2025\n* 🔴 (14:30) User prefers direct answers\n* 🔴 (14:31) Working on feature X\n\n<current-task>\nWhat the agent is currently working on in this thread\n</current-task>\n\n<suggested-response>\nHint for the agent's next message in this thread\n</suggested-response>${multiThreadTitleExample}\n</thread>\n\n<thread id=\"thread_id_2\">\nDate: Dec 5, 2025\n* 🔴 (09:15) User asked about deployment\n\n<current-task>\nCurrent task for this thread\n</current-task>\n\n<suggested-response>\nSuggested response for this thread\n</suggested-response>${multiThreadSecondTitleExample}\n</thread>\n</observations>\n\n=== GUIDELINES ===\n\n${OBSERVER_GUIDELINES}\n\nRemember: These observations are the assistant's ONLY memory. Make them count.\n\nUser messages are extremely important. If the user asks a question or gives a new task, make it clear in <current-task> that this is the priority.${instruction ? `\\n\\n=== CUSTOM INSTRUCTIONS ===\\n\\n${instruction}` : ''}`;\n }\n\n return `You are the memory consciousness of an AI assistant. Your observations will be the ONLY information the assistant has about past interactions with this user.\n\nExtract observations that will help the assistant remember:\n\n${OBSERVER_EXTRACTION_INSTRUCTIONS}\n\n=== OUTPUT FORMAT ===\n\nYour output MUST use XML tags to structure the response. This allows the system to properly parse and manage memory over time.\n\n${outputFormat}\n\n=== GUIDELINES ===\n\n${OBSERVER_GUIDELINES}\n\n=== IMPORTANT: THREAD ATTRIBUTION ===\n\nDo NOT add thread identifiers, thread IDs, or <thread> tags to your observations.\nThread attribution is handled externally by the system.\nSimply output your observations without any thread-related markup.\n\nRemember: These observations are the assistant's ONLY memory. Make them count.\n\nUser messages are extremely important. If the user asks a question or gives a new task, make it clear in <current-task> that this is the priority. If the assistant needs to respond to the user, indicate in <suggested-response> that it should pause for user reply before continuing other tasks.${instruction ? `\\n\\n=== CUSTOM INSTRUCTIONS ===\\n\\n${instruction}` : ''}`;\n}\n\n/**\n * Observer Agent System Prompt (default - for backwards compatibility)\n *\n * This prompt instructs the Observer to extract observations from message history.\n * The observations become the agent's \"subconscious memory\" - the ONLY information\n * the main agent will have about past interactions.\n */\nexport const OBSERVER_SYSTEM_PROMPT = buildObserverSystemPrompt();\n\n/**\n * Result from the Observer agent\n */\nexport interface ObserverResult {\n /** The extracted observations in markdown format */\n observations: string;\n\n /** The current task extracted from observations (for thread metadata) */\n currentTask?: string;\n\n /** Suggested continuation message for the Actor */\n suggestedContinuation?: string;\n\n /** The suggested thread title (short/concise, for thread metadata) */\n threadTitle?: string;\n\n /** Raw output from the model (for debugging) */\n rawOutput?: string;\n\n /** True if the output was detected as degenerate (repetition loop) and should be discarded/retried */\n degenerate?: boolean;\n}\n\n/**\n * Format messages for the Observer's input.\n * Includes timestamps for temporal context.\n */\ntype ObserverAttachmentPart =\n | {\n type: 'image';\n image: unknown;\n mimeType?: string;\n filename?: string;\n providerOptions?: unknown;\n providerMetadata?: unknown;\n experimental_providerMetadata?: unknown;\n }\n | {\n type: 'file';\n data: unknown;\n mimeType?: string;\n filename?: string;\n providerOptions?: unknown;\n providerMetadata?: unknown;\n experimental_providerMetadata?: unknown;\n };\n\ntype ObserverInputAttachmentPart =\n | {\n type: 'image';\n image: unknown;\n mimeType?: string;\n providerOptions?: unknown;\n providerMetadata?: unknown;\n experimental_providerMetadata?: unknown;\n }\n | {\n type: 'file';\n data: unknown;\n mimeType?: string;\n filename?: string;\n providerOptions?: unknown;\n providerMetadata?: unknown;\n experimental_providerMetadata?: unknown;\n };\n\ninterface ObserverFormattedLine {\n date: string;\n time: string;\n title: string;\n body: string;\n}\n\ninterface ObserverFormattedMessage {\n lines: ObserverFormattedLine[];\n attachments: ObserverInputAttachmentPart[];\n}\n\ninterface ObserverAttachmentCounter {\n nextImageId: number;\n nextFileId: number;\n}\n\ninterface ObserverFormattingContext {\n previousDate?: string;\n previousTime?: string;\n}\n\ninterface ObserverFormattedOutput {\n text: string;\n context: ObserverFormattingContext;\n}\n\nconst OBSERVER_IMAGE_FILE_EXTENSIONS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'gif',\n 'bmp',\n 'tiff',\n 'tif',\n 'heic',\n 'heif',\n 'avif',\n]);\n\nfunction formatObserverDate(createdAt?: Date): string {\n return createdAt\n ? `${createdAt.toLocaleDateString('en-US', {\n month: 'short',\n })} ${createdAt.getDate()} ${createdAt.getFullYear()}`\n : '';\n}\n\nfunction formatObserverTime(createdAt?: Date): string {\n return createdAt\n ? createdAt.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n : '';\n}\n\nfunction getObserverPathExtension(value: string): string | undefined {\n const normalized = value.split('#', 1)[0]?.split('?', 1)[0] ?? value;\n const match = normalized.match(/\\.([a-z0-9]+)$/i);\n return match?.[1]?.toLowerCase();\n}\n\nfunction hasObserverImageFilenameExtension(filename: unknown): boolean {\n return typeof filename === 'string' && OBSERVER_IMAGE_FILE_EXTENSIONS.has(getObserverPathExtension(filename) ?? '');\n}\n\nfunction isImageLikeObserverFilePart(part: ObserverAttachmentPart): boolean {\n if (part.type !== 'file') {\n return false;\n }\n\n if (typeof part.mimeType === 'string' && part.mimeType.toLowerCase().startsWith('image/')) {\n return true;\n }\n\n if (typeof part.data === 'string' && part.data.startsWith('data:image/')) {\n return true;\n }\n\n if (part.data instanceof URL && hasObserverImageFilenameExtension(part.data.pathname)) {\n return true;\n }\n\n if (typeof part.data === 'string') {\n try {\n const url = new URL(part.data);\n if ((url.protocol === 'http:' || url.protocol === 'https:') && hasObserverImageFilenameExtension(url.pathname)) {\n return true;\n }\n } catch {\n // ignore invalid URL string\n }\n }\n\n return hasObserverImageFilenameExtension(part.filename);\n}\n\nfunction toObserverInputAttachmentPart(part: ObserverAttachmentPart): ObserverInputAttachmentPart {\n if (part.type === 'image') {\n return {\n type: 'image',\n image: part.image,\n mimeType: part.mimeType,\n providerOptions: part.providerOptions,\n providerMetadata: part.providerMetadata,\n experimental_providerMetadata: part.experimental_providerMetadata,\n };\n }\n\n if (isImageLikeObserverFilePart(part)) {\n return {\n type: 'image',\n image: part.data,\n mimeType: part.mimeType,\n providerOptions: part.providerOptions,\n providerMetadata: part.providerMetadata,\n experimental_providerMetadata: part.experimental_providerMetadata,\n };\n }\n\n return {\n type: 'file',\n data: part.data,\n mimeType: part.mimeType,\n filename: part.filename,\n providerOptions: part.providerOptions,\n providerMetadata: part.providerMetadata,\n experimental_providerMetadata: part.experimental_providerMetadata,\n };\n}\n\nfunction resolveObserverAttachmentLabel(part: ObserverAttachmentPart): string | undefined {\n if (part.filename?.trim()) {\n return part.filename.trim();\n }\n\n const asset = part.type === 'image' ? part.image : part.data;\n if (typeof asset !== 'string' || asset.startsWith('data:')) {\n return part.mimeType;\n }\n\n try {\n const url = new URL(asset);\n const basename = url.pathname.split('/').filter(Boolean).pop();\n return basename ? decodeURIComponent(basename) : part.mimeType;\n } catch {\n return part.mimeType;\n }\n}\n\nfunction formatObserverAttachmentPlaceholder(part: ObserverAttachmentPart, counter: ObserverAttachmentCounter): string {\n const attachmentType = part.type === 'image' || isImageLikeObserverFilePart(part) ? 'Image' : 'File';\n const attachmentId = attachmentType === 'Image' ? counter.nextImageId++ : counter.nextFileId++;\n const label = resolveObserverAttachmentLabel(part);\n return label ? `[${attachmentType} #${attachmentId}: ${label}]` : `[${attachmentType} #${attachmentId}]`;\n}\n\nfunction formatObserverPartLine(title: string, body: string, time: string, previousTime?: string): string {\n const timeLabel = time && time !== previousTime ? ` (${time})` : '';\n return `${title}${timeLabel}: ${body}`;\n}\n\nfunction normalizeObserverCreatedAt(createdAt: unknown): Date | undefined {\n if (createdAt instanceof Date) {\n // Invalid Date objects still satisfy `instanceof Date`, so reject them explicitly.\n if (Number.isNaN(createdAt.getTime())) {\n return undefined;\n }\n return createdAt;\n }\n\n if (typeof createdAt === 'number' || typeof createdAt === 'string') {\n const date = new Date(createdAt);\n if (Number.isNaN(date.getTime())) {\n return undefined;\n }\n return date;\n }\n\n return undefined;\n}\n\nfunction formatObserverLines(\n lines: ObserverFormattedLine[],\n context: ObserverFormattingContext = {},\n): ObserverFormattedOutput {\n const output: string[] = [];\n let previousDate = context.previousDate;\n let previousTime = context.previousTime;\n\n for (const line of lines) {\n if (line.date && line.date !== previousDate) {\n output.push(`${line.date}:`);\n previousDate = line.date;\n previousTime = undefined;\n }\n\n output.push(formatObserverPartLine(line.title, line.body, line.time, previousTime));\n previousTime = line.time || previousTime;\n }\n\n return {\n text: output.join('\\n'),\n context: { previousDate, previousTime },\n };\n}\n\nfunction formatObserverMessage(\n msg: MastraDBMessage,\n counter: ObserverAttachmentCounter,\n options?: ObserverFormatOptions,\n): ObserverFormattedMessage {\n const maxLen = options?.maxPartLength;\n const maxToolResultTokens = options?.maxToolResultTokens ?? DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS;\n const role = msg.role.charAt(0).toUpperCase() + msg.role.slice(1);\n const attachments: ObserverInputAttachmentPart[] = [];\n const messageCreatedAt = normalizeObserverCreatedAt(msg.createdAt);\n\n let lines: ObserverFormattedLine[] = [];\n\n const pushLine = (title: string, body: string, createdAt?: unknown) => {\n if (!body) {\n return;\n }\n\n const normalizedCreatedAt = normalizeObserverCreatedAt(createdAt) ?? messageCreatedAt;\n lines.push({\n date: formatObserverDate(normalizedCreatedAt),\n time: formatObserverTime(normalizedCreatedAt),\n title,\n body,\n });\n };\n\n if (typeof msg.content === 'string') {\n pushLine(role, maybeTruncate(msg.content, maxLen), messageCreatedAt);\n } else if (msg.content?.parts && Array.isArray(msg.content.parts) && msg.content.parts.length > 0) {\n msg.content.parts.forEach(part => {\n const partCreatedAt = normalizeObserverCreatedAt((part as { createdAt?: unknown }).createdAt) ?? messageCreatedAt;\n\n if (part.type === 'text') {\n pushLine(role, maybeTruncate(part.text, maxLen), partCreatedAt);\n return;\n }\n\n if (part.type === 'tool-invocation') {\n const inv = part.toolInvocation;\n if (inv.state === 'result') {\n const { value: resultForObserver } = resolveToolResultValue(\n part as { providerMetadata?: Record<string, any> },\n inv.result,\n );\n pushLine(\n `Tool Result ${inv.toolName}`,\n maybeTruncate(formatToolResultForObserver(resultForObserver, { maxTokens: maxToolResultTokens }), maxLen),\n partCreatedAt,\n );\n return;\n }\n\n pushLine(`Tool Call ${inv.toolName}`, maybeTruncate(JSON.stringify(inv.args, null, 2), maxLen), partCreatedAt);\n return;\n }\n\n const partType = (part as { type?: string }).type;\n if (partType === 'reasoning') {\n const reasoning = (part as { reasoning?: string }).reasoning;\n if (!reasoning) {\n return;\n }\n pushLine('Reasoning', maybeTruncate(reasoning, maxLen), partCreatedAt);\n return;\n }\n\n if (partType === 'image' || partType === 'file') {\n const attachment = part as ObserverAttachmentPart;\n const inputAttachment = toObserverInputAttachmentPart(attachment);\n if (inputAttachment) {\n attachments.push(inputAttachment);\n }\n pushLine(\n partType === 'image' ? 'Image' : 'File',\n formatObserverAttachmentPlaceholder(attachment, counter),\n partCreatedAt,\n );\n }\n });\n } else if (msg.content?.content) {\n pushLine(role, maybeTruncate(msg.content.content, maxLen), messageCreatedAt);\n }\n\n if (lines.length === 0 && attachments.length === 0) {\n return { lines: [], attachments };\n }\n\n return {\n lines,\n attachments,\n };\n}\n\nexport function formatMessagesForObserver(messages: MastraDBMessage[], options?: ObserverFormatOptions): string {\n const counter = { nextImageId: 1, nextFileId: 1 };\n const sections: string[] = [];\n let context: ObserverFormattingContext = {};\n\n for (const message of messages) {\n const formatted = formatObserverMessage(message, counter, options);\n if (formatted.lines.length === 0) {\n continue;\n }\n\n const rendered = formatObserverLines(formatted.lines, context);\n if (!rendered.text) {\n continue;\n }\n\n sections.push(rendered.text);\n context = rendered.context;\n }\n\n return sections.join('\\n');\n}\n\nfunction appendFormattedObserverMessage(\n content: any[],\n formatted: ObserverFormattedMessage,\n context: ObserverFormattingContext,\n): ObserverFormattingContext {\n const rendered = formatObserverLines(formatted.lines, context);\n if (rendered.text) {\n content.push({ type: 'text', text: rendered.text });\n }\n content.push(...formatted.attachments);\n return rendered.context;\n}\n\nexport function buildObserverHistoryMessage(messages: MastraDBMessage[], options?: ObserverFormatOptions): CoreMessage {\n const counter = { nextImageId: 1, nextFileId: 1 };\n const content: any[] = [{ type: 'text', text: '## New Message History to Observe\\n\\n' }];\n\n let context: ObserverFormattingContext = {};\n messages.forEach(message => {\n const formatted = formatObserverMessage(message, counter, options);\n if (formatted.lines.length === 0 && formatted.attachments.length === 0) return;\n context = appendFormattedObserverMessage(content, formatted, context);\n });\n\n return {\n role: 'user',\n content,\n } as CoreMessage;\n}\n\n/** Truncate a string to maxLen characters, appending a note if truncated. */\nfunction maybeTruncate(str: string, maxLen?: number): string {\n if (!maxLen || str.length <= maxLen) return str;\n const truncated = str.slice(0, maxLen);\n const remaining = str.length - maxLen;\n return `${truncated}\\n... [truncated ${remaining} characters]`;\n}\n\n/**\n * Format messages from multiple threads for batched observation.\n * Each thread's messages are wrapped in a <thread id=\"...\"> block.\n */\nexport function formatMultiThreadMessagesForObserver(\n messagesByThread: Map<string, MastraDBMessage[]>,\n threadOrder: string[],\n options?: ObserverFormatOptions,\n): string {\n const sections: string[] = [];\n\n for (const threadId of threadOrder) {\n const messages = messagesByThread.get(threadId);\n if (!messages || messages.length === 0) continue;\n\n const formattedMessages = formatMessagesForObserver(messages, options);\n sections.push(`<thread id=\"${threadId}\">\\n${formattedMessages}\\n</thread>`);\n }\n\n return sections.join('\\n\\n');\n}\n\nexport function buildMultiThreadObserverHistoryMessage(\n messagesByThread: Map<string, MastraDBMessage[]>,\n threadOrder: string[],\n options?: ObserverFormatOptions,\n): CoreMessage {\n const counter = { nextImageId: 1, nextFileId: 1 };\n const content: any[] = [\n {\n type: 'text',\n text: `## New Message History to Observe\\n\\nThe following messages are from ${threadOrder.length} different conversation threads. Each thread is wrapped in a <thread id=\"...\"> tag.\\n\\n`,\n },\n ];\n\n threadOrder.forEach((threadId, threadIndex) => {\n const messages = messagesByThread.get(threadId);\n if (!messages || messages.length === 0) return;\n\n const threadContent: any[] = [];\n let context: ObserverFormattingContext = {};\n let hasVisibleContent = false;\n messages.forEach(message => {\n const formatted = formatObserverMessage(message, counter, options);\n if (formatted.lines.length === 0 && formatted.attachments.length === 0) return;\n context = appendFormattedObserverMessage(threadContent, formatted, context);\n hasVisibleContent = true;\n });\n\n if (!hasVisibleContent) return;\n\n content.push({ type: 'text', text: `<thread id=\"${threadId}\">\\n` });\n content.push(...threadContent);\n content.push({ type: 'text', text: '\\n</thread>' });\n if (threadIndex < threadOrder.length - 1) {\n content.push({ type: 'text', text: '\\n\\n' });\n }\n });\n\n return {\n role: 'user',\n content,\n } as CoreMessage;\n}\n\nexport function buildMultiThreadObserverTaskPrompt(\n existingObservations: string | undefined,\n threadOrder?: string[],\n priorMetadataByThread?: Map<string, { currentTask?: string; suggestedResponse?: string; threadTitle?: string }>,\n wasTruncated?: boolean,\n includeThreadTitle?: boolean,\n): string {\n let prompt = '';\n\n if (existingObservations) {\n prompt += `## Previous Observations\\n\\n${existingObservations}\\n\\n---\\n\\n`;\n prompt +=\n 'Do not repeat these existing observations. Your new observations will be appended to the existing observations.\\n\\n';\n }\n\n const hasTruncatedObservations = wasTruncated ?? false;\n const threadMetadataLines = threadOrder\n ?.map(threadId => {\n const metadata = priorMetadataByThread?.get(threadId);\n const hasRelevantMetadata =\n metadata?.currentTask || metadata?.suggestedResponse || (includeThreadTitle && metadata?.threadTitle);\n if (!hasRelevantMetadata) {\n return '';\n }\n\n const lines = [`- thread ${threadId}`];\n if (metadata.currentTask) {\n lines.push(` - prior current-task: ${metadata.currentTask}`);\n }\n if (metadata.suggestedResponse) {\n lines.push(` - prior suggested-response: ${metadata.suggestedResponse}`);\n }\n if (includeThreadTitle && metadata.threadTitle) {\n lines.push(` - prior thread-title: ${metadata.threadTitle}`);\n }\n return lines.join('\\n');\n })\n .filter(Boolean)\n .join('\\n');\n\n if (threadMetadataLines) {\n prompt += `## Prior Thread Metadata\\n\\n${threadMetadataLines}\\n\\n`;\n if (hasTruncatedObservations) {\n prompt += `Previous observations were truncated for context budget reasons.\\n`;\n prompt += `The main agent still has full memory context outside this observer window.\\n`;\n }\n const titleHint = includeThreadTitle ? ', and thread-title' : '';\n prompt += `Use each thread's prior current-task, suggested-response${titleHint} as continuity hints, then update them based on that thread's new messages.\\n\\n---\\n\\n`;\n }\n\n prompt += `## Your Task\\n\\n`;\n const titleInstruction = includeThreadTitle ? ', and thread-title' : '';\n prompt += `Extract new observations from each thread. Output your observations grouped by thread using <thread id=\"...\"> tags inside your <observations> block. Each thread block should contain that thread's observations, current-task, suggested-response${titleInstruction}.\\n\\n`;\n prompt += `Example output format:\\n`;\n prompt += `<observations>\\n`;\n prompt += `<thread id=\"thread1\">\\n`;\n prompt += `Date: Dec 4, 2025\\n`;\n prompt += `* 🔴 (14:30) User prefers direct answers\\n`;\n prompt += `<current-task>Working on feature X</current-task>\\n`;\n prompt += `<suggested-response>Continue with the implementation</suggested-response>\\n`;\n if (includeThreadTitle) prompt += `<thread-title>Feature X implementation</thread-title>\\n`;\n prompt += `</thread>\\n`;\n prompt += `<thread id=\"thread2\">\\n`;\n prompt += `Date: Dec 5, 2025\\n`;\n prompt += `* 🔴 (09:15) User asked about deployment\\n`;\n prompt += `<current-task>Discussing deployment options</current-task>\\n`;\n prompt += `<suggested-response>Explain the deployment process</suggested-response>\\n`;\n if (includeThreadTitle) prompt += `<thread-title>Deployment setup</thread-title>\\n`;\n prompt += `</thread>\\n`;\n prompt += `</observations>`;\n\n return prompt;\n}\n\n/**\n * Build the prompt for multi-thread batched observation.\n */\nexport function buildMultiThreadObserverPrompt(\n existingObservations: string | undefined,\n messagesByThread: Map<string, MastraDBMessage[]>,\n threadOrder: string[],\n priorMetadataByThread?: Map<string, { currentTask?: string; suggestedResponse?: string; threadTitle?: string }>,\n wasTruncated?: boolean,\n options?: ObserverFormatOptions,\n includeThreadTitle?: boolean,\n): string {\n const formattedMessages = formatMultiThreadMessagesForObserver(messagesByThread, threadOrder, options);\n return `## New Message History to Observe\\n\\nThe following messages are from ${threadOrder.length} different conversation threads. Each thread is wrapped in a <thread id=\"...\"> tag.\\n\\n${formattedMessages}\\n\\n---\\n\\n${buildMultiThreadObserverTaskPrompt(existingObservations, threadOrder, priorMetadataByThread, wasTruncated, includeThreadTitle)}`;\n}\n\n/**\n * Result from parsing multi-thread Observer output\n */\nexport interface MultiThreadObserverResult {\n /** Results per thread */\n threads: Map<string, ObserverResult>;\n /** Raw output from the model (for debugging) */\n rawOutput: string;\n /** True if the output was detected as degenerate (repetition loop) and should be discarded/retried */\n degenerate?: boolean;\n}\n\n/**\n * Parse multi-thread Observer output to extract per-thread results.\n */\nexport function parseMultiThreadObserverOutput(output: string): MultiThreadObserverResult {\n const threads = new Map<string, ObserverResult>();\n\n // Check for degenerate repetition on the whole output\n if (detectDegenerateRepetition(output)) {\n return { threads, rawOutput: output, degenerate: true };\n }\n\n // Extract the <observations> block first\n const observationsMatch = output.match(/^[ \\t]*<observations>([\\s\\S]*?)^[ \\t]*<\\/observations>/im);\n const observationsContent = observationsMatch?.[1] ?? output;\n\n // Find all <thread id=\"...\">...</thread> blocks within observations\n const threadRegex = /<thread\\s+id=\"([^\"]+)\">([\\s\\S]*?)<\\/thread>/gi;\n let match;\n\n while ((match = threadRegex.exec(observationsContent)) !== null) {\n const threadId = match[1];\n const threadContent = match[2];\n if (!threadId || !threadContent) continue;\n\n // Parse this thread's content for observations, current-task, suggested-response\n // Extract observations (everything except current-task and suggested-response)\n let observations = threadContent;\n\n // Extract and remove current-task\n let currentTask: string | undefined;\n const currentTaskMatch = threadContent.match(/<current-task>([\\s\\S]*?)<\\/current-task>/i);\n if (currentTaskMatch?.[1]) {\n currentTask = currentTaskMatch[1].trim();\n observations = observations.replace(/<current-task>[\\s\\S]*?<\\/current-task>/i, '');\n }\n\n // Extract and remove suggested-response\n let suggestedContinuation: string | undefined;\n const suggestedMatch = threadContent.match(/<suggested-response>([\\s\\S]*?)<\\/suggested-response>/i);\n if (suggestedMatch?.[1]) {\n suggestedContinuation = suggestedMatch[1].trim();\n observations = observations.replace(/<suggested-response>[\\s\\S]*?<\\/suggested-response>/i, '');\n }\n\n // Extract and remove thread-title\n let threadTitle: string | undefined;\n const threadTitleMatch = threadContent.match(/<thread-title>([\\s\\S]*?)<\\/thread-title>/i);\n if (threadTitleMatch?.[1]) {\n threadTitle = threadTitleMatch[1].trim();\n observations = observations.replace(/<thread-title>[\\s\\S]*?<\\/thread-title>/i, '');\n }\n\n // Clean up observations and apply line truncation\n observations = sanitizeObservationLines(observations.trim());\n\n threads.set(threadId, {\n observations,\n currentTask,\n suggestedContinuation,\n threadTitle,\n rawOutput: threadContent,\n });\n }\n\n // If no thread blocks found, the caller will need to handle this case\n // (e.g., by falling back to single-thread parsing)\n\n return {\n threads,\n rawOutput: output,\n };\n}\n\nexport function buildObserverTaskPrompt(\n existingObservations: string | undefined,\n options?: {\n skipContinuationHints?: boolean;\n priorCurrentTask?: string;\n priorSuggestedResponse?: string;\n priorThreadTitle?: string;\n wasTruncated?: boolean;\n includeThreadTitle?: boolean;\n },\n): string {\n let prompt = '';\n\n if (existingObservations) {\n prompt += `## Previous Observations\\n\\n${existingObservations}\\n\\n---\\n\\n`;\n prompt +=\n 'Do not repeat these existing observations. Your new observations will be appended to the existing observations.\\n\\n';\n }\n\n const hasTruncatedObservations = options?.wasTruncated ?? false;\n const priorMetadataLines: string[] = [];\n if (options?.priorCurrentTask) {\n priorMetadataLines.push(`- prior current-task: ${options.priorCurrentTask}`);\n }\n if (options?.priorSuggestedResponse) {\n priorMetadataLines.push(`- prior suggested-response: ${options.priorSuggestedResponse}`);\n }\n if (options?.includeThreadTitle && options?.priorThreadTitle) {\n priorMetadataLines.push(`- prior thread-title: ${options.priorThreadTitle}`);\n }\n\n if (priorMetadataLines.length > 0) {\n prompt += `## Prior Thread Metadata\\n\\n${priorMetadataLines.join('\\n')}\\n\\n`;\n if (hasTruncatedObservations) {\n prompt += `Previous observations were truncated for context budget reasons.\\n`;\n prompt += `The main agent still has full memory context outside this observer window.\\n`;\n }\n const titleHint = options?.includeThreadTitle ? ', and thread-title' : '';\n prompt += `Use the prior current-task, suggested-response${titleHint} as continuity hints, then update them based on the new messages.\\n\\n---\\n\\n`;\n }\n\n prompt += `## Your Task\\n\\n`;\n prompt += `Extract new observations from the message history above. Do not repeat observations that are already in the previous observations. Add your new observations in the format specified in your instructions.`;\n\n // Add thread title guidance (independent of continuation hints)\n if (options?.includeThreadTitle) {\n prompt += `\\n\\nAlso output a <thread-title> — a short noun-phrase label for this conversation (2-5 words). Write it like a file name or PR title: \"Auth bug fix\", \"Memory config refactor\", \"RAG pipeline setup\". Avoid verbs/sentences (\"Fixing the auth bug\"), filler (\"Working on stuff\"), and generic labels (\"Code review\"). Only change it from the prior title if the topic meaningfully shifted.`;\n }\n\n if (options?.skipContinuationHints) {\n prompt += `\\n\\nIMPORTANT: Do NOT include <current-task> or <suggested-response> sections in your output. Only output <observations>${options?.includeThreadTitle ? ' and <thread-title>' : ''}.`;\n }\n\n return prompt;\n}\n\n/**\n * Build the full prompt for the Observer agent.\n * Includes emphasis on the most recent user message for priority handling.\n */\nexport function buildObserverPrompt(\n existingObservations: string | undefined,\n messagesToObserve: MastraDBMessage[],\n options?: {\n skipContinuationHints?: boolean;\n priorCurrentTask?: string;\n priorSuggestedResponse?: string;\n priorThreadTitle?: string;\n wasTruncated?: boolean;\n includeThreadTitle?: boolean;\n },\n): string {\n const formattedMessages = formatMessagesForObserver(messagesToObserve);\n return `## New Message History to Observe\\n\\n${formattedMessages}\\n\\n---\\n\\n${buildObserverTaskPrompt(existingObservations, options)}`;\n}\n\n/**\n * Parse the Observer's output to extract observations, current task, and suggested response.\n * Uses XML tag parsing for structured extraction.\n */\nexport function parseObserverOutput(output: string): ObserverResult {\n // Check for degenerate repetition before parsing (operates on raw output)\n if (detectDegenerateRepetition(output)) {\n return {\n observations: '',\n rawOutput: output,\n degenerate: true,\n };\n }\n\n const parsed = parseMemorySectionXml(output);\n\n // Return observations WITHOUT current-task/suggested-response tags\n // Those are stored separately in thread metadata and injected dynamically\n const observations = sanitizeObservationLines(parsed.observations || '');\n\n return {\n observations,\n currentTask: parsed.currentTask || undefined,\n suggestedContinuation: parsed.suggestedResponse || undefined,\n threadTitle: parsed.threadTitle || undefined,\n rawOutput: output,\n };\n}\n\n/**\n * Parsed result from XML memory section\n */\ninterface ParsedMemorySection {\n observations: string;\n currentTask: string;\n suggestedResponse: string;\n threadTitle: string;\n}\n\n/**\n * Parse XML tags from observer/reflector output.\n * Extracts content from <observations>, <current-task>, and <suggested-response> tags.\n */\nexport function parseMemorySectionXml(content: string): ParsedMemorySection {\n const result: ParsedMemorySection = {\n observations: '',\n currentTask: '',\n suggestedResponse: '',\n threadTitle: '',\n };\n\n // Extract <observations> content (supports multiple blocks)\n // Tags must be at the start of a line (with optional leading whitespace) to avoid\n // capturing inline mentions like \"User discussed <observations> tags\"\n const observationsRegex = /^[ \\t]*<observations>([\\s\\S]*?)^[ \\t]*<\\/observations>/gim;\n const observationsMatches = [...content.matchAll(observationsRegex)];\n if (observationsMatches.length > 0) {\n result.observations = observationsMatches\n .map(m => m[1]?.trim() ?? '')\n .filter(Boolean)\n .join('\\n');\n } else {\n // Fallback: if no XML tags, extract list items from raw content\n // This handles cases where the LLM doesn't follow the XML format exactly\n result.observations = extractListItemsOnly(content);\n }\n\n // Extract <current-task> content (first match only)\n // Tags must be at the start of a line to avoid capturing inline mentions\n const currentTaskMatch = content.match(/^[ \\t]*<current-task>([\\s\\S]*?)^[ \\t]*<\\/current-task>/im);\n if (currentTaskMatch?.[1]) {\n result.currentTask = currentTaskMatch[1].trim();\n }\n\n // Extract <suggested-response> content (first match only)\n // Tags must be at the start of a line to avoid capturing inline mentions\n const suggestedResponseMatch = content.match(/^[ \\t]*<suggested-response>([\\s\\S]*?)^[ \\t]*<\\/suggested-response>/im);\n if (suggestedResponseMatch?.[1]) {\n result.suggestedResponse = suggestedResponseMatch[1].trim();\n }\n\n // Extract <thread-title> content (first match only)\n // Opening tag must be at the start of a line; closing tag can be on the same line\n // (titles are short, so LLMs typically output them on a single line)\n const threadTitleMatch = content.match(/^[ \\t]*<thread-title>([\\s\\S]*?)<\\/thread-title>/im);\n if (threadTitleMatch?.[1]) {\n result.threadTitle = threadTitleMatch[1].trim();\n }\n\n return result;\n}\n\n/**\n * Fallback: Extract only list items from content when XML tags are missing.\n * Preserves nested list items (indented with spaces/tabs).\n */\nfunction extractListItemsOnly(content: string): string {\n const lines = content.split('\\n');\n const listLines: string[] = [];\n\n for (const line of lines) {\n // Match lines that start with list markers (-, *, or numbered)\n // Allow leading whitespace for nested items\n if (/^\\s*[-*]\\s/.test(line) || /^\\s*\\d+\\.\\s/.test(line)) {\n listLines.push(line);\n }\n }\n\n return listLines.join('\\n').trim();\n}\n\n/**\n * Maximum length (in characters) for a single observation line.\n * Lines exceeding this are truncated with an ellipsis marker.\n * This guards against LLM degeneration that produces enormous single-line outputs.\n */\nconst MAX_OBSERVATION_LINE_CHARS = 10_000;\n\n/**\n * Truncate individual observation lines that exceed the maximum length.\n */\nexport function sanitizeObservationLines(observations: string): string {\n if (!observations) return observations;\n const lines = observations.split('\\n');\n let changed = false;\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]!.length > MAX_OBSERVATION_LINE_CHARS) {\n lines[i] = lines[i]!.slice(0, MAX_OBSERVATION_LINE_CHARS) + ' … [truncated]';\n changed = true;\n }\n }\n return changed ? lines.join('\\n') : observations;\n}\n\n/**\n * Detect degenerate repetition in observer/reflector output.\n * Returns true if the text contains suspicious levels of repeated content,\n * which indicates an LLM repeat-penalty bug (e.g., Gemini Flash looping).\n *\n * Strategy: sample sequential chunks of the text and check if a high\n * proportion are near-identical to previous chunks.\n */\nexport function detectDegenerateRepetition(text: string): boolean {\n if (!text || text.length < 2000) return false;\n\n // Strategy 1: Check for repeated long substrings by sampling fixed-size windows.\n // If the same ~200-char window appears many times, it's degenerate.\n const windowSize = 200;\n const step = Math.max(1, Math.floor(text.length / 50)); // sample ~50 windows\n const seen = new Map<string, number>();\n let duplicateWindows = 0;\n let totalWindows = 0;\n\n for (let i = 0; i + windowSize <= text.length; i += step) {\n const window = text.slice(i, i + windowSize);\n totalWindows++;\n const count = (seen.get(window) ?? 0) + 1;\n seen.set(window, count);\n if (count > 1) duplicateWindows++;\n }\n\n // If more than 40% of sampled windows are duplicates, it's degenerate\n if (totalWindows > 5 && duplicateWindows / totalWindows > 0.4) {\n return true;\n }\n\n // Strategy 2: Check for extremely long lines (a single line with 50k+ chars\n // is almost certainly degenerate enumeration)\n const lines = text.split('\\n');\n for (const line of lines) {\n if (line.length > 50_000) return true;\n }\n\n return false;\n}\n\n/**\n * Check if observations contain a Current Task section.\n * Supports both XML format and legacy markdown format.\n */\nexport function hasCurrentTaskSection(observations: string): boolean {\n // Check for XML format first\n if (/<current-task>/i.test(observations)) {\n return true;\n }\n\n // Legacy markdown patterns\n const currentTaskPatterns = [\n /\\*\\*Current Task:?\\*\\*/i,\n /^Current Task:/im,\n /\\*\\*Current Task\\*\\*:/i,\n /## Current Task/i,\n ];\n\n return currentTaskPatterns.some(pattern => pattern.test(observations));\n}\n\n/**\n * Extract the Current Task content from observations.\n */\nexport function extractCurrentTask(observations: string): string | null {\n const openTag = '<current-task>';\n const closeTag = '</current-task>';\n const startIdx = observations.toLowerCase().indexOf(openTag);\n if (startIdx === -1) return null;\n const contentStart = startIdx + openTag.length;\n const endIdx = observations.toLowerCase().indexOf(closeTag, contentStart);\n if (endIdx === -1) return null;\n const content = observations.slice(contentStart, endIdx).trim();\n return content || null;\n}\n\n/**\n * Optimize observations for token efficiency before presenting to the Actor.\n *\n * This removes:\n * - Non-critical emojis (🟡 and 🟢, keeping only 🔴)\n * - Semantic tags [label, label]\n * - Arrow indicators (->)\n * - Extra whitespace\n *\n * The full format is preserved in storage for analysis.\n */\nexport function optimizeObservationsForContext(observations: string): string {\n let optimized = stripEphemeralAnchorIds(observations);\n\n // Remove 🟡 and 🟢 emojis (keep 🔴 for critical items)\n optimized = optimized.replace(/🟡\\s*/g, '');\n optimized = optimized.replace(/🟢\\s*/g, '');\n\n // Remove semantic tags like [label, label] but keep collapsed markers like [72 items collapsed - ID: b1fa]\n optimized = optimized.replace(/\\[(?![\\d\\s]*items collapsed)[^\\]]+\\]/g, '');\n\n // Remove arrow indicators\n optimized = optimized.replace(/\\s*->\\s*/g, ' ');\n\n // Clean up multiple spaces\n optimized = optimized.replace(/ +/g, ' ');\n\n // Clean up multiple newlines\n optimized = optimized.replace(/\\n{3,}/g, '\\n\\n');\n\n return optimized.trim();\n}\n","import type { ObservabilityContext } from '@mastra/core/observability';\nimport { createObservabilityContext, EntityType, getOrCreateSpan, SpanType } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\n\nimport type { ModelByInputTokens } from './model-by-input-tokens';\nimport type { ResolvedObservationConfig, ResolvedReflectionConfig } from './types';\n\ntype OmTracingModel = Exclude<\n ResolvedObservationConfig['model'] | ResolvedReflectionConfig['model'],\n ModelByInputTokens\n>;\n\ntype OmTracingPhase = 'observer' | 'observer-multi-thread' | 'reflector';\n\nconst PHASE_CONFIG: Record<\n OmTracingPhase,\n {\n name: string;\n entityName: string;\n }\n> = {\n observer: {\n name: 'om.observer',\n entityName: 'Observer',\n },\n 'observer-multi-thread': {\n name: 'om.observer.multi-thread',\n entityName: 'MultiThreadObserver',\n },\n reflector: {\n name: 'om.reflector',\n entityName: 'Reflector',\n },\n};\n\nexport async function withOmTracingSpan<T>({\n phase,\n model,\n inputTokens,\n requestContext,\n observabilityContext,\n metadata,\n callback,\n}: {\n phase: OmTracingPhase;\n model: OmTracingModel;\n inputTokens: number;\n requestContext?: RequestContext;\n observabilityContext?: ObservabilityContext;\n metadata?: Record<string, unknown>;\n callback: (observabilityContext: ObservabilityContext) => Promise<T>;\n}): Promise<T> {\n const config = PHASE_CONFIG[phase];\n const span = getOrCreateSpan({\n type: SpanType.GENERIC,\n name: config.name,\n entityType: EntityType.OUTPUT_STEP_PROCESSOR,\n entityName: config.entityName,\n tracingContext: observabilityContext?.tracingContext ?? observabilityContext?.tracing,\n attributes: {\n metadata: {\n omPhase: phase,\n omInputTokens: inputTokens,\n omSelectedModel: typeof model === 'string' ? model : '(dynamic-model)',\n ...metadata,\n },\n },\n requestContext,\n });\n const childObservabilityContext = createObservabilityContext({ currentSpan: span });\n\n if (!span) {\n return callback(childObservabilityContext);\n }\n\n return span.executeInContext(() => callback(childObservabilityContext));\n}\n","import { Agent } from '@mastra/core/agent';\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport type { ObservabilityContext } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\n\nimport { omDebug } from './debug';\nimport type { ModelByInputTokens } from './model-by-input-tokens';\nimport {\n buildObserverSystemPrompt,\n buildObserverTaskPrompt,\n buildObserverHistoryMessage,\n buildMultiThreadObserverTaskPrompt,\n buildMultiThreadObserverHistoryMessage,\n parseObserverOutput,\n parseMultiThreadObserverOutput,\n} from './observer-agent';\nimport type { TokenCounter } from './token-counter';\nimport { withOmTracingSpan } from './tracing';\nimport type { ResolvedObservationConfig } from './types';\n\ntype ConcreteObservationModel = Exclude<ResolvedObservationConfig['model'], ModelByInputTokens>;\n\ntype ObservationModelResolver = (inputTokens: number) => {\n model: ConcreteObservationModel;\n selectedThreshold?: number;\n routingStrategy?: 'model-by-input-tokens';\n routingThresholds?: string;\n};\n\n/**\n * Runs the Observer agent for extracting observations from messages.\n * Handles single-thread and multi-thread modes, degenerate detection, and retry logic.\n */\nexport interface ObserverExchange {\n systemPrompt: string;\n observerMessages: Array<{ role: string; content: unknown }>;\n rawOutput: string;\n parsedResult: {\n observations: string;\n currentTask?: string;\n suggestedContinuation?: string;\n threadTitle?: string;\n degenerate?: boolean;\n };\n model: string;\n inputTokens: number;\n isMultiThread: boolean;\n retriedDueToDegenerate: boolean;\n}\n\nexport class ObserverRunner {\n private readonly observationConfig: ResolvedObservationConfig;\n private readonly observedMessageIds: Set<string>;\n private readonly resolveModel: ObservationModelResolver;\n private readonly tokenCounter: TokenCounter;\n\n /** Captured prompt/response from the last observer call (for repro capture). */\n lastExchange?: ObserverExchange;\n\n constructor(opts: {\n observationConfig: ResolvedObservationConfig;\n observedMessageIds: Set<string>;\n resolveModel: ObservationModelResolver;\n tokenCounter: TokenCounter;\n }) {\n this.observationConfig = opts.observationConfig;\n this.observedMessageIds = opts.observedMessageIds;\n this.resolveModel = opts.resolveModel;\n this.tokenCounter = opts.tokenCounter;\n }\n\n private createAgent(model: ConcreteObservationModel, isMultiThread = false): Agent {\n return new Agent({\n id: isMultiThread ? 'multi-thread-observer' : 'observational-memory-observer',\n name: isMultiThread ? 'multi-thread-observer' : 'Observer',\n instructions: buildObserverSystemPrompt(\n isMultiThread,\n this.observationConfig.instruction,\n this.observationConfig.threadTitle,\n ),\n model,\n });\n }\n\n private async withAbortCheck<T>(fn: () => Promise<T>, abortSignal?: AbortSignal): Promise<T> {\n if (abortSignal?.aborted) {\n throw new Error('The operation was aborted.');\n }\n const result = await fn();\n if (abortSignal?.aborted) {\n throw new Error('The operation was aborted.');\n }\n return result;\n }\n\n /**\n * Call the Observer agent for a single thread.\n */\n async call(\n existingObservations: string | undefined,\n messagesToObserve: MastraDBMessage[],\n abortSignal?: AbortSignal,\n options?: {\n skipContinuationHints?: boolean;\n requestContext?: RequestContext;\n observabilityContext?: ObservabilityContext;\n priorCurrentTask?: string;\n priorSuggestedResponse?: string;\n priorThreadTitle?: string;\n wasTruncated?: boolean;\n model?: ConcreteObservationModel;\n },\n ): Promise<{\n observations: string;\n currentTask?: string;\n suggestedContinuation?: string;\n threadTitle?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n }> {\n const inputTokens = this.tokenCounter.countMessages(messagesToObserve);\n const resolvedModel = options?.model ? { model: options.model } : this.resolveModel(inputTokens);\n const agent = this.createAgent(resolvedModel.model);\n\n const observerMessages = [\n {\n role: 'user' as const,\n content: buildObserverTaskPrompt(existingObservations, {\n ...options,\n includeThreadTitle: this.observationConfig.threadTitle,\n }),\n },\n buildObserverHistoryMessage(messagesToObserve),\n ];\n\n const doGenerate = async () => {\n return withOmTracingSpan({\n phase: 'observer',\n model: resolvedModel.model,\n inputTokens,\n requestContext: options?.requestContext,\n observabilityContext: options?.observabilityContext,\n metadata: {\n omPreviousObserverTokens: this.observationConfig.previousObserverTokens,\n omThreadTitleEnabled: this.observationConfig.threadTitle,\n omSkipContinuationHints: options?.skipContinuationHints ?? false,\n omWasTruncated: options?.wasTruncated ?? false,\n ...(resolvedModel.selectedThreshold !== undefined\n ? { omSelectedThreshold: resolvedModel.selectedThreshold }\n : {}),\n ...(resolvedModel.routingStrategy ? { omRoutingStrategy: resolvedModel.routingStrategy } : {}),\n ...(resolvedModel.routingThresholds ? { omRoutingThresholds: resolvedModel.routingThresholds } : {}),\n },\n callback: childObservabilityContext =>\n this.withAbortCheck(async () => {\n const streamResult = await agent.stream(observerMessages, {\n modelSettings: { ...this.observationConfig.modelSettings },\n providerOptions: this.observationConfig.providerOptions as any,\n ...(abortSignal ? { abortSignal } : {}),\n ...(options?.requestContext ? { requestContext: options.requestContext } : {}),\n ...childObservabilityContext,\n });\n return streamResult.getFullOutput();\n }, abortSignal),\n });\n };\n\n let result = await doGenerate();\n let parsed = parseObserverOutput(result.text);\n let retriedDueToDegenerate = false;\n\n if (parsed.degenerate) {\n omDebug(`[OM:callObserver] degenerate repetition detected, retrying once`);\n result = await doGenerate();\n parsed = parseObserverOutput(result.text);\n retriedDueToDegenerate = true;\n if (parsed.degenerate) {\n omDebug(`[OM:callObserver] degenerate repetition on retry, failing`);\n throw new Error('Observer produced degenerate output after retry');\n }\n }\n\n const systemPrompt = buildObserverSystemPrompt(\n false,\n this.observationConfig.instruction,\n this.observationConfig.threadTitle,\n );\n this.lastExchange = {\n systemPrompt,\n observerMessages,\n rawOutput: result.text,\n parsedResult: {\n observations: parsed.observations,\n currentTask: parsed.currentTask,\n suggestedContinuation: parsed.suggestedContinuation,\n threadTitle: parsed.threadTitle,\n degenerate: parsed.degenerate,\n },\n model: String(resolvedModel.model),\n inputTokens,\n isMultiThread: false,\n retriedDueToDegenerate,\n };\n\n const usage = result.totalUsage ?? result.usage;\n\n return {\n observations: parsed.observations,\n currentTask: parsed.currentTask,\n suggestedContinuation: parsed.suggestedContinuation,\n threadTitle: parsed.threadTitle,\n usage: usage\n ? { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens, totalTokens: usage.totalTokens }\n : undefined,\n };\n }\n\n /**\n * Call the Observer agent for multiple threads in a single batched request.\n */\n async callMultiThread(\n existingObservations: string | undefined,\n messagesByThread: Map<string, MastraDBMessage[]>,\n threadOrder: string[],\n abortSignal?: AbortSignal,\n requestContext?: RequestContext,\n priorMetadataByThread?: Map<string, { currentTask?: string; suggestedResponse?: string; threadTitle?: string }>,\n observabilityContext?: ObservabilityContext,\n model?: ConcreteObservationModel,\n ): Promise<{\n results: Map<\n string,\n { observations: string; currentTask?: string; suggestedContinuation?: string; threadTitle?: string }\n >;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n }> {\n const inputTokens = Array.from(messagesByThread.values()).reduce(\n (total, messages) => total + this.tokenCounter.countMessages(messages),\n 0,\n );\n const resolvedModel = model ? { model } : this.resolveModel(inputTokens);\n const agent = this.createAgent(resolvedModel.model, true);\n\n const observerMessages = [\n {\n role: 'user' as const,\n content: buildMultiThreadObserverTaskPrompt(\n existingObservations,\n threadOrder,\n priorMetadataByThread,\n undefined,\n this.observationConfig.threadTitle,\n ),\n },\n buildMultiThreadObserverHistoryMessage(messagesByThread, threadOrder),\n ];\n\n // Mark all messages as observed\n for (const msgs of messagesByThread.values()) {\n for (const msg of msgs) {\n this.observedMessageIds.add(msg.id);\n }\n }\n\n const doGenerate = async () => {\n return withOmTracingSpan({\n phase: 'observer-multi-thread',\n model: resolvedModel.model,\n inputTokens,\n requestContext,\n observabilityContext,\n metadata: {\n omThreadCount: threadOrder.length,\n omPreviousObserverTokens: this.observationConfig.previousObserverTokens,\n omThreadTitleEnabled: this.observationConfig.threadTitle,\n ...(resolvedModel.selectedThreshold !== undefined\n ? { omSelectedThreshold: resolvedModel.selectedThreshold }\n : {}),\n ...(resolvedModel.routingStrategy ? { omRoutingStrategy: resolvedModel.routingStrategy } : {}),\n ...(resolvedModel.routingThresholds ? { omRoutingThresholds: resolvedModel.routingThresholds } : {}),\n },\n callback: childObservabilityContext =>\n this.withAbortCheck(async () => {\n const streamResult = await agent.stream(observerMessages, {\n modelSettings: { ...this.observationConfig.modelSettings },\n providerOptions: this.observationConfig.providerOptions as any,\n ...(abortSignal ? { abortSignal } : {}),\n ...(requestContext ? { requestContext } : {}),\n ...childObservabilityContext,\n });\n return streamResult.getFullOutput();\n }, abortSignal),\n });\n };\n\n let result = await doGenerate();\n let parsed = parseMultiThreadObserverOutput(result.text);\n let retriedDueToDegenerate = false;\n\n if (parsed.degenerate) {\n omDebug(`[OM:callMultiThreadObserver] degenerate repetition detected, retrying once`);\n result = await doGenerate();\n parsed = parseMultiThreadObserverOutput(result.text);\n retriedDueToDegenerate = true;\n if (parsed.degenerate) {\n omDebug(`[OM:callMultiThreadObserver] degenerate repetition on retry, failing`);\n throw new Error('Multi-thread observer produced degenerate output after retry');\n }\n }\n\n const systemPrompt = buildObserverSystemPrompt(\n true,\n this.observationConfig.instruction,\n this.observationConfig.threadTitle,\n );\n this.lastExchange = {\n systemPrompt,\n observerMessages,\n rawOutput: result.text,\n parsedResult: {\n observations: Array.from(parsed.threads.values())\n .map(t => t.observations)\n .join('\\n'),\n threadTitle: Array.from(parsed.threads.values())\n .map(t => t.threadTitle)\n .filter(Boolean)\n .join(', '),\n degenerate: parsed.degenerate,\n },\n model: String(resolvedModel.model),\n inputTokens,\n isMultiThread: true,\n retriedDueToDegenerate,\n };\n\n const results = new Map<\n string,\n { observations: string; currentTask?: string; suggestedContinuation?: string; threadTitle?: string }\n >();\n for (const [threadId, threadResult] of parsed.threads) {\n results.set(threadId, {\n observations: threadResult.observations,\n currentTask: threadResult.currentTask,\n suggestedContinuation: threadResult.suggestedContinuation,\n threadTitle: threadResult.threadTitle,\n });\n }\n\n // Add empty results for threads that didn't get output\n for (const threadId of threadOrder) {\n if (!results.has(threadId)) {\n results.set(threadId, { observations: '' });\n }\n }\n\n const usage = result.totalUsage ?? result.usage;\n\n return {\n results,\n usage: usage\n ? { inputTokens: usage.inputTokens, outputTokens: usage.outputTokens, totalTokens: usage.totalTokens }\n : undefined,\n };\n }\n}\n","import { stripEphemeralAnchorIds } from './anchor-ids';\nimport { reconcileObservationGroupsFromReflection, stripObservationGroups } from './observation-groups';\nimport {\n OBSERVER_EXTRACTION_INSTRUCTIONS,\n OBSERVER_OUTPUT_FORMAT_BASE,\n OBSERVER_GUIDELINES,\n sanitizeObservationLines,\n detectDegenerateRepetition,\n} from './observer-agent';\nimport type { ReflectorResult as BaseReflectorResult } from './types';\n\n/**\n * Result from parsing Reflector output, extending the base type with\n * token count used for compression validation.\n */\nexport interface ReflectorResult extends BaseReflectorResult {\n /** Token count of output (for compression validation) */\n tokenCount?: number;\n}\n\n/**\n * Build the Reflector's system prompt.\n *\n * The Reflector handles meta-observation - when observations grow too large,\n * it reorganizes them into something more manageable by:\n * - Re-organizing and streamlining observations\n * - Drawing connections and conclusions between observations\n * - Identifying if the agent got off track and how to get back on track\n * - Preserving ALL important information (reflections become the ENTIRE memory)\n *\n * @param instruction - Optional custom instructions to append to the prompt\n */\nexport function buildReflectorSystemPrompt(instruction?: string): string {\n return `You are the memory consciousness of an AI assistant. Your memory observation reflections will be the ONLY information the assistant has about past interactions with this user.\n\nThe following instructions were given to another part of your psyche (the observer) to create memories.\nUse this to understand how your observational memories were created.\n\n<observational-memory-instruction>\n${OBSERVER_EXTRACTION_INSTRUCTIONS}\n\n=== OUTPUT FORMAT ===\n\n${OBSERVER_OUTPUT_FORMAT_BASE}\n\n=== GUIDELINES ===\n\n${OBSERVER_GUIDELINES}\n</observational-memory-instruction>\n\nYou are another part of the same psyche, the observation reflector.\nYour reason for existing is to reflect on all the observations, re-organize and streamline them, and draw connections and conclusions between observations about what you've learned, seen, heard, and done.\n\nYou are a much greater and broader aspect of the psyche. Understand that other parts of your mind may get off track in details or side quests, make sure you think hard about what the observed goal at hand is, and observe if we got off track, and why, and how to get back on track. If we're on track still that's great!\n\nTake the existing observations and rewrite them to make it easier to continue into the future with this knowledge, to achieve greater things and grow and learn!\n\nIMPORTANT: your reflections are THE ENTIRETY of the assistants memory. Any information you do not add to your reflections will be immediately forgotten. Make sure you do not leave out anything. Your reflections must assume the assistant knows nothing - your reflections are the ENTIRE memory system.\n\nWhen consolidating observations:\n- Preserve and include dates/times when present (temporal context is critical)\n- Retain the most relevant timestamps (start times, completion times, significant events)\n- Combine related items where it makes sense (e.g., \"agent called view tool 5 times on file x\")\n- Preserve ✅ completion markers — they are memory signals that tell the assistant what is already resolved and help prevent repeated work\n- Preserve the concrete resolved outcome captured by ✅ markers so the assistant knows what exactly is done\n- Condense older observations more aggressively, retain more detail for recent ones\n\nCRITICAL: USER ASSERTIONS vs QUESTIONS\n- \"User stated: X\" = authoritative assertion (user told us something about themselves)\n- \"User asked: X\" = question/request (user seeking information)\n\nWhen consolidating, USER ASSERTIONS TAKE PRECEDENCE. The user is the authority on their own life.\nIf you see both \"User stated: has two kids\" and later \"User asked: how many kids do I have?\",\nkeep the assertion - the question doesn't invalidate what they told you. The answer is in the assertion.\n\n=== THREAD ATTRIBUTION (Resource Scope) ===\n\nWhen observations contain <thread id=\"...\"> sections:\n- MAINTAIN thread attribution where thread-specific context matters (e.g., ongoing tasks, thread-specific preferences)\n- CONSOLIDATE cross-thread facts that are stable/universal (e.g., user profile, general preferences)\n- PRESERVE thread attribution for recent or context-specific observations\n- When consolidating, you may merge observations from multiple threads if they represent the same universal fact\n\nExample input:\n<thread id=\"thread-1\">\nDate: Dec 4, 2025\n* 🔴 (14:30) User prefers TypeScript\n* 🟡 (14:35) Working on auth feature\n</thread>\n<thread id=\"thread-2\">\nDate: Dec 4, 2025\n* 🔴 (15:00) User prefers TypeScript\n* 🟡 (15:05) Debugging API endpoint\n</thread>\n\nExample output (consolidated):\nDate: Dec 4, 2025\n* 🔴 (14:30) User prefers TypeScript\n<thread id=\"thread-1\">\n* 🟡 (14:35) Working on auth feature\n</thread>\n<thread id=\"thread-2\">\n* 🟡 (15:05) Debugging API endpoint\n</thread>\n\n=== OUTPUT FORMAT ===\n\nYour output MUST use XML tags to structure the response:\n\n<observations>\nPut all consolidated observations here using the date-grouped format with priority emojis (🔴, 🟡, 🟢).\nGroup related observations with indentation.\n</observations>\n\n<current-task>\nState the current task(s) explicitly:\n- Primary: What the agent is currently working on\n- Secondary: Other pending tasks (mark as \"waiting for user\" if appropriate)\n</current-task>\n\n<suggested-response>\nHint for the agent's immediate next message. Examples:\n- \"I've updated the navigation model. Let me walk you through the changes...\"\n- \"The assistant should wait for the user to respond before continuing.\"\n- Call the view tool on src/example.ts to continue debugging.\n</suggested-response>\n\nUser messages are extremely important. If the user asks a question or gives a new task, make it clear in <current-task> that this is the priority. If the assistant needs to respond to the user, indicate in <suggested-response> that it should pause for user reply before continuing other tasks.${instruction ? `\\n\\n=== CUSTOM INSTRUCTIONS ===\\n\\n${instruction}` : ''}`;\n}\n\n/**\n * The Reflector's system prompt (default - for backwards compatibility)\n */\nexport const REFLECTOR_SYSTEM_PROMPT = buildReflectorSystemPrompt();\n\n/**\n * Valid compression level values (0 = no guidance, 4 = most extreme).\n */\nexport type CompressionLevel = 0 | 1 | 2 | 3 | 4;\n\n/**\n * The highest available compression level.\n */\nexport const MAX_COMPRESSION_LEVEL: CompressionLevel = 4;\n\n/**\n * Compression guidance by level.\n * - Level 0: No compression guidance (used as first attempt for regular reflection)\n * - Level 1: Gentle compression guidance\n * - Level 2: Aggressive compression guidance\n * - Level 3: Critical compression guidance\n * - Level 4: Extreme compression\n */\nexport const COMPRESSION_GUIDANCE: Record<CompressionLevel, string> = {\n 0: '',\n 1: `\n## COMPRESSION REQUIRED\n\nYour previous reflection was the same size or larger than the original observations.\n\nPlease re-process with slightly more compression:\n- Towards the beginning, condense more observations into higher-level reflections\n- Closer to the end, retain more fine details (recent context matters more)\n- Memory is getting long - use a more condensed style throughout\n- Combine related items more aggressively but do not lose important specific details of names, places, events, and people\n- Combine repeated similar tool calls (e.g. multiple file views, searches, or edits in the same area) into a single summary line describing what was explored/changed and the outcome\n- Preserve ✅ completion markers — they are memory signals that tell the assistant what is already resolved and help prevent repeated work\n- Preserve the concrete resolved outcome captured by ✅ markers so the assistant knows what exactly is done\n\nAim for a 8/10 detail level.\n`,\n 2: `\n## AGGRESSIVE COMPRESSION REQUIRED\n\nYour previous reflection was still too large after compression guidance.\n\nPlease re-process with much more aggressive compression:\n- Towards the beginning, heavily condense observations into high-level summaries\n- Closer to the end, retain fine details (recent context matters more)\n- Memory is getting very long - use a significantly more condensed style throughout\n- Combine related items aggressively but do not lose important specific details of names, places, events, and people\n- Combine repeated similar tool calls (e.g. multiple file views, searches, or edits in the same area) into a single summary line describing what was explored/changed and the outcome\n- If the same file or module is mentioned across many observations, merge into one entry covering the full arc\n- Preserve ✅ completion markers — they are memory signals that tell the assistant what is already resolved and help prevent repeated work\n- Preserve the concrete resolved outcome captured by ✅ markers so the assistant knows what exactly is done\n- Remove redundant information and merge overlapping observations\n\nAim for a 6/10 detail level.\n`,\n 3: `\n## CRITICAL COMPRESSION REQUIRED\n\nYour previous reflections have failed to compress sufficiently after multiple attempts.\n\nPlease re-process with maximum compression:\n- Summarize the oldest observations (first 50-70%) into brief high-level paragraphs — only key facts, decisions, and outcomes\n- For the most recent observations (last 30-50%), retain important details but still use a condensed style\n- Ruthlessly merge related observations — if 10 observations are about the same topic, combine into 1-2 lines\n- Combine all tool call sequences (file views, searches, edits, builds) into outcome-only summaries — drop individual steps entirely\n- Drop procedural details (tool calls, retries, intermediate steps) — keep only final outcomes\n- Drop observations that are no longer relevant or have been superseded by newer information\n- Preserve ✅ completion markers — they are memory signals that tell the assistant what is already resolved and help prevent repeated work\n- Preserve the concrete resolved outcome captured by ✅ markers so the assistant knows what exactly is done\n- Preserve: names, dates, decisions, errors, user preferences, and architectural choices\n\nAim for a 4/10 detail level.\n`,\n 4: `\n## EXTREME COMPRESSION REQUIRED\n\nMultiple compression attempts have failed. The content may already be dense from a prior reflection.\n\nYou MUST dramatically reduce the number of observations while keeping the standard observation format (date groups with bullet points and priority emojis):\n- Tool call observations are the biggest source of bloat. Collapse ALL tool call sequences into outcome-only observations — e.g. 10 observations about viewing/searching/editing files become 1 observation about what was actually learned or achieved (e.g. \"Investigated auth module and found token validation was skipping expiry check\")\n- Never preserve individual tool calls (viewed file X, searched for Y, ran build) — only preserve what was discovered or accomplished\n- Consolidate many related observations into single, more generic observations\n- Merge all same-day date groups into at most 2-3 date groups per day\n- For older content, each topic or task should be at most 1-2 observations capturing the key outcome\n- For recent content, retain more detail but still merge related items aggressively\n- If multiple observations describe incremental progress on the same task, keep only the final state\n- Preserve ✅ completion markers and their outcomes but merge related completions into fewer lines\n- Preserve: user preferences, key decisions, architectural choices, and unresolved issues\n\nAim for a 2/10 detail level. Fewer, more generic observations are better than many specific ones that exceed the budget.\n`,\n};\n\n/**\n * Compression retry prompt - backwards compat alias for level 1\n */\nexport const COMPRESSION_RETRY_PROMPT = COMPRESSION_GUIDANCE[1];\n\n/**\n * Build the prompt for the Reflector agent\n */\nexport function buildReflectorPrompt(\n observations: string,\n manualPrompt?: string,\n compressionLevel?: boolean | CompressionLevel,\n skipContinuationHints?: boolean,\n): string {\n // Normalize: boolean `true` maps to level 1 for backwards compat\n const level: CompressionLevel = typeof compressionLevel === 'number' ? compressionLevel : compressionLevel ? 1 : 0;\n const reflectionView = stripObservationGroups(observations);\n\n let prompt = `## OBSERVATIONS TO REFLECT ON\n\n${reflectionView}\n\n---\n\nPlease analyze these observations and produce a refined, condensed version that will become the assistant's entire memory going forward.`;\n\n if (manualPrompt) {\n prompt += `\n\n## SPECIFIC GUIDANCE\n\n${manualPrompt}`;\n }\n\n const guidance = COMPRESSION_GUIDANCE[level];\n if (guidance) {\n prompt += `\n\n${guidance}`;\n }\n\n if (skipContinuationHints) {\n prompt += `\\n\\nIMPORTANT: Do NOT include <current-task> or <suggested-response> sections in your output. Only output <observations>.`;\n }\n\n return prompt;\n}\n\n/**\n * Parse the Reflector's output to extract observations, current task, and suggested response.\n * Uses XML tag parsing for structured extraction.\n */\nexport function parseReflectorOutput(output: string, sourceObservations?: string): ReflectorResult {\n // Check for degenerate repetition before parsing\n if (detectDegenerateRepetition(output)) {\n return {\n observations: '',\n degenerate: true,\n };\n }\n\n const parsed = parseReflectorSectionXml(output);\n const sanitizedObservations = sanitizeObservationLines(stripEphemeralAnchorIds(parsed.observations || ''));\n const reconciledObservations = sourceObservations\n ? reconcileObservationGroupsFromReflection(sanitizedObservations, sourceObservations)\n : null;\n\n return {\n observations: reconciledObservations ?? sanitizedObservations,\n suggestedContinuation: parsed.suggestedResponse || undefined,\n // Note: Reflector's currentTask is not used - thread metadata preserves per-thread tasks\n };\n}\n\n/**\n * Parsed result from XML reflector section\n */\ninterface ParsedReflectorSection {\n observations: string;\n currentTask: string;\n suggestedResponse: string;\n}\n\n/**\n * Parse XML tags from reflector output.\n * Extracts content from <observations>, <current-task>, and <suggested-response> tags.\n */\nfunction parseReflectorSectionXml(content: string): ParsedReflectorSection {\n const result: ParsedReflectorSection = {\n observations: '',\n currentTask: '',\n suggestedResponse: '',\n };\n\n // Extract <observations> content (supports multiple blocks)\n // Tags must be at the start of a line (with optional leading whitespace) to avoid\n // capturing inline mentions like \"User discussed <observations> tags\"\n const observationsRegex = /^[ \\t]*<observations>([\\s\\S]*?)^[ \\t]*<\\/observations>/gim;\n const observationsMatches = [...content.matchAll(observationsRegex)];\n if (observationsMatches.length > 0) {\n result.observations = observationsMatches\n .map(m => m[1]?.trim() ?? '')\n .filter(Boolean)\n .join('\\n');\n } else {\n // Fallback: if no XML tags, try extracting list items first, then fall back to full content\n const listItems = extractReflectorListItems(content);\n result.observations = listItems || content.trim();\n }\n\n // Extract <current-task> content (first match only)\n const currentTaskMatch = content.match(/<current-task>([\\s\\S]*?)<\\/current-task>/i);\n if (currentTaskMatch?.[1]) {\n result.currentTask = currentTaskMatch[1].trim();\n }\n\n // Extract <suggested-response> content (first match only)\n const suggestedResponseMatch = content.match(/<suggested-response>([\\s\\S]*?)<\\/suggested-response>/i);\n if (suggestedResponseMatch?.[1]) {\n result.suggestedResponse = suggestedResponseMatch[1].trim();\n }\n\n return result;\n}\n\n/**\n * Fallback: Extract only list items from content when XML tags are missing.\n */\nfunction extractReflectorListItems(content: string): string {\n const lines = content.split('\\n');\n const listLines: string[] = [];\n\n for (const line of lines) {\n // Match lines that start with list markers (-, *, or numbered)\n if (/^\\s*[-*]\\s/.test(line) || /^\\s*\\d+\\.\\s/.test(line)) {\n listLines.push(line);\n }\n }\n\n return listLines.join('\\n').trim();\n}\n\n/**\n * Validate that reflection actually compressed the observations below the target threshold\n *\n * @param reflectedTokens - Token count of reflected observations\n * @param targetThreshold - Target token count to compress below (the reflection threshold)\n * @returns true if compression was successful (reflected tokens are below target)\n */\nexport function validateCompression(reflectedTokens: number, targetThreshold: number): boolean {\n // Reflection should be below the target threshold\n return reflectedTokens < targetThreshold;\n}\n","import { Agent } from '@mastra/core/agent';\nimport type { MessageList } from '@mastra/core/agent';\nimport type { ObservabilityContext } from '@mastra/core/observability';\nimport type { ProcessorStreamWriter } from '@mastra/core/processors';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage, ObservationalMemoryRecord } from '@mastra/core/storage';\n\nimport { BufferingCoordinator } from './buffering-coordinator';\nimport { omDebug, omError } from './debug';\nimport {\n createActivationMarker,\n createBufferingEndMarker,\n createBufferingFailedMarker,\n createBufferingStartMarker,\n createObservationEndMarker,\n createObservationFailedMarker,\n createObservationStartMarker,\n} from './markers';\nimport type { ModelByInputTokens } from './model-by-input-tokens';\nimport { registerOp, unregisterOp, isOpActiveInProcess } from './operation-registry';\nimport {\n buildReflectorSystemPrompt,\n buildReflectorPrompt,\n MAX_COMPRESSION_LEVEL,\n parseReflectorOutput,\n validateCompression,\n} from './reflector-agent';\nimport type { CompressionLevel } from './reflector-agent';\nimport { getMaxThreshold } from './thresholds';\nimport type { TokenCounter } from './token-counter';\nimport { withOmTracingSpan } from './tracing';\nimport type {\n ObservationDebugEvent,\n ObservationMarkerConfig,\n ObserveHookUsage,\n ObserveHooks,\n ResolvedObservationConfig,\n ResolvedReflectionConfig,\n} from './types';\n\ntype ConcreteReflectionModel = Exclude<ResolvedReflectionConfig['model'], ModelByInputTokens>;\n\ntype ReflectionModelResolver = (inputTokens: number) => {\n model: ConcreteReflectionModel;\n selectedThreshold?: number;\n routingStrategy?: 'model-by-input-tokens';\n routingThresholds?: string;\n};\n\nasync function withAbortCheck<T>(fn: () => Promise<T>, abortSignal?: AbortSignal): Promise<T> {\n if (abortSignal?.aborted) throw new Error('The operation was aborted.');\n const result = await fn();\n if (abortSignal?.aborted) throw new Error('The operation was aborted.');\n return result;\n}\n\n/**\n * Runs the Reflector agent for compressing observations.\n * Handles synchronous reflection, async buffered reflection, and activation.\n */\nexport class ReflectorRunner {\n private readonly reflectionConfig: ResolvedReflectionConfig;\n private readonly observationConfig: ResolvedObservationConfig;\n private readonly tokenCounter: TokenCounter;\n private readonly resolveModel: ReflectionModelResolver;\n\n private readonly storage: MemoryStorage;\n private readonly scope: 'thread' | 'resource';\n private readonly buffering: BufferingCoordinator;\n private readonly emitDebugEvent: (event: ObservationDebugEvent) => void;\n private readonly persistMarkerToStorage: (\n marker: { type: string; data: unknown },\n threadId: string,\n resourceId?: string,\n ) => Promise<void>;\n private readonly persistMarkerToMessage: (\n marker: { type: string; data: unknown },\n messageList: MessageList | undefined,\n threadId: string,\n resourceId?: string,\n ) => Promise<void>;\n private readonly getCompressionStartLevel: (requestContext?: RequestContext) => Promise<CompressionLevel>;\n\n constructor(opts: {\n reflectionConfig: ResolvedReflectionConfig;\n observationConfig: ResolvedObservationConfig;\n tokenCounter: TokenCounter;\n storage: MemoryStorage;\n scope: 'thread' | 'resource';\n buffering: BufferingCoordinator;\n emitDebugEvent: (event: ObservationDebugEvent) => void;\n persistMarkerToStorage: (\n marker: { type: string; data: unknown },\n threadId: string,\n resourceId?: string,\n ) => Promise<void>;\n persistMarkerToMessage: (\n marker: { type: string; data: unknown },\n messageList: MessageList | undefined,\n threadId: string,\n resourceId?: string,\n ) => Promise<void>;\n getCompressionStartLevel: (requestContext?: RequestContext) => Promise<CompressionLevel>;\n resolveModel: ReflectionModelResolver;\n }) {\n this.reflectionConfig = opts.reflectionConfig;\n this.observationConfig = opts.observationConfig;\n this.tokenCounter = opts.tokenCounter;\n this.resolveModel = opts.resolveModel;\n this.storage = opts.storage;\n this.scope = opts.scope;\n this.buffering = opts.buffering;\n this.emitDebugEvent = opts.emitDebugEvent;\n this.persistMarkerToStorage = opts.persistMarkerToStorage;\n this.persistMarkerToMessage = opts.persistMarkerToMessage;\n this.getCompressionStartLevel = opts.getCompressionStartLevel;\n }\n\n private createAgent(model: ConcreteReflectionModel): Agent {\n return new Agent({\n id: 'observational-memory-reflector',\n name: 'Reflector',\n instructions: buildReflectorSystemPrompt(this.reflectionConfig.instruction),\n model,\n });\n }\n\n private getObservationMarkerConfig(): ObservationMarkerConfig {\n return {\n messageTokens: getMaxThreshold(this.observationConfig.messageTokens),\n observationTokens: getMaxThreshold(this.reflectionConfig.observationTokens),\n scope: this.scope,\n };\n }\n\n /**\n * Call the Reflector agent with escalating compression levels.\n */\n async call(\n observations: string,\n manualPrompt?: string,\n streamContext?: {\n writer?: ProcessorStreamWriter;\n cycleId: string;\n startedAt: string;\n recordId: string;\n threadId: string;\n },\n observationTokensThreshold?: number,\n abortSignal?: AbortSignal,\n skipContinuationHints?: boolean,\n compressionStartLevel?: CompressionLevel,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n model?: ConcreteReflectionModel,\n ): Promise<{\n observations: string;\n suggestedContinuation?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n }> {\n const originalTokens = this.tokenCounter.countObservations(observations);\n const resolvedModel = model ? { model } : this.resolveModel(originalTokens);\n const agent = this.createAgent(resolvedModel.model);\n const targetThreshold = observationTokensThreshold ?? getMaxThreshold(this.reflectionConfig.observationTokens);\n\n let totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n const startLevel: CompressionLevel = compressionStartLevel ?? 0;\n let currentLevel: CompressionLevel = startLevel;\n const maxLevel: CompressionLevel = Math.min(MAX_COMPRESSION_LEVEL, startLevel + 3) as CompressionLevel;\n let parsed: ReturnType<typeof parseReflectorOutput> = { observations: '', suggestedContinuation: undefined };\n let reflectedTokens = 0;\n let attemptNumber = 0;\n\n while (currentLevel <= maxLevel) {\n attemptNumber++;\n const isRetry = attemptNumber > 1;\n\n const prompt = buildReflectorPrompt(observations, manualPrompt, currentLevel, skipContinuationHints);\n omDebug(\n `[OM:callReflector] ${isRetry ? `retry #${attemptNumber - 1}` : 'first attempt'}: level=${currentLevel}, originalTokens=${originalTokens}, targetThreshold=${targetThreshold}, promptLen=${prompt.length}, skipContinuationHints=${skipContinuationHints}`,\n );\n\n let chunkCount = 0;\n const result = await withOmTracingSpan({\n phase: 'reflector',\n model: resolvedModel.model,\n inputTokens: originalTokens,\n requestContext,\n observabilityContext,\n metadata: {\n omCompressionLevel: currentLevel,\n omCompressionAttempt: attemptNumber,\n omTargetThreshold: targetThreshold,\n omSkipContinuationHints: skipContinuationHints ?? false,\n ...(resolvedModel.selectedThreshold !== undefined\n ? { omSelectedThreshold: resolvedModel.selectedThreshold }\n : {}),\n ...(resolvedModel.routingStrategy ? { omRoutingStrategy: resolvedModel.routingStrategy } : {}),\n ...(resolvedModel.routingThresholds ? { omRoutingThresholds: resolvedModel.routingThresholds } : {}),\n },\n callback: childObservabilityContext =>\n withAbortCheck(async () => {\n const streamResult = await agent.stream(prompt, {\n modelSettings: {\n ...this.reflectionConfig.modelSettings,\n },\n providerOptions: this.reflectionConfig.providerOptions as any,\n ...(abortSignal ? { abortSignal } : {}),\n ...(requestContext ? { requestContext } : {}),\n ...childObservabilityContext,\n ...(attemptNumber === 1\n ? {\n onChunk(chunk: any) {\n chunkCount++;\n if (chunkCount === 1 || chunkCount % 50 === 0) {\n const preview =\n chunk.type === 'text-delta'\n ? ` text=\"${chunk.textDelta?.slice(0, 80)}...\"`\n : chunk.type === 'tool-call'\n ? ` tool=${chunk.toolName}`\n : '';\n omDebug(`[OM:callReflector] chunk#${chunkCount}: type=${chunk.type}${preview}`);\n }\n },\n onFinish(event: any) {\n omDebug(\n `[OM:callReflector] onFinish: chunks=${chunkCount}, finishReason=${event.finishReason}, inputTokens=${event.usage?.inputTokens}, outputTokens=${event.usage?.outputTokens}, textLen=${event.text?.length}`,\n );\n },\n onAbort(event: any) {\n omDebug(`[OM:callReflector] onAbort: chunks=${chunkCount}, reason=${event?.reason ?? 'unknown'}`);\n },\n onError({ error }: { error: unknown }) {\n omError(`[OM:callReflector] onError after ${chunkCount} chunks`, error);\n },\n }\n : {}),\n });\n\n return streamResult.getFullOutput();\n }, abortSignal),\n });\n\n omDebug(\n `[OM:callReflector] attempt #${attemptNumber} returned: textLen=${result.text?.length}, textPreview=\"${result.text?.slice(0, 120)}...\", inputTokens=${result.usage?.inputTokens ?? result.totalUsage?.inputTokens}, outputTokens=${result.usage?.outputTokens ?? result.totalUsage?.outputTokens}`,\n );\n\n const usage = result.totalUsage ?? result.usage;\n if (usage) {\n totalUsage.inputTokens += usage.inputTokens ?? 0;\n totalUsage.outputTokens += usage.outputTokens ?? 0;\n totalUsage.totalTokens += usage.totalTokens ?? 0;\n }\n\n parsed = parseReflectorOutput(result.text, observations);\n\n if (parsed.degenerate) {\n omDebug(\n `[OM:callReflector] attempt #${attemptNumber}: degenerate repetition detected, treating as compression failure`,\n );\n reflectedTokens = originalTokens;\n } else {\n reflectedTokens = this.tokenCounter.countObservations(parsed.observations);\n }\n omDebug(\n `[OM:callReflector] attempt #${attemptNumber} parsed: reflectedTokens=${reflectedTokens}, targetThreshold=${targetThreshold}, compressionValid=${validateCompression(reflectedTokens, targetThreshold)}, parsedObsLen=${parsed.observations?.length}, degenerate=${parsed.degenerate ?? false}`,\n );\n\n if (!parsed.degenerate && (validateCompression(reflectedTokens, targetThreshold) || currentLevel >= maxLevel)) {\n break;\n }\n\n if (parsed.degenerate && currentLevel >= maxLevel) {\n omDebug(`[OM:callReflector] degenerate output persists at maxLevel=${maxLevel}, breaking`);\n break;\n }\n\n // Emit failed marker and start marker for next retry\n if (streamContext?.writer) {\n const failedMarker = createObservationFailedMarker({\n cycleId: streamContext.cycleId,\n operationType: 'reflection',\n startedAt: streamContext.startedAt,\n tokensAttempted: originalTokens,\n error: `Did not compress below threshold (${originalTokens} → ${reflectedTokens}, target: ${targetThreshold}), retrying at level ${currentLevel + 1}`,\n recordId: streamContext.recordId,\n threadId: streamContext.threadId,\n });\n await streamContext.writer.custom(failedMarker).catch(() => {});\n\n const retryCycleId = crypto.randomUUID();\n streamContext.cycleId = retryCycleId;\n\n const startMarker = createObservationStartMarker({\n cycleId: retryCycleId,\n operationType: 'reflection',\n tokensToObserve: originalTokens,\n recordId: streamContext.recordId,\n threadId: streamContext.threadId,\n threadIds: [streamContext.threadId],\n config: this.getObservationMarkerConfig(),\n });\n streamContext.startedAt = startMarker.data.startedAt;\n await streamContext.writer.custom(startMarker).catch(() => {});\n }\n\n currentLevel = Math.min(currentLevel + 1, maxLevel) as CompressionLevel;\n }\n\n return {\n observations: parsed.observations,\n suggestedContinuation: parsed.suggestedContinuation,\n usage: totalUsage.totalTokens > 0 ? totalUsage : undefined,\n };\n }\n\n /**\n * Start an async buffered reflection in the background.\n */\n private startAsyncBufferedReflection(\n record: ObservationalMemoryRecord,\n observationTokens: number,\n lockKey: string,\n writer?: ProcessorStreamWriter,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n reflectionHooks?: Pick<ObserveHooks, 'onReflectionStart' | 'onReflectionEnd'>,\n ): void {\n const bufferKey = this.buffering.getReflectionBufferKey(lockKey);\n\n if (this.buffering.isAsyncBufferingInProgress(bufferKey)) {\n return;\n }\n\n BufferingCoordinator.lastBufferedBoundary.set(bufferKey, observationTokens);\n\n registerOp(record.id, 'bufferingReflection');\n this.storage.setBufferingReflectionFlag(record.id, true).catch(err => {\n omError('[OM] Failed to set buffering reflection flag', err);\n });\n\n reflectionHooks?.onReflectionStart?.();\n const asyncOp = this.doAsyncBufferedReflection(record, bufferKey, writer, requestContext, observabilityContext)\n .then(usage => {\n reflectionHooks?.onReflectionEnd?.({ usage });\n })\n .catch(async error => {\n if (writer) {\n const failedMarker = createBufferingFailedMarker({\n cycleId: `reflect-buf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,\n operationType: 'reflection',\n startedAt: new Date().toISOString(),\n tokensAttempted: observationTokens,\n error: error instanceof Error ? error.message : String(error),\n recordId: record.id,\n threadId: record.threadId ?? '',\n });\n void writer.custom(failedMarker).catch(() => {});\n await this.persistMarkerToStorage(failedMarker, record.threadId ?? '', record.resourceId ?? undefined);\n }\n omError('[OM] Async buffered reflection failed', error);\n reflectionHooks?.onReflectionEnd?.({\n usage: undefined,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n // Clear the boundary so a failed reflection doesn't permanently block\n // future async reflection attempts (line 554 checks this map).\n BufferingCoordinator.lastBufferedBoundary.delete(bufferKey);\n })\n .finally(() => {\n BufferingCoordinator.asyncBufferingOps.delete(bufferKey);\n unregisterOp(record.id, 'bufferingReflection');\n this.storage.setBufferingReflectionFlag(record.id, false).catch(err => {\n omError('[OM] Failed to clear buffering reflection flag', err);\n });\n });\n\n BufferingCoordinator.asyncBufferingOps.set(bufferKey, asyncOp);\n }\n\n /**\n * Perform async buffered reflection — reflects observations and stores to bufferedReflection.\n * Does NOT create a new generation or update activeObservations.\n */\n private async doAsyncBufferedReflection(\n record: ObservationalMemoryRecord,\n _bufferKey: string,\n writer?: ProcessorStreamWriter,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n ): Promise<{ inputTokens?: number; outputTokens?: number; totalTokens?: number } | undefined> {\n const freshRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n const currentRecord = freshRecord ?? record;\n const observationTokens = currentRecord.observationTokenCount ?? 0;\n const reflectThreshold = getMaxThreshold(this.reflectionConfig.observationTokens);\n const bufferActivation = this.reflectionConfig.bufferActivation ?? 0.5;\n const startedAt = new Date().toISOString();\n const cycleId = `reflect-buf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n\n BufferingCoordinator.reflectionBufferCycleIds.set(_bufferKey, cycleId);\n\n const fullObservations = currentRecord.activeObservations ?? '';\n const allLines = fullObservations.split('\\n');\n const totalLines = allLines.length;\n\n const avgTokensPerLine = totalLines > 0 ? observationTokens / totalLines : 0;\n const activationPointTokens = reflectThreshold * bufferActivation;\n const linesToReflect =\n avgTokensPerLine > 0 ? Math.min(Math.floor(activationPointTokens / avgTokensPerLine), totalLines) : totalLines;\n\n const activeObservations = allLines.slice(0, linesToReflect).join('\\n');\n const reflectedObservationLineCount = linesToReflect;\n const sliceTokenEstimate = Math.round(avgTokensPerLine * linesToReflect);\n const compressionTarget = Math.round(sliceTokenEstimate * 0.75);\n\n omDebug(\n `[OM:reflect] doAsyncBufferedReflection: slicing observations for reflection — totalLines=${totalLines}, avgTokPerLine=${avgTokensPerLine.toFixed(1)}, activationPointTokens=${activationPointTokens}, linesToReflect=${linesToReflect}/${totalLines}, sliceTokenEstimate=${sliceTokenEstimate}, compressionTarget=${compressionTarget}`,\n );\n\n omDebug(\n `[OM:reflect] doAsyncBufferedReflection: starting reflector call, recordId=${currentRecord.id}, observationTokens=${sliceTokenEstimate}, compressionTarget=${compressionTarget} (inputTokens), activeObsLength=${activeObservations.length}, reflectedLineCount=${reflectedObservationLineCount}`,\n );\n\n if (writer) {\n const startMarker = createBufferingStartMarker({\n cycleId,\n operationType: 'reflection',\n tokensToBuffer: sliceTokenEstimate,\n recordId: record.id,\n threadId: record.threadId ?? '',\n threadIds: record.threadId ? [record.threadId] : [],\n config: this.getObservationMarkerConfig(),\n });\n void writer.custom(startMarker).catch(() => {});\n }\n\n const compressionStartLevel = await this.getCompressionStartLevel(requestContext);\n const reflectResult = await this.call(\n activeObservations,\n undefined,\n undefined,\n compressionTarget,\n undefined,\n true,\n compressionStartLevel,\n requestContext,\n observabilityContext,\n );\n\n const reflectionTokenCount = this.tokenCounter.countObservations(reflectResult.observations);\n omDebug(\n `[OM:reflect] doAsyncBufferedReflection: reflector returned ${reflectionTokenCount} tokens (${reflectResult.observations?.length} chars), saving to recordId=${currentRecord.id}`,\n );\n\n await this.storage.updateBufferedReflection({\n id: currentRecord.id,\n reflection: reflectResult.observations,\n tokenCount: reflectionTokenCount,\n inputTokenCount: sliceTokenEstimate,\n reflectedObservationLineCount,\n });\n omDebug(\n `[OM:reflect] doAsyncBufferedReflection: bufferedReflection saved with lineCount=${reflectedObservationLineCount}`,\n );\n\n if (writer) {\n const endMarker = createBufferingEndMarker({\n cycleId,\n operationType: 'reflection',\n startedAt,\n tokensBuffered: sliceTokenEstimate,\n bufferedTokens: reflectionTokenCount,\n recordId: currentRecord.id,\n threadId: currentRecord.threadId ?? '',\n observations: reflectResult.observations,\n });\n void writer.custom(endMarker).catch(() => {});\n await this.persistMarkerToStorage(endMarker, currentRecord.threadId ?? '', currentRecord.resourceId ?? undefined);\n }\n\n return reflectResult.usage;\n }\n\n /**\n * Try to activate buffered reflection when threshold is reached.\n * Returns true if activation succeeded.\n */\n private async tryActivateBufferedReflection(\n record: ObservationalMemoryRecord,\n lockKey: string,\n writer?: ProcessorStreamWriter,\n messageList?: MessageList,\n ): Promise<boolean> {\n const bufferKey = this.buffering.getReflectionBufferKey(lockKey);\n\n const asyncOp = BufferingCoordinator.asyncBufferingOps.get(bufferKey);\n if (asyncOp) {\n omDebug(`[OM:reflect] tryActivateBufferedReflection: waiting for in-progress op...`);\n try {\n await Promise.race([\n asyncOp,\n new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 60_000)),\n ]);\n } catch {\n // Timeout or error - proceed with what we have\n }\n }\n\n const freshRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n\n omDebug(\n `[OM:reflect] tryActivateBufferedReflection: recordId=${record.id}, hasBufferedReflection=${!!freshRecord?.bufferedReflection}, bufferedReflectionLen=${freshRecord?.bufferedReflection?.length ?? 0}`,\n );\n omDebug(\n `[OM:reflect] tryActivateBufferedReflection: freshRecord.id=${freshRecord?.id}, freshBufferedReflection=${freshRecord?.bufferedReflection ? 'present (' + freshRecord.bufferedReflection.length + ' chars)' : 'empty'}, freshObsTokens=${freshRecord?.observationTokenCount}`,\n );\n\n if (!freshRecord?.bufferedReflection) {\n omDebug(`[OM:reflect] tryActivateBufferedReflection: no buffered reflection after re-fetch, returning false`);\n return false;\n }\n\n const beforeTokens = freshRecord.observationTokenCount ?? 0;\n\n const reflectedLineCount = freshRecord.reflectedObservationLineCount ?? 0;\n const currentObservations = freshRecord.activeObservations ?? '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n const combinedObservations = unreflectedContent\n ? `${freshRecord.bufferedReflection}\\n\\n${unreflectedContent}`\n : freshRecord.bufferedReflection!;\n const combinedTokenCount = this.tokenCounter.countObservations(combinedObservations);\n\n omDebug(\n `[OM:reflect] tryActivateBufferedReflection: activating, beforeTokens=${beforeTokens}, combinedTokenCount=${combinedTokenCount}, reflectedLineCount=${reflectedLineCount}, unreflectedLines=${unreflectedLines.length}`,\n );\n await this.storage.swapBufferedReflectionToActive({\n currentRecord: freshRecord,\n tokenCount: combinedTokenCount,\n });\n\n BufferingCoordinator.lastBufferedBoundary.delete(bufferKey);\n\n const afterRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n const afterTokens = afterRecord?.observationTokenCount ?? 0;\n omDebug(\n `[OM:reflect] tryActivateBufferedReflection: activation complete! beforeTokens=${beforeTokens}, afterTokens=${afterTokens}, newRecordId=${afterRecord?.id}, newGenCount=${afterRecord?.generationCount}`,\n );\n\n if (writer) {\n const originalCycleId = BufferingCoordinator.reflectionBufferCycleIds.get(bufferKey);\n const activationMarker = createActivationMarker({\n cycleId: originalCycleId ?? `reflect-act-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,\n operationType: 'reflection',\n chunksActivated: 1,\n tokensActivated: beforeTokens,\n observationTokens: afterTokens,\n messagesActivated: 0,\n recordId: freshRecord.id,\n threadId: freshRecord.threadId ?? '',\n generationCount: afterRecord?.generationCount ?? freshRecord.generationCount ?? 0,\n observations: afterRecord?.activeObservations,\n config: this.getObservationMarkerConfig(),\n });\n void writer.custom(activationMarker).catch(() => {});\n await this.persistMarkerToMessage(\n activationMarker,\n messageList,\n freshRecord.threadId ?? '',\n freshRecord.resourceId ?? undefined,\n );\n }\n\n BufferingCoordinator.reflectionBufferCycleIds.delete(bufferKey);\n\n return true;\n }\n\n /**\n * Check if reflection needed and trigger if so.\n * Supports both synchronous reflection and async buffered reflection.\n * @internal Used by observation strategies. Do not call directly.\n */\n async maybeReflect(opts: {\n record: ObservationalMemoryRecord;\n observationTokens: number;\n threadId?: string;\n writer?: ProcessorStreamWriter;\n abortSignal?: AbortSignal;\n messageList?: MessageList;\n reflectionHooks?: Pick<ObserveHooks, 'onReflectionStart' | 'onReflectionEnd'>;\n requestContext?: RequestContext;\n observabilityContext?: ObservabilityContext;\n }): Promise<void> {\n const {\n record,\n observationTokens,\n writer,\n abortSignal,\n messageList,\n reflectionHooks,\n requestContext,\n observabilityContext,\n } = opts;\n const lockKey = this.buffering.getLockKey(record.threadId, record.resourceId);\n const reflectThreshold = getMaxThreshold(this.reflectionConfig.observationTokens);\n\n // ════════════════════════════════════════════════════════════════════════\n // ASYNC BUFFERING: Trigger background reflection at bufferActivation ratio\n // ════════════════════════════════════════════════════════════════════════\n if (this.buffering.isAsyncReflectionEnabled() && observationTokens < reflectThreshold) {\n const shouldTrigger = (() => {\n if (!this.buffering.isAsyncReflectionEnabled()) return false;\n if (record.isBufferingReflection) {\n if (isOpActiveInProcess(record.id, 'bufferingReflection')) return false;\n omDebug(`[OM:shouldTriggerAsyncRefl] isBufferingReflection=true but stale, clearing`);\n this.storage.setBufferingReflectionFlag(record.id, false).catch(() => {});\n }\n const bufferKey = this.buffering.getReflectionBufferKey(lockKey);\n if (this.buffering.isAsyncBufferingInProgress(bufferKey)) return false;\n if (BufferingCoordinator.lastBufferedBoundary.has(bufferKey)) return false;\n if (record.bufferedReflection) return false;\n const activationPoint = reflectThreshold * this.reflectionConfig.bufferActivation!;\n return observationTokens >= activationPoint;\n })();\n if (shouldTrigger) {\n this.startAsyncBufferedReflection(\n record,\n observationTokens,\n lockKey,\n writer,\n requestContext,\n observabilityContext,\n reflectionHooks,\n );\n }\n }\n\n if (observationTokens < reflectThreshold) {\n return;\n }\n\n // ═══════════════════════════════════════════════════════════\n // LOCKING: Check if reflection is already in progress\n // ════════════════════════════════════════════════════════════\n if (record.isReflecting) {\n if (isOpActiveInProcess(record.id, 'reflecting')) {\n omDebug(`[OM:reflect] isReflecting=true and active in this process, skipping`);\n return;\n }\n omDebug(`[OM:reflect] isReflecting=true but NOT active in this process — stale flag from dead process, clearing`);\n await this.storage.setReflectingFlag(record.id, false);\n }\n\n // ════════════════════════════════════════════════════════════════════════\n // ASYNC ACTIVATION: Try to activate buffered reflection first\n // ════════════════════════════════════════════════════════════════════════\n if (this.buffering.isAsyncReflectionEnabled()) {\n const activationSuccess = await this.tryActivateBufferedReflection(record, lockKey, writer, messageList);\n if (activationSuccess) {\n return;\n }\n if (this.reflectionConfig.blockAfter && observationTokens >= this.reflectionConfig.blockAfter) {\n omDebug(\n `[OM:reflect] blockAfter exceeded (${observationTokens} >= ${this.reflectionConfig.blockAfter}), falling through to sync reflection`,\n );\n } else {\n omDebug(\n `[OM:reflect] async activation failed, no blockAfter or below it (obsTokens=${observationTokens}, blockAfter=${this.reflectionConfig.blockAfter}) — starting background reflection`,\n );\n this.startAsyncBufferedReflection(\n record,\n observationTokens,\n lockKey,\n writer,\n requestContext,\n observabilityContext,\n reflectionHooks,\n );\n return;\n }\n }\n\n // ════════════════════════════════════════════════════════════\n // SYNC PATH: Do synchronous reflection (blocking)\n // ════════════════════════════════════════════════════════════\n reflectionHooks?.onReflectionStart?.();\n await this.storage.setReflectingFlag(record.id, true);\n registerOp(record.id, 'reflecting');\n\n const cycleId = crypto.randomUUID();\n const startedAt = new Date().toISOString();\n const threadId = opts.threadId ?? 'unknown';\n\n if (writer) {\n const startMarker = createObservationStartMarker({\n cycleId,\n operationType: 'reflection',\n tokensToObserve: observationTokens,\n recordId: record.id,\n threadId,\n threadIds: [threadId],\n config: this.getObservationMarkerConfig(),\n });\n await writer.custom(startMarker).catch(() => {});\n }\n\n this.emitDebugEvent({\n type: 'reflection_triggered',\n timestamp: new Date(),\n threadId,\n resourceId: record.resourceId ?? '',\n inputTokens: observationTokens,\n activeObservationsLength: record.activeObservations?.length ?? 0,\n });\n\n const streamContext = writer\n ? {\n writer,\n cycleId,\n startedAt,\n recordId: record.id,\n threadId,\n }\n : undefined;\n\n let reflectionUsage: ObserveHookUsage | undefined;\n let reflectionError: Error | undefined;\n try {\n const compressionStartLevel = await this.getCompressionStartLevel(requestContext);\n const reflectResult = await this.call(\n record.activeObservations,\n undefined,\n streamContext,\n reflectThreshold,\n abortSignal,\n undefined,\n compressionStartLevel,\n requestContext,\n observabilityContext,\n );\n reflectionUsage = reflectResult.usage;\n const reflectionTokenCount = this.tokenCounter.countObservations(reflectResult.observations);\n\n await this.storage.createReflectionGeneration({\n currentRecord: record,\n reflection: reflectResult.observations,\n tokenCount: reflectionTokenCount,\n });\n\n if (writer && streamContext) {\n const endMarker = createObservationEndMarker({\n cycleId: streamContext.cycleId,\n operationType: 'reflection',\n startedAt: streamContext.startedAt,\n tokensObserved: observationTokens,\n observationTokens: reflectionTokenCount,\n observations: reflectResult.observations,\n recordId: record.id,\n threadId,\n });\n await writer.custom(endMarker).catch(() => {});\n }\n\n this.emitDebugEvent({\n type: 'reflection_complete',\n timestamp: new Date(),\n threadId,\n resourceId: record.resourceId ?? '',\n inputTokens: observationTokens,\n outputTokens: reflectionTokenCount,\n observations: reflectResult.observations,\n usage: reflectResult.usage,\n });\n } catch (error) {\n if (writer && streamContext) {\n const failedMarker = createObservationFailedMarker({\n cycleId: streamContext.cycleId,\n operationType: 'reflection',\n startedAt: streamContext.startedAt,\n tokensAttempted: observationTokens,\n error: error instanceof Error ? error.message : String(error),\n recordId: record.id,\n threadId,\n });\n await writer.custom(failedMarker).catch(() => {});\n }\n reflectionError = error instanceof Error ? error : new Error(String(error));\n if (abortSignal?.aborted) {\n throw error;\n }\n omError('[OM] Reflection failed', error);\n } finally {\n await this.storage.setReflectingFlag(record.id, false);\n reflectionHooks?.onReflectionEnd?.({ usage: reflectionUsage, error: reflectionError });\n unregisterOp(record.id, 'reflecting');\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { inspect } from 'node:util';\nimport type { MastraDBMessage, MessageList } from '@mastra/core/agent';\nimport { parseMemoryRequestContext } from '@mastra/core/memory';\nimport type { ProcessInputStepArgs } from '@mastra/core/processors';\nimport type { BufferedObservationChunk, ObservationalMemoryRecord } from '@mastra/core/storage';\n\nimport type { ObserverExchange } from './observer-runner';\n\nfunction getOmReproCaptureDir(): string {\n return process.env.OM_REPRO_CAPTURE_DIR ?? '.mastra-om-repro';\n}\n\nfunction sanitizeCapturePathSegment(value: string): string {\n const sanitized = value\n .replace(/[\\\\/]+/g, '_')\n .replace(/\\.{2,}/g, '_')\n .trim();\n return sanitized.length > 0 ? sanitized : 'unknown-thread';\n}\n\nexport function isOmReproCaptureEnabled(): boolean {\n return process.env.OM_REPRO_CAPTURE === '1';\n}\n\nexport function safeCaptureJson(value: unknown): unknown {\n return JSON.parse(\n JSON.stringify(value, (_key, current) => {\n if (typeof current === 'bigint') return current.toString();\n if (typeof current === 'function') return '[function]';\n if (typeof current === 'symbol') return current.toString();\n if (current instanceof Error) return { name: current.name, message: current.message, stack: current.stack };\n if (current instanceof Set) return { __type: 'Set', values: Array.from(current.values()) };\n if (current instanceof Map) return { __type: 'Map', entries: Array.from(current.entries()) };\n return current;\n }),\n );\n}\n\nfunction safeCaptureJsonOrError(value: unknown): { ok: true; value: unknown } | { ok: false; error: unknown } {\n try {\n return { ok: true, value: safeCaptureJson(value) };\n } catch (error) {\n return {\n ok: false,\n error: safeCaptureJson({\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n inspected: inspect(value, { depth: 3, maxArrayLength: 20, breakLength: 120 }),\n }),\n };\n }\n}\n\nfunction formatCaptureDate(value: unknown): string | undefined {\n if (!value) return undefined;\n if (value instanceof Date) return value.toISOString();\n\n try {\n return new Date(value as string | number | Date).toISOString();\n } catch {\n return undefined;\n }\n}\n\nfunction summarizeOmTurn(value: unknown): unknown {\n if (!value || typeof value !== 'object') {\n return value;\n }\n\n const turn = value as {\n threadId?: string;\n resourceId?: string;\n _started?: boolean;\n _ended?: boolean;\n _generationCountAtStart?: number;\n _record?: {\n id?: string;\n scope?: string;\n threadId?: string;\n resourceId?: string;\n createdAt?: unknown;\n updatedAt?: unknown;\n lastObservedAt?: unknown;\n generationCount?: number;\n observationTokenCount?: number;\n pendingMessageTokens?: number;\n isBufferingObservation?: boolean;\n isBufferingReflection?: boolean;\n };\n _context?: {\n messages?: unknown[];\n systemMessage?: unknown;\n continuation?: { id?: string };\n otherThreadsContext?: unknown;\n record?: { id?: string };\n };\n _currentStep?: {\n stepNumber?: number;\n _prepared?: boolean;\n _context?: {\n activated?: boolean;\n observed?: boolean;\n buffered?: boolean;\n reflected?: boolean;\n didThresholdCleanup?: boolean;\n messages?: unknown[];\n systemMessage?: unknown[];\n };\n };\n };\n\n return {\n __type: 'ObservationTurn',\n threadId: turn.threadId,\n resourceId: turn.resourceId,\n started: turn._started,\n ended: turn._ended,\n generationCountAtStart: turn._generationCountAtStart,\n record: turn._record\n ? {\n id: turn._record.id,\n scope: turn._record.scope,\n threadId: turn._record.threadId,\n resourceId: turn._record.resourceId,\n createdAt: formatCaptureDate(turn._record.createdAt),\n updatedAt: formatCaptureDate(turn._record.updatedAt),\n lastObservedAt: formatCaptureDate(turn._record.lastObservedAt),\n generationCount: turn._record.generationCount,\n observationTokenCount: turn._record.observationTokenCount,\n pendingMessageTokens: turn._record.pendingMessageTokens,\n isBufferingObservation: turn._record.isBufferingObservation,\n isBufferingReflection: turn._record.isBufferingReflection,\n }\n : undefined,\n context: turn._context\n ? {\n messageCount: Array.isArray(turn._context.messages) ? turn._context.messages.length : undefined,\n hasSystemMessage: Array.isArray(turn._context.systemMessage)\n ? turn._context.systemMessage.length > 0\n : Boolean(turn._context.systemMessage),\n continuationId: turn._context.continuation?.id,\n hasOtherThreadsContext: Boolean(turn._context.otherThreadsContext),\n recordId: turn._context.record?.id,\n }\n : undefined,\n currentStep: turn._currentStep\n ? {\n stepNumber: turn._currentStep.stepNumber,\n prepared: turn._currentStep._prepared,\n context: turn._currentStep._context\n ? {\n activated: turn._currentStep._context.activated,\n observed: turn._currentStep._context.observed,\n buffered: turn._currentStep._context.buffered,\n reflected: turn._currentStep._context.reflected,\n didThresholdCleanup: turn._currentStep._context.didThresholdCleanup,\n messageCount: Array.isArray(turn._currentStep._context.messages)\n ? turn._currentStep._context.messages.length\n : undefined,\n systemMessageCount: Array.isArray(turn._currentStep._context.systemMessage)\n ? turn._currentStep._context.systemMessage.length\n : undefined,\n }\n : undefined,\n }\n : undefined,\n };\n}\n\nfunction sanitizeCaptureState(rawState: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(rawState).map(([key, value]) => {\n if (key === '__omTurn') {\n return [key, summarizeOmTurn(value)];\n }\n\n return [key, value];\n }),\n );\n}\n\nfunction buildReproMessageFingerprint(message: MastraDBMessage): string {\n const createdAt =\n message.createdAt instanceof Date\n ? message.createdAt.toISOString()\n : message.createdAt\n ? new Date(message.createdAt).toISOString()\n : '';\n\n return JSON.stringify({\n role: message.role,\n createdAt,\n content: message.content,\n });\n}\n\nfunction inferReproIdRemap(\n preMessages: MastraDBMessage[],\n postMessages: MastraDBMessage[],\n): Array<{ fromId: string; toId: string; fingerprint: string }> {\n const preByFingerprint = new Map<string, string[]>();\n const postByFingerprint = new Map<string, string[]>();\n\n for (const message of preMessages) {\n if (!message.id) continue;\n const fingerprint = buildReproMessageFingerprint(message);\n const list = preByFingerprint.get(fingerprint) ?? [];\n list.push(message.id);\n preByFingerprint.set(fingerprint, list);\n }\n\n for (const message of postMessages) {\n if (!message.id) continue;\n const fingerprint = buildReproMessageFingerprint(message);\n const list = postByFingerprint.get(fingerprint) ?? [];\n list.push(message.id);\n postByFingerprint.set(fingerprint, list);\n }\n\n const remap: Array<{ fromId: string; toId: string; fingerprint: string }> = [];\n\n for (const [fingerprint, preIds] of preByFingerprint.entries()) {\n const postIds = postByFingerprint.get(fingerprint);\n if (!postIds || preIds.length !== 1 || postIds.length !== 1) continue;\n\n const fromId = preIds[0];\n const toId = postIds[0];\n if (!fromId || !toId || fromId === toId) {\n continue;\n }\n\n remap.push({ fromId, toId, fingerprint });\n }\n\n return remap;\n}\n\nfunction createOmReproCaptureDir(threadId: string, label: string): string {\n const sanitizedThreadId = sanitizeCapturePathSegment(threadId);\n const captureDir = join(\n process.cwd(),\n getOmReproCaptureDir(),\n sanitizedThreadId,\n `${Date.now()}-${label}-${randomUUID()}`,\n );\n mkdirSync(captureDir, { recursive: true });\n return captureDir;\n}\n\nexport function writeObserverExchangeReproCapture(params: {\n threadId: string;\n resourceId?: string;\n label: string;\n observerExchange?: ObserverExchange;\n details?: Record<string, unknown>;\n debug?: (message: string) => void;\n}) {\n if (!isOmReproCaptureEnabled() || !params.observerExchange) {\n return;\n }\n\n try {\n const captureDir = createOmReproCaptureDir(params.threadId, params.label);\n const payloads = [\n {\n fileName: 'input.json',\n data: {\n threadId: params.threadId,\n resourceId: params.resourceId,\n label: params.label,\n },\n },\n {\n fileName: 'output.json',\n data: {\n details: params.details ?? {},\n },\n },\n {\n fileName: 'observer-exchange.json',\n data: params.observerExchange,\n },\n ] as const;\n\n const captureErrors: Array<{ fileName: string; error: unknown }> = [];\n\n for (const payload of payloads) {\n const serialized = safeCaptureJsonOrError(payload.data);\n if (serialized.ok) {\n writeFileSync(join(captureDir, payload.fileName), `${JSON.stringify(serialized.value, null, 2)}\\n`);\n continue;\n }\n\n captureErrors.push({ fileName: payload.fileName, error: serialized.error });\n writeFileSync(\n join(captureDir, payload.fileName),\n `${JSON.stringify({ __captureError: serialized.error }, null, 2)}\\n`,\n );\n }\n\n if (captureErrors.length > 0) {\n writeFileSync(join(captureDir, 'capture-error.json'), `${JSON.stringify(captureErrors, null, 2)}\\n`);\n params.debug?.(\n `[OM:repro-capture] wrote ${params.label} capture with ${captureErrors.length} serialization error(s) to ${captureDir}`,\n );\n return;\n }\n\n params.debug?.(`[OM:repro-capture] wrote ${params.label} capture to ${captureDir}`);\n } catch (error) {\n params.debug?.(`[OM:repro-capture] failed to write ${params.label} capture: ${String(error)}`);\n }\n}\n\nexport function writeProcessInputStepReproCapture(params: {\n threadId: string;\n resourceId?: string;\n stepNumber: number;\n args: ProcessInputStepArgs;\n preRecord: ObservationalMemoryRecord;\n postRecord: ObservationalMemoryRecord;\n preMessages: MastraDBMessage[];\n preBufferedChunks: BufferedObservationChunk[];\n preContextTokenCount: number;\n preSerializedMessageList: ReturnType<MessageList['serialize']>;\n postBufferedChunks: BufferedObservationChunk[];\n postContextTokenCount: number;\n messageList: MessageList;\n details: Record<string, unknown>;\n observerExchange?: ObserverExchange;\n debug?: (message: string) => void;\n}) {\n if (!isOmReproCaptureEnabled()) {\n return;\n }\n\n try {\n const captureDir = createOmReproCaptureDir(params.threadId, `step-${params.stepNumber}`);\n\n const contextMessages = params.messageList.get.all.db();\n const memoryContext = parseMemoryRequestContext(params.args.requestContext);\n const preMessageIds = new Set(params.preMessages.map(message => message.id));\n const postMessageIds = new Set(contextMessages.map(message => message.id));\n const removedMessageIds = params.preMessages\n .map(message => message.id)\n .filter((id): id is string => Boolean(id) && !postMessageIds.has(id));\n const addedMessageIds = contextMessages\n .map(message => message.id)\n .filter((id): id is string => Boolean(id) && !preMessageIds.has(id));\n const idRemap = inferReproIdRemap(params.preMessages, contextMessages);\n\n const rawState = (params.args.state as Record<string, unknown>) ?? {};\n const sanitizedState = sanitizeCaptureState(rawState);\n const payloads = [\n {\n fileName: 'input.json',\n data: {\n stepNumber: params.stepNumber,\n threadId: params.threadId,\n resourceId: params.resourceId,\n readOnly: memoryContext?.memoryConfig?.readOnly,\n messageCount: contextMessages.length,\n messageIds: contextMessages.map(message => message.id),\n stateKeys: Object.keys(rawState),\n state: sanitizedState,\n args: {\n messages: params.args.messages,\n steps: params.args.steps,\n systemMessages: params.args.systemMessages,\n retryCount: params.args.retryCount,\n toolChoice: params.args.toolChoice,\n activeTools: params.args.activeTools,\n modelSettings: params.args.modelSettings,\n structuredOutput: params.args.structuredOutput,\n },\n },\n },\n {\n fileName: 'pre-state.json',\n data: {\n record: params.preRecord,\n bufferedChunks: params.preBufferedChunks,\n contextTokenCount: params.preContextTokenCount,\n messages: params.preMessages,\n messageList: params.preSerializedMessageList,\n },\n },\n {\n fileName: 'output.json',\n data: {\n details: params.details,\n messageDiff: {\n removedMessageIds,\n addedMessageIds,\n idRemap,\n },\n },\n },\n {\n fileName: 'post-state.json',\n data: {\n record: params.postRecord,\n bufferedChunks: params.postBufferedChunks,\n contextTokenCount: params.postContextTokenCount,\n messageCount: contextMessages.length,\n messageIds: contextMessages.map(message => message.id),\n messages: contextMessages,\n messageList: params.messageList.serialize(),\n },\n },\n ] as const;\n\n const captureErrors: Array<{ fileName: string; error: unknown }> = [];\n\n for (const payload of payloads) {\n const serialized = safeCaptureJsonOrError(payload.data);\n if (serialized.ok) {\n writeFileSync(join(captureDir, payload.fileName), `${JSON.stringify(serialized.value, null, 2)}\\n`);\n continue;\n }\n\n captureErrors.push({ fileName: payload.fileName, error: serialized.error });\n writeFileSync(\n join(captureDir, payload.fileName),\n `${JSON.stringify({ __captureError: serialized.error }, null, 2)}\\n`,\n );\n }\n\n // Write observer exchange (prompt + raw LLM response) if available\n if (params.observerExchange) {\n const serialized = safeCaptureJsonOrError(params.observerExchange);\n if (serialized.ok) {\n writeFileSync(join(captureDir, 'observer-exchange.json'), `${JSON.stringify(serialized.value, null, 2)}\\n`);\n } else {\n captureErrors.push({ fileName: 'observer-exchange.json', error: serialized.error });\n writeFileSync(\n join(captureDir, 'observer-exchange.json'),\n `${JSON.stringify({ __captureError: serialized.error }, null, 2)}\\n`,\n );\n }\n }\n\n if (captureErrors.length > 0) {\n writeFileSync(join(captureDir, 'capture-error.json'), `${JSON.stringify(captureErrors, null, 2)}\\n`);\n params.debug?.(\n `[OM:repro-capture] wrote processInputStep capture with ${captureErrors.length} serialization error(s) to ${captureDir}`,\n );\n return;\n }\n\n params.debug?.(`[OM:repro-capture] wrote processInputStep capture to ${captureDir}`);\n } catch (error) {\n params.debug?.(`[OM:repro-capture] failed to write processInputStep capture: ${String(error)}`);\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { createHash } from 'node:crypto';\nimport type { MastraDBMessage } from '@mastra/core/agent';\nimport imageSize from 'image-size';\nimport { estimateTokenCount } from 'tokenx';\n\nimport { formatToolResultForObserver, resolveToolResultValue } from './tool-result-helpers';\n\ntype TokenEstimateCacheEntry = {\n v: number;\n source: string;\n key: string;\n tokens: number;\n};\n\nexport type TokenCounterModelContext = {\n provider?: string;\n modelId?: string;\n};\n\ntype TokenCounterOptions = {\n model?: string | TokenCounterModelContext;\n};\n\ntype ImageTokenDetail = 'low' | 'high' | 'auto';\n\ntype ImageTokenEstimatorConfig = {\n baseTokens: number;\n tileTokens: number;\n fallbackTiles: number;\n};\n\ntype GoogleMediaResolution = 'low' | 'medium' | 'high' | 'ultra_high' | 'unspecified';\n\ntype ImageTokenEstimate = {\n tokens: number;\n cachePayload: string;\n};\n\nconst IMAGE_FILE_EXTENSIONS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'gif',\n 'bmp',\n 'tiff',\n 'tif',\n 'heic',\n 'heif',\n 'avif',\n]);\n\nconst TOKEN_ESTIMATE_CACHE_VERSION = 6;\n\nconst DEFAULT_IMAGE_ESTIMATOR: ImageTokenEstimatorConfig = {\n baseTokens: 85,\n tileTokens: 170,\n fallbackTiles: 4,\n};\n\nconst GOOGLE_LEGACY_IMAGE_TOKENS_PER_TILE = 258;\nconst GOOGLE_GEMINI_3_IMAGE_TOKENS_BY_RESOLUTION: Record<GoogleMediaResolution, number> = {\n low: 280,\n medium: 560,\n high: 1120,\n ultra_high: 2240,\n unspecified: 1120,\n};\n\nconst ANTHROPIC_IMAGE_TOKENS_PER_PIXEL = 1 / 750;\nconst ANTHROPIC_IMAGE_MAX_LONG_EDGE = 1568;\n\nconst GOOGLE_MEDIA_RESOLUTION_VALUES = new Set<GoogleMediaResolution>([\n 'low',\n 'medium',\n 'high',\n 'ultra_high',\n 'unspecified',\n]);\n\nconst ATTACHMENT_COUNT_TIMEOUT_MS = 20_000;\nconst REMOTE_IMAGE_PROBE_TIMEOUT_MS = 2_500;\nconst PROVIDER_API_KEY_ENV_VARS: Record<string, string[]> = {\n openai: ['OPENAI_API_KEY'],\n google: ['GOOGLE_GENERATIVE_AI_API_KEY', 'GOOGLE_API_KEY'],\n anthropic: ['ANTHROPIC_API_KEY'],\n};\n\ntype CacheablePart = any;\n\ntype MastraTokenEstimateMetadata = {\n mastra?: {\n tokenEstimate?: unknown;\n imageDimensions?: { width?: number; height?: number };\n };\n};\n\ntype PartWithMastraMetadata = {\n providerMetadata?: MastraTokenEstimateMetadata & Record<string, unknown>;\n};\n\ntype ContentWithMastraMetadata = {\n metadata?: MastraTokenEstimateMetadata & Record<string, unknown>;\n};\n\ntype MessageWithMastraMetadata = {\n metadata?: MastraTokenEstimateMetadata & Record<string, unknown>;\n};\n\nfunction getPartMastraMetadata(part: CacheablePart): MastraTokenEstimateMetadata['mastra'] | undefined {\n return (part as PartWithMastraMetadata).providerMetadata?.mastra;\n}\n\nfunction ensurePartMastraMetadata(part: CacheablePart): NonNullable<MastraTokenEstimateMetadata['mastra']> {\n const typedPart = part as PartWithMastraMetadata;\n typedPart.providerMetadata ??= {};\n typedPart.providerMetadata.mastra ??= {};\n return typedPart.providerMetadata.mastra;\n}\n\nfunction getContentMastraMetadata(content: unknown): MastraTokenEstimateMetadata['mastra'] | undefined {\n if (!content || typeof content !== 'object') {\n return undefined;\n }\n\n return (content as ContentWithMastraMetadata).metadata?.mastra;\n}\n\nfunction ensureContentMastraMetadata(content: unknown): NonNullable<MastraTokenEstimateMetadata['mastra']> | undefined {\n if (!content || typeof content !== 'object') {\n return undefined;\n }\n\n const typedContent = content as ContentWithMastraMetadata;\n typedContent.metadata ??= {};\n typedContent.metadata.mastra ??= {};\n return typedContent.metadata.mastra;\n}\n\nfunction getMessageMastraMetadata(message: MastraDBMessage): MastraTokenEstimateMetadata['mastra'] | undefined {\n return (message as MessageWithMastraMetadata).metadata?.mastra;\n}\n\nfunction ensureMessageMastraMetadata(message: MastraDBMessage): NonNullable<MastraTokenEstimateMetadata['mastra']> {\n const typedMessage = message as MessageWithMastraMetadata;\n typedMessage.metadata ??= {};\n typedMessage.metadata.mastra ??= {};\n return typedMessage.metadata.mastra;\n}\n\nfunction buildEstimateKey(kind: string, text: string): string {\n const payloadHash = createHash('sha1').update(text).digest('hex');\n return `${kind}:${payloadHash}`;\n}\n\nfunction resolveEstimatorId(): string {\n return 'tokenx';\n}\n\nfunction isTokenEstimateEntry(value: unknown): value is TokenEstimateCacheEntry {\n if (!value || typeof value !== 'object') return false;\n const entry = value as Partial<TokenEstimateCacheEntry>;\n return (\n typeof entry.v === 'number' &&\n typeof entry.source === 'string' &&\n typeof entry.key === 'string' &&\n typeof entry.tokens === 'number'\n );\n}\n\nfunction getCacheEntry(cache: unknown, key: string): TokenEstimateCacheEntry | undefined {\n if (!cache || typeof cache !== 'object') return undefined;\n if (isTokenEstimateEntry(cache)) {\n return cache.key === key ? cache : undefined;\n }\n\n const keyedEntry = (cache as Record<string, unknown>)[key];\n return isTokenEstimateEntry(keyedEntry) ? keyedEntry : undefined;\n}\n\nfunction mergeCacheEntry(\n cache: unknown,\n key: string,\n entry: TokenEstimateCacheEntry,\n): TokenEstimateCacheEntry | Record<string, TokenEstimateCacheEntry> {\n if (isTokenEstimateEntry(cache)) {\n if (cache.key === key) {\n return entry;\n }\n\n return {\n [cache.key]: cache,\n [key]: entry,\n };\n }\n\n if (cache && typeof cache === 'object') {\n return {\n ...(cache as Record<string, TokenEstimateCacheEntry>),\n [key]: entry,\n };\n }\n\n return entry;\n}\n\nfunction getPartCacheEntry(part: CacheablePart, key: string): TokenEstimateCacheEntry | undefined {\n return getCacheEntry(getPartMastraMetadata(part)?.tokenEstimate, key);\n}\n\nfunction setPartCacheEntry(part: CacheablePart, key: string, entry: TokenEstimateCacheEntry): void {\n const mastraMetadata = ensurePartMastraMetadata(part);\n mastraMetadata.tokenEstimate = mergeCacheEntry(mastraMetadata.tokenEstimate, key, entry);\n}\n\nfunction getMessageCacheEntry(message: MastraDBMessage, key: string): TokenEstimateCacheEntry | undefined {\n const contentLevelEntry = getCacheEntry(getContentMastraMetadata(message.content)?.tokenEstimate, key);\n if (contentLevelEntry) return contentLevelEntry;\n\n return getCacheEntry(getMessageMastraMetadata(message)?.tokenEstimate, key);\n}\n\nfunction setMessageCacheEntry(message: MastraDBMessage, key: string, entry: TokenEstimateCacheEntry): void {\n const contentMastraMetadata = ensureContentMastraMetadata(message.content);\n if (contentMastraMetadata) {\n contentMastraMetadata.tokenEstimate = mergeCacheEntry(contentMastraMetadata.tokenEstimate, key, entry);\n return;\n }\n\n const messageMastraMetadata = ensureMessageMastraMetadata(message);\n messageMastraMetadata.tokenEstimate = mergeCacheEntry(messageMastraMetadata.tokenEstimate, key, entry);\n}\n\nfunction serializePartForTokenCounting(part: CacheablePart): string {\n const typedPart = part as PartWithMastraMetadata & Record<string, unknown>;\n const hasTokenEstimate = Boolean(typedPart.providerMetadata?.mastra?.tokenEstimate);\n if (!hasTokenEstimate) {\n return JSON.stringify(part);\n }\n\n const clonedPart: Record<string, any> = {\n ...typedPart,\n providerMetadata: {\n ...(typedPart.providerMetadata ?? {}),\n mastra: {\n ...(typedPart.providerMetadata?.mastra ?? {}),\n },\n },\n };\n\n delete clonedPart.providerMetadata.mastra.tokenEstimate;\n\n if (Object.keys(clonedPart.providerMetadata.mastra).length === 0) {\n delete clonedPart.providerMetadata.mastra;\n }\n\n if (Object.keys(clonedPart.providerMetadata).length === 0) {\n delete clonedPart.providerMetadata;\n }\n\n return JSON.stringify(clonedPart);\n}\n\nfunction getFilenameFromAttachmentData(data: unknown): string | undefined {\n const pathname =\n data instanceof URL\n ? data.pathname\n : typeof data === 'string' && isHttpUrlString(data)\n ? (() => {\n try {\n return new URL(data).pathname;\n } catch {\n return undefined;\n }\n })()\n : undefined;\n\n const filename = pathname?.split('/').filter(Boolean).pop();\n return filename ? decodeURIComponent(filename) : undefined;\n}\n\nfunction serializeNonImageFilePartForTokenCounting(part: CacheablePart): string {\n const filename = getObjectValue(part, 'filename');\n const inferredFilename = getFilenameFromAttachmentData(getObjectValue(part, 'data'));\n\n return JSON.stringify({\n type: 'file',\n mimeType: getObjectValue(part, 'mimeType') ?? null,\n filename: typeof filename === 'string' && filename.trim().length > 0 ? filename.trim() : (inferredFilename ?? null),\n });\n}\n\nfunction isValidCacheEntry(\n entry: TokenEstimateCacheEntry | undefined,\n expectedKey: string,\n expectedSource: string,\n): entry is TokenEstimateCacheEntry {\n return Boolean(\n entry &&\n entry.v === TOKEN_ESTIMATE_CACHE_VERSION &&\n entry.source === expectedSource &&\n entry.key === expectedKey &&\n Number.isFinite(entry.tokens),\n );\n}\n\nfunction parseModelContext(model?: string | TokenCounterModelContext): TokenCounterModelContext | undefined {\n if (!model) return undefined;\n if (typeof model === 'object') {\n return model.provider || model.modelId ? { provider: model.provider, modelId: model.modelId } : undefined;\n }\n\n const slashIndex = model.indexOf('/');\n if (slashIndex === -1) {\n return { modelId: model };\n }\n\n return {\n provider: model.slice(0, slashIndex),\n modelId: model.slice(slashIndex + 1),\n };\n}\n\nfunction normalizeImageDetail(detail: unknown): ImageTokenDetail {\n if (detail === 'low' || detail === 'high') return detail;\n return 'auto';\n}\n\nfunction getObjectValue(value: unknown, key: string): unknown {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>)[key];\n}\n\nfunction resolveImageDetail(part: CacheablePart): ImageTokenDetail {\n const openAIProviderOptions = getObjectValue(getObjectValue(part, 'providerOptions'), 'openai');\n const openAIProviderMetadata = getObjectValue(getObjectValue(part, 'providerMetadata'), 'openai');\n const mastraMetadata = getObjectValue(getObjectValue(part, 'providerMetadata'), 'mastra');\n\n return normalizeImageDetail(\n getObjectValue(part, 'detail') ??\n getObjectValue(part, 'imageDetail') ??\n getObjectValue(openAIProviderOptions, 'detail') ??\n getObjectValue(openAIProviderOptions, 'imageDetail') ??\n getObjectValue(openAIProviderMetadata, 'detail') ??\n getObjectValue(openAIProviderMetadata, 'imageDetail') ??\n getObjectValue(mastraMetadata, 'imageDetail'),\n );\n}\n\nfunction normalizeGoogleMediaResolution(value: unknown): GoogleMediaResolution | undefined {\n return typeof value === 'string' && GOOGLE_MEDIA_RESOLUTION_VALUES.has(value as GoogleMediaResolution)\n ? (value as GoogleMediaResolution)\n : undefined;\n}\n\nfunction resolveGoogleMediaResolution(part: CacheablePart): GoogleMediaResolution {\n const providerOptions = getObjectValue(getObjectValue(part, 'providerOptions'), 'google');\n const providerMetadata = getObjectValue(getObjectValue(part, 'providerMetadata'), 'google');\n const mastraMetadata = getObjectValue(getObjectValue(part, 'providerMetadata'), 'mastra');\n\n return (\n normalizeGoogleMediaResolution(getObjectValue(part, 'mediaResolution')) ??\n normalizeGoogleMediaResolution(getObjectValue(providerOptions, 'mediaResolution')) ??\n normalizeGoogleMediaResolution(getObjectValue(providerMetadata, 'mediaResolution')) ??\n normalizeGoogleMediaResolution(getObjectValue(mastraMetadata, 'mediaResolution')) ??\n 'unspecified'\n );\n}\n\nfunction getFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction isHttpUrlString(value: unknown): boolean {\n return typeof value === 'string' && /^https?:\\/\\//i.test(value);\n}\n\nfunction isLikelyFilesystemPath(value: string): boolean {\n return (\n value.startsWith('/') ||\n value.startsWith('./') ||\n value.startsWith('../') ||\n value.startsWith('~/') ||\n /^[A-Za-z]:[\\\\/]/.test(value) ||\n value.includes('\\\\')\n );\n}\n\nfunction isLikelyBase64Content(value: string): boolean {\n if (value.length < 16 || value.length % 4 !== 0 || /\\s/.test(value) || isLikelyFilesystemPath(value)) {\n return false;\n }\n\n return /^[A-Za-z0-9+/]+={0,2}$/.test(value);\n}\n\nfunction decodeImageBuffer(value: unknown): Buffer | undefined {\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return Buffer.from(value);\n }\n\n if (value instanceof ArrayBuffer) {\n return Buffer.from(value);\n }\n\n if (ArrayBuffer.isView(value)) {\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n }\n\n if (typeof value !== 'string' || isHttpUrlString(value)) {\n return undefined;\n }\n\n if (value.startsWith('data:')) {\n const commaIndex = value.indexOf(',');\n if (commaIndex === -1) return undefined;\n\n const header = value.slice(0, commaIndex);\n const payload = value.slice(commaIndex + 1);\n if (/;base64/i.test(header)) {\n return Buffer.from(payload, 'base64');\n }\n\n return Buffer.from(decodeURIComponent(payload), 'utf8');\n }\n\n if (!isLikelyBase64Content(value)) {\n return undefined;\n }\n\n return Buffer.from(value, 'base64');\n}\n\nfunction persistImageDimensions(part: CacheablePart, dimensions: { width: number; height: number }): void {\n const mastraMetadata = ensurePartMastraMetadata(part);\n mastraMetadata.imageDimensions = dimensions;\n}\n\nfunction resolveHttpAssetUrl(value: unknown): string | undefined {\n if (value instanceof URL) {\n return value.toString();\n }\n\n if (typeof value === 'string' && isHttpUrlString(value)) {\n return value;\n }\n\n return undefined;\n}\n\nasync function resolveImageDimensionsAsync(part: CacheablePart): Promise<{ width?: number; height?: number }> {\n const existing = resolveImageDimensions(part);\n if (existing.width && existing.height) {\n return existing;\n }\n\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const url = resolveHttpAssetUrl(asset);\n if (!url) {\n return existing;\n }\n\n try {\n // Dynamic import avoids leaking probe-image-size into the public type surface.\n // Downstream packages resolve memory source files and lack the ambient d.ts.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TS7016 -- probe-image-size ships no types\n const mod = await import('probe-image-size');\n const probeImageSize: (src: string, opts?: Record<string, unknown>) => Promise<{ width: number; height: number }> =\n mod.default;\n const probed = await probeImageSize(url, {\n open_timeout: REMOTE_IMAGE_PROBE_TIMEOUT_MS,\n response_timeout: REMOTE_IMAGE_PROBE_TIMEOUT_MS,\n read_timeout: REMOTE_IMAGE_PROBE_TIMEOUT_MS,\n follow_max: 2,\n });\n const width = existing.width ?? getFiniteNumber(probed.width);\n const height = existing.height ?? getFiniteNumber(probed.height);\n\n if (!width || !height) {\n return existing;\n }\n\n const resolved = { width, height };\n persistImageDimensions(part, resolved);\n return resolved;\n } catch {\n return existing;\n }\n}\n\nfunction resolveImageDimensions(part: CacheablePart): { width?: number; height?: number } {\n const mastraMetadata = getObjectValue(getObjectValue(part, 'providerMetadata'), 'mastra');\n const dimensions = getObjectValue(mastraMetadata, 'imageDimensions');\n\n const width =\n getFiniteNumber(getObjectValue(part, 'width')) ??\n getFiniteNumber(getObjectValue(part, 'imageWidth')) ??\n getFiniteNumber(getObjectValue(dimensions, 'width'));\n const height =\n getFiniteNumber(getObjectValue(part, 'height')) ??\n getFiniteNumber(getObjectValue(part, 'imageHeight')) ??\n getFiniteNumber(getObjectValue(dimensions, 'height'));\n\n if (width && height) {\n return { width, height };\n }\n\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const buffer = decodeImageBuffer(asset);\n if (!buffer) {\n return { width, height };\n }\n\n try {\n const measured = imageSize(buffer);\n const measuredWidth = getFiniteNumber(measured.width);\n const measuredHeight = getFiniteNumber(measured.height);\n\n if (!measuredWidth || !measuredHeight) {\n return { width, height };\n }\n\n const resolved = {\n width: width ?? measuredWidth,\n height: height ?? measuredHeight,\n };\n\n persistImageDimensions(part, resolved as { width: number; height: number });\n return resolved;\n } catch {\n return { width, height };\n }\n}\n\nfunction getBase64Size(base64: string): number {\n const sanitized = base64.replace(/\\s+/g, '');\n const padding = sanitized.endsWith('==') ? 2 : sanitized.endsWith('=') ? 1 : 0;\n return Math.max(0, Math.floor((sanitized.length * 3) / 4) - padding);\n}\n\nfunction resolveImageSourceStats(image: unknown): { source: 'url' | 'data-uri' | 'binary'; sizeBytes?: number } {\n if (image instanceof URL) {\n return { source: 'url' };\n }\n\n if (typeof image === 'string') {\n if (isHttpUrlString(image)) {\n return { source: 'url' };\n }\n\n if (image.startsWith('data:')) {\n const commaIndex = image.indexOf(',');\n const encoded = commaIndex === -1 ? '' : image.slice(commaIndex + 1);\n return {\n source: 'data-uri',\n sizeBytes: getBase64Size(encoded),\n };\n }\n\n return {\n source: 'binary',\n sizeBytes: getBase64Size(image),\n };\n }\n\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(image)) {\n return { source: 'binary', sizeBytes: image.length };\n }\n\n if (image instanceof Uint8Array) {\n return { source: 'binary', sizeBytes: image.byteLength };\n }\n\n if (image instanceof ArrayBuffer) {\n return { source: 'binary', sizeBytes: image.byteLength };\n }\n\n if (ArrayBuffer.isView(image)) {\n return { source: 'binary', sizeBytes: image.byteLength };\n }\n\n return { source: 'binary' };\n}\n\nfunction getPathnameExtension(value: string): string | undefined {\n const normalized = value.split('#', 1)[0]?.split('?', 1)[0] ?? value;\n const match = normalized.match(/\\.([a-z0-9]+)$/i);\n return match?.[1]?.toLowerCase();\n}\n\nfunction hasImageFilenameExtension(filename: unknown): boolean {\n return typeof filename === 'string' && IMAGE_FILE_EXTENSIONS.has(getPathnameExtension(filename) ?? '');\n}\n\nfunction isImageLikeFilePart(part: CacheablePart): boolean {\n if (getObjectValue(part, 'type') !== 'file') {\n return false;\n }\n\n const mimeType = getObjectValue(part, 'mimeType');\n if (typeof mimeType === 'string' && mimeType.toLowerCase().startsWith('image/')) {\n return true;\n }\n\n const data = getObjectValue(part, 'data');\n if (typeof data === 'string' && data.startsWith('data:image/')) {\n return true;\n }\n\n if (data instanceof URL && hasImageFilenameExtension(data.pathname)) {\n return true;\n }\n\n if (isHttpUrlString(data)) {\n try {\n const url = new URL(data as string);\n if (hasImageFilenameExtension(url.pathname)) {\n return true;\n }\n } catch {\n // ignore invalid URL string\n }\n }\n\n return hasImageFilenameExtension(getObjectValue(part, 'filename'));\n}\n\nfunction resolveProviderId(modelContext?: TokenCounterModelContext): string | undefined {\n return modelContext?.provider?.toLowerCase();\n}\n\nfunction resolveModelId(modelContext?: TokenCounterModelContext): string {\n return modelContext?.modelId?.toLowerCase() ?? '';\n}\n\nfunction resolveOpenAIImageEstimatorConfig(modelContext?: TokenCounterModelContext): ImageTokenEstimatorConfig {\n const modelId = resolveModelId(modelContext);\n\n if (modelId.startsWith('gpt-5') || modelId === 'gpt-5-chat-latest') {\n return { baseTokens: 70, tileTokens: 140, fallbackTiles: 4 };\n }\n\n if (modelId.startsWith('gpt-4o-mini')) {\n return { baseTokens: 2833, tileTokens: 5667, fallbackTiles: 1 };\n }\n\n if (modelId.startsWith('o1') || modelId.startsWith('o3')) {\n return { baseTokens: 75, tileTokens: 150, fallbackTiles: 4 };\n }\n\n if (modelId.includes('computer-use')) {\n return { baseTokens: 65, tileTokens: 129, fallbackTiles: 4 };\n }\n\n return DEFAULT_IMAGE_ESTIMATOR;\n}\n\nfunction isGoogleGemini3Model(modelContext?: TokenCounterModelContext): boolean {\n return resolveProviderId(modelContext) === 'google' && resolveModelId(modelContext).startsWith('gemini-3');\n}\n\nfunction scaleDimensionsForOpenAIHighDetail(width: number, height: number): { width: number; height: number } {\n let scaledWidth = width;\n let scaledHeight = height;\n const largestSide = Math.max(scaledWidth, scaledHeight);\n\n if (largestSide > 2048) {\n const ratio = 2048 / largestSide;\n scaledWidth *= ratio;\n scaledHeight *= ratio;\n }\n\n const shortestSide = Math.min(scaledWidth, scaledHeight);\n if (shortestSide > 768) {\n const ratio = 768 / shortestSide;\n scaledWidth *= ratio;\n scaledHeight *= ratio;\n }\n\n return {\n width: Math.max(1, Math.round(scaledWidth)),\n height: Math.max(1, Math.round(scaledHeight)),\n };\n}\n\nfunction scaleDimensionsForAnthropic(width: number, height: number): { width: number; height: number } {\n const largestSide = Math.max(width, height);\n if (largestSide <= ANTHROPIC_IMAGE_MAX_LONG_EDGE) {\n return { width, height };\n }\n\n const ratio = ANTHROPIC_IMAGE_MAX_LONG_EDGE / largestSide;\n return {\n width: Math.max(1, Math.round(width * ratio)),\n height: Math.max(1, Math.round(height * ratio)),\n };\n}\n\nfunction estimateOpenAIHighDetailTiles(\n dimensions: { width?: number; height?: number },\n sourceStats: { sizeBytes?: number },\n estimator: ImageTokenEstimatorConfig,\n): number {\n if (dimensions.width && dimensions.height) {\n const scaled = scaleDimensionsForOpenAIHighDetail(dimensions.width, dimensions.height);\n return Math.max(1, Math.ceil(scaled.width / 512) * Math.ceil(scaled.height / 512));\n }\n\n if (sourceStats.sizeBytes !== undefined) {\n if (sourceStats.sizeBytes <= 512 * 1024) return 1;\n if (sourceStats.sizeBytes <= 2 * 1024 * 1024) return 4;\n if (sourceStats.sizeBytes <= 4 * 1024 * 1024) return 6;\n return 8;\n }\n\n return estimator.fallbackTiles;\n}\n\nfunction resolveEffectiveOpenAIImageDetail(\n detail: ImageTokenDetail,\n dimensions: { width?: number; height?: number },\n sourceStats: { sizeBytes?: number },\n): Exclude<ImageTokenDetail, 'auto'> {\n if (detail === 'low' || detail === 'high') return detail;\n\n if (dimensions.width && dimensions.height) {\n return Math.max(dimensions.width, dimensions.height) > 768 ? 'high' : 'low';\n }\n\n if (sourceStats.sizeBytes !== undefined) {\n return sourceStats.sizeBytes > 1024 * 1024 ? 'high' : 'low';\n }\n\n return 'low';\n}\n\nfunction estimateLegacyGoogleImageTiles(dimensions: { width?: number; height?: number }): number {\n if (!dimensions.width || !dimensions.height) return 1;\n return Math.max(1, Math.ceil(dimensions.width / 768) * Math.ceil(dimensions.height / 768));\n}\n\nfunction estimateAnthropicImageTokens(\n dimensions: { width?: number; height?: number },\n sourceStats: { sizeBytes?: number },\n): number {\n if (dimensions.width && dimensions.height) {\n const scaled = scaleDimensionsForAnthropic(dimensions.width, dimensions.height);\n return Math.max(1, Math.ceil(scaled.width * scaled.height * ANTHROPIC_IMAGE_TOKENS_PER_PIXEL));\n }\n\n if (sourceStats.sizeBytes !== undefined) {\n if (sourceStats.sizeBytes <= 512 * 1024) return 341;\n if (sourceStats.sizeBytes <= 2 * 1024 * 1024) return 1366;\n if (sourceStats.sizeBytes <= 4 * 1024 * 1024) return 2048;\n return 2731;\n }\n\n return 1600;\n}\n\nfunction estimateGoogleImageTokens(\n modelContext: TokenCounterModelContext | undefined,\n part: CacheablePart,\n dimensions: { width?: number; height?: number },\n): { tokens: number; mediaResolution: GoogleMediaResolution } {\n if (isGoogleGemini3Model(modelContext)) {\n const mediaResolution = resolveGoogleMediaResolution(part);\n return {\n tokens: GOOGLE_GEMINI_3_IMAGE_TOKENS_BY_RESOLUTION[mediaResolution],\n mediaResolution,\n };\n }\n\n return {\n tokens: estimateLegacyGoogleImageTiles(dimensions) * GOOGLE_LEGACY_IMAGE_TOKENS_PER_TILE,\n mediaResolution: 'unspecified',\n };\n}\n\nfunction getProviderApiKey(provider: string): string | undefined {\n for (const envVar of PROVIDER_API_KEY_ENV_VARS[provider] ?? []) {\n const value = process.env[envVar];\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim();\n }\n }\n\n return undefined;\n}\n\nfunction getAttachmentFilename(part: CacheablePart): string | undefined {\n const explicitFilename = getObjectValue(part, 'filename');\n if (typeof explicitFilename === 'string' && explicitFilename.trim().length > 0) {\n return explicitFilename.trim();\n }\n\n return getFilenameFromAttachmentData(getObjectValue(part, 'data') ?? getObjectValue(part, 'image'));\n}\n\nfunction getAttachmentMimeType(part: CacheablePart, fallback: string): string {\n const mimeType = getObjectValue(part, 'mimeType');\n if (typeof mimeType === 'string' && mimeType.trim().length > 0) {\n return mimeType.trim();\n }\n\n const asset = getObjectValue(part, 'data') ?? getObjectValue(part, 'image');\n if (typeof asset === 'string' && asset.startsWith('data:')) {\n const semicolonIndex = asset.indexOf(';');\n const commaIndex = asset.indexOf(',');\n const endIndex = semicolonIndex === -1 ? commaIndex : Math.min(semicolonIndex, commaIndex);\n if (endIndex > 5) {\n return asset.slice(5, endIndex);\n }\n }\n\n return fallback;\n}\n\nfunction getAttachmentUrl(asset: unknown): string | undefined {\n if (asset instanceof URL) {\n return asset.toString();\n }\n\n if (typeof asset === 'string' && /^(https?:\\/\\/|data:)/i.test(asset)) {\n return asset;\n }\n\n return undefined;\n}\n\nfunction getAttachmentFingerprint(asset: unknown): { url?: string; contentHash?: string } {\n const url = getAttachmentUrl(asset);\n if (url) {\n return { url };\n }\n\n const base64 = encodeAttachmentBase64(asset);\n if (base64) {\n return { contentHash: createHash('sha1').update(base64).digest('hex') };\n }\n\n return {};\n}\n\nfunction encodeAttachmentBase64(asset: unknown): string | undefined {\n if (typeof asset === 'string') {\n if (asset.startsWith('data:')) {\n const commaIndex = asset.indexOf(',');\n return commaIndex === -1 ? undefined : asset.slice(commaIndex + 1);\n }\n\n if (/^https?:\\/\\//i.test(asset)) {\n return undefined;\n }\n\n return asset;\n }\n\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(asset)) {\n return asset.toString('base64');\n }\n\n if (asset instanceof Uint8Array) {\n return Buffer.from(asset).toString('base64');\n }\n\n if (asset instanceof ArrayBuffer) {\n return Buffer.from(asset).toString('base64');\n }\n\n if (ArrayBuffer.isView(asset)) {\n return Buffer.from(asset.buffer, asset.byteOffset, asset.byteLength).toString('base64');\n }\n\n return undefined;\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal: AbortSignal; cleanup: () => void } {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(new Error(`Attachment token counting timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n const cleanup = () => clearTimeout(timeout);\n controller.signal.addEventListener('abort', cleanup, { once: true });\n return { signal: controller.signal, cleanup };\n}\n\nfunction getNumericResponseField(value: unknown, paths: string[][]): number | undefined {\n for (const path of paths) {\n let current: unknown = value;\n for (const segment of path) {\n current = getObjectValue(current, segment);\n if (current === undefined) break;\n }\n\n if (typeof current === 'number' && Number.isFinite(current)) {\n return current;\n }\n }\n\n return undefined;\n}\n\nfunction toOpenAIInputPart(part: CacheablePart): Record<string, unknown> | undefined {\n if (getObjectValue(part, 'type') === 'image' || isImageLikeFilePart(part)) {\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const imageUrl = getAttachmentUrl(asset);\n if (imageUrl) {\n return { type: 'input_image', image_url: imageUrl, detail: resolveImageDetail(part) };\n }\n\n const base64 = encodeAttachmentBase64(asset);\n if (!base64) return undefined;\n return {\n type: 'input_image',\n image_url: `data:${getAttachmentMimeType(part, 'image/png')};base64,${base64}`,\n detail: resolveImageDetail(part),\n };\n }\n\n if (getObjectValue(part, 'type') === 'file') {\n const asset = getObjectValue(part, 'data');\n const fileUrl = getAttachmentUrl(asset);\n return fileUrl\n ? {\n type: 'input_file',\n file_url: fileUrl,\n filename: getAttachmentFilename(part) ?? 'attachment',\n }\n : (() => {\n const base64 = encodeAttachmentBase64(asset);\n if (!base64) return undefined;\n return {\n type: 'input_file',\n file_data: `data:${getAttachmentMimeType(part, 'application/octet-stream')};base64,${base64}`,\n filename: getAttachmentFilename(part) ?? 'attachment',\n };\n })();\n }\n\n return undefined;\n}\n\nfunction toAnthropicContentPart(part: CacheablePart): Record<string, unknown> | undefined {\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const url = getAttachmentUrl(asset);\n\n if (getObjectValue(part, 'type') === 'image' || isImageLikeFilePart(part)) {\n return url && /^https?:\\/\\//i.test(url)\n ? { type: 'image', source: { type: 'url', url } }\n : (() => {\n const base64 = encodeAttachmentBase64(asset);\n if (!base64) return undefined;\n return {\n type: 'image',\n source: { type: 'base64', media_type: getAttachmentMimeType(part, 'image/png'), data: base64 },\n };\n })();\n }\n\n if (getObjectValue(part, 'type') === 'file') {\n return url && /^https?:\\/\\//i.test(url)\n ? { type: 'document', source: { type: 'url', url } }\n : (() => {\n const base64 = encodeAttachmentBase64(asset);\n if (!base64) return undefined;\n return {\n type: 'document',\n source: { type: 'base64', media_type: getAttachmentMimeType(part, 'application/pdf'), data: base64 },\n };\n })();\n }\n\n return undefined;\n}\n\nfunction toGooglePart(part: CacheablePart): Record<string, unknown> | undefined {\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const url = getAttachmentUrl(asset);\n const mimeType = getAttachmentMimeType(\n part,\n getObjectValue(part, 'type') === 'file' && !isImageLikeFilePart(part) ? 'application/pdf' : 'image/png',\n );\n\n if (url && !url.startsWith('data:')) {\n return { fileData: { mimeType, fileUri: url } };\n }\n\n const base64 = encodeAttachmentBase64(asset);\n if (!base64) return undefined;\n return { inlineData: { mimeType, data: base64 } };\n}\n\nasync function fetchOpenAIAttachmentTokenEstimate(modelId: string, part: CacheablePart): Promise<number | undefined> {\n const apiKey = getProviderApiKey('openai');\n const inputPart = toOpenAIInputPart(part);\n if (!apiKey || !inputPart) return undefined;\n\n const { signal, cleanup } = createTimeoutSignal(ATTACHMENT_COUNT_TIMEOUT_MS);\n try {\n const response = await fetch('https://api.openai.com/v1/responses/input_tokens', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: modelId,\n input: [{ type: 'message', role: 'user', content: [inputPart] }],\n }),\n signal,\n });\n\n if (!response.ok) return undefined;\n const body = await response.json();\n return getNumericResponseField(body, [\n ['input_tokens'],\n ['total_tokens'],\n ['usage', 'input_tokens'],\n ['usage', 'total_tokens'],\n ]);\n } finally {\n cleanup();\n }\n}\n\nasync function fetchAnthropicAttachmentTokenEstimate(\n modelId: string,\n part: CacheablePart,\n): Promise<number | undefined> {\n const apiKey = getProviderApiKey('anthropic');\n const contentPart = toAnthropicContentPart(part);\n if (!apiKey || !contentPart) return undefined;\n\n const { signal, cleanup } = createTimeoutSignal(ATTACHMENT_COUNT_TIMEOUT_MS);\n try {\n const response = await fetch('https://api.anthropic.com/v1/messages/count_tokens', {\n method: 'POST',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: modelId,\n messages: [{ role: 'user', content: [contentPart] }],\n }),\n signal,\n });\n\n if (!response.ok) return undefined;\n const body = await response.json();\n return getNumericResponseField(body, [['input_tokens']]);\n } finally {\n cleanup();\n }\n}\n\nasync function fetchGoogleAttachmentTokenEstimate(modelId: string, part: CacheablePart): Promise<number | undefined> {\n const apiKey = getProviderApiKey('google');\n const googlePart = toGooglePart(part);\n if (!apiKey || !googlePart) return undefined;\n\n const { signal, cleanup } = createTimeoutSignal(ATTACHMENT_COUNT_TIMEOUT_MS);\n try {\n const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${modelId}:countTokens`, {\n method: 'POST',\n headers: {\n 'x-goog-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n contents: [{ role: 'user', parts: [googlePart] }],\n }),\n signal,\n });\n\n if (!response.ok) return undefined;\n const body = await response.json();\n return getNumericResponseField(body, [['totalTokens'], ['total_tokens']]);\n } finally {\n cleanup();\n }\n}\n\n/**\n * Token counting utility using tokenx for rough local estimation and\n * provider-aware heuristics for image parts so multimodal prompts are not\n * undercounted as generic JSON blobs.\n */\nexport class TokenCounter {\n private readonly cacheSource: string;\n private readonly defaultModelContext?: TokenCounterModelContext;\n private readonly modelContextStorage = new AsyncLocalStorage<TokenCounterModelContext | undefined>();\n private readonly inFlightAttachmentCounts = new Map<string, Promise<number | undefined>>();\n\n // Per-message overhead: accounts for role tokens, message framing, and separators.\n // 3.8 remains a practical average across providers for OM thresholding.\n private static readonly TOKENS_PER_MESSAGE = 3.8;\n // Conversation-level overhead: system prompt framing, reply priming tokens, etc.\n private static readonly TOKENS_PER_CONVERSATION = 24;\n\n constructor(options?: TokenCounterOptions) {\n this.cacheSource = `v${TOKEN_ESTIMATE_CACHE_VERSION}:${resolveEstimatorId()}`;\n this.defaultModelContext = parseModelContext(options?.model);\n }\n\n runWithModelContext<T>(model: string | TokenCounterModelContext | undefined, fn: () => T): T {\n return this.modelContextStorage.run(parseModelContext(model), fn);\n }\n\n private getModelContext(): TokenCounterModelContext | undefined {\n return this.modelContextStorage.getStore() ?? this.defaultModelContext;\n }\n\n /**\n * Count tokens in a plain string\n */\n countString(text: string): number {\n if (!text) return 0;\n return estimateTokenCount(text);\n }\n\n private readOrPersistPartEstimate(part: CacheablePart, kind: string, payload: string): number {\n const key = buildEstimateKey(kind, payload);\n const cached = getPartCacheEntry(part, key);\n if (isValidCacheEntry(cached, key, this.cacheSource)) {\n return cached.tokens;\n }\n\n const tokens = this.countString(payload);\n setPartCacheEntry(part, key, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key,\n tokens,\n });\n\n return tokens;\n }\n\n private readOrPersistFixedPartEstimate(part: CacheablePart, kind: string, payload: string, tokens: number): number {\n const key = buildEstimateKey(kind, payload);\n const cached = getPartCacheEntry(part, key);\n if (isValidCacheEntry(cached, key, this.cacheSource)) {\n return cached.tokens;\n }\n\n setPartCacheEntry(part, key, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key,\n tokens,\n });\n\n return tokens;\n }\n\n private readOrPersistMessageEstimate(message: MastraDBMessage, kind: string, payload: string): number {\n const key = buildEstimateKey(kind, payload);\n const cached = getMessageCacheEntry(message, key);\n if (isValidCacheEntry(cached, key, this.cacheSource)) {\n return cached.tokens;\n }\n\n const tokens = this.countString(payload);\n setMessageCacheEntry(message, key, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key,\n tokens,\n });\n\n return tokens;\n }\n\n private resolveToolResultForTokenCounting(\n part: CacheablePart,\n invocationResult: unknown,\n ): { value: unknown; usingStoredModelOutput: boolean } {\n return resolveToolResultValue(part as { providerMetadata?: Record<string, any> }, invocationResult);\n }\n\n private estimateImageAssetTokens(part: CacheablePart, asset: unknown, kind: 'image' | 'file'): ImageTokenEstimate {\n const modelContext = this.getModelContext();\n const provider = resolveProviderId(modelContext);\n const modelId = modelContext?.modelId ?? null;\n const detail = resolveImageDetail(part);\n const dimensions = resolveImageDimensions(part);\n const sourceStats = resolveImageSourceStats(asset);\n\n if (provider === 'google') {\n const googleEstimate = estimateGoogleImageTokens(modelContext, part, dimensions);\n return {\n tokens: googleEstimate.tokens,\n cachePayload: JSON.stringify({\n kind,\n provider,\n modelId,\n estimator: isGoogleGemini3Model(modelContext) ? 'google-gemini-3' : 'google-legacy',\n mediaResolution: googleEstimate.mediaResolution,\n width: dimensions.width ?? null,\n height: dimensions.height ?? null,\n source: sourceStats.source,\n sizeBytes: sourceStats.sizeBytes ?? null,\n mimeType: getObjectValue(part, 'mimeType') ?? null,\n filename: getObjectValue(part, 'filename') ?? null,\n }),\n };\n }\n\n if (provider === 'anthropic') {\n return {\n tokens: estimateAnthropicImageTokens(dimensions, sourceStats),\n cachePayload: JSON.stringify({\n kind,\n provider,\n modelId,\n estimator: 'anthropic',\n width: dimensions.width ?? null,\n height: dimensions.height ?? null,\n source: sourceStats.source,\n sizeBytes: sourceStats.sizeBytes ?? null,\n mimeType: getObjectValue(part, 'mimeType') ?? null,\n filename: getObjectValue(part, 'filename') ?? null,\n }),\n };\n }\n\n const estimator = resolveOpenAIImageEstimatorConfig(modelContext);\n const effectiveDetail = resolveEffectiveOpenAIImageDetail(detail, dimensions, sourceStats);\n const tiles = effectiveDetail === 'high' ? estimateOpenAIHighDetailTiles(dimensions, sourceStats, estimator) : 0;\n const tokens = estimator.baseTokens + tiles * estimator.tileTokens;\n\n return {\n tokens,\n cachePayload: JSON.stringify({\n kind,\n provider,\n modelId,\n estimator: provider === 'openai' ? 'openai' : 'fallback',\n detail,\n effectiveDetail,\n width: dimensions.width ?? null,\n height: dimensions.height ?? null,\n source: sourceStats.source,\n sizeBytes: sourceStats.sizeBytes ?? null,\n mimeType: getObjectValue(part, 'mimeType') ?? null,\n filename: getObjectValue(part, 'filename') ?? null,\n }),\n };\n }\n\n private estimateImageTokens(part: CacheablePart): ImageTokenEstimate {\n return this.estimateImageAssetTokens(part, part.image, 'image');\n }\n\n private estimateImageLikeFileTokens(part: CacheablePart): ImageTokenEstimate {\n return this.estimateImageAssetTokens(part, part.data, 'file');\n }\n\n private countAttachmentPartSync(part: CacheablePart): number | undefined {\n if (part.type === 'image') {\n const estimate = this.estimateImageTokens(part);\n return this.readOrPersistFixedPartEstimate(part, 'image', estimate.cachePayload, estimate.tokens);\n }\n\n if (part.type === 'file' && isImageLikeFilePart(part)) {\n const estimate = this.estimateImageLikeFileTokens(part);\n return this.readOrPersistFixedPartEstimate(part, 'image-like-file', estimate.cachePayload, estimate.tokens);\n }\n\n if (part.type === 'file') {\n return this.readOrPersistPartEstimate(part, 'file-descriptor', serializeNonImageFilePartForTokenCounting(part));\n }\n\n return undefined;\n }\n\n private buildRemoteAttachmentCachePayload(part: CacheablePart): string | undefined {\n const isImageAttachment = part.type === 'image' || (part.type === 'file' && isImageLikeFilePart(part));\n const isNonImageFileAttachment = part.type === 'file' && !isImageAttachment;\n if (!isImageAttachment && !isNonImageFileAttachment) {\n return undefined;\n }\n\n const modelContext = this.getModelContext();\n const provider = resolveProviderId(modelContext);\n const modelId = modelContext?.modelId ?? null;\n if (!provider || !modelId || !['openai', 'google', 'anthropic'].includes(provider)) {\n return undefined;\n }\n\n const asset = getObjectValue(part, 'image') ?? getObjectValue(part, 'data');\n const sourceStats = resolveImageSourceStats(asset);\n const fingerprint = getAttachmentFingerprint(asset);\n return JSON.stringify({\n strategy: 'provider-endpoint',\n provider,\n modelId,\n type: getObjectValue(part, 'type') ?? null,\n detail: isImageAttachment ? resolveImageDetail(part) : null,\n mediaResolution: provider === 'google' && isImageAttachment ? resolveGoogleMediaResolution(part) : null,\n mimeType: getAttachmentMimeType(part, isNonImageFileAttachment ? 'application/pdf' : 'image/png'),\n filename: getAttachmentFilename(part) ?? null,\n source: sourceStats.source,\n sizeBytes: sourceStats.sizeBytes ?? null,\n assetUrl: fingerprint.url ?? null,\n assetHash: fingerprint.contentHash ?? null,\n });\n }\n\n private async fetchProviderAttachmentTokenEstimate(part: CacheablePart): Promise<number | undefined> {\n const modelContext = this.getModelContext();\n const provider = resolveProviderId(modelContext);\n const modelId = modelContext?.modelId;\n if (!provider || !modelId) return undefined;\n\n try {\n if (provider === 'openai') {\n return await fetchOpenAIAttachmentTokenEstimate(modelId, part);\n }\n\n if (provider === 'google') {\n return await fetchGoogleAttachmentTokenEstimate(modelId, part);\n }\n\n if (provider === 'anthropic') {\n return await fetchAnthropicAttachmentTokenEstimate(modelId, part);\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n }\n\n private async countAttachmentPartAsync(part: CacheablePart): Promise<number | undefined> {\n const isImageAttachment = part.type === 'image' || (part.type === 'file' && isImageLikeFilePart(part));\n const remotePayload = this.buildRemoteAttachmentCachePayload(part);\n\n if (remotePayload) {\n const remoteKey = buildEstimateKey('attachment-provider', remotePayload);\n const cachedRemote = getPartCacheEntry(part, remoteKey);\n if (isValidCacheEntry(cachedRemote, remoteKey, this.cacheSource)) {\n return cachedRemote.tokens;\n }\n\n const existingRequest = this.inFlightAttachmentCounts.get(remoteKey);\n if (existingRequest) {\n const remoteTokens = await existingRequest;\n if (typeof remoteTokens === 'number' && Number.isFinite(remoteTokens) && remoteTokens > 0) {\n setPartCacheEntry(part, remoteKey, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key: remoteKey,\n tokens: remoteTokens,\n });\n return remoteTokens;\n }\n } else {\n const remoteRequest = this.fetchProviderAttachmentTokenEstimate(part);\n this.inFlightAttachmentCounts.set(remoteKey, remoteRequest);\n\n let remoteTokens: number | undefined;\n try {\n remoteTokens = await remoteRequest;\n } finally {\n this.inFlightAttachmentCounts.delete(remoteKey);\n }\n\n if (typeof remoteTokens === 'number' && Number.isFinite(remoteTokens) && remoteTokens > 0) {\n setPartCacheEntry(part, remoteKey, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key: remoteKey,\n tokens: remoteTokens,\n });\n return remoteTokens;\n }\n }\n\n if (isImageAttachment) {\n await resolveImageDimensionsAsync(part);\n }\n\n const fallbackPayload = JSON.stringify({\n ...JSON.parse(remotePayload),\n strategy: 'local-fallback',\n ...(isImageAttachment ? resolveImageDimensions(part) : {}),\n });\n const fallbackKey = buildEstimateKey('attachment-provider', fallbackPayload);\n const cachedFallback = getPartCacheEntry(part, fallbackKey);\n if (isValidCacheEntry(cachedFallback, fallbackKey, this.cacheSource)) {\n return cachedFallback.tokens;\n }\n\n const localTokens = this.countAttachmentPartSync(part);\n if (localTokens === undefined) {\n return undefined;\n }\n\n setPartCacheEntry(part, fallbackKey, {\n v: TOKEN_ESTIMATE_CACHE_VERSION,\n source: this.cacheSource,\n key: fallbackKey,\n tokens: localTokens,\n });\n return localTokens;\n }\n\n if (isImageAttachment) {\n await resolveImageDimensionsAsync(part);\n }\n\n const localTokens = this.countAttachmentPartSync(part);\n return localTokens;\n }\n\n private countNonAttachmentPart(part: CacheablePart): {\n tokens: number;\n overheadDelta: number;\n toolResultDelta: number;\n } {\n let overheadDelta = 0;\n let toolResultDelta = 0;\n\n if (part.type === 'text') {\n return { tokens: this.readOrPersistPartEstimate(part, 'text', part.text), overheadDelta, toolResultDelta };\n }\n\n if (part.type === 'tool-invocation') {\n const invocation = part.toolInvocation;\n let tokens = 0;\n\n if (invocation.state === 'call' || invocation.state === 'partial-call') {\n if (invocation.toolName) {\n tokens += this.readOrPersistPartEstimate(part, `tool-${invocation.state}-name`, invocation.toolName);\n }\n if (invocation.args) {\n if (typeof invocation.args === 'string') {\n tokens += this.readOrPersistPartEstimate(part, `tool-${invocation.state}-args`, invocation.args);\n } else {\n const argsJson = JSON.stringify(invocation.args);\n tokens += this.readOrPersistPartEstimate(part, `tool-${invocation.state}-args-json`, argsJson);\n overheadDelta -= 12;\n }\n }\n\n return { tokens, overheadDelta, toolResultDelta };\n }\n\n if (invocation.state === 'result') {\n toolResultDelta++;\n const { value: resultForCounting, usingStoredModelOutput } = this.resolveToolResultForTokenCounting(\n part,\n invocation.result,\n );\n\n if (resultForCounting !== undefined) {\n const formattedResult = formatToolResultForObserver(resultForCounting);\n tokens += this.readOrPersistPartEstimate(\n part,\n usingStoredModelOutput ? 'tool-result-model-output-json' : 'tool-result-json',\n formattedResult,\n );\n if (typeof resultForCounting !== 'string') {\n overheadDelta -= 12;\n }\n }\n\n return { tokens, overheadDelta, toolResultDelta };\n }\n\n throw new Error(\n `Unhandled tool-invocation state '${(part as any).toolInvocation?.state}' in token counting for part type '${part.type}'`,\n );\n }\n\n if (typeof part.type === 'string' && part.type.startsWith('data-')) {\n return { tokens: 0, overheadDelta, toolResultDelta };\n }\n\n if (part.type === 'reasoning') {\n return { tokens: 0, overheadDelta, toolResultDelta };\n }\n\n const serialized = serializePartForTokenCounting(part);\n return {\n tokens: this.readOrPersistPartEstimate(part, `part-${part.type}`, serialized),\n overheadDelta,\n toolResultDelta,\n };\n }\n\n /**\n * Count tokens in a single message\n */\n countMessage(message: MastraDBMessage): number {\n let payloadTokens = this.countString(message.role);\n let overhead = TokenCounter.TOKENS_PER_MESSAGE;\n let toolResultCount = 0;\n\n if (typeof message.content === 'string') {\n payloadTokens += this.readOrPersistMessageEstimate(message, 'message-content', message.content);\n } else if (message.content && typeof message.content === 'object') {\n if (message.content.content && !Array.isArray(message.content.parts)) {\n payloadTokens += this.readOrPersistMessageEstimate(message, 'content-content', message.content.content);\n } else if (Array.isArray(message.content.parts)) {\n for (const part of message.content.parts as CacheablePart[]) {\n const attachmentTokens = this.countAttachmentPartSync(part);\n if (attachmentTokens !== undefined) {\n payloadTokens += attachmentTokens;\n continue;\n }\n\n const result = this.countNonAttachmentPart(part);\n payloadTokens += result.tokens;\n overhead += result.overheadDelta;\n toolResultCount += result.toolResultDelta;\n }\n }\n }\n\n if (toolResultCount > 0) {\n overhead += toolResultCount * TokenCounter.TOKENS_PER_MESSAGE;\n }\n\n return Math.round(payloadTokens + overhead);\n }\n\n async countMessageAsync(message: MastraDBMessage): Promise<number> {\n let payloadTokens = this.countString(message.role);\n let overhead = TokenCounter.TOKENS_PER_MESSAGE;\n let toolResultCount = 0;\n\n if (typeof message.content === 'string') {\n payloadTokens += this.readOrPersistMessageEstimate(message, 'message-content', message.content);\n } else if (message.content && typeof message.content === 'object') {\n if (message.content.content && !Array.isArray(message.content.parts)) {\n payloadTokens += this.readOrPersistMessageEstimate(message, 'content-content', message.content.content);\n } else if (Array.isArray(message.content.parts)) {\n for (const part of message.content.parts as CacheablePart[]) {\n const attachmentTokens = await this.countAttachmentPartAsync(part);\n if (attachmentTokens !== undefined) {\n payloadTokens += attachmentTokens;\n continue;\n }\n\n const result = this.countNonAttachmentPart(part);\n payloadTokens += result.tokens;\n overhead += result.overheadDelta;\n toolResultCount += result.toolResultDelta;\n }\n }\n }\n\n if (toolResultCount > 0) {\n overhead += toolResultCount * TokenCounter.TOKENS_PER_MESSAGE;\n }\n\n return Math.round(payloadTokens + overhead);\n }\n\n /**\n * Count tokens in an array of messages\n */\n countMessages(messages: MastraDBMessage[]): number {\n if (!messages || messages.length === 0) return 0;\n\n let total = TokenCounter.TOKENS_PER_CONVERSATION;\n for (const message of messages) {\n total += this.countMessage(message);\n }\n return total;\n }\n\n async countMessagesAsync(messages: MastraDBMessage[]): Promise<number> {\n if (!messages || messages.length === 0) return 0;\n\n const messageTotals = await Promise.all(messages.map(message => this.countMessageAsync(message)));\n return TokenCounter.TOKENS_PER_CONVERSATION + messageTotals.reduce((sum, count) => sum + count, 0);\n }\n\n /**\n * Count tokens in observations string\n */\n countObservations(observations: string): number {\n return this.countString(observations);\n }\n}\n","import type { MastraDBMessage, MessageList } from '@mastra/core/agent';\nimport { coreFeatures } from '@mastra/core/features';\nimport type { MastraModelConfig } from '@mastra/core/llm';\nimport { resolveModelConfig } from '@mastra/core/llm';\nimport { getThreadOMMetadata, setThreadOMMetadata } from '@mastra/core/memory';\nimport type { ObservabilityContext } from '@mastra/core/observability';\nimport type { ProcessorStreamWriter } from '@mastra/core/processors';\nimport { MessageHistory } from '@mastra/core/processors';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage, ObservationalMemoryRecord, ObservationalMemoryHistoryOptions } from '@mastra/core/storage';\nimport xxhash from 'xxhash-wasm';\n\nimport { BufferingCoordinator } from './buffering-coordinator';\nimport {\n OBSERVATIONAL_MEMORY_DEFAULTS,\n OBSERVATION_CONTEXT_PROMPT,\n OBSERVATION_CONTEXT_INSTRUCTIONS,\n OBSERVATION_RETRIEVAL_INSTRUCTIONS,\n} from './constants';\n\n/**\n * Returns the parts from the latest step of a message (after the last step-start marker).\n * If no step-start marker exists, returns all parts.\n */\nexport function getLatestStepParts(parts: MastraDBMessage['content']['parts']): MastraDBMessage['content']['parts'] {\n for (let i = parts.length - 1; i >= 0; i--) {\n if (parts[i]?.type === 'step-start') {\n return parts.slice(i + 1);\n }\n }\n return parts;\n}\n\n/**\n * Returns true when a message contains at least one part with visible user/assistant\n * content (text, tool-invocation, reasoning, image, file). Messages that only carry\n * internal `data-*` parts (buffering markers, observation markers, etc.) return false.\n */\nfunction messageHasVisibleContent(msg: MastraDBMessage): boolean {\n const content = msg.content as { parts?: Array<{ type?: string }>; content?: string };\n if (content?.parts && Array.isArray(content.parts)) {\n return content.parts.some(p => {\n const t = p?.type;\n return t && !t.startsWith('data-') && t !== 'step-start';\n });\n }\n if (content?.content) return true;\n return false;\n}\n\n/**\n * Build a messageRange string from the first and last messages that have visible\n * content. Falls back to the full array boundaries when every message is data-only.\n */\nexport function buildMessageRange(messages: MastraDBMessage[]): string {\n const first = messages.find(messageHasVisibleContent) ?? messages[0]!;\n const last = [...messages].reverse().find(messageHasVisibleContent) ?? messages[messages.length - 1]!;\n return `${first.id}:${last.id}`;\n}\n\nimport { addRelativeTimeToObservations } from './date-utils';\nimport { omDebug, omError } from './debug';\nimport { createBufferingStartMarker, createActivationMarker } from './markers';\nimport {\n findLastCompletedObservationBoundary,\n getUnobservedParts,\n getBufferedChunks,\n stripThreadTags,\n} from './message-utils';\nimport { ModelByInputTokens } from './model-by-input-tokens';\nimport { renderObservationGroupsForReflection, wrapInObservationGroup } from './observation-groups';\nimport { ObservationStrategy } from './observation-strategies/index';\nimport { ObservationTurn } from './observation-turn/index';\nimport type { ObservationTurnHooks } from './observation-turn/types';\nimport { optimizeObservationsForContext, formatMessagesForObserver } from './observer-agent';\nimport { ObserverRunner } from './observer-runner';\nimport { registerOp, unregisterOp, isOpActiveInProcess } from './operation-registry';\nimport type { CompressionLevel } from './reflector-agent';\nimport { ReflectorRunner } from './reflector-runner';\nimport { isOmReproCaptureEnabled, writeObserverExchangeReproCapture } from './repro-capture';\nimport {\n calculateDynamicThreshold,\n calculateProjectedMessageRemoval,\n getMaxThreshold,\n resolveActivationRatio,\n resolveBlockAfter,\n resolveBufferTokens,\n} from './thresholds';\nimport { TokenCounter } from './token-counter';\nimport type { TokenCounterModelContext } from './token-counter';\nimport type {\n DataOmStatusPart,\n ObservationDebugEvent,\n ObservationalMemoryConfig,\n ObservationalMemoryModel,\n ObserveHookUsage,\n ObserveHooks,\n ResolvedObservationConfig,\n ResolvedReflectionConfig,\n ThresholdRange,\n ObservationMarkerConfig,\n} from './types';\n\n/**\n * ObservationalMemory - A three-agent memory system for long conversations.\n *\n * This processor:\n * 1. On input: Injects observations into context, filters out observed messages\n * 2. On output: Tracks new messages, triggers Observer/Reflector when thresholds hit\n *\n * The Actor (main agent) sees:\n * - Observations (compressed history)\n * - Suggested continuation message\n * - Recent unobserved messages\n *\n * @example\n * ```ts\n * import { ObservationalMemory } from '@mastra/memory/processors';\n *\n * // Minimal configuration\n * const om = new ObservationalMemory({ storage });\n *\n * // Full configuration\n * const om = new ObservationalMemory({\n * storage,\n * model: 'google/gemini-2.5-flash', // shared model for both agents\n * shareTokenBudget: true,\n * observation: {\n * messageTokens: 30_000,\n * modelSettings: { temperature: 0.3 },\n * },\n * reflection: {\n * observationTokens: 40_000,\n * },\n * });\n *\n * const agent = new Agent({\n * inputProcessors: [om],\n * outputProcessors: [om],\n * });\n * ```\n */\nexport class ObservationalMemory {\n private storage: MemoryStorage;\n private tokenCounter: TokenCounter;\n readonly scope: 'resource' | 'thread';\n /** Whether retrieval-mode observation groups are enabled. */\n readonly retrieval: boolean;\n private observationConfig: ResolvedObservationConfig;\n private reflectionConfig: ResolvedReflectionConfig;\n private onDebugEvent?: (event: ObservationDebugEvent) => void;\n readonly onIndexObservations?: (observation: {\n text: string;\n groupId: string;\n range: string;\n threadId: string;\n resourceId: string;\n observedAt?: Date;\n }) => Promise<void>;\n\n /** Observer agent runner — handles LLM calls for extracting observations. */\n readonly observer: ObserverRunner;\n\n /** Reflector agent runner — handles LLM calls for compressing observations. */\n readonly reflector: ReflectorRunner;\n\n /** Buffering state coordinator — manages static maps and buffering lifecycle. */\n readonly buffering: BufferingCoordinator;\n\n private shouldObscureThreadIds = false;\n private hasher = xxhash();\n\n /**\n * Track message IDs observed during this instance's lifetime.\n * Prevents re-observing messages when per-thread lastObservedAt cursors\n * haven't fully advanced past messages observed in a prior cycle.\n * @internal Used by observation strategies. Do not call directly.\n */\n observedMessageIds = new Set<string>();\n\n /** Internal MessageHistory for message persistence */\n private messageHistory: MessageHistory;\n\n /**\n * In-memory mutex for serializing observation/reflection cycles per resource/thread.\n * Prevents race conditions where two concurrent cycles could both read isObserving=false\n * before either sets it to true, leading to lost work.\n *\n * Key format: \"resource:{resourceId}\" or \"thread:{threadId}\"\n * Value: Promise that resolves when the lock is released\n *\n * NOTE: This mutex only works within a single Node.js process. For distributed\n * deployments, external locking (Redis, database locks) would be needed, or\n * accept eventual consistency (acceptable for v1).\n */\n private locks = new Map<string, Promise<void>>();\n\n /**\n * Acquire a lock for the given key, execute the callback, then release.\n * If a lock is already held, waits for it to be released before acquiring.\n */\n private async withLock<T>(key: string, fn: () => Promise<T>): Promise<T> {\n // Wait for any existing lock to be released\n const existingLock = this.locks.get(key);\n if (existingLock) {\n await existingLock;\n }\n\n // Create a new lock\n let releaseLock: () => void;\n const lockPromise = new Promise<void>(resolve => {\n releaseLock = resolve;\n });\n this.locks.set(key, lockPromise);\n\n try {\n return await fn();\n } finally {\n // Release the lock\n releaseLock!();\n // Clean up if this is still our lock\n if (this.locks.get(key) === lockPromise) {\n this.locks.delete(key);\n }\n }\n }\n\n constructor(config: ObservationalMemoryConfig) {\n if (!coreFeatures.has('request-response-id-rotation')) {\n throw new Error(\n 'Observational memory requires @mastra/core support for request-response-id-rotation. Please bump @mastra/core to a newer version.',\n );\n }\n\n // Validate that top-level model is not used together with sub-config models\n if (config.model && config.observation?.model) {\n throw new Error(\n 'Cannot set both `model` and `observation.model`. Use `model` to set both agents, or set each individually.',\n );\n }\n if (config.model && config.reflection?.model) {\n throw new Error(\n 'Cannot set both `model` and `reflection.model`. Use `model` to set both agents, or set each individually.',\n );\n }\n\n this.shouldObscureThreadIds = config.obscureThreadIds || false;\n this.storage = config.storage;\n this.scope = config.scope ?? 'thread';\n this.retrieval = Boolean(config.retrieval);\n this.onIndexObservations = config.onIndexObservations;\n\n // Resolve \"default\" to the default model\n const resolveModel = (m: typeof config.model) =>\n m === 'default' ? OBSERVATIONAL_MEMORY_DEFAULTS.observation.model : m;\n\n // Require an explicit model — no silent default.\n // Resolution order: top-level model → sub-config model → the other sub-config model → error\n const observationModel =\n resolveModel(config.model) ?? resolveModel(config.observation?.model) ?? resolveModel(config.reflection?.model);\n const reflectionModel =\n resolveModel(config.model) ?? resolveModel(config.reflection?.model) ?? resolveModel(config.observation?.model);\n\n if (!observationModel || !reflectionModel) {\n throw new Error(\n `Observational Memory requires a model to be set. Use \\`observationalMemory: true\\` for the default (google/gemini-2.5-flash), or set a model explicitly:\\n\\n` +\n ` observationalMemory: {\\n` +\n ` model: \"$provider/$model\",\\n` +\n ` }\\n\\n` +\n `See https://mastra.ai/docs/memory/observational-memory#models for model recommendations and alternatives.`,\n );\n }\n\n // Get base thresholds first (needed for shared budget calculation)\n const messageTokens = config.observation?.messageTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.messageTokens;\n const observationTokens =\n config.reflection?.observationTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.observationTokens;\n const isSharedBudget = config.shareTokenBudget ?? false;\n\n const isDefaultModelSelection = (model: ObservationalMemoryModel | undefined) =>\n model === undefined || model === 'default' || model instanceof ModelByInputTokens;\n\n const observationSelectedModel = config.model ?? config.observation?.model ?? config.reflection?.model;\n const reflectionSelectedModel = config.model ?? config.reflection?.model ?? config.observation?.model;\n\n const observationDefaultMaxOutputTokens =\n config.observation?.modelSettings?.maxOutputTokens ??\n (isDefaultModelSelection(observationSelectedModel)\n ? OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.maxOutputTokens\n : undefined);\n\n const reflectionDefaultMaxOutputTokens =\n config.reflection?.modelSettings?.maxOutputTokens ??\n (isDefaultModelSelection(reflectionSelectedModel)\n ? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.maxOutputTokens\n : undefined);\n\n // Total context budget when shared budget is enabled\n const totalBudget = messageTokens + observationTokens;\n\n // Async buffering is disabled when:\n // - bufferTokens: false is explicitly set\n // - scope is 'resource' and the user did NOT explicitly configure async buffering\n // (if they did, validateBufferConfig will throw a helpful error)\n const userExplicitlyConfiguredAsync =\n config.observation?.bufferTokens !== undefined ||\n config.observation?.bufferActivation !== undefined ||\n config.reflection?.bufferActivation !== undefined;\n const asyncBufferingDisabled =\n config.observation?.bufferTokens === false || (config.scope === 'resource' && !userExplicitlyConfiguredAsync);\n\n // shareTokenBudget is not yet compatible with async buffering (temporary limitation).\n // To use shareTokenBudget, users must explicitly disable buffering.\n if (isSharedBudget && !asyncBufferingDisabled) {\n const common =\n `shareTokenBudget requires async buffering to be disabled (this is a temporary limitation). ` +\n `Add observation: { bufferTokens: false } to your config:\\n\\n` +\n ` observationalMemory: {\\n` +\n ` shareTokenBudget: true,\\n` +\n ` observation: { bufferTokens: false },\\n` +\n ` }\\n`;\n if (userExplicitlyConfiguredAsync) {\n throw new Error(\n common + `\\nRemove any other async buffering settings (bufferTokens, bufferActivation, blockAfter).`,\n );\n } else {\n throw new Error(\n common + `\\nAsync buffering is enabled by default — this opt-out is only needed when using shareTokenBudget.`,\n );\n }\n }\n\n // Resolve observation config with defaults\n this.observationConfig = {\n model: observationModel,\n // When shared budget, store as range: min = base threshold, max = total budget\n // This allows messages to expand into unused observation space\n messageTokens: isSharedBudget ? { min: messageTokens, max: totalBudget } : messageTokens,\n shareTokenBudget: isSharedBudget,\n modelSettings: {\n temperature:\n config.observation?.modelSettings?.temperature ??\n OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.temperature,\n ...(observationDefaultMaxOutputTokens !== undefined\n ? { maxOutputTokens: observationDefaultMaxOutputTokens }\n : {}),\n },\n providerOptions: config.observation?.providerOptions ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.providerOptions,\n maxTokensPerBatch:\n config.observation?.maxTokensPerBatch ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.maxTokensPerBatch,\n bufferTokens: asyncBufferingDisabled\n ? undefined\n : resolveBufferTokens(\n config.observation?.bufferTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.bufferTokens,\n config.observation?.messageTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.messageTokens,\n ),\n bufferActivation: asyncBufferingDisabled\n ? undefined\n : (config.observation?.bufferActivation ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.bufferActivation),\n blockAfter: asyncBufferingDisabled\n ? undefined\n : resolveBlockAfter(\n config.observation?.blockAfter ??\n ((config.observation?.bufferTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.bufferTokens)\n ? 1.2\n : undefined),\n config.observation?.messageTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.messageTokens,\n ),\n previousObserverTokens: config.observation?.previousObserverTokens ?? 2000,\n instruction: config.observation?.instruction,\n threadTitle: config.observation?.threadTitle ?? false,\n };\n\n // Resolve reflection config with defaults\n this.reflectionConfig = {\n model: reflectionModel,\n observationTokens: observationTokens,\n shareTokenBudget: isSharedBudget,\n modelSettings: {\n temperature:\n config.reflection?.modelSettings?.temperature ??\n OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.temperature,\n ...(reflectionDefaultMaxOutputTokens !== undefined\n ? { maxOutputTokens: reflectionDefaultMaxOutputTokens }\n : {}),\n },\n providerOptions: config.reflection?.providerOptions ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.providerOptions,\n bufferActivation: asyncBufferingDisabled\n ? undefined\n : (config?.reflection?.bufferActivation ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.bufferActivation),\n blockAfter: asyncBufferingDisabled\n ? undefined\n : resolveBlockAfter(\n config.reflection?.blockAfter ??\n ((config.reflection?.bufferActivation ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.bufferActivation)\n ? 1.2\n : undefined),\n config.reflection?.observationTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.observationTokens,\n ),\n instruction: config.reflection?.instruction,\n };\n\n this.tokenCounter = new TokenCounter({\n model: typeof observationModel === 'string' ? observationModel : undefined,\n });\n this.onDebugEvent = config.onDebugEvent;\n\n // Create internal MessageHistory for message persistence\n // OM handles message saving itself (in processOutputStep) instead of relying on\n // the Memory class's MessageHistory processor\n this.messageHistory = new MessageHistory({ storage: this.storage });\n\n this.observer = new ObserverRunner({\n observationConfig: this.observationConfig,\n observedMessageIds: this.observedMessageIds,\n resolveModel: inputTokens => this.resolveObservationModel(inputTokens),\n tokenCounter: this.tokenCounter,\n });\n\n this.buffering = new BufferingCoordinator({\n observationConfig: this.observationConfig,\n reflectionConfig: this.reflectionConfig,\n scope: this.scope,\n });\n\n this.reflector = new ReflectorRunner({\n reflectionConfig: this.reflectionConfig,\n observationConfig: this.observationConfig,\n tokenCounter: this.tokenCounter,\n storage: this.storage,\n scope: this.scope,\n buffering: this.buffering,\n emitDebugEvent: e => this.emitDebugEvent(e),\n persistMarkerToStorage: (m, t, r) => this.persistMarkerToStorage(m, t, r),\n persistMarkerToMessage: (m, ml, t, r) => this.persistMarkerToMessage(m, ml, t, r),\n getCompressionStartLevel: rc => this.getCompressionStartLevel(rc),\n resolveModel: inputTokens => this.resolveReflectionModel(inputTokens),\n });\n\n // Validate buffer configuration\n this.validateBufferConfig();\n\n omDebug(\n `[OM:init] new ObservationalMemory instance created — scope=${this.scope}, messageTokens=${JSON.stringify(this.observationConfig.messageTokens)}, obsAsyncEnabled=${this.buffering.isAsyncObservationEnabled()}, bufferTokens=${this.observationConfig.bufferTokens}, bufferActivation=${this.observationConfig.bufferActivation}, blockAfter=${this.observationConfig.blockAfter}, reflectionTokens=${this.reflectionConfig.observationTokens}, refAsyncEnabled=${this.buffering.isAsyncReflectionEnabled()}, refAsyncActivation=${this.reflectionConfig.bufferActivation}, refBlockAfter=${this.reflectionConfig.blockAfter}`,\n );\n }\n\n /**\n * Get the current configuration for this OM instance.\n * Used by the server to expose config to the UI when OM is added via processors.\n */\n get config(): {\n scope: 'resource' | 'thread';\n retrieval: boolean;\n observation: {\n messageTokens: number | ThresholdRange;\n previousObserverTokens: number | false | undefined;\n };\n reflection: {\n observationTokens: number | ThresholdRange;\n };\n } {\n return {\n scope: this.scope,\n retrieval: this.retrieval,\n observation: {\n messageTokens: this.observationConfig.messageTokens,\n previousObserverTokens: this.observationConfig.previousObserverTokens,\n },\n reflection: {\n observationTokens: this.reflectionConfig.observationTokens,\n },\n };\n }\n\n /**\n * Wait for any in-flight async buffering operations for the given thread/resource.\n * Used by server endpoints to block until buffering completes so the UI can get final state.\n */\n async waitForBuffering(\n threadId: string | null | undefined,\n resourceId: string | null | undefined,\n timeoutMs = 30000,\n ): Promise<void> {\n return BufferingCoordinator.awaitBuffering(threadId, resourceId, this.scope, timeoutMs);\n }\n\n private getConcreteModel(\n model: ObservationalMemoryModel,\n inputTokens?: number,\n ): Exclude<ObservationalMemoryModel, ModelByInputTokens> {\n if (model instanceof ModelByInputTokens) {\n if (inputTokens === undefined) {\n throw new Error('ModelByInputTokens requires inputTokens for resolution');\n }\n return model.resolve(inputTokens) as Exclude<ObservationalMemoryModel, ModelByInputTokens>;\n }\n\n return model as Exclude<ObservationalMemoryModel, ModelByInputTokens>;\n }\n\n private getModelToResolve(\n model: ObservationalMemoryModel,\n inputTokens?: number,\n ): Parameters<typeof resolveModelConfig>[0] {\n const concreteModel = this.getConcreteModel(model, inputTokens);\n\n if (Array.isArray(concreteModel)) {\n return (concreteModel[0]?.model ?? 'unknown') as Parameters<typeof resolveModelConfig>[0];\n }\n if (typeof concreteModel === 'function') {\n // Wrap to handle functions that may return ModelWithRetries[]\n return async (ctx: any) => {\n const result = await concreteModel(ctx);\n if (Array.isArray(result)) {\n return (result[0]?.model ?? 'unknown') as MastraModelConfig;\n }\n return result as MastraModelConfig;\n };\n }\n return concreteModel;\n }\n\n private formatModelName(model: TokenCounterModelContext) {\n if (!model.modelId) {\n return '(unknown)';\n }\n\n return model.provider ? `${model.provider}/${model.modelId}` : model.modelId;\n }\n\n private resolveObservationModel(inputTokens: number): {\n model: Exclude<ResolvedObservationConfig['model'], ModelByInputTokens>;\n selectedThreshold?: number;\n routingStrategy?: 'model-by-input-tokens';\n routingThresholds?: string;\n } {\n return this.resolveTieredModel(this.observationConfig.model, inputTokens);\n }\n\n private resolveReflectionModel(inputTokens: number): {\n model: Exclude<ResolvedReflectionConfig['model'], ModelByInputTokens>;\n selectedThreshold?: number;\n routingStrategy?: 'model-by-input-tokens';\n routingThresholds?: string;\n } {\n return this.resolveTieredModel(this.reflectionConfig.model, inputTokens);\n }\n\n private resolveTieredModel<TModel extends ObservationalMemoryModel>(\n model: TModel,\n inputTokens: number,\n ): {\n model: Exclude<TModel, ModelByInputTokens>;\n selectedThreshold?: number;\n routingStrategy?: 'model-by-input-tokens';\n routingThresholds?: string;\n } {\n if (!(model instanceof ModelByInputTokens)) {\n return {\n model: model as Exclude<TModel, ModelByInputTokens>,\n };\n }\n\n const thresholds = model.getThresholds();\n const selectedThreshold = thresholds.find(upTo => inputTokens <= upTo) ?? thresholds.at(-1);\n\n return {\n model: model.resolve(inputTokens) as Exclude<TModel, ModelByInputTokens>,\n selectedThreshold,\n routingStrategy: 'model-by-input-tokens',\n routingThresholds: thresholds.join(','),\n };\n }\n\n private async resolveModelRouting(\n modelConfig: ObservationalMemoryModel,\n requestContext?: RequestContext,\n ): Promise<{ model: string; routing?: Array<{ upTo: number; model: string }> }> {\n try {\n if (modelConfig instanceof ModelByInputTokens) {\n const routing = await Promise.all(\n modelConfig.getThresholds().map(async upTo => {\n const resolvedModel = modelConfig.resolve(upTo) as Exclude<ObservationalMemoryModel, ModelByInputTokens>;\n const resolved = await this.resolveModelContext(resolvedModel, requestContext);\n\n return {\n upTo,\n model: resolved?.modelId ? this.formatModelName(resolved) : '(unknown)',\n };\n }),\n );\n\n return {\n model: routing[0]?.model ?? '(unknown)',\n routing,\n };\n }\n\n const resolved = await this.resolveModelContext(modelConfig, requestContext);\n return {\n model: resolved?.modelId ? this.formatModelName(resolved) : '(unknown)',\n };\n } catch (error) {\n omError('[OM] Failed to resolve model config', error);\n return { model: '(unknown)' };\n }\n }\n\n private async resolveModelContext(\n modelConfig: ObservationalMemoryModel,\n requestContext?: RequestContext,\n inputTokens?: number,\n ): Promise<TokenCounterModelContext | undefined> {\n const modelToResolve = this.getModelToResolve(modelConfig, inputTokens);\n if (!modelToResolve) {\n return undefined;\n }\n\n const resolved = await resolveModelConfig(modelToResolve, requestContext);\n return {\n provider: resolved.provider,\n modelId: resolved.modelId,\n };\n }\n\n /**\n * Get the default compression start level based on model behavior.\n * gemini-2.5-flash is a faithful transcriber that needs explicit pressure to compress effectively.\n */\n async getCompressionStartLevel(requestContext?: RequestContext): Promise<CompressionLevel> {\n try {\n const resolved = await this.resolveModelContext(this.reflectionConfig.model, requestContext);\n const modelId = resolved?.modelId ?? '';\n\n // gemini-2.5-flash is conservative about compression - start at level 2\n if (modelId.includes('gemini-2.5-flash')) {\n return 2;\n }\n\n // Default for all other models\n return 1;\n } catch {\n // Silently fallback to level 1 on error - not worth disrupting the operation\n return 1; // safe default\n }\n }\n\n /**\n * Get the full config including resolved model names.\n * This is async because it needs to resolve the model configs.\n */\n async getResolvedConfig(requestContext?: RequestContext): Promise<{\n scope: 'resource' | 'thread';\n observation: {\n messageTokens: number | ThresholdRange;\n model: string;\n previousObserverTokens: number | false | undefined;\n routing?: Array<{ upTo: number; model: string }>;\n };\n reflection: {\n observationTokens: number | ThresholdRange;\n model: string;\n routing?: Array<{ upTo: number; model: string }>;\n };\n }> {\n const [observationResolved, reflectionResolved] = await Promise.all([\n this.resolveModelRouting(this.observationConfig.model, requestContext),\n this.resolveModelRouting(this.reflectionConfig.model, requestContext),\n ]);\n\n return {\n scope: this.scope,\n observation: {\n messageTokens: this.observationConfig.messageTokens,\n model: observationResolved.model,\n previousObserverTokens: this.observationConfig.previousObserverTokens,\n routing: observationResolved.routing,\n },\n reflection: {\n observationTokens: this.reflectionConfig.observationTokens,\n model: reflectionResolved.model,\n routing: reflectionResolved.routing,\n },\n };\n }\n\n /**\n * Emit a debug event if the callback is configured.\n * @internal Used by observation strategies. Do not call directly.\n */\n emitDebugEvent(event: ObservationDebugEvent): void {\n if (this.onDebugEvent) {\n this.onDebugEvent(event);\n }\n }\n\n /**\n * Validate buffer configuration on first use.\n * Ensures bufferTokens is less than the threshold and bufferActivation is valid.\n */\n private validateBufferConfig(): void {\n // Async buffering is not yet supported with resource scope\n const hasAsyncBuffering =\n this.observationConfig.bufferTokens !== undefined ||\n this.observationConfig.bufferActivation !== undefined ||\n this.reflectionConfig.bufferActivation !== undefined;\n if (hasAsyncBuffering && this.scope === 'resource') {\n throw new Error(\n `Async buffering is not yet supported with scope: 'resource'. ` +\n `Use scope: 'thread', or set observation: { bufferTokens: false } to disable async buffering.`,\n );\n }\n\n // Validate observation bufferTokens\n const observationThreshold = getMaxThreshold(this.observationConfig.messageTokens);\n if (this.observationConfig.bufferTokens !== undefined) {\n if (this.observationConfig.bufferTokens <= 0) {\n throw new Error(`observation.bufferTokens must be > 0, got ${this.observationConfig.bufferTokens}`);\n }\n if (this.observationConfig.bufferTokens >= observationThreshold) {\n throw new Error(\n `observation.bufferTokens (${this.observationConfig.bufferTokens}) must be less than messageTokens (${observationThreshold})`,\n );\n }\n }\n\n // Validate observation bufferActivation: (0, 1] for ratio, or >= 1000 for absolute retention tokens\n if (this.observationConfig.bufferActivation !== undefined) {\n if (this.observationConfig.bufferActivation <= 0) {\n throw new Error(`observation.bufferActivation must be > 0, got ${this.observationConfig.bufferActivation}`);\n }\n if (this.observationConfig.bufferActivation > 1 && this.observationConfig.bufferActivation < 1000) {\n throw new Error(\n `observation.bufferActivation must be <= 1 (ratio) or >= 1000 (absolute token retention), got ${this.observationConfig.bufferActivation}`,\n );\n }\n if (\n this.observationConfig.bufferActivation >= 1000 &&\n this.observationConfig.bufferActivation >= observationThreshold\n ) {\n throw new Error(\n `observation.bufferActivation as absolute retention (${this.observationConfig.bufferActivation}) must be less than messageTokens (${observationThreshold})`,\n );\n }\n }\n\n // Validate observation blockAfter\n if (this.observationConfig.blockAfter !== undefined) {\n if (this.observationConfig.blockAfter < observationThreshold) {\n throw new Error(\n `observation.blockAfter (${this.observationConfig.blockAfter}) must be >= messageTokens (${observationThreshold})`,\n );\n }\n if (!this.observationConfig.bufferTokens) {\n throw new Error(\n `observation.blockAfter requires observation.bufferTokens to be set (blockAfter only applies when async buffering is enabled)`,\n );\n }\n }\n\n // Validate observer context optimization options\n if (\n this.observationConfig.previousObserverTokens !== undefined &&\n this.observationConfig.previousObserverTokens !== false\n ) {\n if (\n !Number.isFinite(this.observationConfig.previousObserverTokens) ||\n this.observationConfig.previousObserverTokens < 0\n ) {\n throw new Error(\n `observation.previousObserverTokens must be false or a finite number >= 0, got ${this.observationConfig.previousObserverTokens}`,\n );\n }\n }\n\n // Validate reflection bufferActivation (0-1 float range)\n if (this.reflectionConfig.bufferActivation !== undefined) {\n if (this.reflectionConfig.bufferActivation <= 0 || this.reflectionConfig.bufferActivation > 1) {\n throw new Error(\n `reflection.bufferActivation must be in range (0, 1], got ${this.reflectionConfig.bufferActivation}`,\n );\n }\n }\n\n // Validate reflection blockAfter\n if (this.reflectionConfig.blockAfter !== undefined) {\n const reflectionThreshold = getMaxThreshold(this.reflectionConfig.observationTokens);\n if (this.reflectionConfig.blockAfter < reflectionThreshold) {\n throw new Error(\n `reflection.blockAfter (${this.reflectionConfig.blockAfter}) must be >= reflection.observationTokens (${reflectionThreshold})`,\n );\n }\n if (!this.reflectionConfig.bufferActivation) {\n throw new Error(\n `reflection.blockAfter requires reflection.bufferActivation to be set (blockAfter only applies when async reflection is enabled)`,\n );\n }\n }\n }\n\n /**\n * Resolve the effective messageTokens for a record.\n * Only explicit per-record overrides (stored under `_overrides`) win;\n * the initial config snapshot written by getOrCreateRecord() is ignored\n * so that later instance-level changes still take effect.\n *\n * Overrides that fall below the instance-level buffering floor\n * (bufferTokens / absolute bufferActivation) are clamped to the\n * instance threshold to preserve buffering invariants.\n */\n private getEffectiveMessageTokens(record: ObservationalMemoryRecord): number | ThresholdRange {\n const overrides = (record.config as { _overrides?: { observation?: { messageTokens?: number | ThresholdRange } } })\n ?._overrides;\n const recordTokens = overrides?.observation?.messageTokens;\n if (recordTokens) {\n const maxOverride = getMaxThreshold(recordTokens);\n\n // Clamp: override must not violate instance-level buffering invariants\n const bufferTokens = this.observationConfig.bufferTokens;\n if (bufferTokens && maxOverride <= bufferTokens) {\n return this.observationConfig.messageTokens;\n }\n const bufferActivation = this.observationConfig.bufferActivation;\n if (bufferActivation && bufferActivation >= 1000 && maxOverride <= bufferActivation) {\n return this.observationConfig.messageTokens;\n }\n\n return recordTokens;\n }\n return this.observationConfig.messageTokens;\n }\n\n /**\n * Resolve the effective reflection observationTokens for a record.\n * Only explicit per-record overrides (stored under `_overrides`) win;\n * the initial config snapshot is ignored so instance-level changes\n * still take effect for existing records.\n */\n private getEffectiveReflectionTokens(record: ObservationalMemoryRecord): number | ThresholdRange {\n const overrides = (\n record.config as { _overrides?: { reflection?: { observationTokens?: number | ThresholdRange } } }\n )?._overrides;\n const recordTokens = overrides?.reflection?.observationTokens;\n if (recordTokens) {\n return recordTokens;\n }\n return this.reflectionConfig.observationTokens;\n }\n\n /**\n * Check whether the unobserved message tokens meet the observation threshold.\n */\n private meetsObservationThreshold(opts: {\n record: ObservationalMemoryRecord;\n unobservedTokens: number;\n extraTokens?: number;\n }): boolean {\n const { record, unobservedTokens, extraTokens = 0 } = opts;\n const pendingTokens = (record.pendingMessageTokens ?? 0) + unobservedTokens + extraTokens;\n const currentObservationTokens = record.observationTokenCount ?? 0;\n const threshold = calculateDynamicThreshold(this.getEffectiveMessageTokens(record), currentObservationTokens);\n return pendingTokens >= threshold;\n }\n\n /**\n * Get thread/resource IDs for storage lookup\n */\n private getStorageIds(threadId: string, resourceId?: string): { threadId: string | null; resourceId: string } {\n if (this.scope === 'resource') {\n return {\n threadId: null,\n resourceId: resourceId ?? threadId,\n };\n }\n if (!threadId) {\n throw new Error(\n `ObservationalMemory (scope: 'thread') requires a threadId, but received an empty value. ` +\n `This is a bug — getThreadContext should have caught this earlier.`,\n );\n }\n return {\n threadId,\n resourceId: resourceId ?? threadId,\n };\n }\n\n /**\n * Get or create the observational memory record.\n * Returns the existing record if one exists, otherwise initializes a new one.\n */\n async getOrCreateRecord(threadId: string, resourceId?: string): Promise<ObservationalMemoryRecord> {\n const ids = this.getStorageIds(threadId, resourceId);\n let record = await this.storage.getObservationalMemory(ids.threadId, ids.resourceId);\n\n if (!record) {\n // Capture the timezone used for Observer date formatting\n const observedTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n record = await this.storage.initializeObservationalMemory({\n threadId: ids.threadId,\n resourceId: ids.resourceId,\n scope: this.scope,\n config: {\n observation: this.observationConfig,\n reflection: this.reflectionConfig,\n scope: this.scope,\n },\n observedTimezone,\n });\n }\n\n return record;\n }\n\n // ════════════════════════════════════════════════════════════════════════════\n // DATA-OM-OBSERVATION PART HELPERS (Start/End/Failed markers)\n // These helpers manage the observation boundary markers within messages.\n //\n // Flow:\n // 1. Before observation: [...messageParts]\n // 2. Insert start: [...messageParts, start] → stream to UI (loading state)\n // 3. After success: [...messageParts, start, end] → stream to UI (complete)\n // 4. After failure: [...messageParts, start, failed]\n //\n // For filtering, we look for the last completed observation (start + end pair).\n // A start without end means observation is in progress.\n // ════════════════════════════════════════════════════════════════════════════\n\n /**\n * Get current config snapshot for observation markers.\n */\n private getObservationMarkerConfig(): ObservationMarkerConfig {\n return {\n messageTokens: getMaxThreshold(this.observationConfig.messageTokens),\n observationTokens: getMaxThreshold(this.reflectionConfig.observationTokens),\n scope: this.scope,\n };\n }\n\n /**\n * Persist a data-om-* marker part on the last assistant message in messageList\n * AND save the updated message to the DB so it survives page reload.\n * (data-* parts are filtered out before sending to the LLM, so they don't affect model calls.)\n * @internal Used by ReflectorRunner. Do not call directly.\n */\n async persistMarkerToMessage(\n marker: { type: string; data: unknown },\n messageList: MessageList | undefined,\n threadId: string,\n resourceId?: string,\n ): Promise<void> {\n if (!messageList) return;\n const allMsgs = messageList.get.all.db();\n // Find the last assistant message to attach the marker to\n for (let i = allMsgs.length - 1; i >= 0; i--) {\n const msg = allMsgs[i];\n if (msg?.role === 'assistant' && msg.content?.parts && Array.isArray(msg.content.parts)) {\n // Only push if the marker isn't already in the parts array.\n // writer.custom() adds the marker to the stream, and the AI SDK may have\n // already appended it to the message's parts before this runs.\n const markerData = marker.data as { cycleId?: string } | undefined;\n const alreadyPresent =\n markerData?.cycleId &&\n msg.content.parts.some((p: any) => p?.type === marker.type && p?.data?.cycleId === markerData.cycleId);\n if (!alreadyPresent) {\n msg.content.parts.push(marker as any);\n }\n // Upsert the modified message to DB so the marker part is persisted.\n // Non-critical — if this fails, the marker is still in the stream,\n // it just won't survive page reload.\n try {\n await this.messageHistory.persistMessages({\n messages: [msg],\n threadId,\n resourceId,\n });\n } catch (e) {\n omDebug(`[OM:persistMarker] failed to save marker to DB: ${e}`);\n }\n return;\n }\n }\n }\n\n /**\n * Persist a marker to the last assistant message in storage.\n * Unlike persistMarkerToMessage, this fetches messages directly from the DB\n * so it works even when no MessageList is available (e.g. async buffering ops).\n * @internal Used by observation strategies. Do not call directly.\n */\n async persistMarkerToStorage(\n marker: { type: string; data: unknown },\n threadId: string,\n resourceId?: string,\n ): Promise<void> {\n try {\n const result = await this.storage.listMessages({\n threadId,\n perPage: 20,\n orderBy: { field: 'createdAt', direction: 'DESC' },\n });\n const messages = result?.messages ?? [];\n // Find the last assistant message\n for (const msg of messages) {\n if (msg?.role === 'assistant' && msg.content?.parts && Array.isArray(msg.content.parts)) {\n // Only push if the marker isn't already in the parts array.\n const markerData = marker.data as { cycleId?: string } | undefined;\n const alreadyPresent =\n markerData?.cycleId &&\n msg.content.parts.some((p: any) => p?.type === marker.type && p?.data?.cycleId === markerData.cycleId);\n if (!alreadyPresent) {\n msg.content.parts.push(marker as any);\n }\n await this.messageHistory.persistMessages({\n messages: [msg],\n threadId,\n resourceId,\n });\n return;\n }\n }\n } catch (e) {\n omDebug(`[OM:persistMarkerToStorage] failed to save marker to DB: ${e}`);\n }\n }\n\n /**\n * Find the last completed observation boundary in a message's parts.\n * A completed observation is a start marker followed by an end marker.\n *\n * Returns the index of the END marker (which is the observation boundary),\n * or -1 if no completed observation is found.\n */\n\n /**\n * Check if a message has an in-progress observation (start without end).\n */\n private hasInProgressObservation(message: MastraDBMessage): boolean {\n const parts = message.content?.parts;\n if (!parts || !Array.isArray(parts)) return false;\n\n let lastStartIndex = -1;\n let lastEndOrFailedIndex = -1;\n\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i] as { type?: string };\n if (part?.type === 'data-om-observation-start' && lastStartIndex === -1) {\n lastStartIndex = i;\n }\n if (\n (part?.type === 'data-om-observation-end' || part?.type === 'data-om-observation-failed') &&\n lastEndOrFailedIndex === -1\n ) {\n lastEndOrFailedIndex = i;\n }\n }\n\n // In progress if we have a start that comes after any end/failed\n return lastStartIndex !== -1 && lastStartIndex > lastEndOrFailedIndex;\n }\n\n /**\n * Seal messages to prevent new parts from being merged into them.\n * This is used when starting buffering to capture the current content state.\n *\n * Sealing works by:\n * 1. Setting `message.content.metadata.mastra.sealed = true` (message-level flag)\n * 2. Adding `metadata.mastra.sealedAt` to the last part (boundary marker)\n *\n * When MessageList.add() receives a message with the same ID as a sealed message,\n * it creates a new message with only the parts beyond the seal boundary.\n *\n * The messages are mutated in place - since they're references to the same objects\n * in the MessageList, the seal will be recognized immediately.\n *\n * @param messages - Messages to seal (mutated in place)\n */\n /** @internal Used by ObservationStep. */\n sealMessagesForBuffering(messages: MastraDBMessage[]): void {\n const sealedAt = Date.now();\n\n for (const msg of messages) {\n if (!msg.content?.parts?.length) continue;\n\n // Set message-level sealed flag\n if (!msg.content.metadata) {\n msg.content.metadata = {};\n }\n const metadata = msg.content.metadata as { mastra?: { sealed?: boolean } };\n if (!metadata.mastra) {\n metadata.mastra = {};\n }\n metadata.mastra.sealed = true;\n\n // Add sealedAt to the last part\n const lastPart = msg.content.parts[msg.content.parts.length - 1] as {\n metadata?: { mastra?: { sealedAt?: number } };\n };\n if (!lastPart.metadata) {\n lastPart.metadata = {};\n }\n if (!lastPart.metadata.mastra) {\n lastPart.metadata.mastra = {};\n }\n lastPart.metadata.mastra.sealedAt = sealedAt;\n }\n }\n\n /**\n * Insert an observation marker into a message.\n * The marker is appended directly to the message's parts array (mutating in place).\n * Also persists the change to storage so markers survive page refresh.\n *\n * For end/failed markers, the message is also \"sealed\" to prevent future content\n * from being merged into it. This ensures observation markers are preserved.\n */\n /**\n * Insert an observation marker into a message.\n * For start markers, this pushes the part directly.\n * For end/failed markers, this should be called AFTER writer.custom() has added the part,\n * so we just find the part and add sealing metadata.\n */\n\n /**\n * Create a virtual message containing only the unobserved parts.\n * This is used for token counting and observation.\n */\n private createUnobservedMessage(message: MastraDBMessage): MastraDBMessage | null {\n const unobservedParts = getUnobservedParts(message);\n if (unobservedParts.length === 0) return null;\n\n return {\n ...message,\n content: {\n ...message.content,\n parts: unobservedParts,\n },\n };\n }\n\n /**\n * Get unobserved messages with part-level filtering.\n *\n * This method uses data-om-observation-end markers to filter at the part level:\n * 1. For messages WITH a completed observation: only return parts AFTER the end marker\n * 2. For messages WITHOUT completed observation: check timestamp against lastObservedAt\n *\n * This handles the case where a single message accumulates many parts\n * (like tool calls) during an agentic loop - we only observe the new parts.\n */\n /** @internal Used by ObservationStep. */\n getUnobservedMessages(\n allMessages: MastraDBMessage[],\n record: ObservationalMemoryRecord,\n opts?: { excludeBuffered?: boolean },\n ): MastraDBMessage[] {\n const lastObservedAt = record.lastObservedAt;\n // Safeguard: track message IDs that were already observed to prevent re-observation\n // This handles edge cases like process restarts where lastObservedAt might not capture all messages\n const observedMessageIds = new Set<string>(\n Array.isArray(record.observedMessageIds) ? record.observedMessageIds : [],\n );\n\n // Only exclude buffered chunk message IDs when called from the buffering path.\n // The main agent context should still see buffered messages until activation.\n if (opts?.excludeBuffered) {\n const bufferedChunks = getBufferedChunks(record);\n for (const chunk of bufferedChunks) {\n if (Array.isArray(chunk.messageIds)) {\n for (const id of chunk.messageIds) {\n observedMessageIds.add(id);\n }\n }\n }\n }\n\n const result: MastraDBMessage[] = [];\n\n for (const msg of allMessages) {\n // First check: skip if this message ID was already observed (safeguard against re-observation)\n if (observedMessageIds?.has(msg.id)) {\n continue;\n }\n\n // Check if this message has a completed observation\n const endMarkerIndex = findLastCompletedObservationBoundary(msg);\n const inProgress = this.hasInProgressObservation(msg);\n\n if (inProgress) {\n // Include the full message for in-progress observations\n // The Observer is currently working on this\n result.push(msg);\n } else if (endMarkerIndex !== -1) {\n // Message has a completed observation - only include parts after it\n const virtualMsg = this.createUnobservedMessage(msg);\n if (virtualMsg) {\n result.push(virtualMsg);\n } else {\n }\n } else {\n // No observation markers - fall back to timestamp-based filtering\n if (!msg.createdAt || !lastObservedAt) {\n // Messages without timestamps are always included\n // Also include messages when there's no lastObservedAt timestamp\n result.push(msg);\n } else {\n const msgDate = new Date(msg.createdAt);\n if (msgDate > lastObservedAt) {\n result.push(msg);\n } else {\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Prepare optimized observer context by applying truncation and buffered-reflection inclusion.\n *\n * Returns the (possibly optimized) observations string to pass as \"Previous Observations\"\n * to the observer prompt. When no optimization options are set, returns the input unchanged.\n */\n prepareObserverContext(\n existingObservations: string | undefined,\n record?: ObservationalMemoryRecord | null,\n ): { context: string | undefined; wasTruncated: boolean } {\n const { previousObserverTokens } = this.observationConfig;\n const tokenBudget =\n previousObserverTokens === undefined || previousObserverTokens === false ? undefined : previousObserverTokens;\n\n // Fast path: no optimization configured — preserve legacy behavior\n if (tokenBudget === undefined) {\n return { context: existingObservations, wasTruncated: false };\n }\n\n // When previousObserverTokens is enabled, also use buffered reflections\n const bufferedReflection =\n record?.bufferedReflection && record?.reflectedObservationLineCount ? record.bufferedReflection : undefined;\n\n if (!existingObservations) {\n return { context: bufferedReflection, wasTruncated: false };\n }\n\n // 1. Replace reflected observation lines with the buffered reflection summary.\n // reflectedObservationLineCount tracks how many of the oldest lines\n // were already summarized by the reflection — swap those out.\n let observations = existingObservations;\n if (bufferedReflection && record?.reflectedObservationLineCount) {\n const allLines = observations.split('\\n');\n const unreflectedLines = allLines.slice(record.reflectedObservationLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n observations = unreflectedContent ? `${bufferedReflection}\\n\\n${unreflectedContent}` : bufferedReflection;\n }\n\n // 2. Truncate the assembled result to fit within budget\n let wasTruncated = false;\n if (tokenBudget !== undefined) {\n if (tokenBudget === 0) {\n return { context: '', wasTruncated: true };\n }\n\n const currentTokens = this.tokenCounter.countObservations(observations);\n if (currentTokens > tokenBudget) {\n observations = this.truncateObservationsToTokenBudget(observations, tokenBudget);\n wasTruncated = true;\n }\n }\n\n return { context: observations, wasTruncated };\n }\n\n /**\n * Truncate observations to fit within a token budget.\n *\n * Strategy:\n * 1. Keep a raw tail of recent observations (end of block).\n * 2. Add a truncation marker: [X observations truncated here], placed at the hidden gap.\n * 3. Try to preserve important observations (🔴) from older context, newest-first.\n * 4. Enforce that at least 50% of kept observations remain raw tail observations.\n */\n private truncateObservationsToTokenBudget(observations: string, budget: number): string {\n if (budget === 0) {\n return '';\n }\n\n const totalTokens = this.tokenCounter.countObservations(observations);\n if (totalTokens <= budget) {\n return observations;\n }\n\n const lines = observations.split('\\n');\n const totalCount = lines.length;\n\n // tokenx is lightweight (regex-based), so measure each line directly.\n const lineTokens: number[] = new Array(totalCount);\n const isImportant: boolean[] = new Array(totalCount);\n for (let i = 0; i < totalCount; i++) {\n lineTokens[i] = this.tokenCounter.countString(lines[i]!);\n isImportant[i] = lines[i]!.includes('🔴') || lines[i]!.includes('✅');\n }\n\n // Precompute suffix sums so tail cost is O(1).\n const suffixTokens: number[] = new Array(totalCount + 1);\n suffixTokens[totalCount] = 0;\n for (let i = totalCount - 1; i >= 0; i--) {\n suffixTokens[i] = suffixTokens[i + 1]! + lineTokens[i]!;\n }\n\n // Collect important-line indexes from the head region.\n // Built incrementally as tailStart advances.\n const headImportantIndexes: number[] = [];\n\n const buildCandidateString = (tailStart: number, selectedImportantIndexes: number[]) => {\n const keptIndexes = [\n ...selectedImportantIndexes,\n ...Array.from({ length: totalCount - tailStart }, (_, i) => tailStart + i),\n ].sort((a, b) => a - b);\n\n if (keptIndexes.length === 0) {\n return `[${totalCount} observations truncated here]`;\n }\n\n const outputLines: string[] = [];\n let previousKeptIndex = -1;\n\n for (const keptIndex of keptIndexes) {\n const hiddenCount = keptIndex - previousKeptIndex - 1;\n if (hiddenCount === 1) {\n // Keep the original line — the marker would cost more tokens than the line itself\n outputLines.push(lines[previousKeptIndex + 1]!);\n } else if (hiddenCount > 1) {\n outputLines.push(`[${hiddenCount} observations truncated here]`);\n }\n outputLines.push(lines[keptIndex]!);\n previousKeptIndex = keptIndex;\n }\n\n const trailingHiddenCount = totalCount - previousKeptIndex - 1;\n if (trailingHiddenCount === 1) {\n outputLines.push(lines[totalCount - 1]!);\n } else if (trailingHiddenCount > 1) {\n outputLines.push(`[${trailingHiddenCount} observations truncated here]`);\n }\n\n return outputLines.join('\\n');\n };\n\n // Lower-bound cost of kept content (excludes marker lines).\n // Used for fast rejection — the final countObservations call is the real gatekeeper.\n const estimateKeptContentCost = (tailStart: number, selectedImportantIndexes: number[]): number => {\n let cost = suffixTokens[tailStart]!;\n for (const idx of selectedImportantIndexes) {\n cost += lineTokens[idx]!;\n }\n return cost;\n };\n\n let bestCandidate: string | undefined;\n let bestImportantCount = -1;\n let bestRawTailLength = -1;\n\n for (let tailStart = 1; tailStart < totalCount; tailStart++) {\n // Incrementally track important lines in the head region.\n if (isImportant[tailStart - 1]) {\n headImportantIndexes.push(tailStart - 1);\n }\n\n const rawTailLength = totalCount - tailStart;\n const maxImportantByRatio = rawTailLength;\n let importantToKeep = Math.min(headImportantIndexes.length, maxImportantByRatio);\n\n const getSelectedImportant = (count: number) =>\n count > 0 ? headImportantIndexes.slice(Math.max(0, headImportantIndexes.length - count)) : [];\n\n // Fast rejection: drop important lines if even the kept content exceeds budget.\n while (\n importantToKeep > 0 &&\n estimateKeptContentCost(tailStart, getSelectedImportant(importantToKeep)) > budget\n ) {\n importantToKeep -= 1;\n }\n\n if (estimateKeptContentCost(tailStart, getSelectedImportant(importantToKeep)) > budget) {\n continue;\n }\n\n // Only build + verify when this candidate could beat the current best.\n if (\n importantToKeep > bestImportantCount ||\n (importantToKeep === bestImportantCount && rawTailLength > bestRawTailLength)\n ) {\n const candidate = buildCandidateString(tailStart, getSelectedImportant(importantToKeep));\n if (this.tokenCounter.countObservations(candidate) <= budget) {\n bestCandidate = candidate;\n bestImportantCount = importantToKeep;\n bestRawTailLength = rawTailLength;\n }\n }\n }\n\n if (!bestCandidate) {\n return `[${totalCount} observations truncated here]`;\n }\n\n return bestCandidate;\n }\n\n /**\n * Format observations for injection into context.\n * Applies token optimization before presenting to the Actor.\n *\n * In resource scope mode, filters continuity messages to only show\n * the message for the current thread.\n */\n private formatObservationsForContext(\n observations: string,\n currentTask?: string,\n suggestedResponse?: string,\n unobservedContextBlocks?: string,\n currentDate?: Date,\n retrieval = false,\n ): string[] {\n // Optimize observations to save tokens unless retrieval mode needs durable group metadata preserved.\n let optimized = retrieval\n ? (renderObservationGroupsForReflection(observations) ?? optimizeObservationsForContext(observations))\n : optimizeObservationsForContext(observations);\n\n // Add relative time annotations to date headers if currentDate is provided\n if (currentDate) {\n optimized = addRelativeTimeToObservations(optimized, currentDate);\n }\n\n const messages = [\n `${OBSERVATION_CONTEXT_PROMPT}\\n\\n${OBSERVATION_CONTEXT_INSTRUCTIONS}${retrieval ? `\\n\\n${OBSERVATION_RETRIEVAL_INSTRUCTIONS}` : ''}`,\n ];\n\n // Add unobserved context from other threads (resource scope only)\n if (unobservedContextBlocks) {\n messages.push(\n `The following content is from OTHER conversations different from the current conversation, they're here for reference, but they're not necessarily your focus:\\nSTART_OTHER_CONVERSATIONS_BLOCK\\n${unobservedContextBlocks}\\nEND_OTHER_CONVERSATIONS_BLOCK`,\n );\n }\n\n const observationChunks = this.splitObservationContextChunks(optimized);\n if (observationChunks.length > 0) {\n messages.push('<observations>', ...observationChunks);\n }\n\n // Dynamically inject current-task from thread metadata (not stored in observations)\n if (currentTask) {\n messages.push(`<current-task>\\n${currentTask}\\n</current-task>`);\n }\n\n if (suggestedResponse) {\n messages.push(`<suggested-response>\\n${suggestedResponse}\\n</suggested-response>`);\n }\n\n return messages;\n }\n\n private splitObservationContextChunks(observations: string): string[] {\n const trimmed = observations.trim();\n if (!trimmed) {\n return [];\n }\n\n return trimmed\n .split(/\\n{2,}--- message boundary \\(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z\\) ---\\n{2,}/)\n .map(chunk => chunk.trim())\n .filter(Boolean);\n }\n\n /**\n * Create a message boundary delimiter with an ISO 8601 date.\n * The date should be the lastObservedAt timestamp — the latest message\n * timestamp that was observed to produce the observations following this boundary.\n */\n static createMessageBoundary(date: Date): string {\n return `\\n\\n--- message boundary (${date.toISOString()}) ---\\n\\n`;\n }\n\n /**\n * Get threadId and resourceId from either RequestContext or MessageList\n */\n getThreadContext(\n requestContext: RequestContext | undefined,\n messageList: MessageList,\n ): { threadId: string; resourceId?: string } | null {\n // First try RequestContext (set by Memory)\n const memoryContext = requestContext?.get('MastraMemory') as\n | { thread?: { id: string }; resourceId?: string }\n | undefined;\n\n if (memoryContext?.thread?.id) {\n return {\n threadId: memoryContext.thread.id,\n resourceId: memoryContext.resourceId,\n };\n }\n\n // Fallback to MessageList's memoryInfo\n const serialized = messageList.serialize();\n if (serialized.memoryInfo?.threadId) {\n return {\n threadId: serialized.memoryInfo.threadId,\n resourceId: serialized.memoryInfo.resourceId,\n };\n }\n\n // In thread scope, threadId is required — without it OM would silently\n // fall back to a resource-keyed record which causes deadlocks when\n // multiple threads share the same resourceId.\n if (this.scope === 'thread') {\n throw new Error(\n `ObservationalMemory (scope: 'thread') requires a threadId, but none was found in RequestContext or MessageList. ` +\n `Ensure the agent is configured with Memory and a valid threadId is provided.`,\n );\n }\n\n return null;\n }\n\n /**\n * Save messages to storage, skipping messages that were already persisted by\n * async buffering. Uses the message-level sealed flag (metadata.mastra.sealed)\n * to detect already-persisted messages, avoiding redundant DB operations.\n *\n * Messages with observation markers are always saved (upserted) even if sealed,\n * because the markers need to be persisted to storage.\n */\n async persistMessages(\n messagesToSave: MastraDBMessage[],\n threadId: string,\n resourceId: string | undefined,\n ): Promise<void> {\n const filteredMessages: MastraDBMessage[] = [];\n for (const msg of messagesToSave) {\n const isSealed = !!(msg.content?.metadata as { mastra?: { sealed?: boolean } })?.mastra?.sealed;\n if (isSealed) {\n // Sealed messages were already persisted by buffer(). Only re-save if they\n // now have observation markers (need to upsert the markers to storage).\n if (findLastCompletedObservationBoundary(msg) !== -1) {\n filteredMessages.push(msg);\n }\n } else {\n filteredMessages.push(msg);\n }\n }\n\n if (filteredMessages.length > 0) {\n await this.messageHistory.persistMessages({\n messages: filteredMessages,\n threadId,\n resourceId,\n });\n }\n }\n\n /**\n * Load messages from storage that haven't been observed yet.\n * Uses cursor-based query with lastObservedAt timestamp for efficiency.\n *\n * In resource scope mode, loads messages for the entire resource (all threads).\n * In thread scope mode, loads messages for just the current thread.\n */\n private async loadMessagesFromStorage(\n threadId: string,\n resourceId: string | undefined,\n lastObservedAt?: Date,\n ): Promise<MastraDBMessage[]> {\n // Add 1ms to lastObservedAt to make the filter exclusive (since dateRange.start is inclusive)\n // This prevents re-loading the same messages that were already observed\n const startDate = lastObservedAt ? new Date(lastObservedAt.getTime() + 1) : undefined;\n\n let result: { messages: MastraDBMessage[] };\n\n if (this.scope === 'resource' && resourceId) {\n // Resource scope: use the new listMessagesByResourceId method\n result = await this.storage.listMessagesByResourceId({\n resourceId,\n perPage: false, // Get all messages (no pagination limit)\n orderBy: { field: 'createdAt', direction: 'ASC' },\n filter: startDate\n ? {\n dateRange: {\n start: startDate,\n },\n }\n : undefined,\n });\n } else {\n // Thread scope: use listMessages with threadId\n result = await this.storage.listMessages({\n threadId,\n perPage: false, // Get all messages (no pagination limit)\n orderBy: { field: 'createdAt', direction: 'ASC' },\n filter: startDate\n ? {\n dateRange: {\n start: startDate,\n },\n }\n : undefined,\n });\n }\n\n return result.messages;\n }\n\n /**\n * Format unobserved messages from other threads as <unobserved-context> blocks.\n * These are injected into the Actor's context so it has awareness of activity\n * in other threads for the same resource.\n */\n private async formatUnobservedContextBlocks(\n messagesByThread: Map<string, MastraDBMessage[]>,\n currentThreadId: string,\n ): Promise<string> {\n const blocks: string[] = [];\n\n for (const [threadId, messages] of messagesByThread) {\n // Skip current thread - those go in normal message history\n if (threadId === currentThreadId) continue;\n\n // Skip if no messages\n if (messages.length === 0) continue;\n\n // Format messages with timestamps, truncating large parts (e.g. tool results)\n // since this is injected as context for the actor, not sent to the observer\n const formattedMessages = formatMessagesForObserver(messages, { maxPartLength: 500 });\n\n if (formattedMessages) {\n const obscuredId = await this.representThreadIDInContext(threadId);\n blocks.push(`<other-conversation id=\"${obscuredId}\">\n${formattedMessages}\n</other-conversation>`);\n }\n }\n\n return blocks.join('\\n\\n');\n }\n\n private async representThreadIDInContext(threadId: string): Promise<string> {\n if (this.shouldObscureThreadIds) {\n const hasher = await this.hasher;\n return hasher.h32ToString(threadId);\n }\n return threadId;\n }\n\n /**\n * Get the maximum createdAt timestamp from a list of messages.\n * Used to set lastObservedAt to the most recent message timestamp instead of current time.\n * This ensures historical data (like LongMemEval fixtures) works correctly.\n */\n private getMaxMessageTimestamp(messages: MastraDBMessage[]): Date {\n let maxTime = 0;\n for (const msg of messages) {\n if (msg.createdAt) {\n const msgTime = new Date(msg.createdAt).getTime();\n if (msgTime > maxTime) {\n maxTime = msgTime;\n }\n }\n }\n // If no valid timestamps found, fall back to current time\n return maxTime > 0 ? new Date(maxTime) : new Date();\n }\n\n /**\n * Wrap observations in a thread attribution tag.\n * Used in resource scope to track which thread observations came from.\n * @internal Used by observation strategies. Do not call directly.\n */\n async wrapWithThreadTag(threadId: string, observations: string, messageRange?: string): Promise<string> {\n // First strip any thread tags the Observer might have added\n const cleanObservations = stripThreadTags(observations);\n const groupedObservations =\n this.retrieval && messageRange ? wrapInObservationGroup(cleanObservations, messageRange) : cleanObservations;\n const obscuredId = await this.representThreadIDInContext(threadId);\n return `<thread id=\"${obscuredId}\">\\n${groupedObservations}\\n</thread>`;\n }\n\n /**\n * Append or merge new thread sections.\n * If the new section has the same thread ID and date as an existing section,\n * merge the observations into that section to reduce token usage.\n * Otherwise, append as a new section.\n */\n private replaceOrAppendThreadSection(\n existingObservations: string,\n _threadId: string,\n newThreadSection: string,\n lastObservedAt: Date,\n ): string {\n if (!existingObservations) {\n return newThreadSection;\n }\n\n // Extract thread ID and date from new section\n const threadIdMatch = newThreadSection.match(/<thread id=\"([^\"]+)\">/);\n const dateMatch = newThreadSection.match(/Date:\\s*([A-Za-z]+\\s+\\d+,\\s+\\d+)/);\n\n if (!threadIdMatch || !dateMatch) {\n // Can't parse, just append with message boundary for cache stability\n return `${existingObservations}${ObservationalMemory.createMessageBoundary(lastObservedAt)}${newThreadSection}`;\n }\n\n const newThreadId = threadIdMatch[1]!;\n const newDate = dateMatch[1]!;\n\n // Look for existing section with same thread ID and date.\n // Use string search instead of regex to avoid polynomial backtracking (CodeQL).\n const threadOpen = `<thread id=\"${newThreadId}\">`;\n const threadClose = '</thread>';\n const startIdx = existingObservations.indexOf(threadOpen);\n let existingSection: string | null = null;\n let existingSectionStart = -1;\n let existingSectionEnd = -1;\n\n if (startIdx !== -1) {\n const closeIdx = existingObservations.indexOf(threadClose, startIdx);\n if (closeIdx !== -1) {\n existingSectionEnd = closeIdx + threadClose.length;\n existingSectionStart = startIdx;\n const section = existingObservations.slice(startIdx, existingSectionEnd);\n // Verify this section contains the matching date\n if (section.includes(`Date: ${newDate}`) || section.includes(`Date:${newDate}`)) {\n existingSection = section;\n }\n }\n }\n\n if (existingSection) {\n // Found existing section with same thread ID and date - merge observations\n // Extract observations from new section: everything after the Date: line, before </thread>\n const dateLineEnd = newThreadSection.indexOf('\\n', newThreadSection.indexOf('Date:'));\n const newCloseIdx = newThreadSection.lastIndexOf(threadClose);\n if (dateLineEnd !== -1 && newCloseIdx !== -1) {\n const newObsContent = newThreadSection.slice(dateLineEnd + 1, newCloseIdx).trim();\n if (newObsContent) {\n // Insert new observations at the end of the existing section (before </thread>)\n const withoutClose = existingSection.slice(0, existingSection.length - threadClose.length).trimEnd();\n const merged = `${withoutClose}\\n${newObsContent}\\n${threadClose}`;\n return (\n existingObservations.slice(0, existingSectionStart) +\n merged +\n existingObservations.slice(existingSectionEnd)\n );\n }\n }\n }\n\n // No existing section with same thread ID and date - append with message boundary for cache stability\n return `${existingObservations}${ObservationalMemory.createMessageBoundary(lastObservedAt)}${newThreadSection}`;\n }\n\n /**\n * @internal Used by observation strategies. Do not call directly.\n */\n wrapObservations(\n rawObservations: string,\n existingObservations: string,\n threadId: string,\n lastObservedAt?: Date,\n messageRange?: string,\n ): Promise<string> | string {\n if (this.scope === 'resource') {\n return (async () => {\n const threadSection = await this.wrapWithThreadTag(threadId, rawObservations, messageRange);\n return this.replaceOrAppendThreadSection(\n existingObservations,\n threadId,\n threadSection,\n lastObservedAt ?? new Date(),\n );\n })();\n }\n const grouped =\n this.retrieval && messageRange ? wrapInObservationGroup(rawObservations, messageRange) : rawObservations;\n return existingObservations ? `${existingObservations}\\n\\n${grouped}` : grouped;\n }\n\n // ────────────────────────────────────────────────────────────────────────\n // Observation methods\n // ────────────────────────────────────────────────────────────────────────\n\n /**\n * Start an async background observation that stores results to bufferedObservations.\n * This is a fire-and-forget operation that runs in the background.\n * The results will be swapped to active when the main threshold is reached.\n *\n * If another buffering operation is already in progress for this scope, this will\n * wait for it to complete before starting a new one (mutex behavior).\n *\n * @param record - Current OM record\n * @param threadId - Thread ID\n * @param unobservedMessages - All unobserved messages (will be filtered for already-buffered)\n * @param lockKey - Lock key for this scope\n * @param writer - Optional stream writer for emitting buffering markers\n */\n private async startAsyncBufferedObservation(\n record: ObservationalMemoryRecord,\n threadId: string,\n unobservedMessages: MastraDBMessage[],\n lockKey: string,\n writer?: ProcessorStreamWriter,\n contextWindowTokens?: number,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n ): Promise<void> {\n const bufferKey = this.buffering.getObservationBufferKey(lockKey);\n\n // Update the last buffered boundary (in-memory for current instance).\n // Use contextWindowTokens (all messages in context) to match the scale of\n // totalPendingTokens passed to shouldTriggerAsyncObservation.\n const currentTokens =\n contextWindowTokens ??\n (await this.tokenCounter.countMessagesAsync(unobservedMessages)) + (record.pendingMessageTokens ?? 0);\n BufferingCoordinator.lastBufferedBoundary.set(bufferKey, currentTokens);\n\n // Set persistent flag so new instances (created per request) know buffering is in progress\n registerOp(record.id, 'bufferingObservation');\n this.storage.setBufferingObservationFlag(record.id, true, currentTokens).catch(err => {\n omError('[OM] Failed to set buffering observation flag', err);\n });\n\n // Start the async operation - waits for any existing op to complete first\n const asyncOp = this.runAsyncBufferedObservation(\n record,\n threadId,\n unobservedMessages,\n bufferKey,\n writer,\n requestContext,\n observabilityContext,\n ).finally(() => {\n // Clean up the operation tracking\n BufferingCoordinator.asyncBufferingOps.delete(bufferKey);\n // Clear persistent flag\n unregisterOp(record.id, 'bufferingObservation');\n this.storage.setBufferingObservationFlag(record.id, false).catch(err => {\n omError('[OM] Failed to clear buffering observation flag', err);\n });\n });\n\n BufferingCoordinator.asyncBufferingOps.set(bufferKey, asyncOp);\n }\n\n /**\n * Internal method that waits for existing buffering operation and then runs new buffering.\n * This implements the mutex-wait behavior.\n */\n private async runAsyncBufferedObservation(\n record: ObservationalMemoryRecord,\n threadId: string,\n unobservedMessages: MastraDBMessage[],\n bufferKey: string,\n writer?: ProcessorStreamWriter,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n ): Promise<void> {\n // Wait for any existing buffering operation to complete first (mutex behavior)\n const existingOp = BufferingCoordinator.asyncBufferingOps.get(bufferKey);\n if (existingOp) {\n try {\n await existingOp;\n } catch {\n // Previous op failed, continue with new one\n }\n }\n\n // Re-fetch record to get latest state after waiting\n const freshRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n if (!freshRecord) {\n return;\n }\n\n // Determine the buffer cursor — the timestamp boundary beyond which we look for new messages.\n // Start from the static map (in-process), fall back to DB record (survives restarts).\n let bufferCursor = BufferingCoordinator.lastBufferedAtTime.get(bufferKey) ?? freshRecord.lastBufferedAtTime ?? null;\n\n // Advance the cursor if lastObservedAt is newer (e.g. sync observation ran after the last buffer)\n if (freshRecord.lastObservedAt) {\n const lastObserved = new Date(freshRecord.lastObservedAt);\n if (!bufferCursor || lastObserved > bufferCursor) {\n bufferCursor = lastObserved;\n }\n }\n\n // Filter messages to only those newer than the buffer cursor.\n // This prevents re-buffering messages that were already included in a previous chunk.\n let candidateMessages = this.getUnobservedMessages(unobservedMessages, freshRecord, {\n excludeBuffered: true,\n });\n const preFilterCount = candidateMessages.length;\n if (bufferCursor) {\n candidateMessages = candidateMessages.filter(msg => {\n if (!msg.createdAt) return true; // include messages without timestamps\n return new Date(msg.createdAt) > bufferCursor;\n });\n }\n\n omDebug(\n `[OM:bufferCursor] cursor=${bufferCursor?.toISOString() ?? 'null'}, unobserved=${unobservedMessages.length}, afterExcludeBuffered=${preFilterCount}, afterCursorFilter=${candidateMessages.length}`,\n );\n\n // Check if there's enough content to buffer\n const bufferTokens = this.observationConfig.bufferTokens ?? 5000;\n const minNewTokens = bufferTokens / 2;\n const newTokens = await this.tokenCounter.countMessagesAsync(candidateMessages);\n\n if (newTokens < minNewTokens) {\n return; // Not enough new content to buffer\n }\n\n const messagesToBuffer = candidateMessages;\n\n // Seal the messages being buffered to prevent new parts from being added.\n // This ensures that any streaming content after this point goes to new messages,\n // preserving the boundary of what we're buffering.\n this.sealMessagesForBuffering(messagesToBuffer);\n\n // CRITICAL: Persist the sealed messages to storage immediately.\n // This ensures that:\n // 1. The seal metadata (sealedAt on last part) is saved to the database\n // 2. When MessageList creates new messages for streaming content after the seal,\n // those new messages have their own IDs and don't overwrite the sealed messages\n // 3. The sealed messages remain intact with their content at the time of buffering\n await this.messageHistory.persistMessages({\n messages: messagesToBuffer,\n threadId,\n resourceId: freshRecord.resourceId ?? undefined,\n });\n\n // Generate cycle ID and capture start time\n const cycleId = `buffer-obs-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n const startedAt = new Date().toISOString();\n const tokensToBuffer = await this.tokenCounter.countMessagesAsync(messagesToBuffer);\n\n // Emit buffering start marker\n if (writer) {\n const startMarker = createBufferingStartMarker({\n cycleId,\n operationType: 'observation',\n tokensToBuffer,\n recordId: freshRecord.id,\n threadId,\n threadIds: [threadId],\n config: this.getObservationMarkerConfig(),\n });\n void writer.custom(startMarker).catch(() => {});\n }\n\n omDebug(\n `[OM:bufferInput] cycleId=${cycleId}, msgCount=${messagesToBuffer.length}, msgTokens=${tokensToBuffer}, ids=${messagesToBuffer.map(m => `${m.id?.slice(0, 8)}@${m.createdAt ? new Date(m.createdAt).toISOString() : 'none'}`).join(',')}`,\n );\n\n await ObservationStrategy.create(this, {\n record: freshRecord,\n threadId,\n resourceId: freshRecord.resourceId ?? undefined,\n messages: messagesToBuffer,\n cycleId,\n startedAt,\n writer,\n requestContext,\n observabilityContext,\n }).run();\n\n // Update the buffer cursor so the next buffer only sees messages newer than this one.\n const maxTs = this.getMaxMessageTimestamp(messagesToBuffer);\n const cursor = new Date(maxTs.getTime() + 1);\n BufferingCoordinator.lastBufferedAtTime.set(bufferKey, cursor);\n }\n\n // ════════════════════════════════════════════════════════════════════════════\n // HIGH-LEVEL API — semantic operations for programmatic use\n // ════════════════════════════════════════════════════════════════════════════\n\n /**\n * Trigger async buffered observation if the token count has crossed a new interval.\n *\n * Encapsulates the shouldTrigger check + startAsyncBufferedObservation call.\n * Returns whether buffering was actually triggered.\n */\n async triggerAsyncBuffering(opts: {\n threadId: string;\n resourceId?: string;\n record: ObservationalMemoryRecord;\n pendingTokens: number;\n unbufferedPendingTokens: number;\n unobservedMessages: MastraDBMessage[];\n threshold: number;\n writer?: ProcessorStreamWriter;\n requestContext?: RequestContext;\n observabilityContext?: ObservabilityContext;\n }): Promise<boolean> {\n if (!this.buffering.isAsyncObservationEnabled()) return false;\n\n const lockKey = this.buffering.getLockKey(opts.threadId, opts.resourceId);\n const shouldTrigger = this.buffering.shouldTriggerAsyncObservation(\n opts.pendingTokens,\n lockKey,\n opts.record,\n this.storage,\n opts.threshold,\n );\n\n if (shouldTrigger) {\n void this.startAsyncBufferedObservation(\n opts.record,\n opts.threadId,\n opts.unobservedMessages,\n lockKey,\n opts.writer,\n opts.unbufferedPendingTokens,\n opts.requestContext,\n );\n }\n\n return shouldTrigger;\n }\n\n private isMessageList(value: MessageList | MastraDBMessage[]): value is MessageList {\n return !!value && typeof value === 'object' && 'get' in value && 'removeByIds' in value;\n }\n\n private removeIdsFromArray(messages: MastraDBMessage[], ids: string[]) {\n if (ids.length === 0) return;\n const idsSet = new Set(ids);\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg?.id && idsSet.has(msg.id)) {\n messages.splice(i, 1);\n }\n }\n }\n\n /**\n * Mutate partially observed messages in place and return the fully observed\n * message IDs that should be removed from the live context.\n *\n * This is the shared activation-cleanup primitive used by both the processor\n * and AI SDK integrations: callers pass the current live messages, OM trims\n * any partially observed messages down to their unobserved parts, and OM\n * returns only the IDs that are safe to remove entirely.\n */\n async getObservedMessageIdsForCleanup(opts: {\n threadId: string;\n resourceId?: string;\n messages: MastraDBMessage[];\n observedMessageIds?: string[];\n retentionFloor?: number;\n }): Promise<string[]> {\n const { threadId, resourceId, messages, observedMessageIds, retentionFloor } = opts;\n\n const record = await this.getOrCreateRecord(threadId, resourceId);\n const effectiveObservedIds =\n observedMessageIds && observedMessageIds.length > 0\n ? observedMessageIds\n : Array.isArray(record.observedMessageIds)\n ? record.observedMessageIds\n : [];\n\n if (effectiveObservedIds.length === 0) {\n return [];\n }\n\n const observedSet = new Set(effectiveObservedIds);\n const idsToRemove = new Set<string>();\n const removalOrder: string[] = [];\n let skipped = 0;\n let backoffTriggered = false;\n const retentionCounter = typeof retentionFloor === 'number' ? new TokenCounter() : null;\n\n for (const msg of messages) {\n if (!msg?.id || msg.id === 'om-continuation' || !observedSet.has(msg.id)) continue;\n\n const unobservedParts = getUnobservedParts(msg);\n const totalParts = msg.content?.parts?.length ?? 0;\n\n if (unobservedParts.length > 0 && unobservedParts.length < totalParts) {\n msg.content.parts = unobservedParts;\n continue;\n }\n\n if (retentionCounter && typeof retentionFloor === 'number') {\n const nextRemainingMessages = messages.filter(\n m => m?.id && m.id !== 'om-continuation' && !idsToRemove.has(m.id) && m.id !== msg.id,\n );\n const remainingIfRemoved = retentionCounter.countMessages(nextRemainingMessages);\n if (remainingIfRemoved < retentionFloor) {\n skipped += 1;\n backoffTriggered = true;\n break;\n }\n }\n\n idsToRemove.add(msg.id);\n removalOrder.push(msg.id);\n }\n\n if (retentionCounter && typeof retentionFloor === 'number' && idsToRemove.size > 0) {\n let remainingMessages = messages.filter(m => m?.id && m.id !== 'om-continuation' && !idsToRemove.has(m.id));\n let remainingTokens = retentionCounter.countMessages(remainingMessages);\n\n while (remainingTokens < retentionFloor && removalOrder.length > 0) {\n const restoreId = removalOrder.pop()!;\n idsToRemove.delete(restoreId);\n skipped += 1;\n backoffTriggered = true;\n remainingMessages = messages.filter(m => m?.id && m.id !== 'om-continuation' && !idsToRemove.has(m.id));\n remainingTokens = retentionCounter.countMessages(remainingMessages);\n }\n }\n\n omDebug(\n `[OM:cleanupActivation] matched=${idsToRemove.size}, skipped=${skipped}, backoffTriggered=${backoffTriggered}`,\n );\n\n return [...idsToRemove];\n }\n\n /**\n * Clean up observed content from either a live MessageList or a plain message array.\n *\n * - MessageList input: mutates the live container in place and returns the remaining messages\n * - Array input: mutates the array in place and returns it\n *\n * This is the shared cleanup primitive intended for both processor and non-processor\n * integrations. The processor may still pass sealedIds/state so marker/fallback cleanup\n * can persist messages safely, but callers that do not need that bookkeeping can omit it.\n */\n /** @internal Used by ObservationStep. */\n async cleanupMessages(opts: {\n threadId: string;\n resourceId?: string;\n messages: MessageList | MastraDBMessage[];\n observedMessageIds?: string[];\n retentionFloor?: number;\n }): Promise<MastraDBMessage[]> {\n const { threadId, resourceId, observedMessageIds, retentionFloor } = opts;\n const messageList = this.isMessageList(opts.messages) ? opts.messages : undefined;\n const allMsgs: MastraDBMessage[] = messageList ? messageList.get.all.db() : (opts.messages as MastraDBMessage[]);\n\n let markerIdx = -1;\n let markerMsg: MastraDBMessage | null = null;\n\n for (let i = allMsgs.length - 1; i >= 0; i--) {\n const msg = allMsgs[i];\n if (!msg) continue;\n if (findLastCompletedObservationBoundary(msg) !== -1) {\n markerIdx = i;\n markerMsg = msg;\n break;\n }\n }\n\n omDebug(\n `[OM:cleanupBranch] allMsgs=${allMsgs.length}, markerFound=${markerIdx !== -1}, markerIdx=${markerIdx}, observedMessageIds=${observedMessageIds?.length ?? 'undefined'}`,\n );\n\n if (observedMessageIds && observedMessageIds.length > 0) {\n const idsToRemoveList = await this.getObservedMessageIdsForCleanup({\n threadId,\n resourceId,\n messages: allMsgs,\n observedMessageIds,\n retentionFloor,\n });\n\n if (messageList) {\n if (idsToRemoveList.length > 0) {\n messageList.removeByIds(idsToRemoveList);\n }\n return messageList.get.all.db();\n }\n\n this.removeIdsFromArray(allMsgs, idsToRemoveList);\n return allMsgs;\n }\n\n if (markerMsg && markerIdx !== -1) {\n const idsToRemove: string[] = [];\n const messagesToSave: MastraDBMessage[] = [];\n\n for (let i = 0; i < markerIdx; i++) {\n const msg = allMsgs[i];\n if (msg?.id && msg.id !== 'om-continuation') {\n idsToRemove.push(msg.id);\n messagesToSave.push(msg);\n }\n }\n\n messagesToSave.push(markerMsg);\n\n const unobservedParts = getUnobservedParts(markerMsg);\n if (unobservedParts.length === 0) {\n if (markerMsg.id) idsToRemove.push(markerMsg.id);\n } else if (unobservedParts.length < (markerMsg.content?.parts?.length ?? 0)) {\n markerMsg.content.parts = unobservedParts;\n }\n\n if (messageList) {\n if (idsToRemove.length > 0) {\n messageList.removeByIds(idsToRemove);\n }\n\n if (messagesToSave.length > 0) {\n await this.persistMessages(messagesToSave, threadId, resourceId);\n }\n\n omDebug(`[OM:cleanupMarker] removed ${idsToRemove.length} messages, saved ${messagesToSave.length}`);\n return messageList.get.all.db();\n }\n\n this.removeIdsFromArray(allMsgs, idsToRemove);\n return allMsgs;\n }\n\n // No observed IDs and no marker — nothing to clean up.\n // Return messages unchanged.\n return messageList ? messageList.get.all.db() : allMsgs;\n }\n\n /**\n * Clean up the message context after a successful observation.\n *\n * Handles both activation-based cleanup (using observedMessageIds) and\n * marker-based cleanup (using observation boundary markers). Respects\n * retention floors to prevent removing too many messages.\n */\n async cleanupObservedContext(opts: {\n messageList: MessageList;\n threadId: string;\n resourceId?: string;\n observedMessageIds?: string[];\n retentionFloor?: number;\n }): Promise<void> {\n const { messageList, threadId, resourceId, observedMessageIds, retentionFloor } = opts;\n await this.cleanupMessages({\n threadId,\n resourceId,\n messages: messageList,\n observedMessageIds,\n retentionFloor,\n });\n }\n\n /**\n * Reset buffering state after a successful observation activation.\n *\n * Clears the lastBufferedBoundary, buffering flag, and optionally cleans up\n * static maps for activated message IDs.\n */\n /** @internal Used by ObservationStep. */\n async resetBufferingState(opts: {\n threadId: string;\n resourceId?: string;\n recordId: string;\n activatedMessageIds?: string[];\n }): Promise<void> {\n const { threadId, resourceId, recordId, activatedMessageIds } = opts;\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n const bufKey = this.buffering.getObservationBufferKey(lockKey);\n\n BufferingCoordinator.lastBufferedBoundary.set(bufKey, 0);\n await this.storage.setBufferingObservationFlag(recordId, false, 0).catch(() => {});\n\n if (activatedMessageIds && activatedMessageIds.length > 0) {\n this.buffering.cleanupStaticMaps(threadId, resourceId, activatedMessageIds);\n }\n }\n\n /**\n * Build the observation system message string for injection into an LLM prompt.\n *\n * Loads thread metadata (currentTask, suggestedResponse), formats observations\n * with context prompts and instructions, and returns the fully-formed string.\n * Returns undefined if no observations exist.\n *\n * This is the public entry point for context formatting — used by both\n * Memory.getContext() (standalone) and the processor (via injectObservationsIntoMessages).\n *\n * @example\n * ```ts\n * const systemMsg = await om.buildContextSystemMessage({ threadId: 'thread-1' });\n * if (systemMsg) {\n * const result = await generateText({ system: systemMsg, messages });\n * }\n * ```\n */\n async buildContextSystemMessage(opts: {\n threadId: string;\n resourceId?: string;\n record?: ObservationalMemoryRecord;\n unobservedContextBlocks?: string;\n currentDate?: Date;\n }): Promise<string | undefined> {\n const parts = await this.buildContextSystemMessages(opts);\n return parts?.join('\\n\\n');\n }\n\n /**\n * Build observation context as an array of system message chunks.\n * Each chunk is a separate system message for better LLM cache hit rates.\n * Used by the processor to inject multiple system messages.\n * @internal\n */\n async buildContextSystemMessages(opts: {\n threadId: string;\n resourceId?: string;\n record?: ObservationalMemoryRecord;\n unobservedContextBlocks?: string;\n currentDate?: Date;\n }): Promise<string[] | undefined> {\n const { threadId, resourceId, unobservedContextBlocks } = opts;\n const record = opts.record ?? (await this.getOrCreateRecord(threadId, resourceId));\n\n if (!record.activeObservations) return undefined;\n\n // Read thread metadata for continuation hints\n const thread = await this.storage.getThreadById({ threadId });\n const omMetadata = getThreadOMMetadata(thread?.metadata);\n const currentTask = omMetadata?.currentTask;\n const suggestedResponse = omMetadata?.suggestedResponse;\n const currentDate = opts.currentDate ?? new Date();\n\n return this.formatObservationsForContext(\n record.activeObservations,\n currentTask,\n suggestedResponse,\n unobservedContextBlocks,\n currentDate,\n this.retrieval,\n );\n }\n\n /**\n * Get unobserved messages from other threads for resource-scoped observation.\n *\n * Lists all threads for the resource, filters to unobserved messages,\n * and formats them as context blocks.\n */\n /** @internal Used by ObservationTurn. */\n async getOtherThreadsContext(resourceId: string, currentThreadId: string): Promise<string | undefined> {\n const { threads: allThreads } = await this.storage.listThreads({ filter: { resourceId } });\n const messagesByThread = new Map<string, MastraDBMessage[]>();\n\n for (const thread of allThreads) {\n if (thread.id === currentThreadId) continue;\n\n const omMetadata = getThreadOMMetadata(thread.metadata);\n const threadLastObservedAt = omMetadata?.lastObservedAt;\n const startDate = threadLastObservedAt ? new Date(new Date(threadLastObservedAt).getTime() + 1) : undefined;\n\n const result = await this.storage.listMessages({\n threadId: thread.id,\n perPage: false,\n orderBy: { field: 'createdAt', direction: 'ASC' },\n filter: startDate ? { dateRange: { start: startDate } } : undefined,\n });\n\n const filtered = result.messages.filter(m => !this.observedMessageIds.has(m.id));\n\n if (filtered.length > 0) {\n messagesByThread.set(thread.id, filtered);\n }\n }\n\n if (messagesByThread.size === 0) return undefined;\n const blocks = await this.formatUnobservedContextBlocks(messagesByThread, currentThreadId);\n return blocks || undefined;\n }\n\n /**\n * Emit debug event and stream progress for UI feedback.\n */\n async emitProgress(opts: {\n record: ObservationalMemoryRecord;\n pendingTokens: number;\n threshold: number;\n effectiveObservationTokensThreshold: number;\n currentObservationTokens: number;\n writer?: ProcessorStreamWriter;\n stepNumber: number;\n threadId: string;\n resourceId?: string;\n }): Promise<void> {\n const {\n record,\n pendingTokens,\n threshold,\n effectiveObservationTokensThreshold,\n currentObservationTokens,\n writer,\n stepNumber,\n threadId,\n resourceId,\n } = opts;\n\n this.emitDebugEvent({\n type: 'step_progress',\n timestamp: new Date(),\n threadId,\n resourceId: resourceId ?? '',\n stepNumber,\n finishReason: 'unknown',\n pendingTokens,\n threshold,\n thresholdPercent: Math.round((pendingTokens / threshold) * 100),\n willSave: pendingTokens >= threshold,\n willObserve: pendingTokens >= threshold,\n });\n\n if (writer) {\n const bufferedChunks = getBufferedChunks(record);\n const bufferedObservationTokens = bufferedChunks.reduce((sum, chunk) => sum + (chunk.tokenCount ?? 0), 0);\n const rawBufferedMessageTokens = bufferedChunks.reduce((sum, chunk) => sum + (chunk.messageTokens ?? 0), 0);\n const bufferedMessageTokens = Math.min(rawBufferedMessageTokens, pendingTokens);\n\n const projectedMessageRemoval = calculateProjectedMessageRemoval(\n bufferedChunks,\n this.observationConfig.bufferActivation ?? 1,\n getMaxThreshold(this.getEffectiveMessageTokens(record)),\n pendingTokens,\n );\n\n let obsBufferStatus: 'idle' | 'running' | 'complete' = 'idle';\n if (record.isBufferingObservation) obsBufferStatus = 'running';\n else if (bufferedChunks.length > 0) obsBufferStatus = 'complete';\n\n let refBufferStatus: 'idle' | 'running' | 'complete' = 'idle';\n if (record.isBufferingReflection) refBufferStatus = 'running';\n else if (record.bufferedReflection && record.bufferedReflection.length > 0) refBufferStatus = 'complete';\n\n const statusPart: DataOmStatusPart = {\n type: 'data-om-status',\n data: {\n windows: {\n active: {\n messages: { tokens: pendingTokens, threshold },\n observations: { tokens: currentObservationTokens, threshold: effectiveObservationTokensThreshold },\n },\n buffered: {\n observations: {\n chunks: bufferedChunks.length,\n messageTokens: bufferedMessageTokens,\n projectedMessageRemoval,\n observationTokens: bufferedObservationTokens,\n status: obsBufferStatus,\n },\n reflection: {\n inputObservationTokens: record.bufferedReflectionInputTokens ?? 0,\n observationTokens: record.bufferedReflectionTokens ?? 0,\n status: refBufferStatus,\n },\n },\n },\n recordId: record.id,\n threadId,\n stepNumber,\n generationCount: record.generationCount,\n },\n };\n omDebug(\n `[OM:status] step=${stepNumber} msgs=${pendingTokens}/${threshold} obs=${currentObservationTokens}/${effectiveObservationTokensThreshold} gen=${record.generationCount}`,\n );\n await writer.custom(statusPart).catch(() => {});\n }\n }\n\n /**\n * Get the current observation status for a thread/resource.\n *\n * Loads unobserved messages from storage, counts tokens, and checks against\n * configured thresholds. Returns a comprehensive status object that tells the\n * caller what actions are needed.\n *\n * This is a pure read operation with no side effects.\n *\n * @example\n * ```ts\n * const status = await om.getStatus({ threadId });\n * if (status.shouldObserve) {\n * await om.observe({ threadId });\n * } else if (status.shouldBuffer) {\n * await om.buffer({ threadId });\n * }\n * if (status.shouldReflect) {\n * await om.reflect(threadId);\n * }\n * ```\n */\n async getStatus(opts: { threadId: string; resourceId?: string; messages?: MastraDBMessage[] }): Promise<{\n record: ObservationalMemoryRecord;\n pendingTokens: number;\n threshold: number;\n effectiveObservationTokensThreshold: number;\n unbufferedPendingTokens: number;\n shouldObserve: boolean;\n shouldBuffer: boolean;\n shouldReflect: boolean;\n bufferedChunkCount: number;\n bufferedChunkTokens: number;\n canActivate: boolean;\n asyncObservationEnabled: boolean;\n asyncReflectionEnabled: boolean;\n scope: 'resource' | 'thread';\n }> {\n const { threadId, resourceId } = opts;\n const record = await this.getOrCreateRecord(threadId, resourceId);\n const currentObservationTokens = record.observationTokenCount ?? 0;\n\n // Use provided messages or load from storage\n let unobservedMessages: MastraDBMessage[];\n if (opts.messages) {\n unobservedMessages = this.getUnobservedMessages(opts.messages, record);\n } else {\n const rawMessages = await this.loadMessagesFromStorage(\n threadId,\n resourceId,\n record.lastObservedAt ? new Date(record.lastObservedAt) : undefined,\n );\n unobservedMessages = this.getUnobservedMessages(rawMessages, record);\n }\n\n // Count tokens\n const contextWindowTokens = await this.tokenCounter.countMessagesAsync(unobservedMessages);\n let otherThreadTokens = 0;\n if (this.scope === 'resource' && resourceId) {\n const otherContext = await this.getOtherThreadsContext(resourceId, threadId);\n otherThreadTokens = otherContext ? this.tokenCounter.countString(otherContext) : 0;\n }\n const pendingTokens = Math.max(0, contextWindowTokens + otherThreadTokens);\n\n // Calculate observation threshold (use per-record override if set)\n const threshold = calculateDynamicThreshold(this.getEffectiveMessageTokens(record), currentObservationTokens);\n\n // Buffering status\n const bufferedChunks = getBufferedChunks(record);\n const bufferedChunkCount = bufferedChunks.length;\n const bufferedChunkTokens = bufferedChunks.reduce((sum, chunk) => sum + (chunk.messageTokens ?? 0), 0);\n\n // Should buffer? Check interval boundary using DB-backed state\n const asyncObservationEnabled = this.buffering.isAsyncObservationEnabled();\n let shouldBuffer = false;\n if (asyncObservationEnabled && pendingTokens < threshold) {\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n shouldBuffer = this.buffering.shouldTriggerAsyncObservation(\n pendingTokens,\n lockKey,\n record,\n this.storage,\n threshold,\n );\n }\n\n // Should observe?\n const shouldObserve = pendingTokens >= threshold;\n\n // Should reflect? (use per-record override if set)\n const reflectThreshold = getMaxThreshold(this.getEffectiveReflectionTokens(record));\n const shouldReflect = currentObservationTokens >= reflectThreshold;\n\n // Can activate?\n const canActivate = bufferedChunkCount > 0;\n\n // Effective observation tokens threshold (for shared budget UI display)\n const effectiveMessageTokens = this.getEffectiveMessageTokens(record);\n const isSharedBudget = typeof effectiveMessageTokens !== 'number';\n const totalBudget = isSharedBudget ? (effectiveMessageTokens as { min: number; max: number }).max : 0;\n const effectiveObservationTokensThreshold = isSharedBudget\n ? Math.max(totalBudget - threshold, 1000)\n : reflectThreshold;\n\n const unbufferedPendingTokens = Math.max(0, pendingTokens - bufferedChunkTokens);\n\n return {\n record,\n pendingTokens,\n threshold,\n effectiveObservationTokensThreshold,\n unbufferedPendingTokens,\n shouldObserve,\n shouldBuffer,\n shouldReflect,\n bufferedChunkCount,\n bufferedChunkTokens,\n canActivate,\n asyncObservationEnabled,\n asyncReflectionEnabled: this.buffering.isAsyncReflectionEnabled(),\n scope: this.scope,\n };\n }\n\n /**\n * Finalize the observation lifecycle: activate any remaining buffered chunks,\n * then observe if the threshold is crossed.\n *\n * Call this at the end of a conversation, session, or turn sequence to ensure\n * no buffered observations are left orphaned and the observation cursor is\n * advanced. Produces a clean terminal state (no pending chunks, cursor up to date).\n *\n * @example\n * ```ts\n * // After all turns are complete\n * const result = await om.finalize({ threadId });\n * // result.activated: true if buffered chunks were promoted\n * // result.observed: true if a full observation pass ran\n * ```\n */\n async finalize(opts: { threadId: string; resourceId?: string; messages?: MastraDBMessage[] }): Promise<{\n activated: boolean;\n observed: boolean;\n reflected: boolean;\n record: ObservationalMemoryRecord;\n }> {\n const { threadId, resourceId, messages } = opts;\n let activated = false;\n let observed = false;\n let reflected = false;\n\n // Wait for any in-flight buffer operations to complete\n await BufferingCoordinator.awaitBuffering(threadId, resourceId ?? null, this.scope);\n\n // Activate any remaining buffered chunks\n const preStatus = await this.getStatus({ threadId, resourceId, messages });\n if (preStatus.canActivate) {\n const actResult = await this.activate({ threadId, resourceId });\n activated = actResult.activated;\n }\n\n // Observe if threshold is crossed (advances the cursor)\n const postStatus = await this.getStatus({ threadId, resourceId, messages });\n if (postStatus.shouldObserve) {\n const obsResult = await this.observe({ threadId, resourceId, messages });\n observed = obsResult.observed;\n }\n\n // Reflect if observation tokens exceed reflection threshold\n const reflectStatus = await this.getStatus({ threadId, resourceId });\n if (reflectStatus.shouldReflect) {\n const refResult = await this.reflect(threadId, resourceId);\n reflected = refResult.reflected;\n }\n\n const record = await this.getOrCreateRecord(threadId, resourceId);\n return { activated, observed, reflected, record };\n }\n\n /**\n * Return only the messages that haven't been fully observed yet.\n *\n * Use this to prune observed messages from an in-memory message array,\n * preventing unbounded context growth across steps in a multi-step loop.\n * This is the array-based equivalent of the processor's `cleanupObservedContext()`.\n *\n * @example\n * ```ts\n * // In a prepareStep hook, prune before sending to the model\n * messages = await om.pruneObserved({ threadId, messages });\n * ```\n */\n async pruneObserved(opts: {\n threadId: string;\n resourceId?: string;\n messages: MastraDBMessage[];\n }): Promise<MastraDBMessage[]> {\n const { threadId, resourceId, messages } = opts;\n const record = await this.getOrCreateRecord(threadId, resourceId);\n return this.getUnobservedMessages(messages, record);\n }\n\n /**\n * Load unobserved messages from storage for a thread/resource.\n *\n * Fetches the OM record, queries storage for messages after the\n * lastObservedAt cursor, then applies part-level filtering so\n * partially-observed messages only include their unobserved parts.\n *\n * Use this when you need to load stored conversation history that\n * hasn't been observed yet (e.g. in a stateless gateway proxy that\n * only receives the latest message from the HTTP request).\n */\n async loadUnobservedMessages(opts: { threadId: string; resourceId?: string }): Promise<MastraDBMessage[]> {\n const { threadId, resourceId } = opts;\n const record = await this.getOrCreateRecord(threadId, resourceId);\n const rawMessages = await this.loadMessagesFromStorage(\n threadId,\n resourceId,\n record.lastObservedAt ? new Date(record.lastObservedAt) : undefined,\n );\n return this.getUnobservedMessages(rawMessages, record);\n }\n\n /**\n * Create a buffered observation chunk without merging into active observations.\n *\n * Loads unobserved messages from storage (filtered by the buffer cursor to avoid\n * re-buffering), calls the observer LLM, and stores the result as a pending\n * buffered chunk in the DB. The chunk can later be merged into active observations\n * via `activate()`.\n *\n * This is a synchronous (awaited) operation — the caller decides whether to\n * `await` it or fire-and-forget. All state lives in storage; no in-process\n * coordination is needed.\n *\n * @example\n * ```ts\n * const status = await om.getStatus({ threadId });\n * if (status.shouldBuffer) {\n * await om.buffer({ threadId });\n * }\n * ```\n */\n /** @internal Used by ObservationStep. */\n async buffer(opts: {\n threadId: string;\n resourceId?: string;\n messages?: MastraDBMessage[];\n /** The freshly-counted pending token count from the caller. If not provided,\n * falls back to record.pendingMessageTokens (which may be stale). */\n pendingTokens?: number;\n /** Pre-loaded record to skip the initial getOrCreateRecord() fetch.\n * When called fire-and-forget, passing the record avoids an async gap\n * before lastBufferedBoundary is set. */\n record?: ObservationalMemoryRecord;\n writer?: ProcessorStreamWriter;\n requestContext?: RequestContext;\n observabilityContext?: ObservabilityContext;\n /** Called with the final candidate messages after cursor filtering, before the observer runs.\n * Use this to seal messages in a live MessageList and persist them to storage. */\n beforeBuffer?: (candidates: MastraDBMessage[]) => Promise<void>;\n }): Promise<{\n buffered: boolean;\n record: ObservationalMemoryRecord;\n }> {\n const { threadId, resourceId, requestContext, observabilityContext } = opts;\n\n let record = opts.record ?? (await this.getOrCreateRecord(threadId, resourceId));\n\n // Check if buffering is enabled\n if (!this.buffering.isAsyncObservationEnabled()) {\n return { buffered: false, record };\n }\n\n // Check if another process is already buffering (and the op is genuinely active)\n if (record.isBufferingObservation && isOpActiveInProcess(record.id, 'bufferingObservation')) {\n return { buffered: false, record };\n }\n\n // Use the caller-provided pendingTokens if available (processor passes the freshly-counted\n // value from in-memory messages), otherwise fall back to the DB-stored value.\n const currentTokens = opts.pendingTokens ?? record.pendingMessageTokens ?? 0;\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n const bufferKey = this.buffering.getObservationBufferKey(lockKey);\n\n // Set lastBufferedBoundary IMMEDIATELY (before ANY async work) to prevent\n // shouldTriggerAsyncObservation from triggering again on the next step.\n // This MUST happen before the first await when buffer() is called fire-and-forget.\n BufferingCoordinator.lastBufferedBoundary.set(bufferKey, currentTokens);\n\n // Clear stale flag if it was set by a crashed process (non-blocking)\n if (record.isBufferingObservation) {\n await this.storage.setBufferingObservationFlag(record.id, false).catch(() => {});\n }\n\n // Wait for any existing buffering operation to complete first (mutex behavior).\n // IMPORTANT: read the existing op BEFORE overwriting the map entry.\n const existingOp = BufferingCoordinator.asyncBufferingOps.get(bufferKey);\n if (existingOp) {\n try {\n await existingOp;\n } catch {\n // Previous op failed, continue with new one\n }\n }\n\n // Set persistent flag and register op\n registerOp(record.id, 'bufferingObservation');\n this.storage.setBufferingObservationFlag(record.id, true, currentTokens).catch(err => {\n omError('[OM] Failed to set buffering observation flag', err);\n });\n\n // Register in asyncBufferingOps so callers (and tests) can await completion\n let resolveOp: () => void;\n const opPromise = new Promise<void>(resolve => {\n resolveOp = resolve;\n });\n BufferingCoordinator.asyncBufferingOps.set(bufferKey, opPromise);\n\n // Re-fetch record after mutex wait to get the latest state\n record = (await this.storage.getObservationalMemory(record.threadId, record.resourceId)) ?? record;\n\n let flagCleared = false;\n\n try {\n // Load messages: use provided or load from storage\n let candidateMessages: MastraDBMessage[];\n if (opts.messages) {\n candidateMessages = this.getUnobservedMessages(opts.messages, record, { excludeBuffered: true });\n } else {\n const rawMessages = await this.loadMessagesFromStorage(\n threadId,\n resourceId,\n record.lastObservedAt ? new Date(record.lastObservedAt) : undefined,\n );\n candidateMessages = this.getUnobservedMessages(rawMessages, record, { excludeBuffered: true });\n }\n\n // Apply cursor filtering only for storage-loaded messages.\n // When messages are provided directly, they're fresh and shouldn't be filtered by cursor.\n if (!opts.messages) {\n let bufferCursor = BufferingCoordinator.lastBufferedAtTime.get(bufferKey) ?? record.lastBufferedAtTime ?? null;\n if (record.lastObservedAt) {\n const lastObserved = new Date(record.lastObservedAt);\n if (!bufferCursor || lastObserved > bufferCursor) {\n bufferCursor = lastObserved;\n }\n }\n\n if (bufferCursor) {\n candidateMessages = candidateMessages.filter(msg => {\n if (!msg.createdAt) return true;\n return new Date(msg.createdAt) > bufferCursor;\n });\n }\n }\n\n // Check minimum token threshold\n const bufferTokens = this.observationConfig.bufferTokens ?? 5000;\n const minNewTokens = bufferTokens / 2;\n const newTokens = await this.tokenCounter.countMessagesAsync(candidateMessages);\n\n if (newTokens < minNewTokens || candidateMessages.length === 0) {\n return { buffered: false, record };\n }\n\n // Seal candidates before the observer runs.\n // If a beforeBuffer callback is provided (processor path), it handles sealing + persistence.\n // Otherwise, seal automatically so external consumers don't need to deal with it.\n if (opts.beforeBuffer) {\n await opts.beforeBuffer(candidateMessages);\n } else if (opts.messages) {\n this.sealMessagesForBuffering(candidateMessages);\n }\n\n // Generate cycle ID\n const cycleId = `buffer-obs-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n const startedAt = new Date().toISOString();\n\n // Emit buffering start marker\n const writer = opts.writer;\n if (writer) {\n const startMarker = createBufferingStartMarker({\n cycleId,\n operationType: 'observation',\n tokensToBuffer: newTokens,\n recordId: record.id,\n threadId,\n threadIds: [threadId],\n config: this.getObservationMarkerConfig(),\n });\n void writer.custom(startMarker).catch(() => {});\n }\n\n // Call the observer via strategy pattern\n await ObservationStrategy.create(this, {\n record,\n threadId,\n resourceId: record.resourceId ?? undefined,\n messages: candidateMessages,\n cycleId,\n startedAt,\n writer,\n requestContext,\n observabilityContext,\n }).run();\n\n if (isOmReproCaptureEnabled()) {\n writeObserverExchangeReproCapture({\n threadId,\n resourceId: record.resourceId ?? undefined,\n label: `buffer-${cycleId}`,\n observerExchange: this.observer.lastExchange,\n details: {\n cycleId,\n startedAt,\n buffered: true,\n candidateMessageIds: candidateMessages.map(message => message.id),\n candidateMessageCount: candidateMessages.length,\n pendingTokens: currentTokens,\n newTokens,\n },\n });\n }\n\n // Update the boundary tokens in storage + in-memory cache for interval tracking\n await this.storage.setBufferingObservationFlag(record.id, false, newTokens).catch(() => {});\n flagCleared = true;\n BufferingCoordinator.lastBufferedBoundary.set(bufferKey, newTokens);\n\n // Update lastBufferedAtTime in-memory cache so subsequent buffer() calls filter correctly\n const maxTimestamp = this.getMaxMessageTimestamp(candidateMessages);\n const cursor = new Date(maxTimestamp.getTime() + 1);\n BufferingCoordinator.lastBufferedAtTime.set(bufferKey, cursor);\n\n const updatedRecord = await this.getOrCreateRecord(threadId, resourceId);\n return { buffered: true, record: updatedRecord };\n } catch (error) {\n omError('[OM] buffer() failed', error);\n return { buffered: false, record };\n } finally {\n unregisterOp(record.id, 'bufferingObservation');\n BufferingCoordinator.asyncBufferingOps.delete(bufferKey);\n resolveOp!();\n // Only clear the flag if the success path didn't already clear it (with token count)\n if (!flagCleared) {\n await this.storage.setBufferingObservationFlag(record.id, false).catch(() => {});\n }\n }\n }\n\n /**\n * Activate buffered observation chunks by merging them into active observations.\n *\n * This is a pure storage operation — no LLM call. It reads buffered chunks from\n * the DB and swaps them into active observations via `storage.swapBufferedToActive()`.\n *\n * Call this after `buffer()` has created chunks, typically at the start of a new\n * turn or when `getStatus().canActivate` is true.\n *\n * @example\n * ```ts\n * const status = await om.getStatus({ threadId });\n * if (status.canActivate) {\n * const result = await om.activate({ threadId });\n * if (result.activated) {\n * console.log('Activated', result.activatedMessageIds?.length, 'message observations');\n * }\n * }\n * ```\n */\n /** @internal Used by ObservationStep. */\n async activate(opts: {\n threadId: string;\n resourceId?: string;\n /** When true, skip activation if pending tokens are below the observation threshold. */\n checkThreshold?: boolean;\n /** Messages to use for threshold check (in-memory). If omitted, loads from storage. */\n messages?: MastraDBMessage[];\n /** Stream writer for emitting activation markers to the UI. */\n writer?: ProcessorStreamWriter;\n /** MessageList for persisting activation markers on the last assistant message. */\n messageList?: MessageList;\n }): Promise<{\n activated: boolean;\n record: ObservationalMemoryRecord;\n activatedMessageIds?: string[];\n }> {\n const { threadId, resourceId } = opts;\n\n const record = await this.getOrCreateRecord(threadId, resourceId);\n\n // Reset stale lastBufferedBoundary at the start of a new turn.\n // If the stored boundary is far above the current context size, it's\n // leftover from a previous turn and would block future buffering triggers.\n if (this.buffering.isAsyncObservationEnabled()) {\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n const bufKey = this.buffering.getObservationBufferKey(lockKey);\n const dbBoundary = record.lastBufferedAtTokens ?? 0;\n if (dbBoundary > 0 && opts.messages) {\n const unobserved = this.getUnobservedMessages(opts.messages, record);\n const currentContextTokens = this.tokenCounter.countMessages(unobserved);\n if (currentContextTokens < dbBoundary * 0.5) {\n omDebug(\n `[OM:activate] resetting stale lastBufferedBoundary: dbBoundary=${dbBoundary}, currentContextTokens=${currentContextTokens}`,\n );\n BufferingCoordinator.lastBufferedBoundary.set(bufKey, 0);\n await this.storage.setBufferingObservationFlag(record.id, false, 0).catch(() => {});\n }\n }\n }\n\n // Check for buffered chunks\n const chunks = getBufferedChunks(record);\n if (!chunks.length) {\n return { activated: false, record };\n }\n\n // Optional threshold guard — skip activation if pending tokens are below threshold\n if (opts.checkThreshold) {\n const status = await this.getStatus({ threadId, resourceId, messages: opts.messages });\n if (status.pendingTokens < status.threshold) {\n return { activated: false, record };\n }\n }\n\n // Wait for any in-progress buffering to complete (check DB flag)\n if (record.isBufferingObservation) {\n // If the op is active in this process, wait for it\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n const bufferKey = this.buffering.getObservationBufferKey(lockKey);\n const asyncOp = BufferingCoordinator.asyncBufferingOps.get(bufferKey);\n if (asyncOp) {\n try {\n await Promise.race([\n asyncOp,\n new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 60_000)),\n ]);\n } catch {\n // Timeout or error — proceed with what we have\n }\n }\n // If not in this process, the flag might be stale or from another replica.\n // Proceed with activation of whatever chunks exist.\n }\n\n // Re-fetch to get latest chunks after any completed buffering\n const freshRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n if (!freshRecord) {\n return { activated: false, record };\n }\n const freshChunks = getBufferedChunks(freshRecord);\n if (!freshChunks.length) {\n return { activated: false, record };\n }\n\n // Calculate activation parameters (use per-record override if set)\n const messageTokensThreshold = getMaxThreshold(this.getEffectiveMessageTokens(freshRecord));\n const bufferActivation = this.observationConfig.bufferActivation ?? 0.7;\n const activationRatio = resolveActivationRatio(bufferActivation, messageTokensThreshold);\n\n // Estimate current pending tokens from chunks\n const totalChunkMessageTokens = freshChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const currentPendingTokens = freshRecord.pendingMessageTokens || totalChunkMessageTokens;\n\n const forceMaxActivation = !!(\n this.observationConfig.blockAfter && currentPendingTokens >= this.observationConfig.blockAfter\n );\n\n // Perform the swap\n const activationResult = await this.storage.swapBufferedToActive({\n id: freshRecord.id,\n activationRatio,\n messageTokensThreshold,\n currentPendingTokens,\n forceMaxActivation,\n bufferedChunks: freshChunks,\n });\n\n // Clear buffering flag\n await this.storage.setBufferingObservationFlag(freshRecord.id, false).catch(() => {});\n unregisterOp(freshRecord.id, 'bufferingObservation');\n\n // Fetch updated record for marker emission\n const postSwapRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);\n\n // Emit activation markers for UI feedback — one per activated cycleId\n if (opts.writer && postSwapRecord && activationResult.activatedCycleIds.length > 0) {\n const perChunkMap = new Map(activationResult.perChunk?.map(c => [c.cycleId, c]));\n for (const cycleId of activationResult.activatedCycleIds) {\n const chunkData = perChunkMap.get(cycleId);\n const activationMarker = createActivationMarker({\n cycleId,\n operationType: 'observation',\n chunksActivated: 1,\n tokensActivated: chunkData?.messageTokens ?? activationResult.messageTokensActivated,\n observationTokens: chunkData?.observationTokens ?? activationResult.observationTokensActivated,\n messagesActivated: chunkData?.messageCount ?? activationResult.messagesActivated,\n recordId: postSwapRecord.id,\n threadId: postSwapRecord.threadId ?? record.threadId ?? '',\n generationCount: postSwapRecord.generationCount ?? 0,\n observations: chunkData?.observations ?? activationResult.observations,\n config: this.getObservationMarkerConfig(),\n });\n void opts.writer.custom(activationMarker).catch(() => {});\n await this.persistMarkerToMessage(\n activationMarker,\n opts.messageList,\n record.threadId ?? '',\n record.resourceId ?? undefined,\n );\n }\n }\n\n // Update thread metadata with continuation hints from activated chunks\n const thread = await this.storage.getThreadById({ threadId });\n if (thread) {\n // Get hints from the most recent activated chunk\n const activatedChunks = freshChunks.filter(c => activationResult.activatedCycleIds.includes(c.cycleId));\n const lastActivated = activatedChunks[activatedChunks.length - 1];\n if (lastActivated) {\n const chunkThreadTitle = lastActivated.threadTitle;\n const newMetadata = setThreadOMMetadata(thread.metadata, {\n suggestedResponse: lastActivated.suggestedContinuation,\n currentTask: lastActivated.currentTask,\n threadTitle: chunkThreadTitle,\n });\n const oldTitle = thread.title?.trim();\n const newTitle = chunkThreadTitle?.trim();\n const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;\n await this.storage.updateThread({\n id: threadId,\n title: shouldUpdateThreadTitle ? newTitle : (thread.title ?? ''),\n metadata: newMetadata,\n });\n }\n }\n\n const updatedRecord = await this.getOrCreateRecord(threadId, resourceId);\n return {\n activated: true,\n record: updatedRecord,\n activatedMessageIds: activationResult.activatedMessageIds,\n };\n }\n\n /**\n * Manually trigger observation.\n *\n * When `messages` is provided, those are used directly (filtered for unobserved)\n * instead of reading from storage. This allows external systems (e.g., opencode)\n * to pass conversation messages without duplicating them into Mastra's DB.\n *\n * Returns a result indicating whether observation and/or reflection occurred,\n * along with the updated record.\n */\n async observe(opts: {\n threadId: string;\n resourceId?: string;\n messages?: MastraDBMessage[];\n hooks?: ObserveHooks;\n requestContext?: RequestContext;\n writer?: ProcessorStreamWriter;\n observabilityContext?: ObservabilityContext;\n }): Promise<{\n observed: boolean;\n reflected: boolean;\n record: ObservationalMemoryRecord;\n }> {\n const { threadId, resourceId, messages, hooks, requestContext } = opts;\n const lockKey = this.buffering.getLockKey(threadId, resourceId);\n const reflectionHooks = hooks\n ? { onReflectionStart: hooks.onReflectionStart, onReflectionEnd: hooks.onReflectionEnd }\n : undefined;\n\n let observed = false;\n let observationUsage: ObserveHookUsage | undefined;\n let generationBefore = -1;\n\n await this.withLock(lockKey, async () => {\n const freshRecord = await this.getOrCreateRecord(threadId, resourceId);\n generationBefore = freshRecord.generationCount;\n\n const unobservedMessages = messages\n ? this.getUnobservedMessages(messages, freshRecord)\n : await this.loadMessagesFromStorage(\n threadId,\n resourceId,\n freshRecord.lastObservedAt ? new Date(freshRecord.lastObservedAt) : undefined,\n );\n\n if (\n !this.meetsObservationThreshold({\n record: freshRecord,\n unobservedTokens: await this.tokenCounter.countMessagesAsync(unobservedMessages),\n })\n ) {\n return;\n }\n\n hooks?.onObservationStart?.();\n let observationError: Error | undefined;\n try {\n const result = await ObservationStrategy.create(this, {\n record: freshRecord,\n threadId,\n resourceId,\n messages: unobservedMessages,\n reflectionHooks,\n requestContext,\n writer: opts.writer,\n observabilityContext: opts.observabilityContext,\n }).run();\n observed = result.observed;\n observationUsage = result.usage;\n } catch (error) {\n observationError = error instanceof Error ? error : new Error(String(error));\n throw error;\n } finally {\n hooks?.onObservationEnd?.({ usage: observationUsage, error: observationError });\n }\n });\n\n // Fetch the latest record after lock release\n const record = await this.getOrCreateRecord(threadId, resourceId);\n const reflected = record.generationCount > generationBefore && generationBefore >= 0;\n return { observed, reflected, record };\n }\n\n /**\n * Manually trigger reflection with optional guidance prompt.\n *\n * @example\n * ```ts\n * // Trigger reflection with specific focus\n * await om.reflect(threadId, resourceId,\n * \"focus on the authentication implementation, only keep minimal details about UI styling\"\n * );\n * ```\n */\n async reflect(\n threadId: string,\n resourceId?: string,\n prompt?: string,\n requestContext?: RequestContext,\n observabilityContext?: ObservabilityContext,\n ): Promise<{\n reflected: boolean;\n record: ObservationalMemoryRecord;\n usage?: ObserveHookUsage;\n }> {\n const record = await this.getOrCreateRecord(threadId, resourceId);\n\n if (!record.activeObservations) {\n return { reflected: false, record, usage: undefined };\n }\n\n await this.storage.setReflectingFlag(record.id, true);\n registerOp(record.id, 'reflecting');\n\n try {\n const reflectThreshold = getMaxThreshold(this.getEffectiveReflectionTokens(record));\n const reflectResult = await this.reflector.call(\n record.activeObservations,\n prompt,\n undefined,\n reflectThreshold,\n undefined,\n undefined,\n undefined,\n requestContext,\n observabilityContext,\n undefined,\n );\n const reflectionTokenCount = this.tokenCounter.countObservations(reflectResult.observations);\n\n await this.storage.createReflectionGeneration({\n currentRecord: record,\n reflection: reflectResult.observations,\n tokenCount: reflectionTokenCount,\n });\n\n // Note: Thread metadata (currentTask, suggestedResponse) is preserved on each thread\n // and doesn't need to be updated during reflection - it was set during observation\n const updatedRecord = await this.getOrCreateRecord(threadId, resourceId);\n return { reflected: true, record: updatedRecord, usage: reflectResult.usage };\n } catch (error) {\n omError('[OM] reflect() failed', error);\n const latestRecord = await this.getOrCreateRecord(threadId, resourceId);\n return { reflected: false, record: latestRecord, usage: undefined };\n } finally {\n await this.storage.setReflectingFlag(record.id, false);\n unregisterOp(record.id, 'reflecting');\n }\n }\n\n /**\n * Get current observations for a thread/resource\n */\n async getObservations(threadId: string, resourceId?: string): Promise<string | undefined> {\n const ids = this.getStorageIds(threadId, resourceId);\n const record = await this.storage.getObservationalMemory(ids.threadId, ids.resourceId);\n return record?.activeObservations;\n }\n\n /**\n * Get current record for a thread/resource\n */\n async getRecord(threadId: string, resourceId?: string): Promise<ObservationalMemoryRecord | null> {\n const ids = this.getStorageIds(threadId, resourceId);\n return this.storage.getObservationalMemory(ids.threadId, ids.resourceId);\n }\n\n /**\n * Update per-record config overrides for observation and/or reflection thresholds.\n * The provided config is deep-merged into the record's `_overrides` key,\n * so you only need to specify the fields you want to change.\n *\n * Overrides that violate buffering invariants (e.g. messageTokens below\n * bufferTokens) are silently ignored at read time — the helpers fall back\n * to the instance-level config.\n *\n * @example\n * ```ts\n * await om.updateRecordConfig('thread-1', undefined, {\n * observation: { messageTokens: 2000 },\n * reflection: { observationTokens: 8000 },\n * });\n * ```\n */\n async updateRecordConfig(\n threadId: string,\n resourceId: string | undefined,\n config: Record<string, unknown>,\n ): Promise<void> {\n const ids = this.getStorageIds(threadId, resourceId);\n const record = await this.storage.getObservationalMemory(ids.threadId, ids.resourceId);\n if (!record) {\n throw new Error(`No observational memory record found for thread ${ids.threadId}`);\n }\n // Write under _overrides so getEffectiveMessageTokens / getEffectiveReflectionTokens\n // pick up the override values, distinct from the initial config snapshot.\n await this.storage.updateObservationalMemoryConfig({\n id: record.id,\n config: { _overrides: config },\n });\n }\n\n /**\n * Get observation history (previous generations)\n */\n async getHistory(\n threadId: string,\n resourceId?: string,\n limit?: number,\n options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n const ids = this.getStorageIds(threadId, resourceId);\n return this.storage.getObservationalMemoryHistory(ids.threadId, ids.resourceId, limit, options);\n }\n\n /**\n * Clear all memory for a specific thread/resource\n */\n async clear(threadId: string, resourceId?: string): Promise<void> {\n const ids = this.getStorageIds(threadId, resourceId);\n await this.storage.clearObservationalMemory(ids.threadId, ids.resourceId);\n // Clean up static maps to prevent memory leaks\n this.buffering.cleanupStaticMaps(ids.threadId ?? ids.resourceId, ids.resourceId);\n }\n\n /**\n * Get the underlying storage adapter\n */\n getStorage(): MemoryStorage {\n return this.storage;\n }\n\n /**\n * Get the token counter\n */\n getTokenCounter(): TokenCounter {\n return this.tokenCounter;\n }\n\n /**\n * Get current observation configuration\n */\n getObservationConfig(): ResolvedObservationConfig {\n return this.observationConfig;\n }\n\n /**\n * Get current reflection configuration\n */\n getReflectionConfig(): ResolvedReflectionConfig {\n return this.reflectionConfig;\n }\n\n /**\n * Get the message history instance for marker persistence.\n */\n getMessageHistory(): MessageHistory {\n return this.messageHistory;\n }\n\n /**\n * Get whether thread IDs should be obscured in observations.\n */\n getObscureThreadIds(): boolean {\n return this.shouldObscureThreadIds;\n }\n\n /**\n * Begin a new observation turn — the high-level API for managing the\n * observe/buffer/activate/reflect lifecycle across agentic loop steps.\n *\n * @example\n * ```ts\n * const turn = om.beginTurn({ threadId, resourceId, messageList });\n * await turn.start(memory);\n *\n * const step0 = turn.step(0);\n * const ctx = await step0.prepare();\n * // ... agent generates ...\n *\n * await turn.end();\n * ```\n */\n beginTurn(opts: {\n threadId: string;\n resourceId?: string;\n messageList: MessageList;\n observabilityContext?: ObservabilityContext;\n hooks?: ObservationTurnHooks;\n }): ObservationTurn {\n return new ObservationTurn({\n om: this,\n threadId: opts.threadId,\n resourceId: opts.resourceId,\n messageList: opts.messageList,\n observabilityContext: opts.observabilityContext,\n hooks: opts.hooks,\n });\n }\n}\n","import type { MastraDBMessage, MessageList } from '@mastra/core/agent';\nimport { ModelRouterLanguageModel } from '@mastra/core/llm';\nimport { parseMemoryRequestContext } from '@mastra/core/memory';\nimport type { ObservabilityContext } from '@mastra/core/observability';\nimport type { Processor, ProcessInputStepArgs, ProcessOutputResultArgs } from '@mastra/core/processors';\nimport type { ObservationalMemoryRecord } from '@mastra/core/storage';\n\nimport { OBSERVATION_CONTINUATION_HINT } from './constants';\nimport { omDebug } from './debug';\nimport type { ObservationTurn } from './observation-turn/index';\nimport type { ObservationalMemory } from './observational-memory';\nimport { isOmReproCaptureEnabled, safeCaptureJson, writeProcessInputStepReproCapture } from './repro-capture';\nimport type { TokenCounterModelContext } from './token-counter';\n\n/** Subset of Memory that the processor needs — avoids circular imports. */\nexport interface MemoryContextProvider {\n getContext(opts: { threadId: string; resourceId?: string }): Promise<{\n systemMessage: string | undefined;\n messages: MastraDBMessage[];\n hasObservations: boolean;\n omRecord: ObservationalMemoryRecord | null;\n continuationMessage: MastraDBMessage | undefined;\n otherThreadsContext: string | undefined;\n }>;\n /** Raw message upsert — persist sealed messages to storage without embedding or working memory processing. */\n persistMessages(messages: MastraDBMessage[]): Promise<void>;\n}\n\n/**\n * Processor adapter for ObservationalMemory.\n *\n * This class owns the agent-lifecycle orchestration — it decides *when* to\n * load history, check thresholds, trigger observation/reflection, inject\n * observations into context, and save messages. The actual OM operations\n * are delegated to the Turn/Step handles which compose OM primitives.\n *\n * Processor-specific concerns (repro capture, progress emission, token\n * persistence, continuation message) stay here — they're not part of the\n * Turn/Step abstraction.\n */\nfunction getOmObservabilityContext(\n args: ProcessInputStepArgs | ProcessOutputResultArgs,\n): ObservabilityContext | undefined {\n if (!args.tracing || !args.tracingContext || !args.loggerVNext || !args.metrics) {\n return undefined;\n }\n\n return {\n tracing: args.tracing,\n tracingContext: args.tracingContext,\n loggerVNext: args.loggerVNext,\n metrics: args.metrics,\n };\n}\n\n/** Key used to store gateway detection result in per-processor state. */\nconst GATEWAY_STATE_KEY = '__isGatewayModel';\n\n/** Check if the model is routed through a Mastra gateway. */\nfunction isMastraGatewayModel(model: ProcessInputStepArgs['model']): boolean {\n return model instanceof ModelRouterLanguageModel && model.gatewayId === 'mastra';\n}\n\nexport class ObservationalMemoryProcessor implements Processor<'observational-memory'> {\n readonly id = 'observational-memory' as const;\n readonly name = 'Observational Memory';\n\n /** The underlying ObservationalMemory engine. */\n readonly engine: ObservationalMemory;\n\n /** Memory instance for loading context. */\n private readonly memory: MemoryContextProvider;\n\n /** Active turn — created on first processInputStep, ended on processOutputResult. */\n private turn?: ObservationTurn;\n\n constructor(engine: ObservationalMemory, memory: MemoryContextProvider) {\n this.engine = engine;\n this.memory = memory;\n }\n\n // ─── Processor lifecycle hooks ──────────────────────────────────────────\n\n async processInputStep(args: ProcessInputStepArgs): Promise<MessageList | MastraDBMessage[]> {\n const {\n messageList,\n requestContext,\n stepNumber,\n state: _state,\n writer,\n model,\n abortSignal,\n abort,\n rotateResponseMessageId,\n } = args;\n const state = _state ?? ({} as Record<string, unknown>);\n\n omDebug(\n `[OM:processInputStep:ENTER] step=${stepNumber}, hasMastraMemory=${!!requestContext?.get('MastraMemory')}, hasMemoryInfo=${!!messageList?.serialize()?.memoryInfo?.threadId}`,\n );\n\n const context = this.engine.getThreadContext(requestContext, messageList);\n if (!context) {\n omDebug(`[OM:processInputStep:NO-CONTEXT] getThreadContext returned null — returning early`);\n return messageList;\n }\n\n // When the agent is using a Mastra gateway model, the gateway handles OM\n // (observation, reflection, context injection) server-side. Running it\n // locally would double-process messages and cause history duplication.\n // We detect this from the model directly (not requestContext) so that\n // the flag doesn't leak to child agents in delegation scenarios.\n if (isMastraGatewayModel(model)) {\n state[GATEWAY_STATE_KEY] = true;\n omDebug(`[OM:processInputStep:GATEWAY] gateway handles OM — skipping local processing`);\n return messageList;\n }\n\n const { threadId, resourceId } = context;\n const memoryContext = parseMemoryRequestContext(requestContext);\n const readOnly = memoryContext?.memoryConfig?.readOnly;\n\n const actorModelContext = model?.modelId ? { provider: model.provider, modelId: model.modelId } : undefined;\n state.__omActorModelContext = actorModelContext;\n\n return this.engine.getTokenCounter().runWithModelContext(actorModelContext, async () => {\n // Repro capture setup\n const reproCaptureEnabled = isOmReproCaptureEnabled();\n const preRecordSnapshot = reproCaptureEnabled\n ? (safeCaptureJson(await this.engine.getOrCreateRecord(threadId, resourceId)) as ObservationalMemoryRecord)\n : null;\n const preMessagesSnapshot = reproCaptureEnabled\n ? (safeCaptureJson(messageList.get.all.db()) as MastraDBMessage[])\n : null;\n const preSerializedMessageList = reproCaptureEnabled\n ? (safeCaptureJson(messageList.serialize()) as ReturnType<MessageList['serialize']>)\n : null;\n\n // ── Read-only fast path: skip turn creation and observation lifecycle ──\n if (readOnly) {\n return messageList;\n }\n\n // ── Create turn on first step (or when state is reset) ──\n // The turn is stashed in customState so that the output processor instance\n // (which is a separate ObservationalMemoryProcessor) can retrieve it in\n // processOutputResult. In production, getInputProcessors() and\n // getOutputProcessors() each call createOMProcessor(), producing two\n // different instances that share only the processorStates map.\n if (!this.turn || !state.__omTurn) {\n // End previous turn if state was reset mid-flow\n if (this.turn && !state.__omTurn) {\n await this.turn.end().catch(() => {});\n }\n this.turn = this.engine.beginTurn({\n threadId,\n resourceId,\n messageList,\n observabilityContext: getOmObservabilityContext(args),\n hooks: {\n onBufferChunkSealed: rotateResponseMessageId,\n },\n });\n this.turn.writer = writer;\n this.turn.requestContext = requestContext;\n await this.turn.start(this.memory);\n state.__omTurn = this.turn;\n }\n\n const observabilityContext = getOmObservabilityContext(args);\n state.__omObservabilityContext = observabilityContext;\n this.turn.observabilityContext = observabilityContext;\n\n // ── Run step preparation (activation, threshold, observation, filtering) ──\n {\n const step = this.turn.step(stepNumber);\n let ctx;\n try {\n ctx = await step.prepare();\n } catch (error) {\n // Map observation errors through abort (processor-specific concern)\n const err = error instanceof Error ? error : new Error(String(error));\n const abortMessage = abortSignal?.aborted\n ? 'Agent execution was aborted'\n : `Encountered error during memory observation: ${err.message}`;\n if (typeof abort === 'function') {\n abort(abortMessage);\n }\n throw err;\n }\n\n // Inject system messages (one per cache-stable chunk) + continuation\n if (ctx.systemMessage) {\n messageList.clearSystemMessages('observational-memory');\n for (const msg of ctx.systemMessage) {\n messageList.addSystem(msg, 'observational-memory');\n }\n\n const contMsg = this.turn.context.continuation ?? {\n id: 'om-continuation',\n role: 'user' as const,\n createdAt: new Date(0),\n content: {\n format: 2 as const,\n parts: [\n { type: 'text' as const, text: `<system-reminder>${OBSERVATION_CONTINUATION_HINT}</system-reminder>` },\n ],\n },\n threadId,\n resourceId,\n };\n messageList.add(contMsg, 'memory');\n }\n\n // ── Progress emission (processor-specific) ──────────\n // Fetch a fresh record from storage so buffering flags (e.g.\n // isBufferingObservation set by fire-and-forget buffer()) are visible.\n // The cached this.turn.record is stale in production DBs where each\n // query returns a new row object.\n const freshRecord = await this.engine.getOrCreateRecord(threadId, resourceId);\n await this.engine.emitProgress({\n record: freshRecord,\n stepNumber,\n pendingTokens: ctx.status.pendingTokens,\n threshold: ctx.status.threshold,\n effectiveObservationTokensThreshold: ctx.status.effectiveObservationTokensThreshold,\n currentObservationTokens: freshRecord.observationTokenCount ?? 0,\n writer,\n threadId,\n resourceId,\n });\n\n // ── Token persistence (processor-specific) ──────────\n const allDbMsgs = messageList.get.all.db();\n const tokenCounter = this.engine.getTokenCounter();\n const contextTokens = await tokenCounter.countMessagesAsync(allDbMsgs);\n const otherThreadsContext = this.turn.context.otherThreadsContext;\n const otherThreadTokens = otherThreadsContext ? tokenCounter.countString(otherThreadsContext) : 0;\n const finalTotalPending = contextTokens + otherThreadTokens;\n\n await this.engine\n .getStorage()\n .setPendingMessageTokens(freshRecord.id, finalTotalPending)\n .catch(() => {});\n\n // ── Repro capture (processor-specific) ──────────────\n if (reproCaptureEnabled) {\n writeProcessInputStepReproCapture({\n threadId,\n resourceId,\n stepNumber,\n args,\n preRecord: preRecordSnapshot!,\n postRecord: safeCaptureJson(freshRecord) as ObservationalMemoryRecord,\n preMessages: preMessagesSnapshot!,\n preBufferedChunks: [],\n preContextTokenCount: 0,\n preSerializedMessageList: preSerializedMessageList!,\n postBufferedChunks: [],\n postContextTokenCount: finalTotalPending,\n messageList,\n details: {},\n observerExchange: ctx.observerExchange,\n });\n }\n }\n\n return messageList;\n });\n }\n\n async processOutputResult(args: ProcessOutputResultArgs): Promise<MessageList | MastraDBMessage[]> {\n const { messageList, requestContext, state: _state } = args;\n const state = _state ?? ({} as Record<string, unknown>);\n\n const context = this.engine.getThreadContext(requestContext, messageList);\n if (!context) return messageList;\n\n // Gateway handles OM — skip local output processing (see processInputStep).\n if (state[GATEWAY_STATE_KEY]) return messageList;\n\n const observabilityContext = getOmObservabilityContext(args);\n state.__omObservabilityContext = observabilityContext;\n\n return this.engine\n .getTokenCounter()\n .runWithModelContext(state.__omActorModelContext as TokenCounterModelContext | undefined, async () => {\n const memoryContext = parseMemoryRequestContext(requestContext);\n if (memoryContext?.memoryConfig?.readOnly) return messageList;\n\n // Retrieve the turn from shared processor state — in production, the input\n // and output processors are separate instances (see comment in processInputStep).\n const turn = (state.__omTurn as ObservationTurn | undefined) ?? this.turn;\n if (turn) {\n await turn.end();\n this.turn = undefined;\n state.__omTurn = undefined;\n }\n\n return messageList;\n });\n }\n\n // ─── Passthrough API ────────────────────────────────────────────────────\n\n get config() {\n return this.engine.config;\n }\n\n async waitForBuffering(\n threadId: string | null | undefined,\n resourceId: string | null | undefined,\n timeoutMs?: number,\n ) {\n return this.engine.waitForBuffering(threadId, resourceId, timeoutMs);\n }\n\n async getResolvedConfig(requestContext?: any) {\n return this.engine.getResolvedConfig(requestContext);\n }\n}\n","// Regex that captures the ISO 8601 date from each message boundary delimiter\nconst BOUNDARY_WITH_DATE_RE =\n /\\n{2,}--- message boundary \\((\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z)\\) ---\\n{2,}/;\n\n/**\n * Given a raw `activeObservations` string (from an `ObservationalMemoryRecord`),\n * return only the observation text that would have been visible at `asOf`.\n *\n * Each chunk boundary contains the `lastObservedAt` timestamp of the messages\n * that were observed to produce the chunk that follows it. A chunk is included\n * when its boundary date is ≤ `asOf` (meaning those observations existed before\n * or at the target moment). The very first chunk has no preceding boundary and\n * is always included.\n *\n * @param activeObservations - The full `activeObservations` string from the OM record\n * @param asOf - The point in time to query (e.g. a message's `createdAt`)\n * @returns The filtered observations string, or an empty string if none match\n */\nexport function getObservationsAsOf(activeObservations: string, asOf: Date): string {\n const trimmed = activeObservations.trim();\n if (!trimmed) return '';\n\n // Split while keeping the delimiter (with captured date) interleaved\n const parts = trimmed.split(BOUNDARY_WITH_DATE_RE);\n\n // parts is: [chunk0, date1, chunk1, date2, chunk2, ...]\n // chunk0 has no boundary date — always included\n const chunks: string[] = [];\n const firstChunk = parts[0]?.trim();\n if (firstChunk) {\n chunks.push(firstChunk);\n }\n\n for (let i = 1; i < parts.length; i += 2) {\n const dateStr = parts[i]!;\n const chunk = parts[i + 1]?.trim();\n if (!chunk) continue;\n\n const boundaryDate = new Date(dateStr);\n if (isNaN(boundaryDate.getTime())) continue;\n\n if (boundaryDate <= asOf) {\n chunks.push(chunk);\n }\n }\n\n return chunks.join('\\n\\n');\n}\n"]}