feat(frontend): consecutive tool call grouping & chat UI improvements#30
Conversation
Add node:test coverage for inline text/phase/error/todos label logic.
This reverts commit 9e4ee24.
Add padding-top to h1 for better visual separation from preceding content. Tighten list item line-height from 1.65 to 1.45 and adjust margins/padding to match the compact prototype spacing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Transform **bold-only** lines in reasoning summary content to markdown h3 headings with dedicated typography: 0.9rem/500 weight for headings, compact line-height (1.4), and clear section spacing (20px paragraph margin-bottom). Remove grid gap from reasoning Response wrapper to allow CSS-driven spacing control. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…bles Remove individual Collapsible wrappers from grouped tool children, rendering ToolInput/ToolOutput content directly under the parent group. For write_todos groups, render TodoCheckbox list from the last child's payload instead of raw JSON. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rows Extend CodeBlock with forceLightTheme, wrapLongLines, and normalizeWhiteTokens props. ToolDetailRow now supports a "code" renderMode that uses CodeBlock for syntax-highlighted JSON display instead of plain text. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Override Streamdown's default text-sm (0.875rem) to 0.7rem for inline code elements inside reasoning/thinking blocks via .not-prose selector. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Radix collapsible CSS animations are no longer needed after aligning tool collapsible with reasoning transition approach. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Review Summary19 files, +1270 / -71, 23 commits ✅ Looks Good
|
| Severity | Location | Issue |
|---|---|---|
| MEDIUM | ToolGroupRenderer.tsx:63 |
renderTodoChildren에서 children[children.length - 1] 빈 배열 방어 없음. 실제론 그룹이 항상 2+ children이라 런타임 안전하지만 방어적 가드 고려 |
| MEDIUM | codeBlockColorNormalization.ts:3 |
regex HTML 파싱은 edge case 취약. 현재 shiki 출력 스코프에서는 안전하며 테스트 존재 |
| LOW | chatRenderUtils.ts:20 |
'./chatTimelineReducer.ts' — .ts 확장자 명시가 기존 확장자 생략 관례와 불일치 |
| LOW | ToolRenderer.tsx:106 |
extractContent가 단순 wrapper로 남아있음. 정리 고려 |
| LOW | globals.css |
~190줄 chat prose CSS 추가. 향후 파일 분리 고려 가능 |
📊 Summary
- Critical: 0 / High: 0 / Medium: 2 / Low: 3
- 전반적으로 잘 구조화된 PR. 핵심 그룹핑 로직의 순수 함수 분리와 테스트 커버리지가 우수함.
🤖 Generated with Claude Code
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e0cbb52067
ℹ️ 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".
| <Collapsible className="not-prose text-xs group" defaultOpen={false}> | ||
| <CollapsibleTrigger | ||
| className="group/step flex w-full items-center gap-2.5 rounded-[10px] px-2 py-2 pr-3 transition-colors hover:bg-muted/50 disabled:cursor-default" | ||
| disabled={!showChevron} |
There was a problem hiding this comment.
Keep write_todos content reachable when chevron is hidden
In the write_todos branch, showChevron is only true for completed, and the trigger is disabled when it is false, but this commit also sets defaultOpen={false}. That combination means pending/error write_todos calls with parsed todo items render collapsed content that users cannot open at all, so in-progress todo updates are effectively hidden until completion.
Useful? React with 👍 / 👎.
| */ | ||
| function formatReasoningContent(text: string): string { | ||
| // Step 1: bold-only lines → h3 | ||
| let result = text.replace(/^\*\*(.+?)\*\*$/gm, '### $1'); |
There was a problem hiding this comment.
Skip heading conversion inside fenced reasoning code blocks
The markdown preprocessor replaces every line matching **...** with an H3 before parsing, without excluding fenced code regions. If reasoning text includes fenced snippets containing such lines, those literal code lines are rewritten into headings (for example, a fenced **bold** line becomes ### bold), which changes the rendered content and can corrupt technical explanations.
Useful? React with 👍 / 👎.
Summary
toolName도구 호출을 하나의 collapsible 그룹으로 묶는 기능 구현 (groupConsecutiveTools()변환 패스 +ToolGroupRenderer)Related Issues
Test plan
npm test통과 확인 (chatRenderGrouping, toolDetailContent, chatItemPadding 테스트)🤖 Generated with Claude Code