Files
openclaw/src/config/defaults.test.ts
T
Peter Steinberger 417bd3c88a feat(agents): derive default run concurrency from CPU count (#114047)
* feat(agents): derive default run concurrency from CPU count

* test(agents): pin lane-resume concurrency in suspension persistence case
2026-07-26 03:02:34 -04:00

141 lines
4.3 KiB
TypeScript

// Verifies default config values and environment-sensitive overrides.
import { expectDefined } from "@openclaw/normalization-core";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
DEFAULT_SUBAGENT_ARCHIVE_AFTER_MINUTES,
DEFAULT_SUBAGENT_MAX_CONCURRENT,
resolveAgentMaxConcurrent,
} from "./agent-limits.js";
import {
applyAgentDefaults,
applyContextPruningDefaults,
applyMessageDefaults,
} from "./defaults.js";
const mocks = vi.hoisted(() => ({
applyProviderConfigDefaultsForConfig: vi.fn(),
}));
vi.mock("./provider-policy.js", () => ({
applyProviderConfigDefaultsForConfig: (
...args: Parameters<typeof mocks.applyProviderConfigDefaultsForConfig>
) => mocks.applyProviderConfigDefaultsForConfig(...args),
normalizeProviderConfigForConfigDefaults: (_params: { providerConfig: unknown }) =>
_params.providerConfig,
}));
describe("config defaults", () => {
beforeEach(() => {
mocks.applyProviderConfigDefaultsForConfig.mockReset();
vi.stubEnv("ANTHROPIC_API_KEY", "");
vi.stubEnv("ANTHROPIC_OAUTH_TOKEN", "");
});
afterEach(() => {
vi.unstubAllEnvs();
});
it("skips provider defaults when agent defaults are absent", () => {
const cfg = {
models: {
providers: {
openai: {
api: "openai-completions",
},
},
},
};
expect(applyContextPruningDefaults(cfg as never)).toBe(cfg);
expect(mocks.applyProviderConfigDefaultsForConfig).not.toHaveBeenCalled();
});
it("skips provider defaults when agent defaults have no Anthropic auth signal", () => {
const cfg = {
agents: {
defaults: {},
},
};
expect(applyContextPruningDefaults(cfg as never)).toBe(cfg);
expect(mocks.applyProviderConfigDefaultsForConfig).not.toHaveBeenCalled();
});
it("uses anthropic provider defaults when agent defaults and auth signal exist", () => {
const cfg = {
auth: {
profiles: {
anthropic: { provider: "anthropic", mode: "api_key" },
},
},
agents: {
defaults: {},
},
};
const nextCfg = {
agents: {
defaults: {
contextPruning: {
mode: "cache-ttl",
},
},
},
};
mocks.applyProviderConfigDefaultsForConfig.mockReturnValue(nextCfg);
const manifestRegistry = { plugins: [] };
expect(applyContextPruningDefaults(cfg as never, { manifestRegistry })).toBe(nextCfg);
expect(mocks.applyProviderConfigDefaultsForConfig).toHaveBeenCalledTimes(1);
const [defaultsParams] = expectDefined(
(
mocks.applyProviderConfigDefaultsForConfig.mock.calls as unknown as Array<
[{ manifestRegistry?: unknown }]
>
)[0],
"(mocks.applyProviderConfigDefaultsForConfig.mock.calls as unknown as Array<\n [{ manifestRegistry?: unknown }]\n >)[0] test invariant",
);
expect(defaultsParams.manifestRegistry).toBe(manifestRegistry);
});
it("defaults ackReactionScope without deriving other message fields", () => {
const next = applyMessageDefaults({
agents: {
list: [
{
id: "main",
identity: {
name: "Samantha",
theme: "helpful sloth",
emoji: "🦥",
},
},
],
},
messages: {},
} as never);
expect(next.messages?.ackReactionScope).toBe("group-mentions");
expect(next.messages).not.toHaveProperty("responsePrefix");
expect(next.messages?.groupChat?.mentionPatterns).toBeUndefined();
});
it("fills missing agent concurrency defaults", () => {
const next = applyAgentDefaults({ messages: {} } as never);
expect(next.agents?.defaults?.maxConcurrent).toBe(resolveAgentMaxConcurrent());
expect(next.agents?.defaults?.subagents?.maxConcurrent).toBe(DEFAULT_SUBAGENT_MAX_CONCURRENT);
expect(next.agents?.defaults?.subagents?.archiveAfterMinutes).toBe(
DEFAULT_SUBAGENT_ARCHIVE_AFTER_MINUTES,
);
});
it("preserves explicit subagent archive default", () => {
const next = applyAgentDefaults({
agents: { defaults: { subagents: { archiveAfterMinutes: 0 } } },
} as never);
expect(next.agents?.defaults?.subagents?.archiveAfterMinutes).toBe(0);
expect(next.agents?.defaults?.subagents?.maxConcurrent).toBe(DEFAULT_SUBAGENT_MAX_CONCURRENT);
});
});