openclaw/.gitignore
Peter Steinberger de57e39408
fix(ui): transcript end hides under the PR chip and Side chat questions cannot wrap (#144703)
* fix(ui): keep the transcript end above the PR chip and let Side chat questions wrap

Users following a long coding session saw the newest transcript rows clipped
behind the pull-request chip and task-progress dock while the view believed it
was at the end and hid the scroll-to-latest button; a width change "fixed" it.
Live on a stable team instance the thread rested 48px short with the last row
25px under the PR chip.

End-follow runs in a requestAnimationFrame after the commit that grows a row.
For task-driven commits (tool-stream sync, session events) that frame precedes
the row's ResizeObserver, so the follow scrolled to a stale maximum, and the
outstanding end command never settled. The transcript host now records the
maximum an end command targeted and re-targets it after commits when the
committed maximum moved. The render-lifecycle change capture also tracks
chatStreamSegments identity, so Codex-harness preamble growth schedules a
follow at all. Pending-offset restoration moves to a sibling module to stay
under the file-length cap.

The Side chat prompt becomes an auto-growing textarea that reuses the main
composer's sizing owner and send-key rule (Enter or the configured modifier
shortcut asks, Shift+Enter adds a line); its composer lifecycle lives in
chat-session-rail-composer.ts.

Proof: chat-transcript-end-follow.browser.test.ts fails on the previous host
(distance 48, programmatic true) and passes now; chat-scroll-dock.e2e.test.ts
rests 181-601px short without the stream-segment capture and at 0 with it;
chat-session-companion-composer.e2e.test.ts covers wrapping, Shift+Enter,
verbatim multi-line asks, shrink-back, and modifier shortcuts.

* test(ui): initialize settings in retained panel fixture

Repair the exact-head CI failures in checks-ui (1/3) and checks-node-compact-large-9. The retained Review fixture must initialize settings before the Side chat shortcut binding reads them. Reuse loadSettings as production does; preserve runtime code and assertions.

* test(ui): use reader input before transcript scroll assertions

Exact-head CI exposed synthetic scrollTop writes racing outstanding end commands in position-rail, focused-row, and native-history scenarios. Send real wheel input through the existing cancellation owner before asserting reader geometry. Preserve all assertions, timeouts, and runtime behavior. The ten targeted E2E cases, changed checks, and scoped autoreview pass.

* fix(ui): re-pin only a reader still resting at the transcript end

The first end-follow repair re-targeted any outstanding end command when
the committed maximum moved. An instant follow that does not move emits no
scroll event, so that command lingered, and a reader who later left the end
without an input event (find-in-page, focus navigation, programmatic scroll)
was pulled back by the next growth; three e2e tests had been switched to
wheel input to hide exactly that.

The host now keeps an explicit end anchor: the maximum a reader is known to
rest at, set by an instant end-follow or observed after any commit. A commit
that moves the end while the reader still sits at the previous end re-pins
them; a reader found anywhere else clears the anchor and is never pulled
back. The three e2e tests return to their original programmatic scrolls.

Proof: chat-transcript-end-follow.browser.test.ts adds a programmatic
departure case (348px yank on the previous retarget, 0 now) and an
observed-at-end growth case (48px short without the anchor, 0 now); the
restored e2e files pass unmodified.

* fix(ui): preserve disclosure anchors during end-follow

Exact-head CI exposed transcript disclosure expansion moving the clicked row by 120-357 px. Retire the end anchor when the interaction captures its row and defer end reconciliation during its measurement commit, so the pending virtual sizer cannot re-arm a stale end.

The three existing disclosure cases fail before and pass after. All three browser end-follow regressions and 20 focused E2E cases pass; changed checks and scoped P0-P2 autoreview are clean.
2026-09-11 01:26:25 -07:00

239 lines
5.4 KiB
Text

node_modules
**/node_modules/
.env
docker-compose.override.yml
docker-compose.extra.yml
docker-compose.sandbox.yml
dist
dist-runtime/
dist-sea/
pnpm-lock.yaml
bun.lock
bun.lockb
coverage
__openclaw_vitest__/
__pycache__/
*.pyc
*.tsbuildinfo
.pnpm-store
.worktrees/
.DS_Store
**/.DS_Store
ui/src/ui/__screenshots__/
ui/playwright-report/
ui/test-results/
packages/dashboard-next/.next/
packages/dashboard-next/out/
# Mise configuration files
mise.toml
# Android build artifacts
apps/android/.gradle/
apps/android/app/build/
apps/android/.cxx/
apps/android/.kotlin/
apps/android/benchmark/results/
# Bun build artifacts
*.bun-build
apps/macos/.build/
apps/macos-mlx-tts/.build/
apps/shared/MoltbotKit/.build/
apps/shared/OpenClawKit/.build/
apps/shared/*/.build/
packages/*/dist/
apps/shared/OpenClawKit/Package.resolved
# Xcode rewrites local-package Package.resolved with the iOS app supergraph on
# every resolve; swabble's only runtime dep is exact-pinned in Package.swift.
apps/swabble/Package.resolved
**/ModuleCache/
bin/
bin/clawdbot-mac
apps/macos/.build-local/
apps/macos/.swiftpm/
apps/shared/MoltbotKit/.swiftpm/
apps/shared/OpenClawKit/.swiftpm/
apps/shared/*/.swiftpm/
Core/
apps/ios/*.xcodeproj/
apps/ios/*.xcworkspace/
apps/ios/.swiftpm/
apps/ios/.derivedData/
apps/ios/.local-signing.xcconfig
vendor/
apps/ios/Clawdbot.xcodeproj/
apps/ios/Clawdbot.xcodeproj/**
apps/macos/.build/**
apps/macos-mlx-tts/.build/**
**/*.bun-build
apps/ios/*.xcfilelist
# Vendor build artifacts
vendor/a2ui/renderers/lit/dist/
src/canvas-host/a2ui/*.bundle.js
src/canvas-host/a2ui/*.map
extensions/canvas/src/host/a2ui/*.bundle.js
extensions/canvas/src/host/a2ui/*.map
.bundle.hash
# fastlane (iOS)
apps/ios/fastlane/README.md
apps/android/fastlane/README.md
apps/ios/fastlane/report.xml
apps/ios/fastlane/Preview.html
apps/ios/fastlane/screenshots/
apps/ios/fastlane/metadata/*/release_notes.txt
apps/ios/fastlane/test_output/
apps/ios/fastlane/logs/
apps/ios/fastlane/.env
apps/android/fastlane/report.xml
apps/android/fastlane/Preview.html
apps/android/fastlane/test_output/
apps/android/fastlane/logs/
apps/android/fastlane/.env
apps/android/fastlane/metadata/android/**/images/
# fastlane build artifacts (local)
apps/ios/*.ipa
apps/ios/*.dSYM.zip
# provisioning profiles (local)
apps/ios/*.mobileprovision
# Local untracked files
.local/
docs/.local/
docs/internal/
tmp/
IDENTITY.md
USER.md
# Keep packaged workspace templates visible to Git-aware remote syncs.
!docs/reference/templates/IDENTITY.md
!docs/reference/templates/USER.md
# Exception: oc-path real-world test fixtures need to be tracked even
# though the bare names match the local-untracked rule above.
!extensions/oc-path/src/oc-path/tests/fixtures/real/IDENTITY.md
!extensions/oc-path/src/oc-path/tests/fixtures/real/USER.md
*.tgz
*.tar.gz
*.zip
.idea
.vscode/
# local tooling
.antigravitycli/
.serena/
.crabbox/
/.openclaw/trajectory-exports/
# local QA evidence mirrors; CI publishes canonical Mantis files as Actions artifacts
/mantis/
# Keep repository skills visible to Git-aware syncs; local-only skill ignores
# belong in .git/info/exclude.
.agents/skills/**/*.orig
.agents/skills/**/__pycache__/
.agents/skills/**/*.py[cod]
# Agent credentials and memory (NEVER COMMIT)
/memory/
.agent/*.json
!.agent/workflows/
/local/
/client_secret_*.json
package-lock.json
!.github/release/clawhub-cli/package-lock.json
!src/commands/copilot-sdk-install-manifest/package-lock.json
.claude/*
# Track the shared Claude Code project config (worktree auto-install hook) and the
# skills symlink into .agents/skills; keep everything else under .claude/
# (worktrees, settings.local.json) ignored.
!.claude/settings.json
!.claude/skills
.agent/
skills-lock.json
# Local iOS signing overrides
apps/ios/LocalSigning.xcconfig
# Xcode build directories (xcodebuild output)
apps/ios/build/
apps/shared/OpenClawKit/build/
apps/swabble/build/
*.xcresult
*.trace
*.profraw
# Generated protocol schema (produced via pnpm protocol:gen)
dist/protocol.schema.json
packages/gateway-protocol/protocol.schema.json
.ant-colony/
# Eclipse
**/.project
**/.classpath
**/.settings/
**/.gradle/
# Synthing
**/.stfolder/
.dev-state
docs/superpowers
.superpowers/
test/config-form.analyze.telegram.test.ts
ui/src/ui/theme-variants.browser.test.ts
ui/src/ui/__screenshots__
ui/src/ui/views/__screenshots__
ui/.vitest-attachments
ui/.vitest/
# Generated docs baseline artifacts (locally generated, only drift detectors tracked)
docs/.generated/*.json
!docs/.generated/config-baseline.counts.json
docs/.generated/*.jsonl
!docs/.generated/plugin-sdk-api-baseline/
!docs/.generated/plugin-sdk-api-baseline/*.json
# Deprecated changelog fragment workflow
changelog/fragments/
# Local scratch workspace
.tmp/
.cache/
.pytest_cache/
.ruff_cache/
.mypy_cache/
.vmux*
.artifacts/
.amp/portals/
.openclaw-config-doc-cache/
openclaw-path-alias-*/
/.pi/
/C:\\openclaw/
*.log
*.tmp
*.heapsnapshot
*.cpuprofile
*.prof
test/fixtures/openclaw-vitest-unit-report.json
analysis/
.artifacts/qa-e2e/
/runs/
/data/rtt.jsonl
extensions/qa-lab/web/dist/
# Generated bundled plugin runtime dependency manifests
extensions/**/.openclaw-runtime-deps.json
extensions/**/.openclaw-runtime-deps-stamp.json
extensions/diffs/assets/viewer-runtime.js
extensions/diffs-language-pack/assets/viewer-runtime.js
extensions/discord/assets/embedded-app-sdk.mjs
# Output dir for scripts/run-opengrep.sh (local opengrep scans)
/.opengrep-out/
/.crabbox-artifacts
.comux*
# Pinned Swift lint/format tools installed by scripts/install-swift-tools.sh
.build/