| import type { AgentMessage } from "@mariozechner/pi-agent-core"; |
| import { registerContextEngine } from "./registry.js"; |
| import type { |
| ContextEngine, |
| ContextEngineInfo, |
| AssembleResult, |
| CompactResult, |
| ContextEngineRuntimeContext, |
| IngestResult, |
| } from "./types.js"; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export class LegacyContextEngine implements ContextEngine { |
| readonly info: ContextEngineInfo = { |
| id: "legacy", |
| name: "Legacy Context Engine", |
| version: "1.0.0", |
| }; |
|
|
| async ingest(_params: { |
| sessionId: string; |
| sessionKey?: string; |
| message: AgentMessage; |
| isHeartbeat?: boolean; |
| }): Promise<IngestResult> { |
| |
| return { ingested: false }; |
| } |
|
|
| async assemble(params: { |
| sessionId: string; |
| sessionKey?: string; |
| messages: AgentMessage[]; |
| tokenBudget?: number; |
| }): Promise<AssembleResult> { |
| |
| |
| |
| return { |
| messages: params.messages, |
| estimatedTokens: 0, |
| }; |
| } |
|
|
| async afterTurn(_params: { |
| sessionId: string; |
| sessionKey?: string; |
| sessionFile: string; |
| messages: AgentMessage[]; |
| prePromptMessageCount: number; |
| autoCompactionSummary?: string; |
| isHeartbeat?: boolean; |
| tokenBudget?: number; |
| runtimeContext?: ContextEngineRuntimeContext; |
| }): Promise<void> { |
| |
| } |
|
|
| async compact(params: { |
| sessionId: string; |
| sessionKey?: string; |
| sessionFile: string; |
| tokenBudget?: number; |
| force?: boolean; |
| currentTokenCount?: number; |
| compactionTarget?: "budget" | "threshold"; |
| customInstructions?: string; |
| runtimeContext?: ContextEngineRuntimeContext; |
| }): Promise<CompactResult> { |
| |
| const { compactEmbeddedPiSessionDirect } = |
| await import("../agents/pi-embedded-runner/compact.runtime.js"); |
|
|
| |
| |
| |
| const runtimeContext = params.runtimeContext ?? {}; |
| const currentTokenCount = |
| params.currentTokenCount ?? |
| (typeof runtimeContext.currentTokenCount === "number" && |
| Number.isFinite(runtimeContext.currentTokenCount) && |
| runtimeContext.currentTokenCount > 0 |
| ? Math.floor(runtimeContext.currentTokenCount) |
| : undefined); |
|
|
| |
| const result = await compactEmbeddedPiSessionDirect({ |
| ...runtimeContext, |
| sessionId: params.sessionId, |
| sessionFile: params.sessionFile, |
| tokenBudget: params.tokenBudget, |
| ...(currentTokenCount !== undefined ? { currentTokenCount } : {}), |
| force: params.force, |
| customInstructions: params.customInstructions, |
| workspaceDir: (runtimeContext.workspaceDir as string) ?? process.cwd(), |
| } as Parameters<typeof compactEmbeddedPiSessionDirect>[0]); |
|
|
| return { |
| ok: result.ok, |
| compacted: result.compacted, |
| reason: result.reason, |
| result: result.result |
| ? { |
| summary: result.result.summary, |
| firstKeptEntryId: result.result.firstKeptEntryId, |
| tokensBefore: result.result.tokensBefore, |
| tokensAfter: result.result.tokensAfter, |
| details: result.result.details, |
| } |
| : undefined, |
| }; |
| } |
|
|
| async dispose(): Promise<void> { |
| |
| } |
| } |
|
|
| export function registerLegacyContextEngine(): void { |
| registerContextEngine("legacy", () => new LegacyContextEngine()); |
| } |
|
|