feat(agent): markdown rendering, spacing fixes, and API endpoint update#849
Merged
feat(agent): markdown rendering, spacing fixes, and API endpoint update#849
Conversation
The thinking spinner and the Chunk/ToolCallReady handlers were each unconditionally emitting a `println!()`, stacking multiple blank lines between user input and the agent's response. Drop the unconditional newline before the initial spinner, and only emit a leading newline in the Chunk/ToolCallReady handlers when a spinner wasn't just cleared (since `finish_and_clear` already leaves the cursor on a blank line). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Stream raw text during agent responses, then re-render each block with termimad on ToolCallReady / WorkflowCompleted for GitHub-style markdown - Track block start position via crossterm cursor::position so the re-render only erases the current block, not prior tool output - Render a "✓ Done" / "✗ Tool failed" badge after each tool call so the indicator stays visible once the spinner finishes - Insert a blank line between consecutive agent responses within a turn; keep the tool spinner directly attached to the preceding text - Update chat endpoint from /api/v1/chat to /api/v1/agent - Refactor: bundle streaming state into HumanRenderer, extract stream_human / stream_json / tool_badge helpers to drop ~60 lines of duplication between run_single_shot and run_repl Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
m-abdelwahab
approved these changes
Apr 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
termimadonce streaming completes (onToolCallReady/WorkflowCompleted); text still streams raw in real-time✓ Done/✗ Tool failedbadge after each tool call/api/v1/chatto/api/v1/agentto match the new backboard routeHumanRenderer, extractstream_human/stream_json/tool_badgehelpers (drops ~60 lines of duplication betweenrun_single_shotandrun_repl)Test plan
railway agent— single-turn response renders as markdown after streaming completesrailway agent— multi-tool-call turn shows✓ Doneafter each tool and a blank line before the nextRailway Agent:headerrailway agent -p "…"— single-shot human and--jsonoutput both workrailway agent --jsonin REPL — JSON output still capturesthread_idfor continuation🤖 Generated with Claude Code