Жизненный цикл хода
Полный путь одного хода (turn) агента: от TurnStart до TurnEnd.
События
TurnStartEvent {sessionID, turnNumber}
Издатель: Agent (Run, loop.go:69)
Подписчики:
- TUI →
handleTurnStart→TurnActive = true, сброс stream buffers - Manager →
StartStatusListener→SetState(SessionRunning)
TurnEndEvent {sessionID, turnNumber, stopReason, usage}
Издатель: Agent (finishTurn, loop.go:244)
Подписчики:
- TUI →
handleTurnEnd→TurnActive = false, finalize assistant message - Manager →
StartStatusListener→SetState(SessionIdle)
StreamingTokenEvent {sessionID, textDelta, kind}
Издатель: LLM provider (через makeStreamCallback)
Подписчик: TUI → handleStreamingToken → накапливает в StreamBuf
kind: "" / "text" — обычный вывод, "thinking" — reasoning (dim/italic)
ErrorEvent {sessionID, err}
Издатель: Agent при стрим-ошибке без возможности autorcompact
Подписчик: TUI → handleError → сообщение об ошибке в чате
RetryEvent {sessionID, attempt, delay, until, err}
Издатель: LLM retry layer (retry.go)
Подписчик: TUI → handleRetry → показывает countdown до retry
CompactionEvent {sessionID, active, done, contextTokens, message, isError}
Издатель: Agent при auto-compact (tryAutoCompact)
Подписчик: TUI → handleCompaction → индикатор компактизации
AbortRequestEvent {sessionID}
Издатель: TUI (onAbort), сабагент (при отмене родительского контекста)
Подписчик: Agent → слушает в начале Run, вызывает cancelTurn()
AskUserEvent {sessionID, questions[]}
Издатель: ask_user tool
Подписчик: TUI → handleAskUser → интерактивный picker
StatsEvent {sessionID, name, usage, contextTokens, ...}
Издатель: Agent (StatsTracker) после каждой итерации
Подписчик: TUI → handleStats → обновление сайдбара
MessageStatsEvent {sessionID, outputTokens, inputTokens, duration}
Издатель: Agent после каждого LLM ответа
Подписчик: TUI → handleMessageStats → токены на сообщении
Полный цикл одного хода
sequenceDiagram
participant TUI
participant A as Agent.Run
participant LLM
participant T as Tool
A->>TUI: TurnStart
Note over TUI: TurnActive=true
loop Итерации (stream → tools → repeat)
A->>LLM: Stream(request)
loop Токены
LLM-->>A: delta
A->>TUI: StreamingToken(delta)
end
A->>TUI: MessageStats(tokens)
alt Есть tool calls
A->>TUI: ToolCall
alt Требует approval
A->>TUI: ToolApprovalRequest
TUI->>A: ToolApprovalResponse
end
A->>T: Execute
T-->>A: Result
A->>TUI: ToolResult
else Без tools
A->>A: drainPending (новые сообщения?)
end
end
A->>TUI: TurnEnd{stopReason, usage}
Note over TUI: TurnActive=false, finalize
Прерывание (abort)
sequenceDiagram
participant TUI
participant A as Agent.Run
participant LLM
Note over A: Стрим идёт...
TUI->>A: AbortRequest{sessionID}
Note over A: abortCh ← signal
A->>A: cancelTurn()
Note over A: turnCtx cancelled
LLM-->>A: stream error (ctx cancelled)
A->>A: persistPartial
A->>TUI: TurnEnd{stopReason: aborted}