{"record":{"id":"9996068425b56ac3","repo":"charmbracelet/crush","slug":"unknown-platform-s","errorCode":null,"errorMessage":"unknown platform: %s","messagePattern":"unknown platform: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cmd/logout.go","lineNumber":88,"sourceCode":"\n\t\tforce, _ := cmd.Flags().GetBool(\"force\")\n\t\tif !force {\n\t\t\tfmt.Print(logoutPromptStyle.Render(fmt.Sprintf(\"Are you sure you want to logout %s? (y/N) \", provider)))\n\t\t\tvar response string\n\t\t\t_, err := fmt.Scanln(&response)\n\t\t\tif err != nil || (response != \"y\" && response != \"Y\" && response != \"yes\" && response != \"Yes\" && response != \"YES\") {\n\t\t\t\tfmt.Println(logoutHeaderStyle.Render(\"Logout cancelled.\"))\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\n\t\tswitch provider {\n\t\tcase \"hyper\":\n\t\t\treturn logoutHyper(c, ws.ID)\n\t\tcase \"copilot\", \"github\", \"github-copilot\":\n\t\t\treturn logoutCopilot(c, ws.ID)\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unknown platform: %s\", provider)\n\t\t}\n\t},\n}\n\nfunc logoutHyper(c *client.Client, wsID string) error {\n\tctx := getLogoutContext()\n\n\tif err := cmp.Or(\n\t\tc.RemoveConfigField(ctx, wsID, config.ScopeGlobal, \"providers.hyper.api_key\"),\n\t\tc.RemoveConfigField(ctx, wsID, config.ScopeGlobal, \"providers.hyper.oauth\"),\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tfmt.Println(logoutHeaderStyle.Render(\"Successfully logged out of Hyper.\"))\n\treturn nil\n}\n","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/cmd/logout.go#L70-L106","documentation":"The logout command determines which provider-specific logout routine to run based on the configured provider string. Only \"hyper\" and the copilot/github variants are supported; any other provider value falls into the default branch and produces this error. It is an explicit unsupported-value guard, not a transport failure.","triggerScenarios":"Running `crush logout` while the workspace config has a provider id other than hyper/copilot/github/github-copilot (e.g. anthropic, openai, gemini, minimax) that has no dedicated logout implementation.","commonSituations":"User logged in with a standard LLM provider (Anthropic/OpenAI/Gemini) and expects `crush logout` to clear it; typo in provider name in config; provider added in a newer version than the installed CLI supports for logout.","solutions":["If you used an API-key provider, remove the key from the config (crush.json / crushrc) or environment variables manually instead of using logout.","Check `crush models` or your config to see which provider is active and whether it supports logout.","Upgrade crush to the latest version in case logout support for your provider was added.","Only use `crush logout` for hyper or copilot/github provider sessions."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Go: verify provider is logout-capable before invoking\nswitch provider {\ncase \"hyper\", \"copilot\", \"github\", \"github-copilot\":\n    // ok\ndefault:\n    fmt.Println(\"provider %q has no logout flow; remove its credentials from config manually\", provider)\n}","typeGuard":null,"tryCatchPattern":"if err := runLogout(provider); err != nil {\n    if strings.HasPrefix(err.Error(), \"unknown platform:\") {\n        // fall back to manual config cleanup\n    }\n    return err\n}","preventionTips":["Only run `crush logout` for hyper/copilot-family providers.","Check the active provider in your config before logging out.","Keep the CLI updated so newly supported providers are recognized.","For API-key providers, manage keys directly in config/env."],"tags":["cli","unsupported-value","logout","provider"],"backgroundTag":"unsupported-provider-value","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}