refactor(agent): dedupe harness and command workflows

This commit is contained in:
Peter Steinberger
2026-02-16 14:52:09 +00:00
parent 04892ee230
commit f717a13039
204 changed files with 7366 additions and 11540 deletions

View File

@@ -1,8 +1,18 @@
import type { AgentMessage } from "@mariozechner/pi-agent-core";
import type { SessionManager } from "@mariozechner/pi-coding-agent";
import { vi } from "vitest";
import { expect, vi } from "vitest";
import * as helpers from "./pi-embedded-helpers.js";
export type SessionEntry = { type: string; customType: string; data: unknown };
export type SanitizeSessionHistoryFn = (params: {
messages: AgentMessage[];
modelApi: string;
provider: string;
sessionManager: SessionManager;
sessionId: string;
modelId?: string;
}) => Promise<AgentMessage[]>;
export const TEST_SESSION_ID = "test-session";
export function makeModelSnapshotEntry(data: {
timestamp?: number;
@@ -31,6 +41,25 @@ export function makeInMemorySessionManager(entries: SessionEntry[]): SessionMana
} as unknown as SessionManager;
}
export function makeMockSessionManager(): SessionManager {
return {
getEntries: vi.fn().mockReturnValue([]),
appendCustomEntry: vi.fn(),
} as unknown as SessionManager;
}
export function makeSimpleUserMessages(): AgentMessage[] {
const messages = [{ role: "user", content: "hello" }];
return messages as unknown as AgentMessage[];
}
export async function loadSanitizeSessionHistoryWithCleanMocks(): Promise<SanitizeSessionHistoryFn> {
vi.resetAllMocks();
vi.mocked(helpers.sanitizeSessionMessagesImages).mockImplementation(async (msgs) => msgs);
const mod = await import("./pi-embedded-runner/google.js");
return mod.sanitizeSessionHistory;
}
export function makeReasoningAssistantMessages(opts?: {
thinkingSignature?: "object" | "json";
}): AgentMessage[] {
@@ -56,3 +85,69 @@ export function makeReasoningAssistantMessages(opts?: {
return messages as unknown as AgentMessage[];
}
export async function sanitizeWithOpenAIResponses(params: {
sanitizeSessionHistory: SanitizeSessionHistoryFn;
messages: AgentMessage[];
sessionManager: SessionManager;
modelId?: string;
}) {
return await params.sanitizeSessionHistory({
messages: params.messages,
modelApi: "openai-responses",
provider: "openai",
sessionManager: params.sessionManager,
modelId: params.modelId,
sessionId: TEST_SESSION_ID,
});
}
export function expectOpenAIResponsesStrictSanitizeCall(
sanitizeSessionMessagesImagesMock: unknown,
messages: AgentMessage[],
) {
expect(sanitizeSessionMessagesImagesMock).toHaveBeenCalledWith(
messages,
"session:history",
expect.objectContaining({
sanitizeMode: "images-only",
sanitizeToolCallIds: true,
toolCallIdMode: "strict",
}),
);
}
export async function expectGoogleModelApiFullSanitizeCall(params: {
sanitizeSessionHistory: SanitizeSessionHistoryFn;
messages: AgentMessage[];
sessionManager: SessionManager;
}) {
vi.mocked(helpers.isGoogleModelApi).mockReturnValue(true);
await params.sanitizeSessionHistory({
messages: params.messages,
modelApi: "google-generative-ai",
provider: "google-vertex",
sessionManager: params.sessionManager,
sessionId: TEST_SESSION_ID,
});
expect(helpers.sanitizeSessionMessagesImages).toHaveBeenCalledWith(
params.messages,
"session:history",
expect.objectContaining({ sanitizeMode: "full", sanitizeToolCallIds: true }),
);
}
export function makeSnapshotChangedOpenAIReasoningScenario() {
const sessionEntries = [
makeModelSnapshotEntry({
provider: "anthropic",
modelApi: "anthropic-messages",
modelId: "claude-3-7",
}),
];
return {
sessionManager: makeInMemorySessionManager(sessionEntries),
messages: makeReasoningAssistantMessages({ thinkingSignature: "object" }),
modelId: "gpt-5.2-codex",
};
}