chenhg5/cc-connect · error

tmux: invalid prompt_pattern

Error message

tmux: invalid prompt_pattern %q: %w

What it means

newTmuxSession compiles the configured prompt_pattern as a regular expression. If regexp.Compile fails, the constructor cancels its context and returns 'tmux: invalid prompt_pattern %q: %w'. This is a fail-fast config validation error for the tmux agent's prompt-detection regex.

Solutions

  1. Read the wrapped error for the exact character offset of the syntax problem
  2. Test the pattern in Go RE2 (all Go regexp is RE2: no backreferences, no lookaround)
  3. Fix prompt_pattern in config.toml — simplify or rewrite using RE2-compatible syntax

Example fix

// before (config.toml): lookbehind not supported by RE2
prompt_pattern = "(?<=\$ )$"
// after
prompt_pattern = "^\$ $"
Defensive patterns

Strategy: validation

Validate before calling

// validate before constructing the session
if _, err := regexp.Compile(cfg.PromptPattern); err != nil {
    return fmt.Errorf("bad prompt_pattern: %w", err)
}

Try / catch

// Go
sess, err := agent.StartSession(ctx, opts)
if err != nil && strings.Contains(err.Error(), "invalid prompt_pattern") {
    slog.Error("fix prompt_pattern in config.toml (RE2 syntax)", "err", err)
}

Prevention

When it happens

Trigger: Starting a tmux agent session (StartSession) with a prompt_pattern option that is not a valid RE2 expression — e.g. unbalanced parentheses, invalid escape like '\d' with a typo, or a trailing operator like 'a+'.*','+a'.

Common situations: User copies a PCRE-only pattern (lookbehind/lookahead, \d in wrong context) into config.toml; hand-edited regex with a missing bracket; pattern written for grep -P syntax rather than Go RE2.

Related errors


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

Appendix: source

Thrown at agent/tmux/session.go:45

	cancel          context.CancelFunc
	alive           atomic.Bool
	closeOnce       sync.Once

	mu              sync.Mutex
	pollCancel      context.CancelFunc
	baselineCapture string // full captureScrollback output at the time of the last Send()
}

func newTmuxSession(ctx context.Context, target, sessionID, promptPattern string, pollInt time.Duration, stripInputBlock bool, stripPatternStrs []string, workDir string) (*tmuxSession, error) {
	sessCtx, cancel := context.WithCancel(ctx)

	var pat *regexp.Regexp
	if promptPattern != "" {
		var err error
		pat, err = regexp.Compile(promptPattern)
		if err != nil {
			cancel()
			return nil, fmt.Errorf("tmux: invalid prompt_pattern %q: %w", promptPattern, err)
		}
	}

	var stripPats []*regexp.Regexp
	for _, s := range stripPatternStrs {
		re, err := regexp.Compile(s)
		if err != nil {
			cancel()
			return nil, fmt.Errorf("tmux: invalid strip_pattern %q: %w", s, err)
		}
		stripPats = append(stripPats, re)
	}

	s := &tmuxSession{
		target:          target,
		sessionID:       sessionID,
		workDir:         workDir,
		promptPat:       pat,

View on GitHub (pinned to 4000b2338a)