import fs from "node:fs/promises"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; import { captureEnv } from "../test-utils/env.js"; import { resolveOpenClawAgentDir } from "./agent-paths.js"; import { installModelsConfigTestHooks, mockCopilotTokenExchangeSuccess, withUnsetCopilotTokenEnv, withModelsTempHome as withTempHome, } from "./models-config.e2e-harness.js"; import { ensureOpenClawModelsJson } from "./models-config.js"; installModelsConfigTestHooks({ restoreFetch: true }); describe("models-config", () => { it("uses the first github-copilot profile when env tokens are missing", async () => { await withTempHome(async (home) => { await withUnsetCopilotTokenEnv(async () => { const fetchMock = mockCopilotTokenExchangeSuccess(); const agentDir = path.join(home, "agent-profiles"); await fs.mkdir(agentDir, { recursive: true }); await fs.writeFile( path.join(agentDir, "auth-profiles.json"), JSON.stringify( { version: 1, profiles: { "github-copilot:alpha": { type: "token", provider: "github-copilot", token: "alpha-token", }, "github-copilot:beta": { type: "token", provider: "github-copilot", token: "beta-token", }, }, }, null, 2, ), ); await ensureOpenClawModelsJson({ models: { providers: {} } }, agentDir); const [, opts] = fetchMock.mock.calls[0] as [string, { headers?: Record }]; expect(opts?.headers?.Authorization).toBe("Bearer alpha-token"); }); }); }); it("does not override explicit github-copilot provider config", async () => { await withTempHome(async () => { const envSnapshot = captureEnv(["COPILOT_GITHUB_TOKEN"]); process.env.COPILOT_GITHUB_TOKEN = "gh-token"; const fetchMock = vi.fn().mockResolvedValue({ ok: true, status: 200, json: async () => ({ token: "copilot-token;proxy-ep=proxy.copilot.example", expires_at: Math.floor(Date.now() / 1000) + 3600, }), }); globalThis.fetch = fetchMock as unknown as typeof fetch; try { await ensureOpenClawModelsJson({ models: { providers: { "github-copilot": { baseUrl: "https://copilot.local", api: "openai-responses", models: [], }, }, }, }); const agentDir = resolveOpenClawAgentDir(); const raw = await fs.readFile(path.join(agentDir, "models.json"), "utf8"); const parsed = JSON.parse(raw) as { providers: Record; }; expect(parsed.providers["github-copilot"]?.baseUrl).toBe("https://copilot.local"); } finally { envSnapshot.restore(); } }); }); });