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
- Fix the provider callback to always return a non-nil Token, set Cancelled: true, or return a non-nil error.
- Audit all early-return paths in the provider for forgotten token assignment.
- Wrap the provider to validate its result before registration.
- 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
- Audit every return path of the provider callback for a token, explicit cancellation, or error.
- Wrap providers with a validating decorator before registration.
- Never return zero-value result structs from async fetch paths.
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
- missing GitHub token acquire request
- unknown GitHub token provider registration ID
- telemetry is not supported with…
- on_permission_request must be callable when provided.
- SessionFS.InitialWorkingDirectory is required
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 nilView on GitHub (pinned to cd8cf15dc3)