mirror of https://github.com/openclaw/openclaw.git
169 lines
5.0 KiB
TypeScript
169 lines
5.0 KiB
TypeScript
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
|
|
// Result types
|
|
|
|
export type AssembleResult = {
|
|
/** Ordered messages to use as model context */
|
|
messages: AgentMessage[];
|
|
/** Estimated total tokens in assembled context */
|
|
estimatedTokens: number;
|
|
/** Optional context-engine-provided instructions prepended to the runtime system prompt */
|
|
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 = {
|
|
/** Whether the message was ingested (false if duplicate or no-op) */
|
|
ingested: boolean;
|
|
};
|
|
|
|
export type IngestBatchResult = {
|
|
/** Number of messages ingested from the supplied batch */
|
|
ingestedCount: number;
|
|
};
|
|
|
|
export type BootstrapResult = {
|
|
/** Whether bootstrap ran and initialized the engine's store */
|
|
bootstrapped: boolean;
|
|
/** Number of historical messages imported (if applicable) */
|
|
importedMessages?: number;
|
|
/** Optional reason when bootstrap was skipped */
|
|
reason?: string;
|
|
};
|
|
|
|
export type ContextEngineInfo = {
|
|
id: string;
|
|
name: string;
|
|
version?: string;
|
|
/** True when the engine manages its own compaction lifecycle. */
|
|
ownsCompaction?: boolean;
|
|
};
|
|
|
|
export type SubagentSpawnPreparation = {
|
|
/** Roll back pre-spawn setup when subagent launch fails. */
|
|
rollback: () => void | Promise<void>;
|
|
};
|
|
|
|
export type SubagentEndReason = "deleted" | "completed" | "swept" | "released";
|
|
export type ContextEngineRuntimeContext = Record<string, unknown>;
|
|
|
|
/**
|
|
* ContextEngine defines the pluggable contract for context management.
|
|
*
|
|
* Required methods define a generic lifecycle; optional methods allow engines
|
|
* to provide additional capabilities (retrieval, lineage, etc.).
|
|
*/
|
|
export interface ContextEngine {
|
|
/** Engine identifier and metadata */
|
|
readonly info: ContextEngineInfo;
|
|
|
|
/**
|
|
* Initialize engine state for a session, optionally importing historical context.
|
|
*/
|
|
bootstrap?(params: { sessionId: string; sessionFile: string }): Promise<BootstrapResult>;
|
|
|
|
/**
|
|
* Ingest a single message into the engine's store.
|
|
*/
|
|
ingest(params: {
|
|
sessionId: string;
|
|
message: AgentMessage;
|
|
/** True when the message belongs to a heartbeat run. */
|
|
isHeartbeat?: boolean;
|
|
}): Promise<IngestResult>;
|
|
|
|
/**
|
|
* Ingest a completed turn batch as a single unit.
|
|
*/
|
|
ingestBatch?(params: {
|
|
sessionId: string;
|
|
messages: AgentMessage[];
|
|
/** True when the batch belongs to a heartbeat run. */
|
|
isHeartbeat?: boolean;
|
|
}): Promise<IngestBatchResult>;
|
|
|
|
/**
|
|
* Execute optional post-turn lifecycle work after a run attempt completes.
|
|
* Engines can use this to persist canonical context and trigger background
|
|
* compaction decisions.
|
|
*/
|
|
afterTurn?(params: {
|
|
sessionId: string;
|
|
sessionFile: string;
|
|
messages: AgentMessage[];
|
|
/** Number of messages that existed before the prompt was sent. */
|
|
prePromptMessageCount: number;
|
|
/** Optional auto-compaction summary emitted by the runtime. */
|
|
autoCompactionSummary?: string;
|
|
/** True when this turn belongs to a heartbeat run. */
|
|
isHeartbeat?: boolean;
|
|
/** Optional model context token budget for proactive compaction. */
|
|
tokenBudget?: number;
|
|
/** Optional runtime-owned context for engines that need caller state. */
|
|
runtimeContext?: ContextEngineRuntimeContext;
|
|
}): Promise<void>;
|
|
|
|
/**
|
|
* Assemble model context under a token budget.
|
|
* Returns an ordered set of messages ready for the model.
|
|
*/
|
|
assemble(params: {
|
|
sessionId: string;
|
|
messages: AgentMessage[];
|
|
tokenBudget?: number;
|
|
}): Promise<AssembleResult>;
|
|
|
|
/**
|
|
* Compact context to reduce token usage.
|
|
* May create summaries, prune old turns, etc.
|
|
*/
|
|
compact(params: {
|
|
sessionId: string;
|
|
sessionFile: string;
|
|
tokenBudget?: number;
|
|
/** Force compaction even below the default trigger threshold. */
|
|
force?: boolean;
|
|
/** Optional live token estimate from the caller's active context. */
|
|
currentTokenCount?: number;
|
|
/** Controls convergence target; defaults to budget. */
|
|
compactionTarget?: "budget" | "threshold";
|
|
customInstructions?: string;
|
|
/** Optional runtime-owned context for engines that need caller state. */
|
|
runtimeContext?: ContextEngineRuntimeContext;
|
|
}): Promise<CompactResult>;
|
|
|
|
/**
|
|
* Prepare context-engine-managed subagent state before the child run starts.
|
|
*
|
|
* Implementations can return a rollback handle that is invoked when spawn
|
|
* fails after preparation succeeds.
|
|
*/
|
|
prepareSubagentSpawn?(params: {
|
|
parentSessionKey: string;
|
|
childSessionKey: string;
|
|
ttlMs?: number;
|
|
}): Promise<SubagentSpawnPreparation | undefined>;
|
|
|
|
/**
|
|
* Notify the context engine that a subagent lifecycle ended.
|
|
*/
|
|
onSubagentEnded?(params: { childSessionKey: string; reason: SubagentEndReason }): Promise<void>;
|
|
|
|
/**
|
|
* Dispose of any resources held by the engine.
|
|
*/
|
|
dispose?(): Promise<void>;
|
|
}
|