fix(mac): richer tool panels, settled tool status, markdown blocks, composer polish - #16
Merged
Merged
Conversation
…omposer polish Five chat-surface fixes: - Tool rows now carry the wire itemType through ActivityRows into TimelineItem.toolEvent(kind:). Rows show a kind glyph plus an inline preview (the command, the file path), and the disclosure body renders structure: a real diff (path header, +/- counted colored lines) for file changes parsed from Edit/Write/MultiEdit detail JSON, a clean command line for shell runs. New ParsedToolDetail parser in T3Kit degrades truncated/unrecognized detail to plain text. - Stuck "pending" tool rows: upsertTimelineItem folds uncorrelated completions into a running row across interleaved reasoning rows (previously only when adjacent), and rows still marked running render as done once the thread settles (idle/archived -> check, error -> x), mirroring the web client's turn-settled rule. - Assistant text no longer renders as a blob: SwiftUI Text ignores PresentationIntent, so prose is now split into block-level pieces (paragraphs, headings, bullet/ordered lists, quotes, rules) each laid out as its own view with inline-only markdown per block. - Composer gets breathing room from the window edges and bottom; timeline gains matching horizontal padding. - Composer placeholder aligns with the typed-text origin (NSTextView has no top inset) instead of sitting 8pt low. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6668d67e3f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- Settled fallback no longer claims success: a row still running when the
thread stops (which includes interrupted/stopped turns folded into idle)
now renders a neutral outline check in secondary tint instead of the
green success fill; error threads get the same neutral mark rather than
a fabricated failure.
- Completion coalescing is bounded to the current turn: the backward
search folding uncorrelated completions into a running row stops at a
user message or checkpoint, so a same-name/same-detail invocation in a
later turn can no longer merge into a stale stuck row.
- Diff parsing is gated by item type: fileChange conversion requires
itemType == "file_change" (or a known edit tool name when no item type
arrived), and command extraction requires command_execution — an MCP
tool whose input happens to contain path/content or command fields
stays plain text.
- File edits and commands parse from the untruncated payload.data
({toolName, input} passes through ingestion verbatim) instead of the
~180-char-truncated payload.detail, so real-world edits actually get
the diff body instead of falling back to a clipped blob.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SergeSerb2
added a commit
that referenced
this pull request
Jul 5, 2026
Main's tool-row rework (PR #16) already ships a richer header preview (kind-aware font, parse cache, middle truncation), so its version wins and this branch's simpler detailPreview is dropped. Scroll logic keeps this branch's phase-gated pinning; the changeToken signature it replaced is removed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Five chat-surface fixes for the native macOS app.
Tool-call panels are now visual
itemTypeflows throughActivityRows→TimelineItem.toolEvent(kind:).ParsedToolDetailparser (T3Kit) turns server detail strings into structure:Edit/Write/MultiEdit: {json}→ file path + old/new strings,Bash: cmd→ command line.Stuck "pending" command rows
upsertTimelineItemnow folds uncorrelated completion events into their running row across interleaved reasoning rows (previously only when strictly adjacent — anything in between left the row spinning forever).Assistant text formatting
TextignoresPresentationIntent, so full-markdown parsing collapsed paragraphs/headings/lists into one blob.Composer spacing + placeholder
Verification
swift buildclean; 103 tests pass (11 new:ToolDetailParsingTests, updatedActivityRowTests).🤖 Generated with Claude Code