drainAndEmitSteered drains all messages from the steer queue and injects them into the session as individual user messages. When multiple messages are drained, a "\n" is appended to the content of every non-last message. Some chat templates concatenate consecutive user messages without a separator b
(ctx context.Context, sess *session.Session, a *agent.Agent, events EventSink)
| 90 | // Returns drained=true with messageCountBefore set when any messages |
| 91 | // were drained and emitted; otherwise drained=false. |
| 92 | func (r *LocalRuntime) drainAndEmitSteered(ctx context.Context, sess *session.Session, a *agent.Agent, events EventSink) steerResult { |
| 93 | steered := r.steerQueue.Drain(ctx) |
| 94 | if len(steered) == 0 { |
| 95 | return steerResult{} |
| 96 | } |
| 97 | messageCountBefore := len(sess.OwnMessages()) |
| 98 | contents := make([]string, 0, len(steered)) |
| 99 | for i, sm := range steered { |
| 100 | contents = append(contents, sm.Content) |
| 101 | if i < len(steered)-1 { |
| 102 | sm = appendNewlineToQueuedMessage(sm) |
| 103 | } |
| 104 | r.appendSteerAndEmit(sess, sm, events) |
| 105 | } |
| 106 | stop, stopMsg, ctxMsgs := r.executeUserSteeringMessagesSubmitHooks(ctx, sess, a, contents, events) |
| 107 | return steerResult{ |
| 108 | drained: true, |
| 109 | messageCountBefore: messageCountBefore, |
| 110 | stop: stop, |
| 111 | stopMsg: stopMsg, |
| 112 | contextMsgs: ctxMsgs, |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | // steerResult is the outcome of a drainAndEmitSteered call: whether any |
| 117 | // messages were drained, the pre-drain message count (for |