返回 DeepSeek-Reasonix
terminal_session_events.go
根目录 / internal / control / terminal_session_events.go
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
37 lines GO