Repository navigation
feat: group session tool calls - #466
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Approval pendingCodeRabbit has no unresolved comments, but it could not review the latest commit because the review limit was reached. Follow the review guidance in this comment to continue. ✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
|
| Filename | Overview |
|---|---|
| web/src/components/assistant-ui/session-timeline-group-identity.ts | Derives deterministic group identities, prevents retained-anchor reuse within a derivation, and disambiguates fallback collisions. |
| web/src/components/assistant-ui/session-timeline.logic.ts | Groups live and settled tool-call clusters while tracking group IDs already assigned within each message derivation. |
| web/src/components/assistant-ui/hooks/use-assistant-message-timeline.ts | Persists observed work-group anchors and aligns active-turn detection with part-level turn IDs. |
| web/src/components/assistant-ui/session-timeline-render.tsx | Renders grouped work disclosures and stable ARIA-controlled detail containers. |
| web/src/components/assistant-ui/tests/session-timeline.logic.test.ts | Covers stable identities across replacement, reorder, duplicate events, lower-sorting arrivals, and failure splits. |
Reviews (2): Last reviewed commit: "docs: refresh eng-135 QA evidence" | Re-trigger Greptile
|
/review |
|
/review |
Summary
Implements Linear issue ENG-135, “Group tool calls (Synara pattern)”, for the web session transcript.
The session timeline now groups consecutive tool calls within a turn while preserving the existing event projection and storage contracts. Ordinary single calls remain ordinary rows, non-tool boundaries split groups, failures stay standalone, and a still-growing trailing group remains visibly open until the turn settles.
Root cause
The timeline renderer treated every tool-call part as an independent row. That made tool-heavy turns noisy and prevented the transcript from communicating the higher-level work phase. The existing derived-row pipeline also needed a stable identity that survives streaming replacement, retries, deduplication, and arrival-order changes without changing the user’s local disclosure state.
Implementation
aria-controlslinks so keyboard and assistive-technology users can operate summaries before and after expansion.Verification
Focused checks completed:
bunx turbo run test --filter=./web --force -- --run src/components/assistant-ui/__tests__/session-timeline.logic.test.ts src/components/assistant-ui/__tests__/timeline-scroll-anchoring.test.ts src/components/assistant-ui/__tests__/session-thread.test.tsxbunx turbo run typecheck --filter=./weboxfmtandoxlintfor all changed source and test filesgit diff --checkf0d07aa2c: work-group derivation now tracks IDs already assigned within the message, prevents retained-anchor reuse, and disambiguates a colliding fallback with a stable part suffix. The regression is in the canonical timeline logic suite and passes..codex/artifacts/coderabbit/pr-466-review.jsonwas refreshed repeatedly; no actionable CodeRabbit findings were available because the bot reportedReview limit reached. A/reviewrequest was also posted and remained rate-limited.Focused gate and QA notes
make gatewas run twice as required for focused gates. Both runs reached the web lane but were blocked by unrelated existing failures outside this diff:web/src/systems/os/hooks/__tests__/use-window-manager-stream.test.tsx(expectednull, receivedworkspace:home); the lane otherwise passed 713/714 files. Re-running the exact test through Turbo reproduced it.src/storybook/__tests__/web-storybook-visual-contract.test.ts.Per the task instruction,
make verifyandmake gate-fullwere not run.The isolated real-user QA walk was attempted with a fresh QA lab and was torn down cleanly. It is blocked before the transcript can be exercised because the unrelated demo seed does not compile:
internal/demoseed/seed.go:79:33: db.ListPresets undefined. Evidence and teardown details are recorded indocs/qa/reports/2026-08-24-eng-135-session-groups.md.CI monitoring
The post-push CI run was monitored through completion:
32803898802, attempt 1: web/Desktop/Preflight/Build and race shard 2/2 passed;Go (format, lint)hit its fixed 10-minute golangci-lint timeout; race shard 1/2 reported 648 failures acrossinternal/store/globaldb.32803898802, attempt 2.Go (format, lint)passed on retry, while race shard 1/2 reproduced the unrelated globaldb failure with 729 failures after 2,922 seconds. All other checks passed.Risks and follow-up
blocked-verifyuntil the unrelated demo-seed compile failure is fixed.Compozy Impact Audit
compozy__*tool IDs, toolsets, descriptors, schemas, digests, risk flags, capability gates, diagnostics, or CLI/API fallbacks changed; only the web session projection and disclosure renderer were checked.config.tomllifecycle changed; the existing event-to-row path remains the source of truth.Closes ENG-135.