| 1 | package control |
| 2 | |
| 3 | import ( |
| 4 | "encoding/json" |
| 5 | "log/slog" |
| 6 | |
| 7 | "reasonix/internal/event" |
| 8 | "reasonix/internal/session" |
| 9 | ) |
| 10 | |
| 11 | func (c *Controller) terminalSessionEvents(e event.Event, projection session.Projection) ([]session.Event, error) { |
| 12 | var out []session.Event |
| 13 | if diagnostic, err := c.providerDiagnosticEvent(e); err != nil { |
| 14 | // Optional evidence must never prevent required lifecycle facts from committing. |
| 15 | slog.Warn("controller: discarded optional provider diagnostic", "turnId", e.TurnID, "err", err) |
| 16 | } else if diagnostic != nil { |
| 17 | out = append(out, *diagnostic) |
| 18 | } |
| 19 | interactionState := "unavailable" |
| 20 | if e.Cancelled || e.Status == event.TurnInterrupted { |
| 21 | interactionState = "cancelled" |
| 22 | } |
| 23 | out = append(out, session.ClosureEvents(projection, interactionState, "turn ended before recording a result")...) |
| 24 | if e.Recovery != nil && e.Recovery.State == "recovery_required" { |
| 25 | payload, err := json.Marshal(e.Recovery) |
| 26 | if err != nil { |
| 27 | return nil, err |
| 28 | } |
| 29 | out = append(out, session.Event{Kind: "runtime/recovery", Payload: payload}) |
| 30 | } |
| 31 | payload, err := json.Marshal(map[string]any{"status": terminalTurnStatus(e)}) |
| 32 | if err != nil { |
| 33 | return nil, err |
| 34 | } |
| 35 | return append(out, session.Event{Kind: "turn/end", Payload: payload}), nil |
| 36 | } |
| 37 |