/** * ContextRepository — epoch-only LLM context load/save (ADR 0009 D4 / Grill #15). */ import type { AgentMessage } from '../llm/types/agent-message.js'; import type { Context } from '../llm/types/context.js'; import type { AgentMessageRow, AgentSummaryRecord } from './agent-db-models.js'; import type { AgentMessageExtra } from './sender-extra.js'; import { AgentSessionStore, MemoryAgentSessionStore } from './agent-session-store.js'; import { type SessionBranchPoint } from './session-tree.js'; export interface ContextRepositoryConfig { /** Max messages loaded per session epoch (tail). */ tailMessageLimit?: number; } export interface SaveSummaryOptions { anchorMessageId?: number; branchAnchorMessageId?: number; } export interface AppendMessagesOptions { /** 与 `messages` 同下标;显式 extra 优先于从正文解析(本轮 user 消息) */ messageExtras?: (AgentMessageExtra | undefined)[]; } export interface ContextRepository { loadContext(sessionId: string): Promise; loadMessageRows(sessionId: string): Promise; appendMessages(sessionId: string, messages: AgentMessage[], options?: AppendMessagesOptions): Promise; archiveSession(sessionKey: string): Promise; saveSummary(sessionId: string, summary: string, anchorOrOptions?: number | SaveSummaryOptions): Promise; hasBranchSummary(sessionId: string, branchAnchorMessageId: number): Promise; /** Last row id of messages that would be summarized (for compaction anchor). */ resolveCompactionAnchorId(sessionId: string, keepRecentTokens: number, minKeepCount?: number): Promise; listBranchPoints(sessionId: string): Promise; setActiveLeaf(sessionId: string, messageId: number): Promise; jumpToBranchIndex(sessionId: string, index: number): Promise<{ ok: boolean; message: string; }>; } type SqlInsertResult = { lastID?: number; changes?: number; }; type MessageDbModel = { select(...fields: string[]): { where(condition: Record): MessageWhereResult; }; create(data: Record): Promise; insert?(data: Record): Promise; }; type SummaryDbModel = { select(...fields: string[]): { where(condition: Record): SummaryWhereResult; }; create(data: Record): Promise; }; type MessageWhereResult = PromiseLike | { orderBy(field: string, dir: 'ASC' | 'DESC'): { limit(n: number): PromiseLike; }; }; type SummaryWhereResult = PromiseLike | { orderBy(field: string, dir: 'ASC' | 'DESC'): { limit(n: number): PromiseLike; }; }; export declare class DatabaseContextRepository implements ContextRepository { private readonly messageModel; private readonly summaryModel; private readonly sessionStore; private readonly writeLock; private readonly config; constructor(messageModel: MessageDbModel, summaryModel: SummaryDbModel, sessionStore: AgentSessionStore, config?: ContextRepositoryConfig); loadMessageRows(sessionId: string): Promise; loadContext(sessionId: string): Promise; appendMessages(sessionId: string, newMessages: AgentMessage[], options?: AppendMessagesOptions): Promise; archiveSession(sessionKey: string): Promise; saveSummary(sessionId: string, summary: string, anchorOrOptions?: number | SaveSummaryOptions): Promise; hasBranchSummary(sessionId: string, branchAnchorMessageId: number): Promise; listBranchPoints(sessionId: string): Promise; setActiveLeaf(sessionId: string, messageId: number): Promise; jumpToBranchIndex(sessionId: string, index: number): Promise<{ ok: boolean; message: string; }>; resolveCompactionAnchorId(sessionId: string, keepRecentTokens: number, minKeepCount?: number): Promise; private loadAllSummaryRows; private loadLatestEpochSummary; private loadBranchSummariesForPath; private loadAllMessageRows; } export declare class MemoryContextRepository implements ContextRepository { private readonly messages; private readonly summaries; private readonly sessionStore; private readonly writeLock; private readonly config; constructor(sessionStore: MemoryAgentSessionStore, config?: ContextRepositoryConfig); loadMessageRows(sessionId: string): Promise; loadContext(sessionId: string): Promise; appendMessages(sessionId: string, newMessages: AgentMessage[], options?: AppendMessagesOptions): Promise; archiveSession(sessionKey: string): Promise; saveSummary(sessionId: string, summary: string, anchorOrOptions?: number | SaveSummaryOptions): Promise; hasBranchSummary(sessionId: string, branchAnchorMessageId: number): Promise; listBranchPoints(sessionId: string): Promise; setActiveLeaf(sessionId: string, messageId: number): Promise; jumpToBranchIndex(sessionId: string, index: number): Promise<{ ok: boolean; message: string; }>; resolveCompactionAnchorId(sessionId: string, keepRecentTokens: number, minKeepCount?: number): Promise; } export declare function createMemoryContextRepository(config?: ContextRepositoryConfig): { repository: MemoryContextRepository; sessionStore: MemoryAgentSessionStore; }; export {}; //# sourceMappingURL=context-repository.d.ts.map