github/copilot-sdk · error

GitHub token provider returned neither a token nor…

Error message

GitHub token provider returned neither a token nor cancellation

What it means

Returned by gitHubTokenAdapter.GetToken when the user-supplied provider function finishes without error but yields a result that is either nil or has a nil Token while not marking Cancelled. The adapter contract requires exactly one of: a token, an explicit cancellation, or an error; anything else is a programming error in the provider.

Solutions

  1. Fix the provider callback to always return a non-nil Token, set Cancelled: true, or return a non-nil error.
  2. Audit all early-return paths in the provider for forgotten token assignment.
  3. Wrap the provider to validate its result before registration.
  4. If cancellation is the intended outcome, explicitly set result.Cancelled = true.

Example fix

// before
func(p args) (result, error) {
    tok := fetchToken(args.Host)
    return &GitHubTokenProviderResult{}, nil // Token never set
}

// after
func(p args) (result, error) {
    tok, err := fetchToken(args.Host)
    if err != nil { return nil, err }
    if tok == nil { return &GitHubTokenProviderResult{Cancelled: true}, nil }
    return &GitHubTokenProviderResult{Token: tok}, nil
}
Defensive patterns

Strategy: validation

Validate before calling

func validateTokenResult(r *GitHubTokenProviderResult) error {
    if r == nil { return errors.New("provider returned nil result") }
    if !r.Cancelled && r.Token == nil { return errors.New("provider returned no token and no cancellation") }
    return nil
}

Type guard

func hasTokenOrCancelled(r *GitHubTokenProviderResult) bool {
    return r != nil && (r.Cancelled || r.Token != nil)
}

Try / catch

if err != nil && strings.Contains(err.Error(), "neither a token nor cancellation") {
    // provider bug; fix callback to return token, Cancelled, or error
}

Prevention

When it happens

Trigger: A registered GitHub token provider callback returns (nil, nil), or returns a GitHubTokenProviderArgs result with Token == nil and Cancelled == false.

Common situations: Provider implementation forgets to populate Token after an async fetch; early return path returns nil without setting Cancelled; provider swallows a failure and returns a zero-value struct.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/7394766950fec9f6. Report an issue: GitHub.

Appendix: source

Thrown at go/client.go:2604

	provider := a.client.gitHubTokenProviders[request.RegistrationID]
	a.client.gitHubTokenProvidersMux.RUnlock()
	if provider == nil {
		return nil, fmt.Errorf("unknown GitHub token provider registration ID %q", request.RegistrationID)
	}

	result, err := provider(GitHubTokenProviderArgs{
		Host:      request.Host,
		SessionID: request.SessionID,
		Reason:    request.Reason,
	})
	if err != nil {
		return nil, err
	}
	if result != nil && result.Cancelled {
		return &rpc.GitHubTokenAcquireResultCancelled{}, nil
	}
	if result == nil || result.Token == nil {
		return nil, fmt.Errorf("GitHub token provider returned neither a token nor cancellation")
	}
	return &rpc.GitHubTokenAcquireResultToken{
		AccessToken: result.Token.AccessToken,
		TokenType:   result.Token.TokenType,
		ExpiresIn:   result.Token.ExpiresIn,
	}, nil
}

// gitHubTelemetryAdapter adapts the OnGitHubTelemetry option to the generated
// rpc.GitHubTelemetryHandler interface.
type gitHubTelemetryAdapter struct {
	callback func(notification *rpc.GitHubTelemetryNotification)
}

func (a *gitHubTelemetryAdapter) Event(request *rpc.GitHubTelemetryNotification) error {
	defer func() { recover() }() // Ignore handler panics
	a.callback(request)
	return nil

View on GitHub (pinned to cd8cf15dc3)