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 can

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Inspect the wrapped Discord error code and fix the root cause (permissions, channel existence, payload)
  2. Validate that the channel/thread is active before starting a preview stream
  3. Truncate/limit preview content to Discord's message limits
  4. 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

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


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/6d29d756c0bc35c6. Report an issue: GitHub.