
























@@ -4,6 +4,27 @@ import { createEmbeddedCallGateway } from "./embedded-gateway-stub.js";
44const runtime = vi.hoisted(() => ({
55loadConfig: vi.fn(() => ({ agents: { list: [{ id: "main", default: true }] } })),
66resolveSessionKeyFromResolveParams: vi.fn(),
7+resolveSessionAgentId: vi.fn(() => "main"),
8+loadSessionEntry: vi.fn(() => ({
9+cfg: {},
10+storePath: "/tmp/openclaw-sessions.json",
11+entry: { sessionId: "sess-main" },
12+})),
13+resolveSessionModelRef: vi.fn(() => ({ provider: "openai" })),
14+readSessionMessages: vi.fn((): unknown[] => []),
15+augmentChatHistoryWithCliSessionImports: vi.fn(
16+({ localMessages }: { localMessages?: unknown[] }) => localMessages ?? [],
17+),
18+resolveEffectiveChatHistoryMaxChars: vi.fn(() => 100_000),
19+projectRecentChatDisplayMessages: vi.fn((messages: unknown[]): unknown[] => messages),
20+augmentChatHistoryWithCanvasBlocks: vi.fn((messages: unknown[]) => messages),
21+getMaxChatHistoryMessagesBytes: vi.fn(() => 100_000),
22+CHAT_HISTORY_MAX_SINGLE_MESSAGE_BYTES: 100_000,
23+replaceOversizedChatHistoryMessages: vi.fn(({ messages }: { messages: unknown[] }) => ({
24+ messages,
25+})),
26+capArrayByJsonBytes: vi.fn((items: unknown[]) => ({ items })),
27+enforceChatHistoryFinalBudget: vi.fn(({ messages }: { messages: unknown[] }) => ({ messages })),
728}));
829930vi.mock("./embedded-gateway-stub.runtime.js", () => runtime);
@@ -12,6 +33,8 @@ describe("embedded gateway stub", () => {
1233beforeEach(() => {
1334runtime.loadConfig.mockClear();
1435runtime.resolveSessionKeyFromResolveParams.mockReset();
36+runtime.projectRecentChatDisplayMessages.mockClear();
37+runtime.readSessionMessages.mockClear();
1538});
16391740it("resolves sessions through the gateway session resolver", async () => {
@@ -48,4 +71,45 @@ describe("embedded gateway stub", () => {
4871}),
4972).rejects.toThrow("No session found: missing");
5073});
74+75+it("projects embedded chat history through the shared display projector", async () => {
76+const rawMessages = [
77+{ role: "user", content: "hello" },
78+{ role: "assistant", content: "hi" },
79+];
80+const projectedMessages = [{ role: "assistant", content: "hi" }];
81+runtime.readSessionMessages.mockReturnValueOnce(rawMessages);
82+runtime.projectRecentChatDisplayMessages.mockReturnValueOnce(projectedMessages);
83+84+const callGateway = createEmbeddedCallGateway();
85+const result = await callGateway<{ messages: unknown[] }>({
86+method: "chat.history",
87+params: { sessionKey: "agent:main:main" },
88+});
89+90+expect(runtime.projectRecentChatDisplayMessages).toHaveBeenCalledWith(rawMessages, {
91+maxChars: 100_000,
92+maxMessages: 200,
93+});
94+expect(result.messages).toEqual(projectedMessages);
95+});
96+97+it("passes the full raw history to projection before limiting visible messages", async () => {
98+const rawMessages = [
99+{ role: "user", content: "visible older" },
100+{ role: "assistant", content: "hidden newer" },
101+];
102+runtime.readSessionMessages.mockReturnValueOnce(rawMessages);
103+104+const callGateway = createEmbeddedCallGateway();
105+await callGateway<{ messages: unknown[] }>({
106+method: "chat.history",
107+params: { sessionKey: "agent:main:main", limit: 1 },
108+});
109+110+expect(runtime.projectRecentChatDisplayMessages).toHaveBeenCalledWith(rawMessages, {
111+maxChars: 100_000,
112+maxMessages: 1,
113+});
114+});
51115});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。