fix(code): avoid transcript hydration lag - #5479
Conversation
…th-transcript-history
|
Posted by Codex I found a few issues worth addressing before merge. I have kept these to behaviors that follow directly from the implementation; the larger hydration-oscillation claim needs a reproducible regression test before treating it as a blocker.
The prior implementation re-checked only the direction that had just hydrated. Please add coverage for a transcript with archived rows on both sides and verify that an idle viewport does not repeatedly request alternating hydration directions. If the symmetric re-check is intentional, document the termination condition.
Both hydrate loops stop on the first Please either record a recoverable failure state for that row, or provide a bounded retry/skip strategy that preserves ordering without leaving an unfillable virtual gap.
At minimum, log rollback failures. It would also be safer to make the batch failure explicit rather than silently relying on a future hydrate attempt to repair a partially attached DOM.
Please pass an explicit direction here, as
On expansion failure, Please notify the user on failure, or render a visible fallback/error state in the summary.
The expansion path catches errors, but collapse performs
When pruning cannot find a candidate widget, it logs at debug level and does not mark it pruned, which is correct. But Please add a recovery path for this state—for example, reschedule with bounded retries or reconcile the mounted IDs against the store.
Please explicitly handle cancellation results, or re-raise cancellation rather than treating the batch as successful. Non-blocking cleanup:
|
|
Addressed in c8f85a1:
The shared prune direction remains unchanged because it tracks the edge to trim for the current mounted window. |
Conflict in `test_build_snapshot_message_count_reports_rendered_window`: main's #5479 replaced the mounted-window expectation with `min(INITIAL_WINDOW_SIZE, WINDOW_SIZE)` while this branch changed the same assertion's string to carry turn counts. Both sides were needed, so the resolution keeps main's `rendered` computation inside this branch's `"N messages (M rendered), K turns"` format. Main also added `MessageType.TOOL_GROUP`, which the new parametrized `turn_count` test flagged on contact -- the enum-drift guard behaving as intended. `TOOL_GROUP` is agent-authored, so it stays outside the counted set; the case only needed `tool_group_messages` to construct. `test_footers_render_for_hydrated_messages_above` fails on this merge, but it fails identically on clean origin/main (verified by swapping in main's copies of both source files), so it is pre-existing and unrelated to these counts.
> [!CAUTION] > Merging this PR will automatically publish to **PyPI** and create a **GitHub release**. For the full release process, see [`.github/RELEASING.md`](https://github.com/langchain-ai/deepagents/blob/main/.github/RELEASING.md). --- _Release notes preview: keep this section in sync with the package `CHANGELOG.md`. Publish reads the merged CHANGELOG via `release.yml`, not this PR description — keep them aligned anyway so the PR stays an accurate historical record for reviewers and anyone returning later._ --- ## [0.1.57](deepagents-code==0.1.56...deepagents-code==0.1.57) (2026-08-18) ### Features - Added warnings before expensive cold-cache turns and trust user-declared endpoints for cold-cache policies ([#5439](#5439), [#5462](#5462)). - Made the chat input resizable by dragging its top border ([#5524](#5524)). - Added a `multi_select` question type to `ask_user` ([#5097](#5097)). - Added support for ACP approval modes ([#5394](#5394)). - Added `DeepSeek-V4-Pro-0813` to the model picker ([#5512](#5512)). - Show conversation turns alongside message counts ([#5571](#5571)). - Include `TERM_PROGRAM` in the resume hint ([#5548](#5548)). ### Bug Fixes - Report total context after `/offload` ([#5488](#5488)). - Fixed transcript and thread restoration issues, including hydration lag, scrolling resumed threads to the bottom, and hiding empty previous-thread hints ([#5479](#5479), [#5543](#5543), [#5552](#5552)). - Fixed Auto-mode approval handling by binding “yes” to the paired `ask_user` question and avoiding duplicate Auto denial notices ([#5038](#5038), [#5501](#5501)). - Improved reload behavior by keeping the chat input responsive during `/reload`, reporting MCP server changes, and avoiding plugin reload prompt flashes or startup hints ([#5529](#5529), [#5504](#5504), [#5500](#5500), [#5502](#5502)). - Improved dependency update UI by preserving editable fields and hiding dependency details after updates ([#5521](#5521), [#5519](#5519)). - Fixed chat UI polish issues, including detached spacer mount anchors, the unfocused input cursor, and relative timestamp toggle display ([#5516](#5516), [#5258](#5258), [#5503](#5503)). - Refresh the splash version after updates ([#5520](#5520)). _End release notes preview._ --- > [!NOTE] > A **community contributors** list and a **Special thanks** section (crediting the users who filed the issues this release's PRs closed) are appended to the GitHub release notes automatically at publish time (see [Release Pipeline](https://github.com/langchain-ai/deepagents/blob/main/.github/RELEASING.md#release-pipeline), step 3). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: langchain-oss-automated-triage[bot] <248757908+langchain-oss-automated-triage[bot]@users.noreply.github.com>
Resumed transcripts now load quickly and scroll smoothly without blocking on message hydration.
Textual reapplies styles across the mounted DOM whenever history widgets are inserted. This made on-demand hydration stutter even in small batches, especially because collapsed tool rows still retained their full widget trees.
This mounts a small initial history window, warms it in bounded batches, prefetches relative to virtual spacer boundaries, coalesces hydration work, and delays pruning until scrolling settles. Restored successful tool runs are represented by lazy data-backed summaries whose detail widgets mount only when expanded.
On a 681-message local thread, restored history compacted to 265 display rows, initial loading took about 0.9 seconds, and background warmup completed the transcript before backward scrolling required hydration.
Test plan
typassed on changed production filesVideo
New (left) - Old (right)
Virtualization.Side.by.side.mp4