
























@@ -739,6 +739,58 @@ describe("CLI attempt execution", () => {
739739expect(firstRunCliAgentArg().authProfileId).toBe("openai:work");
740740});
741741742+it("skips auto auth-profile resolution for CLI-owned transport", async () => {
743+const sessionKey = "agent:main:direct:codex-cli-owned-transport";
744+const sessionEntry: SessionEntry = {
745+sessionId: "openclaw-session-codex-owned",
746+updatedAt: Date.now(),
747+};
748+const sessionStore: Record<string, SessionEntry> = { [sessionKey]: sessionEntry };
749+const cfg: OpenClawConfig = {
750+agents: {
751+defaults: {
752+agentRuntime: { id: "codex" },
753+},
754+},
755+};
756+await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
757+await fs.writeFile(path.join(tmpDir, "auth-profiles.json"), "{", "utf-8");
758+runCliAgentMock.mockResolvedValueOnce(makeCliResult("codex cli response"));
759+760+await runAgentAttempt({
761+providerOverride: "codex-cli",
762+originalProvider: "codex-cli",
763+modelOverride: "gpt-5.4",
764+ cfg,
765+ sessionEntry,
766+sessionId: sessionEntry.sessionId,
767+ sessionKey,
768+sessionAgentId: "main",
769+sessionFile: path.join(tmpDir, "session.jsonl"),
770+workspaceDir: tmpDir,
771+body: "continue",
772+isFallbackRetry: false,
773+resolvedThinkLevel: "medium",
774+timeoutMs: 1_000,
775+runId: "run-codex-cli-owned-transport-auth-skip",
776+opts: {} as Parameters<typeof runAgentAttempt>[0]["opts"],
777+runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
778+spawnedBy: undefined,
779+messageChannel: undefined,
780+skillsSnapshot: undefined,
781+resolvedVerboseLevel: undefined,
782+agentDir: tmpDir,
783+onAgentEvent: vi.fn(),
784+authProfileProvider: "openai-codex",
785+ sessionStore,
786+ storePath,
787+sessionHasHistory: false,
788+});
789+790+expect(runCliAgentMock).toHaveBeenCalledTimes(1);
791+expect(firstRunCliAgentArg().authProfileId).toBeUndefined();
792+});
793+742794it("selects a google-gemini-cli auth profile for canonical Google models routed through Gemini CLI", async () => {
743795const sessionKey = "agent:main:direct:gemini-cli-auth-bridge";
744796const sessionEntry: SessionEntry = {
@@ -1708,6 +1760,81 @@ describe("CLI attempt execution", () => {
17081760expect(firstRunCliAgentArg().authProfileId).toBeUndefined();
17091761});
171017621763+it("does not pass auth-order profiles to configured CLI runtimes that do not stage them", async () => {
1764+const sessionKey = "agent:main:direct:anthropic-claude-runtime-auth-order";
1765+const sessionEntry: SessionEntry = {
1766+sessionId: "openclaw-session-anthropic-claude-runtime-auth-order",
1767+updatedAt: Date.now(),
1768+};
1769+const sessionStore: Record<string, SessionEntry> = { [sessionKey]: sessionEntry };
1770+await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
1771+saveAuthProfileStore(
1772+{
1773+version: 1,
1774+profiles: {
1775+"anthropic:work": {
1776+type: "api_key",
1777+provider: "anthropic",
1778+key: "test-key",
1779+},
1780+},
1781+},
1782+tmpDir,
1783+{ filterExternalAuthProfiles: false, syncExternalCli: false },
1784+);
1785+runCliAgentMock.mockResolvedValueOnce(makeCliResult("configured claude cli"));
1786+1787+await runAgentAttempt({
1788+providerOverride: "anthropic",
1789+originalProvider: "anthropic",
1790+modelOverride: "claude-opus-4-7",
1791+cfg: {
1792+auth: {
1793+order: {
1794+anthropic: ["anthropic:work"],
1795+},
1796+},
1797+agents: {
1798+defaults: {
1799+models: {
1800+"anthropic/claude-opus-4-7": { agentRuntime: { id: "claude-cli" } },
1801+},
1802+},
1803+},
1804+} as OpenClawConfig,
1805+ sessionEntry,
1806+sessionId: sessionEntry.sessionId,
1807+ sessionKey,
1808+sessionAgentId: "main",
1809+sessionFile: path.join(tmpDir, "session.jsonl"),
1810+workspaceDir: tmpDir,
1811+body: "use ambient cli auth",
1812+isFallbackRetry: false,
1813+resolvedThinkLevel: "medium",
1814+timeoutMs: 1_000,
1815+runId: "run-configured-claude-auth-order",
1816+opts: {} as Parameters<typeof runAgentAttempt>[0]["opts"],
1817+runContext: {} as Parameters<typeof runAgentAttempt>[0]["runContext"],
1818+spawnedBy: undefined,
1819+messageChannel: undefined,
1820+skillsSnapshot: undefined,
1821+resolvedVerboseLevel: undefined,
1822+agentDir: tmpDir,
1823+onAgentEvent: vi.fn(),
1824+authProfileProvider: "anthropic",
1825+ sessionStore,
1826+ storePath,
1827+sessionHasHistory: false,
1828+});
1829+1830+expect(runCliAgentMock).toHaveBeenCalledTimes(1);
1831+expectMockArgFields(runCliAgentMock, {
1832+provider: "claude-cli",
1833+model: "claude-opus-4-7",
1834+});
1835+expect(firstRunCliAgentArg().authProfileId).toBeUndefined();
1836+});
1837+17111838it("forwards runtime toolsAllow into CLI attempts so the CLI harness can fail closed", async () => {
17121839const sessionKey = "agent:main:direct:claude-tools-allow";
17131840const sessionEntry: SessionEntry = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。