Skip to content

feat: Migrate synthetic message detection to metadata-based approach #8766

@ananas-viber

Description

@ananas-viber

Summary

Currently, copilot.ts detects synthetic user messages (compaction, tool attachments, subtasks) via regex pattern matching on message text. This works but has maintenance coupling.

Current State

  • synthetic: boolean already exists on TextPart (message-v2.ts:64)
  • It's already being set in various places (prompt.ts:1374, etc.)
  • BUT toModelMessage() does not propagate this flag to the final UIMessage

Proposed Change

  1. In message-v2.ts toModelMessage():

    • Pass providerMetadata: { synthetic: true } for user text parts when part.synthetic === true
    • Add same metadata for compaction/subtask generated messages
  2. In copilot.ts:

    • Check part.providerMetadata?.synthetic === true instead of pattern matching
    • Remove SYNTHETIC_PATTERNS array

Benefits

  • Type-safe detection (no string coupling)
  • Compile-time enforcement if field is renamed
  • Cleaner architecture
  • Eliminates theoretical "hackability" of pattern matching

Context

This is a follow-up to #8721 which implements the pattern-matching approach as a minimal fix.

Related issues:

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions