openclaw/src/auto-reply/reply/acp-stream-settings.test.ts

117 lines
3.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
isAcpTagVisible,
resolveAcpProjectionSettings,
resolveAcpStreamingConfig,
} from "./acp-stream-settings.js";
import { createAcpTestConfig } from "./test-fixtures/acp-runtime.js";
describe("acp stream settings", () => {
it("resolves stable defaults", () => {
const settings = resolveAcpProjectionSettings(createAcpTestConfig());
expect(settings.deliveryMode).toBe("final_only");
expect(settings.hiddenBoundarySeparator).toBe("paragraph");
expect(settings.repeatSuppression).toBe(true);
expect(settings.maxOutputChars).toBe(24_000);
expect(settings.maxSessionUpdateChars).toBe(320);
});
it("applies explicit stream overrides", () => {
const settings = resolveAcpProjectionSettings(
createAcpTestConfig({
acp: {
enabled: true,
stream: {
deliveryMode: "final_only",
hiddenBoundarySeparator: "space",
repeatSuppression: false,
maxOutputChars: 500,
maxSessionUpdateChars: 123,
tagVisibility: {
usage_update: true,
},
},
},
}),
);
expect(settings.deliveryMode).toBe("final_only");
expect(settings.hiddenBoundarySeparator).toBe("space");
expect(settings.repeatSuppression).toBe(false);
expect(settings.maxOutputChars).toBe(500);
expect(settings.maxSessionUpdateChars).toBe(123);
expect(settings.tagVisibility.usage_update).toBe(true);
});
it("accepts explicit deliveryMode=live override", () => {
const settings = resolveAcpProjectionSettings(
createAcpTestConfig({
acp: {
enabled: true,
stream: {
deliveryMode: "live",
},
},
}),
);
expect(settings.deliveryMode).toBe("live");
expect(settings.hiddenBoundarySeparator).toBe("space");
});
it("uses default tag visibility when no override is provided", () => {
const settings = resolveAcpProjectionSettings(createAcpTestConfig());
expect(isAcpTagVisible(settings, "tool_call")).toBe(false);
expect(isAcpTagVisible(settings, "tool_call_update")).toBe(false);
expect(isAcpTagVisible(settings, "usage_update")).toBe(false);
});
it("respects tag visibility overrides", () => {
const settings = resolveAcpProjectionSettings(
createAcpTestConfig({
acp: {
enabled: true,
stream: {
tagVisibility: {
usage_update: true,
tool_call: false,
},
},
},
}),
);
expect(isAcpTagVisible(settings, "usage_update")).toBe(true);
expect(isAcpTagVisible(settings, "tool_call")).toBe(false);
});
it("resolves chunking/coalescing from ACP stream controls", () => {
const streaming = resolveAcpStreamingConfig({
cfg: createAcpTestConfig(),
provider: "discord",
});
expect(streaming.chunking.maxChars).toBe(64);
expect(streaming.coalescing.idleMs).toBe(0);
});
it("applies live-mode streaming overrides for incremental delivery", () => {
const streaming = resolveAcpStreamingConfig({
cfg: createAcpTestConfig({
acp: {
enabled: true,
stream: {
deliveryMode: "live",
coalesceIdleMs: 350,
maxChunkChars: 256,
},
},
}),
provider: "discord",
deliveryMode: "live",
});
expect(streaming.chunking.minChars).toBe(1);
expect(streaming.chunking.maxChars).toBe(256);
expect(streaming.coalescing.minChars).toBe(1);
expect(streaming.coalescing.maxChars).toBe(256);
expect(streaming.coalescing.joiner).toBe("");
expect(streaming.coalescing.idleMs).toBe(350);
});
});