chenhg5/cc-connect · error
discord: send preview
Error message
discord: send preview: %w
What it means
After resolving a valid channel, SendPreviewStart sends the preview message with ChannelMessageSendComplex; failure there is wrapped as this error. It means the Discord API refused or failed the preview message send. The underlying discordgo error identifies the concrete cause.
Solutions
- Inspect the wrapped Discord error code and fix the root cause (permissions, channel existence, payload)
- Validate that the channel/thread is active before starting a preview stream
- Truncate/limit preview content to Discord's message limits
- Retry with backoff on 429/5xx errors
Example fix
// before
sent, err := p.session.ChannelMessageSendComplex(chID, msg)
// after
sent, err := p.session.ChannelMessageSendComplex(chID, msg)
if err != nil && isRetryable(err) { sent, err = retryWithBackoff(...) } Defensive patterns
Strategy: retry
Validate before calling
ch, err := p.session.Channel(channelID)
if err != nil { return fmt.Errorf("target channel unavailable: %w", err) }
if ch.Type == discordgo.ChannelTypeGuildPublicThread && ch.ThreadMetadata.Archived {
return errors.New("thread archived; cannot send preview")
} Try / catch
handle, err := p.SendPreviewStart(ctx, rctx, content)
if err != nil && isRetryable(err) {
time.Sleep(backoff)
handle, err = p.SendPreviewStart(ctx, rctx, content)
}
return handle, err Prevention
- Check channel/thread existence and archive state before streaming
- Truncate preview content to Discord message limits
- Back off on 429/5xx responses
- Monitor bot permissions in target channels
When it happens
Trigger: The target channel no longer exists or the bot lacks SEND_MESSAGES/VIEW_CHANNEL; the message payload is rejected (e.g. empty or too long content); network/API failure or 429 rate limit during preview streaming start.
Common situations: Thread archived or deleted between session creation and preview; permissions tightened mid-session; very long agent output triggering payload limits; Discord API outage.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- discord: send channel buttons
- discord: invalid preview handle type %T
- discord: send button followup
- discord: send fallback
- discord: send file fallback
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/6d29d756c0bc35c6.
Report an issue: GitHub.
Appendix: source
Thrown at platform/discord/discord.go:1270
messageID string
}
// SendPreviewStart sends a new message and returns a handle for subsequent edits.
func (p *Platform) SendPreviewStart(ctx context.Context, rctx any, content string) (any, error) {
var channelID string
switch rc := rctx.(type) {
case replyContext:
channelID = rc.targetChannelID()
case *interactionReplyCtx:
channelID = rc.channelID
default:
return nil, fmt.Errorf("discord: invalid reply context type %T", rctx)
}
msg := buildDiscordPreviewMessage(content)
sent, err := p.session.ChannelMessageSendComplex(channelID, msg)
if err != nil {
return nil, fmt.Errorf("discord: send preview: %w", err)
}
return &discordPreviewHandle{channelID: channelID, messageID: sent.ID}, nil
}
// UpdateMessage edits an existing message identified by previewHandle.
func (p *Platform) UpdateMessage(ctx context.Context, previewHandle any, content string) error {
h, ok := previewHandle.(*discordPreviewHandle)
if !ok {
return fmt.Errorf("discord: invalid preview handle type %T", previewHandle)
}
_, err := p.session.ChannelMessageEditComplex(buildDiscordPreviewEdit(h.channelID, h.messageID, content))
if err != nil {
return fmt.Errorf("discord: edit message: %w", err)
}
return nil
}
// DeletePreviewMessage removes the preview message so the final response canView on GitHub (pinned to 4000b2338a)