Repository navigation
Conversation
A retry loop (e.g. the orchestrator re-spawning the integrations agent 25×) floods the Agentic task insights timeline with indistinguishable "Checking your connected app" nodes. Collapse consecutive identical, body-less rows (same title + status, no result/detail/sub-agent/failure, never the live running row) into a single row carrying an ×N badge, so no information is lost — only duplication.
A finished turn rendered its entire timeline expanded and static, so a run with dozens of steps dominated the conversation and read as "out of place" between the question and the answer. Unify the settled/in-flight layouts into one collapsible group: open while running (live activity visible) and collapsed to a one-line opener once settled — rows stay one click away and the whole-run side panel is still reachable from the header. The Agent Process Source panel keeps every row open via expandAllRows.
…ng tool runs Previously, the moment a tool/subagent row appeared the live streaming narration was pulled out of the message flow and into the timeline's buried LiveResponseBlock, then cleared on settle — so streamed text 'popped' as it handed off to the final bubbles. Render the streaming preview bubble in the message flow whenever there is streamed content (not only when the timeline is empty), and stop duplicating it inside the timeline panel. Narration now streams where the answer will land.
…meline-anchoring-and-dedup
…nterim)
When the agent streams narration ("Let me check your calendar…") and
then calls a tool/subagent, that leading text was only ever sent as
transient text_delta and discarded on settle — it never became a chat
bubble. The final answer (outcome.text) is the terminal round only, so
the intermediate narration was lost from the transcript.
Backend (progress_bridge): buffer each round's narration and, when a tool
call closes the round, flush it as a new chat_interim event (skipping
trivial <24-char text). The final answer still arrives via deliver_response
and never overlaps this buffer (the terminal round ends with no tool call).
Frontend: chatService gains onInterim; ChatRuntimeProvider persists the
narration as its own agent message (durable across reload — it's a real
thread message, not turn-state) and clears it from the live streaming
preview so it isn't shown twice during the tool call. Deduped by round.
Tests: interim_narration_text threshold (Rust); persist+clear and
per-round dedupe (provider).
Concrete design for persisting a tool timeline per turn (keyed by request_id) so each past answer keeps its own Agentic task insights trail across reload — the backend half not covered by chat_interim. Covers the turn-state store key change + retention, turn<->message anchoring via extraMetadata.requestId, RPC + frontend store reshape, legacy migration, reload-coherence invariant, testing, and an incremental rollout.
…meline-anchoring-and-dedup
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 47 seconds Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (9)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1eb57c3ee8
ℹ️ 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".
| const content = event.full_response?.trim() ?? ''; | ||
| if (!content) return; | ||
| // Persist this round's leading narration as its own interleaved bubble. | ||
| void dispatch(addInferenceResponse({ content, threadId: event.thread_id })); |
There was a problem hiding this comment.
Serialize interim appends before final responses
When a tool returns quickly after chat_interim, this fire-and-forget append can still be in flight when chat_done starts its own addInferenceResponse append. Since the thunk updates the local cache only on fulfillment and the core thread store appends messages in call-arrival order, the final answer can render/persist before the interim narration bubble, which breaks the intended interleaving for fast tool rounds; queue or await per-thread interim appends before appending the final response.
Useful? React with 👍 / 👎.
Landed unformatted on origin/main via tinyhumansai#4604 ("Fix/conversation timeline anchoring and dedup"). Blocking `pnpm --filter openhuman-app format:check` in `pr-quality.yml` on this PR. Two mechanical wraps — no code change: - Inline an `expect.objectContaining` literal. - Wrap a long `expect(...).toBe('')` chain across three lines. Not part of the tinyhumansai#4596 fix; included here purely to unblock CI.
Summary
Problem
Solution
Submission Checklist
diff-cover) meet the gate enforced by.github/workflows/ci-lite.yml. Runpnpm test:coverageandpnpm test:rustlocally; PRs below 80% on changed lines will not merge.docs/TEST-COVERAGE-MATRIX.mdreflect this change (orN/A: behaviour-only change)## Relateddocs/RELEASE-MANUAL-SMOKE.md)Closes #NNNin the## RelatedsectionImpact
Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
pnpm --filter openhuman-app format:checkpnpm typecheckValidation Blocked
command:error:impact:Behavior Changes
Parity Contract
Duplicate / Superseded PR Handling