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
-
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
-
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:
Summary
Currently,
copilot.tsdetects synthetic user messages (compaction, tool attachments, subtasks) via regex pattern matching on message text. This works but has maintenance coupling.Current State
synthetic: booleanalready exists onTextPart(message-v2.ts:64)toModelMessage()does not propagate this flag to the finalUIMessageProposed Change
In
message-v2.tstoModelMessage():providerMetadata: { synthetic: true }for user text parts whenpart.synthetic === trueIn
copilot.ts:part.providerMetadata?.synthetic === trueinstead of pattern matchingSYNTHETIC_PATTERNSarrayBenefits
Context
This is a follow-up to #8721 which implements the pattern-matching approach as a minimal fix.
Related issues: