{"record":{"id":"95934aae0fe94fb2","repo":"charmbracelet/crush","slug":"crush-was-unable-to-fetch-updated-information-from","errorCode":null,"errorMessage":"Crush was unable to fetch updated information from Hyper: %w","messagePattern":"Crush was unable to fetch updated information from Hyper: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/config/provider.go","lineNumber":230,"sourceCode":"\t\t\tvar refresher func(context.Context) error\n\t\t\tif len(opts) > 0 {\n\t\t\t\trefresher = opts[0]\n\t\t\t}\n\t\t\thyperSyncer.Init(realHyperClient{\n\t\t\t\tbaseURL:      hyper.BaseURL(),\n\t\t\t\tresolveKey:   func() string { return resolveHyperAPIKey(cfgSnapshot) },\n\t\t\t\trefreshToken: refresher,\n\t\t\t}, path, autoupdate)\n\n\t\t\t// As above: keep whatever provider we were handed. The syncer\n\t\t\t// already falls back to the cached or embedded copy, so an\n\t\t\t// error here means \"could not refresh\", not \"no Hyper\". This\n\t\t\t// matters more than for other providers because Hyper's\n\t\t\t// endpoint and model list live in the catalog rather than in\n\t\t\t// the user's config: dropping it signs a logged-in user out.\n\t\t\titem, err := hyperSyncer.Get(ctx)\n\t\t\tif err != nil {\n\t\t\t\thyperErr = fmt.Errorf(\"Crush was unable to fetch updated information from Hyper: %w\", err) //nolint:staticcheck\n\t\t\t}\n\t\t\thyperProvider = item\n\t\t})\n\n\t\twg.Wait()\n\n\t\tif hyperProvider.ID != \"\" {\n\t\t\tproviderList = append([]catwalk.Provider{hyperProvider}, slices.Collect(providers.Seq())...)\n\t\t} else {\n\t\t\tproviderList = slices.Collect(providers.Seq())\n\t\t}\n\t\tproviderErr = errors.Join(catwalkErr, hyperErr)\n\t})\n\treturn providerList, providerErr\n}\n\n// UpdateProviderInList replaces a provider in the memoized provider list\n// returned by Providers(). This is used after re-fetching a single","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/config/provider.go#L212-L248","documentation":"Thrown when the Hyper provider catalog syncer fails to refresh Hyper's endpoint and model list. Unlike catwalk, Hyper's endpoint and models live only in the catalog, so a failed refresh would sign a logged-in user out of Hyper; the error preserves the underlying cause instead of silently dropping the provider.","triggerScenarios":"hyperSyncer.Get(ctx) returns an error during Init/provider refresh: network failure, Hyper catalog endpoint unreachable, invalid response, or authentication failure while fetching the catalog.","commonSituations":"User is logged into Hyper and the machine goes offline or behind a blocking proxy; Hyper's catalog service is temporarily down; DNS/TLS problems.","solutions":["Check connectivity to Hyper's endpoint and retry.","Fix proxy/firewall/DNS settings blocking the Hyper catalog host.","Re-run `crush` once the network is available so the refresh succeeds.","If persistent, check Hyper's service status or re-login via `crush login`."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// probe Hyper's catalog endpoint before starting\nresp, err := http.Get(hyperCatalogURL)\nif err != nil || resp.StatusCode != 200 { /* warn user */ }","typeGuard":null,"tryCatchPattern":"item, err := hyperSyncer.Get(ctx)\nif err != nil {\n    log.Warn(err) // keep previous hyperProvider to avoid logout\n}","preventionTips":["Keep a previously stored Hyper provider so a failed refresh does not sign you out","Monitor connectivity/proxy settings on machines using Hyper","Retry refresh on next startup rather than treating it as fatal"],"tags":["network","hyper","providers"],"backgroundTag":"provider-catalog-fetch-failed","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}