chenhg5/cc-connect · error

platform %q does not support proactive messaging (timer)

Error message

platform %q does not support proactive messaging (timer)

What it means

Thrown when the resolved platform does not implement the optional ReplyContextReconstructor interface, which is required to rebuild a reply context for proactive (timer) messages. Normal reply flows work, but the engine cannot originate a new message without that capability.

Source

Thrown at core/engine.go:1709

	// Multi-workspace fallback: strip workspace prefix from session key.
	if targetPlatform == nil {
		for _, p := range e.platforms {
			needle := ":" + p.Name() + ":"
			if idx := strings.Index(sessionKey, needle); idx >= 0 {
				targetPlatform = p
				platformName = p.Name()
				sessionKey = sessionKey[idx+1:]
				break
			}
		}
	}
	if targetPlatform == nil {
		return fmt.Errorf("platform %q not found for session %q", platformName, sessionKey)
	}

	rc, ok := targetPlatform.(ReplyContextReconstructor)
	if !ok {
		return fmt.Errorf("platform %q does not support proactive messaging (timer)", platformName)
	}

	runSessionKey := sessionKey
	var replyCtx any
	var err error
	if !job.Mute {
		if resolver, ok := targetPlatform.(CronReplyTargetResolver); ok {
			resolvedSessionKey, resolvedReplyCtx, err := resolver.ResolveCronReplyTarget(sessionKey, timerRunTitle(job))
			if err != nil {
				if !errors.Is(err, ErrNotSupported) {
					return fmt.Errorf("resolve timer reply target: %w", err)
				}
			} else {
				if resolvedSessionKey != "" {
					runSessionKey = resolvedSessionKey
				}
				if resolvedReplyCtx != nil {
					replyCtx = resolvedReplyCtx

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Implement ReplyContextReconstructor on the platform adapter
  2. Switch the timer job to a platform that supports proactive messaging
  3. Check the platform adapter version and upgrade to one with proactive support

Example fix

// before
func (p *Platform) Stop() {}
// after
func (p *Platform) ReconstructReplyContext(sessionKey string) (any, error) { return p.rebuildCtx(sessionKey) }
Defensive patterns

Strategy: type-guard

Validate before calling

if _, ok := platform.(core.ReplyContextReconstructor); !ok { /* choose another platform for timers */ }

Type guard

rc, ok := targetPlatform.(core.ReplyContextReconstructor); if !ok { return fmt.Errorf("platform %q lacks proactive support", name) }

Try / catch

if err := engine.ScheduleTimer(job); err != nil && strings.Contains(err.Error(), "proactive messaging") { fallbackToManualReminder() }

Prevention

When it happens

Trigger: A cron/timer job targets a platform adapter that lacks ReplyContextReconstructor implementation.

Common situations: Using a minimal/custom platform adapter for scheduled messages; older platform plugin versions predating the ReplyContextReconstructor capability.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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