





















@@ -11,14 +11,20 @@ import type { TypingSignaler } from "./typing-mode.js";
11111212const state = vi.hoisted(() => ({
1313runEmbeddedPiAgentMock: vi.fn(),
14+runCliAgentMock: vi.fn(),
1415runWithModelFallbackMock: vi.fn(),
16+isCliProviderMock: vi.fn((_: unknown) => false),
1517isInternalMessageChannelMock: vi.fn((_: unknown) => false),
1618}));
17191820vi.mock("../../agents/pi-embedded.js", () => ({
1921runEmbeddedPiAgent: (params: unknown) => state.runEmbeddedPiAgentMock(params),
2022}));
212324+vi.mock("../../agents/cli-runner.js", () => ({
25+runCliAgent: (params: unknown) => state.runCliAgentMock(params),
26+}));
27+2228vi.mock("../../agents/model-fallback.js", () => ({
2329runWithModelFallback: (params: unknown) => state.runWithModelFallbackMock(params),
2430isFallbackSummaryError: (err: unknown) =>
@@ -33,7 +39,7 @@ vi.mock("../../agents/model-selection.js", async () => {
3339);
3440return {
3541 ...actual,
36-isCliProvider: () => false,
42+isCliProvider: (provider: unknown) => state.isCliProviderMock(provider),
3743};
3844});
3945@@ -231,7 +237,10 @@ function createMockReplyOperation(): {
231237describe("runAgentTurnWithFallback", () => {
232238beforeEach(() => {
233239state.runEmbeddedPiAgentMock.mockReset();
240+state.runCliAgentMock.mockReset();
234241state.runWithModelFallbackMock.mockReset();
242+state.isCliProviderMock.mockReset();
243+state.isCliProviderMock.mockReturnValue(false);
235244state.isInternalMessageChannelMock.mockReset();
236245state.isInternalMessageChannelMock.mockReturnValue(false);
237246state.runWithModelFallbackMock.mockImplementation(async (params: FallbackRunnerParams) => ({
@@ -246,6 +255,59 @@ describe("runAgentTurnWithFallback", () => {
246255vi.clearAllMocks();
247256});
248257258+it("forwards the static extra system prompt to CLI backends", async () => {
259+state.isCliProviderMock.mockReturnValue(true);
260+state.runWithModelFallbackMock.mockImplementationOnce(async (params: FallbackRunnerParams) => ({
261+result: await params.run("codex-cli", "gpt-5.4"),
262+provider: "codex-cli",
263+model: "gpt-5.4",
264+attempts: [],
265+}));
266+state.runCliAgentMock.mockResolvedValueOnce({
267+payloads: [{ text: "final" }],
268+meta: {},
269+});
270+271+const runAgentTurnWithFallback = await getRunAgentTurnWithFallback();
272+const followupRun = createFollowupRun();
273+followupRun.run.provider = "codex-cli";
274+followupRun.run.model = "gpt-5.4";
275+followupRun.run.extraSystemPrompt = "dynamic inbound metadata\n\nstable group prompt";
276+followupRun.run.extraSystemPromptStatic = "stable group prompt";
277+278+const result = await runAgentTurnWithFallback({
279+commandBody: "hello",
280+ followupRun,
281+sessionCtx: {
282+Provider: "whatsapp",
283+MessageSid: "msg",
284+} as unknown as TemplateContext,
285+opts: {},
286+typingSignals: createMockTypingSignaler(),
287+blockReplyPipeline: null,
288+blockStreamingEnabled: false,
289+resolvedBlockStreamingBreak: "message_end",
290+applyReplyToMode: (payload) => payload,
291+shouldEmitToolResult: () => true,
292+shouldEmitToolOutput: () => false,
293+pendingToolTasks: new Set(),
294+resetSessionAfterCompactionFailure: async () => false,
295+resetSessionAfterRoleOrderingConflict: async () => false,
296+isHeartbeat: false,
297+sessionKey: "main",
298+getActiveSessionEntry: () => undefined,
299+resolvedVerboseLevel: "off",
300+});
301+302+expect(result.kind).toBe("success");
303+expect(state.runCliAgentMock).toHaveBeenCalledWith(
304+expect.objectContaining({
305+extraSystemPrompt: "dynamic inbound metadata\n\nstable group prompt",
306+extraSystemPromptStatic: "stable group prompt",
307+}),
308+);
309+});
310+249311it("forwards media-only tool results without typing text", async () => {
250312const onToolResult = vi.fn();
251313state.runEmbeddedPiAgentMock.mockImplementationOnce(async (params: EmbeddedAgentParams) => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。