diff --git a/agent_default_cli_test.go b/agent_default_cli_test.go index b32510ed..1f8fb855 100644 --- a/agent_default_cli_test.go +++ b/agent_default_cli_test.go @@ -43,3 +43,51 @@ func TestAgentDefaultPutsBackTheModelBefore(t *testing.T) { t.Fatalf("the model field's default leaves Claude Code as installed:\n%s", s) } } + +// `magpie claude model default` on a Claude Code wired into magpie puts +// back the endpoint and token the user had before magpie and leaves them: +// it took them away, and Disconnect after it had nothing to put back +// (__jingling on X, twice). +func TestAgentModelDefaultKeepsTheEndpointBefore(t *testing.T) { + groupsHome(t) + t.Setenv("CLAUDE_CONFIG_DIR", "") + path := filepath.Join(os.Getenv("HOME"), ".claude", "settings.json") + os.MkdirAll(filepath.Dir(path), 0o755) + own := "{\n \"model\": \"opus\",\n \"env\": {\n \"ANTHROPIC_BASE_URL\": \"https://relay.example.com\",\n \"ANTHROPIC_AUTH_TOKEN\": \"sk-mine\"\n }\n}\n" + if err := os.WriteFile(path, []byte(own), 0o644); err != nil { + t.Fatal(err) + } + read := func() string { + b, _ := os.ReadFile(path) + return string(b) + } + mine := func(when string) { + t.Helper() + s := read() + if !strings.Contains(s, `"ANTHROPIC_BASE_URL": "https://relay.example.com"`) || !strings.Contains(s, `"ANTHROPIC_AUTH_TOKEN": "sk-mine"`) { + t.Fatalf("%s: the user's own endpoint and token are gone:\n%s", when, s) + } + } + if err := run([]string{"claude", "a/m"}); err != nil { + t.Fatal(err) + } + if s := read(); strings.Contains(s, "relay.example.com") { + t.Fatalf("not wired:\n%s", s) + } + if err := run([]string{"claude", "model", "default"}); err != nil { + t.Fatal(err) + } + mine("model default") + if s := read(); strings.Contains(s, `"model"`) { + t.Fatalf("model default kept a model:\n%s", s) + } + if err := run([]string{"claude", "default"}); err != nil { + t.Fatal(err) + } + mine("default after it") + // unwired, a field's default leaves the user's own endpoint too + if err := run([]string{"claude", "model", "default"}); err != nil { + t.Fatal(err) + } + mine("model default unwired") +} diff --git a/internal/agent/claude.go b/internal/agent/claude.go index 1839ee1a..c451e67a 100644 --- a/internal/agent/claude.go +++ b/internal/agent/claude.go @@ -563,24 +563,22 @@ func claudeIn(at place) *Agent { var writeTiers func(main string, tiers map[string]string) error set := func(v string) error { if v == "" { - // Claude Code as installed: Anthropic's own endpoint and model + // Claude Code's own model, on the endpoint the user had before + // magpie: magpie steps out, putting back their endpoint and + // token, which stay theirs (__jingling on X: magpie claude + // model default took their ANTHROPIC_BASE_URL and token away + // for good) + if _, err := unroute(); err != nil { + return err + } keys := []string{"model"} - for _, k := range claudeEnv { - keys = append(keys, "env."+k) + if env("ANTHROPIC_AUTH_TOKEN") == gateway.Token { + // magpie's, left at a gateway address since changed + for _, k := range claudeEnv { + keys = append(keys, "env."+k) + } } forget(at.key("claude.model"), at.key("claude.base_url"), at.key("claude.auth_token"), mainKey) - if err := dropWindow(); err != nil { - return err - } - if err := dropCompact(); err != nil { - return err - } - if err := dropCaps(); err != nil { - return err - } - if err := dropPicker(); err != nil { - return err - } return edit.DelJSON(path, keys...) } if isMagpie(v) {