chore: add custom error and message for hyper unauthorized (#2577)

Andrey Nering created

Change summary

internal/agent/agent.go          | 2 ++
internal/agent/hyper/provider.go | 7 +++++--
internal/ui/model/ui.go          | 2 +-
3 files changed, 8 insertions(+), 3 deletions(-)

Detailed changes

internal/agent/agent.go 🔗

@@ -529,6 +529,8 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy
 			currentAssistant.AddFinish(message.FinishReasonCanceled, "User canceled request", "")
 		} else if isPermissionErr {
 			currentAssistant.AddFinish(message.FinishReasonPermissionDenied, "User denied permission", "")
+		} else if errors.Is(err, hyper.ErrUnauthorized) {
+			currentAssistant.AddFinish(message.FinishReasonError, "Unauthorized", `Authentication with Hyper failed. Please run "crush auth" to re-authenticate.`)
 		} else if errors.Is(err, hyper.ErrNoCredits) {
 			url := hyper.BaseURL()
 			link := linkStyle.Hyperlink(url, "id=hyper").Render(url)

internal/agent/hyper/provider.go 🔗

@@ -69,7 +69,10 @@ var BaseURL = sync.OnceValue(func() string {
 	return cmp.Or(os.Getenv("HYPER_URL"), defaultBaseURL)
 })
 
-var ErrNoCredits = errors.New("you're out of credits")
+var (
+	ErrNoCredits    = errors.New("you're out of credits")
+	ErrUnauthorized = errors.New("unauthorized")
+)
 
 type options struct {
 	baseURL string
@@ -183,7 +186,7 @@ func (m *languageModel) Stream(ctx context.Context, call fantasy.Call) (fantasy.
 		return nil, toProviderError(resp, retryAfter(resp))
 	case http.StatusUnauthorized:
 		_ = resp.Body.Close()
-		return nil, toProviderError(resp, "")
+		return nil, ErrUnauthorized
 	case http.StatusPaymentRequired:
 		_ = resp.Body.Close()
 		return nil, ErrNoCredits

internal/ui/model/ui.go 🔗

@@ -2964,7 +2964,7 @@ func (m *UI) sendMessage(content string, attachments ...message.Attachment) tea.
 			}
 			return util.InfoMsg{
 				Type: util.InfoTypeError,
-				Msg:  fmt.Sprintf("Failed to run agent: %v", err),
+				Msg:  fmt.Sprintf("%v", err),
 			}
 		}
 		return nil