Просмотр исходного кода

fix: allow user plugins to override built-in auth plugins (#11058)

Co-authored-by: JosXa <[email protected]>
Joscha Götzer 2 месяцев назад
Родитель
Сommit
3577d829c2
2 измененных файлов с 46 добавлено и 2 удалено
  1. 2 2
      packages/opencode/src/cli/cmd/auth.ts
  2. 44 0
      packages/opencode/test/plugin/auth-override.test.ts

+ 2 - 2
packages/opencode/src/cli/cmd/auth.ts

@@ -307,7 +307,7 @@ export const AuthLoginCommand = cmd({
 
 
         if (prompts.isCancel(provider)) throw new UI.CancelledError()
         if (prompts.isCancel(provider)) throw new UI.CancelledError()
 
 
-        const plugin = await Plugin.list().then((x) => x.find((x) => x.auth?.provider === provider))
+        const plugin = await Plugin.list().then((x) => x.findLast((x) => x.auth?.provider === provider))
         if (plugin && plugin.auth) {
         if (plugin && plugin.auth) {
           const handled = await handlePluginAuth({ auth: plugin.auth }, provider)
           const handled = await handlePluginAuth({ auth: plugin.auth }, provider)
           if (handled) return
           if (handled) return
@@ -323,7 +323,7 @@ export const AuthLoginCommand = cmd({
           if (prompts.isCancel(provider)) throw new UI.CancelledError()
           if (prompts.isCancel(provider)) throw new UI.CancelledError()
 
 
           // Check if a plugin provides auth for this custom provider
           // Check if a plugin provides auth for this custom provider
-          const customPlugin = await Plugin.list().then((x) => x.find((x) => x.auth?.provider === provider))
+          const customPlugin = await Plugin.list().then((x) => x.findLast((x) => x.auth?.provider === provider))
           if (customPlugin && customPlugin.auth) {
           if (customPlugin && customPlugin.auth) {
             const handled = await handlePluginAuth({ auth: customPlugin.auth }, provider)
             const handled = await handlePluginAuth({ auth: customPlugin.auth }, provider)
             if (handled) return
             if (handled) return

+ 44 - 0
packages/opencode/test/plugin/auth-override.test.ts

@@ -0,0 +1,44 @@
+import { describe, expect, test } from "bun:test"
+import path from "path"
+import fs from "fs/promises"
+import { tmpdir } from "../fixture/fixture"
+import { Instance } from "../../src/project/instance"
+import { ProviderAuth } from "../../src/provider/auth"
+
+describe("plugin.auth-override", () => {
+  test("user plugin overrides built-in github-copilot auth", async () => {
+    await using tmp = await tmpdir({
+      init: async (dir) => {
+        const pluginDir = path.join(dir, ".opencode", "plugin")
+        await fs.mkdir(pluginDir, { recursive: true })
+
+        await Bun.write(
+          path.join(pluginDir, "custom-copilot-auth.ts"),
+          [
+            "export default async () => ({",
+            "  auth: {",
+            '    provider: "github-copilot",',
+            "    methods: [",
+            '      { type: "api", label: "Test Override Auth" },',
+            "    ],",
+            "    loader: async () => ({ access: 'test-token' }),",
+            "  },",
+            "})",
+            "",
+          ].join("\n"),
+        )
+      },
+    })
+
+    await Instance.provide({
+      directory: tmp.path,
+      fn: async () => {
+        const methods = await ProviderAuth.methods()
+        const copilot = methods["github-copilot"]
+        expect(copilot).toBeDefined()
+        expect(copilot.length).toBe(1)
+        expect(copilot[0].label).toBe("Test Override Auth")
+      },
+    })
+  }, 30000) // Increased timeout for plugin installation
+})