perf(ui): harden bounded transcript memory

Re-scope the renderer-memory fix on the native V2 baseline after removal of the duplicate Tauri event transport. Bound Markdown, reasoning, tool output, diagnostics, diffs, task steps, todos, and per-message part rendering while retaining complete authoritative content behind lazy copy actions.

Coordinate message records and derived render caches under one 64 MiB byte-aware LRU. Protect mounted, loading, and live transcripts; cap pending parts and prompt display overrides; fence stale cache writes; and conservatively account measurement failures.

Reload evicted transcripts through bounded complete V2 pagination, reject stale lifecycle completions, purge all per-instance session state, and prevent delayed SSE/delta work from recreating removed stores. Keep DEV-v2 PR validation enabled without reintroducing native Tauri transport changes.

Validated with full UI and Electron typecheck, UI production build, 248 standard UI tests, 71 browser-condition UI tests, 118 Electron native tests, and git diff checks. The long-duration WebKit soak remains pending while the PR stays draft.
This commit is contained in:
Pascal André 2026-08-13 13:09:45 +02:00
parent 20dfdc2954
commit bb39dab1fc
No known key found for this signature in database
80 changed files with 3136 additions and 935 deletions

View file

@ -32,7 +32,7 @@ jobs:
shell: bash
run: |
set -euo pipefail
if [ "$BASE_REF" = "dev" ]; then
if [ "$BASE_REF" = "dev" ] || [ "$BASE_REF" = "DEV-v2" ]; then
echo "allowed=true" >> "$GITHUB_OUTPUT"
exit 0
fi

View file

@ -32,7 +32,7 @@ jobs:
shell: bash
run: |
set -euo pipefail
if [ "$BASE_REF" = "dev" ]; then
if [ "$BASE_REF" = "dev" ] || [ "$BASE_REF" = "DEV-v2" ]; then
echo "allowed=true" >> "$GITHUB_OUTPUT"
exit 0
fi
@ -103,13 +103,21 @@ jobs:
- name: Test changed runnable UI behavior
run: >-
node --import tsx --test
node --import tsx --test --test-force-exit
packages/ui/src/components/markdown-render-limit.test.ts
packages/ui/src/components/message-block-render-limit.test.ts
packages/ui/src/components/session-list-visibility.test.ts
packages/ui/src/components/tool-call/render-memory.test.ts
packages/ui/src/components/unified-picker-path.test.ts
packages/ui/src/lib/global-cache.test.ts
packages/ui/src/lib/hooks/use-app-session-capture.test.ts
packages/ui/src/lib/hooks/use-foreground-refresh.test.ts
packages/ui/src/lib/launch-errors.test.ts
packages/ui/src/lib/message-render-cache.test.ts
packages/ui/src/lib/message-selection-position.test.ts
packages/ui/src/lib/retained-size.test.ts
packages/ui/src/lib/session-transcript-lru.test.ts
packages/ui/src/lib/session-transcript-measurement.test.ts
packages/ui/src/lib/trailing-resync.test.ts
packages/ui/src/stores/abort-created-workspace-cleanup.test.ts
packages/ui/src/stores/app-session-reconciliation.test.ts
@ -120,12 +128,14 @@ jobs:
packages/ui/src/stores/restore-workspace-commit-gates.test.ts
packages/ui/src/stores/client-state-codec.test.ts
packages/ui/src/stores/client-state.test.ts
packages/ui/src/stores/delta-buffer.test.ts
packages/ui/src/stores/instances-restore-cancellation.test.ts
packages/ui/src/stores/message-v2/instance-store.test.ts
packages/ui/src/stores/message-v2/message-hydration-authority.test.ts
packages/ui/src/stores/message-v2/message-status.test.ts
packages/ui/src/stores/message-v2/normalizers.test.ts
packages/ui/src/stores/session-generation-recovery.test.ts
packages/ui/src/stores/session-message-pages.test.ts
packages/ui/src/stores/session-pagination.test.ts
packages/ui/src/types/session.test.ts
packages/ui/src/stores/workspace-list-reconciliation-fence.test.ts
@ -133,9 +143,12 @@ jobs:
- name: Test restore ownership integration
run: >-
node --conditions=browser --import tsx --test --test-force-exit
packages/ui/src/components/tool-call/renderer-copy.test.ts
packages/ui/src/lib/hooks/use-active-session-message-load.test.ts
packages/ui/src/stores/instances-restore-ownership.test.ts
packages/ui/src/stores/message-v2/bus.test.ts
packages/ui/src/stores/permission-lifecycle.test.ts
packages/ui/src/stores/session-native-events.test.ts
packages/ui/src/stores/session-actions.test.ts
packages/ui/src/stores/session-request-authority.test.ts
packages/ui/src/stores/session-send-lifecycle.test.ts

View file

@ -14,7 +14,7 @@ permissions:
jobs:
restrict-non-dev-prs:
if: ${{ github.event.pull_request.base.ref != 'dev' }}
if: ${{ github.event.pull_request.base.ref != 'dev' && github.event.pull_request.base.ref != 'DEV-v2' }}
runs-on: ubuntu-latest
env:
ALLOWED_ACTORS: ${{ vars.ALLOWED_NON_DEV_PR_ACTORS }}
@ -39,7 +39,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh pr comment "$PR_NUMBER" --body "Thanks for the contribution. PRs need to target \`dev\` branch. Please retarget this PR to the dev branch"
gh pr comment "$PR_NUMBER" --body "Thanks for the contribution. PRs need to target the \`dev\` or \`DEV-v2\` branch. Please retarget this PR to an authorized development branch."
- name: Close unauthorized PR
if: ${{ steps.auth.outputs.authorized != 'true' }}