fix(agent): ACP-Output in TUI lesbarer machen (Chat zusammenfügen, Tool-Calls gruppieren) #25

Merged
frank merged 1 commit from agent/issue-20-tui-acp-output-lesbarer-machen-chat-zusa into main 2026-07-12 12:41:50 +02:00
Owner

Summary

  • Streaming-agent_message_chunk-Events werden zu zusammenhängendem Text aggregiert; nur explizite \n erzeugen Zeilenumbrüche.
  • tool_call/tool_update mit gleicher tool_id werden zu einem Eintrag zusammengeführt; Status und Titel aktualisieren sich in-place.
  • RunEventsPlainText nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe.

Test plan

  • go test ./internal/agent/...
  • Regression TestRunDetailLayoutRegression (keine kurzen Chunk-Zeilen mehr)
  • Manuell: forge agent watch --tui mit cursor-agent im PR-Modus — Chat fließt, Tool-Calls erscheinen einmal pro UUID

Closes #20

## Summary - Streaming-`agent_message_chunk`-Events werden zu zusammenhängendem Text aggregiert; nur explizite `\n` erzeugen Zeilenumbrüche. - `tool_call`/`tool_update` mit gleicher `tool_id` werden zu einem Eintrag zusammengeführt; Status und Titel aktualisieren sich in-place. - `RunEventsPlainText` nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe. ## Test plan - [x] `go test ./internal/agent/...` - [x] Regression `TestRunDetailLayoutRegression` (keine kurzen Chunk-Zeilen mehr) - [ ] Manuell: `forge agent watch --tui` mit `cursor-agent` im PR-Modus — Chat fließt, Tool-Calls erscheinen einmal pro UUID Closes #20
fix(agent): aggregate ACP chunks and tool updates in TUI output
All checks were successful
CI / test (pull_request) Successful in 20s
CI / race (pull_request) Successful in 20s
fdb832f1a4
Merge streaming message/thought chunks and in-place tool status updates
so the run detail viewport stays readable during long agent sessions.

Co-authored-by: Cursor <cursoragent@cursor.com>
Author
Owner

🔗 Linked to issue #20. Babysitting CI until green…

🔗 Linked to issue #20. Babysitting CI until green…
Author
Owner

forge agent finished implementation

  • Commit: fix(agent): aggregate ACP chunks and tool updates in TUI output
  • Pull request: #25
  • Next: waiting for CI / babysitting fixes if needed
internal/agent/acp_events.go | 96 +++++++++++++++++++++++++++++++++++++++++++-
 internal/agent/acp_test.go   | 66 ++++++++++++++++++++++++++++++
 2 files changed, 161 insertions(+), 1 deletion(-)
Agent output (tail)
## Zusammenfassung
ACP-Events werden jetzt vor dem Rendern aggregiert:
- **Chat-Chunks:** Aufeinanderfolgende `message`- und `thought`-Events mit gleicher Rolle werden zu einem Absatz zusammengefügt; nur echte `\n` im Content erzeugen eine neue Zeile.
- **Tool-Calls:** Updates mit gleicher `tool_id` aktualisieren den bestehenden Eintrag (Titel/Status), statt neue Zeilen anzuhängen.
- **`RunEventsPlainText`** nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe.
Geänderte Dateien: `internal/agent/acp_events.go`, `internal/agent/acp_test.go`
TODO_DONE: Fließender Agent-Chat ohne Chunk-bedingte Kurzzeilen; echte `\n` bleiben erhalten.
TODO_DONE: Mehrere Updates derselben `tool_id` erscheinen als ein Eintrag (Status wechselt sichtbar).
TODO_DONE: Log bleibt bei typischen Runs (viele Tool-Calls) deutlich kürzer und scanbarer.
TODO_DONE: Bestehende TUI-Keybindings und Viewport-Verhalten unverändert nutzbar.
PR_TITLE: fix(agent): ACP-Output in TUI lesbarer machen (Chat zusammenfügen, Tool-Calls gruppieren)
PR_BODY:
## Summary
- Streaming-`agent_message_chunk`-Events werden zu zusammenhängendem Text aggregiert; nur explizite `\n` erzeugen Zeilenumbrüche.
- `tool_call`/`tool_update` mit gleicher `tool_id` werden zu einem Eintrag zusammengeführt; Status und Titel aktualisieren sich in-place.
- `RunEventsPlainText` nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe.
## Test plan
- [x] `go test ./internal/agent/...`
- [x] Regression `TestRunDetailLayoutRegression` (keine kurzen Chunk-Zeilen mehr)
- [ ] Manuell: `forge agent watch --tui` mit `cursor-agent` im PR-Modus — Chat fließt, Tool-Calls erscheinen einmal pro UUID
✅ **forge agent finished implementation** - Commit: `fix(agent): aggregate ACP chunks and tool updates in TUI output` - Pull request: https://repository.hildebrandt.io/frank/forgecli/pulls/25 - Next: waiting for CI / babysitting fixes if needed ``` internal/agent/acp_events.go | 96 +++++++++++++++++++++++++++++++++++++++++++- internal/agent/acp_test.go | 66 ++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) ``` <details><summary>Agent output (tail)</summary> ``` ## Zusammenfassung ACP-Events werden jetzt vor dem Rendern aggregiert: - **Chat-Chunks:** Aufeinanderfolgende `message`- und `thought`-Events mit gleicher Rolle werden zu einem Absatz zusammengefügt; nur echte `\n` im Content erzeugen eine neue Zeile. - **Tool-Calls:** Updates mit gleicher `tool_id` aktualisieren den bestehenden Eintrag (Titel/Status), statt neue Zeilen anzuhängen. - **`RunEventsPlainText`** nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe. Geänderte Dateien: `internal/agent/acp_events.go`, `internal/agent/acp_test.go` TODO_DONE: Fließender Agent-Chat ohne Chunk-bedingte Kurzzeilen; echte `\n` bleiben erhalten. TODO_DONE: Mehrere Updates derselben `tool_id` erscheinen als ein Eintrag (Status wechselt sichtbar). TODO_DONE: Log bleibt bei typischen Runs (viele Tool-Calls) deutlich kürzer und scanbarer. TODO_DONE: Bestehende TUI-Keybindings und Viewport-Verhalten unverändert nutzbar. PR_TITLE: fix(agent): ACP-Output in TUI lesbarer machen (Chat zusammenfügen, Tool-Calls gruppieren) PR_BODY: ## Summary - Streaming-`agent_message_chunk`-Events werden zu zusammenhängendem Text aggregiert; nur explizite `\n` erzeugen Zeilenumbrüche. - `tool_call`/`tool_update` mit gleicher `tool_id` werden zu einem Eintrag zusammengeführt; Status und Titel aktualisieren sich in-place. - `RunEventsPlainText` nutzt dieselbe Aggregation für konsistente Post-Run-Ausgabe. ## Test plan - [x] `go test ./internal/agent/...` - [x] Regression `TestRunDetailLayoutRegression` (keine kurzen Chunk-Zeilen mehr) - [ ] Manuell: `forge agent watch --tui` mit `cursor-agent` im PR-Modus — Chat fließt, Tool-Calls erscheinen einmal pro UUID ``` </details>
Author
Owner

☑️ ToDos checked off

  • Fließender Agent-Chat ohne Chunk-bedingte Kurzzeilen; echte \n bleiben erhalten.
  • Mehrere Updates derselben tool_id erscheinen als ein Eintrag (Status wechselt sichtbar).
  • Log bleibt bei typischen Runs (viele Tool-Calls) deutlich kürzer und scanbarer.
  • Bestehende TUI-Keybindings und Viewport-Verhalten unverändert nutzbar.
☑️ **ToDos checked off** - [x] Fließender Agent-Chat ohne Chunk-bedingte Kurzzeilen; echte `\n` bleiben erhalten. - [x] Mehrere Updates derselben `tool_id` erscheinen als ein Eintrag (Status wechselt sichtbar). - [x] Log bleibt bei typischen Runs (viele Tool-Calls) deutlich kürzer und scanbarer. - [x] Bestehende TUI-Keybindings und Viewport-Verhalten unverändert nutzbar.
frank merged commit 1145d8d2e8 into main 2026-07-12 12:41:50 +02:00
frank deleted branch agent/issue-20-tui-acp-output-lesbarer-machen-chat-zusa 2026-07-12 12:41:50 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
frank/forgecli!25
No description provided.