feat: live tool call disclosure in chat UI - #398
kpmmmurphy wants to merge 2 commits into
Conversation
Tool calls are now visible DURING the turn, not just after: - Mac toolTraceFooter: removed the status != .streaming gate so the "Used web search · date & time" line appears live as each tool dispatches, with a content transition animation. - iOS toolTraceRow: added the same provenance line (was missing entirely from the iOS bubble). - ActivityLabeler: 6 tools that fell through to the raw default now get tailored live labels (delegate_deep, list_documents, get_document, open_link, lookup_fact, recent_activity); the default fallback humanises via displayName (underscores → spaces). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ELMgNSM3gNKL6kFm16wpyX # ── MurphySig ────────────────────────────────────────────────────── # Significant decision in this commit? Sign it. https://murphysig.dev/spec # ───────────────────────────────────────────────────────────────────
✅ Deploy Preview for m1k3 canceled.
|
|
Reviewed the diff (MessageView.swift, MessageBubble.swift, ResponderActivity.swift, ActivityTests.swift). The feature itself is sound — Two things worth fixing before merge: 1. Broken doc comments — /// The transcript's persisted provenance line ("Used web search \u{00B7} date &
/// time") -- pinned here rather than composed in the View so the product
/// string is testable.
2. Dropped rationale comment — same file, // Deliberately NOT "…your knowledge": the every-turn RAG phase used
// to read like the search_knowledge tool, so tool calls looked like
// they fired on every turn when they hadn't (Kev, 2026-08-16). A
// self-action verb keeps the phase and the tool distinguishable.This got deleted with no replacement and isn't mentioned in the PR description — looks like collateral from the same sweep rather than an intentional edit. The rationale itself still survives in Minor/optional: Tests ( |
- ResponderActivity.swift: restored from master and applied surgical
edits only (6 new cases + humanised default). The full-file rewrite
had dropped the Kev 2026-08-16 comment and mangled doc-comment
typography into \u{} escapes that render as literal text. Review
line added.
- Dropped .contentTransition(.numericText()) on both platforms — it's
designed for digit-rolling and its behaviour on non-numeric strings
is undocumented; the .animation alone handles the insertion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ELMgNSM3gNKL6kFm16wpyX
# ── MurphySig ──────────────────────────────────────────────────────
# Significant decision in this commit? Sign it. https://murphysig.dev/spec
# ───────────────────────────────────────────────────────────────────
Review — PR #398 (live tool call disclosure)Small, well-scoped diff (54/9 across 4 files). Went through it against the six review lenses; nothing blocking. Correctness / behavior
Minor / non-blocking
Provenance / architecture
Tests: No concurrency, GRDB/persistence, or MLX-boundary concerns — this diff doesn't touch any of those surfaces. 🤖 Generated with Claude Code |
Summary
Tool calls are now visible during the turn, not just after completion:
toolTraceFooter: removed thestatus != .streaminggate so the "Used web search · date & time" line appears live as each tool dispatches, with a.contentTransition(.numericText())animation as new tools accumulatetoolTraceRow: added the same persisted provenance line — was entirely missing from the iOS bubbleActivityLabeler: 6 tools that fell through to the raw "Using {name}…" default now get tailored live labels (delegate_deep,list_documents,get_document,open_link,lookup_fact,recent_activity); the default fallback humanises viadisplayName(forTool:)so unknown tools get underscores replaced with spacesBefore
After
Test plan
ActivityLabelerTests— all 6 tests green (new tool labels + humanised default)ToolTraceTests— trace accumulation + straggler dropChatSessionActivityTests— label lifecycleMemoryGroundingTests— byte-identical snapshots unaffectedtoolTraceRowrenders🤖 Generated with Claude Code
https://claude.ai/code/session_01ELMgNSM3gNKL6kFm16wpyX