opencode icon indicating copy to clipboard operation
opencode copied to clipboard

feat: Migrate synthetic message detection to metadata-based approach

Open ananas-viber opened this issue 14 hours ago • 1 comments

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:

  • #8030 - Original report of excessive premium request consumption
  • #8700 - Describes synthetic user messages burning premium requests (same root cause)
  • #8721 - Pattern-matching fix (immediate solution)

ananas-viber avatar Jan 16 '26 00:01 ananas-viber