fix: smooth session history scrolling and loading older messages - #41
Conversation
Add the two history-loading error/retry keys to all eight remaining locales. PR devswha#41 added them only to English and Korean, breaking locale parity in both Node 22 and Node 24 CI jobs. Keep the parity check intact. The focused locale and full scripts suites, lint, identity and build pass. Local full verify still encounters the previously reproduced Node oneDark import issue, unrelated to this fix.
|
Fixed the CI locale-parity failure in b896f5c. Both failed Node 22/24 jobs in run 34031218313 reached the scripts phase and failed Verification:
No tests/checks were skipped or relaxed to fix CI. Fresh GitHub checks are running on the pushed commit. |
|
Confirmed on the pushed fix b896f5c: CI run https://github.com/devswha/gajae-code-app/actions/runs/34034993754 is green.
The missing translation keys were the CI blocker; all checks remained enabled. |
Follow-up to the visible-row pagination in this branch. - Tool-result lookup and transcript export walk the transcript in bounded pages (`fetchCompleteHistory`) instead of an unbounded read that is now refused with 413 past 5,000 visible rows. - The provider re-reads once or twice when a live writer appends between the index and payload passes; only a transcript that keeps changing on every attempt surfaces `HISTORY_CHANGED`. A removed transcript is an empty window, not a 500. - `fetchMore` distinguishes a superseded/no-op page from a failed request; the retry banner appears only for the latter or a no-progress page. - The "Get earlier / Get all messages" controls are reachable while history remains, so paginated sessions keep a click path; a refused load-all raises the same retry alert instead of vanishing. - Pointer-down stops following only on the scrollbar track, not the pane gutter, so a click beside the transcript no longer produces a stale unread badge. - The scroll anchor re-registers resize observers only when the row set changes; four unused locale keys and the orphaned `sliceTailPage` helper are removed.
|
Reviewed on top of a merge with current main (conflict was only the test import in
Verified on the merged tree: client node 516/516, client bun 517/517, server node 1286 pass (the one failure is a symlinked- Follow-ups not in scope here: per-(path,size,mtime) index caching for the three-pass read, and a measured check of a ~2k-row fully loaded session now that |
The encrypted updater key, public key and recovery instructions are now backed up to iCloud Drive with hash-verified copies; the restore/sign test and off-Mac password record stay owner-gated. The handoff also records the closed #41 follow-ups (index cache, 2k-row measurement) and the CLA reminder on #43.
What this changes
content-visibility/intrinsic heights that changed the scroll range again after prepends.Rebased onto current upstream main (
aedb95c), preserving its session-visit isolation, replay-generation cursors, and explicit skill-request parsing. This PR contains one focused commit; the earlier bypass-dialog fix is not included.Why
In a reported conversation, scrolling stopped at 204 loaded rows even though the transcript contained 823 visible normalized rows. The backend returned an empty page with
hasMore: true, causing repeated requests and a flashing “Retrieving earlier messages” indicator. Raw tool-result rows consumed the bounded buffer before visible-row pagination was applied.Separately, prepends could trigger false new-message badges, reset expanded groups, and move the reader's content. Estimated offscreen heights also caused an additional large scroll-range correction after the initial prepend.
Known limitations / review notes
Verification
After rebasing and installing upstream's locked dependencies with
npm ci --no-audit --no-fund:npm run verify: not fully passing. Audit, licenses, notices, typecheck, core checks and server suites ran successfully; the Node client-test stage reports 415 passing and 12 failing test files. All 12 fail at module loading withreact-syntax-highlighter/dist/esm/styles/prismnot exportingoneDark. The shared syntax-highlighter file is unchanged by this PR. The same failure class was also present before the rebase. Tests were not disabled or suppressed.dist-native/bun test src/components/chat/hooks/useChatSessionState.dom.bun.test.tsx src/components/chat/hooks/useChatFollowScroll.dom.bun.test.tsx src/components/chat/view/ChatScrollAnchor.dom.bun.test.tsx src/components/chat/view/TurnWorkBlock.dom.bun.test.tsx src/stores/useSessionStore.dom.bun.test.tsx: 75 passed.dist-native/bun test src/components/chat/tests/chatMessagesPaneCount.test.tsx: 5 passed.TSX_TSCONFIG_PATH=tsconfig.json node --import tsx --test src/components/chat/tests/useChatMessages.test.ts src/stores/sessionMessageFetch.test.ts src/components/chat/utils/paneItemIdentity.test.ts: 26 passed.npm run lint,npm run check:identity,npm run build, andgit diff --check: passed.Before rebase, actual-conversation browser/API verification (not a synthetic transcript):
No recordings attached. Browser measurements describe the pre-rebase local verification; focused tests and gates above were rerun on the rebased source.
npm run verifypasses, or I have said below which gate fails and why.