feat(ui): round-4 feedback — tool-row-sized muted self-talk, BookOpen/Terminal tool icons, md status glyph in comments

- Interstitial self-talk matches tool rows: text-xs wrapper + scoped
  .tc-interstitial override (prose-sm sets its own font-size on
  .paperclip-markdown, so the utility alone can't shrink it)
- tool-taxonomy: read family Book -> BookOpen, terminal SquareTerminal ->
  Terminal, edit SquarePen -> Terminal (per the letter of the board ask;
  the lucide link was pasted twice, flagged on the thread)
- Inline issue-reference status glyph in markdown bodies steps down
  lg (20px) -> md (16px)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
scotttongandClaude Fable 5 committed 2026-08-07 16:56:44 -07:00
1 parent fe7edd291b
commit 1daeef878b
4 files changed
+21 -17

No files matched your search

@@ -41,7 +41,7 @@ export function TaskChatBubble({ item }: TaskChatBubbleProps) {
return (
<div
className={cn(
"w-full text-sm text-muted-foreground",
"tc-interstitial w-full text-xs text-muted-foreground",
item.streaming && "tc-typewriter-stream",
)}
data-testid="task-chat-interstitial"
@@ -1,14 +1,13 @@
import { describe, expect, it } from "vitest";
import {
Book,
BookOpen,
Brain,
ChevronsLeftRightEllipsis,
MessageSquareReply,
Network,
Search,
SearchCode,
SquarePen,
SquareTerminal,
Terminal,
Wrench,
} from "lucide-react";
import { McpIcon } from "./McpIcon";
@@ -18,7 +17,7 @@ describe("toolTaxonomy", () => {
it("maps each family to its icon and verb", () => {
expect(toolTaxonomy("Bash")).toEqual({
family: "terminal",
icon: SquareTerminal,
icon: Terminal,
verbLabel: "Running a command",
});
expect(toolTaxonomy("Shell").family).toBe("terminal");
@@ -38,14 +37,15 @@ describe("toolTaxonomy", () => {
expect(toolTaxonomy("Read")).toEqual({
family: "read",
icon: Book,
icon: BookOpen,
verbLabel: "Reading files",
});
expect(toolTaxonomy("NotebookRead").family).toBe("read");
// Round-4 board feedback: edits share the terminal glyph.
expect(toolTaxonomy("Edit")).toEqual({
family: "edit",
icon: SquarePen,
icon: Terminal,
verbLabel: "Editing files",
});
expect(toolTaxonomy("Write").family).toBe("edit");
@@ -87,10 +87,10 @@ describe("toolTaxonomy", () => {
describe("toolTaxonomy multi-word ACP titles", () => {
it("classifies by the first word", () => {
expect(toolTaxonomy("Read File").icon).toBe(Book);
expect(toolTaxonomy("Edit File").icon).toBe(SquarePen);
expect(toolTaxonomy("Write File").icon).toBe(SquarePen);
expect(toolTaxonomy("Terminal").icon).toBe(SquareTerminal);
expect(toolTaxonomy("Read File").icon).toBe(BookOpen);
expect(toolTaxonomy("Edit File").icon).toBe(Terminal);
expect(toolTaxonomy("Write File").icon).toBe(Terminal);
expect(toolTaxonomy("Terminal").icon).toBe(Terminal);
});
});
+6 -6
View File
@@ -6,15 +6,14 @@
* tools.
*/
import {
Book,
BookOpen,
Brain,
ChevronsLeftRightEllipsis,
MessageSquareReply,
Network,
Search,
SearchCode,
SquarePen,
SquareTerminal,
Terminal,
Wrench,
} from "lucide-react";
import type { ComponentType, SVGProps } from "react";
@@ -70,11 +69,12 @@ export function mcpToolSegment(name: string): string | null {
}
const FAMILY_META: Record<Exclude<ToolFamily, "mcp">, Omit<ToolTaxonomyEntry, "family">> = {
terminal: { icon: SquareTerminal, verbLabel: "Running a command" },
terminal: { icon: Terminal, verbLabel: "Running a command" },
grep: { icon: SearchCode, verbLabel: "Grepping" },
search: { icon: Search, verbLabel: "Searching" },
read: { icon: Book, verbLabel: "Reading files" },
edit: { icon: SquarePen, verbLabel: "Editing files" },
read: { icon: BookOpen, verbLabel: "Reading files" },
// Board round-4 feedback asked for the terminal glyph on edits as well.
edit: { icon: Terminal, verbLabel: "Editing files" },
web: { icon: ChevronsLeftRightEllipsis, verbLabel: "Fetching the web" },
agent: { icon: Network, verbLabel: "Delegating" },
other: { icon: Wrench, verbLabel: "Working" },
+4
View File
@@ -592,6 +592,10 @@
CSS-only typewriter, no per-char timers. Text appended to an existing block
lands instantly; history omits the class entirely. */
.tc-typewriter-stream .paperclip-markdown > * { animation: tc-typewriter var(--motion-typewriter-reveal) var(--motion-typewriter-steps) both; }
/* Interstitial narration matches the tool rows (text-xs): prose-sm sets its
own font-size on .paperclip-markdown, so the wrapper's text-xs alone can't
shrink it — this scoped override wins on specificity. */
.tc-interstitial .paperclip-markdown { font-size: var(--text-xs); line-height: var(--text-xs--line-height); }
/* Scroll-to-latest pill (stock shadcn MessageScrollerButton motion, tokenized).
The pill is centered with translateX(-50%), so the keyframes carry the X