From 1a4d7852a8b828ebb4a556a522a587d2caea0213 Mon Sep 17 00:00:00 2001 From: psyche <123316733+githubbzxs@users.noreply.github.com> Date: Mon, 13 Jul 2026 05:47:02 +0800 Subject: [PATCH] fix(agent): allow cross-provider creation for modeless providers (#2000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 允许无模式 Provider 创建子 Agent * test: 补充无模式 Provider 继承场景 --- .../server/agent/create-agent-mode.test.ts | 26 +++++++++++++++++++ .../src/server/agent/create-agent-mode.ts | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/packages/server/src/server/agent/create-agent-mode.test.ts b/packages/server/src/server/agent/create-agent-mode.test.ts index 3f5c5cb35..dd7d83d8a 100644 --- a/packages/server/src/server/agent/create-agent-mode.test.ts +++ b/packages/server/src/server/agent/create-agent-mode.test.ts @@ -96,6 +96,32 @@ describe("resolveAndValidateCreateAgentMode", () => { ); }); + it("uses the provider default when the cross-provider target has no modes", () => { + const resolved = resolveAndValidateCreateAgentMode({ + requestedMode: undefined, + targetProvider: "pi", + parent: agentParent("codex", "auto"), + unattended: false, + availableModes: [], + targetUnattendedMode: undefined, + }); + + expect(resolved).toBeUndefined(); + }); + + it("uses the provider default when an unattended parent targets a provider with no modes", () => { + const resolved = resolveAndValidateCreateAgentMode({ + requestedMode: undefined, + targetProvider: "pi", + parent: agentParent("claude", "bypassPermissions", true), + unattended: false, + availableModes: [], + targetUnattendedMode: undefined, + }); + + expect(resolved).toBeUndefined(); + }); + it("passes through an explicit mode when the target provider's modes are unknown", () => { const resolved = resolveAndValidateCreateAgentMode({ requestedMode: "default", diff --git a/packages/server/src/server/agent/create-agent-mode.ts b/packages/server/src/server/agent/create-agent-mode.ts index 191565071..973642e47 100644 --- a/packages/server/src/server/agent/create-agent-mode.ts +++ b/packages/server/src/server/agent/create-agent-mode.ts @@ -14,6 +14,7 @@ export interface ResolveCreateAgentModeInput { unattended: boolean; // `undefined` = target provider's modes unknown: explicit modes pass through // unvalidated, but cross-provider inheritance is still refused. + // `[]` = target provider explicitly has no modes: use its default behavior. availableModes: string[] | undefined; // Target provider's own unattended mode id, if it has one. Used to bridge // unattended parents into unattended children across providers. @@ -71,6 +72,10 @@ export function resolveAndValidateCreateAgentMode( return input.targetUnattendedMode; } + if (availableModes?.length === 0) { + return undefined; + } + throw new Error( `cannot inherit mode '${formatCreateConfigParentMode(parent)}' from ${formatCreateConfigParentSource(parent)} for new agent (provider '${targetProvider}'). Pass an explicit mode. Available modes for '${targetProvider}': ${listModes(availableModes)}`, );