


























@@ -1888,9 +1888,9 @@ describe("runAgentTurnWithFallback", () => {
18881888payloads: [{ text: "ambient" }],
18891889meta: {
18901890agentMeta: {
1891-sessionId: "transient-cli-session",
1891+sessionId: "existing-cli-session",
18921892cliSessionBinding: {
1893-sessionId: "transient-cli-session",
1893+sessionId: "existing-cli-session",
18941894authProfileId: "profile",
18951895},
18961896},
@@ -1902,15 +1902,17 @@ describe("runAgentTurnWithFallback", () => {
19021902followupRun.currentInboundEventKind = "room_event";
19031903followupRun.run.provider = "codex-cli";
19041904followupRun.run.model = "gpt-5.4";
1905+const sessionEntry = {
1906+cliSessionBindings: {
1907+"codex-cli": { sessionId: "existing-cli-session" },
1908+},
1909+} as unknown as SessionEntry;
1910+const activeSessionStore = { main: sessionEntry };
1905191119061912const result = await runAgentTurnWithFallback({
19071913 ...createMinimalRunAgentTurnParams({ followupRun }),
1908-getActiveSessionEntry: () =>
1909-({
1910-cliSessionBindings: {
1911-"codex-cli": { sessionId: "existing-cli-session" },
1912-},
1913-}) as unknown as SessionEntry,
1914+ activeSessionStore,
1915+getActiveSessionEntry: () => sessionEntry,
19141916});
1915191719161918expect(result.kind).toBe("success");
@@ -1924,13 +1926,116 @@ describe("runAgentTurnWithFallback", () => {
19241926if (result.kind !== "success") {
19251927throw new Error("expected success");
19261928}
1927-expect(result.runResult.meta?.agentMeta?.sessionId).toBe("transient-cli-session");
1929+expect(result.runResult.meta?.agentMeta?.sessionId).toBe("existing-cli-session");
19281930expect(result.runResult.meta?.agentMeta?.cliSessionBinding).toEqual({
1929-sessionId: "transient-cli-session",
1931+sessionId: "existing-cli-session",
19301932authProfileId: "profile",
19311933});
19321934});
193319351936+it("keeps new room-event CLI sessions transient when reuse fails", async () => {
1937+state.isCliProviderMock.mockReturnValue(true);
1938+state.runWithModelFallbackMock.mockImplementationOnce(async (params: FallbackRunnerParams) => ({
1939+result: await params.run("codex-cli", "gpt-5.4"),
1940+provider: "codex-cli",
1941+model: "gpt-5.4",
1942+attempts: [],
1943+}));
1944+state.runCliAgentMock.mockResolvedValueOnce({
1945+payloads: [{ text: "ambient" }],
1946+meta: {
1947+agentMeta: {
1948+sessionId: "transient-cli-session",
1949+cliSessionBinding: {
1950+sessionId: "transient-cli-session",
1951+authProfileId: "profile",
1952+},
1953+},
1954+},
1955+});
1956+1957+const runAgentTurnWithFallback = await getRunAgentTurnWithFallback();
1958+const followupRun = createFollowupRun();
1959+followupRun.currentInboundEventKind = "room_event";
1960+followupRun.run.provider = "codex-cli";
1961+followupRun.run.model = "gpt-5.4";
1962+const sessionEntry = {
1963+cliSessionBindings: {
1964+"codex-cli": { sessionId: "existing-cli-session" },
1965+},
1966+} as unknown as SessionEntry;
1967+const activeSessionStore = { main: sessionEntry };
1968+1969+const result = await runAgentTurnWithFallback({
1970+ ...createMinimalRunAgentTurnParams({ followupRun }),
1971+ activeSessionStore,
1972+getActiveSessionEntry: () => sessionEntry,
1973+});
1974+1975+expect(result.kind).toBe("success");
1976+expectMockCallArgFields(state.runCliAgentMock, 0, "CLI run params", {
1977+currentInboundEventKind: "room_event",
1978+cliSessionId: "existing-cli-session",
1979+cliSessionBinding: {
1980+sessionId: "existing-cli-session",
1981+},
1982+});
1983+if (result.kind !== "success") {
1984+throw new Error("expected success");
1985+}
1986+expect(result.runResult.meta?.agentMeta?.sessionId).toBe("");
1987+expect(result.runResult.meta?.agentMeta?.cliSessionBinding).toBeUndefined();
1988+expect(activeSessionStore.main.cliSessionBindings?.["codex-cli"]).toBeUndefined();
1989+});
1990+1991+it("keeps room-event CLI bindings when synthetic hooks return no CLI binding", async () => {
1992+state.isCliProviderMock.mockReturnValue(true);
1993+state.runWithModelFallbackMock.mockImplementationOnce(async (params: FallbackRunnerParams) => ({
1994+result: await params.run("codex-cli", "gpt-5.4"),
1995+provider: "codex-cli",
1996+model: "gpt-5.4",
1997+attempts: [],
1998+}));
1999+state.runCliAgentMock.mockResolvedValueOnce({
2000+payloads: [{ text: "handled" }],
2001+meta: {
2002+agentMeta: {
2003+sessionId: "openclaw-session",
2004+provider: "codex-cli",
2005+model: "gpt-5.4",
2006+},
2007+},
2008+});
2009+2010+const runAgentTurnWithFallback = await getRunAgentTurnWithFallback();
2011+const followupRun = createFollowupRun();
2012+followupRun.currentInboundEventKind = "room_event";
2013+followupRun.run.provider = "codex-cli";
2014+followupRun.run.model = "gpt-5.4";
2015+const sessionEntry = {
2016+cliSessionBindings: {
2017+"codex-cli": { sessionId: "existing-cli-session" },
2018+},
2019+} as unknown as SessionEntry;
2020+const activeSessionStore = { main: sessionEntry };
2021+2022+const result = await runAgentTurnWithFallback({
2023+ ...createMinimalRunAgentTurnParams({ followupRun }),
2024+ activeSessionStore,
2025+getActiveSessionEntry: () => sessionEntry,
2026+});
2027+2028+expect(result.kind).toBe("success");
2029+if (result.kind !== "success") {
2030+throw new Error("expected success");
2031+}
2032+expect(result.runResult.meta?.agentMeta?.sessionId).toBe("");
2033+expect(result.runResult.meta?.agentMeta?.cliSessionBinding).toBeUndefined();
2034+expect(activeSessionStore.main.cliSessionBindings?.["codex-cli"]).toEqual({
2035+sessionId: "existing-cli-session",
2036+});
2037+});
2038+19342039it("bridges CLI assistant agent events into onPartialReply for live preview (#76869)", async () => {
19352040state.isCliProviderMock.mockReturnValue(true);
19362041state.runWithModelFallbackMock.mockImplementationOnce(async (params: FallbackRunnerParams) => ({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。