Tool calls, Arc style
Their clip (Elia, uiarc.dev author)
Ours vs theirs
| Moment | Ours (ProcessBlock today) | Arc |
|---|---|---|
| While running | Plan line, last 2 steps, "+N earlier", live row, no frame | Framed card, header "Using 3 tools" with stacked app icons, every row shown |
| Per row | Icon, verb, detail, caret | App icon, verb, detail, "4 results · 1.2s", green check, chevron |
| Tense | Yes: Searching → Searched | Same |
| Failure | "Failed" pill; reason only after expanding | Red row title, reason line under it, Retry button, header shows "1 failed" |
| Approval | Separate ChatApprovalCard under the thread | Row inside the group: Deny / Allow, "Sends as Arc agent to 48 people", header turns "Waiting for approval" |
| Done | "Worked for 12s · 4 steps" + AppStack | "Used 4 tools" + stacked icons + "3.0s" |
| After answer | Regenerate in message actions | "Run again" link under the answer |
We already have the bones: app logos (#686), tense verbs, AppStack, receipts. What Arc adds is the frame, per-step timing, and failures + approvals living inside the group. ProcessStep has no per-step start/end time today, so timing needs a field.
No table: same features, no box
Five integrations
- Framed group with a live header. While running, the trail sits in a hairline card. Header: stacked app logos (reuse
AppStack) + "Using 3 tools", then "Used 4 tools · 3.0s" when done. Every row shows, no "+N earlier" while it fits 6 rows. - Per-step receipt: count + time + check. Add
startedAt/endedAttoProcessStepfrom the stream part timestamps. Right side of each row: "4 results · 1.2s" (count fromreceiptOf/appPreview) and a green check, spinner while live. - Inline failure with Retry. The failed row reads "Could not …" in red. The error shows on a second line, no expand needed. A Retry button re-runs that one tool. The header says "1 failed".
- Approval as a row in the group. The pending ChatApprovalCard moves into the trail as the row it gates, with Deny / Allow. One line says what happens ("Sends as Raven to 48 people"), from
approval-provenance. The header reads "Waiting for approval" and the border turns blue. - "Run again" under the finished answer. A quiet link under the last answer calls the existing
handleRegenerate. The phone and PWA rows get all five at phone sizing.
Built: option B in the real component

| What | Where |
|---|---|
| Code | allternit-ai #850 · feat/tool-calls-rail |
| Docs + map | allternit-platform #1898 |
| Checks | tsrs clean; 130 test files pass; dark, light and phone width checked |