chenhg5/cc-connect · error
discord: send preview: %w
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.
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)
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: %w
- resolve channel %s: %w
- discord: send fallback: %w
- discord: send: %w
- discord: send image fallback: %w
AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06).
Data as JSON: /api/errors/6d29d756c0bc35c6.
Report an issue: GitHub.