Skip to content
Merged

Dev #19

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions packages/client/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,10 @@ export const filterSessions = (sessions: WebSession[], query: string): WebSessio
sessions.filter((session) => matchesQuery(session, query));

export const filterEntries = (entries: WebEntry[], filter: Filter): WebEntry[] => {
// 压缩摘要等 system 输出只写入历史供上下文使用,不在界面上展示
const visible = entries.filter((entry) => entryRole(entry) !== 'system');
if (filter === 'all') {
return entries;
return visible;
}
return entries.filter((entry) => entryRole(entry) === filter);
return visible.filter((entry) => entryRole(entry) === filter);
};
3 changes: 2 additions & 1 deletion packages/server/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ export const startServer = async (

const port =
config.port ?? Number(process.env.CALL_CODE_WEB_PORT ?? 4173);
const host = config.host ?? "127.0.0.1";
const host =
config.host ?? process.env.CALL_CODE_WEB_HOST ?? "127.0.0.1";
const clientDir = config.clientDir;

const handle = await startWebServer({
Expand Down
32 changes: 32 additions & 0 deletions tests/client-ui.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,38 @@ describe("client MainPanel", () => {
expect(html).toContain('aria-label="压缩会话上下文" disabled=""');
});

it("不渲染 system 输出(压缩摘要)", () => {
const session = makeSession({
entries: [
...makeSession().entries,
{
seq: 3,
id: "e3",
parentId: null,
type: "compaction",
role: "system",
timestamp: "2026-08-05T00:00:00.000Z",
text: "手动压缩摘要",
payload: { summary: "手动压缩摘要" },
},
],
});
const html = renderToStaticMarkup(
React.createElement(MainPanel, {
session,
filter: "all",
onFilterChange: () => undefined,
onDeleteEntry: () => undefined,
chatStatus: { status: "idle" },
onSendMessage: () => true,
onCompactSession: () => undefined,
}),
);

expect(html).not.toContain("手动压缩摘要");
expect(html).not.toContain(">系统<");
});

it("没有会话时禁用压缩入口", () => {
const html = renderToStaticMarkup(
React.createElement(MainPanel, {
Expand Down
18 changes: 18 additions & 0 deletions tests/client-utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,22 @@ describe('client utils', () => {
expect(filterEntries(entries, 'tool')).toEqual([entries[2]]);
expect(filterEntries(entries, 'system')).toEqual([]);
});

it('全部视图不展示 system 输出', () => {
const entries = [
makeEntry({ id: 'u1', type: 'user', role: 'user' }),
makeEntry({
id: 'c1',
type: 'compaction',
role: 'system',
text: '手动压缩摘要',
}),
makeEntry({ id: 'a1', type: 'assistant', role: 'assistant' }),
];

expect(filterEntries(entries, 'all')).toEqual([
entries[0],
entries[2],
]);
});
});
10 changes: 10 additions & 0 deletions tests/server.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,14 @@ describe("Server SDK 与集成服务", () => {
data.sessions[0].entries.some((entry) => entry.text === "已处理完毕"),
).toBe(true);
});

it("startServer 默认监听地址读取 CALL_CODE_WEB_HOST", async () => {
process.env.CALL_CODE_WEB_HOST = "0.0.0.0";
try {
const { server } = await createTestServer();
expect(server.host).toBe("0.0.0.0");
} finally {
delete process.env.CALL_CODE_WEB_HOST;
}
});
});
Loading