/** * Observational Memory (OM) integration for channel rendering. * * Owns: * - The `data-om-*` chunk type definitions * - A type-guard for narrowing arbitrary agent chunks to OM chunks * - A renderer that converts an OM chunk into a chat-SDK `task_update` * stream chunk (with title + details + compression-ratio math) * * Drivers should never reach into `om.data.tokensBuffered` etc. directly — * just call {@link renderOmTaskUpdate} and push the result into a streaming * session. */ import type { StreamChunk } from 'chat'; import type { AgentChunkType } from '../stream/types.js'; export type OmOperationType = 'observation' | 'reflection'; /** * Start marker inserted when async buffering begins. * Buffering runs in the background to pre-compute observations before the main threshold. */ export interface DataOmBufferingStartPart { type: 'data-om-buffering-start'; data: { /** Unique ID for this buffering cycle - shared between start/end/failed markers */ cycleId: string; /** Type of operation being buffered: 'observation' or 'reflection' */ operationType: OmOperationType; /** When buffering started */ startedAt: string; /** Tokens being buffered in this cycle */ tokensToBuffer: number; /** The OM record ID this buffering belongs to */ recordId: string; /** This thread's ID */ threadId: string; /** All thread IDs being buffered (for resource-scoped) */ threadIds: string[]; /** Snapshot of config at buffering time */ config?: unknown; }; } /** * End marker inserted when async buffering completes successfully. * The buffered content is stored but not yet activated (visible to the main context). */ export interface DataOmBufferingEndPart { type: 'data-om-buffering-end'; data: { /** Unique ID for this buffering cycle - shared between start/end/failed markers */ cycleId: string; /** Type of operation that was buffered: 'observation' or 'reflection' */ operationType: OmOperationType; /** When buffering completed */ completedAt: string; /** Duration in milliseconds */ durationMs: number; /** Total tokens that were buffered */ tokensBuffered: number; /** Resulting observation/reflection tokens after compression */ bufferedTokens: number; /** The OM record ID */ recordId: string; /** This thread's ID */ threadId: string; /** The buffered observations/reflection content (for UI expansion) */ observations?: string; }; } /** * Failed marker inserted when async buffering fails. * The system will fall back to synchronous processing at threshold. */ export interface DataOmBufferingFailedPart { type: 'data-om-buffering-failed'; data: { /** Unique ID for this buffering cycle - shared between start/end/failed markers */ cycleId: string; /** Type of operation that failed: 'observation' or 'reflection' */ operationType: OmOperationType; /** When buffering failed */ failedAt: string; /** Duration until failure in milliseconds */ durationMs: number; /** Tokens that were attempted to buffer */ tokensAttempted: number; /** Error message */ error: string; /** The OM record ID */ recordId: string; /** This thread's ID */ threadId: string; /** The buffered observations/reflection content (for UI expansion) */ observations?: string; }; } /** * Union of all buffering marker types. */ export type DataOmBufferingPart = DataOmBufferingStartPart | DataOmBufferingEndPart | DataOmBufferingFailedPart; /** * Marker inserted when buffered observations are activated (moved to active context). * This is an instant operation that happens when the main threshold is reached. */ export interface DataOmActivationPart { type: 'data-om-activation'; data: { /** Unique ID for this activation event */ cycleId: string; /** Type of operation: 'observation' or 'reflection' */ operationType: OmOperationType; /** When activation occurred */ activatedAt: string; /** Number of buffered chunks that were activated */ chunksActivated: number; /** Total tokens from messages that were activated */ tokensActivated: number; /** Resulting observation tokens after activation */ observationTokens: number; /** Number of messages that were observed via activation */ messagesActivated: number; /** The OM record ID */ recordId: string; /** This thread's ID */ threadId: string; /** Current reflection generation count */ generationCount: number; /** Snapshot of config at activation time */ config?: unknown; /** The actual observations from activated chunks (for UI display) */ observations?: string; /** Whether activation was triggered by threshold crossing, activateAfterIdle expiry, or a model/provider change */ triggeredBy?: 'threshold' | 'ttl' | 'provider_change'; /** Unix-ms timestamp of the last assistant message part used for TTL checks */ lastActivityAt?: number; /** How long activateAfterIdle had been exceeded when activation fired */ ttlExpiredMs?: number; /** Previous assistant model identifier that triggered activation, e.g. openai/gpt-4o */ previousModel?: string; /** Current actor model identifier that triggered activation, e.g. anthropic/claude-3-7-sonnet */ currentModel?: string; }; } /** * Union of all OM data parts the channels code knows how to render. The * `data-om-status` part (window usage snapshot for polling UIs) lives in * `@mastra/memory` and is intentionally absent — channels don't render it. */ export type OmChunk = DataOmBufferingStartPart | DataOmBufferingEndPart | DataOmBufferingFailedPart | DataOmActivationPart; /** * Type-guard: returns `chunk` narrowed to {@link OmChunk} when its `type` * matches one of the renderable `data-om-*` variants, otherwise `null`. */ export declare function asOmChunk(chunk: AgentChunkType): OmChunk | null; /** * Token formatter: `8200 → "8.2k"`, `12000 → "12k"`. Matches * `mastracode/src/tui/components/om-marker.ts` so OM lines render the same * way across surfaces. */ export declare function formatTokens(tokens: number): string; /** * Render an OM chunk as a chat-SDK `task_update` chunk. Stable task IDs * (`om-buffer:` / `om-activation:`) ensure start/end of * the same cycle replace each other in the plan widget instead of stacking. */ export declare function renderOmTaskUpdate(om: OmChunk): StreamChunk; //# sourceMappingURL=om.d.ts.map