| 1 | package event |
| 2 | |
| 3 | // WithMessageIdentity associates an attempt's output with the message that |
| 4 | // will be committed to the local transcript. It never modifies provider data. |
| 5 | func WithMessageIdentity(inner Sink, messageID, attemptID string) Sink { |
| 6 | return &messageIdentitySink{AuditForwarder: AuditForwarder{Inner: inner}, messageID: messageID, attemptID: attemptID} |
| 7 | } |
| 8 | |
| 9 | type messageIdentitySink struct { |
| 10 | AuditForwarder |
| 11 | messageID, attemptID string |
| 12 | } |
| 13 | |
| 14 | var _ OptionalSinkCapabilities = (*messageIdentitySink)(nil) |
| 15 | var _ CheckedSink = (*messageIdentitySink)(nil) |
| 16 | |
| 17 | func (s *messageIdentitySink) stamp(e Event) Event { |
| 18 | switch e.Kind { |
| 19 | case Text, Reasoning, Message, ToolDispatch, ToolResult: |
| 20 | if e.MessageID == "" { |
| 21 | e.MessageID = s.messageID |
| 22 | } |
| 23 | if e.AttemptID == "" { |
| 24 | e.AttemptID = s.attemptID |
| 25 | } |
| 26 | } |
| 27 | return e |
| 28 | } |
| 29 | |
| 30 | func (s *messageIdentitySink) Emit(e Event) { s.Inner.Emit(s.stamp(e)) } |
| 31 | func (s *messageIdentitySink) EmitChecked(e Event) error { return EmitChecked(s.Inner, s.stamp(e)) } |
| 32 |