export type AgentMessageRole = "user" | "assistant" | "tool" | "system" | string; export type AgentMessage = { role: AgentMessageRole; content: unknown; timestamp?: number; [key: string]: unknown; }; export type AssembleResult = { messages: AgentMessage[]; estimatedTokens: number; systemPromptAddition?: string; }; export type CompactResult = { ok: boolean; compacted: boolean; reason?: string; result?: { summary?: string; firstKeptEntryId?: string; tokensBefore: number; tokensAfter?: number; details?: unknown; }; }; export type IngestResult = { ingested: boolean; }; export type IngestBatchResult = { ingestedCount: number; }; export type BootstrapResult = { bootstrapped: boolean; importedMessages?: number; reason?: string; }; export type ContextEngineInfo = { id: string; name: string; version?: string; ownsCompaction?: boolean; }; export type SubagentSpawnPreparation = { rollback: () => void | Promise; }; export type SubagentEndReason = "deleted" | "completed" | "swept" | "released"; export interface ContextEngine { readonly info: ContextEngineInfo; bootstrap?(params: { sessionId: string; sessionFile: string }): Promise; ingest(params: { sessionId: string; message: AgentMessage; isHeartbeat?: boolean; }): Promise; ingestBatch?(params: { sessionId: string; messages: AgentMessage[]; isHeartbeat?: boolean; }): Promise; afterTurn?(params: { sessionId: string; sessionFile: string; messages: AgentMessage[]; prePromptMessageCount: number; autoCompactionSummary?: string; isHeartbeat?: boolean; tokenBudget?: number; legacyCompactionParams?: Record; }): Promise; assemble(params: { sessionId: string; messages: AgentMessage[]; tokenBudget?: number; }): Promise; compact(params: { sessionId: string; sessionFile: string; tokenBudget?: number; force?: boolean; currentTokenCount?: number; compactionTarget?: "budget" | "threshold"; customInstructions?: string; legacyParams?: Record; }): Promise; prepareSubagentSpawn?(params: { parentSessionKey: string; childSessionKey: string; ttlMs?: number; }): Promise; onSubagentEnded?(params: { childSessionKey: string; reason: SubagentEndReason; }): Promise; dispose?(): Promise; } export type ContextEngineFactory = () => ContextEngine | Promise; export type PluginLogger = { debug?: (...args: unknown[]) => void; info?: (...args: unknown[]) => void; warn?: (...args: unknown[]) => void; error?: (...args: unknown[]) => void; }; export type OpenClawPluginApi = { pluginConfig?: Record; logger?: PluginLogger; registerContextEngine: (id: string, factory: ContextEngineFactory) => void; };