





















@@ -8,6 +8,11 @@ import { redactIdentifier } from "../logging/redact-identifier.js";
88import type { AuthProfileFailureReason } from "./auth-profiles.js";
99import { buildAttemptReplayMetadata } from "./pi-embedded-runner/run/incomplete-turn.js";
1010import type { EmbeddedRunAttemptResult } from "./pi-embedded-runner/run/types.js";
11+import {
12+installEmbeddedRunnerBackoffE2eMocks,
13+installEmbeddedRunnerBaseE2eMocks,
14+installEmbeddedRunnerFastRunE2eMocks,
15+} from "./test-helpers/pi-embedded-runner-e2e-mocks.js";
11161217const runEmbeddedAttemptMock = vi.fn<(params: unknown) => Promise<EmbeddedRunAttemptResult>>();
1318const resolveCopilotApiTokenMock = vi.fn();
@@ -22,96 +27,21 @@ const { computeBackoffMock, sleepWithAbortMock } = vi.hoisted(() => ({
2227}));
23282429const installRunEmbeddedMocks = () => {
25-vi.doMock("../plugins/hook-runner-global.js", () => ({
26-getGlobalHookRunner: vi.fn(() => undefined),
27-}));
28-vi.doMock("../context-engine/init.js", () => ({
29-ensureContextEnginesInitialized: vi.fn(),
30-}));
31-vi.doMock("../context-engine/registry.js", () => ({
32-resolveContextEngine: vi.fn(async () => ({
33-dispose: async () => undefined,
34-})),
35-}));
36-vi.doMock("./runtime-plugins.js", () => ({
37-ensureRuntimePluginsLoaded: vi.fn(),
38-}));
39-vi.doMock("./harness/selection.js", () => ({
40-selectAgentHarness: vi.fn((params: { provider?: string }) => ({
41-id: params.provider === "codex-cli" ? "codex" : "pi",
42-label: "Mock agent harness",
43-supports: vi.fn(() => ({ supported: false })),
44-runAttempt: vi.fn(),
45-})),
46-runAgentHarnessAttemptWithFallback: (params: unknown) => runEmbeddedAttemptMock(params),
47-}));
48-vi.doMock("./runtime-plan/build.js", () => ({
49-buildAgentRuntimePlan: vi.fn(
50-(params: {
51-provider: string;
52-modelId: string;
53-modelApi?: string | null;
54-harnessId?: string;
55-sessionAuthProfileId?: string;
56-}) => ({
57-resolvedRef: {
58-provider: params.provider,
59-modelId: params.modelId,
60- ...(params.modelApi ? { modelApi: params.modelApi } : {}),
61- ...(params.harnessId ? { harnessId: params.harnessId } : {}),
62-},
63-auth: {
64-providerForAuth: params.provider,
65-authProfileProviderForAuth: params.sessionAuthProfileId?.split(":", 1)[0] ?? "",
66-forwardedAuthProfileId: params.sessionAuthProfileId,
67-},
68-prompt: {
69-provider: params.provider,
70-modelId: params.modelId,
71-resolveSystemPromptContribution: vi.fn(() => undefined),
72-},
73-tools: {
74-normalize: vi.fn((tools: unknown[]) => tools),
75-logDiagnostics: vi.fn(),
76-},
77-transcript: {
78-policy: {
79-sanitizeMode: "full",
80-sanitizeToolCallIds: true,
81-preserveNativeAnthropicToolUseIds: false,
82-repairToolUseResultPairing: true,
83-preserveSignatures: false,
84-sanitizeThinkingSignatures: true,
85-dropThinkingBlocks: false,
86-applyGoogleTurnOrdering: false,
87-validateGeminiTurns: false,
88-validateAnthropicTurns: false,
89-allowSyntheticToolResults: true,
90-},
91-resolvePolicy: vi.fn(() => undefined),
92-},
93-delivery: {
94-isSilentPayload: vi.fn(() => false),
95-resolveFollowupRoute: vi.fn(() => undefined),
96-},
97-outcome: {
98-classifyRunResult: vi.fn(() => undefined),
99-},
100-transport: {
101-extraParams: {},
102-resolveExtraParams: vi.fn(() => ({})),
103-},
104-observability: {
105-resolvedRef: `${params.provider}/${params.modelId}`,
106-provider: params.provider,
107-modelId: params.modelId,
108- ...(params.modelApi ? { modelApi: params.modelApi } : {}),
109- ...(params.harnessId ? { harnessId: params.harnessId } : {}),
110- ...(params.sessionAuthProfileId ? { authProfileId: params.sessionAuthProfileId } : {}),
111-},
112-}),
113-),
114-}));
30+installEmbeddedRunnerBaseE2eMocks();
31+installEmbeddedRunnerFastRunE2eMocks({
32+runEmbeddedAttempt: (params) => runEmbeddedAttemptMock(params),
33+prepareProviderRuntimeAuth: async (params) => {
34+if (params.provider !== "github-copilot") {
35+return undefined;
36+}
37+const token = await resolveCopilotApiTokenMock(params.context.apiKey);
38+return {
39+apiKey: token.token,
40+baseUrl: token.baseUrl,
41+expiresAt: token.expiresAt,
42+};
43+},
44+});
11545vi.doMock("./pi-embedded-runner/model.js", () => ({
11646resolveModelAsync: async (provider: string, modelId: string) => ({
11747model: {
@@ -134,38 +64,10 @@ const installRunEmbeddedMocks = () => {
13464modelRegistry: {},
13565}),
13666}));
137-vi.doMock("./pi-embedded-runner/run/attempt.js", () => ({
138-runEmbeddedAttempt: (params: unknown) => runEmbeddedAttemptMock(params),
139-}));
140-vi.doMock("../plugins/provider-runtime.js", () => ({
141-buildProviderMissingAuthMessageWithPlugin: vi.fn(() => undefined),
142-prepareProviderRuntimeAuth: async (params: {
143-provider: string;
144-context: { apiKey: string };
145-}) => {
146-if (params.provider !== "github-copilot") {
147-return undefined;
148-}
149-const token = await resolveCopilotApiTokenMock(params.context.apiKey);
150-return {
151-apiKey: token.token,
152-baseUrl: token.baseUrl,
153-expiresAt: token.expiresAt,
154-};
155-},
156-resolveProviderAuthProfileId: vi.fn(() => undefined),
157-resolveProviderCapabilitiesWithPlugin: vi.fn(() => undefined),
158-resolveExternalAuthProfilesWithPlugins: vi.fn(() => []),
159-resolveProviderSyntheticAuthWithPlugin: vi.fn(() => undefined),
160-shouldDeferProviderSyntheticProfileAuthWithPlugin: vi.fn(() => false),
161-}));
162-vi.doMock("../infra/backoff.js", () => ({
163-computeBackoff: (
164-policy: { initialMs: number; maxMs: number; factor: number; jitter: number },
165-attempt: number,
166-) => computeBackoffMock(policy, attempt),
167-sleepWithAbort: (ms: number, abortSignal?: AbortSignal) => sleepWithAbortMock(ms, abortSignal),
168-}));
67+installEmbeddedRunnerBackoffE2eMocks({
68+computeBackoff: (policy, attempt) => computeBackoffMock(policy, attempt),
69+sleepWithAbort: (ms, abortSignal) => sleepWithAbortMock(ms, abortSignal),
70+});
16971vi.doMock("./pi-embedded-runner/compact.js", () => ({
17072compactEmbeddedPiSessionDirect: vi.fn(async () => {
17173throw new Error("compact should not run in auth profile rotation tests");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。