fix(codex): remove legacy agent thread cap
This commit is contained in:
@@ -171,3 +171,73 @@ test("#given legacy boolean MultiAgentV2 flag and table #when script installer u
|
|||||||
assert.match(config, /usage_hint_enabled = false/);
|
assert.match(config, /usage_hint_enabled = false/);
|
||||||
assert.match(config, /max_concurrent_threads_per_session = 10000/);
|
assert.match(config, /max_concurrent_threads_per_session = 10000/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("#given legacy agents max_threads #when script installer updates config #then removes the conflicting legacy thread cap", async () => {
|
||||||
|
// given
|
||||||
|
const root = await mkdtemp(join(tmpdir(), "omo-codex-script-config-multi-agent-legacy-threads-"));
|
||||||
|
const configPath = join(root, "config.toml");
|
||||||
|
await writeFile(
|
||||||
|
configPath,
|
||||||
|
[
|
||||||
|
"[agents]",
|
||||||
|
"max_threads = 16",
|
||||||
|
"max_depth = 4",
|
||||||
|
"job_max_runtime_seconds = 3600",
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
|
||||||
|
// when
|
||||||
|
await updateCodexConfig({
|
||||||
|
configPath,
|
||||||
|
repoRoot: "/repo/packages/omo-codex",
|
||||||
|
marketplaceName: "debug",
|
||||||
|
marketplaceSource: { sourceType: "local", source: "/repo/packages/omo-codex" },
|
||||||
|
pluginNames: ["omo"],
|
||||||
|
});
|
||||||
|
|
||||||
|
// then
|
||||||
|
const config = await readFile(configPath, "utf8");
|
||||||
|
assert.match(config, /\[features\.multi_agent_v2\]/);
|
||||||
|
assert.match(config, /enabled = true/);
|
||||||
|
assert.match(config, /max_concurrent_threads_per_session = 10000/);
|
||||||
|
assert.match(config, /\[agents\]/);
|
||||||
|
assert.doesNotMatch(config, /^max_threads\s*=/m);
|
||||||
|
assert.match(config, /max_depth = 4/);
|
||||||
|
assert.match(config, /job_max_runtime_seconds = 3600/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("#given managed agent role sections #when script installer updates config #then preserves role config while removing only root agents max_threads", async () => {
|
||||||
|
// given
|
||||||
|
const root = await mkdtemp(join(tmpdir(), "omo-codex-script-config-multi-agent-role-section-"));
|
||||||
|
const configPath = join(root, "config.toml");
|
||||||
|
await writeFile(
|
||||||
|
configPath,
|
||||||
|
[
|
||||||
|
"[agents]",
|
||||||
|
"max_threads = 16",
|
||||||
|
"",
|
||||||
|
"[agents.explorer]",
|
||||||
|
'description = "read-only explorer"',
|
||||||
|
'config_file = "./agents/explorer.toml"',
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
|
||||||
|
// when
|
||||||
|
await updateCodexConfig({
|
||||||
|
configPath,
|
||||||
|
repoRoot: "/repo/packages/omo-codex",
|
||||||
|
marketplaceName: "debug",
|
||||||
|
marketplaceSource: { sourceType: "local", source: "/repo/packages/omo-codex" },
|
||||||
|
pluginNames: ["omo"],
|
||||||
|
agentConfigs: [{ name: "explorer", configFile: "./agents/explorer.toml" }],
|
||||||
|
});
|
||||||
|
|
||||||
|
// then
|
||||||
|
const config = await readFile(configPath, "utf8");
|
||||||
|
assert.doesNotMatch(config, /^max_threads\s*=/m);
|
||||||
|
assert.match(config, /\[agents\.explorer\]/);
|
||||||
|
assert.match(config, /description = "read-only explorer"/);
|
||||||
|
assert.match(config, /config_file = "\.\/agents\/explorer\.toml"/);
|
||||||
|
});
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2";
|
|||||||
const CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION = 10000;
|
const CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION = 10000;
|
||||||
|
|
||||||
export function ensureCodexMultiAgentV2Config(config) {
|
export function ensureCodexMultiAgentV2Config(config) {
|
||||||
const normalizedConfig = removeFeatureFlagSetting(config, "multi_agent_v2");
|
const normalizedConfig = removeLegacyAgentsMaxThreadsSetting(removeFeatureFlagSetting(config, "multi_agent_v2"));
|
||||||
const section = findTomlSection(normalizedConfig, CODEX_MULTI_AGENT_V2_HEADER);
|
const section = findTomlSection(normalizedConfig, CODEX_MULTI_AGENT_V2_HEADER);
|
||||||
const maxThreadsValue = CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION.toString();
|
const maxThreadsValue = CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION.toString();
|
||||||
if (!section) {
|
if (!section) {
|
||||||
@@ -30,3 +30,9 @@ function removeFeatureFlagSetting(config, featureName) {
|
|||||||
if (!section) return config;
|
if (!section) return config;
|
||||||
return removeSetting(config, section, featureName);
|
return removeSetting(config, section, featureName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeLegacyAgentsMaxThreadsSetting(config) {
|
||||||
|
const section = findTomlSection(config, "agents");
|
||||||
|
if (!section) return config;
|
||||||
|
return removeSetting(config, section, "max_threads");
|
||||||
|
}
|
||||||
|
|||||||
@@ -146,6 +146,76 @@ describe("codex-config-toml", () => {
|
|||||||
expect(content).toContain("max_concurrent_threads_per_session = 10000")
|
expect(content).toContain("max_concurrent_threads_per_session = 10000")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("#given legacy agents max_threads #when updating config #then removes the conflicting legacy thread cap", async () => {
|
||||||
|
// given
|
||||||
|
const root = await mkdtemp(join(tmpdir(), "omo-codex-config-multi-agent-legacy-threads-"))
|
||||||
|
const configPath = join(root, "config.toml")
|
||||||
|
await writeFile(
|
||||||
|
configPath,
|
||||||
|
[
|
||||||
|
"[agents]",
|
||||||
|
"max_threads = 16",
|
||||||
|
"max_depth = 4",
|
||||||
|
"job_max_runtime_seconds = 3600",
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// when
|
||||||
|
await updateCodexConfig({
|
||||||
|
configPath,
|
||||||
|
repoRoot: "/repo/packages/omo-codex",
|
||||||
|
marketplaceName: "debug",
|
||||||
|
marketplaceSource: { sourceType: "local", source: "/repo/packages/omo-codex" },
|
||||||
|
pluginNames: ["omo"],
|
||||||
|
})
|
||||||
|
|
||||||
|
// then
|
||||||
|
const content = await readFile(configPath, "utf8")
|
||||||
|
expect(content).toContain("[features.multi_agent_v2]")
|
||||||
|
expect(content).toContain("enabled = true")
|
||||||
|
expect(content).toContain("max_concurrent_threads_per_session = 10000")
|
||||||
|
expect(content).toContain("[agents]")
|
||||||
|
expect(content).not.toMatch(/^max_threads\s*=/m)
|
||||||
|
expect(content).toContain("max_depth = 4")
|
||||||
|
expect(content).toContain("job_max_runtime_seconds = 3600")
|
||||||
|
})
|
||||||
|
|
||||||
|
test("#given managed agent role sections #when updating config #then preserves role config while removing only root agents max_threads", async () => {
|
||||||
|
// given
|
||||||
|
const root = await mkdtemp(join(tmpdir(), "omo-codex-config-multi-agent-role-section-"))
|
||||||
|
const configPath = join(root, "config.toml")
|
||||||
|
await writeFile(
|
||||||
|
configPath,
|
||||||
|
[
|
||||||
|
"[agents]",
|
||||||
|
"max_threads = 16",
|
||||||
|
"",
|
||||||
|
"[agents.explorer]",
|
||||||
|
'description = "read-only explorer"',
|
||||||
|
'config_file = "./agents/explorer.toml"',
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// when
|
||||||
|
await updateCodexConfig({
|
||||||
|
configPath,
|
||||||
|
repoRoot: "/repo/packages/omo-codex",
|
||||||
|
marketplaceName: "debug",
|
||||||
|
marketplaceSource: { sourceType: "local", source: "/repo/packages/omo-codex" },
|
||||||
|
pluginNames: ["omo"],
|
||||||
|
agentConfigs: [{ name: "explorer", configFile: "./agents/explorer.toml" }],
|
||||||
|
})
|
||||||
|
|
||||||
|
// then
|
||||||
|
const content = await readFile(configPath, "utf8")
|
||||||
|
expect(content).not.toMatch(/^max_threads\s*=/m)
|
||||||
|
expect(content).toContain("[agents.explorer]")
|
||||||
|
expect(content).toContain('description = "read-only explorer"')
|
||||||
|
expect(content).toContain('config_file = "./agents/explorer.toml"')
|
||||||
|
})
|
||||||
|
|
||||||
test("writes config blocks and stays idempotent", async () => {
|
test("writes config blocks and stays idempotent", async () => {
|
||||||
// given
|
// given
|
||||||
const root = await mkdtemp(join(tmpdir(), "omo-codex-config-"))
|
const root = await mkdtemp(join(tmpdir(), "omo-codex-config-"))
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const CODEX_MULTI_AGENT_V2_HEADER = "features.multi_agent_v2"
|
|||||||
const CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION = 10000
|
const CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION = 10000
|
||||||
|
|
||||||
export function ensureCodexMultiAgentV2Config(config: string): string {
|
export function ensureCodexMultiAgentV2Config(config: string): string {
|
||||||
const normalizedConfig = removeFeatureFlagSetting(config, "multi_agent_v2")
|
const normalizedConfig = removeLegacyAgentsMaxThreadsSetting(removeFeatureFlagSetting(config, "multi_agent_v2"))
|
||||||
const section = findTomlSection(normalizedConfig, CODEX_MULTI_AGENT_V2_HEADER)
|
const section = findTomlSection(normalizedConfig, CODEX_MULTI_AGENT_V2_HEADER)
|
||||||
const maxThreadsValue = CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION.toString()
|
const maxThreadsValue = CODEX_MULTI_AGENT_V2_MAX_CONCURRENT_THREADS_PER_SESSION.toString()
|
||||||
if (!section) {
|
if (!section) {
|
||||||
@@ -30,3 +30,9 @@ function removeFeatureFlagSetting(config: string, featureName: string): string {
|
|||||||
if (!section) return config
|
if (!section) return config
|
||||||
return removeSetting(config, section, featureName)
|
return removeSetting(config, section, featureName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeLegacyAgentsMaxThreadsSetting(config: string): string {
|
||||||
|
const section = findTomlSection(config, "agents")
|
||||||
|
if (!section) return config
|
||||||
|
return removeSetting(config, section, "max_threads")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user