diff --git a/scroll-regression/QA.md b/scroll-regression/QA.md new file mode 100644 index 0000000000..76dd58bbff --- /dev/null +++ b/scroll-regression/QA.md @@ -0,0 +1,101 @@ +# Native composer scroll regression + +Commit: `b5e63f716`, pushed to `fix/new-workspace-composer-dock`. + +The dock's dismiss surface is now a sibling behind the content. No JS responder from the dock sits above a native scroll view. New workspace's decorative form containers pass through empty-space touches on iOS; its controls remain touch targets. The `ComposerDock` interface, header dismissal, keyboard drivers, sizing model, and flick classifier are unchanged. + +## Red / green + +The same native swipe on `b68767635` changed **0.00%** of stream pixels, both from the bottom and after returning there and waiting for the scrollbar to fade. The new `stream-moved` assertion failed both captures. With the fix it changed **23.89%** and **26.44%**. [Raw assertion output](red-green.log). + +The assertion ignores the scrollbar rail and requires at least 1% of pixels in the stream region to differ by more than 8 RGB levels. The host scenario submits a 50-line fixture through each real host, waits for the selectable mock model's response to finish and for JS/scrollbars to become idle, swipes natively, returns to the bottom, waits, and swipes again. Draft and New workspace submissions naturally transition to their new chats. Existing assertions, thresholds, inputs and gestures are unchanged. + +| Reproduction | Before native swipe | After native swipe | +| --- | --- | --- | +| Broken branch, idle at bottom | ![](before/2-back-at-bottom-idle.png) | ![](before/3-after-scroll-up-2.png) | +| Fixed branch, idle at bottom | ![](after/2-back-at-bottom-idle.png) | ![](after/3-after-scroll-up-2.png) | + +## Android + +```sh +PASEO_COMPOSER_KEYBOARD_DAEMON_HOST=127.0.0.1:6768 \ +PASEO_COMPOSER_KEYBOARD_DAEMON_HOME=/home/moboudra/dev/paseo/.dev/paseo-home \ +npm run test:e2e:composer-keyboard:android +``` + +**Final full harness: exit 0** on `b5e63f716`. [Raw output](harness-final.log). All original steps passed, plus the common scenario on every host: growth, bounds, retained close/reopen height, hold-delete reset, content/header dismissal, JS-stall motion, and command/file/model/attachment/forge popovers in both keyboard states. The initial run was intentionally stopped after iOS exposed the empty-padding hit-test failure; this final run includes the correction. + +| Origin host | Native swipe after submit | Native swipe after returning to bottom + idle | +| --- | ---: | ---: | +| Chat | 24.30% | 23.50% | +| New agent tab | 24.67% | 25.67% | +| New workspace | 24.05% | 24.33% | + +```text +PASS host=chat: native stream swipe after submit and after idle at bottom +PASS host=workspace-draft: native stream swipe after submit and after idle at bottom +PASS host=new-workspace: native stream swipe after submit and after idle at bottom +Composer keyboard invariants passed +``` + +| Android idle swipe | Before | After | +| --- | --- | --- | +| Chat | ![](android/chat-native-scroll-bottom-idle.png) | ![](android/chat-native-scroll-after-idle-swipe.png) | +| New agent tab submission | ![](android/workspace-draft-native-scroll-bottom-idle.png) | ![](android/workspace-draft-native-scroll-after-idle-swipe.png) | +| New workspace submission | ![](android/new-workspace-native-scroll-bottom-idle.png) | ![](android/new-workspace-native-scroll-after-idle-swipe.png) | + +## iOS + +iPhone 16 Pro, iOS 18.6, shared Namespace Mac, isolated `composer-scroll-ios` session. This checkout's Metro was tunneled on 8083 and the daemon on 17668. Both owned processes and the device session were closed afterward; other sessions were left alone. + +Native stream displacement after submit: **28.64%**. After returning to the bottom and waiting: **29.79%**. Slow native pan with keyboard open: **27.82%**, keyboard remained open and input height remained 30 pt. [Native assertions](ios/native-scroll.log), [slow-scroll assertion](ios/slow-scroll.log), [gesture output](ios/composer-scroll-ios-gestures.log). + +| Host | Empty/reset | Cap, after header dismissal, after reopen | Empty-content/header dismissal | +| --- | ---: | ---: | --- | +| Chat | 30 pt | 298 pt | Passed | +| New agent tab | 30 pt | 250 pt | Passed | +| New workspace | 30 pt | 333 pt | Passed | + +The first sibling-only implementation failed New workspace's empty-content dismissal on iOS: decorative form padding intercepted hit testing. `box-none` on layout containers and `none` on inert title/spacers fixed that failure; no responder was added above content. [Failing dismissal output](ios/new-workspace-padding-red.log), [passing output](ios/composer-scroll-ios-workspace-final.log). + +A 230-point automated iOS fling still left the keyboard open. The pre-existing classifier is unchanged, and automated iOS flick dismissal remains a QA gap previously recorded for the extraction. This report does not claim a passing flick-dismissal result. Android's existing flick assertions remain in the full harness. + +| iOS state | Before | After | +| --- | --- | --- | +| Native swipe after submit | ![](ios/chat-native-submitted.png) | ![](ios/chat-native-after-submit.png) | +| Native swipe after idle at bottom | ![](ios/chat-native-bottom-idle.png) | ![](ios/chat-native-after-idle.png) | +| Slow pan with keyboard open | ![](ios/chat-gesture-open.png) | ![](ios/chat-slow-down.png) | +| Chat capped header dismissal | ![](ios/chat-cap-open.png) | ![](ios/chat-header-dismissed.png) | +| New agent tab capped header dismissal | ![](ios/workspace-draft-cap-open.png) | ![](ios/workspace-draft-header-dismissed.png) | +| New workspace capped header dismissal | ![](ios/new-workspace-cap-open.png) | ![](ios/new-workspace-header-dismissed.png) | + +## Static checks + +```text +npm run format: exit 0 +npm run lint: exit 0; 0 warnings, 0 errors +npm run typecheck: exit 0; all workspaces +``` + +[Format](composer-scroll-format.log), [lint](composer-scroll-lint.log), [typecheck](composer-scroll-typecheck.log). + +## Production APK + +[Install the plain production APK](https://dev-new.tail8fe838.ts.net/paseo-composer-dock-b5e63f716.apk), built from pushed commit `b5e63f7160abe3fe3d7894fb603db2b3d2a2c219`. [Build output](release-build.log), [package metadata](apk-metadata.log), [HTTP verification](apk-http.log). + +```sh +cd packages/app +npm --prefix ../.. run build:client && CI=1 APP_VARIANT=production npx expo prebuild --platform android --clean --non-interactive && cd android && ./gradlew assembleRelease --no-daemon -q +# exit 0; working tree clean afterward +# sh.paseo, version 0.8.0, versionCode 8000; target SDK 36; four ABIs +# HTTP 200, application/vnd.android.package-archive, 262457899 bytes +# SHA-256 b1ee48c1ddd16469ad0b2f257190bde4af3a1fd80666887b59a6a345bf3191a1 +``` + +Installed this APK successfully on the emulator and reran the original reported reproduction. Native stream displacement: **27.74%** from a fresh bottom and **25.07%** after returning to the bottom and waiting. [Assertion output](release/assertions.log), [original reproduction output](release/reproduction.log). + +| Production idle swipe | Before | After | +| --- | --- | --- | +| Rebuilt APK | ![](release/2-back-at-bottom-idle.png) | ![](release/3-after-scroll-up-2.png) | + +PR #4973 remains unmerged, pending physical-phone acceptance of this replacement APK. diff --git a/scroll-regression/after/0-bottom.png b/scroll-regression/after/0-bottom.png new file mode 100644 index 0000000000..4423864c56 Binary files /dev/null and b/scroll-regression/after/0-bottom.png differ diff --git a/scroll-regression/after/1-after-scroll-up.png b/scroll-regression/after/1-after-scroll-up.png new file mode 100644 index 0000000000..f1409a4db7 Binary files /dev/null and b/scroll-regression/after/1-after-scroll-up.png differ diff --git a/scroll-regression/after/2-back-at-bottom-idle.png b/scroll-regression/after/2-back-at-bottom-idle.png new file mode 100644 index 0000000000..99e4c68ff1 Binary files /dev/null and b/scroll-regression/after/2-back-at-bottom-idle.png differ diff --git a/scroll-regression/after/3-after-scroll-up-2.png b/scroll-regression/after/3-after-scroll-up-2.png new file mode 100644 index 0000000000..ca8c80d4c3 Binary files /dev/null and b/scroll-regression/after/3-after-scroll-up-2.png differ diff --git a/scroll-regression/after/4-after-scroll-up-3.png b/scroll-regression/after/4-after-scroll-up-3.png new file mode 100644 index 0000000000..b476383e60 Binary files /dev/null and b/scroll-regression/after/4-after-scroll-up-3.png differ diff --git a/scroll-regression/android/chat-native-scroll-after-idle-swipe.png b/scroll-regression/android/chat-native-scroll-after-idle-swipe.png new file mode 100644 index 0000000000..6a41587c11 Binary files /dev/null and b/scroll-regression/android/chat-native-scroll-after-idle-swipe.png differ diff --git a/scroll-regression/android/chat-native-scroll-after-submit-swipe.png b/scroll-regression/android/chat-native-scroll-after-submit-swipe.png new file mode 100644 index 0000000000..535abbb4c6 Binary files /dev/null and b/scroll-regression/android/chat-native-scroll-after-submit-swipe.png differ diff --git a/scroll-regression/android/chat-native-scroll-bottom-idle.png b/scroll-regression/android/chat-native-scroll-bottom-idle.png new file mode 100644 index 0000000000..4e95489bca Binary files /dev/null and b/scroll-regression/android/chat-native-scroll-bottom-idle.png differ diff --git a/scroll-regression/android/chat-native-scroll-submitted.png b/scroll-regression/android/chat-native-scroll-submitted.png new file mode 100644 index 0000000000..4e95489bca Binary files /dev/null and b/scroll-regression/android/chat-native-scroll-submitted.png differ diff --git a/scroll-regression/android/new-workspace-native-scroll-after-idle-swipe.png b/scroll-regression/android/new-workspace-native-scroll-after-idle-swipe.png new file mode 100644 index 0000000000..243caf3d13 Binary files /dev/null and b/scroll-regression/android/new-workspace-native-scroll-after-idle-swipe.png differ diff --git a/scroll-regression/android/new-workspace-native-scroll-after-submit-swipe.png b/scroll-regression/android/new-workspace-native-scroll-after-submit-swipe.png new file mode 100644 index 0000000000..49b6082a25 Binary files /dev/null and b/scroll-regression/android/new-workspace-native-scroll-after-submit-swipe.png differ diff --git a/scroll-regression/android/new-workspace-native-scroll-bottom-idle.png b/scroll-regression/android/new-workspace-native-scroll-bottom-idle.png new file mode 100644 index 0000000000..49b6082a25 Binary files /dev/null and b/scroll-regression/android/new-workspace-native-scroll-bottom-idle.png differ diff --git a/scroll-regression/android/new-workspace-native-scroll-submitted.png b/scroll-regression/android/new-workspace-native-scroll-submitted.png new file mode 100644 index 0000000000..0e1a2f964e Binary files /dev/null and b/scroll-regression/android/new-workspace-native-scroll-submitted.png differ diff --git a/scroll-regression/android/workspace-draft-native-scroll-after-idle-swipe.png b/scroll-regression/android/workspace-draft-native-scroll-after-idle-swipe.png new file mode 100644 index 0000000000..dd5b3b0cd0 Binary files /dev/null and b/scroll-regression/android/workspace-draft-native-scroll-after-idle-swipe.png differ diff --git a/scroll-regression/android/workspace-draft-native-scroll-after-submit-swipe.png b/scroll-regression/android/workspace-draft-native-scroll-after-submit-swipe.png new file mode 100644 index 0000000000..8181a9bb3a Binary files /dev/null and b/scroll-regression/android/workspace-draft-native-scroll-after-submit-swipe.png differ diff --git a/scroll-regression/android/workspace-draft-native-scroll-bottom-idle.png b/scroll-regression/android/workspace-draft-native-scroll-bottom-idle.png new file mode 100644 index 0000000000..8181a9bb3a Binary files /dev/null and b/scroll-regression/android/workspace-draft-native-scroll-bottom-idle.png differ diff --git a/scroll-regression/android/workspace-draft-native-scroll-submitted.png b/scroll-regression/android/workspace-draft-native-scroll-submitted.png new file mode 100644 index 0000000000..589b52d039 Binary files /dev/null and b/scroll-regression/android/workspace-draft-native-scroll-submitted.png differ diff --git a/scroll-regression/apk-http.log b/scroll-regression/apk-http.log new file mode 100644 index 0000000000..80f5e13f08 --- /dev/null +++ b/scroll-regression/apk-http.log @@ -0,0 +1,7 @@ +HTTP/2 200 +accept-ranges: bytes +content-type: application/vnd.android.package-archive +last-modified: Wed, 16 Sep 2026 21:22:53 GMT +content-length: 262457899 +date: Wed, 16 Sep 2026 21:23:03 GMT + diff --git a/scroll-regression/apk-metadata.log b/scroll-regression/apk-metadata.log new file mode 100644 index 0000000000..ba30a39d9f --- /dev/null +++ b/scroll-regression/apk-metadata.log @@ -0,0 +1,4 @@ +package: name='sh.paseo' versionCode='8000' versionName='0.8.0' platformBuildVersionName='16' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='16' +sdkVersion:'29' +targetSdkVersion:'36' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' diff --git a/scroll-regression/before/0-bottom.png b/scroll-regression/before/0-bottom.png new file mode 100644 index 0000000000..41d340dba1 Binary files /dev/null and b/scroll-regression/before/0-bottom.png differ diff --git a/scroll-regression/before/1-after-scroll-up.png b/scroll-regression/before/1-after-scroll-up.png new file mode 100644 index 0000000000..f5757c7aa3 Binary files /dev/null and b/scroll-regression/before/1-after-scroll-up.png differ diff --git a/scroll-regression/before/2-back-at-bottom-idle.png b/scroll-regression/before/2-back-at-bottom-idle.png new file mode 100644 index 0000000000..eba5261b15 Binary files /dev/null and b/scroll-regression/before/2-back-at-bottom-idle.png differ diff --git a/scroll-regression/before/3-after-scroll-up-2.png b/scroll-regression/before/3-after-scroll-up-2.png new file mode 100644 index 0000000000..b339b0c834 Binary files /dev/null and b/scroll-regression/before/3-after-scroll-up-2.png differ diff --git a/scroll-regression/before/4-after-scroll-up-3.png b/scroll-regression/before/4-after-scroll-up-3.png new file mode 100644 index 0000000000..bdedf80c5f Binary files /dev/null and b/scroll-regression/before/4-after-scroll-up-3.png differ diff --git a/scroll-regression/composer-scroll-format.log b/scroll-regression/composer-scroll-format.log new file mode 100644 index 0000000000..0def9d057f --- /dev/null +++ b/scroll-regression/composer-scroll-format.log @@ -0,0 +1,39 @@ + +> paseo@0.8.0 format +> oxfmt . + +(node:3389721) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389855) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389870) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389809) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389852) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389802) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389796) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389790) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389863) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389864) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389777) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389856) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389776) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389817) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389783) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389784) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389826) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Finished in 1520ms on 4547 files using 16 threads. diff --git a/scroll-regression/composer-scroll-lint.log b/scroll-regression/composer-scroll-lint.log new file mode 100644 index 0000000000..4fc67dba97 --- /dev/null +++ b/scroll-regression/composer-scroll-lint.log @@ -0,0 +1,6 @@ + +> paseo@0.8.0 lint +> oxlint + +Found 0 warnings and 0 errors. +Finished in 849ms on 4260 files with 177 rules using 16 threads. diff --git a/scroll-regression/composer-scroll-typecheck.log b/scroll-regression/composer-scroll-typecheck.log new file mode 100644 index 0000000000..837b8297c1 --- /dev/null +++ b/scroll-regression/composer-scroll-typecheck.log @@ -0,0 +1,59 @@ + +> paseo@0.8.0 typecheck +> npm run typecheck --workspaces --if-present + + +> @getpaseo/expo-two-way-audio@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/highlight@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/plugin@0.8.0 typecheck +> tsgo --noEmit && tsgo -p tsconfig.examples.json --noEmit + + +> @getpaseo/protocol@0.8.0 pretypecheck +> npm run generate:validators + + +> @getpaseo/protocol@0.8.0 generate:validators +> node scripts/generate-validation-aot.mjs + +(node:3390483) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +generated src/generated/validation/ws-outbound.aot.ts from codegen/ws-outbound.compile.ts (WSOutboundMessageSchema) + +> @getpaseo/protocol@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/client@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/server@0.8.0 typecheck +> tsgo -p tsconfig.server.typecheck.json --noEmit + + +> @getpaseo/app@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/relay@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/website@0.8.0 typecheck +> tsgo --noEmit + + +> @getpaseo/desktop@0.8.0 typecheck +> tsgo --noEmit -p tsconfig.json + + +> @getpaseo/cli@0.8.0 typecheck +> tsgo --noEmit + diff --git a/scroll-regression/green-assertion.log b/scroll-regression/green-assertion.log new file mode 100644 index 0000000000..2254ed37e1 --- /dev/null +++ b/scroll-regression/green-assertion.log @@ -0,0 +1,2 @@ +Native swipe moved stream content: 23.89% changed +Native swipe moved stream content: 26.44% changed diff --git a/scroll-regression/harness-final.log b/scroll-regression/harness-final.log new file mode 100644 index 0000000000..0e1600b395 --- /dev/null +++ b/scroll-regression/harness-final.log @@ -0,0 +1,3142 @@ + +> paseo@0.8.0 test:e2e:composer-keyboard:android +> ./packages/app/e2e/mobile/composer-keyboard/android.sh + +(node:3389115) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389136) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389147) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389147) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389168) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Opened: sh.paseo.debug +Session state: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/.dev/agent-device-composer-keyboard/sessions/composer-keyboard-android +(node:3389270) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389487) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389509) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389520) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3389520) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Using workspace wks_3acbfdfad4f0df0c +Warning: Activity not started, intent has been delivered to currently running top-most instance. +Warning: Activity not started, intent has been delivered to currently running top-most instance. +(node:3390582) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3390589) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3390622) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 900ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3390739) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3390750) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3390757) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3390764) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Warning: Activity not started, its current task has been brought to the front +(node:3390981) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391107) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391256) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391282) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391289) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391305) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391324) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391331) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1084ms: +9 -16 (~3 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [button] "Create profile" +- @e10 [text] "Create profile" +- @e11 [button] "Select model (Five minute stream)" +- @e12 [text] "Model" +- @e13 [text] "Five minute stream" +- @e14 [button] "Select thinking option (Low)" +- @e15 [text] "Thinking" +- @e16 [text] "Low" +- @e17 [button] "Select agent mode (Load test)" +- @e18 [text] "Mode" +- @e19 [text] "Load test" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [scroll-area] ++ @e7 [group] "/clear, Archive this agent and start a fresh draft" ++ @e8 [text] "/clear" ++ @e9 [text] "Archive this agent and start a fresh draft" ++ @e10 [group] "/exit, Archive the current agent" ++ @e11 [text] "/exit" ++ @e12 [text] "Archive the current agent" +(node:3391405) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Warning: Activity not started, its current task has been brought to the front +(node:3391431) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391486) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391547) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391584) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391591) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391611) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391618) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 57 chars +settled after 839ms: +2 -5 (~33 unchanged) +- @e25 [text] "10:59 PM" +- @e26 [button] "Rewind to this message" +- @e27 [button] "Copy message" +- @e31 [text-field] "Message, @files, /commands" ++ @e28 [text-field] "keyboard invariant line one +line two +line three +line four" +- @e38 [button] "Enable Voice mode" ++ @e35 [button] "Send message" +(node:3391660) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391667) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 57 chars +settled after 861ms: +0 -0 (~35 unchanged) +unchanged interactive (20): += @e1~s410877 [image] "Back" += @e2~s410877 [image] "Home" += @e3~s410877 [image] "Recents" += @e4~s410877 [scroll-area] += @e5~s410877 [scroll-area] += @e6~s410877 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s410877 [button] "Open menu" += @e8~s410877 [text] "Fix composer flickering and resize regressions" += @e9~s410877 [text] "paseo" += @e10~s410877 [text] "·" += @e11~s410877 [text] "dev-new" += @e12~s410877 [button] "Workspace actions" += @e13~s410877 [button] "Workspace scripts" += @e14~s410877 [button] "Open Explorer sidebar" += @e15~s410877 [button] "Switch tabs (31 open)" += @e16~s410877 [text] "Keyboard dismiss QA 1789592328" += @e17~s410877 [scroll-area] "agent-chat-scroll" += @e18~s410877 [button] "Copy turn" += @e19~s410877 [button] "Fork chat from here" += @e20~s410877 [button] "Worked for 2s, ended 10:59 PM" +… more interactive elements not shown, use snapshot -i +(node:3391734) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Warning: Activity not started, its current task has been brought to the front +(node:3391781) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391829) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391860) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3391892) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1331 chars +settled after 827ms: +1 -3 (~33 unchanged) +- @e4 [image] "IME switcher" +- @e23 [text] "Cycle 1" +- @e29 [text-field] "keyboard invariant line one +line two +line three +line four" ++ @e27 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" +unchanged interactive (20): += @e1~s410884 [image] "Back" += @e2~s410884 [image] "Home" += @e3~s410884 [image] "Recents" += @e4~s410884 [scroll-area] += @e5~s410884 [scroll-area] += @e6~s410884 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s410884 [button] "Open menu" += @e8~s410884 [text] "Fix composer flickering and resize regressions" += @e9~s410884 [text] "paseo" += @e10~s410884 [text] "·" += @e11~s410884 [text] "dev-new" += @e12~s410884 [button] "Workspace actions" += @e13~s410884 [button] "Workspace scripts" += @e14~s410884 [button] "Open Explorer sidebar" += @e15~s410884 [button] "Switch tabs (31 open)" += @e16~s410884 [text] "Keyboard dismiss QA 1789592328" += @e17~s410884 [scroll-area] "agent-chat-scroll" += @e18~s410884 [button] "Copy turn" += @e19~s410884 [button] "Fork chat from here" += @e20~s410884 [button] "Worked for 2s, ended 10:59 PM" +… more interactive elements not shown, use snapshot -i +(node:3391963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392018) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392039) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392057) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=344, header=330, bottom=1007, keyboard=1048 +(node:3392119) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 27 chars +settled after 822ms: +1 -2 (~33 unchanged) +- @e4 [image] "IME switcher" +- @e28 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e27 [text-field] "ddjdj" +unchanged interactive (20): += @e1~s410891 [image] "Back" += @e2~s410891 [image] "Home" += @e3~s410891 [image] "Recents" += @e4~s410891 [scroll-area] += @e5~s410891 [scroll-area] += @e6~s410891 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s410891 [button] "Open menu" += @e8~s410891 [text] "Fix composer flickering and resize regressions" += @e9~s410891 [text] "paseo" += @e10~s410891 [text] "·" += @e11~s410891 [text] "dev-new" += @e12~s410891 [button] "Workspace actions" += @e13~s410891 [button] "Workspace scripts" += @e14~s410891 [button] "Open Explorer sidebar" += @e15~s410891 [button] "Switch tabs (31 open)" += @e16~s410891 [text] "Keyboard dismiss QA 1789592328" += @e17~s410891 [scroll-area] "agent-chat-scroll" += @e18~s410891 [button] "Copy turn" += @e19~s410891 [button] "Fork chat from here" += @e20~s410891 [button] "Worked for 2s, ended 10:59 PM" +… more interactive elements not shown, use snapshot -i +(node:3392289) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392338) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392446) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392494) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392838) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392845) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392865) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 57 chars +settled after 854ms: +2 -5 (~33 unchanged) +- @e25 [text] "10:59 PM" +- @e26 [button] "Rewind to this message" +- @e27 [button] "Copy message" +- @e31 [text-field] "Message, @files, /commands" ++ @e28 [text-field] "keyboard invariant line one +line two +line three +line four" +- @e38 [button] "Enable Voice mode" ++ @e35 [button] "Send message" +(node:3392931) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3392979) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393023) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393032) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393100) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close Explorer sidebar" (1035, 156) +settled after 1026ms: +31 -22 (~4 unchanged) +- @e4 [group] "Changes" +- @e5 [text] "Changes" +- @e6 [group] "Files" +- @e7 [text] "Files" +- @e8 [group] "4973" +- @e9 [text] "4973" +- @e10 [button] "Close Explorer sidebar" +- @e11 [button] "Current branch: fix/new-workspace-composer-dock. Press to switch branch." +- @e12 [text] "fix/new-workspace-composer-dock" +- @e13 [button] "Pull request #4973" +- @e14 [text] "#4973" +- @e15 [button] "Open on GitHub" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" +- @e17 [button] "Diff mode" +- @e18 [text] "Uncommitted" +- @e19 [button] "Refresh" +- @e20 [button] "Diff options" +- @e21 [scroll-area] "git-diff-scroll" +- @e22 [group] "docs/floating-panels.md, +9, -2" +- @e23 [group] "docs/mobile-testing.md, +5, -1" +- @e24 [button] "Jump to file" +- @e25 [button] "Commits" +- @e26 [text] "Commits" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (31 open)" ++ @e16 [text] "Keyboard dismiss QA 1789592328" ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Copy turn" ++ @e19 [button] "Fork chat from here" ++ @e20 [button] "Worked for 2s, ended 10:59 PM" ++ @e21 [text] "Worked for 2s" ++ @e22 [text] "Cycle 1" ++ @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind" ++ @e24 [text] "(end of synthetic stream)" ++ @e25 [button] "Open Changes tab" ++ @e26 [text] "+2.9k" ++ @e27 [text] "-1.5k" ++ @e28 [text-field] "keyboard invariant line one +line two +line three +line four" ++ @e29 [button] "Add attachment" ++ @e30 [button] "Select model (Five minute stream)" ++ @e31 [text] "Five minute stream" ++ @e32 [text] "Low" ++ @e33 [image] "Context window 0% used" ++ @e34 [button] "Start dictation" ++ @e35 [button] "Send message" +(node:3393135) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393142) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393208) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393256) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393301) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393308) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped (540, 600) +settled after 991ms: +32 -12 (~3 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (31 open)" ++ @e16 [text] "Keyboard dismiss QA 1789592328" ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Copy turn" ++ @e19 [button] "Fork chat from here" ++ @e20 [button] "Worked for 2s, ended 10:59 PM" ++ @e21 [text] "Worked for 2s" ++ @e22 [text] "Cycle 1" ++ @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind" ++ @e24 [text] "(end of synthetic stream)" ++ @e25 [button] "Open Changes tab" ++ @e26 [text] "+2.9k" ++ @e27 [text] "-1.5k" ++ @e28 [text-field] "keyboard invariant line one +line two +line three +line four" ++ @e29 [button] "Add attachment" ++ @e30 [button] "Select model (Five minute stream)" ++ @e31 [text] "Five minute stream" ++ @e32 [text] "Low" ++ @e33 [image] "Context window 0% used" ++ @e34 [button] "Start dictation" ++ @e35 [button] "Send message" +(node:3393342) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393391) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393442) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393481) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393548) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393608) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393637) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393660) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393708) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393728) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393759) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393784) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393835) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="menu-button" (63, 157) +settled after 3725ms: +58 -33 (~5 unchanged) +- @e4 [scroll-area] +- @e5 [scroll-area] +- @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" +- @e7 [button] "Open menu" +- @e8 [text] "Fix composer flickering and resize regressions" +- @e9 [text] "paseo" +- @e10 [text] "·" ++ @e4 [button] "Close sidebar" ++ @e5 [button] "New workspace" ++ @e6 [text] "New workspace" ++ @e7 [button] "History" ++ @e8 [text] "History" ++ @e9 [button] "Search" ++ @e10 [text] "Search" ++ @e11 [button] "Schedules" ++ @e12 [text] "Schedules" ++ @e13 [scroll-area] "sidebar-project-workspace-list-scroll" ++ @e14 [button] "Pinned" ++ @e15 [text] "Pinned" ++ @e16 [scroll-area] "sidebar-pinned-list" ++ @e17 [button] "skills, Skills, dev-new" ++ @e18 [text] "S" ++ @e19 [text] "Skills" ++ @e20 [button] "Workspace actions" ++ @e22 [button] "hub, Hub, dev-new" ++ @e23 [text] "H" ++ @e24 [text] "Hub" +- @e13 [button] "Workspace scripts" +- @e14 [button] "Open Explorer sidebar" +- @e15 [button] "Switch tabs (31 open)" +- @e16 [text] "Keyboard dismiss QA 1789592328" +- @e17 [scroll-area] "agent-chat-scroll" +- @e18 [button] "Copy turn" +- @e19 [button] "Fork chat from here" +- @e20 [button] "Worked for 2s, ended 11:00 PM" +- @e21 [text] "Worked for 2s" +- @e22 [text] "Cycle 1" +- @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This" +- @e24 [text] "(end of synthetic stream)" +- @e25 [text] "11:00 PM" +- @e26 [button] "Rewind to this message" +- @e27 [button] "Copy message" ++ @e26 [text] "dev-new" ++ @e27 [button] "assistant, Assistant, dev-new" ++ @e28 [text] "A" ++ @e29 [text] "Assistant" ++ @e30 [button] "Workspace actions" ++ @e31 [text] "dev-new" ++ @e32 [button] "paseo, Paseo, dev-new" ++ @e33 [text] "Paseo" ++ @e34 [button] "Workspace actions" ++ @e35 [text] "dev-new" ++ @e36 [text] "Workspaces" ++ @e37 [button] "Display preferences" ++ @e38 [scroll-area] "sidebar-project-list" ++ @e39 [button] "filthy-dragon" ++ @e40 [text] "filthy-dragon" ++ @e41 [button] "Create a new workspace for filthy-dragon" ++ @e42 [button] "Project actions" ++ @e43 [scroll-area] "sidebar-workspace-list-remote:github.com/getpaseo/paseo" ++ @e44 [button] "fix/composer-flickering-regression, dev-new, Pull request #4946, Ready to review" ++ @e45 [text] "fix/composer-flickering-regression" ++ @e46 [button] "Workspace actions" ++ @e47 [text] "dev-new" ++ @e48 [text] "·" ++ @e49 [group] "Pull request #4946" ++ @e50 [text] "4946" ++ @e51 [text] "·" ++ @e52 [text] "running" ++ @e53 [button] "debug-mobile-smooth-rendering, dev-new" ++ @e54 [text] "debug-mobile-smooth-rendering" ++ @e55 [button] "Workspace actions" ++ @e56 [text] "dev-new" ++ @e57 [button] "debug-mobile-smooth-rendering, dev-new, Ready to review" ++ @e58 [button] "Add project" ++ @e59 [text] "Add project" ++ @e60 [button] "Hosts" ++ @e61 [button] "Import session" ++ @e62 [button] "Help and support" ++ @e63 [button] "Settings" +… changed lines truncated +(node:3393870) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="sidebar-global-new-workspace" (540, 127) +settled after 1960ms: +18 -59 (~4 unchanged) +- @e4 [button] "Close sidebar" +- @e5 [button] "New workspace" +- @e6 [text] "New workspace" +- @e7 [button] "History" +- @e8 [text] "History" +- @e9 [button] "Search" +- @e10 [text] "Search" +- @e11 [button] "Schedules" +- @e12 [text] "Schedules" +- @e13 [scroll-area] "sidebar-project-workspace-list-scroll" +- @e14 [button] "Pinned" +- @e15 [text] "Pinned" +- @e16 [scroll-area] "sidebar-pinned-list" +- @e17 [button] "skills, Skills, dev-new" +- @e18 [text] "S" +- @e19 [text] "Skills" +- @e20 [button] "Workspace actions" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" ++ @e10 [button] "Host" +- @e22 [button] "hub, Hub, dev-new" +- @e23 [text] "H" +- @e24 [text] "Hub" +- @e25 [button] "Workspace actions" +- @e26 [text] "dev-new" +- @e27 [button] "assistant, Assistant, dev-new" +- @e28 [text] "A" +- @e29 [text] "Assistant" +- @e30 [button] "Workspace actions" +- @e31 [text] "dev-new" +- @e32 [button] "paseo, Paseo, dev-new" +- @e33 [text] "Paseo" +- @e34 [button] "Workspace actions" +- @e35 [text] "dev-new" +- @e36 [text] "Workspaces" +- @e37 [button] "Display preferences" +- @e38 [scroll-area] "sidebar-project-list" +- @e39 [button] "filthy-dragon" +- @e40 [text] "filthy-dragon" +- @e41 [button] "Create a new workspace for filthy-dragon" +- @e42 [button] "Project actions" +- @e43 [scroll-area] "sidebar-workspace-list-remote:github.com/getpaseo/paseo" +- @e44 [button] "fix/composer-flickering-regression, dev-new, Pull request #4946, Ready to review" +- @e45 [text] "fix/composer-flickering-regression" +- @e46 [button] "Workspace actions" +- @e47 [text] "dev-new" +- @e48 [text] "·" +- @e49 [group] "Pull request #4946" +- @e50 [text] "4946" +- @e51 [text] "·" +- @e52 [text] "running" +- @e53 [button] "debug-mobile-smooth-rendering, dev-new" +- @e54 [text] "debug-mobile-smooth-rendering" +- @e55 [button] "Workspace actions" +- @e56 [text] "dev-new" +- @e57 [button] "debug-mobile-smooth-rendering, dev-new, Ready to review" +- @e58 [button] "Add project" +- @e59 [text] "Add project" +- @e60 [button] "Hosts" +- @e61 [button] "Import session" +- @e62 [button] "Help and support" +- @e63 [button] "Settings" ++ @e12 [button] "Workspace isolation" ++ @e13 [text] "Local" ++ @e14 [button] "Choose what to launch" ++ @e15 [text] "Chat" ++ @e16 [text-field] "Message, @files, /commands" ++ @e17 [button] "Add attachment" ++ @e18 [button] "Select model (Ten second stream)" ++ @e19 [text] "Ten second stream" ++ @e20 [text] "Low" ++ @e21 [button] "Start dictation" ++ @e22 [button] "Create" +(node:3393891) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3393900) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1210ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s410942 [image] "Back" += @e2~s410942 [image] "Home" += @e3~s410942 [image] "Recents" += @e4~s410942 [scroll-area] += @e5~s410942 [group] "composer-dock-header" += @e6~s410942 [button] "Open menu" += @e7~s410942 [group] += @e8~s410942 [button] "Workspace project" += @e9~s410942 [text] "paseo" += @e10~s410942 [button] "Host" += @e11~s410942 [text] "dev-new" += @e12~s410942 [button] "Workspace isolation" += @e13~s410942 [text] "Local" += @e14~s410942 [button] "Choose what to launch" += @e15~s410942 [text] "Chat" += @e17~s410942 [button] "Add attachment" += @e18~s410942 [button] "Select model (Ten second stream)" += @e19~s410942 [text] "Ten second stream" += @e20~s410942 [text] "Low" += @e21~s410942 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3394007) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394287) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394518) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394580) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394671) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394696) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Setup fields followed composer growth: 124px +(node:3394803) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1331 chars +settled after 1179ms: +1 -2 (~21 unchanged) +- @e4 [image] "IME switcher" +- @e17 [text-field] "x + + +grown" ++ @e16 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" +unchanged interactive (20): += @e1~s410951 [image] "Back" += @e2~s410951 [image] "Home" += @e3~s410951 [image] "Recents" += @e4~s410951 [scroll-area] += @e5~s410951 [group] "composer-dock-header" += @e6~s410951 [button] "Open menu" += @e7~s410951 [group] += @e8~s410951 [button] "Workspace project" += @e9~s410951 [text] "paseo" += @e10~s410951 [button] "Host" += @e11~s410951 [text] "dev-new" += @e12~s410951 [button] "Workspace isolation" += @e13~s410951 [text] "Local" += @e14~s410951 [button] "Choose what to launch" += @e15~s410951 [text] "Chat" += @e17~s410951 [button] "Add attachment" += @e18~s410951 [button] "Select model (Ten second stream)" += @e19~s410951 [text] "Ten second stream" += @e20~s410951 [text] "Low" += @e21~s410951 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3394838) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394884) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394934) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3394963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395006) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=244, header=231, bottom=1006, keyboard=1048 +(node:3395176) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395197) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Setup fields visible above the composer: 813 <= 990 +Warning: Activity not started, intent has been delivered to currently running top-most instance. +(node:3395326) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +BEGIN host=chat +(node:3395377) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1545ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3395482) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395493) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395500) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395582) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395600) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395672) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395773) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395825) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3395881) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Content followed input growth: 124px +(node:3395922) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1331 chars +settled after 1613ms: +1 -2 (~33 unchanged) +- @e22 [text] "Cycle 1" +- @e28 [text-field] "short + + +grown" ++ @e27 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" +unchanged interactive (20): += @e1~s410969 [image] "Back" += @e2~s410969 [image] "Home" += @e3~s410969 [image] "Recents" += @e4~s410969 [scroll-area] += @e5~s410969 [scroll-area] += @e6~s410969 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s410969 [button] "Open menu" += @e8~s410969 [text] "Fix composer flickering and resize regressions" += @e9~s410969 [text] "paseo" += @e10~s410969 [text] "·" += @e11~s410969 [text] "dev-new" += @e12~s410969 [button] "Workspace actions" += @e13~s410969 [button] "Workspace scripts" += @e14~s410969 [button] "Open Explorer sidebar" += @e15~s410969 [button] "Switch tabs (31 open)" += @e16~s410969 [text] "Keyboard dismiss QA 1789592328" += @e17~s410969 [scroll-area] "agent-chat-scroll" += @e18~s410969 [button] "Copy turn" += @e19~s410969 [button] "Fork chat from here" += @e20~s410969 [button] "Worked for 2s, ended 11:00 PM" +… more interactive elements not shown, use snapshot -i +(node:3395980) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396034) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396052) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=344, header=330, bottom=1007, keyboard=1048 +(node:3396123) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396152) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396213) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396231) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=1090, header=330, bottom=1753, keyboard=1794 +(node:3396368) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396438) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396456) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396505) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 27 chars +settled after 2812ms: +1 -1 (~33 unchanged) +- @e27 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e27 [text-field] "ddjdj" +unchanged interactive (20): += @e1~s410979 [image] "Back" += @e2~s410979 [image] "Home" += @e3~s410979 [image] "Recents" += @e4~s410979 [scroll-area] += @e5~s410979 [scroll-area] += @e6~s410979 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s410979 [button] "Open menu" += @e8~s410979 [text] "Fix composer flickering and resize regressions" += @e9~s410979 [text] "paseo" += @e10~s410979 [text] "·" += @e11~s410979 [text] "dev-new" += @e12~s410979 [button] "Workspace actions" += @e13~s410979 [button] "Workspace scripts" += @e14~s410979 [button] "Open Explorer sidebar" += @e15~s410979 [button] "Switch tabs (31 open)" += @e16~s410979 [text] "Keyboard dismiss QA 1789592328" += @e17~s410979 [scroll-area] "agent-chat-scroll" += @e18~s410979 [button] "Copy turn" += @e19~s410979 [button] "Fork chat from here" += @e20~s410979 [button] "Worked for 2s, ended 11:00 PM" +… more interactive elements not shown, use snapshot -i +(node:3396847) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396865) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396908) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396926) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3396943) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397066) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397093) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397110) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: growth, header/keyboard/safe-area bounds, close/reopen height, hold-delete baseline, content/header dismissal, JS-stall motion +(node:3397274) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1662ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3397350) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397370) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397384) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: commands popover keyboard=closed +(node:3397490) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1811ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3397565) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397585) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3397610) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: files popover keyboard=closed +(node:3397678) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1898ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3397963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398063) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398083) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398101) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398118) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1718ms: +32 -13 (~6 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [button] "Create profile" +- @e10 [text] "Create profile" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (31 open)" ++ @e16 [text] "Keyboard dismiss QA 1789592328" ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Copy turn" ++ @e19 [button] "Fork chat from here" ++ @e20 [button] "Worked for 2s, ended 11:00 PM" ++ @e21 [text] "Worked for 2s" ++ @e22 [text] "Cycle 1" ++ @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This" ++ @e24 [text] "(end of synthetic stream)" ++ @e25 [text] "11:00 PM" ++ @e26 [button] "Rewind to this message" ++ @e27 [button] "Copy message" ++ @e28 [button] "Open Changes tab" ++ @e29 [text] "+2.9k" ++ @e30 [text] "-1.5k" ++ @e31 [text-field] "Message, @files, /commands" ++ @e32 [button] "Add attachment" +- @e12 [text] "Model" +- @e14 [button] "Select thinking option (Low)" +- @e15 [text] "Thinking" +- @e17 [button] "Select agent mode (Load test)" +- @e18 [text] "Mode" +- @e19 [text] "Load test" ++ @e36 [image] "Context window 0% used" ++ @e37 [button] "Start dictation" ++ @e38 [button] "Enable Voice mode" +PASS host=chat: model selector keyboard=closed +(node:3398161) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1777ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3398583) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398674) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398780) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398852) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3398956) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 2289ms: +4 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [text] "Searching..." +(node:3399660) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3399675) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3399767) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: attachment menu and forge picker keyboard=closed +(node:3399789) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1543ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3399853) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3399903) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3399910) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: commands popover keyboard=open +(node:3399953) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1379ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3400020) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400131) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400138) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: files popover keyboard=open +(node:3400168) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1463ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3400236) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400320) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400362) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400369) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400393) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1103ms: +32 -13 (~6 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [button] "Create profile" +- @e10 [text] "Create profile" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (31 open)" ++ @e16 [text] "Keyboard dismiss QA 1789592328" ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Copy turn" ++ @e19 [button] "Fork chat from here" ++ @e20 [button] "Worked for 2s, ended 11:00 PM" ++ @e21 [text] "Worked for 2s" ++ @e22 [text] "Cycle 1" ++ @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This" ++ @e24 [text] "(end of synthetic stream)" ++ @e25 [text] "11:00 PM" ++ @e26 [button] "Rewind to this message" ++ @e27 [button] "Copy message" ++ @e28 [button] "Open Changes tab" ++ @e29 [text] "+2.9k" ++ @e30 [text] "-1.5k" ++ @e31 [text-field] "Message, @files, /commands" ++ @e32 [button] "Add attachment" +- @e12 [text] "Model" +- @e14 [button] "Select thinking option (Low)" +- @e15 [text] "Thinking" +- @e17 [button] "Select agent mode (Load test)" +- @e18 [text] "Mode" +- @e19 [text] "Load test" ++ @e36 [image] "Context window 0% used" ++ @e37 [button] "Start dictation" ++ @e38 [button] "Enable Voice mode" +PASS host=chat: model selector keyboard=open +(node:3400432) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1629ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3400530) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400615) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400635) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400659) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400681) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 3676ms: +18 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [button] "#4904 fix(server): claim scheduled slots atomically" ++ @e10 [text] "#4904 fix(server): claim scheduled slots atomically" ++ @e11 [button] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e12 [text] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e13 [button] "#4972 Let plugins open external links and workspace browsers" ++ @e14 [text] "#4972 Let plugins open external links and workspace browsers" ++ @e15 [button] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e16 [text] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e17 [button] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e18 [text] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e19 [button] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e20 [text] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e21 [button] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e22 [text] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e23 [button] "#4961 fix(omp): reconcile duplicate foreground prompt echoes" +(node:3400800) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400807) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400826) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=chat: attachment menu and forge picker keyboard=open +(node:3400849) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1481ms: +2 -2 (~36 unchanged) +- @e31 [text-field] "Message, @files, /commands" ++ @e31 [text-field] "x" +- @e38 [button] "Enable Voice mode" ++ @e38 [button] "Send message" +(node:3400908) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400926) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400946) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3400963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 17 chars +(node:3401061) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3401085) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="model-row-mock-ten-second-stream" (540, 809) +settled after 2055ms: +12 -5 (~7 unchanged) +- @e7 [text-field] "Ten second stream" +- @e8 [scroll-area] +- @e9 [button] "Ten second stream, Mock Load Test · Fast realistic stream for tests and smoke checks." ++ @e7 [text-field] "Search models..." ++ @e8 [scroll-area] "compact-provider-list" ++ @e9 [button] "Create profile" ++ @e10 [text] "Create profile" ++ @e11 [button] "Select model (Ten second stream)" ++ @e12 [text] "Model" +- @e11 [text] "Mock Load Test · Fast realistic stream for tests and smoke checks." +- @e12 [button] "Create profile from this model" ++ @e14 [button] "Select thinking option (Low)" ++ @e15 [text] "Thinking" ++ @e16 [text] "Low" ++ @e17 [button] "Select agent mode (Load test)" ++ @e18 [text] "Mode" ++ @e19 [text] "Load test" +(node:3401114) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1655ms: +32 -13 (~6 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [button] "Create profile" +- @e10 [text] "Create profile" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (31 open)" ++ @e16 [text] "Keyboard dismiss QA 1789592328" ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Copy turn" ++ @e19 [button] "Fork chat from here" ++ @e20 [button] "Worked for 2s, ended 11:00 PM" ++ @e21 [text] "Worked for 2s" ++ @e22 [text] "Cycle 1" ++ @e23 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This" ++ @e24 [text] "(end of synthetic stream)" ++ @e25 [text] "11:00 PM" ++ @e26 [button] "Rewind to this message" ++ @e27 [button] "Copy message" ++ @e28 [button] "Open Changes tab" ++ @e29 [text] "+2.9k" ++ @e30 [text] "-1.5k" ++ @e31 [text-field] "Message, @files, /commands" ++ @e32 [button] "Add attachment" +- @e12 [text] "Model" +- @e14 [button] "Select thinking option (Low)" +- @e15 [text] "Thinking" +- @e17 [button] "Select agent mode (Load test)" +- @e18 [text] "Mode" +- @e19 [text] "Load test" ++ @e36 [image] "Context window 0% used" ++ @e37 [button] "Start dictation" ++ @e38 [button] "Enable Voice mode" +(node:3401164) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 4089 chars +(node:3401250) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Send message" (983, 1693) +not settled after 10000ms +hint: A snapshot capture stalled past the settle budget, so no settled diff is shown. The action itself succeeded; observe with wait stable or snapshot. +(node:3401483) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3401832) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3401973) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402010) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 24.30% changed +(node:3402515) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402546) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 23.50% changed +PASS host=chat: native stream swipe after submit and after idle at bottom +(node:3402576) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402587) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="workspace-header-menu-trigger" (849, 157) +settled after 2533ms: +25 -35 (~3 unchanged) +- @e4 [scroll-area] +- @e5 [scroll-area] +- @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" +- @e7 [button] "Open menu" +- @e8 [text] "Fix composer flickering and resize regressions" +- @e9 [text] "paseo" +- @e10 [text] "·" +- @e11 [text] "dev-new" +- @e12 [button] "Workspace actions" +- @e13 [button] "Workspace scripts" +- @e14 [button] "Open Explorer sidebar" +- @e15 [button] "Switch tabs (31 open)" +- @e16 [text] "Keyboard dismiss QA 1789592328" +- @e17 [scroll-area] "agent-chat-scroll" +- @e18 [text] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4" +- @e19 [text] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rath" +- @e20 [button] "Shell, node scripts/simulate-stream-burst.mjs" +- @e21 [text] "Shell" +- @e22 [text] "node scripts/simulate-stream-burst.mjs" +- @e23 [button] "Edit, packages/app/src/hooks/use-scroll-anchor.ts" +- @e24 [text] "Edit" +- @e25 [text] "packages/app/src/hooks/use-scroll-anchor.ts" +- @e26 [text] "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast." +- @e27 [button] "Scroll to bottom" +- @e28 [button] "Open Changes tab" +- @e29 [text] "+2.9k" +- @e30 [text] "-1.5k" +- @e31 [text-field] "Message, @files, /commands" +- @e32 [button] "Add attachment" +- @e33 [button] "Select model (Ten second stream)" +- @e34 [text] "Ten second stream" +- @e35 [text] "Low" +- @e36 [image] "Context window 3% used" +- @e37 [button] "Start dictation" +- @e38 [button] "Enable Voice mode" ++ @e4 [seekbar] "Bottom sheet handle" ++ @e5 [seekbar] "Bottom Sheet" ++ @e6 [scroll-area] "workspace-header-menu-content" ++ @e7 [text] "Workspace actions" ++ @e8 [group] "New agent" ++ @e9 [text] "New agent" ++ @e10 [group] "Copy workspace path" ++ @e11 [text] "Copy workspace path" ++ @e12 [group] "Copy branch name" ++ @e13 [text] "Copy branch name" ++ @e14 [group] "Import session" ++ @e15 [text] "Import session" ++ @e16 [text] "Terminal profiles" ++ @e17 [group] "New terminal" ++ @e18 [text] "New terminal" ++ @e19 [group] "Claude Code" ++ @e20 [text] "Claude Code" ++ @e21 [group] "Codex" ++ @e22 [text] "Codex" ++ @e23 [group] "OpenCode" ++ @e24 [text] "OpenCode" ++ @e25 [group] "Pi" ++ @e26 [text] "Pi" ++ @e27 [group] "Edit profiles" ++ @e28 [text] "Edit profiles" +(node:3402630) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402637) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="workspace-header-new-agent" (541, 651) +settled after 2029ms: +21 -24 (~4 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [scroll-area] "workspace-header-menu-content" +- @e7 [text] "Workspace actions" +- @e8 [group] "New agent" +- @e9 [text] "New agent" +- @e10 [group] "Copy workspace path" +- @e11 [text] "Copy workspace path" +- @e12 [group] "Copy branch name" +- @e13 [text] "Copy branch name" +- @e14 [group] "Import session" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (32 open)" ++ @e16 [text] "New Agent" ++ @e17 [scroll-area] ++ @e18 [button] "Import session" +- @e16 [text] "Terminal profiles" +- @e17 [group] "New terminal" +- @e18 [text] "New terminal" +- @e19 [group] "Claude Code" +- @e20 [text] "Claude Code" +- @e21 [group] "Codex" +- @e22 [text] "Codex" +- @e23 [group] "OpenCode" +- @e24 [text] "OpenCode" +- @e25 [group] "Pi" +- @e26 [text] "Pi" +- @e27 [group] "Edit profiles" +- @e28 [text] "Edit profiles" ++ @e20 [text-field] "Message, @files, /commands" ++ @e21 [button] "Add attachment" ++ @e22 [button] "Select model (Ten second stream)" ++ @e23 [text] "Ten second stream" ++ @e24 [text] "Low" ++ @e25 [button] "Start dictation" +(node:3402723) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +BEGIN host=workspace-draft +(node:3402748) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1163ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3402854) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402865) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402872) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402960) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3402978) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403039) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403106) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403149) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403179) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Content followed input growth: 124px +(node:3403246) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1331 chars +settled after 1129ms: +1 -1 (~25 unchanged) +- @e20 [text-field] "short + + +grown" ++ @e20 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" +unchanged interactive (20): += @e1~s411115 [image] "Back" += @e2~s411115 [image] "Home" += @e3~s411115 [image] "Recents" += @e4~s411115 [scroll-area] += @e5~s411115 [scroll-area] += @e6~s411115 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s411115 [button] "Open menu" += @e8~s411115 [text] "Fix composer flickering and resize regressions" += @e9~s411115 [text] "paseo" += @e10~s411115 [text] "·" += @e11~s411115 [text] "dev-new" += @e12~s411115 [button] "Workspace actions" += @e13~s411115 [button] "Workspace scripts" += @e14~s411115 [button] "Open Explorer sidebar" += @e15~s411115 [button] "Switch tabs (32 open)" += @e16~s411115 [text] "New Agent" += @e17~s411115 [scroll-area] += @e18~s411115 [button] "Import session" += @e19~s411115 [text] "Import session" += @e21~s411115 [button] "Add attachment" +… more interactive elements not shown, use snapshot -i +(node:3403313) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403367) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403385) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=470, header=330, bottom=1007, keyboard=1048 +(node:3403456) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403485) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403608) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403626) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=1216, header=330, bottom=1753, keyboard=1794 +(node:3403677) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403737) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403762) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3403805) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 27 chars +settled after 1274ms: +1 -1 (~25 unchanged) +- @e20 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e20 [text-field] "ddjdj" +unchanged interactive (20): += @e1~s411125 [image] "Back" += @e2~s411125 [image] "Home" += @e3~s411125 [image] "Recents" += @e4~s411125 [scroll-area] += @e5~s411125 [scroll-area] += @e6~s411125 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" += @e7~s411125 [button] "Open menu" += @e8~s411125 [text] "Fix composer flickering and resize regressions" += @e9~s411125 [text] "paseo" += @e10~s411125 [text] "·" += @e11~s411125 [text] "dev-new" += @e12~s411125 [button] "Workspace actions" += @e13~s411125 [button] "Workspace scripts" += @e14~s411125 [button] "Open Explorer sidebar" += @e15~s411125 [button] "Switch tabs (32 open)" += @e16~s411125 [text] "New Agent" += @e17~s411125 [scroll-area] += @e18~s411125 [button] "Import session" += @e19~s411125 [text] "Import session" += @e21~s411125 [button] "Add attachment" +… more interactive elements not shown, use snapshot -i +(node:3404220) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404238) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404275) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404293) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404342) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404485) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404502) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404526) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: growth, header/keyboard/safe-area bounds, close/reopen height, hold-delete baseline, content/header dismissal, JS-stall motion +(node:3404629) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1263ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3404793) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404813) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3404897) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: commands popover keyboard=closed +(node:3404952) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1126ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3405080) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405101) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405116) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: files popover keyboard=closed +(node:3405162) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1113ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3405310) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405328) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405432) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405439) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405456) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1313ms: +20 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (32 open)" ++ @e16 [text] "New Agent" ++ @e17 [scroll-area] ++ @e18 [button] "Import session" ++ @e19 [text] "Import session" ++ @e20 [text-field] "Message, @files, /commands" ++ @e21 [button] "Add attachment" +- @e36 [text] "Model" ++ @e24 [text] "Low" ++ @e25 [button] "Start dictation" +PASS host=workspace-draft: model selector keyboard=closed +(node:3405599) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1194ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3405660) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405678) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405708) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405715) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405732) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 2574ms: +18 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [button] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e10 [text] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e11 [button] "#4904 fix(server): claim scheduled slots atomically" ++ @e12 [text] "#4904 fix(server): claim scheduled slots atomically" ++ @e13 [button] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e14 [text] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e15 [button] "#4972 Let plugins open external links and workspace browsers" ++ @e16 [text] "#4972 Let plugins open external links and workspace browsers" ++ @e17 [button] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e18 [text] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e19 [button] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e20 [text] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e21 [button] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e22 [text] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e23 [button] "#4961 fix(omp): reconcile duplicate foreground prompt echoes" +(node:3405898) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405905) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3405931) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: attachment menu and forge picker keyboard=closed +(node:3405947) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1095ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3406014) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406064) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406071) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: commands popover keyboard=open +(node:3406136) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1209ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3406227) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406277) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406291) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: files popover keyboard=open +(node:3406390) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1146ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3406477) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406538) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406558) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406573) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3406632) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 2174ms: +20 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (32 open)" ++ @e16 [text] "New Agent" ++ @e17 [scroll-area] ++ @e18 [button] "Import session" ++ @e19 [text] "Import session" ++ @e20 [text-field] "Message, @files, /commands" ++ @e21 [button] "Add attachment" +- @e36 [text] "Model" ++ @e24 [text] "Low" ++ @e25 [button] "Start dictation" +PASS host=workspace-draft: model selector keyboard=open +(node:3406990) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 2234ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3407915) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3407963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3407983) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408013) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408030) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 7183ms: +18 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [button] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e10 [text] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e11 [button] "#4904 fix(server): claim scheduled slots atomically" ++ @e12 [text] "#4904 fix(server): claim scheduled slots atomically" ++ @e13 [button] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e14 [text] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e15 [button] "#4972 Let plugins open external links and workspace browsers" ++ @e16 [text] "#4972 Let plugins open external links and workspace browsers" ++ @e17 [button] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e18 [text] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e19 [button] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e20 [text] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e21 [button] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e22 [text] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e23 [button] "#4961 fix(omp): reconcile duplicate foreground prompt echoes" +(node:3408146) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408234) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408253) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=workspace-draft: attachment menu and forge picker keyboard=open +(node:3408300) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 3788ms: +2 -1 (~24 unchanged) +- @e20 [text-field] "Message, @files, /commands" ++ @e20 [text-field] "x" ++ @e26 [button] "Send message" +(node:3408408) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408426) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408486) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408602) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 17 chars +(node:3408803) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3408827) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="model-row-mock-ten-second-stream" (540, 809) +settled after 4867ms: +30 -5 (~7 unchanged) +- @e7 [text-field] "Ten second stream" +- @e8 [scroll-area] +- @e9 [button] "Ten second stream, Mock Load Test · Fast realistic stream for tests and smoke checks." ++ @e7 [text-field] "Search all models..." ++ @e8 [scroll-area] "compact-provider-list" ++ @e9 [text] "Profiles" ++ @e10 [button] "Edit agent profiles" ++ @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" ++ @e12 [text] "Kimi K3" ++ @e13 [text] "Pi · Kimi K3 · Medium" ++ @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" ++ @e15 [text] "hard worker" ++ @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" ++ @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" ++ @e18 [text] "Gemini 3.7 Flash" ++ @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" ++ @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" ++ @e21 [text] "Fable 5.1" ++ @e22 [text] "Claude · Fable 5.1 · Bypass · High" ++ @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" ++ @e24 [text] "UI / Opus" ++ @e25 [text] "Claude · Opus 5 · Bypass · High" ++ @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" ++ @e27 [text] "astra" ++ @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" ++ @e29 [button] "GLM 5.1, Pi · GLM 5.1" ++ @e30 [text] "GLM 5.1" ++ @e31 [text] "Pi · GLM 5.1" ++ @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e33 [text] "DeepSeek V4 Pro 0813" ++ @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e35 [button] "Select model (Ten second stream)" ++ @e36 [text] "Model" +- @e11 [text] "Mock Load Test · Fast realistic stream for tests and smoke checks." +- @e12 [button] "Create profile from this model" +(node:3408912) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1077ms: +20 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [scroll-area] ++ @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" ++ @e7 [button] "Open menu" ++ @e8 [text] "Fix composer flickering and resize regressions" ++ @e9 [text] "paseo" ++ @e10 [text] "·" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace actions" ++ @e13 [button] "Workspace scripts" ++ @e14 [button] "Open Explorer sidebar" ++ @e15 [button] "Switch tabs (32 open)" ++ @e16 [text] "New Agent" ++ @e17 [scroll-area] ++ @e18 [button] "Import session" ++ @e19 [text] "Import session" ++ @e20 [text-field] "Message, @files, /commands" ++ @e21 [button] "Add attachment" +- @e36 [text] "Model" ++ @e24 [text] "Low" ++ @e25 [button] "Start dictation" +(node:3408993) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 4089 chars +(node:3409132) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Send message" (983, 1693) +settled after 1124ms: +9 -9 (~17 unchanged) +- @e16 [text] "New Agent" +- @e17 [scroll-area] +- @e18 [button] "Import session" +- @e19 [text] "Import session" +- @e20 [text-field] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fixture 43: distinct history row after submitting from a dock host. +Native scroll fixture 44: distinct history row after submitting from a dock host. +Native scroll fixture 45: distinct history row after submitting from a dock host. +Native scroll fixture 46: distinct history row after submitting from a dock host. +Native scroll fixture 47: distinct history row after submitting from a dock host. +Native scroll fixture 48: distinct history row after submitting from a dock host. +Native scroll fixture 49: distinct history row after submitting from a dock host." +- @e21 [button] "Add attachment" +- @e22 [button] "Select model (Ten second stream)" ++ @e16 [text] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fixture 43: distinct history row after submitting from a dock host. +Native scroll fixture 44: distinct history row after submitting from a dock host. +Native scroll fixture 45: distinct history row after submitting from a dock host. +Native scroll fixture 46: distinct history row after submitting from a dock host. +Native scroll fixture 47: distinct history row after submitting from a dock host. +Native scroll fixture 48: distinct history row after submitting from a dock host. +Native scroll fixture 49: distinct history row after submitting from a dock host." ++ @e17 [scroll-area] "agent-chat-scroll" ++ @e18 [button] "Fork chat from here" ++ @e19 [text] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fixture 43: distinct history row after submitting from a dock host. +Native scroll fixture 44: distinct history row after submitting from a dock host. +Native scroll fixture 45: distinct history row after submitting from a dock host. +Native scroll fixture 46: distinct history row after submitting from a dock host. +Native scroll fixture 47: distinct history row after submitting from a dock host. +Native scroll fixture 48: distinct history row after submitting from a dock host. +Native scroll fixture 49: distinct history row after submitting from a dock host." ++ @e20 [text-field] "Message, @files, /commands" [disabled] ++ @e21 [button] "Add attachment" [disabled] ++ @e22 [button] "Select model (Ten second stream)" [disabled] +- @e25 [button] "Start dictation" +- @e26 [button] "Send message" ++ @e25 [button] "Start dictation" [disabled] ++ @e26 [button] "Send message" [disabled] +(node:3409156) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3409273) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3409319) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3409386) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 24.67% changed +(node:3409745) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410005) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 25.67% changed +PASS host=workspace-draft: native stream swipe after submit and after idle at bottom +(node:3410042) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410053) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="menu-button" (63, 157) +settled after 2842ms: +58 -37 (~5 unchanged) +- @e4 [scroll-area] +- @e5 [scroll-area] +- @e6 [group] "Fix composer flickering and resize regressions, paseo, ·, dev-new, dev-new" +- @e7 [button] "Open menu" +- @e8 [text] "Fix composer flickering and resize regressions" +- @e9 [text] "paseo" +- @e10 [text] "·" ++ @e4 [button] "Close sidebar" ++ @e5 [button] "New workspace" ++ @e6 [text] "New workspace" ++ @e7 [button] "History" ++ @e8 [text] "History" ++ @e9 [button] "Search" ++ @e10 [text] "Search" ++ @e11 [button] "Schedules" ++ @e12 [text] "Schedules" ++ @e13 [scroll-area] "sidebar-project-workspace-list-scroll" ++ @e14 [button] "Pinned" ++ @e15 [text] "Pinned" ++ @e16 [scroll-area] "sidebar-pinned-list" ++ @e17 [button] "skills, Skills, dev-new" ++ @e18 [text] "S" ++ @e19 [text] "Skills" ++ @e20 [button] "Workspace actions" ++ @e22 [button] "hub, Hub, dev-new, Ready to review" ++ @e23 [text] "H" ++ @e24 [text] "Hub" +- @e13 [button] "Workspace scripts" +- @e14 [button] "Open Explorer sidebar" +- @e15 [button] "Switch tabs (32 open)" +- @e16 [text] "Native scroll fixture 0: distinct history row after submitti" +- @e17 [scroll-area] "agent-chat-scroll" +- @e18 [button] "Shell, node scripts/simulate-stream-burst.mjs" +- @e19 [text] "Shell" +- @e20 [text] "node scripts/simulate-stream-burst.mjs" +- @e21 [button] "Edit, packages/app/src/hooks/use-scroll-anchor.ts" +- @e22 [text] "Edit" +- @e23 [text] "packages/app/src/hooks/use-scroll-anchor.ts" +- @e24 [text] "•" +- @e25 [text] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." +- @e26 [text] "•" +- @e27 [text] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." ++ @e26 [text] "dev-new" ++ @e27 [button] "assistant, Assistant, dev-new" ++ @e28 [text] "A" ++ @e29 [text] "Assistant" ++ @e30 [button] "Workspace actions" ++ @e31 [text] "dev-new" ++ @e32 [button] "paseo, Paseo, dev-new" ++ @e33 [text] "Paseo" ++ @e34 [button] "Workspace actions" ++ @e35 [text] "dev-new" ++ @e36 [text] "Workspaces" ++ @e37 [button] "Display preferences" ++ @e38 [scroll-area] "sidebar-project-list" ++ @e39 [button] "filthy-dragon" ++ @e40 [text] "filthy-dragon" ++ @e41 [button] "Create a new workspace for filthy-dragon" ++ @e42 [button] "Project actions" ++ @e43 [scroll-area] "sidebar-workspace-list-remote:github.com/getpaseo/paseo" ++ @e44 [button] "fix/composer-flickering-regression, dev-new, Pull request #4946, Ready to review" ++ @e45 [text] "fix/composer-flickering-regression" ++ @e46 [button] "Workspace actions" ++ @e47 [text] "dev-new" ++ @e48 [text] "·" ++ @e49 [group] "Pull request #4946" ++ @e50 [text] "4946" ++ @e51 [text] "·" ++ @e52 [text] "running" ++ @e53 [button] "debug-mobile-smooth-rendering, dev-new" ++ @e54 [text] "debug-mobile-smooth-rendering" ++ @e55 [button] "Workspace actions" ++ @e56 [text] "dev-new" ++ @e57 [button] "debug-mobile-smooth-rendering, dev-new, Ready to review" ++ @e58 [button] "Add project" ++ @e59 [text] "Add project" ++ @e60 [button] "Hosts" ++ @e61 [button] "Import session" ++ @e62 [button] "Help and support" ++ @e63 [button] "Settings" +… changed lines truncated +(node:3410084) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="sidebar-global-new-workspace" (540, 127) +settled after 1304ms: +16 -59 (~4 unchanged) +- @e4 [button] "Close sidebar" +- @e5 [button] "New workspace" +- @e6 [text] "New workspace" +- @e7 [button] "History" +- @e8 [text] "History" +- @e9 [button] "Search" +- @e10 [text] "Search" +- @e11 [button] "Schedules" +- @e12 [text] "Schedules" +- @e13 [scroll-area] "sidebar-project-workspace-list-scroll" +- @e14 [button] "Pinned" +- @e15 [text] "Pinned" +- @e16 [scroll-area] "sidebar-pinned-list" +- @e17 [button] "skills, Skills, dev-new" +- @e18 [text] "S" +- @e19 [text] "Skills" +- @e20 [button] "Workspace actions" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Host" +- @e22 [button] "hub, Hub, dev-new, Ready to review" +- @e23 [text] "H" +- @e24 [text] "Hub" +- @e25 [button] "Workspace actions" +- @e26 [text] "dev-new" +- @e27 [button] "assistant, Assistant, dev-new" +- @e28 [text] "A" +- @e29 [text] "Assistant" +- @e30 [button] "Workspace actions" +- @e31 [text] "dev-new" +- @e32 [button] "paseo, Paseo, dev-new" +- @e33 [text] "Paseo" +- @e34 [button] "Workspace actions" +- @e35 [text] "dev-new" +- @e36 [text] "Workspaces" +- @e37 [button] "Display preferences" +- @e38 [scroll-area] "sidebar-project-list" +- @e39 [button] "filthy-dragon" +- @e40 [text] "filthy-dragon" +- @e41 [button] "Create a new workspace for filthy-dragon" +- @e42 [button] "Project actions" +- @e43 [scroll-area] "sidebar-workspace-list-remote:github.com/getpaseo/paseo" +- @e44 [button] "fix/composer-flickering-regression, dev-new, Pull request #4946, Ready to review" +- @e45 [text] "fix/composer-flickering-regression" +- @e46 [button] "Workspace actions" +- @e47 [text] "dev-new" +- @e48 [text] "·" +- @e49 [group] "Pull request #4946" +- @e50 [text] "4946" +- @e51 [text] "·" +- @e52 [text] "running" +- @e53 [button] "debug-mobile-smooth-rendering, dev-new" +- @e54 [text] "debug-mobile-smooth-rendering" +- @e55 [button] "Workspace actions" +- @e56 [text] "dev-new" +- @e57 [button] "debug-mobile-smooth-rendering, dev-new, Ready to review" +- @e58 [button] "Add project" +- @e59 [text] "Add project" +- @e60 [button] "Hosts" +- @e61 [button] "Import session" +- @e62 [button] "Help and support" +- @e63 [button] "Settings" ++ @e10 [button] "Workspace isolation" ++ @e11 [text] "Local" ++ @e12 [button] "Choose what to launch" ++ @e13 [text] "Chat" ++ @e14 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e15 [button] "Add attachment" ++ @e16 [button] "Select model (Ten second stream)" ++ @e17 [text] "Ten second stream" ++ @e18 [text] "Low" ++ @e19 [button] "Start dictation" ++ @e20 [button] "Create" +(node:3410119) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +BEGIN host=new-workspace +(node:3410155) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1162ms: +3 -1 (~19 unchanged) ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" +- @e14 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e16 [text-field] "x" +(node:3410260) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410271) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410297) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410446) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410464) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410516) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410589) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410618) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410636) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Content followed input growth: 124px +(node:3410684) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1331 chars +settled after 1045ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "short + + +grown" ++ @e16 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" +unchanged interactive (20): += @e1~s411244 [image] "Back" += @e2~s411244 [image] "Home" += @e3~s411244 [image] "Recents" += @e4~s411244 [scroll-area] += @e5~s411244 [group] "composer-dock-header" += @e6~s411244 [button] "Open menu" += @e7~s411244 [group] += @e8~s411244 [button] "Workspace project" += @e9~s411244 [text] "paseo" += @e10~s411244 [button] "Host" += @e11~s411244 [text] "dev-new" += @e12~s411244 [button] "Workspace isolation" += @e13~s411244 [text] "Local" += @e14~s411244 [button] "Choose what to launch" += @e15~s411244 [text] "Chat" += @e17~s411244 [button] "Add attachment" += @e18~s411244 [button] "Select model (Ten second stream)" += @e19~s411244 [text] "Ten second stream" += @e20~s411244 [text] "Low" += @e21~s411244 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3410727) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410774) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410799) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=244, header=231, bottom=1006, keyboard=1048 +(node:3410866) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410895) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3410993) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411044) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Composer contained: top=990, header=231, bottom=1752, keyboard=1794 +(node:3411102) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411155) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411173) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411285) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 27 chars +settled after 1225ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "line1 line2 line3 line4 line5 line6 line7 line8 line9 line10 line11 line12 line13 line14 line15 line16 line17 line18 line19 line20 line21 line22 line23 line24 line25 line26 line27 line28 line29 line30 line31 line32 line33 line34 line35 line36 line37 line38 line39 line40 line41 line42 line43 line44 line45 line46 line47 line48 line49 line50 line51 line52 line53 line54 line55 line56 line57 line58 line59 line60 line61 line62 line63 line64 line65 line66 line67 line68 line69 line70 line71 line72 line73 line74 line75 line76 line77 line78 line79 line80 line81 line82 line83 line84 line85 line86 line87 line88 line89 line90 line91 line92 line93 line94 line95 line96 line97 line98 line99 line100 line101 line102 line103 line104 line105 line106 line107 line108 line109 line110 line111 line112 line113 line114 line115 line116 line117 line118 line119 line120 line121 line122 line123 line124 line125 line126 line127 line128 line129 line130 line131 line132 line133 line134 line135 line136 line137 line138 line139 line140 line141 line142 line143 line144 line145 line146 line147 line148 line149 line150 line151 line152 line153 line154 line155 line156 line157 line158 line159 line160 line161 line162 line163 line164 line165 line166 line167 line168 line169 line170 line171 line172 line173 line174 line175 line176 line177 line178 line179 line180" ++ @e16 [text-field] "ddjdj" +unchanged interactive (20): += @e1~s411255 [image] "Back" += @e2~s411255 [image] "Home" += @e3~s411255 [image] "Recents" += @e4~s411255 [scroll-area] += @e5~s411255 [group] "composer-dock-header" += @e6~s411255 [button] "Open menu" += @e7~s411255 [group] += @e8~s411255 [button] "Workspace project" += @e9~s411255 [text] "paseo" += @e10~s411255 [button] "Host" += @e11~s411255 [text] "dev-new" += @e12~s411255 [button] "Workspace isolation" += @e13~s411255 [text] "Local" += @e14~s411255 [button] "Choose what to launch" += @e15~s411255 [text] "Chat" += @e17~s411255 [button] "Add attachment" += @e18~s411255 [button] "Select model (Ten second stream)" += @e19~s411255 [text] "Ten second stream" += @e20~s411255 [text] "Low" += @e21~s411255 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3411766) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411784) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411828) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411846) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411870) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3411929) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412017) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412038) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: growth, header/keyboard/safe-area bounds, close/reopen height, hold-delete baseline, content/header dismissal, JS-stall motion +(node:3412089) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1067ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411260 [image] "Back" += @e2~s411260 [image] "Home" += @e3~s411260 [image] "Recents" += @e4~s411260 [scroll-area] += @e5~s411260 [group] "composer-dock-header" += @e6~s411260 [button] "Open menu" += @e7~s411260 [group] += @e8~s411260 [button] "Workspace project" += @e9~s411260 [text] "paseo" += @e10~s411260 [button] "Host" += @e11~s411260 [text] "dev-new" += @e12~s411260 [button] "Workspace isolation" += @e13~s411260 [text] "Local" += @e14~s411260 [button] "Choose what to launch" += @e15~s411260 [text] "Chat" += @e17~s411260 [button] "Add attachment" += @e18~s411260 [button] "Select model (Ten second stream)" += @e19~s411260 [text] "Ten second stream" += @e20~s411260 [text] "Low" += @e21~s411260 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3412328) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412479) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412553) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: commands popover keyboard=closed +(node:3412589) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1279ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411267 [image] "Back" += @e2~s411267 [image] "Home" += @e3~s411267 [image] "Recents" += @e4~s411267 [scroll-area] += @e5~s411267 [group] "composer-dock-header" += @e6~s411267 [button] "Open menu" += @e7~s411267 [group] += @e8~s411267 [button] "Workspace project" += @e9~s411267 [text] "paseo" += @e10~s411267 [button] "Host" += @e11~s411267 [text] "dev-new" += @e12~s411267 [button] "Workspace isolation" += @e13~s411267 [text] "Local" += @e14~s411267 [button] "Choose what to launch" += @e15~s411267 [text] "Chat" += @e17~s411267 [button] "Add attachment" += @e18~s411267 [button] "Select model (Ten second stream)" += @e19~s411267 [text] "Ten second stream" += @e20~s411267 [text] "Low" += @e21~s411267 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3412660) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412680) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412688) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: files popover keyboard=closed +(node:3412779) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1013ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411273 [image] "Back" += @e2~s411273 [image] "Home" += @e3~s411273 [image] "Recents" += @e4~s411273 [scroll-area] += @e5~s411273 [group] "composer-dock-header" += @e6~s411273 [button] "Open menu" += @e7~s411273 [group] += @e8~s411273 [button] "Workspace project" += @e9~s411273 [text] "paseo" += @e10~s411273 [button] "Host" += @e11~s411273 [text] "dev-new" += @e12~s411273 [button] "Workspace isolation" += @e13~s411273 [text] "Local" += @e14~s411273 [button] "Choose what to launch" += @e15~s411273 [text] "Chat" += @e17~s411273 [button] "Add attachment" += @e18~s411273 [button] "Select model (Ten second stream)" += @e19~s411273 [text] "Ten second stream" += @e20~s411273 [text] "Low" += @e21~s411273 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3412846) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412871) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412891) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412905) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3412933) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1538ms: +17 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" ++ @e10 [button] "Host" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace isolation" ++ @e13 [text] "Local" ++ @e14 [button] "Choose what to launch" ++ @e15 [text] "Chat" ++ @e16 [text-field] "Message, @files, /commands" ++ @e17 [button] "Add attachment" +- @e36 [text] "Model" ++ @e20 [text] "Low" ++ @e21 [button] "Start dictation" ++ @e22 [button] "Create" +PASS host=new-workspace: model selector keyboard=closed +(node:3412966) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 993ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411284 [image] "Back" += @e2~s411284 [image] "Home" += @e3~s411284 [image] "Recents" += @e4~s411284 [scroll-area] += @e5~s411284 [group] "composer-dock-header" += @e6~s411284 [button] "Open menu" += @e7~s411284 [group] += @e8~s411284 [button] "Workspace project" += @e9~s411284 [text] "paseo" += @e10~s411284 [button] "Host" += @e11~s411284 [text] "dev-new" += @e12~s411284 [button] "Workspace isolation" += @e13~s411284 [text] "Local" += @e14~s411284 [button] "Choose what to launch" += @e15~s411284 [text] "Chat" += @e17~s411284 [button] "Add attachment" += @e18~s411284 [button] "Select model (Ten second stream)" += @e19~s411284 [text] "Ten second stream" += @e20~s411284 [text] "Low" += @e21~s411284 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3413025) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413043) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413063) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413094) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413112) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 3205ms: +18 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [button] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e10 [text] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e11 [button] "#4904 fix(server): claim scheduled slots atomically" ++ @e12 [text] "#4904 fix(server): claim scheduled slots atomically" ++ @e13 [button] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e14 [text] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e15 [button] "#4972 Let plugins open external links and workspace browsers" ++ @e16 [text] "#4972 Let plugins open external links and workspace browsers" ++ @e17 [button] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e18 [text] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e19 [button] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e20 [text] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e21 [button] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e22 [text] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e23 [button] "#4961 fix(omp): reconcile duplicate foreground prompt echoes" +(node:3413220) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413295) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413327) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: attachment menu and forge picker keyboard=closed +(node:3413351) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1014ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411299 [image] "Back" += @e2~s411299 [image] "Home" += @e3~s411299 [image] "Recents" += @e4~s411299 [scroll-area] += @e5~s411299 [group] "composer-dock-header" += @e6~s411299 [button] "Open menu" += @e7~s411299 [group] += @e8~s411299 [button] "Workspace project" += @e9~s411299 [text] "paseo" += @e10~s411299 [button] "Host" += @e11~s411299 [text] "dev-new" += @e12~s411299 [button] "Workspace isolation" += @e13~s411299 [text] "Local" += @e14~s411299 [button] "Choose what to launch" += @e15~s411299 [text] "Chat" += @e17~s411299 [button] "Add attachment" += @e18~s411299 [button] "Select model (Ten second stream)" += @e19~s411299 [text] "Ten second stream" += @e20~s411299 [text] "Low" += @e21~s411299 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3413410) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413466) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413474) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: commands popover keyboard=open +(node:3413510) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 996ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411304 [image] "Back" += @e2~s411304 [image] "Home" += @e3~s411304 [image] "Recents" += @e4~s411304 [scroll-area] += @e5~s411304 [group] "composer-dock-header" += @e6~s411304 [button] "Open menu" += @e7~s411304 [group] += @e8~s411304 [button] "Workspace project" += @e9~s411304 [text] "paseo" += @e10~s411304 [button] "Host" += @e11~s411304 [text] "dev-new" += @e12~s411304 [button] "Workspace isolation" += @e13~s411304 [text] "Local" += @e14~s411304 [button] "Choose what to launch" += @e15~s411304 [text] "Chat" += @e17~s411304 [button] "Add attachment" += @e18~s411304 [button] "Select model (Ten second stream)" += @e19~s411304 [text] "Ten second stream" += @e20~s411304 [text] "Low" += @e21~s411304 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3413570) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413642) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413649) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: files popover keyboard=open +(node:3413692) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1241ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411309 [image] "Back" += @e2~s411309 [image] "Home" += @e3~s411309 [image] "Recents" += @e4~s411309 [scroll-area] += @e5~s411309 [group] "composer-dock-header" += @e6~s411309 [button] "Open menu" += @e7~s411309 [group] += @e8~s411309 [button] "Workspace project" += @e9~s411309 [text] "paseo" += @e10~s411309 [button] "Host" += @e11~s411309 [text] "dev-new" += @e12~s411309 [button] "Workspace isolation" += @e13~s411309 [text] "Local" += @e14~s411309 [button] "Choose what to launch" += @e15~s411309 [text] "Chat" += @e17~s411309 [button] "Add attachment" += @e18~s411309 [button] "Select model (Ten second stream)" += @e19~s411309 [text] "Ten second stream" += @e20~s411309 [text] "Low" += @e21~s411309 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3413809) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413863) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413883) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413897) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3413914) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1386ms: +17 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" ++ @e10 [button] "Host" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace isolation" ++ @e13 [text] "Local" ++ @e14 [button] "Choose what to launch" ++ @e15 [text] "Chat" ++ @e16 [text-field] "Message, @files, /commands" ++ @e17 [button] "Add attachment" +- @e36 [text] "Model" ++ @e20 [text] "Low" ++ @e21 [button] "Start dictation" ++ @e22 [button] "Create" +PASS host=new-workspace: model selector keyboard=open +(node:3413955) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 980ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411321 [image] "Back" += @e2~s411321 [image] "Home" += @e3~s411321 [image] "Recents" += @e4~s411321 [scroll-area] += @e5~s411321 [group] "composer-dock-header" += @e6~s411321 [button] "Open menu" += @e7~s411321 [group] += @e8~s411321 [button] "Workspace project" += @e9~s411321 [text] "paseo" += @e10~s411321 [button] "Host" += @e11~s411321 [text] "dev-new" += @e12~s411321 [button] "Workspace isolation" += @e13~s411321 [text] "Local" += @e14~s411321 [button] "Choose what to launch" += @e15~s411321 [text] "Chat" += @e17~s411321 [button] "Add attachment" += @e18~s411321 [button] "Select model (Ten second stream)" += @e19~s411321 [text] "Ten second stream" += @e20~s411321 [text] "Low" += @e21~s411321 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3414030) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414085) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414105) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414119) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414143) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="message-input-attachment-menu-item-github" (541, 1616) +settled after 3043ms: +18 -10 (~5 unchanged) +- @e6 [scroll-area] "message-input-attachment-menu-content" +- @e7 [text] "Add attachment" +- @e8 [group] "Add image" +- @e9 [text] "Add image" +- @e10 [group] "Paste image" +- @e11 [text] "Paste image" +- @e12 [group] "Add issue or PR" +- @e13 [text] "Add issue or PR" +- @e14 [group] "Upload file" +- @e15 [text] "Upload file" ++ @e6 [text] "Attach issue or PR" ++ @e7 [text-field] "Search issues and PRs..." ++ @e8 [scroll-area] ++ @e9 [button] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e10 [text] "#4974 Add standalone Vercel Sandbox hosting example" ++ @e11 [button] "#4904 fix(server): claim scheduled slots atomically" ++ @e12 [text] "#4904 fix(server): claim scheduled slots atomically" ++ @e13 [button] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e14 [text] "#4973 fix(app): keep composer layout stable across chat and workspace screens" ++ @e15 [button] "#4972 Let plugins open external links and workspace browsers" ++ @e16 [text] "#4972 Let plugins open external links and workspace browsers" ++ @e17 [button] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e18 [text] "#4969 fix(server): resolve workspace diff base against origin, not a stale local branch" ++ @e19 [button] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e20 [text] "#4968 bug: workspace diff/commit counts stay pinned to the wrong base after a PR targets a different branch" ++ @e21 [button] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e22 [text] "#4962 Feature request: first-class multi-project orchestration tasks" ++ @e23 [button] "#4961 fix(omp): reconcile duplicate foreground prompt echoes" +(node:3414304) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414311) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414330) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +PASS host=new-workspace: attachment menu and forge picker keyboard=open +(node:3414359) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 1 chars +settled after 1280ms: +1 -1 (~21 unchanged) +- @e16 [text-field] "Message, @files, /commands" ++ @e16 [text-field] "x" +unchanged interactive (20): += @e1~s411336 [image] "Back" += @e2~s411336 [image] "Home" += @e3~s411336 [image] "Recents" += @e4~s411336 [scroll-area] += @e5~s411336 [group] "composer-dock-header" += @e6~s411336 [button] "Open menu" += @e7~s411336 [group] += @e8~s411336 [button] "Workspace project" += @e9~s411336 [text] "paseo" += @e10~s411336 [button] "Host" += @e11~s411336 [text] "dev-new" += @e12~s411336 [button] "Workspace isolation" += @e13~s411336 [text] "Local" += @e14~s411336 [button] "Choose what to launch" += @e15~s411336 [text] "Chat" += @e17~s411336 [button] "Add attachment" += @e18~s411336 [button] "Select model (Ten second stream)" += @e19~s411336 [text] "Ten second stream" += @e20~s411336 [text] "Low" += @e21~s411336 [button] "Start dictation" +… more interactive elements not shown, use snapshot -i +(node:3414444) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414493) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="workspace-create-isolation-trigger" (162, 1212) +settled after 3693ms: +8 -18 (~4 unchanged) +- @e4 [scroll-area] +- @e5 [group] "composer-dock-header" +- @e6 [button] "Open menu" +- @e7 [group] +- @e8 [button] "Workspace project" +- @e9 [text] "paseo" +- @e10 [button] "Host" +- @e11 [text] "dev-new" +- @e12 [button] "Workspace isolation" ++ @e4 [seekbar] "Bottom sheet handle" ++ @e5 [seekbar] "Bottom Sheet" ++ @e6 [text] "Isolation" ++ @e7 [text-field] "Search..." ++ @e8 [scroll-area] ++ @e9 [button] "Local" +- @e14 [button] "Choose what to launch" +- @e15 [text] "Chat" +- @e16 [text-field] "Message, @files, /commands" +- @e17 [button] "Add attachment" +- @e18 [button] "Select model (Ten second stream)" +- @e19 [text] "Ten second stream" +- @e20 [text] "Low" +- @e21 [button] "Start dictation" +- @e22 [button] "Create" ++ @e11 [button] "New worktree" ++ @e12 [text] "New worktree" +(node:3414669) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped text="Local" (541, 1085) +settled after 1402ms: +18 -8 (~4 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [text] "Isolation" +- @e7 [text-field] "Search..." +- @e8 [scroll-area] +- @e9 [button] "Local" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" ++ @e10 [button] "Host" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace isolation" +- @e11 [button] "New worktree" +- @e12 [text] "New worktree" ++ @e14 [button] "Choose what to launch" ++ @e15 [text] "Chat" ++ @e16 [text-field] "Message, @files, /commands" ++ @e17 [button] "Add attachment" ++ @e18 [button] "Select model (Ten second stream)" ++ @e19 [text] "Ten second stream" ++ @e20 [text] "Low" ++ @e21 [button] "Start dictation" ++ @e22 [button] "Create" +(node:3414700) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414782) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3414803) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 17 chars +(node:3415058) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3415194) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="model-row-mock-ten-second-stream" (540, 809) +settled after 3065ms: +30 -5 (~7 unchanged) +- @e7 [text-field] "Ten second stream" +- @e8 [scroll-area] +- @e9 [button] "Ten second stream, Mock Load Test · Fast realistic stream for tests and smoke checks." ++ @e7 [text-field] "Search all models..." ++ @e8 [scroll-area] "compact-provider-list" ++ @e9 [text] "Profiles" ++ @e10 [button] "Edit agent profiles" ++ @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" ++ @e12 [text] "Kimi K3" ++ @e13 [text] "Pi · Kimi K3 · Medium" ++ @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" ++ @e15 [text] "hard worker" ++ @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" ++ @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" ++ @e18 [text] "Gemini 3.7 Flash" ++ @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" ++ @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" ++ @e21 [text] "Fable 5.1" ++ @e22 [text] "Claude · Fable 5.1 · Bypass · High" ++ @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" ++ @e24 [text] "UI / Opus" ++ @e25 [text] "Claude · Opus 5 · Bypass · High" ++ @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" ++ @e27 [text] "astra" ++ @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" ++ @e29 [button] "GLM 5.1, Pi · GLM 5.1" ++ @e30 [text] "GLM 5.1" ++ @e31 [text] "Pi · GLM 5.1" ++ @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e33 [text] "DeepSeek V4 Pro 0813" ++ @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e35 [button] "Select model (Ten second stream)" ++ @e36 [text] "Model" +- @e11 [text] "Mock Load Test · Fast realistic stream for tests and smoke checks." +- @e12 [button] "Create profile from this model" +(node:3415764) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped label="Close" (975, 531) +settled after 1832ms: +17 -32 (~5 unchanged) +- @e4 [seekbar] "Bottom sheet handle" +- @e5 [seekbar] "Bottom Sheet" +- @e6 [button] "Close" +- @e7 [text-field] "Search all models..." +- @e8 [scroll-area] "compact-provider-list" +- @e9 [text] "Profiles" +- @e10 [button] "Edit agent profiles" +- @e11 [button] "Kimi K3, Pi · Kimi K3 · Medium" +- @e12 [text] "Kimi K3" +- @e13 [text] "Pi · Kimi K3 · Medium" +- @e14 [button] "hard worker, Codex · GPT-5.6-Sol · Full access · Medium" +- @e15 [text] "hard worker" +- @e16 [text] "Codex · GPT-5.6-Sol · Full access · Medium" +- @e17 [button] "Gemini 3.7 Flash, Pi · Gemini 3.7 Flash · Extra high" +- @e18 [text] "Gemini 3.7 Flash" +- @e19 [text] "Pi · Gemini 3.7 Flash · Extra high" +- @e20 [button] "Fable 5.1, Claude · Fable 5.1 · Bypass · High" +- @e21 [text] "Fable 5.1" +- @e22 [text] "Claude · Fable 5.1 · Bypass · High" +- @e23 [button] "UI / Opus, Claude · Opus 5 · Bypass · High" +- @e24 [text] "UI / Opus" +- @e25 [text] "Claude · Opus 5 · Bypass · High" +- @e26 [button] "astra, Codex · GPT-6-Astra · Full access · Medium" +- @e27 [text] "astra" +- @e28 [text] "Codex · GPT-6-Astra · Full access · Medium" +- @e29 [button] "GLM 5.1, Pi · GLM 5.1" +- @e30 [text] "GLM 5.1" +- @e31 [text] "Pi · GLM 5.1" +- @e32 [button] "DeepSeek V4 Pro 0813, Pi · DeepSeek V4 Pro 0813 · Medium" +- @e33 [text] "DeepSeek V4 Pro 0813" +- @e34 [text] "Pi · DeepSeek V4 Pro 0813 · Medium" ++ @e4 [scroll-area] ++ @e5 [group] "composer-dock-header" ++ @e6 [button] "Open menu" ++ @e7 [group] ++ @e8 [button] "Workspace project" ++ @e9 [text] "paseo" ++ @e10 [button] "Host" ++ @e11 [text] "dev-new" ++ @e12 [button] "Workspace isolation" ++ @e13 [text] "Local" ++ @e14 [button] "Choose what to launch" ++ @e15 [text] "Chat" ++ @e16 [text-field] "Message, @files, /commands" ++ @e17 [button] "Add attachment" +- @e36 [text] "Model" ++ @e20 [text] "Low" ++ @e21 [button] "Start dictation" ++ @e22 [button] "Create" +(node:3416223) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Filled 4089 chars +(node:3416315) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Tapped id="workspace-create-submit" (983, 1692) +settled after 1490ms: +9 -9 (~13 unchanged) +- @e8 [button] "Workspace project" ++ @e8 [button] "Workspace project" [disabled] +- @e10 [button] "Host" ++ @e10 [button] "Host" [disabled] +- @e12 [button] "Workspace isolation" ++ @e12 [button] "Workspace isolation" [disabled] +- @e14 [button] "Choose what to launch" ++ @e14 [button] "Choose what to launch" [disabled] +- @e16 [text-field] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fixture 43: distinct history row after submitting from a dock host. +Native scroll fixture 44: distinct history row after submitting from a dock host. +Native scroll fixture 45: distinct history row after submitting from a dock host. +Native scroll fixture 46: distinct history row after submitting from a dock host. +Native scroll fixture 47: distinct history row after submitting from a dock host. +Native scroll fixture 48: distinct history row after submitting from a dock host. +Native scroll fixture 49: distinct history row after submitting from a dock host." +- @e17 [button] "Add attachment" +- @e18 [button] "Select model (Ten second stream)" ++ @e16 [text-field] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fixture 43: distinct history row after submitting from a dock host. +Native scroll fixture 44: distinct history row after submitting from a dock host. +Native scroll fixture 45: distinct history row after submitting from a dock host. +Native scroll fixture 46: distinct history row after submitting from a dock host. +Native scroll fixture 47: distinct history row after submitting from a dock host. +Native scroll fixture 48: distinct history row after submitting from a dock host. +Native scroll fixture 49: distinct history row after submitting from a dock host." [disabled] ++ @e17 [button] "Add attachment" [disabled] ++ @e18 [button] "Select model (Ten second stream)" [disabled] +- @e21 [button] "Start dictation" +- @e22 [button] "Create" ++ @e21 [button] "Start dictation" [disabled] ++ @e22 [button] "Create" [disabled] +(node:3416545) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3416840) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3416872) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3416909) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 24.05% changed +(node:3417037) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3417065) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Native swipe moved stream content: 24.33% changed +PASS host=new-workspace: native stream swipe after submit and after idle at bottom +Composer keyboard invariants passed diff --git a/scroll-regression/ios/chat-cap-open.json b/scroll-regression/ios/chat-cap-open.json new file mode 100644 index 0000000000..fe50fa2952 --- /dev/null +++ b/scroll-regression/ios/chat-cap-open.json @@ -0,0 +1,6061 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "label": "Paseo Debug", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "type": "Application", + "index": 0, + "enabled": true, + "hittable": true, + "depth": 0, + "ref": "e1" + }, + { + "type": "Window", + "enabled": true, + "index": 1, + "hittable": false, + "parentIndex": 0, + "depth": 1, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "ref": "e2" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "index": 2, + "enabled": true, + "parentIndex": 1, + "depth": 2, + "type": "Other", + "hittable": false, + "ref": "e3" + }, + { + "depth": 3, + "hittable": false, + "parentIndex": 2, + "index": 3, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "ref": "e4" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 4, + "enabled": true, + "parentIndex": 3, + "index": 4, + "ref": "e5" + }, + { + "enabled": true, + "hittable": false, + "type": "Window", + "parentIndex": 0, + "index": 5, + "depth": 1, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e6" + }, + { + "index": 6, + "type": "Other", + "parentIndex": 5, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "depth": 2, + "ref": "e7" + }, + { + "hittable": false, + "parentIndex": 6, + "depth": 3, + "index": 7, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "enabled": true, + "ref": "e8" + }, + { + "parentIndex": 7, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 8, + "hittable": false, + "type": "Other", + "ref": "e9" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 9, + "enabled": true, + "depth": 5, + "type": "Other", + "parentIndex": 8, + "hittable": false, + "ref": "e10" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 9, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 6, + "index": 10, + "ref": "e11" + }, + { + "parentIndex": 10, + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "enabled": true, + "index": 11, + "hittable": false, + "type": "Other", + "depth": 7, + "ref": "e12" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 12, + "enabled": true, + "parentIndex": 11, + "depth": 8, + "type": "Other", + "ref": "e13" + }, + { + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "parentIndex": 12, + "index": 13, + "enabled": true, + "depth": 9, + "type": "Other", + "ref": "e14" + }, + { + "index": 14, + "enabled": true, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "parentIndex": 12, + "hittable": false, + "type": "Other", + "depth": 9, + "ref": "e15" + }, + { + "type": "Other", + "parentIndex": 14, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "hittable": false, + "depth": 10, + "index": 15, + "ref": "e16" + }, + { + "depth": 10, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "parentIndex": 14, + "index": 16, + "enabled": true, + "type": "Other", + "ref": "e17" + }, + { + "type": "Other", + "parentIndex": 16, + "enabled": true, + "index": 17, + "depth": 11, + "hittable": false, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "ref": "e18" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "enabled": true, + "parentIndex": 16, + "depth": 11, + "index": 18, + "hittable": false, + "ref": "e19" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 12, + "index": 19, + "parentIndex": 18, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e20" + }, + { + "enabled": true, + "index": 20, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "type": "Other", + "depth": 13, + "parentIndex": 19, + "ref": "e21" + }, + { + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "parentIndex": 20, + "hittable": false, + "index": 21, + "enabled": true, + "depth": 14, + "ref": "e22" + }, + { + "index": 22, + "enabled": true, + "depth": 15, + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "parentIndex": 21, + "type": "Other", + "ref": "e23" + }, + { + "index": 23, + "enabled": true, + "depth": 16, + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 22, + "type": "Other", + "ref": "e24" + }, + { + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "type": "Other", + "parentIndex": 23, + "depth": 17, + "index": 24, + "ref": "e25" + }, + { + "type": "Other", + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 24, + "index": 25, + "hittable": false, + "enabled": true, + "depth": 18, + "ref": "e26" + }, + { + "index": 26, + "parentIndex": 25, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "depth": 19, + "type": "Other", + "ref": "e27" + }, + { + "depth": 20, + "type": "Other", + "parentIndex": 26, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "index": 27, + "enabled": true, + "hittable": false, + "ref": "e28" + }, + { + "parentIndex": 27, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "type": "Other", + "label": "Switch tabs (1 open)", + "index": 28, + "depth": 21, + "ref": "e29" + }, + { + "parentIndex": 28, + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "label": "Open menu", + "index": 29, + "depth": 22, + "ref": "e30" + }, + { + "hittable": false, + "parentIndex": 29, + "enabled": true, + "label": "Open menu", + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 30, + "depth": 23, + "ref": "e31" + }, + { + "enabled": true, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "index": 31, + "type": "Other", + "depth": 24, + "hittable": false, + "label": "Open menu", + "parentIndex": 30, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "ref": "e32" + }, + { + "hittable": false, + "depth": 25, + "label": "Open menu", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 126 + }, + "identifier": "composer-dock-header", + "parentIndex": 31, + "index": 32, + "enabled": true, + "type": "Other", + "ref": "e33" + }, + { + "hittable": false, + "depth": 26, + "rect": { + "width": 402, + "y": 70, + "x": 0, + "height": 56 + }, + "parentIndex": 32, + "index": 33, + "enabled": true, + "type": "Other", + "ref": "e34" + }, + { + "identifier": "menu-button", + "depth": 26, + "label": "Open menu", + "parentIndex": 32, + "hittable": false, + "type": "Button", + "index": 34, + "rect": { + "width": 32, + "y": 81.6666669845581, + "x": 8, + "height": 32 + }, + "enabled": true, + "ref": "e35" + }, + { + "depth": 26, + "parentIndex": 32, + "label": "main", + "hittable": false, + "type": "Other", + "index": 35, + "enabled": true, + "rect": { + "width": 314, + "y": 80.6666669845581, + "x": 48, + "height": 34 + }, + "ref": "e36" + }, + { + "label": "main", + "index": 36, + "rect": { + "width": 278, + "y": 80.6666669845581, + "x": 48, + "height": 34 + }, + "parentIndex": 35, + "hittable": false, + "type": "Other", + "depth": 27, + "enabled": true, + "ref": "e37" + }, + { + "enabled": true, + "depth": 28, + "identifier": "workspace-header-title", + "type": "StaticText", + "rect": { + "width": 278, + "y": 80.6666669845581, + "x": 48, + "height": 18 + }, + "label": "main", + "index": 37, + "hittable": false, + "parentIndex": 36, + "ref": "e38" + }, + { + "parentIndex": 37, + "enabled": true, + "depth": 29, + "label": "main", + "hittable": false, + "index": 38, + "rect": { + "width": 278, + "y": 80.6666669845581, + "x": 48, + "height": 18 + }, + "type": "StaticText", + "ref": "e39" + }, + { + "parentIndex": 36, + "enabled": true, + "depth": 28, + "label": "composer-dock-ios-fixture", + "index": 39, + "rect": { + "width": 163.3333282470703, + "y": 98.6666669845581, + "x": 48, + "height": 15.666671752929688 + }, + "hittable": false, + "type": "StaticText", + "identifier": "workspace-header-subtitle", + "ref": "e40" + }, + { + "parentIndex": 39, + "label": "composer-dock-ios-fixture", + "rect": { + "width": 163.3333282470703, + "y": 98.6666669845581, + "x": 48, + "height": 15.666671752929688 + }, + "depth": 29, + "hittable": false, + "index": 40, + "enabled": true, + "type": "StaticText", + "ref": "e41" + }, + { + "parentIndex": 36, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688 + }, + "label": "·", + "depth": 28, + "hittable": false, + "index": 41, + "enabled": true, + "type": "StaticText", + "ref": "e42" + }, + { + "parentIndex": 41, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688 + }, + "label": "·", + "depth": 29, + "hittable": false, + "index": 42, + "enabled": true, + "type": "StaticText", + "ref": "e43" + }, + { + "parentIndex": 36, + "label": "dev-new", + "rect": { + "x": 227.3333282470703, + "y": 98.6666669845581, + "width": 68.00001525878906, + "height": 16 + }, + "depth": 28, + "hittable": false, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "index": 43, + "enabled": true, + "type": "Other", + "ref": "e44" + }, + { + "parentIndex": 36, + "rect": { + "x": 227.3333282470703, + "y": 100.6666669845581, + "width": 12, + "height": 12 + }, + "depth": 28, + "hittable": false, + "index": 44, + "enabled": true, + "type": "Other", + "ref": "e45" + }, + { + "parentIndex": 44, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "width": 11, + "height": 11 + }, + "depth": 29, + "hittable": false, + "index": 45, + "enabled": true, + "type": "Other", + "ref": "e46" + }, + { + "parentIndex": 45, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "width": 11, + "height": 5 + }, + "depth": 30, + "hittable": false, + "index": 46, + "enabled": true, + "type": "Other", + "ref": "e47" + }, + { + "parentIndex": 45, + "rect": { + "x": 227.8333282470703, + "y": 107.1666669845581, + "width": 11, + "height": 5 + }, + "depth": 30, + "hittable": false, + "index": 47, + "enabled": true, + "type": "Other", + "ref": "e48" + }, + { + "parentIndex": 45, + "rect": { + "x": 229.8333282470703, + "y": 103.1666669845581, + "width": 1.0049999999999955, + "height": 1 + }, + "depth": 30, + "hittable": false, + "index": 48, + "enabled": true, + "type": "Other", + "ref": "e49" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 45, + "rect": { + "y": 109.1666669845581, + "x": 229.8333282470703, + "width": 1.0049999999999955, + "height": 1 + }, + "depth": 30, + "hittable": false, + "index": 49, + "ref": "e50" + }, + { + "enabled": true, + "parentIndex": 36, + "depth": 28, + "hittable": false, + "label": "dev-new", + "index": 50, + "rect": { + "y": 98.6666669845581, + "x": 242.3333282470703, + "width": 53.00001525878906, + "height": 16 + }, + "type": "StaticText", + "ref": "e51" + }, + { + "type": "StaticText", + "hittable": false, + "label": "dev-new", + "index": 51, + "rect": { + "y": 98.6666669845581, + "x": 242.3333282470703, + "width": 53.00001525878906, + "height": 16 + }, + "enabled": true, + "parentIndex": 50, + "depth": 29, + "ref": "e52" + }, + { + "depth": 27, + "hittable": false, + "identifier": "workspace-header-menu-trigger", + "label": "Workspace actions", + "enabled": true, + "rect": { + "y": 81.6666669845581, + "x": 330, + "width": 32, + "height": 32 + }, + "index": 52, + "parentIndex": 35, + "type": "Button", + "ref": "e53" + }, + { + "depth": 26, + "enabled": true, + "label": "Open Explorer sidebar", + "hittable": false, + "index": 53, + "type": "Button", + "rect": { + "y": 81.6666669845581, + "x": 362, + "width": 32, + "height": 32 + }, + "identifier": "workspace-explorer-toggle", + "parentIndex": 32, + "ref": "e54" + }, + { + "depth": 25, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "parentIndex": 31, + "type": "Other", + "index": 54, + "ref": "e55" + }, + { + "type": "Other", + "hittable": false, + "index": 55, + "depth": 25, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "parentIndex": 31, + "ref": "e56" + }, + { + "parentIndex": 31, + "index": 56, + "rect": { + "y": 126, + "x": 0, + "width": 402, + "height": 34 + }, + "depth": 25, + "identifier": "workspace-tab-switcher-trigger", + "enabled": true, + "hittable": false, + "label": "Switch tabs (1 open)", + "type": "Button", + "ref": "e57" + }, + { + "identifier": "workspace-active-tab-icon", + "depth": 26, + "index": 57, + "hittable": false, + "rect": { + "y": 136, + "x": 20, + "width": 14, + "height": 14 + }, + "type": "Other", + "parentIndex": 56, + "enabled": true, + "ref": "e58" + }, + { + "enabled": true, + "rect": { + "y": 126, + "x": 0, + "width": 402, + "height": 35 + }, + "depth": 25, + "type": "Other", + "parentIndex": 31, + "hittable": false, + "identifier": "workspace-tabs-row", + "index": 58, + "ref": "e59" + }, + { + "type": "Other", + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "index": 59, + "hittable": false, + "enabled": true, + "parentIndex": 31, + "depth": 25, + "ref": "e60" + }, + { + "index": 60, + "hittable": false, + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "enabled": true, + "parentIndex": 31, + "depth": 25, + "type": "Other", + "ref": "e61" + }, + { + "hittable": false, + "type": "Other", + "index": 61, + "parentIndex": 60, + "label": "Add attachment", + "depth": 26, + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "enabled": true, + "ref": "e62" + }, + { + "parentIndex": 61, + "enabled": true, + "hittable": false, + "depth": 27, + "index": 62, + "type": "Other", + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "ref": "e63" + }, + { + "enabled": true, + "parentIndex": 61, + "hittable": false, + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "type": "Other", + "index": 63, + "depth": 27, + "ref": "e64" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 61, + "type": "Other", + "identifier": "composer-viewport", + "depth": 27, + "index": 64, + "label": "Message agent...", + "rect": { + "y": 161, + "x": 0, + "width": 402, + "height": 713 + }, + "ref": "e65" + }, + { + "hittable": false, + "label": "Message agent...", + "index": 65, + "enabled": true, + "rect": { + "y": -141, + "x": 0, + "width": 402, + "height": 713 + }, + "depth": 28, + "type": "Other", + "parentIndex": 64, + "ref": "e66" + }, + { + "type": "Other", + "rect": { + "y": -141, + "x": 0, + "width": 402, + "height": 307 + }, + "depth": 29, + "parentIndex": 65, + "enabled": true, + "index": 66, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "identifier": "composer-dock-content", + "ref": "e67" + }, + { + "type": "Other", + "rect": { + "width": 402, + "y": -141, + "x": 0, + "height": 307 + }, + "depth": 30, + "enabled": true, + "index": 67, + "hittable": false, + "parentIndex": 66, + "ref": "e68" + }, + { + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "y": -141, + "x": 0, + "height": 307 + }, + "parentIndex": 66, + "index": 68, + "depth": 30, + "ref": "e69" + }, + { + "enabled": true, + "hittable": false, + "index": 69, + "depth": 31, + "type": "Other", + "rect": { + "width": 402, + "y": -141, + "x": 0, + "height": 307 + }, + "parentIndex": 68, + "ref": "e70" + }, + { + "parentIndex": 68, + "index": 70, + "label": "Horizontal scroll bar, 1 page", + "identifier": "agent-chat-scroll", + "depth": 31, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "y": -141, + "x": 0, + "height": 307 + }, + "ref": "e71" + }, + { + "parentIndex": 70, + "enabled": true, + "index": 71, + "label": "Search, scrollToEnd", + "hittable": false, + "rect": { + "width": 402, + "y": -141, + "x": 0, + "height": 307 + }, + "depth": 32, + "type": "ScrollView", + "ref": "e72" + }, + { + "rect": { + "width": 402, + "y": -3213, + "x": 0, + "height": 3379 + }, + "type": "Other", + "depth": 33, + "parentIndex": 71, + "label": "Search, scrollToEnd", + "index": 72, + "enabled": true, + "hittable": false, + "ref": "e73" + }, + { + "parentIndex": 72, + "depth": 34, + "hittable": false, + "index": 73, + "rect": { + "width": 402, + "y": -3213, + "x": 0, + "height": 3379 + }, + "enabled": true, + "label": "Search, scrollToEnd", + "type": "Other", + "ref": "e74" + }, + { + "type": "Other", + "index": 74, + "parentIndex": 73, + "rect": { + "width": 378, + "y": -3213, + "x": 12, + "height": 32 + }, + "hittable": false, + "depth": 35, + "enabled": true, + "ref": "e75" + }, + { + "depth": 36, + "enabled": true, + "parentIndex": 74, + "identifier": "older-history-slot", + "type": "Other", + "index": 75, + "hittable": false, + "rect": { + "width": 378, + "y": -3213, + "x": 12, + "height": 32 + }, + "ref": "e76" + }, + { + "parentIndex": 73, + "index": 76, + "depth": 35, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 378, + "y": -3181, + "x": 12, + "height": 634 + }, + "ref": "e77" + }, + { + "depth": 35, + "index": 77, + "label": "Search, scrollToEnd", + "type": "Other", + "parentIndex": 73, + "enabled": true, + "hittable": false, + "rect": { + "width": 378, + "y": -2547, + "x": 12, + "height": 36 + }, + "ref": "e78" + }, + { + "index": 78, + "depth": 36, + "hittable": false, + "parentIndex": 77, + "enabled": true, + "rect": { + "width": 388, + "y": -2547, + "x": 7, + "height": 32 + }, + "identifier": "tool-call-badge", + "type": "Other", + "ref": "e79" + }, + { + "type": "Button", + "hittable": false, + "parentIndex": 77, + "enabled": true, + "rect": { + "width": 388, + "y": -2547, + "x": 7, + "height": 32 + }, + "label": "Search, scrollToEnd", + "depth": 36, + "index": 79, + "ref": "e80" + }, + { + "hittable": false, + "index": 80, + "rect": { + "width": 378, + "y": -2511, + "x": 12, + "height": 646 + }, + "depth": 35, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "parentIndex": 73, + "type": "Other", + "ref": "e81" + }, + { + "rect": { + "width": 362, + "y": -2511, + "x": 20, + "height": 642 + }, + "depth": 36, + "parentIndex": 80, + "enabled": true, + "type": "Other", + "index": 81, + "hittable": false, + "identifier": "assistant-message", + "ref": "e82" + }, + { + "index": 82, + "enabled": true, + "depth": 36, + "type": "Other", + "parentIndex": 80, + "hittable": false, + "rect": { + "width": 362, + "y": -2499, + "x": 20, + "height": 132 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e83" + }, + { + "enabled": true, + "rect": { + "width": 362, + "y": -2499, + "x": 20, + "height": 132 + }, + "type": "Other", + "depth": 37, + "parentIndex": 82, + "index": 83, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "ref": "e84" + }, + { + "type": "Other", + "parentIndex": 83, + "depth": 38, + "hittable": false, + "index": 84, + "enabled": true, + "rect": { + "width": 362, + "y": -2499, + "x": 20, + "height": 132 + }, + "ref": "e85" + }, + { + "parentIndex": 83, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 38, + "hittable": false, + "type": "TextView", + "enabled": true, + "index": 85, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "ref": "e86" + }, + { + "rect": { + "width": 362, + "y": -2499, + "x": 20, + "height": 132 + }, + "index": 86, + "depth": 39, + "type": "TextView", + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 85, + "hittable": false, + "ref": "e87" + }, + { + "index": 87, + "value": "0%", + "parentIndex": 85, + "hittable": false, + "depth": 39, + "rect": { + "width": 30, + "y": -2499, + "x": 349, + "height": 132 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "ref": "e88" + }, + { + "index": 88, + "depth": 40, + "parentIndex": 87, + "enabled": true, + "hittable": false, + "rect": { + "width": 3, + "y": -2538, + "x": 376, + "height": 36 + }, + "type": "Other", + "ref": "e89" + }, + { + "rect": { + "width": 362, + "y": -2400, + "x": 20, + "height": 30 + }, + "parentIndex": 85, + "type": "Other", + "depth": 39, + "value": "0%", + "index": 89, + "hittable": false, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "ref": "e90" + }, + { + "type": "Other", + "parentIndex": 89, + "rect": { + "width": 36, + "y": -2373, + "x": -19, + "height": 3 + }, + "index": 90, + "depth": 40, + "enabled": true, + "hittable": false, + "ref": "e91" + }, + { + "enabled": true, + "depth": 36, + "rect": { + "width": 7.333332061767578, + "y": -2339, + "x": 30, + "height": 22 + }, + "index": 91, + "type": "StaticText", + "label": "•", + "hittable": false, + "parentIndex": 80, + "ref": "e92" + }, + { + "index": 92, + "parentIndex": 91, + "depth": 37, + "rect": { + "width": 7.333332061767578, + "y": -2339, + "x": 30, + "height": 22 + }, + "label": "•", + "enabled": true, + "type": "StaticText", + "hittable": false, + "ref": "e93" + }, + { + "depth": 36, + "type": "Other", + "index": 93, + "enabled": true, + "parentIndex": 80, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "y": -2339, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e94" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -2339, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 37, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 94, + "type": "Other", + "parentIndex": 93, + "hittable": false, + "ref": "e95" + }, + { + "type": "Other", + "enabled": true, + "index": 95, + "parentIndex": 94, + "rect": { + "width": 340.6666564941406, + "y": -2339, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 38, + "hittable": false, + "ref": "e96" + }, + { + "enabled": true, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "hittable": false, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 38, + "index": 96, + "parentIndex": 94, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e97" + }, + { + "type": "TextView", + "depth": 39, + "index": 97, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "y": -2339, + "x": 41.33333396911621, + "height": 88 + }, + "hittable": false, + "parentIndex": 96, + "enabled": true, + "ref": "e98" + }, + { + "depth": 39, + "parentIndex": 96, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "rect": { + "width": 30, + "y": -2339, + "x": 349.00000063578284, + "height": 88 + }, + "value": "0%", + "enabled": true, + "hittable": false, + "index": 98, + "ref": "e99" + }, + { + "parentIndex": 98, + "rect": { + "width": 3, + "y": -2378, + "x": 376.00000063578284, + "height": 36 + }, + "enabled": true, + "depth": 40, + "hittable": false, + "type": "Other", + "index": 99, + "ref": "e100" + }, + { + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 96, + "hittable": false, + "depth": 39, + "index": 100, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -2284, + "x": 41.33333396911621, + "height": 30 + }, + "enabled": true, + "value": "0%", + "ref": "e101" + }, + { + "enabled": true, + "index": 101, + "type": "Other", + "parentIndex": 100, + "depth": 40, + "rect": { + "width": 36, + "y": -2257, + "x": 2.333333969116211, + "height": 3 + }, + "hittable": false, + "ref": "e102" + }, + { + "hittable": false, + "index": 102, + "parentIndex": 80, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "y": -2247, + "x": 30, + "height": 22 + }, + "depth": 36, + "enabled": true, + "label": "•", + "ref": "e103" + }, + { + "parentIndex": 102, + "enabled": true, + "label": "•", + "depth": 37, + "index": 103, + "hittable": false, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "y": -2247, + "x": 30, + "height": 22 + }, + "ref": "e104" + }, + { + "type": "Other", + "parentIndex": 80, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -2247, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 36, + "index": 104, + "enabled": true, + "ref": "e105" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -2247, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 104, + "index": 105, + "depth": 37, + "ref": "e106" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -2247, + "x": 41.33333396911621, + "height": 88 + }, + "hittable": false, + "index": 106, + "type": "Other", + "parentIndex": 105, + "enabled": true, + "depth": 38, + "ref": "e107" + }, + { + "enabled": true, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 105, + "hittable": false, + "type": "TextView", + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "depth": 38, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 107, + "ref": "e108" + }, + { + "enabled": true, + "rect": { + "width": 340.6666564941406, + "y": -2247, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 39, + "index": 108, + "type": "TextView", + "parentIndex": 107, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e109" + }, + { + "rect": { + "width": 30, + "y": -2247, + "x": 349.00000063578284, + "height": 88 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "type": "Other", + "hittable": false, + "enabled": true, + "index": 109, + "parentIndex": 107, + "ref": "e110" + }, + { + "parentIndex": 109, + "type": "Other", + "enabled": true, + "depth": 40, + "index": 110, + "rect": { + "width": 3, + "y": -2286, + "x": 376.00000063578284, + "height": 36 + }, + "hittable": false, + "ref": "e111" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -2192, + "x": 41.33333396911621, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "index": 111, + "type": "Other", + "parentIndex": 107, + "depth": 39, + "ref": "e112" + }, + { + "depth": 40, + "parentIndex": 111, + "index": 112, + "enabled": true, + "hittable": false, + "rect": { + "width": 36, + "y": -2165, + "x": 2.333333969116211, + "height": 3 + }, + "type": "Other", + "ref": "e113" + }, + { + "index": 113, + "hittable": false, + "enabled": true, + "parentIndex": 80, + "rect": { + "width": 7.333332061767578, + "y": -2155, + "x": 30, + "height": 22 + }, + "depth": 36, + "type": "StaticText", + "label": "•", + "ref": "e114" + }, + { + "parentIndex": 113, + "hittable": false, + "type": "StaticText", + "depth": 37, + "label": "•", + "rect": { + "width": 7.333332061767578, + "y": -2155, + "x": 30, + "height": 22 + }, + "index": 114, + "enabled": true, + "ref": "e115" + }, + { + "depth": 36, + "index": 115, + "parentIndex": 80, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "width": 340.6666564941406, + "y": -2155, + "x": 41.33333396911621, + "height": 88 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e116" + }, + { + "enabled": true, + "rect": { + "width": 340.6666564941406, + "y": -2155, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 115, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 37, + "index": 116, + "hittable": false, + "type": "Other", + "ref": "e117" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -2155, + "x": 41.33333396911621, + "height": 88 + }, + "enabled": true, + "type": "Other", + "parentIndex": 116, + "hittable": false, + "index": 117, + "depth": 38, + "ref": "e118" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 116, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 38, + "enabled": true, + "index": 118, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "ref": "e119" + }, + { + "enabled": true, + "hittable": false, + "depth": 39, + "index": 119, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "rect": { + "width": 340.6666564941406, + "y": -2155, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 118, + "ref": "e120" + }, + { + "index": 120, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "type": "Other", + "value": "0%", + "rect": { + "width": 30, + "y": -2155, + "x": 349.00000063578284, + "height": 88 + }, + "enabled": true, + "parentIndex": 118, + "ref": "e121" + }, + { + "rect": { + "width": 3, + "y": -2194, + "x": 376.00000063578284, + "height": 36 + }, + "depth": 40, + "index": 121, + "type": "Other", + "parentIndex": 120, + "enabled": true, + "hittable": false, + "ref": "e122" + }, + { + "value": "0%", + "parentIndex": 118, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -2100, + "x": 41.33333396911621, + "height": 30 + }, + "index": 122, + "type": "Other", + "depth": 39, + "ref": "e123" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 36, + "y": -2073, + "x": 2.333333969116211, + "height": 3 + }, + "hittable": false, + "index": 123, + "depth": 40, + "parentIndex": 122, + "ref": "e124" + }, + { + "hittable": false, + "depth": 36, + "label": "•", + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "y": -2063, + "x": 30, + "height": 22 + }, + "index": 124, + "enabled": true, + "parentIndex": 80, + "ref": "e125" + }, + { + "rect": { + "width": 7.333332061767578, + "y": -2063, + "x": 30, + "height": 22 + }, + "depth": 37, + "index": 125, + "label": "•", + "hittable": false, + "parentIndex": 124, + "type": "StaticText", + "enabled": true, + "ref": "e126" + }, + { + "depth": 36, + "parentIndex": 80, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "index": 126, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -2063, + "x": 41.33333396911621, + "height": 66 + }, + "enabled": true, + "ref": "e127" + }, + { + "enabled": true, + "parentIndex": 126, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -2063, + "x": 41.33333396911621, + "height": 66 + }, + "type": "Other", + "index": 127, + "ref": "e128" + }, + { + "parentIndex": 127, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -2063, + "x": 41.33333396911621, + "height": 66 + }, + "index": 128, + "hittable": false, + "depth": 38, + "enabled": true, + "ref": "e129" + }, + { + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 129, + "type": "TextView", + "depth": 38, + "parentIndex": 127, + "enabled": true, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "ref": "e130" + }, + { + "index": 130, + "depth": 39, + "type": "TextView", + "parentIndex": 129, + "enabled": true, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -2063, + "x": 41.33333396911621, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e131" + }, + { + "index": 131, + "rect": { + "width": 30, + "y": -2063, + "x": 349.00000063578284, + "height": 66 + }, + "hittable": false, + "depth": 39, + "parentIndex": 129, + "value": "0%", + "type": "Other", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "ref": "e132" + }, + { + "type": "Other", + "rect": { + "width": 3, + "y": -2102, + "x": 376.00000063578284, + "height": 36 + }, + "parentIndex": 131, + "depth": 40, + "hittable": false, + "index": 132, + "enabled": true, + "ref": "e133" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 129, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "rect": { + "width": 340.6666564941406, + "y": -2030, + "x": 41.33333396911621, + "height": 30 + }, + "hittable": false, + "index": 133, + "value": "0%", + "ref": "e134" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 133, + "depth": 40, + "rect": { + "width": 36, + "y": -2003, + "x": 2.333333969116211, + "height": 3 + }, + "index": 134, + "enabled": true, + "ref": "e135" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 80, + "index": 135, + "enabled": true, + "depth": 36, + "rect": { + "width": 362, + "y": -1981, + "x": 20, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e136" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "type": "Other", + "rect": { + "width": 362, + "y": -1981, + "x": 20, + "height": 88 + }, + "depth": 37, + "parentIndex": 135, + "index": 136, + "hittable": false, + "ref": "e137" + }, + { + "enabled": true, + "index": 137, + "depth": 38, + "parentIndex": 136, + "rect": { + "width": 362, + "y": -1981, + "x": 20, + "height": 88 + }, + "hittable": false, + "type": "Other", + "ref": "e138" + }, + { + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "index": 138, + "parentIndex": 136, + "hittable": false, + "type": "TextView", + "depth": 38, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e139" + }, + { + "type": "TextView", + "rect": { + "width": 362, + "y": -1981, + "x": 20, + "height": 88 + }, + "hittable": false, + "parentIndex": 138, + "enabled": true, + "index": 139, + "depth": 39, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e140" + }, + { + "depth": 39, + "value": "0%", + "type": "Other", + "hittable": false, + "index": 140, + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "y": -1981, + "x": 349, + "height": 88 + }, + "parentIndex": 138, + "enabled": true, + "ref": "e141" + }, + { + "type": "Other", + "index": 141, + "enabled": true, + "parentIndex": 140, + "depth": 40, + "hittable": false, + "rect": { + "width": 3, + "y": -2020, + "x": 376, + "height": 36 + }, + "ref": "e142" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 362, + "y": -1926, + "x": 20, + "height": 30 + }, + "value": "0%", + "index": 142, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 39, + "parentIndex": 138, + "ref": "e143" + }, + { + "depth": 40, + "type": "Other", + "index": 143, + "rect": { + "width": 36, + "y": -1899, + "x": -19, + "height": 3 + }, + "enabled": true, + "parentIndex": 142, + "hittable": false, + "ref": "e144" + }, + { + "parentIndex": 73, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 35, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 144, + "rect": { + "width": 378, + "y": -1865, + "x": 12, + "height": 32 + }, + "ref": "e145" + }, + { + "index": 145, + "type": "Other", + "enabled": true, + "parentIndex": 144, + "rect": { + "width": 388, + "y": -1865, + "x": 7, + "height": 32 + }, + "depth": 36, + "hittable": false, + "identifier": "tool-call-badge", + "ref": "e146" + }, + { + "index": 146, + "depth": 36, + "enabled": true, + "type": "Button", + "rect": { + "width": 388, + "y": -1865, + "x": 7, + "height": 32 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "parentIndex": 144, + "ref": "e147" + }, + { + "index": 147, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 73, + "depth": 35, + "rect": { + "width": 378, + "y": -1833, + "x": 12, + "height": 36 + }, + "ref": "e148" + }, + { + "parentIndex": 147, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "y": -1833, + "x": 7, + "height": 32 + }, + "hittable": false, + "type": "Other", + "index": 148, + "enabled": true, + "depth": 36, + "ref": "e149" + }, + { + "index": 149, + "type": "Button", + "parentIndex": 147, + "hittable": false, + "depth": 36, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "enabled": true, + "rect": { + "width": 388, + "y": -1833, + "x": 7, + "height": 32 + }, + "ref": "e150" + }, + { + "rect": { + "width": 378, + "y": -1797, + "x": 12, + "height": 570 + }, + "depth": 35, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "parentIndex": 73, + "index": 150, + "enabled": true, + "ref": "e151" + }, + { + "index": 151, + "identifier": "assistant-message", + "parentIndex": 150, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 36, + "rect": { + "width": 362, + "y": -1797, + "x": 20, + "height": 566 + }, + "ref": "e152" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "width": 362, + "y": -1785, + "x": 20, + "height": 242 + }, + "depth": 36, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 150, + "index": 152, + "type": "Other", + "ref": "e153" + }, + { + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "enabled": true, + "rect": { + "width": 362, + "y": -1785, + "x": 20, + "height": 242 + }, + "depth": 37, + "index": 153, + "parentIndex": 152, + "ref": "e154" + }, + { + "enabled": true, + "index": 154, + "hittable": false, + "type": "Other", + "rect": { + "width": 362, + "y": -1785, + "x": 20, + "height": 242 + }, + "depth": 38, + "parentIndex": 153, + "ref": "e155" + }, + { + "depth": 38, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "parentIndex": 153, + "index": 155, + "enabled": true, + "hittable": false, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "ref": "e156" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "hittable": false, + "type": "TextView", + "parentIndex": 155, + "enabled": true, + "depth": 39, + "index": 156, + "rect": { + "width": 362, + "y": -1785, + "x": 20, + "height": 242 + }, + "ref": "e157" + }, + { + "enabled": true, + "value": "0%", + "type": "Other", + "hittable": false, + "parentIndex": 155, + "index": 157, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "y": -1785, + "x": 349, + "height": 242 + }, + "ref": "e158" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 157, + "index": 158, + "depth": 40, + "hittable": false, + "rect": { + "width": 3, + "y": -1824, + "x": 376, + "height": 36 + }, + "ref": "e159" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 362, + "y": -1576, + "x": 20, + "height": 30 + }, + "index": 159, + "depth": 39, + "type": "Other", + "hittable": false, + "enabled": true, + "value": "0%", + "parentIndex": 155, + "ref": "e160" + }, + { + "depth": 40, + "index": 160, + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "width": 36, + "y": -1549, + "x": -19, + "height": 3 + }, + "parentIndex": 159, + "ref": "e161" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 150, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 36, + "index": 161, + "rect": { + "width": 362, + "y": -1519, + "x": 20, + "height": 264 + }, + "ref": "e162" + }, + { + "depth": 37, + "parentIndex": 161, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "type": "Other", + "index": 162, + "hittable": false, + "rect": { + "width": 362, + "y": -1519, + "x": 20, + "height": 264 + }, + "ref": "e163" + }, + { + "hittable": false, + "parentIndex": 162, + "enabled": true, + "depth": 38, + "rect": { + "width": 362, + "y": -1519, + "x": 20, + "height": 264 + }, + "type": "Other", + "index": 163, + "ref": "e164" + }, + { + "parentIndex": 162, + "index": 164, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "TextView", + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "depth": 38, + "ref": "e165" + }, + { + "index": 165, + "parentIndex": 164, + "type": "TextView", + "hittable": false, + "enabled": true, + "depth": 39, + "rect": { + "width": 362, + "y": -1519, + "x": 20, + "height": 264 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "ref": "e166" + }, + { + "index": 166, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "hittable": false, + "value": "0%", + "parentIndex": 164, + "depth": 39, + "type": "Other", + "rect": { + "width": 30, + "y": -1519, + "x": 349, + "height": 264 + }, + "ref": "e167" + }, + { + "depth": 40, + "hittable": false, + "index": 167, + "parentIndex": 166, + "type": "Other", + "enabled": true, + "rect": { + "width": 3, + "y": -1558, + "x": 376, + "height": 36 + }, + "ref": "e168" + }, + { + "rect": { + "width": 362, + "y": -1288, + "x": 20, + "height": 30 + }, + "parentIndex": 164, + "value": "0%", + "index": 168, + "depth": 39, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "ref": "e169" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 40, + "rect": { + "width": 36, + "y": -1261, + "x": -19, + "height": 3 + }, + "parentIndex": 168, + "index": 169, + "ref": "e170" + }, + { + "rect": { + "width": 378, + "y": -1227, + "x": 12, + "height": 32 + }, + "index": 170, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Thinking", + "depth": 35, + "parentIndex": 73, + "ref": "e171" + }, + { + "depth": 36, + "parentIndex": 170, + "identifier": "tool-call-badge", + "index": 171, + "type": "Other", + "enabled": true, + "rect": { + "width": 388, + "y": -1227, + "x": 7, + "height": 32 + }, + "hittable": false, + "ref": "e172" + }, + { + "label": "Thinking", + "type": "Button", + "enabled": true, + "index": 172, + "hittable": false, + "rect": { + "width": 388, + "y": -1227, + "x": 7, + "height": 32 + }, + "depth": 36, + "parentIndex": 170, + "ref": "e173" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "enabled": true, + "rect": { + "width": 378, + "y": -1195, + "x": 12, + "height": 32 + }, + "parentIndex": 73, + "index": 173, + "type": "Other", + "depth": 35, + "ref": "e174" + }, + { + "depth": 36, + "enabled": true, + "type": "Other", + "identifier": "tool-call-badge", + "parentIndex": 173, + "hittable": false, + "rect": { + "width": 388, + "y": -1195, + "x": 7, + "height": 32 + }, + "index": 174, + "ref": "e175" + }, + { + "parentIndex": 173, + "depth": 36, + "enabled": true, + "hittable": false, + "index": 175, + "type": "Button", + "rect": { + "width": 388, + "y": -1195, + "x": 7, + "height": 32 + }, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "ref": "e176" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 73, + "index": 176, + "enabled": true, + "rect": { + "width": 378, + "y": -1163, + "x": 12, + "height": 36 + }, + "depth": 35, + "label": "Search, scrollToEnd", + "ref": "e177" + }, + { + "index": 177, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 36, + "parentIndex": 176, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "y": -1163, + "x": 7, + "height": 32 + }, + "ref": "e178" + }, + { + "index": 178, + "label": "Search, scrollToEnd", + "enabled": true, + "type": "Button", + "depth": 36, + "rect": { + "width": 388, + "y": -1163, + "x": 7, + "height": 32 + }, + "parentIndex": 176, + "hittable": false, + "ref": "e179" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "index": 179, + "parentIndex": 73, + "hittable": false, + "depth": 35, + "type": "Other", + "rect": { + "width": 378, + "y": -1127, + "x": 12, + "height": 646 + }, + "ref": "e180" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 36, + "parentIndex": 179, + "index": 180, + "identifier": "assistant-message", + "rect": { + "width": 362, + "y": -1127, + "x": 20, + "height": 642 + }, + "ref": "e181" + }, + { + "type": "Other", + "rect": { + "width": 362, + "y": -1115, + "x": 20, + "height": 132 + }, + "depth": 36, + "parentIndex": 179, + "hittable": false, + "index": 181, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "ref": "e182" + }, + { + "type": "Other", + "parentIndex": 181, + "rect": { + "width": 362, + "y": -1115, + "x": 20, + "height": 132 + }, + "enabled": true, + "depth": 37, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 182, + "hittable": false, + "ref": "e183" + }, + { + "depth": 38, + "enabled": true, + "hittable": false, + "index": 183, + "type": "Other", + "rect": { + "width": 362, + "y": -1115, + "x": 20, + "height": 132 + }, + "parentIndex": 182, + "ref": "e184" + }, + { + "parentIndex": 182, + "enabled": true, + "type": "TextView", + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "index": 184, + "depth": 38, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e185" + }, + { + "parentIndex": 184, + "rect": { + "width": 362, + "y": -1115, + "x": 20, + "height": 132 + }, + "index": 185, + "enabled": true, + "hittable": false, + "type": "TextView", + "depth": 39, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e186" + }, + { + "parentIndex": 184, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "index": 186, + "rect": { + "width": 30, + "y": -1115, + "x": 349, + "height": 132 + }, + "hittable": false, + "depth": 39, + "value": "0%", + "enabled": true, + "ref": "e187" + }, + { + "rect": { + "width": 3, + "y": -1154, + "x": 376, + "height": 36 + }, + "depth": 40, + "type": "Other", + "enabled": true, + "index": 187, + "hittable": false, + "parentIndex": 186, + "ref": "e188" + }, + { + "index": 188, + "value": "0%", + "depth": 39, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 362, + "y": -1016, + "x": 20, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 184, + "ref": "e189" + }, + { + "parentIndex": 188, + "hittable": false, + "enabled": true, + "depth": 40, + "rect": { + "width": 36, + "y": -989, + "x": -19, + "height": 3 + }, + "index": 189, + "type": "Other", + "ref": "e190" + }, + { + "index": 190, + "type": "StaticText", + "label": "•", + "rect": { + "width": 7.333332061767578, + "y": -955, + "x": 30, + "height": 22 + }, + "hittable": false, + "parentIndex": 179, + "enabled": true, + "depth": 36, + "ref": "e191" + }, + { + "type": "StaticText", + "index": 191, + "depth": 37, + "rect": { + "width": 7.333332061767578, + "y": -955, + "x": 30, + "height": 22 + }, + "parentIndex": 190, + "enabled": true, + "label": "•", + "hittable": false, + "ref": "e192" + }, + { + "index": 192, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "y": -955, + "x": 41.33333396911621, + "height": 88 + }, + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 179, + "hittable": false, + "depth": 36, + "ref": "e193" + }, + { + "depth": 37, + "parentIndex": 192, + "index": 193, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -955, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e194" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -955, + "x": 41.33333396911621, + "height": 88 + }, + "type": "Other", + "index": 194, + "hittable": false, + "parentIndex": 193, + "enabled": true, + "depth": 38, + "ref": "e195" + }, + { + "parentIndex": 193, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "hittable": false, + "depth": 38, + "index": 195, + "type": "TextView", + "ref": "e196" + }, + { + "index": 196, + "hittable": false, + "enabled": true, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 195, + "depth": 39, + "rect": { + "width": 340.6666564941406, + "y": -955, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e197" + }, + { + "enabled": true, + "value": "0%", + "depth": 39, + "parentIndex": 195, + "index": 197, + "rect": { + "width": 30, + "y": -955, + "x": 349.00000063578284, + "height": 88 + }, + "type": "Other", + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "ref": "e198" + }, + { + "type": "Other", + "enabled": true, + "depth": 40, + "rect": { + "width": 3, + "y": -994, + "x": 376.00000063578284, + "height": 36 + }, + "index": 198, + "parentIndex": 197, + "hittable": false, + "ref": "e199" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 340.6666564941406, + "y": -900, + "x": 41.33333396911621, + "height": 30 + }, + "index": 199, + "parentIndex": 195, + "value": "0%", + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 39, + "ref": "e200" + }, + { + "hittable": false, + "index": 200, + "enabled": true, + "parentIndex": 199, + "type": "Other", + "depth": 40, + "rect": { + "width": 36, + "y": -873, + "x": 2.333333969116211, + "height": 3 + }, + "ref": "e201" + }, + { + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "y": -863, + "x": 30, + "height": 22 + }, + "index": 201, + "depth": 36, + "hittable": false, + "label": "•", + "parentIndex": 179, + "enabled": true, + "ref": "e202" + }, + { + "label": "•", + "index": 202, + "enabled": true, + "depth": 37, + "hittable": false, + "type": "StaticText", + "parentIndex": 201, + "rect": { + "width": 7.333332061767578, + "y": -863, + "x": 30, + "height": 22 + }, + "ref": "e203" + }, + { + "hittable": false, + "parentIndex": 179, + "type": "Other", + "index": 203, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 36, + "rect": { + "width": 340.6666564941406, + "y": -863, + "x": 41.33333396911621, + "height": 88 + }, + "enabled": true, + "ref": "e204" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -863, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 37, + "enabled": true, + "type": "Other", + "parentIndex": 203, + "index": 204, + "ref": "e205" + }, + { + "index": 205, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -863, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 204, + "type": "Other", + "depth": 38, + "enabled": true, + "ref": "e206" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 204, + "depth": 38, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "index": 206, + "ref": "e207" + }, + { + "index": 207, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "parentIndex": 206, + "rect": { + "width": 340.6666564941406, + "y": -863, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 39, + "ref": "e208" + }, + { + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "depth": 39, + "parentIndex": 206, + "hittable": false, + "rect": { + "width": 30, + "y": -863, + "x": 349.00000063578284, + "height": 88 + }, + "index": 208, + "enabled": true, + "ref": "e209" + }, + { + "hittable": false, + "depth": 40, + "type": "Other", + "index": 209, + "enabled": true, + "rect": { + "width": 3, + "y": -902, + "x": 376.00000063578284, + "height": 36 + }, + "parentIndex": 208, + "ref": "e210" + }, + { + "type": "Other", + "index": 210, + "rect": { + "width": 340.6666564941406, + "y": -808, + "x": 41.33333396911621, + "height": 30 + }, + "hittable": false, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 206, + "value": "0%", + "enabled": true, + "ref": "e211" + }, + { + "enabled": true, + "index": 211, + "parentIndex": 210, + "hittable": false, + "rect": { + "width": 36, + "y": -781, + "x": 2.333333969116211, + "height": 3 + }, + "type": "Other", + "depth": 40, + "ref": "e212" + }, + { + "hittable": false, + "rect": { + "width": 7.333332061767578, + "y": -771, + "x": 30, + "height": 22 + }, + "enabled": true, + "parentIndex": 179, + "label": "•", + "type": "StaticText", + "index": 212, + "depth": 36, + "ref": "e213" + }, + { + "parentIndex": 212, + "index": 213, + "label": "•", + "hittable": false, + "type": "StaticText", + "enabled": true, + "rect": { + "width": 7.333332061767578, + "y": -771, + "x": 30, + "height": 22 + }, + "depth": 37, + "ref": "e214" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "y": -771, + "x": 41.33333396911621, + "height": 88 + }, + "index": 214, + "depth": 36, + "hittable": false, + "parentIndex": 179, + "enabled": true, + "type": "Other", + "ref": "e215" + }, + { + "depth": 37, + "parentIndex": 214, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "y": -771, + "x": 41.33333396911621, + "height": 88 + }, + "index": 215, + "ref": "e216" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 38, + "index": 216, + "rect": { + "width": 340.6666564941406, + "y": -771, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 215, + "ref": "e217" + }, + { + "depth": 38, + "index": 217, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "enabled": true, + "parentIndex": 215, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "ref": "e218" + }, + { + "enabled": true, + "parentIndex": 217, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "y": -771, + "x": 41.33333396911621, + "height": 88 + }, + "index": 218, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "depth": 39, + "ref": "e219" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "y": -771, + "x": 349.00000063578284, + "height": 88 + }, + "hittable": false, + "depth": 39, + "value": "0%", + "parentIndex": 217, + "type": "Other", + "enabled": true, + "index": 219, + "ref": "e220" + }, + { + "index": 220, + "rect": { + "width": 3, + "y": -810, + "x": 376.00000063578284, + "height": 36 + }, + "parentIndex": 219, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 40, + "ref": "e221" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "hittable": false, + "depth": 39, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "y": -716, + "x": 41.33333396911621, + "height": 30 + }, + "parentIndex": 217, + "index": 221, + "ref": "e222" + }, + { + "enabled": true, + "rect": { + "width": 36, + "y": -689, + "x": 2.333333969116211, + "height": 3 + }, + "parentIndex": 221, + "hittable": false, + "type": "Other", + "index": 222, + "depth": 40, + "ref": "e223" + }, + { + "type": "StaticText", + "parentIndex": 179, + "index": 223, + "hittable": false, + "depth": 36, + "label": "•", + "enabled": true, + "rect": { + "width": 7.333332061767578, + "y": -679, + "x": 30, + "height": 22 + }, + "ref": "e224" + }, + { + "rect": { + "width": 7.333332061767578, + "y": -679, + "x": 30, + "height": 22 + }, + "parentIndex": 223, + "label": "•", + "hittable": false, + "depth": 37, + "type": "StaticText", + "index": 224, + "enabled": true, + "ref": "e225" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "Other", + "depth": 36, + "parentIndex": 179, + "rect": { + "width": 340.6666564941406, + "y": -679, + "x": 41.33333396911621, + "height": 66 + }, + "hittable": false, + "index": 225, + "enabled": true, + "ref": "e226" + }, + { + "depth": 37, + "hittable": false, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "y": -679, + "x": 41.33333396911621, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 225, + "index": 226, + "enabled": true, + "ref": "e227" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -679, + "x": 41.33333396911621, + "height": 66 + }, + "parentIndex": 226, + "hittable": false, + "depth": 38, + "index": 227, + "type": "Other", + "enabled": true, + "ref": "e228" + }, + { + "hittable": false, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 226, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "TextView", + "depth": 38, + "index": 228, + "ref": "e229" + }, + { + "parentIndex": 228, + "rect": { + "width": 340.6666564941406, + "y": -679, + "x": 41.33333396911621, + "height": 66 + }, + "type": "TextView", + "enabled": true, + "index": 229, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "depth": 39, + "ref": "e230" + }, + { + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 228, + "rect": { + "width": 30, + "y": -679, + "x": 349.00000063578284, + "height": 66 + }, + "index": 230, + "ref": "e231" + }, + { + "index": 231, + "enabled": true, + "parentIndex": 230, + "depth": 40, + "hittable": false, + "type": "Other", + "rect": { + "width": 3, + "y": -718, + "x": 376.00000063578284, + "height": 36 + }, + "ref": "e232" + }, + { + "rect": { + "width": 340.6666564941406, + "y": -646, + "x": 41.33333396911621, + "height": 30 + }, + "type": "Other", + "parentIndex": 228, + "index": 232, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "depth": 39, + "ref": "e233" + }, + { + "hittable": false, + "depth": 40, + "type": "Other", + "index": 233, + "enabled": true, + "rect": { + "width": 36, + "y": -619, + "x": 2.333333969116211, + "height": 3 + }, + "parentIndex": 232, + "ref": "e234" + }, + { + "index": 234, + "type": "Other", + "rect": { + "width": 362, + "y": -597, + "x": 20, + "height": 88 + }, + "parentIndex": 179, + "enabled": true, + "hittable": false, + "depth": 36, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e235" + }, + { + "hittable": false, + "depth": 37, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "Other", + "rect": { + "width": 362, + "y": -597, + "x": 20, + "height": 88 + }, + "enabled": true, + "index": 235, + "parentIndex": 234, + "ref": "e236" + }, + { + "rect": { + "width": 362, + "y": -597, + "x": 20, + "height": 88 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 235, + "depth": 38, + "index": 236, + "ref": "e237" + }, + { + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "index": 237, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "enabled": true, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "parentIndex": 235, + "ref": "e238" + }, + { + "hittable": false, + "parentIndex": 237, + "type": "TextView", + "index": 238, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "rect": { + "width": 362, + "y": -597, + "x": 20, + "height": 88 + }, + "depth": 39, + "ref": "e239" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "width": 30, + "y": -597, + "x": 349, + "height": 88 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 237, + "index": 239, + "value": "0%", + "enabled": true, + "ref": "e240" + }, + { + "hittable": false, + "index": 240, + "depth": 40, + "enabled": true, + "type": "Other", + "rect": { + "width": 3, + "y": -636, + "x": 376, + "height": 36 + }, + "parentIndex": 239, + "ref": "e241" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 362, + "y": -542, + "x": 20, + "height": 30 + }, + "value": "0%", + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 237, + "depth": 39, + "index": 241, + "ref": "e242" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "width": 36, + "y": -515, + "x": -19, + "height": 3 + }, + "depth": 40, + "parentIndex": 241, + "index": 242, + "ref": "e243" + }, + { + "depth": 35, + "index": 243, + "parentIndex": 73, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "rect": { + "width": 378, + "y": -481, + "x": 12, + "height": 32 + }, + "enabled": true, + "ref": "e244" + }, + { + "enabled": true, + "type": "Other", + "depth": 36, + "parentIndex": 243, + "index": 244, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "y": -481, + "x": 7, + "height": 32 + }, + "hittable": false, + "ref": "e245" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "parentIndex": 243, + "enabled": true, + "type": "Button", + "rect": { + "width": 388, + "y": -481, + "x": 7, + "height": 32 + }, + "depth": 36, + "index": 245, + "ref": "e246" + }, + { + "enabled": true, + "type": "Other", + "index": 246, + "parentIndex": 73, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "hittable": false, + "rect": { + "width": 378, + "y": -449, + "x": 12, + "height": 36 + }, + "ref": "e247" + }, + { + "type": "Other", + "rect": { + "width": 388, + "y": -449, + "x": 7, + "height": 32 + }, + "index": 247, + "depth": 36, + "hittable": false, + "identifier": "tool-call-badge", + "enabled": true, + "parentIndex": 246, + "ref": "e248" + }, + { + "index": 248, + "depth": 36, + "parentIndex": 246, + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Button", + "rect": { + "width": 388, + "y": -449, + "x": 7, + "height": 32 + }, + "ref": "e249" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "depth": 35, + "parentIndex": 73, + "enabled": true, + "index": 249, + "rect": { + "width": 378, + "y": -413, + "x": 12, + "height": 512 + }, + "hittable": false, + "ref": "e250" + }, + { + "parentIndex": 249, + "enabled": true, + "rect": { + "width": 362, + "y": -413, + "x": 20, + "height": 512 + }, + "hittable": false, + "identifier": "assistant-message", + "depth": 36, + "type": "Other", + "index": 250, + "ref": "e251" + }, + { + "enabled": true, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "index": 251, + "parentIndex": 249, + "rect": { + "width": 362, + "y": -401, + "x": 20, + "height": 242 + }, + "depth": 36, + "ref": "e252" + }, + { + "index": 252, + "hittable": false, + "rect": { + "width": 362, + "y": -401, + "x": 20, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 251, + "depth": 37, + "type": "Other", + "enabled": true, + "ref": "e253" + }, + { + "type": "Other", + "parentIndex": 252, + "depth": 38, + "rect": { + "width": 362, + "y": -401, + "x": 20, + "height": 242 + }, + "index": 253, + "hittable": false, + "enabled": true, + "ref": "e254" + }, + { + "index": 254, + "parentIndex": 252, + "depth": 38, + "hittable": false, + "rect": { + "width": 0, + "y": 0, + "x": 0, + "height": 0 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "ref": "e255" + }, + { + "rect": { + "width": 362, + "y": -401, + "x": 20, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "hittable": false, + "index": 255, + "parentIndex": 254, + "type": "TextView", + "depth": 39, + "enabled": true, + "ref": "e256" + }, + { + "value": "0%", + "hittable": false, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 254, + "rect": { + "width": 30, + "y": -401, + "x": 349, + "height": 242 + }, + "type": "Other", + "index": 256, + "enabled": true, + "ref": "e257" + }, + { + "enabled": true, + "depth": 40, + "hittable": false, + "parentIndex": 256, + "rect": { + "width": 3, + "y": -440, + "x": 376, + "height": 36 + }, + "index": 257, + "type": "Other", + "ref": "e258" + }, + { + "hittable": false, + "value": "0%", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "parentIndex": 254, + "index": 258, + "depth": 39, + "rect": { + "width": 362, + "y": -192, + "x": 20, + "height": 30 + }, + "ref": "e259" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 36, + "y": -165, + "x": -19, + "height": 3 + }, + "type": "Other", + "parentIndex": 258, + "depth": 40, + "index": 259, + "ref": "e260" + }, + { + "depth": 36, + "index": 260, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "Other", + "rect": { + "width": 362, + "y": -135, + "x": 20, + "height": 176 + }, + "parentIndex": 249, + "ref": "e261" + }, + { + "hittable": false, + "index": 261, + "depth": 37, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 260, + "rect": { + "width": 362, + "y": -135, + "x": 20, + "height": 176 + }, + "type": "Other", + "enabled": true, + "ref": "e262" + }, + { + "enabled": true, + "depth": 38, + "hittable": false, + "type": "Other", + "index": 262, + "parentIndex": 261, + "rect": { + "width": 362, + "y": -135, + "x": 20, + "height": 176 + }, + "ref": "e263" + }, + { + "parentIndex": 261, + "type": "TextView", + "rect": { + "width": 362, + "y": 0, + "x": 20, + "height": 41 + }, + "depth": 38, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "index": 263, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "ref": "e264" + }, + { + "depth": 39, + "index": 264, + "parentIndex": 263, + "rect": { + "width": 362, + "y": -135, + "x": 20, + "height": 176 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "hittable": false, + "type": "TextView", + "ref": "e265" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "index": 265, + "value": "0%", + "type": "Other", + "parentIndex": 263, + "depth": 39, + "rect": { + "width": 30, + "y": -135, + "x": 349, + "height": 176 + }, + "ref": "e266" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 40, + "parentIndex": 265, + "index": 266, + "rect": { + "width": 3, + "y": -174, + "x": 376, + "height": 36 + }, + "ref": "e267" + }, + { + "value": "0%", + "depth": 39, + "index": 267, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "rect": { + "width": 362, + "y": 8, + "x": 20, + "height": 30 + }, + "parentIndex": 263, + "hittable": false, + "type": "Other", + "ref": "e268" + }, + { + "rect": { + "width": 36, + "y": 35, + "x": -19, + "height": 3 + }, + "type": "Other", + "enabled": true, + "parentIndex": 267, + "hittable": false, + "index": 268, + "depth": 40, + "ref": "e269" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 362, + "y": 65, + "x": 20, + "height": 22 + }, + "label": "(end of synthetic stream)", + "depth": 36, + "index": 269, + "hittable": false, + "parentIndex": 249, + "ref": "e270" + }, + { + "label": "(end of synthetic stream)", + "type": "Other", + "hittable": false, + "depth": 37, + "rect": { + "width": 362, + "y": 65, + "x": 20, + "height": 22 + }, + "enabled": true, + "index": 270, + "parentIndex": 269, + "ref": "e271" + }, + { + "index": 271, + "hittable": false, + "rect": { + "width": 362, + "y": 65, + "x": 20, + "height": 22 + }, + "parentIndex": 270, + "depth": 38, + "enabled": true, + "type": "Other", + "ref": "e272" + }, + { + "value": "(end of synthetic stream)", + "label": "(end of synthetic stream)", + "type": "TextView", + "rect": { + "width": 362, + "y": 65, + "x": 20, + "height": 22 + }, + "depth": 38, + "enabled": true, + "parentIndex": 270, + "hittable": false, + "index": 272, + "ref": "e273" + }, + { + "hittable": false, + "index": 273, + "label": "(end of synthetic stream)", + "rect": { + "width": 183.234375, + "y": 65, + "x": 20, + "height": 22 + }, + "depth": 39, + "type": "TextView", + "enabled": true, + "parentIndex": 272, + "ref": "e274" + }, + { + "hittable": false, + "depth": 39, + "parentIndex": 272, + "type": "Other", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "index": 274, + "rect": { + "width": 30, + "y": 65, + "x": 349, + "height": 22 + }, + "ref": "e275" + }, + { + "index": 275, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 3, + "y": 26, + "x": 376, + "height": 36 + }, + "parentIndex": 274, + "depth": 40, + "ref": "e276" + }, + { + "depth": 39, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "width": 362, + "y": 73, + "x": 20, + "height": 11 + }, + "parentIndex": 272, + "index": 276, + "enabled": true, + "hittable": false, + "ref": "e277" + }, + { + "enabled": true, + "depth": 40, + "type": "Other", + "index": 277, + "parentIndex": 276, + "rect": { + "width": 36, + "y": 81, + "x": -19, + "height": 3 + }, + "hittable": false, + "ref": "e278" + }, + { + "rect": { + "width": 378, + "y": 99, + "x": 12, + "height": 67 + }, + "type": "Other", + "depth": 35, + "index": 278, + "enabled": true, + "label": "Copy turn", + "hittable": false, + "parentIndex": 73, + "ref": "e279" + }, + { + "parentIndex": 278, + "enabled": true, + "type": "Button", + "label": "Copy turn", + "rect": { + "width": 22, + "y": 112, + "x": 16, + "height": 22 + }, + "depth": 36, + "hittable": false, + "index": 279, + "ref": "e280" + }, + { + "depth": 36, + "type": "Other", + "parentIndex": 278, + "index": 280, + "enabled": true, + "hittable": false, + "label": "Fork chat from here", + "rect": { + "width": 22, + "y": 112, + "x": 46, + "height": 22 + }, + "ref": "e281" + }, + { + "enabled": true, + "rect": { + "width": 22, + "y": 112, + "x": 46, + "height": 22 + }, + "depth": 37, + "parentIndex": 280, + "hittable": false, + "identifier": "assistant-fork-menu-trigger", + "index": 281, + "type": "Button", + "label": "Fork chat from here", + "ref": "e282" + }, + { + "hittable": false, + "index": 282, + "depth": 36, + "rect": { + "width": 85.33332824707031, + "y": 115.33333325386047, + "x": 76, + "height": 15.666671752929688 + }, + "type": "Button", + "label": "Worked for 9s, ended 8:44 PM", + "enabled": true, + "parentIndex": 278, + "ref": "e283" + }, + { + "rect": { + "width": 402, + "y": 164, + "x": 0, + "height": 30 + }, + "enabled": true, + "hittable": false, + "value": "0%", + "type": "Other", + "index": 283, + "depth": 33, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 71, + "ref": "e284" + }, + { + "type": "Other", + "parentIndex": 283, + "depth": 34, + "hittable": false, + "enabled": true, + "rect": { + "width": 393, + "y": 164, + "x": 3, + "height": 3 + }, + "index": 284, + "ref": "e285" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 676 pages", + "rect": { + "width": 30, + "y": 161, + "x": 369, + "height": 5 + }, + "hittable": false, + "parentIndex": 71, + "index": 285, + "depth": 33, + "type": "Other", + "enabled": true, + "ref": "e286" + }, + { + "index": 286, + "enabled": true, + "rect": { + "width": 3, + "y": 117.66666666666666, + "x": 396, + "height": 45.33333333333334 + }, + "parentIndex": 285, + "hittable": false, + "depth": 34, + "type": "Other", + "ref": "e287" + }, + { + "index": 287, + "enabled": true, + "value": "0%", + "rect": { + "width": 30, + "y": 161, + "x": 369, + "height": 5 + }, + "hittable": false, + "parentIndex": 71, + "depth": 33, + "type": "Other", + "label": "Vertical scroll bar, 676 pages", + "ref": "e288" + }, + { + "rect": { + "width": 3, + "y": 117.66666666666666, + "x": 396, + "height": 45.33333333333334 + }, + "hittable": false, + "enabled": true, + "index": 288, + "type": "Other", + "depth": 34, + "parentIndex": 287, + "ref": "e289" + }, + { + "value": "0%", + "index": 289, + "type": "Other", + "rect": { + "width": 402, + "y": 164, + "x": 0, + "height": 30 + }, + "enabled": true, + "depth": 33, + "parentIndex": 71, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e290" + }, + { + "parentIndex": 289, + "depth": 34, + "type": "Other", + "enabled": true, + "index": 290, + "rect": { + "width": 393, + "y": 164, + "x": 3, + "height": 3 + }, + "hittable": false, + "ref": "e291" + }, + { + "depth": 29, + "index": 291, + "parentIndex": 65, + "hittable": false, + "type": "Other", + "identifier": "composer-viewport-content", + "rect": { + "width": 402, + "y": 166, + "x": 0, + "height": 406 + }, + "enabled": true, + "label": "Message agent...", + "ref": "e292" + }, + { + "identifier": "message-input-root", + "depth": 30, + "type": "Other", + "index": 292, + "hittable": false, + "rect": { + "width": 370, + "y": 166, + "x": 16, + "height": 356 + }, + "parentIndex": 291, + "enabled": true, + "ref": "e293" + }, + { + "parentIndex": 291, + "index": 293, + "type": "Other", + "rect": { + "width": 370, + "y": 166, + "x": 16, + "height": 356 + }, + "hittable": false, + "enabled": true, + "depth": 30, + "ref": "e294" + }, + { + "rect": { + "width": 344, + "y": 175, + "x": 29, + "height": 298 + }, + "parentIndex": 291, + "enabled": true, + "index": 294, + "hittable": false, + "label": "Message agent...", + "type": "Other", + "depth": 30, + "ref": "e295" + }, + { + "depth": 31, + "hittable": false, + "label": "Message agent...", + "type": "TextView", + "index": 295, + "enabled": true, + "rect": { + "width": 344, + "y": 175, + "x": 29, + "height": 298 + }, + "parentIndex": 294, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "ref": "e296" + }, + { + "parentIndex": 295, + "hittable": false, + "enabled": true, + "rect": { + "width": 30, + "y": 175, + "x": 340, + "height": 298 + }, + "label": "Vertical scroll bar, 2 pages", + "index": 296, + "value": "100%", + "type": "Other", + "depth": 32, + "ref": "e297" + }, + { + "index": 297, + "type": "Other", + "hittable": false, + "rect": { + "width": 3, + "y": 245, + "x": 367, + "height": 225 + }, + "depth": 33, + "parentIndex": 296, + "enabled": true, + "ref": "e298" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "width": 344, + "y": 440, + "x": 29, + "height": 30 + }, + "parentIndex": 295, + "depth": 32, + "enabled": true, + "index": 298, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "ref": "e299" + }, + { + "parentIndex": 298, + "index": 299, + "depth": 33, + "enabled": true, + "type": "Other", + "rect": { + "width": 335, + "y": 467, + "x": 32, + "height": 3 + }, + "hittable": false, + "ref": "e300" + }, + { + "enabled": true, + "type": "Button", + "label": "Add attachment", + "rect": { + "width": 28, + "y": 485, + "x": 23, + "height": 28 + }, + "parentIndex": 291, + "index": 300, + "identifier": "message-input-attach-button", + "depth": 30, + "hittable": false, + "ref": "e301" + }, + { + "index": 301, + "enabled": true, + "label": "Select model (Ten second stream)", + "depth": 30, + "type": "Other", + "rect": { + "width": 232, + "y": 485, + "x": 51, + "height": 28 + }, + "hittable": false, + "parentIndex": 291, + "ref": "e302" + }, + { + "index": 302, + "enabled": true, + "parentIndex": 301, + "identifier": "combined-model-selector", + "rect": { + "width": 202, + "y": 485, + "x": 51, + "height": 28 + }, + "depth": 31, + "hittable": false, + "label": "Select model (Ten second stream)", + "type": "Button", + "ref": "e303" + }, + { + "parentIndex": 291, + "label": "Context window 3% used", + "depth": 30, + "index": 303, + "identifier": "context-window-meter", + "type": "Image", + "enabled": true, + "rect": { + "width": 28, + "y": 485, + "x": 283, + "height": 28 + }, + "hittable": false, + "ref": "e304" + }, + { + "label": "Start dictation", + "type": "Button", + "rect": { + "width": 28, + "y": 485, + "x": 315, + "height": 28 + }, + "hittable": false, + "parentIndex": 291, + "index": 304, + "enabled": true, + "depth": 30, + "ref": "e305" + }, + { + "index": 305, + "depth": 30, + "rect": { + "width": 28, + "y": 485, + "x": 351, + "height": 28 + }, + "hittable": false, + "parentIndex": 291, + "label": "Send message", + "enabled": true, + "type": "Button", + "ref": "e306" + }, + { + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "type": "Other", + "depth": 11, + "hittable": false, + "enabled": true, + "index": 306, + "parentIndex": 16, + "ref": "e307" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 7, + "index": 307, + "parentIndex": 10, + "ref": "e308" + }, + { + "enabled": true, + "parentIndex": 307, + "type": "Other", + "depth": 8, + "hittable": false, + "index": 308, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "ref": "e309" + }, + { + "enabled": true, + "depth": 9, + "parentIndex": 308, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "index": 309, + "ref": "e310" + }, + { + "type": "Window", + "index": 310, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "depth": 1, + "parentIndex": 0, + "enabled": true, + "hittable": false, + "ref": "e311" + }, + { + "depth": 2, + "hittable": false, + "enabled": true, + "index": 311, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 310, + "ref": "e312" + }, + { + "enabled": true, + "hittable": false, + "depth": 3, + "type": "Other", + "parentIndex": 311, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "index": 312, + "ref": "e313" + }, + { + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 336 + }, + "parentIndex": 311, + "enabled": true, + "index": 313, + "type": "Other", + "hittable": false, + "depth": 3, + "ref": "e314" + }, + { + "parentIndex": 313, + "index": 314, + "hittable": false, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 278 + }, + "enabled": true, + "depth": 4, + "type": "Other", + "ref": "e315" + }, + { + "index": 315, + "hittable": true, + "label": "Emoji", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "parentIndex": 0, + "enabled": true, + "type": "Window", + "depth": 1, + "ref": "e316" + }, + { + "index": 316, + "type": "Other", + "hittable": true, + "parentIndex": 315, + "label": "Emoji", + "depth": 2, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "enabled": true, + "ref": "e317" + }, + { + "label": "Emoji", + "enabled": true, + "hittable": true, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 336 + }, + "parentIndex": 316, + "depth": 3, + "index": 317, + "type": "Other", + "ref": "e318" + }, + { + "index": 318, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "type": "Other", + "parentIndex": 317, + "depth": 4, + "enabled": true, + "hittable": false, + "ref": "e319" + }, + { + "index": 319, + "parentIndex": 318, + "depth": 5, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "enabled": true, + "ref": "e320" + }, + { + "depth": 6, + "type": "Other", + "index": 320, + "hittable": false, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "enabled": true, + "parentIndex": 319, + "ref": "e321" + }, + { + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "label": "Typing Predictions", + "enabled": true, + "hittable": true, + "depth": 4, + "parentIndex": 317, + "index": 321, + "type": "Other", + "identifier": "SystemInputAssistantView", + "ref": "e322" + }, + { + "enabled": true, + "hittable": true, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "label": "Typing Predictions", + "depth": 5, + "parentIndex": 321, + "type": "Other", + "index": 322, + "ref": "e323" + }, + { + "identifier": "CenterPageView", + "hittable": true, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "depth": 6, + "parentIndex": 322, + "enabled": true, + "type": "Other", + "label": "Typing Predictions", + "index": 323, + "ref": "e324" + }, + { + "parentIndex": 323, + "hittable": false, + "enabled": true, + "depth": 7, + "index": 324, + "type": "Other", + "rect": { + "width": 402, + "y": -62, + "x": 0, + "height": 1245 + }, + "ref": "e325" + }, + { + "hittable": false, + "depth": 8, + "type": "ScrollView", + "parentIndex": 324, + "enabled": true, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "index": 325, + "ref": "e326" + }, + { + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "label": "Typing Predictions", + "hittable": true, + "depth": 7, + "index": 326, + "type": "Other", + "parentIndex": 323, + "enabled": true, + "ref": "e327" + }, + { + "parentIndex": 326, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "type": "Other", + "depth": 8, + "index": 327, + "enabled": true, + "label": "Typing Predictions", + "hittable": true, + "ref": "e328" + }, + { + "type": "Other", + "parentIndex": 327, + "hittable": true, + "index": 328, + "label": "“o”", + "enabled": true, + "depth": 9, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "ref": "e329" + }, + { + "enabled": true, + "parentIndex": 328, + "type": "Other", + "label": "“o”", + "index": 329, + "hittable": true, + "depth": 10, + "rect": { + "width": 402, + "y": 538, + "x": 0, + "height": 45 + }, + "ref": "e330" + }, + { + "index": 330, + "label": "“o”", + "hittable": true, + "depth": 11, + "enabled": true, + "parentIndex": 329, + "type": "Other", + "rect": { + "width": 134, + "y": 538, + "x": 0, + "height": 45 + }, + "ref": "e331" + }, + { + "index": 331, + "rect": { + "width": 134, + "y": 538, + "x": 134, + "height": 45 + }, + "depth": 11, + "label": "oh", + "type": "Other", + "enabled": true, + "parentIndex": 329, + "hittable": true, + "ref": "e332" + }, + { + "index": 332, + "type": "Other", + "parentIndex": 329, + "enabled": true, + "rect": { + "width": 134, + "y": 538, + "x": 268, + "height": 45 + }, + "label": "one", + "hittable": true, + "depth": 11, + "ref": "e333" + }, + { + "enabled": true, + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 233 + }, + "type": "Other", + "index": 333, + "depth": 4, + "hittable": false, + "parentIndex": 317, + "ref": "e334" + }, + { + "index": 334, + "type": "Other", + "enabled": true, + "depth": 5, + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 291 + }, + "parentIndex": 333, + "hittable": false, + "ref": "e335" + }, + { + "index": 335, + "enabled": true, + "hittable": false, + "depth": 6, + "type": "Other", + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 291 + }, + "parentIndex": 334, + "ref": "e336" + }, + { + "parentIndex": 335, + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 291 + }, + "index": 336, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 7, + "ref": "e337" + }, + { + "label": "Q", + "hittable": false, + "depth": 4, + "type": "Other", + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 233 + }, + "parentIndex": 317, + "enabled": true, + "index": 337, + "ref": "e338" + }, + { + "index": 338, + "depth": 5, + "type": "Keyboard", + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 233 + }, + "enabled": true, + "label": "Q", + "parentIndex": 337, + "hittable": false, + "ref": "e339" + }, + { + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 233 + }, + "index": 339, + "hittable": false, + "label": "Q", + "parentIndex": 338, + "type": "Other", + "enabled": true, + "depth": 6, + "ref": "e340" + }, + { + "depth": 7, + "label": "Q", + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 233 + }, + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "parentIndex": 339, + "index": 340, + "enabled": true, + "type": "Other", + "ref": "e341" + }, + { + "label": "Q", + "type": "Key", + "rect": { + "width": 40.333333333333336, + "y": 590, + "x": 0, + "height": 46 + }, + "index": 341, + "enabled": true, + "parentIndex": 340, + "hittable": false, + "depth": 8, + "ref": "e342" + }, + { + "hittable": false, + "depth": 8, + "parentIndex": 340, + "type": "Key", + "enabled": true, + "rect": { + "width": 40.00000000000001, + "y": 590, + "x": 40.333333333333336, + "height": 46 + }, + "label": "W", + "index": 342, + "ref": "e343" + }, + { + "enabled": true, + "label": "E", + "index": 343, + "rect": { + "width": 40.33333333333334, + "y": 590, + "x": 80.33333333333334, + "height": 46 + }, + "hittable": false, + "depth": 8, + "parentIndex": 340, + "type": "Key", + "ref": "e344" + }, + { + "rect": { + "width": 40, + "y": 590, + "x": 120.66666666666669, + "height": 46 + }, + "index": 344, + "parentIndex": 340, + "hittable": false, + "depth": 8, + "type": "Key", + "label": "R", + "enabled": true, + "ref": "e345" + }, + { + "parentIndex": 340, + "index": 345, + "enabled": true, + "hittable": false, + "rect": { + "width": 40.33333333333334, + "y": 590, + "x": 160.66666666666669, + "height": 46 + }, + "label": "T", + "type": "Key", + "depth": 8, + "ref": "e346" + }, + { + "parentIndex": 340, + "rect": { + "width": 40.33333333333334, + "y": 590, + "x": 201.00000000000003, + "height": 46 + }, + "label": "Y", + "depth": 8, + "enabled": true, + "hittable": false, + "index": 346, + "type": "Key", + "ref": "e347" + }, + { + "hittable": false, + "parentIndex": 340, + "label": "U", + "enabled": true, + "type": "Key", + "index": 347, + "depth": 8, + "rect": { + "width": 40, + "y": 590, + "x": 241.33333333333337, + "height": 46 + }, + "ref": "e348" + }, + { + "depth": 8, + "enabled": true, + "type": "Key", + "parentIndex": 340, + "index": 348, + "rect": { + "width": 40.333333333333314, + "y": 590, + "x": 281.33333333333337, + "height": 46 + }, + "hittable": false, + "label": "I", + "ref": "e349" + }, + { + "depth": 8, + "index": 349, + "enabled": true, + "rect": { + "width": 40, + "y": 590, + "x": 321.6666666666667, + "height": 46 + }, + "hittable": false, + "type": "Key", + "parentIndex": 340, + "label": "O", + "ref": "e350" + }, + { + "enabled": true, + "parentIndex": 340, + "rect": { + "width": 40.333333333333314, + "y": 590, + "x": 361.6666666666667, + "height": 46 + }, + "label": "P", + "hittable": false, + "index": 350, + "type": "Key", + "depth": 8, + "ref": "e351" + }, + { + "type": "Key", + "parentIndex": 340, + "enabled": true, + "rect": { + "width": 40.33333333333333, + "y": 644, + "x": 19.666666666666668, + "height": 46 + }, + "depth": 8, + "index": 351, + "label": "A", + "hittable": false, + "ref": "e352" + }, + { + "parentIndex": 340, + "type": "Key", + "index": 352, + "label": "S", + "hittable": false, + "enabled": true, + "depth": 8, + "rect": { + "width": 40.33333333333334, + "y": 644, + "x": 60, + "height": 46 + }, + "ref": "e353" + }, + { + "index": 353, + "depth": 8, + "hittable": false, + "parentIndex": 340, + "enabled": true, + "rect": { + "width": 40, + "y": 644, + "x": 100.33333333333334, + "height": 46 + }, + "type": "Key", + "label": "D", + "ref": "e354" + }, + { + "hittable": false, + "depth": 8, + "enabled": true, + "parentIndex": 340, + "index": 354, + "type": "Key", + "label": "F", + "rect": { + "width": 40.33333333333334, + "y": 644, + "x": 140.33333333333334, + "height": 46 + }, + "ref": "e355" + }, + { + "rect": { + "width": 40, + "y": 644, + "x": 181.2026666666667, + "height": 46 + }, + "index": 355, + "enabled": true, + "type": "Key", + "hittable": false, + "depth": 8, + "parentIndex": 340, + "label": "G", + "ref": "e356" + }, + { + "parentIndex": 340, + "hittable": false, + "depth": 8, + "index": 356, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "y": 644, + "x": 221.2026666666667, + "height": 46 + }, + "type": "Key", + "label": "H", + "ref": "e357" + }, + { + "index": 357, + "label": "J", + "rect": { + "width": 40, + "y": 644, + "x": 261.536, + "height": 46 + }, + "parentIndex": 340, + "type": "Key", + "depth": 8, + "enabled": true, + "hittable": false, + "ref": "e358" + }, + { + "type": "Key", + "enabled": true, + "label": "K", + "rect": { + "width": 40.333333333333314, + "y": 644, + "x": 301.536, + "height": 46 + }, + "depth": 8, + "hittable": false, + "parentIndex": 340, + "index": 358, + "ref": "e359" + }, + { + "depth": 8, + "index": 359, + "parentIndex": 340, + "label": "L", + "hittable": false, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "y": 644, + "x": 341.8693333333333, + "height": 46 + }, + "enabled": true, + "ref": "e360" + }, + { + "hittable": false, + "label": "shift", + "enabled": true, + "rect": { + "width": 51.333333333333336, + "y": 698, + "x": 0, + "height": 46 + }, + "parentIndex": 340, + "index": 360, + "selected": true, + "depth": 8, + "type": "Button", + "identifier": "shift", + "ref": "e361" + }, + { + "index": 361, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "y": 698, + "x": 60, + "height": 46 + }, + "label": "Z", + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 340, + "ref": "e362" + }, + { + "type": "Key", + "hittable": false, + "parentIndex": 340, + "rect": { + "width": 40, + "y": 698, + "x": 100.33333333333334, + "height": 46 + }, + "enabled": true, + "depth": 8, + "index": 362, + "label": "X", + "ref": "e363" + }, + { + "rect": { + "width": 40.33333333333334, + "y": 698, + "x": 140.33333333333334, + "height": 46 + }, + "parentIndex": 340, + "depth": 8, + "enabled": true, + "label": "C", + "index": 363, + "hittable": false, + "type": "Key", + "ref": "e364" + }, + { + "label": "V", + "rect": { + "width": 40, + "y": 698, + "x": 181.2026666666667, + "height": 46 + }, + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 340, + "type": "Key", + "index": 364, + "ref": "e365" + }, + { + "parentIndex": 340, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "y": 698, + "x": 221.2026666666667, + "height": 46 + }, + "hittable": false, + "label": "B", + "index": 365, + "type": "Key", + "depth": 8, + "ref": "e366" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "type": "Key", + "parentIndex": 340, + "label": "N", + "rect": { + "width": 40, + "y": 698, + "x": 261.536, + "height": 46 + }, + "index": 366, + "ref": "e367" + }, + { + "rect": { + "width": 40.333333333333314, + "y": 698, + "x": 301.536, + "height": 46 + }, + "depth": 8, + "hittable": false, + "parentIndex": 340, + "label": "M", + "index": 367, + "enabled": true, + "type": "Key", + "ref": "e368" + }, + { + "enabled": true, + "identifier": "delete", + "depth": 8, + "type": "Key", + "index": 368, + "rect": { + "width": 51.333333333333314, + "y": 698, + "x": 350.42133333333334, + "height": 46 + }, + "label": "delete", + "parentIndex": 340, + "hittable": false, + "ref": "e369" + }, + { + "type": "Key", + "label": "numbers", + "parentIndex": 340, + "depth": 8, + "rect": { + "width": 101, + "y": 752, + "x": 0, + "height": 46 + }, + "identifier": "more", + "enabled": true, + "index": 369, + "hittable": false, + "ref": "e370" + }, + { + "label": "space", + "enabled": true, + "hittable": false, + "identifier": "space", + "rect": { + "width": 201.33333333333334, + "y": 752, + "x": 100.33333333333334, + "height": 46 + }, + "depth": 8, + "parentIndex": 340, + "index": 370, + "type": "Key", + "ref": "e371" + }, + { + "rect": { + "width": 100.33333333333331, + "y": 752, + "x": 301.6666666666667, + "height": 46 + }, + "enabled": true, + "hittable": false, + "index": 371, + "type": "Button", + "label": "return", + "identifier": "Return", + "depth": 8, + "parentIndex": 340, + "ref": "e372" + }, + { + "rect": { + "width": 402, + "y": 583, + "x": 0, + "height": 291 + }, + "parentIndex": 317, + "hittable": true, + "label": "Emoji", + "enabled": true, + "depth": 4, + "type": "Other", + "index": 372, + "ref": "e373" + }, + { + "label": "Emoji", + "depth": 5, + "parentIndex": 372, + "rect": { + "width": 68.0852958475086, + "y": 805.6989567998571, + "x": 8.47726568115926, + "height": 68.73516393505099 + }, + "index": 373, + "enabled": true, + "hittable": true, + "type": "Button", + "ref": "e374" + }, + { + "parentIndex": 373, + "index": 374, + "hittable": false, + "type": "StaticText", + "enabled": true, + "rect": { + "width": 0, + "y": 805.6989567998571, + "x": 8.47726568115926, + "height": 0 + }, + "depth": 6, + "ref": "e375" + }, + { + "label": "Dictate", + "depth": 5, + "index": 375, + "hittable": false, + "rect": { + "width": 68.08529584750863, + "y": 805.3656234665239, + "x": 325.43743847133214, + "height": 68.73516393505099 + }, + "type": "Button", + "enabled": true, + "identifier": "dictation", + "parentIndex": 372, + "ref": "e376" + }, + { + "rect": { + "width": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "height": 0 + }, + "index": 376, + "depth": 6, + "parentIndex": 375, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e377" + }, + { + "rect": { + "width": 68.08529584750863, + "y": 805.3656234665239, + "x": 325.43743847133214, + "height": 68.73516393505099 + }, + "hittable": true, + "label": "Dictate", + "index": 377, + "type": "Button", + "parentIndex": 372, + "depth": 5, + "identifier": "dictation", + "enabled": true, + "ref": "e378" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "height": 0 + }, + "depth": 6, + "index": 378, + "parentIndex": 377, + "hittable": false, + "ref": "e379" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 379, + "totalNodeCount": 379, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 27, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 27 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 27 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776092 + } +} diff --git a/scroll-regression/ios/chat-cap-open.png b/scroll-regression/ios/chat-cap-open.png new file mode 100644 index 0000000000..3025985cac Binary files /dev/null and b/scroll-regression/ios/chat-cap-open.png differ diff --git a/scroll-regression/ios/chat-cleared.json b/scroll-regression/ios/chat-cleared.json new file mode 100644 index 0000000000..55eebc28cc --- /dev/null +++ b/scroll-regression/ios/chat-cleared.json @@ -0,0 +1,6541 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": true, + "index": 0, + "enabled": true, + "label": "Paseo Debug", + "depth": 0, + "ref": "e1" + }, + { + "type": "Window", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 0, + "index": 1, + "enabled": true, + "depth": 1, + "ref": "e2" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 1, + "index": 2, + "enabled": true, + "depth": 2, + "ref": "e3" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 2, + "index": 3, + "enabled": true, + "depth": 3, + "ref": "e4" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 3, + "index": 4, + "enabled": true, + "depth": 4, + "ref": "e5" + }, + { + "type": "Window", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 0, + "index": 5, + "enabled": true, + "depth": 1, + "ref": "e6" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 5, + "index": 6, + "enabled": true, + "depth": 2, + "ref": "e7" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 6, + "index": 7, + "enabled": true, + "depth": 3, + "ref": "e8" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 7, + "index": 8, + "enabled": true, + "depth": 4, + "ref": "e9" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 8, + "index": 9, + "enabled": true, + "depth": 5, + "ref": "e10" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 9, + "index": 10, + "enabled": true, + "depth": 6, + "ref": "e11" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 10, + "index": 11, + "enabled": true, + "depth": 7, + "ref": "e12" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 11, + "index": 12, + "enabled": true, + "depth": 8, + "ref": "e13" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 12, + "index": 13, + "enabled": true, + "depth": 9, + "ref": "e14" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 12, + "index": 14, + "enabled": true, + "depth": 9, + "ref": "e15" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 14, + "index": 15, + "enabled": true, + "depth": 10, + "ref": "e16" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 14, + "index": 16, + "enabled": true, + "depth": 10, + "ref": "e17" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 16, + "index": 17, + "enabled": true, + "depth": 11, + "ref": "e18" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 16, + "index": 18, + "enabled": true, + "depth": 11, + "ref": "e19" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 18, + "index": 19, + "enabled": true, + "depth": 12, + "ref": "e20" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 19, + "index": 20, + "enabled": true, + "depth": 13, + "ref": "e21" + }, + { + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 20, + "index": 21, + "enabled": true, + "depth": 14, + "ref": "e22" + }, + { + "hittable": false, + "parentIndex": 21, + "enabled": true, + "depth": 15, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "index": 22, + "ref": "e23" + }, + { + "index": 23, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 16, + "parentIndex": 22, + "ref": "e24" + }, + { + "type": "Other", + "hittable": false, + "depth": 17, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 24, + "parentIndex": 23, + "enabled": true, + "ref": "e25" + }, + { + "index": 25, + "parentIndex": 24, + "hittable": false, + "type": "Other", + "depth": 18, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e26" + }, + { + "depth": 19, + "index": 26, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 25, + "hittable": false, + "type": "Other", + "ref": "e27" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 26, + "enabled": true, + "index": 27, + "hittable": false, + "depth": 20, + "type": "Other", + "ref": "e28" + }, + { + "enabled": true, + "type": "Other", + "depth": 21, + "label": "Switch tabs (1 open)", + "parentIndex": 27, + "index": 28, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "ref": "e29" + }, + { + "hittable": false, + "depth": 22, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "label": "Open menu", + "parentIndex": 28, + "index": 29, + "ref": "e30" + }, + { + "type": "Other", + "depth": 23, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 29, + "enabled": true, + "hittable": false, + "index": 30, + "label": "Open menu", + "ref": "e31" + }, + { + "type": "Other", + "index": 31, + "enabled": true, + "hittable": false, + "label": "Open menu", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "depth": 24, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 30, + "ref": "e32" + }, + { + "label": "Open menu", + "hittable": false, + "type": "Other", + "identifier": "composer-dock-header", + "index": 32, + "depth": 25, + "enabled": true, + "parentIndex": 31, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 126 + }, + "ref": "e33" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 70, + "height": 56 + }, + "enabled": true, + "type": "Other", + "parentIndex": 32, + "hittable": false, + "depth": 26, + "index": 33, + "ref": "e34" + }, + { + "rect": { + "x": 8, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "label": "Open menu", + "enabled": true, + "depth": 26, + "hittable": false, + "parentIndex": 32, + "index": 34, + "identifier": "menu-button", + "type": "Button", + "ref": "e35" + }, + { + "parentIndex": 32, + "type": "Other", + "depth": 26, + "index": 35, + "hittable": false, + "enabled": true, + "label": "main", + "rect": { + "x": 48, + "width": 314, + "y": 80.6666669845581, + "height": 34 + }, + "ref": "e36" + }, + { + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 34 + }, + "parentIndex": 35, + "hittable": false, + "label": "main", + "depth": 27, + "type": "Other", + "enabled": true, + "index": 36, + "ref": "e37" + }, + { + "identifier": "workspace-header-title", + "depth": 28, + "type": "StaticText", + "label": "main", + "parentIndex": 36, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "index": 37, + "enabled": true, + "hittable": false, + "ref": "e38" + }, + { + "index": 38, + "label": "main", + "depth": 29, + "parentIndex": 37, + "enabled": true, + "hittable": false, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "type": "StaticText", + "ref": "e39" + }, + { + "label": "composer-dock-ios-fixture", + "hittable": false, + "parentIndex": 36, + "type": "StaticText", + "depth": 28, + "index": 39, + "identifier": "workspace-header-subtitle", + "enabled": true, + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "ref": "e40" + }, + { + "type": "StaticText", + "parentIndex": 39, + "label": "composer-dock-ios-fixture", + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "index": 40, + "depth": 29, + "enabled": true, + "hittable": false, + "ref": "e41" + }, + { + "enabled": true, + "depth": 28, + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "index": 41, + "type": "StaticText", + "label": "·", + "hittable": false, + "parentIndex": 36, + "ref": "e42" + }, + { + "index": 42, + "parentIndex": 41, + "depth": 29, + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "label": "·", + "enabled": true, + "type": "StaticText", + "hittable": false, + "ref": "e43" + }, + { + "depth": 28, + "type": "Other", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "index": 43, + "enabled": true, + "parentIndex": 36, + "rect": { + "x": 227.3333282470703, + "width": 68.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "label": "dev-new", + "hittable": false, + "ref": "e44" + }, + { + "rect": { + "x": 227.3333282470703, + "width": 12, + "y": 100.6666669845581, + "height": 12 + }, + "depth": 28, + "enabled": true, + "type": "Other", + "index": 44, + "parentIndex": 36, + "hittable": false, + "ref": "e45" + }, + { + "type": "Other", + "enabled": true, + "index": 45, + "parentIndex": 44, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 11 + }, + "depth": 29, + "hittable": false, + "ref": "e46" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 5 + }, + "depth": 30, + "type": "Other", + "parentIndex": 45, + "index": 46, + "ref": "e47" + }, + { + "type": "Other", + "depth": 30, + "index": 47, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 107.1666669845581, + "height": 5 + }, + "hittable": false, + "parentIndex": 45, + "enabled": true, + "ref": "e48" + }, + { + "index": 48, + "parentIndex": 45, + "type": "Other", + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 103.1666669845581, + "height": 1 + }, + "enabled": true, + "hittable": false, + "depth": 30, + "ref": "e49" + }, + { + "parentIndex": 45, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 109.1666669845581, + "height": 1 + }, + "enabled": true, + "depth": 30, + "hittable": false, + "type": "Other", + "index": 49, + "ref": "e50" + }, + { + "label": "dev-new", + "parentIndex": 36, + "hittable": false, + "depth": 28, + "index": 50, + "type": "StaticText", + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "enabled": true, + "ref": "e51" + }, + { + "enabled": true, + "index": 51, + "label": "dev-new", + "type": "StaticText", + "parentIndex": 50, + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "depth": 29, + "hittable": false, + "ref": "e52" + }, + { + "hittable": false, + "index": 52, + "parentIndex": 35, + "type": "Button", + "rect": { + "x": 330, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "enabled": true, + "label": "Workspace actions", + "ref": "e53" + }, + { + "identifier": "workspace-explorer-toggle", + "parentIndex": 32, + "enabled": true, + "label": "Open Explorer sidebar", + "depth": 26, + "index": 53, + "rect": { + "x": 362, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "type": "Button", + "hittable": false, + "ref": "e54" + }, + { + "type": "Other", + "parentIndex": 31, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 25, + "index": 54, + "enabled": true, + "ref": "e55" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 31, + "index": 55, + "depth": 25, + "ref": "e56" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 34 + }, + "label": "Switch tabs (1 open)", + "hittable": false, + "index": 56, + "type": "Button", + "parentIndex": 31, + "identifier": "workspace-tab-switcher-trigger", + "enabled": true, + "depth": 25, + "ref": "e57" + }, + { + "enabled": true, + "parentIndex": 56, + "hittable": false, + "type": "Other", + "rect": { + "x": 20, + "width": 14, + "y": 136, + "height": 14 + }, + "depth": 26, + "identifier": "workspace-active-tab-icon", + "index": 57, + "ref": "e58" + }, + { + "identifier": "workspace-tabs-row", + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 35 + }, + "enabled": true, + "depth": 25, + "index": 58, + "type": "Other", + "parentIndex": 31, + "hittable": false, + "ref": "e59" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "depth": 25, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 59, + "parentIndex": 31, + "ref": "e60" + }, + { + "parentIndex": 31, + "type": "Other", + "enabled": true, + "depth": 25, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "index": 60, + "hittable": false, + "ref": "e61" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "label": "Add attachment", + "index": 61, + "type": "Other", + "parentIndex": 60, + "depth": 26, + "ref": "e62" + }, + { + "depth": 27, + "parentIndex": 61, + "index": 62, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "enabled": true, + "type": "Other", + "ref": "e63" + }, + { + "index": 63, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "depth": 27, + "type": "Other", + "parentIndex": 61, + "ref": "e64" + }, + { + "identifier": "composer-viewport", + "hittable": false, + "parentIndex": 61, + "type": "Other", + "depth": 27, + "label": "Message agent... Message, @files, /commands", + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "index": 64, + "enabled": true, + "ref": "e65" + }, + { + "depth": 28, + "index": 65, + "parentIndex": 64, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 713 + }, + "label": "Message agent... Message, @files, /commands", + "ref": "e66" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "parentIndex": 65, + "label": "Horizontal scroll bar, 1 page", + "depth": 29, + "index": 66, + "identifier": "composer-dock-content", + "type": "Other", + "hittable": false, + "ref": "e67" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "enabled": true, + "type": "Other", + "parentIndex": 66, + "hittable": false, + "index": 67, + "depth": 30, + "ref": "e68" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 66, + "depth": 30, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "index": 68, + "label": "Horizontal scroll bar, 1 page", + "ref": "e69" + }, + { + "enabled": true, + "hittable": false, + "depth": 31, + "index": 69, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "parentIndex": 68, + "ref": "e70" + }, + { + "index": 70, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "identifier": "agent-chat-scroll", + "depth": 31, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "parentIndex": 68, + "enabled": true, + "ref": "e71" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 575 + }, + "depth": 32, + "index": 71, + "type": "ScrollView", + "label": "Thinking", + "parentIndex": 70, + "enabled": true, + "hittable": false, + "ref": "e72" + }, + { + "parentIndex": 71, + "hittable": false, + "enabled": true, + "label": "Thinking", + "rect": { + "x": 0, + "width": 402, + "y": -2945, + "height": 3379 + }, + "index": 72, + "type": "Other", + "depth": 33, + "ref": "e73" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "x": 0, + "width": 402, + "y": -2945, + "height": 3379 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 73, + "depth": 34, + "parentIndex": 72, + "ref": "e74" + }, + { + "hittable": false, + "depth": 35, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "y": -2945, + "height": 32 + }, + "index": 74, + "enabled": true, + "parentIndex": 73, + "ref": "e75" + }, + { + "identifier": "older-history-slot", + "rect": { + "x": 12, + "width": 378, + "y": -2945, + "height": 32 + }, + "depth": 36, + "index": 75, + "hittable": false, + "parentIndex": 74, + "type": "Other", + "enabled": true, + "ref": "e76" + }, + { + "depth": 35, + "parentIndex": 73, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 76, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "y": -2913, + "height": 570 + }, + "enabled": true, + "ref": "e77" + }, + { + "index": 77, + "enabled": true, + "parentIndex": 76, + "depth": 36, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -2913, + "height": 566 + }, + "type": "Other", + "identifier": "assistant-message", + "ref": "e78" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "parentIndex": 76, + "rect": { + "x": 20, + "width": 362, + "y": -2901, + "height": 242 + }, + "index": 78, + "hittable": false, + "depth": 36, + "enabled": true, + "ref": "e79" + }, + { + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 79, + "type": "Other", + "depth": 37, + "parentIndex": 78, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -2901, + "height": 242 + }, + "ref": "e80" + }, + { + "index": 80, + "depth": 38, + "type": "Other", + "parentIndex": 79, + "enabled": true, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -2901, + "height": 242 + }, + "ref": "e81" + }, + { + "index": 81, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "depth": 38, + "parentIndex": 79, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e82" + }, + { + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": -2901, + "height": 242 + }, + "parentIndex": 81, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "depth": 39, + "hittable": false, + "index": 82, + "enabled": true, + "ref": "e83" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 81, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "x": 349, + "width": 30, + "y": -2901, + "height": 242 + }, + "hittable": false, + "index": 83, + "value": "0%", + "ref": "e84" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 83, + "depth": 40, + "rect": { + "x": 376, + "width": 3, + "y": -2940, + "height": 36 + }, + "index": 84, + "enabled": true, + "ref": "e85" + }, + { + "hittable": false, + "value": "0%", + "type": "Other", + "index": 85, + "enabled": true, + "depth": 39, + "parentIndex": 81, + "rect": { + "x": 20, + "width": 362, + "y": -2692, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "ref": "e86" + }, + { + "enabled": true, + "rect": { + "x": -19, + "width": 36, + "y": -2665, + "height": 3 + }, + "type": "Other", + "depth": 40, + "parentIndex": 85, + "hittable": false, + "index": 86, + "ref": "e87" + }, + { + "enabled": true, + "index": 87, + "depth": 36, + "parentIndex": 76, + "rect": { + "x": 20, + "width": 362, + "y": -2635, + "height": 264 + }, + "hittable": false, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e88" + }, + { + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -2635, + "height": 264 + }, + "index": 88, + "parentIndex": 87, + "hittable": false, + "type": "Other", + "depth": 37, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e89" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -2635, + "height": 264 + }, + "type": "Other", + "hittable": false, + "parentIndex": 88, + "enabled": true, + "index": 89, + "depth": 38, + "ref": "e90" + }, + { + "depth": 38, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "hittable": false, + "index": 90, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 88, + "enabled": true, + "ref": "e91" + }, + { + "type": "TextView", + "enabled": true, + "index": 91, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "parentIndex": 90, + "depth": 39, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -2635, + "height": 264 + }, + "ref": "e92" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "width": 30, + "y": -2635, + "height": 264 + }, + "value": "0%", + "index": 92, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 39, + "parentIndex": 90, + "ref": "e93" + }, + { + "depth": 40, + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "y": -2674, + "height": 36 + }, + "index": 93, + "enabled": true, + "parentIndex": 92, + "hittable": false, + "ref": "e94" + }, + { + "parentIndex": 90, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 94, + "rect": { + "x": 20, + "width": 362, + "y": -2404, + "height": 30 + }, + "ref": "e95" + }, + { + "index": 95, + "type": "Other", + "enabled": true, + "parentIndex": 94, + "rect": { + "x": -19, + "width": 36, + "y": -2377, + "height": 3 + }, + "depth": 40, + "hittable": false, + "ref": "e96" + }, + { + "index": 96, + "depth": 35, + "enabled": true, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "y": -2343, + "height": 32 + }, + "label": "Thinking", + "hittable": false, + "parentIndex": 73, + "ref": "e97" + }, + { + "identifier": "tool-call-badge", + "index": 97, + "enabled": true, + "parentIndex": 96, + "hittable": false, + "type": "Other", + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -2343, + "height": 32 + }, + "ref": "e98" + }, + { + "parentIndex": 96, + "rect": { + "x": 7, + "width": 388, + "y": -2343, + "height": 32 + }, + "hittable": false, + "type": "Button", + "label": "Thinking", + "index": 98, + "enabled": true, + "depth": 36, + "ref": "e99" + }, + { + "index": 99, + "type": "Other", + "parentIndex": 73, + "hittable": false, + "depth": 35, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -2311, + "height": 32 + }, + "ref": "e100" + }, + { + "rect": { + "x": 7, + "width": 388, + "y": -2311, + "height": 32 + }, + "depth": 36, + "identifier": "tool-call-badge", + "hittable": false, + "type": "Other", + "parentIndex": 99, + "index": 100, + "enabled": true, + "ref": "e101" + }, + { + "index": 101, + "parentIndex": 99, + "enabled": true, + "type": "Button", + "hittable": false, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -2311, + "height": 32 + }, + "ref": "e102" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 42, + "width": 344, + "y": -2304, + "height": 18 + }, + "depth": 37, + "label": "Read", + "parentIndex": 101, + "index": 102, + "type": "Other", + "ref": "e103" + }, + { + "type": "StaticText", + "rect": { + "x": 42, + "width": 35, + "y": -2304, + "height": 18 + }, + "hittable": false, + "enabled": true, + "label": "Read", + "depth": 38, + "index": 103, + "parentIndex": 102, + "ref": "e104" + }, + { + "enabled": true, + "hittable": false, + "index": 104, + "rect": { + "x": 42, + "width": 35, + "y": -2304, + "height": 18 + }, + "type": "StaticText", + "label": "Read", + "depth": 39, + "parentIndex": 103, + "ref": "e105" + }, + { + "depth": 38, + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "parentIndex": 102, + "enabled": true, + "hittable": false, + "index": 105, + "rect": { + "x": 85, + "width": 301, + "y": -2304, + "height": 18 + }, + "ref": "e106" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "hittable": false, + "type": "StaticText", + "parentIndex": 105, + "enabled": true, + "depth": 39, + "index": 106, + "rect": { + "x": 85, + "width": 301, + "y": -2304, + "height": 18 + }, + "ref": "e107" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 73, + "index": 107, + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "y": -2279, + "height": 36 + }, + "label": "Search, scrollToEnd", + "ref": "e108" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 107, + "index": 108, + "identifier": "tool-call-badge", + "hittable": false, + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -2279, + "height": 32 + }, + "ref": "e109" + }, + { + "rect": { + "x": 7, + "width": 388, + "y": -2279, + "height": 32 + }, + "label": "Search, scrollToEnd", + "index": 109, + "depth": 36, + "hittable": false, + "type": "Button", + "enabled": true, + "parentIndex": 107, + "ref": "e110" + }, + { + "type": "Other", + "index": 110, + "depth": 35, + "hittable": false, + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -2243, + "height": 646 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "ref": "e111" + }, + { + "enabled": true, + "type": "Other", + "identifier": "assistant-message", + "parentIndex": 110, + "hittable": false, + "depth": 36, + "index": 111, + "rect": { + "x": 20, + "width": 362, + "y": -2243, + "height": 642 + }, + "ref": "e112" + }, + { + "depth": 36, + "parentIndex": 110, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -2231, + "height": 132 + }, + "index": 112, + "ref": "e113" + }, + { + "hittable": false, + "parentIndex": 112, + "enabled": true, + "depth": 37, + "rect": { + "x": 20, + "width": 362, + "y": -2231, + "height": 132 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "index": 113, + "ref": "e114" + }, + { + "parentIndex": 113, + "hittable": false, + "index": 114, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -2231, + "height": 132 + }, + "depth": 38, + "enabled": true, + "ref": "e115" + }, + { + "index": 115, + "parentIndex": 113, + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "depth": 38, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e116" + }, + { + "index": 116, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "parentIndex": 115, + "depth": 39, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": -2231, + "height": 132 + }, + "ref": "e117" + }, + { + "hittable": false, + "depth": 39, + "value": "0%", + "index": 117, + "parentIndex": 115, + "rect": { + "x": 349, + "width": 30, + "y": -2231, + "height": 132 + }, + "enabled": true, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "ref": "e118" + }, + { + "rect": { + "x": 376, + "width": 3, + "y": -2270, + "height": 36 + }, + "parentIndex": 117, + "index": 118, + "depth": 40, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e119" + }, + { + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": -2132, + "height": 30 + }, + "parentIndex": 115, + "value": "0%", + "index": 119, + "ref": "e120" + }, + { + "rect": { + "x": -19, + "width": 36, + "y": -2105, + "height": 3 + }, + "hittable": false, + "index": 120, + "type": "Other", + "enabled": true, + "depth": 40, + "parentIndex": 119, + "ref": "e121" + }, + { + "depth": 36, + "parentIndex": 110, + "label": "•", + "index": 121, + "type": "StaticText", + "enabled": true, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -2071, + "height": 22 + }, + "hittable": false, + "ref": "e122" + }, + { + "type": "StaticText", + "label": "•", + "enabled": true, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -2071, + "height": 22 + }, + "index": 122, + "depth": 37, + "parentIndex": 121, + "ref": "e123" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -2071, + "height": 88 + }, + "parentIndex": 110, + "index": 123, + "type": "Other", + "depth": 36, + "ref": "e124" + }, + { + "depth": 37, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "type": "Other", + "parentIndex": 123, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -2071, + "height": 88 + }, + "index": 124, + "ref": "e125" + }, + { + "parentIndex": 124, + "depth": 38, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -2071, + "height": 88 + }, + "index": 125, + "type": "Other", + "enabled": true, + "ref": "e126" + }, + { + "type": "TextView", + "hittable": false, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 126, + "enabled": true, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "depth": 38, + "parentIndex": 124, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e127" + }, + { + "index": 127, + "enabled": true, + "hittable": false, + "type": "TextView", + "depth": 39, + "parentIndex": 126, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -2071, + "height": 88 + }, + "ref": "e128" + }, + { + "index": 128, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "depth": 39, + "value": "0%", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -2071, + "height": 88 + }, + "parentIndex": 126, + "hittable": false, + "ref": "e129" + }, + { + "enabled": true, + "index": 129, + "parentIndex": 128, + "hittable": false, + "depth": 40, + "type": "Other", + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -2110, + "height": 36 + }, + "ref": "e130" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 39, + "parentIndex": 126, + "index": 130, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -2016, + "height": 30 + }, + "ref": "e131" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1989, + "height": 3 + }, + "type": "Other", + "depth": 40, + "parentIndex": 130, + "hittable": false, + "index": 131, + "enabled": true, + "ref": "e132" + }, + { + "type": "StaticText", + "parentIndex": 110, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1979, + "height": 22 + }, + "enabled": true, + "depth": 36, + "label": "•", + "hittable": false, + "index": 132, + "ref": "e133" + }, + { + "depth": 37, + "label": "•", + "enabled": true, + "hittable": false, + "index": 133, + "type": "StaticText", + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1979, + "height": 22 + }, + "parentIndex": 132, + "ref": "e134" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1979, + "height": 88 + }, + "index": 134, + "depth": 36, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 110, + "ref": "e135" + }, + { + "parentIndex": 134, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1979, + "height": 88 + }, + "index": 135, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 37, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e136" + }, + { + "parentIndex": 135, + "type": "Other", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1979, + "height": 88 + }, + "index": 136, + "depth": 38, + "enabled": true, + "ref": "e137" + }, + { + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "type": "TextView", + "depth": 38, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "index": 137, + "hittable": false, + "parentIndex": 135, + "ref": "e138" + }, + { + "index": 138, + "depth": 39, + "enabled": true, + "type": "TextView", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1979, + "height": 88 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 137, + "ref": "e139" + }, + { + "parentIndex": 137, + "hittable": false, + "value": "0%", + "enabled": true, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1979, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "index": 139, + "depth": 39, + "type": "Other", + "ref": "e140" + }, + { + "index": 140, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -2018, + "height": 36 + }, + "type": "Other", + "hittable": false, + "parentIndex": 139, + "enabled": true, + "depth": 40, + "ref": "e141" + }, + { + "type": "Other", + "index": 141, + "depth": 39, + "value": "0%", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1924, + "height": 30 + }, + "parentIndex": 137, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "ref": "e142" + }, + { + "index": 142, + "enabled": true, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1897, + "height": 3 + }, + "type": "Other", + "parentIndex": 141, + "hittable": false, + "depth": 40, + "ref": "e143" + }, + { + "depth": 36, + "parentIndex": 110, + "index": 143, + "label": "•", + "enabled": true, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1887, + "height": 22 + }, + "type": "StaticText", + "ref": "e144" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1887, + "height": 22 + }, + "type": "StaticText", + "label": "•", + "hittable": false, + "index": 144, + "parentIndex": 143, + "enabled": true, + "depth": 37, + "ref": "e145" + }, + { + "parentIndex": 110, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1887, + "height": 88 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "hittable": false, + "depth": 36, + "index": 145, + "type": "Other", + "ref": "e146" + }, + { + "index": 146, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 145, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1887, + "height": 88 + }, + "ref": "e147" + }, + { + "depth": 38, + "enabled": true, + "parentIndex": 146, + "index": 147, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1887, + "height": 88 + }, + "type": "Other", + "hittable": false, + "ref": "e148" + }, + { + "type": "TextView", + "enabled": true, + "depth": 38, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 148, + "parentIndex": 146, + "hittable": false, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e149" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1887, + "height": 88 + }, + "index": 149, + "parentIndex": 148, + "hittable": false, + "type": "TextView", + "enabled": true, + "depth": 39, + "ref": "e150" + }, + { + "depth": 39, + "hittable": false, + "index": 150, + "enabled": true, + "parentIndex": 148, + "value": "0%", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1887, + "height": 88 + }, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "ref": "e151" + }, + { + "type": "Other", + "enabled": true, + "index": 151, + "depth": 40, + "hittable": false, + "parentIndex": 150, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1926, + "height": 36 + }, + "ref": "e152" + }, + { + "value": "0%", + "index": 152, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "type": "Other", + "hittable": false, + "parentIndex": 148, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1832, + "height": 30 + }, + "ref": "e153" + }, + { + "hittable": false, + "parentIndex": 152, + "type": "Other", + "depth": 40, + "index": 153, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1805, + "height": 3 + }, + "enabled": true, + "ref": "e154" + }, + { + "label": "•", + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1795, + "height": 22 + }, + "depth": 36, + "enabled": true, + "type": "StaticText", + "parentIndex": 110, + "index": 154, + "ref": "e155" + }, + { + "index": 155, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1795, + "height": 22 + }, + "label": "•", + "parentIndex": 154, + "type": "StaticText", + "enabled": true, + "depth": 37, + "ref": "e156" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 110, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1795, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "index": 156, + "ref": "e157" + }, + { + "index": 157, + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "Other", + "parentIndex": 156, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1795, + "height": 66 + }, + "depth": 37, + "ref": "e158" + }, + { + "enabled": true, + "parentIndex": 157, + "depth": 38, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1795, + "height": 66 + }, + "index": 158, + "type": "Other", + "ref": "e159" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "TextView", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 159, + "enabled": true, + "depth": 38, + "parentIndex": 157, + "ref": "e160" + }, + { + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1795, + "height": 66 + }, + "index": 160, + "type": "TextView", + "depth": 39, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 159, + "enabled": true, + "ref": "e161" + }, + { + "enabled": true, + "index": 161, + "parentIndex": 159, + "hittable": false, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1795, + "height": 66 + }, + "type": "Other", + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "ref": "e162" + }, + { + "hittable": false, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1834, + "height": 36 + }, + "enabled": true, + "parentIndex": 161, + "type": "Other", + "depth": 40, + "index": 162, + "ref": "e163" + }, + { + "parentIndex": 159, + "index": 163, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1762, + "height": 30 + }, + "depth": 39, + "value": "0%", + "ref": "e164" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1735, + "height": 3 + }, + "depth": 40, + "index": 164, + "parentIndex": 163, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e165" + }, + { + "depth": 36, + "parentIndex": 110, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -1713, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 165, + "ref": "e166" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -1713, + "height": 88 + }, + "index": 166, + "depth": 37, + "parentIndex": 165, + "ref": "e167" + }, + { + "depth": 38, + "index": 167, + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 166, + "rect": { + "x": 20, + "width": 362, + "y": -1713, + "height": 88 + }, + "ref": "e168" + }, + { + "enabled": true, + "parentIndex": 166, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "index": 168, + "type": "TextView", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "ref": "e169" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "x": 20, + "width": 362, + "y": -1713, + "height": 88 + }, + "hittable": false, + "depth": 39, + "parentIndex": 168, + "type": "TextView", + "enabled": true, + "index": 169, + "ref": "e170" + }, + { + "index": 170, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 168, + "hittable": false, + "value": "0%", + "enabled": true, + "type": "Other", + "rect": { + "x": 349, + "width": 30, + "y": -1713, + "height": 88 + }, + "ref": "e171" + }, + { + "depth": 40, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "x": 376, + "width": 3, + "y": -1752, + "height": 36 + }, + "parentIndex": 170, + "index": 171, + "ref": "e172" + }, + { + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -1658, + "height": 30 + }, + "parentIndex": 168, + "value": "0%", + "hittable": false, + "type": "Other", + "index": 172, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "ref": "e173" + }, + { + "type": "Other", + "parentIndex": 172, + "index": 173, + "hittable": false, + "depth": 40, + "enabled": true, + "rect": { + "x": -19, + "width": 36, + "y": -1631, + "height": 3 + }, + "ref": "e174" + }, + { + "rect": { + "x": 12, + "width": 378, + "y": -1597, + "height": 32 + }, + "parentIndex": 73, + "hittable": false, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 35, + "type": "Other", + "enabled": true, + "index": 174, + "ref": "e175" + }, + { + "enabled": true, + "depth": 36, + "parentIndex": 174, + "rect": { + "x": 7, + "width": 388, + "y": -1597, + "height": 32 + }, + "identifier": "tool-call-badge", + "hittable": false, + "index": 175, + "type": "Other", + "ref": "e176" + }, + { + "depth": 36, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": -1597, + "height": 32 + }, + "type": "Button", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 174, + "enabled": true, + "index": 176, + "ref": "e177" + }, + { + "rect": { + "x": 12, + "width": 378, + "y": -1565, + "height": 36 + }, + "parentIndex": 73, + "hittable": false, + "depth": 35, + "index": 177, + "type": "Other", + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "ref": "e178" + }, + { + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": -1565, + "height": 32 + }, + "parentIndex": 177, + "type": "Other", + "enabled": true, + "depth": 36, + "identifier": "tool-call-badge", + "index": 178, + "ref": "e179" + }, + { + "parentIndex": 177, + "rect": { + "x": 7, + "width": 388, + "y": -1565, + "height": 32 + }, + "type": "Button", + "enabled": true, + "hittable": false, + "index": 179, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 36, + "ref": "e180" + }, + { + "depth": 35, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 73, + "rect": { + "x": 12, + "width": 378, + "y": -1529, + "height": 570 + }, + "index": 180, + "ref": "e181" + }, + { + "index": 181, + "enabled": true, + "parentIndex": 180, + "hittable": false, + "identifier": "assistant-message", + "type": "Other", + "depth": 36, + "rect": { + "x": 20, + "width": 362, + "y": -1529, + "height": 566 + }, + "ref": "e182" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -1517, + "height": 242 + }, + "type": "Other", + "parentIndex": 180, + "index": 182, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "depth": 36, + "ref": "e183" + }, + { + "hittable": false, + "depth": 37, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "x": 20, + "width": 362, + "y": -1517, + "height": 242 + }, + "enabled": true, + "index": 183, + "parentIndex": 182, + "ref": "e184" + }, + { + "index": 184, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -1517, + "height": 242 + }, + "parentIndex": 183, + "enabled": true, + "hittable": false, + "depth": 38, + "ref": "e185" + }, + { + "hittable": false, + "depth": 38, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "type": "TextView", + "enabled": true, + "index": 185, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 183, + "ref": "e186" + }, + { + "index": 186, + "type": "TextView", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "hittable": false, + "parentIndex": 185, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": -1517, + "height": 242 + }, + "ref": "e187" + }, + { + "rect": { + "x": 349, + "width": 30, + "y": -1517, + "height": 242 + }, + "value": "0%", + "index": 187, + "depth": 39, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 185, + "ref": "e188" + }, + { + "hittable": false, + "parentIndex": 187, + "type": "Other", + "depth": 40, + "index": 188, + "rect": { + "x": 376, + "width": 3, + "y": -1556, + "height": 36 + }, + "enabled": true, + "ref": "e189" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -1308, + "height": 30 + }, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 185, + "index": 189, + "value": "0%", + "enabled": true, + "ref": "e190" + }, + { + "hittable": false, + "index": 190, + "depth": 40, + "enabled": true, + "type": "Other", + "rect": { + "x": -19, + "width": 36, + "y": -1281, + "height": 3 + }, + "parentIndex": 189, + "ref": "e191" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 20, + "width": 362, + "y": -1251, + "height": 264 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 180, + "depth": 36, + "index": 191, + "ref": "e192" + }, + { + "index": 192, + "type": "Other", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -1251, + "height": 264 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 37, + "parentIndex": 191, + "hittable": false, + "ref": "e193" + }, + { + "depth": 38, + "index": 193, + "parentIndex": 192, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -1251, + "height": 264 + }, + "enabled": true, + "ref": "e194" + }, + { + "enabled": true, + "type": "TextView", + "depth": 38, + "parentIndex": 192, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 194, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "ref": "e195" + }, + { + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "parentIndex": 194, + "enabled": true, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": -1251, + "height": 264 + }, + "depth": 39, + "index": 195, + "ref": "e196" + }, + { + "value": "0%", + "enabled": true, + "type": "Other", + "index": 196, + "parentIndex": 194, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "hittable": false, + "rect": { + "x": 349, + "width": 30, + "y": -1251, + "height": 264 + }, + "ref": "e197" + }, + { + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "y": -1290, + "height": 36 + }, + "depth": 40, + "index": 197, + "hittable": false, + "enabled": true, + "parentIndex": 196, + "ref": "e198" + }, + { + "index": 198, + "depth": 39, + "parentIndex": 194, + "enabled": true, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -1020, + "height": 30 + }, + "ref": "e199" + }, + { + "type": "Other", + "depth": 40, + "parentIndex": 198, + "enabled": true, + "index": 199, + "rect": { + "x": -19, + "width": 36, + "y": -993, + "height": 3 + }, + "hittable": false, + "ref": "e200" + }, + { + "parentIndex": 73, + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -959, + "height": 32 + }, + "hittable": false, + "label": "Thinking", + "depth": 35, + "type": "Other", + "index": 200, + "ref": "e201" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "index": 201, + "parentIndex": 200, + "rect": { + "x": 7, + "width": 388, + "y": -959, + "height": 32 + }, + "depth": 36, + "identifier": "tool-call-badge", + "ref": "e202" + }, + { + "hittable": false, + "index": 202, + "rect": { + "x": 7, + "width": 388, + "y": -959, + "height": 32 + }, + "label": "Thinking", + "parentIndex": 200, + "depth": 36, + "type": "Button", + "enabled": true, + "ref": "e203" + }, + { + "type": "Other", + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "y": -927, + "height": 32 + }, + "index": 203, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "enabled": true, + "ref": "e204" + }, + { + "index": 204, + "parentIndex": 203, + "identifier": "tool-call-badge", + "depth": 36, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": -927, + "height": 32 + }, + "type": "Other", + "enabled": true, + "ref": "e205" + }, + { + "rect": { + "x": 7, + "width": 388, + "y": -927, + "height": 32 + }, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "index": 205, + "parentIndex": 203, + "type": "Button", + "depth": 36, + "enabled": true, + "ref": "e206" + }, + { + "hittable": false, + "depth": 35, + "label": "Search, scrollToEnd", + "parentIndex": 73, + "rect": { + "x": 12, + "width": 378, + "y": -895, + "height": 36 + }, + "type": "Other", + "index": 206, + "enabled": true, + "ref": "e207" + }, + { + "enabled": true, + "depth": 36, + "hittable": false, + "parentIndex": 206, + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "width": 388, + "y": -895, + "height": 32 + }, + "index": 207, + "type": "Other", + "ref": "e208" + }, + { + "hittable": false, + "enabled": true, + "type": "Button", + "label": "Search, scrollToEnd", + "parentIndex": 206, + "index": 208, + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -895, + "height": 32 + }, + "ref": "e209" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -859, + "height": 646 + }, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "depth": 35, + "index": 209, + "ref": "e210" + }, + { + "identifier": "assistant-message", + "depth": 36, + "index": 210, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -859, + "height": 642 + }, + "parentIndex": 209, + "ref": "e211" + }, + { + "hittable": false, + "index": 211, + "depth": 36, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 209, + "rect": { + "x": 20, + "width": 362, + "y": -847, + "height": 132 + }, + "type": "Other", + "enabled": true, + "ref": "e212" + }, + { + "enabled": true, + "hittable": false, + "depth": 37, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 212, + "parentIndex": 211, + "rect": { + "x": 20, + "width": 362, + "y": -847, + "height": 132 + }, + "ref": "e213" + }, + { + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -847, + "height": 132 + }, + "depth": 38, + "hittable": false, + "enabled": true, + "index": 213, + "parentIndex": 212, + "ref": "e214" + }, + { + "depth": 38, + "index": 214, + "parentIndex": 212, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "type": "TextView", + "ref": "e215" + }, + { + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "index": 215, + "type": "TextView", + "parentIndex": 214, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": -847, + "height": 132 + }, + "ref": "e216" + }, + { + "hittable": false, + "enabled": true, + "value": "0%", + "type": "Other", + "depth": 39, + "parentIndex": 214, + "index": 216, + "rect": { + "x": 349, + "width": 30, + "y": -847, + "height": 132 + }, + "label": "Vertical scroll bar, 1 page", + "ref": "e217" + }, + { + "depth": 40, + "index": 217, + "enabled": true, + "rect": { + "x": 376, + "width": 3, + "y": -886, + "height": 36 + }, + "parentIndex": 216, + "hittable": false, + "type": "Other", + "ref": "e218" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -748, + "height": 30 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "parentIndex": 214, + "hittable": false, + "index": 218, + "depth": 39, + "ref": "e219" + }, + { + "rect": { + "x": -19, + "width": 36, + "y": -721, + "height": 3 + }, + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "index": 219, + "parentIndex": 218, + "ref": "e220" + }, + { + "label": "•", + "type": "StaticText", + "hittable": false, + "depth": 36, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -687, + "height": 22 + }, + "enabled": true, + "index": 220, + "parentIndex": 209, + "ref": "e221" + }, + { + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -687, + "height": 22 + }, + "index": 221, + "label": "•", + "parentIndex": 220, + "depth": 37, + "enabled": true, + "type": "StaticText", + "ref": "e222" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -687, + "height": 88 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "Other", + "parentIndex": 209, + "depth": 36, + "enabled": true, + "hittable": false, + "index": 222, + "ref": "e223" + }, + { + "hittable": false, + "index": 223, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -687, + "height": 88 + }, + "depth": 37, + "type": "Other", + "enabled": true, + "parentIndex": 222, + "ref": "e224" + }, + { + "hittable": false, + "depth": 38, + "parentIndex": 223, + "type": "Other", + "enabled": true, + "index": 224, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -687, + "height": 88 + }, + "ref": "e225" + }, + { + "index": 225, + "enabled": true, + "hittable": false, + "type": "TextView", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 223, + "depth": 38, + "ref": "e226" + }, + { + "depth": 39, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -687, + "height": 88 + }, + "parentIndex": 225, + "index": 226, + "enabled": true, + "hittable": false, + "ref": "e227" + }, + { + "enabled": true, + "type": "Other", + "depth": 39, + "index": 227, + "parentIndex": 225, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -687, + "height": 88 + }, + "hittable": false, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "ref": "e228" + }, + { + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -726, + "height": 36 + }, + "type": "Other", + "depth": 40, + "index": 228, + "enabled": true, + "hittable": false, + "parentIndex": 227, + "ref": "e229" + }, + { + "depth": 39, + "parentIndex": 225, + "enabled": true, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -632, + "height": 30 + }, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 229, + "ref": "e230" + }, + { + "depth": 40, + "type": "Other", + "parentIndex": 229, + "hittable": false, + "index": 230, + "enabled": true, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -605, + "height": 3 + }, + "ref": "e231" + }, + { + "enabled": true, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -595, + "height": 22 + }, + "depth": 36, + "parentIndex": 209, + "hittable": false, + "index": 231, + "type": "StaticText", + "label": "•", + "ref": "e232" + }, + { + "hittable": false, + "index": 232, + "depth": 37, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -595, + "height": 22 + }, + "type": "StaticText", + "label": "•", + "enabled": true, + "parentIndex": 231, + "ref": "e233" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -595, + "height": 88 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 233, + "depth": 36, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 209, + "ref": "e234" + }, + { + "type": "Other", + "parentIndex": 233, + "depth": 37, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -595, + "height": 88 + }, + "index": 234, + "ref": "e235" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -595, + "height": 88 + }, + "hittable": false, + "parentIndex": 234, + "index": 235, + "depth": 38, + "type": "Other", + "enabled": true, + "ref": "e236" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 236, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 234, + "depth": 38, + "type": "TextView", + "ref": "e237" + }, + { + "index": 237, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -595, + "height": 88 + }, + "hittable": false, + "parentIndex": 236, + "depth": 39, + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e238" + }, + { + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -595, + "height": 88 + }, + "value": "0%", + "hittable": false, + "enabled": true, + "index": 238, + "type": "Other", + "depth": 39, + "parentIndex": 236, + "label": "Vertical scroll bar, 1 page", + "ref": "e239" + }, + { + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -634, + "height": 36 + }, + "index": 239, + "type": "Other", + "enabled": true, + "depth": 40, + "parentIndex": 238, + "hittable": false, + "ref": "e240" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 236, + "depth": 39, + "type": "Other", + "value": "0%", + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -540, + "height": 30 + }, + "index": 240, + "ref": "e241" + }, + { + "depth": 40, + "index": 241, + "parentIndex": 240, + "hittable": false, + "type": "Other", + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -513, + "height": 3 + }, + "enabled": true, + "ref": "e242" + }, + { + "depth": 36, + "type": "StaticText", + "index": 242, + "label": "•", + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -503, + "height": 22 + }, + "parentIndex": 209, + "enabled": true, + "ref": "e243" + }, + { + "parentIndex": 242, + "index": 243, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -503, + "height": 22 + }, + "type": "StaticText", + "hittable": false, + "enabled": true, + "label": "•", + "depth": 37, + "ref": "e244" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -503, + "height": 88 + }, + "parentIndex": 209, + "enabled": true, + "index": 244, + "hittable": false, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 36, + "ref": "e245" + }, + { + "depth": 37, + "hittable": false, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 245, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -503, + "height": 88 + }, + "parentIndex": 244, + "ref": "e246" + }, + { + "parentIndex": 245, + "hittable": false, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -503, + "height": 88 + }, + "depth": 38, + "index": 246, + "type": "Other", + "ref": "e247" + }, + { + "index": 247, + "type": "TextView", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 38, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "parentIndex": 245, + "ref": "e248" + }, + { + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -503, + "height": 88 + }, + "depth": 39, + "enabled": true, + "index": 248, + "parentIndex": 247, + "hittable": false, + "ref": "e249" + }, + { + "hittable": false, + "parentIndex": 247, + "index": 249, + "enabled": true, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -503, + "height": 88 + }, + "ref": "e250" + }, + { + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -542, + "height": 36 + }, + "type": "Other", + "enabled": true, + "parentIndex": 249, + "index": 250, + "depth": 40, + "hittable": false, + "ref": "e251" + }, + { + "value": "0%", + "enabled": true, + "index": 251, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -448, + "height": 30 + }, + "hittable": false, + "parentIndex": 247, + "ref": "e252" + }, + { + "index": 252, + "enabled": true, + "parentIndex": 251, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -421, + "height": 3 + }, + "depth": 40, + "hittable": false, + "type": "Other", + "ref": "e253" + }, + { + "parentIndex": 209, + "label": "•", + "depth": 36, + "index": 253, + "type": "StaticText", + "enabled": true, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -411, + "height": 22 + }, + "ref": "e254" + }, + { + "label": "•", + "type": "StaticText", + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -411, + "height": 22 + }, + "hittable": false, + "parentIndex": 253, + "index": 254, + "enabled": true, + "depth": 37, + "ref": "e255" + }, + { + "index": 255, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -411, + "height": 66 + }, + "hittable": false, + "parentIndex": 209, + "enabled": true, + "type": "Other", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e256" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -411, + "height": 66 + }, + "type": "Other", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 37, + "hittable": false, + "enabled": true, + "index": 256, + "parentIndex": 255, + "ref": "e257" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -411, + "height": 66 + }, + "enabled": true, + "depth": 38, + "index": 257, + "parentIndex": 256, + "ref": "e258" + }, + { + "enabled": true, + "parentIndex": 256, + "type": "TextView", + "depth": 38, + "hittable": false, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 258, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e259" + }, + { + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 39, + "hittable": false, + "parentIndex": 258, + "type": "TextView", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -411, + "height": 66 + }, + "index": 259, + "ref": "e260" + }, + { + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -411, + "height": 66 + }, + "index": 260, + "value": "0%", + "depth": 39, + "parentIndex": 258, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "ref": "e261" + }, + { + "depth": 40, + "hittable": false, + "enabled": true, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -450, + "height": 36 + }, + "index": 261, + "type": "Other", + "parentIndex": 260, + "ref": "e262" + }, + { + "parentIndex": 258, + "enabled": true, + "hittable": false, + "depth": 39, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -378, + "height": 30 + }, + "value": "0%", + "index": 262, + "ref": "e263" + }, + { + "depth": 40, + "parentIndex": 262, + "enabled": true, + "index": 263, + "type": "Other", + "hittable": false, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -351, + "height": 3 + }, + "ref": "e264" + }, + { + "parentIndex": 209, + "hittable": false, + "index": 264, + "rect": { + "x": 20, + "width": 362, + "y": -329, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "depth": 36, + "type": "Other", + "ref": "e265" + }, + { + "index": 265, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "x": 20, + "width": 362, + "y": -329, + "height": 88 + }, + "parentIndex": 264, + "enabled": true, + "type": "Other", + "depth": 37, + "ref": "e266" + }, + { + "index": 266, + "type": "Other", + "hittable": false, + "parentIndex": 265, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": -329, + "height": 88 + }, + "enabled": true, + "ref": "e267" + }, + { + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "parentIndex": 265, + "depth": 38, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 267, + "type": "TextView", + "ref": "e268" + }, + { + "index": 268, + "rect": { + "x": 20, + "width": 362, + "y": -329, + "height": 88 + }, + "type": "TextView", + "parentIndex": 267, + "hittable": false, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 39, + "ref": "e269" + }, + { + "value": "0%", + "index": 269, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 267, + "type": "Other", + "depth": 39, + "hittable": false, + "rect": { + "x": 349, + "width": 30, + "y": -329, + "height": 88 + }, + "enabled": true, + "ref": "e270" + }, + { + "depth": 40, + "type": "Other", + "index": 270, + "hittable": false, + "rect": { + "x": 376, + "width": 3, + "y": -368, + "height": 36 + }, + "enabled": true, + "parentIndex": 269, + "ref": "e271" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -274, + "height": 30 + }, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "depth": 39, + "index": 271, + "type": "Other", + "parentIndex": 267, + "ref": "e272" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": -19, + "width": 36, + "y": -247, + "height": 3 + }, + "depth": 40, + "parentIndex": 271, + "type": "Other", + "index": 272, + "ref": "e273" + }, + { + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "y": -213, + "height": 32 + }, + "depth": 35, + "parentIndex": 73, + "enabled": true, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "index": 273, + "ref": "e274" + }, + { + "parentIndex": 273, + "hittable": false, + "identifier": "tool-call-badge", + "enabled": true, + "type": "Other", + "index": 274, + "rect": { + "x": 7, + "width": 388, + "y": -213, + "height": 32 + }, + "depth": 36, + "ref": "e275" + }, + { + "hittable": false, + "type": "Button", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 36, + "parentIndex": 273, + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "y": -213, + "height": 32 + }, + "index": 275, + "ref": "e276" + }, + { + "rect": { + "x": 12, + "width": 378, + "y": -181, + "height": 36 + }, + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "index": 276, + "type": "Other", + "parentIndex": 73, + "enabled": true, + "ref": "e277" + }, + { + "parentIndex": 276, + "rect": { + "x": 7, + "width": 388, + "y": -181, + "height": 32 + }, + "type": "Other", + "depth": 36, + "index": 277, + "enabled": true, + "hittable": false, + "identifier": "tool-call-badge", + "ref": "e278" + }, + { + "type": "Button", + "parentIndex": 276, + "hittable": false, + "index": 278, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "enabled": true, + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -181, + "height": 32 + }, + "ref": "e279" + }, + { + "enabled": true, + "parentIndex": 73, + "type": "Other", + "hittable": false, + "index": 279, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "y": -145, + "height": 512 + }, + "ref": "e280" + }, + { + "identifier": "assistant-message", + "hittable": false, + "index": 280, + "depth": 36, + "enabled": true, + "parentIndex": 279, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -145, + "height": 512 + }, + "ref": "e281" + }, + { + "index": 281, + "rect": { + "x": 20, + "width": 362, + "y": -133, + "height": 242 + }, + "depth": 36, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "enabled": true, + "parentIndex": 279, + "hittable": false, + "ref": "e282" + }, + { + "index": 282, + "type": "Other", + "parentIndex": 281, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -133, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "depth": 37, + "ref": "e283" + }, + { + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -133, + "height": 242 + }, + "type": "Other", + "index": 283, + "depth": 38, + "hittable": false, + "parentIndex": 282, + "ref": "e284" + }, + { + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 284, + "type": "TextView", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 0, + "height": 109 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 38, + "parentIndex": 282, + "hittable": false, + "ref": "e285" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "enabled": true, + "index": 285, + "hittable": false, + "type": "TextView", + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": -133, + "height": 242 + }, + "parentIndex": 284, + "ref": "e286" + }, + { + "parentIndex": 284, + "rect": { + "x": 349, + "width": 30, + "y": -133, + "height": 242 + }, + "value": "0%", + "index": 286, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "ref": "e287" + }, + { + "hittable": false, + "depth": 40, + "rect": { + "x": 376, + "width": 3, + "y": -172, + "height": 36 + }, + "type": "Other", + "parentIndex": 286, + "enabled": true, + "index": 287, + "ref": "e288" + }, + { + "index": 288, + "depth": 39, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": 76, + "height": 30 + }, + "enabled": true, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 284, + "hittable": false, + "ref": "e289" + }, + { + "rect": { + "x": -19, + "width": 36, + "y": 103, + "height": 3 + }, + "hittable": false, + "index": 289, + "parentIndex": 288, + "type": "Other", + "enabled": true, + "depth": 40, + "ref": "e290" + }, + { + "depth": 36, + "rect": { + "x": 20, + "width": 362, + "y": 133, + "height": 176 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "parentIndex": 279, + "enabled": true, + "index": 290, + "type": "Other", + "ref": "e291" + }, + { + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "rect": { + "x": 20, + "width": 362, + "y": 133, + "height": 176 + }, + "index": 291, + "enabled": true, + "parentIndex": 290, + "hittable": false, + "depth": 37, + "ref": "e292" + }, + { + "hittable": false, + "depth": 38, + "parentIndex": 291, + "type": "Other", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 133, + "height": 176 + }, + "index": 292, + "ref": "e293" + }, + { + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "index": 293, + "rect": { + "x": 20, + "width": 362, + "y": 133, + "height": 176 + }, + "hittable": false, + "depth": 38, + "parentIndex": 291, + "type": "TextView", + "ref": "e294" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "index": 294, + "parentIndex": 293, + "hittable": false, + "depth": 39, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": 133, + "height": 176 + }, + "enabled": true, + "ref": "e295" + }, + { + "parentIndex": 293, + "enabled": true, + "rect": { + "x": 349, + "width": 30, + "y": 133, + "height": 176 + }, + "index": 295, + "hittable": false, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "value": "0%", + "ref": "e296" + }, + { + "parentIndex": 295, + "rect": { + "x": 376, + "width": 3, + "y": 94, + "height": 36 + }, + "depth": 40, + "type": "Other", + "hittable": false, + "index": 296, + "enabled": true, + "ref": "e297" + }, + { + "value": "0%", + "hittable": false, + "parentIndex": 293, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "type": "Other", + "index": 297, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": 276, + "height": 30 + }, + "ref": "e298" + }, + { + "depth": 40, + "enabled": true, + "type": "Other", + "parentIndex": 297, + "rect": { + "x": -19, + "width": 36, + "y": 303, + "height": 3 + }, + "index": 298, + "hittable": false, + "ref": "e299" + }, + { + "depth": 36, + "index": 299, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 333, + "height": 22 + }, + "hittable": false, + "type": "Other", + "parentIndex": 279, + "label": "(end of synthetic stream)", + "ref": "e300" + }, + { + "enabled": true, + "parentIndex": 299, + "rect": { + "x": 20, + "width": 362, + "y": 333, + "height": 22 + }, + "hittable": false, + "label": "(end of synthetic stream)", + "index": 300, + "type": "Other", + "depth": 37, + "ref": "e301" + }, + { + "parentIndex": 300, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 333, + "height": 22 + }, + "depth": 38, + "hittable": false, + "index": 301, + "type": "Other", + "ref": "e302" + }, + { + "parentIndex": 300, + "type": "TextView", + "index": 302, + "label": "(end of synthetic stream)", + "value": "(end of synthetic stream)", + "hittable": false, + "enabled": true, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 333, + "height": 22 + }, + "ref": "e303" + }, + { + "index": 303, + "depth": 39, + "hittable": false, + "parentIndex": 302, + "enabled": true, + "rect": { + "x": 20, + "width": 183.234375, + "y": 333, + "height": 22 + }, + "type": "TextView", + "label": "(end of synthetic stream)", + "ref": "e304" + }, + { + "hittable": false, + "depth": 39, + "enabled": true, + "parentIndex": 302, + "index": 304, + "type": "Other", + "rect": { + "x": 349, + "width": 30, + "y": 333, + "height": 22 + }, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "ref": "e305" + }, + { + "rect": { + "x": 376, + "width": 3, + "y": 294, + "height": 36 + }, + "index": 305, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 40, + "parentIndex": 304, + "ref": "e306" + }, + { + "parentIndex": 302, + "hittable": false, + "depth": 39, + "index": 306, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 341, + "height": 11 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e307" + }, + { + "index": 307, + "rect": { + "x": -19, + "width": 36, + "y": 349, + "height": 3 + }, + "parentIndex": 306, + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "ref": "e308" + }, + { + "type": "Other", + "enabled": true, + "label": "Copy turn", + "rect": { + "x": 12, + "width": 378, + "y": 367, + "height": 67 + }, + "depth": 35, + "hittable": false, + "parentIndex": 73, + "index": 308, + "ref": "e309" + }, + { + "depth": 36, + "index": 309, + "parentIndex": 308, + "hittable": false, + "rect": { + "x": 16, + "width": 22, + "y": 380, + "height": 22 + }, + "type": "Button", + "label": "Copy turn", + "enabled": true, + "ref": "e310" + }, + { + "hittable": false, + "label": "Fork chat from here", + "enabled": true, + "rect": { + "x": 46, + "width": 22, + "y": 380, + "height": 22 + }, + "parentIndex": 308, + "index": 310, + "depth": 36, + "type": "Other", + "ref": "e311" + }, + { + "rect": { + "x": 46, + "width": 22, + "y": 380, + "height": 22 + }, + "index": 311, + "type": "Button", + "label": "Fork chat from here", + "depth": 37, + "enabled": true, + "identifier": "assistant-fork-menu-trigger", + "hittable": false, + "parentIndex": 310, + "ref": "e312" + }, + { + "type": "Button", + "hittable": false, + "parentIndex": 308, + "rect": { + "x": 76, + "width": 85.33332824707031, + "y": 383.3333332538605, + "height": 15.666671752929688 + }, + "enabled": true, + "depth": 36, + "index": 312, + "label": "Worked for 9s, ended 8:44 PM", + "ref": "e313" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 164, + "height": 30 + }, + "parentIndex": 71, + "depth": 33, + "enabled": true, + "type": "Other", + "index": 313, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "ref": "e314" + }, + { + "rect": { + "x": 3, + "width": 393, + "y": 164, + "height": 3 + }, + "enabled": true, + "hittable": false, + "depth": 34, + "parentIndex": 313, + "type": "Other", + "index": 314, + "ref": "e315" + }, + { + "parentIndex": 71, + "enabled": true, + "value": "0%", + "rect": { + "x": 369, + "width": 30, + "y": 161, + "height": 273 + }, + "hittable": false, + "label": "Vertical scroll bar, 13 pages", + "index": 315, + "type": "Other", + "depth": 33, + "ref": "e316" + }, + { + "enabled": true, + "depth": 34, + "hittable": false, + "type": "Other", + "parentIndex": 315, + "rect": { + "x": 396, + "width": 3, + "y": 432, + "height": 36 + }, + "index": 316, + "ref": "e317" + }, + { + "rect": { + "x": 369, + "width": 30, + "y": 161, + "height": 273 + }, + "type": "Other", + "hittable": false, + "depth": 33, + "label": "Vertical scroll bar, 13 pages", + "parentIndex": 71, + "index": 317, + "enabled": true, + "value": "0%", + "ref": "e318" + }, + { + "enabled": true, + "depth": 34, + "type": "Other", + "rect": { + "x": 396, + "width": 3, + "y": 432, + "height": 36 + }, + "index": 318, + "parentIndex": 317, + "hittable": false, + "ref": "e319" + }, + { + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 0, + "width": 402, + "y": 164, + "height": 30 + }, + "value": "0%", + "enabled": true, + "hittable": false, + "index": 319, + "ref": "e320" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 3, + "width": 393, + "y": 164, + "height": 3 + }, + "depth": 34, + "parentIndex": 319, + "index": 320, + "type": "Other", + "ref": "e321" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 434, + "height": 138 + }, + "enabled": true, + "hittable": false, + "index": 321, + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "identifier": "composer-viewport-content", + "depth": 29, + "parentIndex": 65, + "ref": "e322" + }, + { + "rect": { + "x": 16, + "width": 370, + "y": 434, + "height": 88 + }, + "parentIndex": 321, + "hittable": false, + "enabled": true, + "depth": 30, + "identifier": "message-input-root", + "type": "Other", + "index": 322, + "ref": "e323" + }, + { + "parentIndex": 321, + "depth": 30, + "rect": { + "x": 16, + "width": 370, + "y": 434, + "height": 88 + }, + "index": 323, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e324" + }, + { + "parentIndex": 321, + "hittable": false, + "index": 324, + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "y": 443, + "height": 30 + }, + "depth": 30, + "ref": "e325" + }, + { + "label": "Message agent... Message, @files, /commands", + "depth": 31, + "index": 325, + "hittable": false, + "rect": { + "x": 29, + "width": 344, + "y": 443, + "height": 30 + }, + "type": "TextView", + "enabled": true, + "parentIndex": 324, + "ref": "e326" + }, + { + "rect": { + "x": 340, + "width": 30, + "y": 443, + "height": 30 + }, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "index": 326, + "depth": 32, + "parentIndex": 325, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e327" + }, + { + "hittable": false, + "index": 327, + "type": "Other", + "parentIndex": 326, + "depth": 33, + "enabled": true, + "rect": { + "x": 367, + "width": 3, + "y": 464.3332926432292, + "height": 38.000020345052064 + }, + "ref": "e328" + }, + { + "parentIndex": 325, + "value": "0%", + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "y": 455, + "height": 15 + }, + "type": "Other", + "depth": 32, + "index": 328, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "ref": "e329" + }, + { + "hittable": false, + "parentIndex": 328, + "enabled": true, + "rect": { + "x": 32, + "width": 338, + "y": 467, + "height": 3 + }, + "type": "Other", + "depth": 33, + "index": 329, + "ref": "e330" + }, + { + "enabled": true, + "identifier": "message-input-attach-button", + "index": 330, + "type": "Button", + "depth": 30, + "hittable": false, + "label": "Add attachment", + "parentIndex": 321, + "rect": { + "x": 23, + "width": 28, + "y": 485, + "height": 28 + }, + "ref": "e331" + }, + { + "hittable": false, + "depth": 30, + "label": "Select model (Ten second stream)", + "rect": { + "x": 51, + "width": 232, + "y": 485, + "height": 28 + }, + "parentIndex": 321, + "index": 331, + "enabled": true, + "type": "Other", + "ref": "e332" + }, + { + "index": 332, + "identifier": "combined-model-selector", + "label": "Select model (Ten second stream)", + "enabled": true, + "hittable": false, + "depth": 31, + "parentIndex": 331, + "rect": { + "x": 51, + "width": 202, + "y": 485, + "height": 28 + }, + "type": "Button", + "ref": "e333" + }, + { + "depth": 30, + "enabled": true, + "type": "Image", + "label": "Context window 3% used", + "hittable": false, + "index": 333, + "identifier": "context-window-meter", + "parentIndex": 321, + "rect": { + "x": 283, + "width": 28, + "y": 485, + "height": 28 + }, + "ref": "e334" + }, + { + "index": 334, + "depth": 30, + "label": "Start dictation", + "parentIndex": 321, + "hittable": false, + "enabled": true, + "rect": { + "x": 315, + "width": 28, + "y": 485, + "height": 28 + }, + "type": "Button", + "ref": "e335" + }, + { + "enabled": true, + "hittable": false, + "index": 335, + "depth": 30, + "type": "Button", + "rect": { + "x": 351, + "width": 28, + "y": 485, + "height": 28 + }, + "parentIndex": 321, + "label": "Enable Voice mode", + "ref": "e336" + }, + { + "index": 336, + "type": "Other", + "hittable": false, + "depth": 11, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 16, + "ref": "e337" + }, + { + "parentIndex": 10, + "index": 337, + "depth": 7, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "ref": "e338" + }, + { + "hittable": false, + "index": 338, + "depth": 8, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 337, + "ref": "e339" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 338, + "depth": 9, + "hittable": false, + "index": 339, + "type": "Other", + "ref": "e340" + }, + { + "hittable": false, + "depth": 1, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Window", + "parentIndex": 0, + "enabled": true, + "index": 340, + "ref": "e341" + }, + { + "parentIndex": 340, + "enabled": true, + "index": 341, + "hittable": false, + "depth": 2, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e342" + }, + { + "type": "Other", + "index": 342, + "parentIndex": 341, + "depth": 3, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "ref": "e343" + }, + { + "hittable": false, + "enabled": true, + "index": 343, + "type": "Other", + "parentIndex": 341, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 336 + }, + "depth": 3, + "ref": "e344" + }, + { + "index": 344, + "enabled": true, + "parentIndex": 343, + "type": "Other", + "depth": 4, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 278 + }, + "ref": "e345" + }, + { + "parentIndex": 0, + "type": "Window", + "depth": 1, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": true, + "label": "Emoji", + "index": 345, + "enabled": true, + "ref": "e346" + }, + { + "depth": 2, + "index": 346, + "enabled": true, + "parentIndex": 345, + "type": "Other", + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "label": "Emoji", + "ref": "e347" + }, + { + "enabled": true, + "depth": 3, + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 336 + }, + "index": 347, + "type": "Other", + "label": "Emoji", + "parentIndex": 346, + "ref": "e348" + }, + { + "index": 348, + "hittable": false, + "parentIndex": 347, + "depth": 4, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "enabled": true, + "type": "Other", + "ref": "e349" + }, + { + "parentIndex": 348, + "depth": 5, + "index": 349, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "hittable": false, + "type": "Other", + "ref": "e350" + }, + { + "index": 350, + "hittable": false, + "type": "Other", + "parentIndex": 349, + "depth": 6, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "ref": "e351" + }, + { + "hittable": true, + "depth": 4, + "parentIndex": 347, + "index": 351, + "label": "Typing Predictions", + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "identifier": "SystemInputAssistantView", + "enabled": true, + "ref": "e352" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "enabled": true, + "depth": 5, + "index": 352, + "type": "Other", + "parentIndex": 351, + "label": "Typing Predictions", + "hittable": true, + "ref": "e353" + }, + { + "enabled": true, + "parentIndex": 352, + "label": "Typing Predictions", + "index": 353, + "identifier": "CenterPageView", + "type": "Other", + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "depth": 6, + "ref": "e354" + }, + { + "depth": 7, + "enabled": true, + "parentIndex": 353, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": -62, + "height": 1245 + }, + "index": 354, + "ref": "e355" + }, + { + "type": "ScrollView", + "parentIndex": 354, + "hittable": false, + "index": 355, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "enabled": true, + "depth": 8, + "ref": "e356" + }, + { + "enabled": true, + "type": "Other", + "depth": 7, + "hittable": true, + "label": "Typing Predictions", + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "index": 356, + "parentIndex": 353, + "ref": "e357" + }, + { + "index": 357, + "hittable": true, + "type": "Other", + "depth": 8, + "label": "Typing Predictions", + "parentIndex": 356, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "ref": "e358" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "type": "Other", + "hittable": true, + "depth": 9, + "parentIndex": 357, + "enabled": true, + "index": 358, + "label": "I", + "ref": "e359" + }, + { + "hittable": true, + "type": "Other", + "label": "I", + "index": 359, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "depth": 10, + "enabled": true, + "parentIndex": 358, + "ref": "e360" + }, + { + "index": 360, + "label": "I", + "type": "Other", + "parentIndex": 359, + "enabled": true, + "rect": { + "x": 0, + "width": 134, + "y": 538, + "height": 45 + }, + "depth": 11, + "hittable": true, + "ref": "e361" + }, + { + "enabled": true, + "hittable": true, + "label": "The", + "rect": { + "x": 134, + "width": 134, + "y": 538, + "height": 45 + }, + "index": 361, + "depth": 11, + "parentIndex": 359, + "type": "Other", + "ref": "e362" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 359, + "hittable": true, + "rect": { + "x": 268, + "width": 134, + "y": 538, + "height": 45 + }, + "index": 362, + "label": "I’m", + "depth": 11, + "ref": "e363" + }, + { + "parentIndex": 347, + "hittable": false, + "index": 363, + "depth": 4, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "ref": "e364" + }, + { + "parentIndex": 363, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 5, + "index": 364, + "ref": "e365" + }, + { + "parentIndex": 364, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "index": 365, + "enabled": true, + "depth": 6, + "type": "Other", + "ref": "e366" + }, + { + "depth": 7, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "hittable": false, + "type": "Other", + "parentIndex": 365, + "index": 366, + "enabled": true, + "ref": "e367" + }, + { + "parentIndex": 347, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "type": "Other", + "enabled": true, + "depth": 4, + "index": 367, + "label": "Q", + "ref": "e368" + }, + { + "index": 368, + "type": "Keyboard", + "hittable": false, + "label": "Q", + "depth": 5, + "parentIndex": 367, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "enabled": true, + "ref": "e369" + }, + { + "index": 369, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "label": "Q", + "type": "Other", + "parentIndex": 368, + "depth": 6, + "enabled": true, + "hittable": false, + "ref": "e370" + }, + { + "hittable": false, + "parentIndex": 369, + "identifier": "UIKeyboardLayoutStar Preview", + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "depth": 7, + "index": 370, + "label": "Q", + "ref": "e371" + }, + { + "index": 371, + "depth": 8, + "parentIndex": 370, + "type": "Key", + "rect": { + "x": 0, + "width": 40.333333333333336, + "y": 590, + "height": 46 + }, + "label": "Q", + "enabled": true, + "hittable": false, + "ref": "e372" + }, + { + "depth": 8, + "parentIndex": 370, + "label": "W", + "index": 372, + "type": "Key", + "rect": { + "x": 40.333333333333336, + "width": 40.00000000000001, + "y": 590, + "height": 46 + }, + "hittable": false, + "enabled": true, + "ref": "e373" + }, + { + "type": "Key", + "index": 373, + "label": "E", + "hittable": false, + "enabled": true, + "parentIndex": 370, + "rect": { + "x": 80.33333333333334, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "depth": 8, + "ref": "e374" + }, + { + "rect": { + "x": 120.66666666666669, + "width": 40, + "y": 590, + "height": 46 + }, + "index": 374, + "type": "Key", + "hittable": false, + "label": "R", + "parentIndex": 370, + "enabled": true, + "depth": 8, + "ref": "e375" + }, + { + "type": "Key", + "hittable": false, + "index": 375, + "label": "T", + "enabled": true, + "rect": { + "x": 160.66666666666669, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "depth": 8, + "parentIndex": 370, + "ref": "e376" + }, + { + "enabled": true, + "hittable": false, + "index": 376, + "type": "Key", + "rect": { + "x": 201.00000000000003, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "label": "Y", + "depth": 8, + "parentIndex": 370, + "ref": "e377" + }, + { + "label": "U", + "depth": 8, + "rect": { + "x": 241.33333333333337, + "width": 40, + "y": 590, + "height": 46 + }, + "type": "Key", + "enabled": true, + "index": 377, + "hittable": false, + "parentIndex": 370, + "ref": "e378" + }, + { + "parentIndex": 370, + "depth": 8, + "label": "I", + "enabled": true, + "rect": { + "x": 281.33333333333337, + "width": 40.333333333333314, + "y": 590, + "height": 46 + }, + "index": 378, + "type": "Key", + "hittable": false, + "ref": "e379" + }, + { + "index": 379, + "enabled": true, + "type": "Key", + "label": "O", + "hittable": false, + "parentIndex": 370, + "rect": { + "x": 321.6666666666667, + "width": 40, + "y": 590, + "height": 46 + }, + "depth": 8, + "ref": "e380" + }, + { + "label": "P", + "depth": 8, + "parentIndex": 370, + "type": "Key", + "hittable": false, + "rect": { + "x": 361.6666666666667, + "width": 40.333333333333314, + "y": 590, + "height": 46 + }, + "index": 380, + "enabled": true, + "ref": "e381" + }, + { + "label": "A", + "rect": { + "x": 19.666666666666668, + "width": 40.33333333333333, + "y": 644, + "height": 46 + }, + "index": 381, + "depth": 8, + "type": "Key", + "parentIndex": 370, + "enabled": true, + "hittable": false, + "ref": "e382" + }, + { + "hittable": false, + "enabled": true, + "type": "Key", + "depth": 8, + "index": 382, + "rect": { + "x": 60, + "width": 40.33333333333334, + "y": 644, + "height": 46 + }, + "parentIndex": 370, + "label": "S", + "ref": "e383" + }, + { + "hittable": false, + "depth": 8, + "parentIndex": 370, + "type": "Key", + "enabled": true, + "index": 383, + "label": "D", + "rect": { + "x": 100.33333333333334, + "width": 40, + "y": 644, + "height": 46 + }, + "ref": "e384" + }, + { + "enabled": true, + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "y": 644, + "height": 46 + }, + "depth": 8, + "type": "Key", + "label": "F", + "index": 384, + "parentIndex": 370, + "hittable": false, + "ref": "e385" + }, + { + "rect": { + "x": 181.2026666666667, + "width": 40, + "y": 644, + "height": 46 + }, + "label": "G", + "enabled": true, + "hittable": false, + "parentIndex": 370, + "depth": 8, + "index": 385, + "type": "Key", + "ref": "e386" + }, + { + "parentIndex": 370, + "enabled": true, + "depth": 8, + "hittable": false, + "index": 386, + "rect": { + "x": 221.2026666666667, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "label": "H", + "type": "Key", + "ref": "e387" + }, + { + "rect": { + "x": 261.536, + "width": 40, + "y": 644, + "height": 46 + }, + "index": 387, + "type": "Key", + "parentIndex": 370, + "depth": 8, + "enabled": true, + "label": "J", + "hittable": false, + "ref": "e388" + }, + { + "depth": 8, + "parentIndex": 370, + "rect": { + "x": 301.536, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "enabled": true, + "hittable": false, + "label": "K", + "type": "Key", + "index": 388, + "ref": "e389" + }, + { + "index": 389, + "hittable": false, + "parentIndex": 370, + "rect": { + "x": 341.8693333333333, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "enabled": true, + "type": "Key", + "depth": 8, + "label": "L", + "ref": "e390" + }, + { + "type": "Button", + "depth": 8, + "hittable": false, + "identifier": "shift", + "parentIndex": 370, + "rect": { + "x": 0, + "width": 51.333333333333336, + "y": 698, + "height": 46 + }, + "label": "shift", + "enabled": true, + "selected": true, + "index": 390, + "ref": "e391" + }, + { + "label": "Z", + "enabled": true, + "depth": 8, + "index": 391, + "hittable": false, + "type": "Key", + "rect": { + "x": 60, + "width": 40.33333333333334, + "y": 698, + "height": 46 + }, + "parentIndex": 370, + "ref": "e392" + }, + { + "index": 392, + "hittable": false, + "label": "X", + "depth": 8, + "enabled": true, + "rect": { + "x": 100.33333333333334, + "width": 40, + "y": 698, + "height": 46 + }, + "parentIndex": 370, + "type": "Key", + "ref": "e393" + }, + { + "parentIndex": 370, + "depth": 8, + "type": "Key", + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "y": 698, + "height": 46 + }, + "label": "C", + "hittable": false, + "index": 393, + "enabled": true, + "ref": "e394" + }, + { + "hittable": false, + "rect": { + "x": 181.2026666666667, + "width": 40, + "y": 698, + "height": 46 + }, + "enabled": true, + "parentIndex": 370, + "type": "Key", + "depth": 8, + "label": "V", + "index": 394, + "ref": "e395" + }, + { + "hittable": false, + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "enabled": true, + "parentIndex": 370, + "type": "Key", + "depth": 8, + "label": "B", + "index": 395, + "ref": "e396" + }, + { + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 261.536 + }, + "type": "Key", + "label": "N", + "parentIndex": 370, + "enabled": true, + "hittable": false, + "index": 396, + "depth": 8, + "ref": "e397" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "type": "Key", + "index": 397, + "label": "M", + "parentIndex": 370, + "ref": "e398" + }, + { + "type": "Key", + "identifier": "delete", + "hittable": false, + "label": "delete", + "rect": { + "y": 698, + "width": 51.333333333333314, + "height": 46, + "x": 350.42133333333334 + }, + "index": 398, + "enabled": true, + "depth": 8, + "parentIndex": 370, + "ref": "e399" + }, + { + "parentIndex": 370, + "enabled": true, + "type": "Key", + "depth": 8, + "identifier": "more", + "label": "numbers", + "rect": { + "y": 752, + "width": 101, + "height": 46, + "x": 0 + }, + "hittable": false, + "index": 399, + "ref": "e400" + }, + { + "parentIndex": 370, + "enabled": true, + "type": "Key", + "depth": 8, + "identifier": "space", + "label": "space", + "rect": { + "y": 752, + "width": 201.33333333333334, + "height": 46, + "x": 100.33333333333334 + }, + "hittable": false, + "index": 400, + "ref": "e401" + }, + { + "index": 401, + "identifier": "Return", + "type": "Button", + "hittable": false, + "depth": 8, + "parentIndex": 370, + "label": "return", + "enabled": true, + "rect": { + "y": 752, + "width": 100.33333333333331, + "height": 46, + "x": 301.6666666666667 + }, + "ref": "e402" + }, + { + "hittable": true, + "index": 402, + "depth": 4, + "label": "Emoji", + "enabled": true, + "parentIndex": 347, + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "type": "Other", + "ref": "e403" + }, + { + "enabled": true, + "parentIndex": 402, + "label": "Emoji", + "index": 403, + "hittable": true, + "rect": { + "y": 805.6989567998571, + "width": 68.0852958475086, + "height": 68.73516393505099, + "x": 8.47726568115926 + }, + "type": "Button", + "depth": 5, + "ref": "e404" + }, + { + "type": "StaticText", + "enabled": true, + "index": 404, + "hittable": false, + "rect": { + "y": 805.6989567998571, + "width": 0, + "height": 0, + "x": 8.47726568115926 + }, + "parentIndex": 403, + "depth": 6, + "ref": "e405" + }, + { + "identifier": "dictation", + "hittable": false, + "type": "Button", + "parentIndex": 402, + "enabled": true, + "label": "Dictate", + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "depth": 5, + "index": 405, + "ref": "e406" + }, + { + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "parentIndex": 405, + "depth": 6, + "index": 406, + "hittable": false, + "enabled": true, + "type": "StaticText", + "ref": "e407" + }, + { + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "parentIndex": 402, + "index": 407, + "type": "Button", + "depth": 5, + "hittable": true, + "enabled": true, + "identifier": "dictation", + "label": "Dictate", + "ref": "e408" + }, + { + "depth": 6, + "index": 408, + "enabled": true, + "hittable": false, + "parentIndex": 407, + "type": "StaticText", + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "ref": "e409" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 409, + "totalNodeCount": 409, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 33, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 33 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 33 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776098 + } +} diff --git a/scroll-regression/ios/chat-clearing.json b/scroll-regression/ios/chat-clearing.json new file mode 100644 index 0000000000..503c5525a1 --- /dev/null +++ b/scroll-regression/ios/chat-clearing.json @@ -0,0 +1,6234 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "enabled": true, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Application", + "label": "Paseo Debug", + "depth": 0, + "index": 0, + "hittable": true, + "ref": "e1" + }, + { + "index": 1, + "parentIndex": 0, + "depth": 1, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Window", + "ref": "e2" + }, + { + "depth": 2, + "index": 2, + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "enabled": true, + "parentIndex": 1, + "type": "Other", + "ref": "e3" + }, + { + "depth": 3, + "enabled": true, + "parentIndex": 2, + "hittable": false, + "type": "Other", + "index": 3, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e4" + }, + { + "index": 4, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 4, + "parentIndex": 3, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e5" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 0, + "type": "Window", + "index": 5, + "depth": 1, + "enabled": true, + "hittable": false, + "ref": "e6" + }, + { + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "parentIndex": 5, + "depth": 2, + "type": "Other", + "hittable": false, + "index": 6, + "enabled": true, + "ref": "e7" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 6, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "depth": 3, + "type": "Other", + "index": 7, + "ref": "e8" + }, + { + "parentIndex": 7, + "depth": 4, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 8, + "enabled": true, + "ref": "e9" + }, + { + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "index": 9, + "depth": 5, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 8, + "ref": "e10" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "hittable": false, + "index": 10, + "enabled": true, + "type": "Other", + "depth": 6, + "parentIndex": 9, + "ref": "e11" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "enabled": true, + "parentIndex": 10, + "index": 11, + "hittable": false, + "depth": 7, + "ref": "e12" + }, + { + "type": "Other", + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "index": 12, + "depth": 8, + "parentIndex": 11, + "enabled": true, + "ref": "e13" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "depth": 9, + "index": 13, + "hittable": false, + "parentIndex": 12, + "type": "Other", + "ref": "e14" + }, + { + "enabled": true, + "parentIndex": 12, + "depth": 9, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "hittable": false, + "index": 14, + "ref": "e15" + }, + { + "depth": 10, + "type": "Other", + "parentIndex": 14, + "enabled": true, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "index": 15, + "ref": "e16" + }, + { + "hittable": false, + "parentIndex": 14, + "depth": 10, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "index": 16, + "enabled": true, + "ref": "e17" + }, + { + "type": "Other", + "enabled": true, + "depth": 11, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "index": 17, + "hittable": false, + "parentIndex": 16, + "ref": "e18" + }, + { + "index": 18, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 11, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 16, + "ref": "e19" + }, + { + "hittable": false, + "parentIndex": 18, + "type": "Other", + "index": 19, + "enabled": true, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 12, + "ref": "e20" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "depth": 13, + "enabled": true, + "parentIndex": 19, + "type": "Other", + "index": 20, + "ref": "e21" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 14, + "enabled": true, + "parentIndex": 20, + "type": "Other", + "index": 21, + "ref": "e22" + }, + { + "depth": 15, + "type": "Other", + "index": 22, + "enabled": true, + "parentIndex": 21, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "ref": "e23" + }, + { + "enabled": true, + "depth": 16, + "index": 23, + "parentIndex": 22, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "ref": "e24" + }, + { + "depth": 17, + "type": "Other", + "parentIndex": 23, + "index": 24, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "ref": "e25" + }, + { + "parentIndex": 24, + "hittable": false, + "type": "Other", + "index": 25, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "depth": 18, + "ref": "e26" + }, + { + "type": "Other", + "index": 26, + "depth": 19, + "enabled": true, + "parentIndex": 25, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "ref": "e27" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 26, + "hittable": false, + "type": "Other", + "depth": 20, + "index": 27, + "enabled": true, + "ref": "e28" + }, + { + "label": "Switch tabs (1 open)", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "hittable": false, + "index": 28, + "parentIndex": 27, + "type": "Other", + "depth": 21, + "ref": "e29" + }, + { + "label": "Open menu", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 28, + "index": 29, + "depth": 22, + "type": "Other", + "ref": "e30" + }, + { + "parentIndex": 29, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "index": 30, + "depth": 23, + "label": "Open menu", + "enabled": true, + "type": "Other", + "ref": "e31" + }, + { + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "depth": 24, + "label": "Open menu", + "index": 31, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "parentIndex": 30, + "type": "Other", + "hittable": false, + "ref": "e32" + }, + { + "depth": 25, + "label": "Open menu", + "index": 32, + "rect": { + "y": 0, + "width": 402, + "height": 126, + "x": 0 + }, + "type": "Other", + "hittable": false, + "identifier": "composer-dock-header", + "parentIndex": 31, + "enabled": true, + "ref": "e33" + }, + { + "enabled": true, + "parentIndex": 32, + "rect": { + "y": 70, + "width": 402, + "height": 56, + "x": 0 + }, + "hittable": false, + "depth": 26, + "index": 33, + "type": "Other", + "ref": "e34" + }, + { + "label": "Open menu", + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 8 + }, + "hittable": false, + "type": "Button", + "enabled": true, + "depth": 26, + "identifier": "menu-button", + "index": 34, + "parentIndex": 32, + "ref": "e35" + }, + { + "index": 35, + "label": "main", + "depth": 26, + "rect": { + "y": 80.6666669845581, + "width": 314, + "height": 34, + "x": 48 + }, + "hittable": false, + "enabled": true, + "parentIndex": 32, + "type": "Other", + "ref": "e36" + }, + { + "label": "main", + "enabled": true, + "depth": 27, + "index": 36, + "parentIndex": 35, + "type": "Other", + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 34, + "x": 48 + }, + "hittable": false, + "ref": "e37" + }, + { + "index": 37, + "type": "StaticText", + "enabled": true, + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 18, + "x": 48 + }, + "identifier": "workspace-header-title", + "label": "main", + "hittable": false, + "depth": 28, + "parentIndex": 36, + "ref": "e38" + }, + { + "hittable": false, + "label": "main", + "enabled": true, + "type": "StaticText", + "parentIndex": 37, + "depth": 29, + "index": 38, + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 18, + "x": 48 + }, + "ref": "e39" + }, + { + "label": "composer-dock-ios-fixture", + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "height": 15.666671752929688, + "x": 48 + }, + "type": "StaticText", + "index": 39, + "enabled": true, + "hittable": false, + "identifier": "workspace-header-subtitle", + "parentIndex": 36, + "depth": 28, + "ref": "e40" + }, + { + "type": "StaticText", + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "height": 15.666671752929688, + "x": 48 + }, + "label": "composer-dock-ios-fixture", + "index": 40, + "enabled": true, + "depth": 29, + "hittable": false, + "parentIndex": 39, + "ref": "e41" + }, + { + "index": 41, + "enabled": true, + "depth": 28, + "hittable": false, + "label": "·", + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "type": "StaticText", + "parentIndex": 36, + "ref": "e42" + }, + { + "depth": 29, + "label": "·", + "parentIndex": 41, + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "hittable": false, + "index": 42, + "type": "StaticText", + "enabled": true, + "ref": "e43" + }, + { + "hittable": false, + "label": "dev-new", + "depth": 28, + "parentIndex": 36, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "rect": { + "y": 98.6666669845581, + "width": 68.00001525878906, + "height": 16, + "x": 227.3333282470703 + }, + "index": 43, + "type": "Other", + "enabled": true, + "ref": "e44" + }, + { + "hittable": false, + "enabled": true, + "depth": 28, + "parentIndex": 36, + "type": "Other", + "rect": { + "y": 100.6666669845581, + "width": 12, + "height": 12, + "x": 227.3333282470703 + }, + "index": 44, + "ref": "e45" + }, + { + "depth": 29, + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 11, + "x": 227.8333282470703 + }, + "index": 45, + "enabled": true, + "hittable": false, + "parentIndex": 44, + "type": "Other", + "ref": "e46" + }, + { + "depth": 30, + "type": "Other", + "enabled": true, + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "index": 46, + "parentIndex": 45, + "hittable": false, + "ref": "e47" + }, + { + "depth": 30, + "index": 47, + "hittable": false, + "rect": { + "y": 107.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "enabled": true, + "type": "Other", + "parentIndex": 45, + "ref": "e48" + }, + { + "rect": { + "y": 103.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "index": 48, + "type": "Other", + "enabled": true, + "depth": 30, + "hittable": false, + "parentIndex": 45, + "ref": "e49" + }, + { + "rect": { + "y": 109.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "type": "Other", + "enabled": true, + "index": 49, + "depth": 30, + "hittable": false, + "parentIndex": 45, + "ref": "e50" + }, + { + "type": "StaticText", + "parentIndex": 36, + "hittable": false, + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "enabled": true, + "depth": 28, + "index": 50, + "label": "dev-new", + "ref": "e51" + }, + { + "hittable": false, + "parentIndex": 50, + "type": "StaticText", + "label": "dev-new", + "enabled": true, + "index": 51, + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "depth": 29, + "ref": "e52" + }, + { + "parentIndex": 35, + "identifier": "workspace-header-menu-trigger", + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 330 + }, + "type": "Button", + "label": "Workspace actions", + "index": 52, + "hittable": false, + "depth": 27, + "enabled": true, + "ref": "e53" + }, + { + "type": "Button", + "depth": 26, + "hittable": false, + "label": "Open Explorer sidebar", + "parentIndex": 32, + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 362 + }, + "enabled": true, + "index": 53, + "identifier": "workspace-explorer-toggle", + "ref": "e54" + }, + { + "depth": 25, + "index": 54, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "parentIndex": 31, + "ref": "e55" + }, + { + "index": 55, + "depth": 25, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 31, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e56" + }, + { + "enabled": true, + "parentIndex": 31, + "depth": 25, + "label": "Switch tabs (1 open)", + "identifier": "workspace-tab-switcher-trigger", + "hittable": false, + "rect": { + "y": 126, + "width": 402, + "height": 34, + "x": 0 + }, + "type": "Button", + "index": 56, + "ref": "e57" + }, + { + "identifier": "workspace-active-tab-icon", + "hittable": false, + "rect": { + "y": 136, + "width": 14, + "height": 14, + "x": 20 + }, + "enabled": true, + "index": 57, + "type": "Other", + "depth": 26, + "parentIndex": 56, + "ref": "e58" + }, + { + "enabled": true, + "identifier": "workspace-tabs-row", + "type": "Other", + "hittable": false, + "index": 58, + "rect": { + "y": 126, + "width": 402, + "height": 35, + "x": 0 + }, + "parentIndex": 31, + "depth": 25, + "ref": "e59" + }, + { + "parentIndex": 31, + "depth": 25, + "hittable": false, + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "enabled": true, + "type": "Other", + "index": 59, + "ref": "e60" + }, + { + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "index": 60, + "enabled": true, + "parentIndex": 31, + "hittable": false, + "type": "Other", + "depth": 25, + "ref": "e61" + }, + { + "label": "Add attachment", + "index": 61, + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "type": "Other", + "parentIndex": 60, + "enabled": true, + "hittable": false, + "depth": 26, + "ref": "e62" + }, + { + "enabled": true, + "index": 62, + "depth": 27, + "parentIndex": 61, + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "type": "Other", + "hittable": false, + "ref": "e63" + }, + { + "parentIndex": 61, + "type": "Other", + "depth": 27, + "hittable": false, + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "index": 63, + "enabled": true, + "ref": "e64" + }, + { + "type": "Other", + "label": "Message agent...", + "parentIndex": 61, + "index": 64, + "enabled": true, + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "identifier": "composer-viewport", + "hittable": false, + "depth": 27, + "ref": "e65" + }, + { + "index": 65, + "label": "Message agent...", + "rect": { + "y": -141, + "width": 402, + "height": 713, + "x": 0 + }, + "hittable": false, + "enabled": true, + "depth": 28, + "parentIndex": 64, + "type": "Other", + "ref": "e66" + }, + { + "type": "Other", + "enabled": true, + "depth": 29, + "index": 66, + "identifier": "composer-dock-content", + "hittable": false, + "parentIndex": 65, + "rect": { + "y": -141, + "width": 402, + "height": 504.33331298828125, + "x": 0 + }, + "label": "Horizontal scroll bar, 1 page", + "ref": "e67" + }, + { + "hittable": false, + "rect": { + "y": -141, + "width": 402, + "height": 504.33331298828125, + "x": 0 + }, + "index": 67, + "enabled": true, + "parentIndex": 66, + "depth": 30, + "type": "Other", + "ref": "e68" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "parentIndex": 66, + "depth": 30, + "rect": { + "y": -141, + "width": 402, + "height": 504.33331298828125, + "x": 0 + }, + "index": 68, + "type": "Other", + "ref": "e69" + }, + { + "rect": { + "y": -141, + "width": 402, + "height": 504.33331298828125, + "x": 0 + }, + "hittable": false, + "depth": 31, + "index": 69, + "enabled": true, + "parentIndex": 68, + "type": "Other", + "ref": "e70" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -141, + "width": 402, + "height": 504.33331298828125, + "x": 0 + }, + "type": "Other", + "parentIndex": 68, + "hittable": false, + "depth": 31, + "identifier": "agent-chat-scroll", + "enabled": true, + "index": 70, + "ref": "e71" + }, + { + "rect": { + "y": -141.00002034505206, + "width": 402, + "height": 504.3333333333333, + "x": 0 + }, + "hittable": false, + "depth": 32, + "parentIndex": 70, + "enabled": true, + "label": "Thinking", + "index": 71, + "type": "ScrollView", + "ref": "e72" + }, + { + "label": "Thinking", + "enabled": true, + "parentIndex": 71, + "rect": { + "y": -3015.6666870117188, + "width": 402, + "height": 3379, + "x": 0 + }, + "depth": 33, + "type": "Other", + "hittable": false, + "index": 72, + "ref": "e73" + }, + { + "type": "Other", + "index": 73, + "parentIndex": 72, + "hittable": false, + "label": "Thinking", + "enabled": true, + "rect": { + "y": -3015.6666870117188, + "width": 402, + "height": 3379, + "x": 0 + }, + "depth": 34, + "ref": "e74" + }, + { + "type": "Other", + "parentIndex": 73, + "depth": 35, + "index": 74, + "enabled": true, + "rect": { + "y": -3015.6666870117188, + "width": 378, + "height": 32, + "x": 12 + }, + "hittable": false, + "ref": "e75" + }, + { + "enabled": true, + "type": "Other", + "depth": 36, + "identifier": "older-history-slot", + "rect": { + "y": -3015.6666870117188, + "width": 378, + "height": 32, + "x": 12 + }, + "index": 75, + "parentIndex": 74, + "hittable": false, + "ref": "e76" + }, + { + "hittable": false, + "depth": 35, + "rect": { + "y": -2983.6666870117188, + "width": 378, + "height": 570, + "x": 12 + }, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "index": 76, + "ref": "e77" + }, + { + "index": 77, + "enabled": true, + "parentIndex": 73, + "label": "Thinking", + "depth": 35, + "hittable": false, + "rect": { + "y": -2413.6666870117188, + "width": 378, + "height": 32, + "x": 12 + }, + "type": "Other", + "ref": "e78" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -2413.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 78, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 36, + "parentIndex": 77, + "ref": "e79" + }, + { + "label": "Thinking", + "parentIndex": 77, + "type": "Button", + "hittable": false, + "enabled": true, + "rect": { + "y": -2413.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "index": 79, + "ref": "e80" + }, + { + "depth": 35, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "enabled": true, + "index": 80, + "rect": { + "y": -2381.6666870117188, + "width": 378, + "height": 32, + "x": 12 + }, + "type": "Other", + "parentIndex": 73, + "hittable": false, + "ref": "e81" + }, + { + "enabled": true, + "rect": { + "y": -2381.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "identifier": "tool-call-badge", + "parentIndex": 80, + "hittable": false, + "depth": 36, + "type": "Other", + "index": 81, + "ref": "e82" + }, + { + "hittable": false, + "type": "Button", + "index": 82, + "rect": { + "y": -2381.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 36, + "parentIndex": 80, + "ref": "e83" + }, + { + "parentIndex": 82, + "rect": { + "y": -2374.6666870117188, + "width": 344, + "height": 18, + "x": 42 + }, + "label": "Read", + "hittable": false, + "index": 83, + "type": "Other", + "enabled": true, + "depth": 37, + "ref": "e84" + }, + { + "depth": 38, + "index": 84, + "enabled": true, + "parentIndex": 83, + "rect": { + "y": -2374.6666870117188, + "width": 35, + "height": 18, + "x": 42 + }, + "type": "StaticText", + "label": "Read", + "hittable": false, + "ref": "e85" + }, + { + "enabled": true, + "parentIndex": 84, + "index": 85, + "rect": { + "y": -2374.6666870117188, + "width": 35, + "height": 18, + "x": 42 + }, + "type": "StaticText", + "depth": 39, + "hittable": false, + "label": "Read", + "ref": "e86" + }, + { + "type": "StaticText", + "rect": { + "y": -2374.6666870117188, + "width": 301, + "height": 18, + "x": 85 + }, + "label": "packages/app/src/components/conversation-list.tsx", + "depth": 38, + "hittable": false, + "index": 86, + "enabled": true, + "parentIndex": 83, + "ref": "e87" + }, + { + "depth": 39, + "parentIndex": 86, + "rect": { + "y": -2374.6666870117188, + "width": 301, + "height": 18, + "x": 85 + }, + "enabled": true, + "hittable": false, + "type": "StaticText", + "index": 87, + "label": "packages/app/src/components/conversation-list.tsx", + "ref": "e88" + }, + { + "enabled": true, + "rect": { + "y": -2349.6666870117188, + "width": 378, + "height": 36, + "x": 12 + }, + "index": 88, + "depth": 35, + "parentIndex": 73, + "label": "Search, scrollToEnd", + "type": "Other", + "hittable": false, + "ref": "e89" + }, + { + "depth": 36, + "hittable": false, + "type": "Other", + "rect": { + "y": -2349.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "index": 89, + "parentIndex": 88, + "identifier": "tool-call-badge", + "ref": "e90" + }, + { + "depth": 36, + "hittable": false, + "rect": { + "y": -2349.6666870117188, + "width": 388, + "height": 32, + "x": 7 + }, + "label": "Search, scrollToEnd", + "type": "Button", + "index": 90, + "enabled": true, + "parentIndex": 88, + "ref": "e91" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "parentIndex": 73, + "type": "Other", + "depth": 35, + "hittable": false, + "index": 91, + "rect": { + "y": -2313.6666870117188, + "width": 378, + "height": 646, + "x": 12 + }, + "ref": "e92" + }, + { + "parentIndex": 91, + "hittable": false, + "index": 92, + "identifier": "assistant-message", + "depth": 36, + "rect": { + "y": -2313.6666870117188, + "width": 362, + "height": 642, + "x": 20 + }, + "type": "Other", + "enabled": true, + "ref": "e93" + }, + { + "index": 93, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 36, + "rect": { + "y": -2301.6666870117188, + "width": 362, + "height": 132, + "x": 20 + }, + "parentIndex": 91, + "hittable": false, + "type": "Other", + "ref": "e94" + }, + { + "type": "Other", + "hittable": false, + "index": 94, + "enabled": true, + "rect": { + "y": -2301.6666870117188, + "width": 362, + "height": 132, + "x": 20 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 93, + "depth": 37, + "ref": "e95" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": -2301.6666870117188, + "width": 362, + "height": 132, + "x": 20 + }, + "index": 95, + "parentIndex": 94, + "type": "Other", + "depth": 38, + "ref": "e96" + }, + { + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "enabled": true, + "depth": 38, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 94, + "index": 96, + "hittable": false, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "ref": "e97" + }, + { + "depth": 39, + "parentIndex": 96, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -2301.6666870117188, + "width": 362, + "height": 132, + "x": 20 + }, + "index": 97, + "hittable": false, + "type": "TextView", + "ref": "e98" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -2301.6666870117188, + "width": 30, + "height": 132, + "x": 349 + }, + "type": "Other", + "index": 98, + "value": "0%", + "depth": 39, + "hittable": false, + "enabled": true, + "parentIndex": 96, + "ref": "e99" + }, + { + "parentIndex": 98, + "depth": 40, + "rect": { + "y": -2340.6666870117188, + "width": 3, + "height": 36, + "x": 376 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 99, + "ref": "e100" + }, + { + "rect": { + "y": -2202.6666870117188, + "width": 362, + "height": 30, + "x": 20 + }, + "value": "0%", + "depth": 39, + "index": 100, + "hittable": false, + "parentIndex": 96, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "ref": "e101" + }, + { + "hittable": false, + "type": "Other", + "index": 101, + "depth": 40, + "rect": { + "y": -2175.6666870117188, + "width": 36, + "height": 3, + "x": -19 + }, + "parentIndex": 100, + "enabled": true, + "ref": "e102" + }, + { + "enabled": true, + "index": 102, + "hittable": false, + "rect": { + "y": -2141.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "depth": 36, + "parentIndex": 91, + "type": "StaticText", + "ref": "e103" + }, + { + "index": 103, + "depth": 37, + "parentIndex": 102, + "label": "•", + "rect": { + "y": -2141.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e104" + }, + { + "rect": { + "y": -2141.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "index": 104, + "hittable": false, + "parentIndex": 91, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "type": "Other", + "depth": 36, + "ref": "e105" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 104, + "index": 105, + "enabled": true, + "depth": 37, + "rect": { + "y": -2141.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "Other", + "ref": "e106" + }, + { + "rect": { + "y": -2141.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "Other", + "depth": 38, + "index": 106, + "parentIndex": 105, + "enabled": true, + "ref": "e107" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 107, + "enabled": true, + "type": "TextView", + "depth": 38, + "parentIndex": 105, + "ref": "e108" + }, + { + "rect": { + "y": -2141.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "index": 108, + "enabled": true, + "parentIndex": 107, + "depth": 39, + "ref": "e109" + }, + { + "value": "0%", + "rect": { + "y": -2141.6666870117188, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "index": 109, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "hittable": false, + "depth": 39, + "type": "Other", + "parentIndex": 107, + "ref": "e110" + }, + { + "type": "Other", + "depth": 40, + "hittable": false, + "rect": { + "y": -2180.6666870117188, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "parentIndex": 109, + "index": 110, + "enabled": true, + "ref": "e111" + }, + { + "parentIndex": 107, + "rect": { + "y": -2086.6666870117188, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "type": "Other", + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 111, + "enabled": true, + "ref": "e112" + }, + { + "parentIndex": 111, + "type": "Other", + "index": 112, + "enabled": true, + "depth": 40, + "hittable": false, + "rect": { + "y": -2059.6666870117188, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "ref": "e113" + }, + { + "parentIndex": 91, + "hittable": false, + "label": "•", + "index": 113, + "enabled": true, + "depth": 36, + "type": "StaticText", + "rect": { + "y": -2049.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "ref": "e114" + }, + { + "rect": { + "y": -2049.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "parentIndex": 113, + "hittable": false, + "enabled": true, + "index": 114, + "label": "•", + "type": "StaticText", + "ref": "e115" + }, + { + "enabled": true, + "parentIndex": 91, + "index": 115, + "depth": 36, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "hittable": false, + "rect": { + "y": -2049.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e116" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "rect": { + "y": -2049.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "index": 116, + "enabled": true, + "depth": 37, + "parentIndex": 115, + "type": "Other", + "ref": "e117" + }, + { + "depth": 38, + "enabled": true, + "rect": { + "y": -2049.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "parentIndex": 116, + "type": "Other", + "index": 117, + "ref": "e118" + }, + { + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 118, + "hittable": false, + "depth": 38, + "parentIndex": 116, + "enabled": true, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "ref": "e119" + }, + { + "hittable": false, + "rect": { + "y": -2049.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "TextView", + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 39, + "index": 119, + "parentIndex": 118, + "ref": "e120" + }, + { + "index": 120, + "enabled": true, + "type": "Other", + "rect": { + "y": -2049.6666870117188, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "hittable": false, + "depth": 39, + "parentIndex": 118, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "ref": "e121" + }, + { + "parentIndex": 120, + "rect": { + "y": -2088.6666870117188, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "type": "Other", + "index": 121, + "hittable": false, + "depth": 40, + "enabled": true, + "ref": "e122" + }, + { + "value": "0%", + "rect": { + "y": -1994.6666870117188, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 118, + "index": 122, + "ref": "e123" + }, + { + "enabled": true, + "rect": { + "y": -1967.6666870117188, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 122, + "hittable": false, + "depth": 40, + "type": "Other", + "index": 123, + "ref": "e124" + }, + { + "hittable": false, + "parentIndex": 91, + "depth": 36, + "type": "StaticText", + "index": 124, + "rect": { + "y": -1957.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "enabled": true, + "ref": "e125" + }, + { + "label": "•", + "rect": { + "y": -1957.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "enabled": true, + "depth": 37, + "type": "StaticText", + "parentIndex": 124, + "index": 125, + "hittable": false, + "ref": "e126" + }, + { + "enabled": true, + "index": 126, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -1957.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "Other", + "parentIndex": 91, + "hittable": false, + "depth": 36, + "ref": "e127" + }, + { + "type": "Other", + "depth": 37, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "index": 127, + "parentIndex": 126, + "enabled": true, + "rect": { + "y": -1957.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e128" + }, + { + "index": 128, + "hittable": false, + "depth": 38, + "rect": { + "y": -1957.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "enabled": true, + "parentIndex": 127, + "type": "Other", + "ref": "e129" + }, + { + "index": 129, + "parentIndex": 127, + "depth": 38, + "type": "TextView", + "enabled": true, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "ref": "e130" + }, + { + "parentIndex": 129, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -1957.6666870117188, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "index": 130, + "enabled": true, + "hittable": false, + "type": "TextView", + "depth": 39, + "ref": "e131" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -1957.6666870117188, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "value": "0%", + "type": "Other", + "index": 131, + "enabled": true, + "parentIndex": 129, + "hittable": false, + "depth": 39, + "ref": "e132" + }, + { + "index": 132, + "depth": 40, + "enabled": true, + "hittable": false, + "rect": { + "y": -1996.6666870117188, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "type": "Other", + "parentIndex": 131, + "ref": "e133" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "parentIndex": 129, + "type": "Other", + "rect": { + "y": -1902.6666870117188, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "index": 133, + "enabled": true, + "hittable": false, + "depth": 39, + "ref": "e134" + }, + { + "enabled": true, + "parentIndex": 133, + "depth": 40, + "index": 134, + "type": "Other", + "rect": { + "y": -1875.6666870117188, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "hittable": false, + "ref": "e135" + }, + { + "index": 135, + "parentIndex": 91, + "type": "StaticText", + "hittable": false, + "rect": { + "y": -1865.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "depth": 36, + "enabled": true, + "ref": "e136" + }, + { + "rect": { + "y": -1865.6666870117188, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "enabled": true, + "type": "StaticText", + "hittable": false, + "parentIndex": 135, + "index": 136, + "depth": 37, + "label": "•", + "ref": "e137" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "Other", + "index": 137, + "depth": 36, + "parentIndex": 91, + "hittable": false, + "rect": { + "y": -1865.6666870117188, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "ref": "e138" + }, + { + "index": 138, + "rect": { + "y": -1865.6666870117188, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "hittable": false, + "parentIndex": 137, + "type": "Other", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e139" + }, + { + "enabled": true, + "parentIndex": 138, + "type": "Other", + "depth": 38, + "rect": { + "y": -1865.6666870117188, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "hittable": false, + "index": 139, + "ref": "e140" + }, + { + "type": "TextView", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 140, + "depth": 38, + "parentIndex": 138, + "ref": "e141" + }, + { + "depth": 39, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 141, + "rect": { + "y": -1865.6666870117188, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "enabled": true, + "type": "TextView", + "parentIndex": 140, + "hittable": false, + "ref": "e142" + }, + { + "rect": { + "y": -1865.6666870117188, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "enabled": true, + "index": 142, + "value": "0%", + "parentIndex": 140, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "ref": "e143" + }, + { + "rect": { + "y": -1904.6666870117188, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "hittable": false, + "enabled": true, + "depth": 40, + "index": 143, + "parentIndex": 142, + "type": "Other", + "ref": "e144" + }, + { + "rect": { + "y": -1832.6666870117188, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "index": 144, + "parentIndex": 140, + "hittable": false, + "depth": 39, + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e145" + }, + { + "rect": { + "y": -1805.6666870117188, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "hittable": false, + "enabled": true, + "parentIndex": 144, + "index": 145, + "depth": 40, + "type": "Other", + "ref": "e146" + }, + { + "rect": { + "y": -1783.6666870117188, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 36, + "parentIndex": 91, + "type": "Other", + "hittable": false, + "index": 146, + "ref": "e147" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 37, + "index": 147, + "type": "Other", + "hittable": false, + "rect": { + "y": -1783.6666870117188, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "parentIndex": 146, + "ref": "e148" + }, + { + "depth": 38, + "index": 148, + "type": "Other", + "rect": { + "x": 20, + "y": -1783.6666870117188, + "width": 362, + "height": 88 + }, + "enabled": true, + "hittable": false, + "parentIndex": 147, + "ref": "e149" + }, + { + "enabled": true, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "TextView", + "depth": 38, + "parentIndex": 147, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "index": 149, + "ref": "e150" + }, + { + "enabled": true, + "parentIndex": 149, + "hittable": false, + "depth": 39, + "rect": { + "x": 20, + "y": -1783.6666870117188, + "width": 362, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 150, + "type": "TextView", + "ref": "e151" + }, + { + "rect": { + "x": 349, + "y": -1783.6666870117188, + "width": 30, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "depth": 39, + "hittable": false, + "parentIndex": 149, + "index": 151, + "value": "0%", + "ref": "e152" + }, + { + "enabled": true, + "rect": { + "x": 376, + "y": -1822.6666870117188, + "width": 3, + "height": 36 + }, + "hittable": false, + "parentIndex": 151, + "index": 152, + "depth": 40, + "type": "Other", + "ref": "e153" + }, + { + "rect": { + "x": 20, + "y": -1728.6666870117188, + "width": 362, + "height": 30 + }, + "enabled": true, + "value": "0%", + "type": "Other", + "index": 153, + "depth": 39, + "parentIndex": 149, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e154" + }, + { + "rect": { + "x": -19, + "y": -1701.6666870117188, + "width": 36, + "height": 3 + }, + "parentIndex": 153, + "hittable": false, + "depth": 40, + "index": 154, + "enabled": true, + "type": "Other", + "ref": "e155" + }, + { + "hittable": false, + "parentIndex": 73, + "type": "Other", + "index": 155, + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 35, + "rect": { + "x": 12, + "y": -1667.6666870117188, + "width": 378, + "height": 32 + }, + "ref": "e156" + }, + { + "identifier": "tool-call-badge", + "enabled": true, + "rect": { + "x": 7, + "y": -1667.6666870117188, + "width": 388, + "height": 32 + }, + "parentIndex": 155, + "hittable": false, + "index": 156, + "type": "Other", + "depth": 36, + "ref": "e157" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "depth": 36, + "type": "Button", + "hittable": false, + "parentIndex": 155, + "rect": { + "x": 7, + "y": -1667.6666870117188, + "width": 388, + "height": 32 + }, + "index": 157, + "ref": "e158" + }, + { + "parentIndex": 73, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "index": 158, + "type": "Other", + "rect": { + "x": 12, + "y": -1635.6666870117188, + "width": 378, + "height": 36 + }, + "enabled": true, + "depth": 35, + "ref": "e159" + }, + { + "identifier": "tool-call-badge", + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 158, + "rect": { + "x": 7, + "y": -1635.6666870117188, + "width": 388, + "height": 32 + }, + "index": 159, + "depth": 36, + "ref": "e160" + }, + { + "index": 160, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "x": 7, + "y": -1635.6666870117188, + "width": 388, + "height": 32 + }, + "enabled": true, + "parentIndex": 158, + "hittable": false, + "type": "Button", + "depth": 36, + "ref": "e161" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 73, + "type": "Other", + "index": 161, + "rect": { + "x": 12, + "y": -1599.6666870117188, + "width": 378, + "height": 570 + }, + "depth": 35, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e162" + }, + { + "type": "Other", + "parentIndex": 161, + "hittable": false, + "index": 162, + "rect": { + "x": 20, + "y": -1599.6666870117188, + "width": 362, + "height": 566 + }, + "identifier": "assistant-message", + "depth": 36, + "enabled": true, + "ref": "e163" + }, + { + "parentIndex": 161, + "depth": 36, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "y": -1587.6666870117188, + "width": 362, + "height": 242 + }, + "index": 163, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "ref": "e164" + }, + { + "type": "Other", + "index": 164, + "enabled": true, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 37, + "parentIndex": 163, + "rect": { + "x": 20, + "y": -1587.6666870117188, + "width": 362, + "height": 242 + }, + "ref": "e165" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 20, + "y": -1587.6666870117188, + "width": 362, + "height": 242 + }, + "parentIndex": 164, + "index": 165, + "hittable": false, + "depth": 38, + "ref": "e166" + }, + { + "hittable": false, + "index": 166, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "depth": 38, + "type": "TextView", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 164, + "ref": "e167" + }, + { + "depth": 39, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "index": 167, + "enabled": true, + "parentIndex": 166, + "type": "TextView", + "rect": { + "x": 20, + "y": -1587.6666870117188, + "width": 362, + "height": 242 + }, + "ref": "e168" + }, + { + "enabled": true, + "rect": { + "x": 349, + "y": -1587.6666870117188, + "width": 30, + "height": 242 + }, + "hittable": false, + "depth": 39, + "type": "Other", + "parentIndex": 166, + "index": 168, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "ref": "e169" + }, + { + "type": "Other", + "enabled": true, + "index": 169, + "rect": { + "x": 376, + "y": -1626.6666870117188, + "width": 3, + "height": 36 + }, + "hittable": false, + "depth": 40, + "parentIndex": 168, + "ref": "e170" + }, + { + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "parentIndex": 166, + "type": "Other", + "index": 170, + "rect": { + "x": 20, + "y": -1378.6666870117188, + "width": 362, + "height": 30 + }, + "enabled": true, + "hittable": false, + "ref": "e171" + }, + { + "depth": 40, + "parentIndex": 170, + "hittable": false, + "type": "Other", + "index": 171, + "enabled": true, + "rect": { + "x": -19, + "y": -1351.6666870117188, + "width": 36, + "height": 3 + }, + "ref": "e172" + }, + { + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 172, + "enabled": true, + "depth": 36, + "hittable": false, + "parentIndex": 161, + "rect": { + "x": 20, + "y": -1321.6666870117188, + "width": 362, + "height": 264 + }, + "ref": "e173" + }, + { + "hittable": false, + "depth": 37, + "index": 173, + "parentIndex": 172, + "type": "Other", + "enabled": true, + "rect": { + "x": 20, + "y": -1321.6666870117188, + "width": 362, + "height": 264 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e174" + }, + { + "rect": { + "x": 20, + "y": -1321.6666870117188, + "width": 362, + "height": 264 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 173, + "depth": 38, + "index": 174, + "ref": "e175" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 175, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "parentIndex": 173, + "hittable": false, + "enabled": true, + "type": "TextView", + "ref": "e176" + }, + { + "parentIndex": 175, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "enabled": true, + "hittable": false, + "depth": 39, + "index": 176, + "rect": { + "x": 20, + "y": -1321.6666870117188, + "width": 362, + "height": 264 + }, + "ref": "e177" + }, + { + "value": "0%", + "hittable": false, + "rect": { + "x": 349, + "y": -1321.6666870117188, + "width": 30, + "height": 264 + }, + "depth": 39, + "parentIndex": 175, + "enabled": true, + "index": 177, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "ref": "e178" + }, + { + "type": "Other", + "index": 178, + "rect": { + "x": 376, + "y": -1360.6666870117188, + "width": 3, + "height": 36 + }, + "parentIndex": 177, + "enabled": true, + "hittable": false, + "depth": 40, + "ref": "e179" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "depth": 39, + "index": 179, + "enabled": true, + "rect": { + "x": 20, + "y": -1090.6666870117188, + "width": 362, + "height": 30 + }, + "hittable": false, + "parentIndex": 175, + "ref": "e180" + }, + { + "enabled": true, + "depth": 40, + "hittable": false, + "index": 180, + "type": "Other", + "parentIndex": 179, + "rect": { + "x": -19, + "y": -1063.6666870117188, + "width": 36, + "height": 3 + }, + "ref": "e181" + }, + { + "type": "Other", + "depth": 35, + "rect": { + "x": 12, + "y": -1029.6666870117188, + "width": 378, + "height": 32 + }, + "index": 181, + "parentIndex": 73, + "hittable": false, + "label": "Thinking", + "enabled": true, + "ref": "e182" + }, + { + "index": 182, + "hittable": false, + "depth": 36, + "rect": { + "x": 7, + "y": -1029.6666870117188, + "width": 388, + "height": 32 + }, + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "parentIndex": 181, + "ref": "e183" + }, + { + "depth": 36, + "enabled": true, + "type": "Button", + "index": 183, + "parentIndex": 181, + "hittable": false, + "rect": { + "x": 7, + "y": -1029.6666870117188, + "width": 388, + "height": 32 + }, + "label": "Thinking", + "ref": "e184" + }, + { + "rect": { + "x": 12, + "y": -997.6666870117188, + "width": 378, + "height": 32 + }, + "enabled": true, + "parentIndex": 73, + "type": "Other", + "index": 184, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 35, + "hittable": false, + "ref": "e185" + }, + { + "depth": 36, + "type": "Other", + "parentIndex": 184, + "hittable": false, + "index": 185, + "enabled": true, + "rect": { + "x": 7, + "y": -997.6666870117188, + "width": 388, + "height": 32 + }, + "identifier": "tool-call-badge", + "ref": "e186" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "parentIndex": 184, + "index": 186, + "enabled": true, + "rect": { + "x": 7, + "y": -997.6666870117188, + "width": 388, + "height": 32 + }, + "depth": 36, + "type": "Button", + "ref": "e187" + }, + { + "hittable": false, + "index": 187, + "rect": { + "x": 12, + "y": -965.6666870117188, + "width": 378, + "height": 36 + }, + "label": "Search, scrollToEnd", + "enabled": true, + "depth": 35, + "parentIndex": 73, + "type": "Other", + "ref": "e188" + }, + { + "enabled": true, + "index": 188, + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "y": -965.6666870117188, + "width": 388, + "height": 32 + }, + "parentIndex": 187, + "hittable": false, + "ref": "e189" + }, + { + "enabled": true, + "rect": { + "x": 7, + "y": -965.6666870117188, + "width": 388, + "height": 32 + }, + "parentIndex": 187, + "label": "Search, scrollToEnd", + "depth": 36, + "index": 189, + "type": "Button", + "hittable": false, + "ref": "e190" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 190, + "parentIndex": 73, + "rect": { + "x": 12, + "y": -929.6666870117188, + "width": 378, + "height": 646 + }, + "hittable": false, + "depth": 35, + "enabled": true, + "type": "Other", + "ref": "e191" + }, + { + "index": 191, + "rect": { + "x": 20, + "y": -929.6666870117188, + "width": 362, + "height": 642 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 190, + "identifier": "assistant-message", + "depth": 36, + "ref": "e192" + }, + { + "depth": 36, + "hittable": false, + "rect": { + "x": 20, + "y": -917.6666870117188, + "width": 362, + "height": 132 + }, + "type": "Other", + "enabled": true, + "parentIndex": 190, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 192, + "ref": "e193" + }, + { + "index": 193, + "enabled": true, + "depth": 37, + "rect": { + "x": 20, + "y": -917.6666870117188, + "width": 362, + "height": 132 + }, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "parentIndex": 192, + "ref": "e194" + }, + { + "type": "Other", + "depth": 38, + "hittable": false, + "parentIndex": 193, + "enabled": true, + "index": 194, + "rect": { + "x": 20, + "y": -917.6666870117188, + "width": 362, + "height": 132 + }, + "ref": "e195" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "type": "TextView", + "parentIndex": 193, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "index": 195, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 38, + "ref": "e196" + }, + { + "index": 196, + "hittable": false, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 195, + "rect": { + "x": 20, + "y": -917.6666870117188, + "width": 362, + "height": 132 + }, + "depth": 39, + "type": "TextView", + "ref": "e197" + }, + { + "parentIndex": 195, + "index": 197, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "y": -917.6666870117188, + "width": 30, + "height": 132 + }, + "depth": 39, + "value": "0%", + "enabled": true, + "type": "Other", + "ref": "e198" + }, + { + "hittable": false, + "index": 198, + "depth": 40, + "enabled": true, + "rect": { + "x": 376, + "y": -956.6666870117188, + "width": 3, + "height": 36 + }, + "type": "Other", + "parentIndex": 197, + "ref": "e199" + }, + { + "depth": 39, + "hittable": false, + "rect": { + "x": 20, + "y": -818.6666870117188, + "width": 362, + "height": 30 + }, + "parentIndex": 195, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "index": 199, + "enabled": true, + "value": "0%", + "ref": "e200" + }, + { + "index": 200, + "depth": 40, + "enabled": true, + "rect": { + "x": -19, + "y": -791.6666870117188, + "width": 36, + "height": 3 + }, + "hittable": false, + "parentIndex": 199, + "type": "Other", + "ref": "e201" + }, + { + "label": "•", + "type": "StaticText", + "index": 201, + "hittable": false, + "depth": 36, + "parentIndex": 190, + "enabled": true, + "rect": { + "x": 30, + "y": -757.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "ref": "e202" + }, + { + "index": 202, + "label": "•", + "hittable": false, + "enabled": true, + "depth": 37, + "parentIndex": 201, + "rect": { + "x": 30, + "y": -757.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "type": "StaticText", + "ref": "e203" + }, + { + "parentIndex": 190, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 203, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -757.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "enabled": true, + "hittable": false, + "depth": 36, + "ref": "e204" + }, + { + "index": 204, + "hittable": false, + "parentIndex": 203, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "y": -757.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 37, + "enabled": true, + "type": "Other", + "ref": "e205" + }, + { + "hittable": false, + "parentIndex": 204, + "index": 205, + "type": "Other", + "enabled": true, + "rect": { + "x": 41.33333396911621, + "y": -757.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 38, + "ref": "e206" + }, + { + "hittable": false, + "parentIndex": 204, + "index": 206, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "depth": 38, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e207" + }, + { + "type": "TextView", + "depth": 39, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "y": -757.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "index": 207, + "parentIndex": 206, + "ref": "e208" + }, + { + "rect": { + "x": 349.00000063578284, + "y": -757.6666870117188, + "width": 30, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "value": "0%", + "index": 208, + "parentIndex": 206, + "hittable": false, + "depth": 39, + "ref": "e209" + }, + { + "depth": 40, + "index": 209, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "x": 376.00000063578284, + "y": -796.6666870117188, + "width": 3, + "height": 36 + }, + "parentIndex": 208, + "ref": "e210" + }, + { + "type": "Other", + "value": "0%", + "index": 210, + "rect": { + "x": 41.33333396911621, + "y": -702.6666870117188, + "width": 340.6666564941406, + "height": 30 + }, + "depth": 39, + "enabled": true, + "parentIndex": 206, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e211" + }, + { + "index": 211, + "rect": { + "x": 2.333333969116211, + "y": -675.6666870117188, + "width": 36, + "height": 3 + }, + "hittable": false, + "parentIndex": 210, + "depth": 40, + "type": "Other", + "enabled": true, + "ref": "e212" + }, + { + "label": "•", + "type": "StaticText", + "rect": { + "x": 30, + "y": -665.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "hittable": false, + "index": 212, + "parentIndex": 190, + "enabled": true, + "depth": 36, + "ref": "e213" + }, + { + "depth": 37, + "enabled": true, + "label": "•", + "parentIndex": 212, + "type": "StaticText", + "hittable": false, + "rect": { + "x": 30, + "y": -665.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "index": 213, + "ref": "e214" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 214, + "depth": 36, + "parentIndex": 190, + "rect": { + "x": 41.33333396911621, + "y": -665.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "ref": "e215" + }, + { + "enabled": true, + "hittable": false, + "index": 215, + "type": "Other", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -665.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 214, + "ref": "e216" + }, + { + "index": 216, + "enabled": true, + "depth": 38, + "type": "Other", + "parentIndex": 215, + "rect": { + "x": 41.33333396911621, + "y": -665.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "hittable": false, + "ref": "e217" + }, + { + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "depth": 38, + "enabled": true, + "parentIndex": 215, + "index": 217, + "type": "TextView", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e218" + }, + { + "type": "TextView", + "depth": 39, + "parentIndex": 217, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "y": -665.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 218, + "hittable": false, + "ref": "e219" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349.00000063578284, + "y": -665.6666870117188, + "width": 30, + "height": 88 + }, + "depth": 39, + "type": "Other", + "enabled": true, + "parentIndex": 217, + "hittable": false, + "index": 219, + "ref": "e220" + }, + { + "index": 220, + "parentIndex": 219, + "depth": 40, + "type": "Other", + "enabled": true, + "rect": { + "x": 376.00000063578284, + "y": -704.6666870117188, + "width": 3, + "height": 36 + }, + "hittable": false, + "ref": "e221" + }, + { + "hittable": false, + "depth": 39, + "index": 221, + "parentIndex": 217, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 41.33333396911621, + "y": -610.6666870117188, + "width": 340.6666564941406, + "height": 30 + }, + "enabled": true, + "type": "Other", + "ref": "e222" + }, + { + "hittable": false, + "index": 222, + "parentIndex": 221, + "type": "Other", + "depth": 40, + "enabled": true, + "rect": { + "x": 2.333333969116211, + "y": -583.6666870117188, + "width": 36, + "height": 3 + }, + "ref": "e223" + }, + { + "parentIndex": 190, + "type": "StaticText", + "rect": { + "x": 30, + "y": -573.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "enabled": true, + "hittable": false, + "depth": 36, + "index": 223, + "label": "•", + "ref": "e224" + }, + { + "parentIndex": 223, + "index": 224, + "label": "•", + "hittable": false, + "enabled": true, + "depth": 37, + "rect": { + "x": 30, + "y": -573.6666870117188, + "width": 7.333332061767578, + "height": 22 + }, + "type": "StaticText", + "ref": "e225" + }, + { + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 225, + "hittable": false, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -573.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 190, + "type": "Other", + "ref": "e226" + }, + { + "depth": 37, + "parentIndex": 225, + "rect": { + "x": 41.33333396911621, + "y": -573.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "type": "Other", + "index": 226, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "hittable": false, + "ref": "e227" + }, + { + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -573.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 38, + "hittable": false, + "index": 227, + "parentIndex": 226, + "enabled": true, + "ref": "e228" + }, + { + "enabled": true, + "parentIndex": 226, + "type": "TextView", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "depth": 38, + "index": 228, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e229" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 39, + "type": "TextView", + "rect": { + "x": 41.33333396911621, + "y": -573.6666870117188, + "width": 340.6666564941406, + "height": 88 + }, + "index": 229, + "hittable": false, + "enabled": true, + "parentIndex": 228, + "ref": "e230" + }, + { + "type": "Other", + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -573.6666870117188, + "width": 30, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 228, + "value": "0%", + "enabled": true, + "index": 230, + "ref": "e231" + }, + { + "enabled": true, + "hittable": false, + "index": 231, + "depth": 40, + "parentIndex": 230, + "type": "Other", + "rect": { + "x": 376.00000063578284, + "y": -612.6666870117188, + "width": 3, + "height": 36 + }, + "ref": "e232" + }, + { + "value": "0%", + "rect": { + "x": 41.33333396911621, + "y": -518.6666870117188, + "width": 340.6666564941406, + "height": 30 + }, + "index": 232, + "hittable": false, + "depth": 39, + "parentIndex": 228, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "ref": "e233" + }, + { + "type": "Other", + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -491.66668701171875, + "width": 36, + "height": 3 + }, + "index": 233, + "enabled": true, + "hittable": false, + "parentIndex": 232, + "ref": "e234" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "x": 30, + "y": -481.66668701171875, + "width": 7.333332061767578, + "height": 22 + }, + "index": 234, + "label": "•", + "parentIndex": 190, + "hittable": false, + "depth": 36, + "ref": "e235" + }, + { + "label": "•", + "type": "StaticText", + "enabled": true, + "parentIndex": 234, + "hittable": false, + "index": 235, + "rect": { + "x": 30, + "y": -481.66668701171875, + "width": 7.333332061767578, + "height": 22 + }, + "depth": 37, + "ref": "e236" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 190, + "type": "Other", + "depth": 36, + "index": 236, + "rect": { + "x": 41.33333396911621, + "y": -481.66668701171875, + "width": 340.6666564941406, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e237" + }, + { + "depth": 37, + "parentIndex": 236, + "hittable": false, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -481.66668701171875, + "width": 340.6666564941406, + "height": 66 + }, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 237, + "ref": "e238" + }, + { + "enabled": true, + "type": "Other", + "depth": 38, + "parentIndex": 237, + "index": 238, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "y": -481.66668701171875, + "width": 340.6666564941406, + "height": 66 + }, + "ref": "e239" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 239, + "type": "TextView", + "depth": 38, + "hittable": false, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 237, + "ref": "e240" + }, + { + "depth": 39, + "parentIndex": 239, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 240, + "rect": { + "x": 41.33333396911621, + "y": -481.66668701171875, + "width": 340.6666564941406, + "height": 66 + }, + "type": "TextView", + "hittable": false, + "ref": "e241" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 239, + "depth": 39, + "index": 241, + "enabled": true, + "value": "0%", + "rect": { + "x": 349.00000063578284, + "y": -481.66668701171875, + "width": 30, + "height": 66 + }, + "type": "Other", + "hittable": false, + "ref": "e242" + }, + { + "hittable": false, + "parentIndex": 241, + "enabled": true, + "rect": { + "x": 376.00000063578284, + "y": -520.6666870117188, + "width": 3, + "height": 36 + }, + "type": "Other", + "depth": 40, + "index": 242, + "ref": "e243" + }, + { + "hittable": false, + "parentIndex": 239, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "index": 243, + "value": "0%", + "rect": { + "x": 41.33333396911621, + "y": -448.66668701171875, + "width": 340.6666564941406, + "height": 30 + }, + "depth": 39, + "ref": "e244" + }, + { + "index": 244, + "depth": 40, + "parentIndex": 243, + "enabled": true, + "type": "Other", + "rect": { + "x": 2.333333969116211, + "y": -421.66668701171875, + "width": 36, + "height": 3 + }, + "hittable": false, + "ref": "e245" + }, + { + "enabled": true, + "hittable": false, + "depth": 36, + "type": "Other", + "index": 245, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 190, + "rect": { + "x": 20, + "y": -399.66668701171875, + "width": 362, + "height": 88 + }, + "ref": "e246" + }, + { + "depth": 37, + "parentIndex": 245, + "index": 246, + "rect": { + "x": 20, + "y": -399.66668701171875, + "width": 362, + "height": 88 + }, + "hittable": false, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "ref": "e247" + }, + { + "index": 247, + "rect": { + "x": 20, + "y": -399.66668701171875, + "width": 362, + "height": 88 + }, + "type": "Other", + "enabled": true, + "depth": 38, + "hittable": false, + "parentIndex": 246, + "ref": "e248" + }, + { + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "depth": 38, + "parentIndex": 246, + "type": "TextView", + "hittable": false, + "index": 248, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e249" + }, + { + "depth": 39, + "parentIndex": 248, + "index": 249, + "enabled": true, + "rect": { + "x": 20, + "y": -399.66668701171875, + "width": 362, + "height": 88 + }, + "hittable": false, + "type": "TextView", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e250" + }, + { + "hittable": false, + "value": "0%", + "parentIndex": 248, + "index": 250, + "rect": { + "x": 349, + "y": -399.66668701171875, + "width": 30, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "depth": 39, + "ref": "e251" + }, + { + "hittable": false, + "parentIndex": 250, + "enabled": true, + "depth": 40, + "rect": { + "x": 376, + "y": -438.66668701171875, + "width": 3, + "height": 36 + }, + "type": "Other", + "index": 251, + "ref": "e252" + }, + { + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "type": "Other", + "parentIndex": 248, + "index": 252, + "rect": { + "x": 20, + "y": -344.66668701171875, + "width": 362, + "height": 30 + }, + "hittable": false, + "ref": "e253" + }, + { + "hittable": false, + "rect": { + "x": -19, + "y": -317.66668701171875, + "width": 36, + "height": 3 + }, + "enabled": true, + "depth": 40, + "index": 253, + "type": "Other", + "parentIndex": 252, + "ref": "e254" + }, + { + "hittable": false, + "depth": 35, + "index": 254, + "parentIndex": 73, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "x": 12, + "y": -283.66668701171875, + "width": 378, + "height": 32 + }, + "enabled": true, + "ref": "e255" + }, + { + "hittable": false, + "depth": 36, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "parentIndex": 254, + "index": 255, + "rect": { + "x": 7, + "y": -283.66668701171875, + "width": 388, + "height": 32 + }, + "ref": "e256" + }, + { + "depth": 36, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "x": 7, + "y": -283.66668701171875, + "width": 388, + "height": 32 + }, + "hittable": false, + "index": 256, + "parentIndex": 254, + "enabled": true, + "type": "Button", + "ref": "e257" + }, + { + "index": 257, + "rect": { + "x": 12, + "y": -251.66668701171875, + "width": 378, + "height": 36 + }, + "parentIndex": 73, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 35, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "ref": "e258" + }, + { + "depth": 36, + "parentIndex": 257, + "enabled": true, + "identifier": "tool-call-badge", + "index": 258, + "hittable": false, + "type": "Other", + "rect": { + "x": 7, + "y": -251.66668701171875, + "width": 388, + "height": 32 + }, + "ref": "e259" + }, + { + "depth": 36, + "rect": { + "x": 7, + "y": -251.66668701171875, + "width": 388, + "height": 32 + }, + "type": "Button", + "enabled": true, + "parentIndex": 257, + "index": 259, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "ref": "e260" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 35, + "index": 260, + "rect": { + "x": 12, + "y": -215.66668701171875, + "width": 378, + "height": 512 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 73, + "ref": "e261" + }, + { + "enabled": true, + "depth": 36, + "rect": { + "x": 20, + "y": -215.66668701171875, + "width": 362, + "height": 512 + }, + "identifier": "assistant-message", + "index": 261, + "parentIndex": 260, + "type": "Other", + "hittable": false, + "ref": "e262" + }, + { + "type": "Other", + "rect": { + "x": 20, + "y": -203.66668701171875, + "width": 362, + "height": 242 + }, + "index": 262, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "depth": 36, + "parentIndex": 260, + "hittable": false, + "ref": "e263" + }, + { + "index": 263, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "rect": { + "x": 20, + "y": -203.66668701171875, + "width": 362, + "height": 242 + }, + "enabled": true, + "parentIndex": 262, + "hittable": false, + "depth": 37, + "ref": "e264" + }, + { + "enabled": true, + "index": 264, + "type": "Other", + "rect": { + "x": 20, + "y": -203.66668701171875, + "width": 362, + "height": 242 + }, + "depth": 38, + "hittable": false, + "parentIndex": 263, + "ref": "e265" + }, + { + "depth": 38, + "parentIndex": 263, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "index": 265, + "type": "TextView", + "rect": { + "x": 20, + "y": 0, + "width": 362, + "height": 38.33331298828125 + }, + "enabled": true, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e266" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "enabled": true, + "rect": { + "x": 20, + "y": -203.66668701171875, + "width": 362, + "height": 242 + }, + "hittable": false, + "parentIndex": 265, + "depth": 39, + "type": "TextView", + "index": 266, + "ref": "e267" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "x": 349, + "y": -203.66668701171875, + "width": 30, + "height": 242 + }, + "index": 267, + "depth": 39, + "parentIndex": 265, + "ref": "e268" + }, + { + "index": 268, + "parentIndex": 267, + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "rect": { + "x": 376, + "y": -242.66668701171875, + "width": 3, + "height": 36 + }, + "ref": "e269" + }, + { + "rect": { + "x": 20, + "y": 5.33331298828125, + "width": 362, + "height": 30 + }, + "depth": 39, + "parentIndex": 265, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "index": 269, + "value": "0%", + "enabled": true, + "ref": "e270" + }, + { + "rect": { + "x": -19, + "y": 32.33331298828125, + "width": 36, + "height": 3 + }, + "enabled": true, + "type": "Other", + "index": 270, + "hittable": false, + "depth": 40, + "parentIndex": 269, + "ref": "e271" + }, + { + "depth": 36, + "parentIndex": 260, + "enabled": true, + "hittable": false, + "index": 271, + "rect": { + "x": 20, + "y": 62.33331298828125, + "width": 362, + "height": 176 + }, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "ref": "e272" + }, + { + "rect": { + "x": 20, + "y": 62.33331298828125, + "width": 362, + "height": 176 + }, + "parentIndex": 271, + "hittable": false, + "type": "Other", + "depth": 37, + "index": 272, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "ref": "e273" + }, + { + "rect": { + "x": 20, + "y": 62.33331298828125, + "width": 362, + "height": 176 + }, + "depth": 38, + "type": "Other", + "hittable": false, + "index": 273, + "parentIndex": 272, + "enabled": true, + "ref": "e274" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "depth": 38, + "rect": { + "x": 20, + "y": 62.33331298828125, + "width": 362, + "height": 176 + }, + "hittable": false, + "index": 274, + "enabled": true, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 272, + "ref": "e275" + }, + { + "depth": 39, + "rect": { + "x": 20, + "y": 62.33331298828125, + "width": 362, + "height": 176 + }, + "hittable": false, + "type": "TextView", + "index": 275, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "parentIndex": 274, + "ref": "e276" + }, + { + "value": "0%", + "index": 276, + "type": "Other", + "hittable": false, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "y": 62.33331298828125, + "width": 30, + "height": 176 + }, + "enabled": true, + "parentIndex": 274, + "ref": "e277" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "x": 376, + "y": 23.33331298828125, + "width": 3, + "height": 36 + }, + "index": 277, + "parentIndex": 276, + "depth": 40, + "ref": "e278" + }, + { + "parentIndex": 274, + "depth": 39, + "index": 278, + "value": "0%", + "hittable": false, + "enabled": true, + "rect": { + "x": 20, + "y": 205.33331298828125, + "width": 362, + "height": 30 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "ref": "e279" + }, + { + "hittable": false, + "index": 279, + "type": "Other", + "rect": { + "x": -19, + "y": 232.33331298828125, + "width": 36, + "height": 3 + }, + "depth": 40, + "parentIndex": 278, + "enabled": true, + "ref": "e280" + }, + { + "label": "(end of synthetic stream)", + "hittable": false, + "index": 280, + "parentIndex": 260, + "type": "Other", + "enabled": true, + "rect": { + "x": 20, + "y": 262.33331298828125, + "width": 362, + "height": 22 + }, + "depth": 36, + "ref": "e281" + }, + { + "type": "Other", + "label": "(end of synthetic stream)", + "hittable": false, + "depth": 37, + "rect": { + "x": 20, + "y": 262.33331298828125, + "width": 362, + "height": 22 + }, + "parentIndex": 280, + "enabled": true, + "index": 281, + "ref": "e282" + }, + { + "rect": { + "x": 20, + "y": 262.33331298828125, + "width": 362, + "height": 22 + }, + "parentIndex": 281, + "depth": 38, + "index": 282, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e283" + }, + { + "label": "(end of synthetic stream)", + "value": "(end of synthetic stream)", + "parentIndex": 281, + "enabled": true, + "hittable": false, + "rect": { + "x": 20, + "y": 262.33331298828125, + "width": 362, + "height": 22 + }, + "depth": 38, + "index": 283, + "type": "TextView", + "ref": "e284" + }, + { + "label": "(end of synthetic stream)", + "type": "TextView", + "index": 284, + "enabled": true, + "hittable": false, + "parentIndex": 283, + "rect": { + "x": 20, + "y": 262.33331298828125, + "width": 183.234375, + "height": 22 + }, + "depth": 39, + "ref": "e285" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 39, + "parentIndex": 283, + "label": "Vertical scroll bar, 1 page", + "index": 285, + "rect": { + "x": 349, + "y": 262.33331298828125, + "width": 30, + "height": 22 + }, + "value": "0%", + "ref": "e286" + }, + { + "rect": { + "x": 376, + "y": 223.33331298828125, + "width": 3, + "height": 36 + }, + "enabled": true, + "hittable": false, + "parentIndex": 285, + "index": 286, + "depth": 40, + "type": "Other", + "ref": "e287" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "value": "0%", + "rect": { + "x": 20, + "y": 270.33331298828125, + "width": 362, + "height": 11 + }, + "depth": 39, + "index": 287, + "parentIndex": 283, + "label": "Horizontal scroll bar, 1 page", + "ref": "e288" + }, + { + "parentIndex": 287, + "hittable": false, + "enabled": true, + "rect": { + "x": -19, + "y": 278.33331298828125, + "width": 36, + "height": 3 + }, + "index": 288, + "type": "Other", + "depth": 40, + "ref": "e289" + }, + { + "depth": 35, + "label": "Copy turn", + "rect": { + "x": 12, + "y": 296.33331298828125, + "width": 378, + "height": 67 + }, + "type": "Other", + "parentIndex": 73, + "enabled": true, + "index": 289, + "hittable": false, + "ref": "e290" + }, + { + "type": "Button", + "rect": { + "x": 16, + "y": 309.33331298828125, + "width": 22, + "height": 22 + }, + "hittable": false, + "label": "Copy turn", + "depth": 36, + "parentIndex": 289, + "index": 290, + "enabled": true, + "ref": "e291" + }, + { + "index": 291, + "depth": 36, + "enabled": true, + "rect": { + "x": 46, + "y": 309.33331298828125, + "width": 22, + "height": 22 + }, + "parentIndex": 289, + "label": "Fork chat from here", + "hittable": false, + "type": "Other", + "ref": "e292" + }, + { + "enabled": true, + "label": "Fork chat from here", + "hittable": false, + "rect": { + "x": 46, + "y": 309.33331298828125, + "width": 22, + "height": 22 + }, + "type": "Button", + "index": 292, + "identifier": "assistant-fork-menu-trigger", + "depth": 37, + "parentIndex": 291, + "ref": "e293" + }, + { + "parentIndex": 289, + "type": "Button", + "depth": 36, + "hittable": false, + "label": "Worked for 9s, ended 8:44 PM", + "rect": { + "x": 76, + "y": 312.6666462421417, + "width": 85.33332824707031, + "height": 15.666671752929688 + }, + "index": 293, + "enabled": true, + "ref": "e294" + }, + { + "depth": 33, + "hittable": false, + "value": "0%", + "rect": { + "x": 0, + "y": 163.99997965494794, + "width": 402, + "height": 30 + }, + "index": 294, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 71, + "enabled": true, + "type": "Other", + "ref": "e295" + }, + { + "type": "Other", + "rect": { + "x": 3, + "y": 163.99997965494794, + "width": 393, + "height": 3 + }, + "index": 295, + "enabled": true, + "hittable": false, + "parentIndex": 294, + "depth": 34, + "ref": "e296" + }, + { + "depth": 33, + "enabled": true, + "type": "Other", + "index": 296, + "parentIndex": 71, + "value": "0%", + "label": "Vertical scroll bar, 17 pages", + "hittable": false, + "rect": { + "x": 369, + "y": 160.99997965494794, + "width": 30, + "height": 202.33333333333331 + }, + "ref": "e297" + }, + { + "hittable": false, + "parentIndex": 296, + "type": "Other", + "enabled": true, + "depth": 34, + "index": 297, + "rect": { + "x": 396, + "y": 361.33331298828125, + "width": 3, + "height": 36 + }, + "ref": "e298" + }, + { + "value": "0%", + "parentIndex": 71, + "label": "Vertical scroll bar, 17 pages", + "type": "Other", + "index": 298, + "rect": { + "x": 369, + "y": 160.99997965494794, + "width": 30, + "height": 202.33333333333331 + }, + "depth": 33, + "enabled": true, + "hittable": false, + "ref": "e299" + }, + { + "rect": { + "x": 396, + "y": 361.33331298828125, + "width": 3, + "height": 36 + }, + "parentIndex": 298, + "index": 299, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 34, + "ref": "e300" + }, + { + "parentIndex": 71, + "value": "0%", + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "rect": { + "x": 0, + "y": 163.99997965494794, + "width": 402, + "height": 30 + }, + "depth": 33, + "index": 300, + "ref": "e301" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 300, + "type": "Other", + "rect": { + "x": 3, + "y": 163.99997965494794, + "width": 393, + "height": 3 + }, + "index": 301, + "depth": 34, + "ref": "e302" + }, + { + "type": "Other", + "enabled": true, + "index": 302, + "hittable": false, + "identifier": "composer-viewport-content", + "depth": 29, + "label": "Message agent...", + "parentIndex": 65, + "rect": { + "x": 0, + "y": 363.3333435058594, + "width": 402, + "height": 208.66668701171875 + }, + "ref": "e303" + }, + { + "type": "Other", + "rect": { + "x": 16, + "y": 363.3333435058594, + "width": 370, + "height": 158.66668701171875 + }, + "hittable": false, + "parentIndex": 302, + "index": 303, + "enabled": true, + "identifier": "message-input-root", + "depth": 30, + "ref": "e304" + }, + { + "rect": { + "x": 16, + "y": 363.3333435058594, + "width": 370, + "height": 158.66668701171875 + }, + "depth": 30, + "type": "Other", + "enabled": true, + "parentIndex": 302, + "hittable": false, + "index": 304, + "ref": "e305" + }, + { + "index": 305, + "type": "Other", + "parentIndex": 302, + "enabled": true, + "depth": 30, + "hittable": false, + "rect": { + "x": 29, + "y": 372.3333435058594, + "width": 344, + "height": 100.66668701171875 + }, + "label": "Message agent...", + "ref": "e306" + }, + { + "value": "x\nseventeen\neighteen\nnineteen\ntwenty", + "hittable": false, + "type": "TextView", + "rect": { + "x": 29, + "y": 372.3333435058594, + "width": 344, + "height": 100.66668701171875 + }, + "parentIndex": 305, + "depth": 31, + "label": "Message agent...", + "enabled": true, + "index": 306, + "ref": "e307" + }, + { + "value": "0%", + "enabled": true, + "hittable": false, + "parentIndex": 306, + "type": "Other", + "label": "Vertical scroll bar, 2 pages", + "index": 307, + "rect": { + "x": 340, + "y": 372.3333435058594, + "width": 30, + "height": 100.66668701171875 + }, + "depth": 32, + "ref": "e308" + }, + { + "type": "Other", + "rect": { + "x": 367, + "y": 375.3333435058594, + "width": 3, + "height": 152 + }, + "hittable": false, + "parentIndex": 307, + "depth": 33, + "enabled": true, + "index": 308, + "ref": "e309" + }, + { + "rect": { + "x": 29, + "y": 440.000010172526, + "width": 344, + "height": 30 + }, + "hittable": false, + "value": "0%", + "type": "Other", + "enabled": true, + "index": 309, + "parentIndex": 306, + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "ref": "e310" + }, + { + "hittable": false, + "depth": 33, + "enabled": true, + "parentIndex": 309, + "type": "Other", + "rect": { + "x": 32, + "y": 467.000010172526, + "width": 338, + "height": 3 + }, + "index": 310, + "ref": "e311" + }, + { + "identifier": "message-input-attach-button", + "depth": 30, + "index": 311, + "enabled": true, + "hittable": false, + "type": "Button", + "label": "Add attachment", + "rect": { + "x": 23, + "y": 485.00000762939453, + "width": 28, + "height": 28 + }, + "parentIndex": 302, + "ref": "e312" + }, + { + "parentIndex": 302, + "type": "Other", + "depth": 30, + "label": "Select model (Ten second stream)", + "enabled": true, + "hittable": false, + "rect": { + "x": 51, + "y": 485.00000762939453, + "width": 232, + "height": 28 + }, + "index": 312, + "ref": "e313" + }, + { + "index": 313, + "label": "Select model (Ten second stream)", + "rect": { + "x": 51, + "y": 485.00000762939453, + "width": 202, + "height": 28 + }, + "parentIndex": 312, + "hittable": false, + "type": "Button", + "depth": 31, + "identifier": "combined-model-selector", + "enabled": true, + "ref": "e314" + }, + { + "hittable": false, + "identifier": "context-window-meter", + "type": "Image", + "index": 314, + "rect": { + "x": 283, + "y": 485.00000762939453, + "width": 28, + "height": 28 + }, + "enabled": true, + "depth": 30, + "parentIndex": 302, + "label": "Context window 3% used", + "ref": "e315" + }, + { + "type": "Button", + "parentIndex": 302, + "enabled": true, + "rect": { + "x": 315, + "y": 485.00000762939453, + "width": 28, + "height": 28 + }, + "label": "Start dictation", + "hittable": false, + "depth": 30, + "index": 315, + "ref": "e316" + }, + { + "type": "Button", + "depth": 30, + "index": 316, + "hittable": false, + "rect": { + "x": 351, + "y": 485.00000762939453, + "width": 28, + "height": 28 + }, + "parentIndex": 302, + "label": "Send message", + "enabled": true, + "ref": "e317" + }, + { + "enabled": true, + "depth": 11, + "hittable": false, + "type": "Other", + "index": 317, + "parentIndex": 16, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "ref": "e318" + }, + { + "depth": 7, + "parentIndex": 10, + "index": 318, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e319" + }, + { + "depth": 8, + "parentIndex": 318, + "index": 319, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e320" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "index": 320, + "parentIndex": 319, + "depth": 9, + "ref": "e321" + }, + { + "index": 321, + "parentIndex": 0, + "hittable": false, + "type": "Window", + "depth": 1, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "enabled": true, + "ref": "e322" + }, + { + "depth": 2, + "type": "Other", + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "index": 322, + "parentIndex": 321, + "ref": "e323" + }, + { + "hittable": false, + "index": 323, + "enabled": true, + "parentIndex": 322, + "depth": 3, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "type": "Other", + "ref": "e324" + }, + { + "index": 324, + "enabled": true, + "parentIndex": 322, + "type": "Other", + "rect": { + "height": 336, + "x": 0, + "y": 538, + "width": 402 + }, + "depth": 3, + "hittable": false, + "ref": "e325" + }, + { + "parentIndex": 324, + "rect": { + "height": 278, + "x": 0, + "y": 538, + "width": 402 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 325, + "depth": 4, + "ref": "e326" + }, + { + "hittable": true, + "enabled": true, + "parentIndex": 0, + "index": 326, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "label": "Emoji", + "type": "Window", + "depth": 1, + "ref": "e327" + }, + { + "depth": 2, + "parentIndex": 326, + "type": "Other", + "hittable": true, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "label": "Emoji", + "enabled": true, + "index": 327, + "ref": "e328" + }, + { + "label": "Emoji", + "parentIndex": 327, + "enabled": true, + "index": 328, + "depth": 3, + "rect": { + "height": 336, + "x": 0, + "y": 538, + "width": 402 + }, + "type": "Other", + "hittable": true, + "ref": "e329" + }, + { + "enabled": true, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "parentIndex": 328, + "index": 329, + "hittable": false, + "depth": 4, + "type": "Other", + "ref": "e330" + }, + { + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 330, + "depth": 5, + "parentIndex": 329, + "ref": "e331" + }, + { + "parentIndex": 330, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "depth": 6, + "index": 331, + "ref": "e332" + }, + { + "label": "Typing Predictions", + "parentIndex": 328, + "identifier": "SystemInputAssistantView", + "index": 332, + "hittable": true, + "depth": 4, + "type": "Other", + "enabled": true, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "ref": "e333" + }, + { + "depth": 5, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "label": "Typing Predictions", + "type": "Other", + "parentIndex": 332, + "enabled": true, + "index": 333, + "hittable": true, + "ref": "e334" + }, + { + "enabled": true, + "identifier": "CenterPageView", + "type": "Other", + "depth": 6, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "hittable": true, + "parentIndex": 333, + "index": 334, + "label": "Typing Predictions", + "ref": "e335" + }, + { + "type": "Other", + "rect": { + "height": 1245, + "x": 0, + "y": -62, + "width": 402 + }, + "index": 335, + "parentIndex": 334, + "depth": 7, + "hittable": false, + "enabled": true, + "ref": "e336" + }, + { + "depth": 8, + "enabled": true, + "hittable": false, + "type": "ScrollView", + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "index": 336, + "parentIndex": 335, + "ref": "e337" + }, + { + "label": "Typing Predictions", + "index": 337, + "type": "Other", + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "hittable": true, + "depth": 7, + "parentIndex": 334, + "enabled": true, + "ref": "e338" + }, + { + "label": "Typing Predictions", + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "hittable": true, + "type": "Other", + "index": 338, + "parentIndex": 337, + "enabled": true, + "depth": 8, + "ref": "e339" + }, + { + "parentIndex": 338, + "enabled": true, + "type": "Other", + "depth": 9, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "hittable": true, + "label": "can", + "index": 339, + "ref": "e340" + }, + { + "type": "Other", + "index": 340, + "depth": 10, + "hittable": true, + "parentIndex": 339, + "label": "can", + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 402 + }, + "enabled": true, + "ref": "e341" + }, + { + "type": "Other", + "enabled": true, + "label": "can", + "index": 341, + "hittable": true, + "rect": { + "height": 45, + "x": 0, + "y": 538, + "width": 134 + }, + "parentIndex": 340, + "depth": 11, + "ref": "e342" + }, + { + "enabled": true, + "hittable": true, + "parentIndex": 340, + "type": "Other", + "depth": 11, + "rect": { + "height": 45, + "x": 134, + "y": 538, + "width": 134 + }, + "index": 342, + "ref": "e343" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "height": 45, + "x": 268, + "y": 538, + "width": 134 + }, + "hittable": true, + "parentIndex": 340, + "depth": 11, + "index": 343, + "ref": "e344" + }, + { + "depth": 4, + "parentIndex": 328, + "enabled": true, + "type": "Other", + "rect": { + "height": 233, + "x": 0, + "y": 583, + "width": 402 + }, + "index": 344, + "hittable": false, + "ref": "e345" + }, + { + "hittable": false, + "index": 345, + "depth": 5, + "parentIndex": 344, + "type": "Other", + "enabled": true, + "rect": { + "height": 291, + "x": 0, + "y": 583, + "width": 402 + }, + "ref": "e346" + }, + { + "type": "Other", + "index": 346, + "enabled": true, + "parentIndex": 345, + "hittable": false, + "rect": { + "height": 291, + "x": 0, + "y": 583, + "width": 402 + }, + "depth": 6, + "ref": "e347" + }, + { + "depth": 7, + "enabled": true, + "index": 347, + "parentIndex": 346, + "type": "Other", + "rect": { + "height": 291, + "x": 0, + "y": 583, + "width": 402 + }, + "hittable": false, + "ref": "e348" + }, + { + "enabled": true, + "label": "q", + "type": "Other", + "index": 348, + "depth": 4, + "parentIndex": 328, + "hittable": false, + "rect": { + "height": 233, + "x": 0, + "y": 583, + "width": 402 + }, + "ref": "e349" + }, + { + "parentIndex": 348, + "hittable": false, + "type": "Keyboard", + "label": "q", + "depth": 5, + "enabled": true, + "index": 349, + "rect": { + "height": 233, + "x": 0, + "y": 583, + "width": 402 + }, + "ref": "e350" + }, + { + "rect": { + "height": 233, + "x": 0, + "y": 583, + "width": 402 + }, + "parentIndex": 349, + "type": "Other", + "enabled": true, + "index": 350, + "depth": 6, + "hittable": false, + "label": "q", + "ref": "e351" + }, + { + "label": "q", + "rect": { + "height": 233, + "x": 0, + "y": 583, + "width": 402 + }, + "enabled": true, + "parentIndex": 350, + "hittable": false, + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "index": 351, + "type": "Other", + "ref": "e352" + }, + { + "index": 352, + "depth": 8, + "type": "Key", + "parentIndex": 351, + "rect": { + "height": 46, + "x": 0, + "y": 590, + "width": 40.333333333333336 + }, + "enabled": true, + "label": "q", + "hittable": false, + "ref": "e353" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 351, + "label": "w", + "rect": { + "height": 46, + "x": 40.333333333333336, + "y": 590, + "width": 40.00000000000001 + }, + "depth": 8, + "index": 353, + "type": "Key", + "ref": "e354" + }, + { + "type": "Key", + "enabled": true, + "depth": 8, + "parentIndex": 351, + "label": "e", + "rect": { + "height": 46, + "x": 80.33333333333334, + "y": 590, + "width": 40.33333333333334 + }, + "hittable": false, + "index": 354, + "ref": "e355" + }, + { + "enabled": true, + "index": 355, + "hittable": false, + "type": "Key", + "rect": { + "height": 46, + "x": 120.66666666666669, + "y": 590, + "width": 40 + }, + "depth": 8, + "parentIndex": 351, + "label": "r", + "ref": "e356" + }, + { + "rect": { + "height": 46, + "x": 160.66666666666669, + "y": 590, + "width": 40.33333333333334 + }, + "index": 356, + "depth": 8, + "parentIndex": 351, + "enabled": true, + "label": "t", + "hittable": false, + "type": "Key", + "ref": "e357" + }, + { + "parentIndex": 351, + "rect": { + "height": 46, + "x": 201.00000000000003, + "y": 590, + "width": 40.33333333333334 + }, + "hittable": false, + "label": "y", + "enabled": true, + "depth": 8, + "index": 357, + "type": "Key", + "ref": "e358" + }, + { + "label": "u", + "parentIndex": 351, + "rect": { + "height": 46, + "x": 241.33333333333337, + "y": 590, + "width": 40 + }, + "hittable": false, + "enabled": true, + "depth": 8, + "index": 358, + "type": "Key", + "ref": "e359" + }, + { + "hittable": false, + "rect": { + "height": 46, + "x": 281.33333333333337, + "y": 590, + "width": 40.333333333333314 + }, + "index": 359, + "type": "Key", + "label": "i", + "enabled": true, + "parentIndex": 351, + "depth": 8, + "ref": "e360" + }, + { + "type": "Key", + "label": "o", + "hittable": false, + "depth": 8, + "parentIndex": 351, + "index": 360, + "rect": { + "height": 46, + "x": 321.6666666666667, + "y": 590, + "width": 40 + }, + "enabled": true, + "ref": "e361" + }, + { + "depth": 8, + "enabled": true, + "index": 361, + "parentIndex": 351, + "hittable": false, + "rect": { + "height": 46, + "x": 361.6666666666667, + "y": 590, + "width": 40.333333333333314 + }, + "type": "Key", + "label": "p", + "ref": "e362" + }, + { + "label": "a", + "rect": { + "height": 46, + "x": 19.666666666666668, + "y": 644, + "width": 40.33333333333333 + }, + "hittable": false, + "enabled": true, + "depth": 8, + "type": "Key", + "index": 362, + "parentIndex": 351, + "ref": "e363" + }, + { + "rect": { + "height": 46, + "x": 60, + "y": 644, + "width": 40.33333333333334 + }, + "depth": 8, + "parentIndex": 351, + "hittable": false, + "enabled": true, + "type": "Key", + "label": "s", + "index": 363, + "ref": "e364" + }, + { + "hittable": false, + "type": "Key", + "rect": { + "height": 46, + "x": 100.33333333333334, + "y": 644, + "width": 40 + }, + "index": 364, + "label": "d", + "depth": 8, + "parentIndex": 351, + "enabled": true, + "ref": "e365" + }, + { + "index": 365, + "type": "Key", + "rect": { + "height": 46, + "x": 140.33333333333334, + "y": 644, + "width": 40.33333333333334 + }, + "label": "f", + "enabled": true, + "parentIndex": 351, + "depth": 8, + "hittable": false, + "ref": "e366" + }, + { + "label": "g", + "parentIndex": 351, + "rect": { + "height": 46, + "x": 181.2026666666667, + "y": 644, + "width": 40 + }, + "depth": 8, + "type": "Key", + "hittable": false, + "index": 366, + "enabled": true, + "ref": "e367" + }, + { + "index": 367, + "depth": 8, + "parentIndex": 351, + "hittable": false, + "label": "h", + "rect": { + "height": 46, + "x": 221.2026666666667, + "y": 644, + "width": 40.333333333333314 + }, + "enabled": true, + "type": "Key", + "ref": "e368" + }, + { + "rect": { + "height": 46, + "x": 261.536, + "y": 644, + "width": 40 + }, + "index": 368, + "type": "Key", + "label": "j", + "parentIndex": 351, + "depth": 8, + "hittable": false, + "enabled": true, + "ref": "e369" + }, + { + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 351, + "rect": { + "height": 46, + "x": 301.536, + "y": 644, + "width": 40.333333333333314 + }, + "type": "Key", + "index": 369, + "label": "k", + "ref": "e370" + }, + { + "label": "l", + "parentIndex": 351, + "type": "Key", + "hittable": false, + "rect": { + "height": 46, + "x": 341.8693333333333, + "y": 644, + "width": 40.333333333333314 + }, + "enabled": true, + "index": 370, + "depth": 8, + "ref": "e371" + }, + { + "identifier": "shift", + "depth": 8, + "index": 371, + "hittable": false, + "enabled": true, + "label": "shift", + "parentIndex": 351, + "type": "Button", + "rect": { + "height": 46, + "x": 0, + "y": 698, + "width": 51.333333333333336 + }, + "ref": "e372" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 351, + "index": 372, + "depth": 8, + "label": "z", + "type": "Key", + "rect": { + "height": 46, + "x": 60, + "y": 698, + "width": 40.33333333333334 + }, + "ref": "e373" + }, + { + "depth": 8, + "rect": { + "height": 46, + "x": 100.33333333333334, + "y": 698, + "width": 40 + }, + "parentIndex": 351, + "enabled": true, + "hittable": false, + "type": "Key", + "index": 373, + "label": "x", + "ref": "e374" + }, + { + "index": 374, + "parentIndex": 351, + "rect": { + "height": 46, + "x": 140.33333333333334, + "y": 698, + "width": 40.33333333333334 + }, + "label": "c", + "enabled": true, + "hittable": false, + "type": "Key", + "depth": 8, + "ref": "e375" + }, + { + "hittable": false, + "enabled": true, + "index": 375, + "label": "v", + "parentIndex": 351, + "type": "Key", + "rect": { + "height": 46, + "x": 181.2026666666667, + "y": 698, + "width": 40 + }, + "depth": 8, + "ref": "e376" + }, + { + "label": "b", + "parentIndex": 351, + "type": "Key", + "rect": { + "height": 46, + "x": 221.2026666666667, + "y": 698, + "width": 40.333333333333314 + }, + "depth": 8, + "index": 376, + "enabled": true, + "hittable": false, + "ref": "e377" + }, + { + "rect": { + "height": 46, + "x": 261.536, + "y": 698, + "width": 40 + }, + "type": "Key", + "label": "n", + "enabled": true, + "index": 377, + "parentIndex": 351, + "depth": 8, + "hittable": false, + "ref": "e378" + }, + { + "hittable": false, + "type": "Key", + "label": "m", + "enabled": true, + "rect": { + "height": 46, + "x": 301.536, + "y": 698, + "width": 40.333333333333314 + }, + "depth": 8, + "parentIndex": 351, + "index": 378, + "ref": "e379" + }, + { + "label": "delete", + "type": "Key", + "hittable": false, + "index": 379, + "identifier": "delete", + "depth": 8, + "parentIndex": 351, + "rect": { + "height": 46, + "x": 350.42133333333334, + "y": 698, + "width": 51.333333333333314 + }, + "enabled": true, + "ref": "e380" + }, + { + "label": "numbers", + "index": 380, + "depth": 8, + "enabled": true, + "identifier": "more", + "hittable": false, + "rect": { + "height": 46, + "x": 0, + "y": 752, + "width": 101 + }, + "parentIndex": 351, + "type": "Key", + "ref": "e381" + }, + { + "type": "Key", + "depth": 8, + "enabled": true, + "parentIndex": 351, + "index": 381, + "hittable": false, + "rect": { + "height": 46, + "x": 100.33333333333334, + "y": 752, + "width": 201.33333333333334 + }, + "label": "space", + "identifier": "space", + "ref": "e382" + }, + { + "parentIndex": 351, + "type": "Button", + "rect": { + "height": 46, + "x": 301.6666666666667, + "y": 752, + "width": 100.33333333333331 + }, + "identifier": "Return", + "enabled": true, + "label": "return", + "depth": 8, + "hittable": false, + "index": 382, + "ref": "e383" + }, + { + "label": "Emoji", + "type": "Other", + "depth": 4, + "hittable": true, + "enabled": true, + "parentIndex": 328, + "rect": { + "height": 291, + "x": 0, + "y": 583, + "width": 402 + }, + "index": 383, + "ref": "e384" + }, + { + "type": "Button", + "rect": { + "height": 68.73516393505099, + "x": 8.47726568115926, + "y": 805.6989567998571, + "width": 68.0852958475086 + }, + "index": 384, + "hittable": true, + "label": "Emoji", + "parentIndex": 383, + "enabled": true, + "depth": 5, + "ref": "e385" + }, + { + "depth": 6, + "type": "StaticText", + "hittable": false, + "parentIndex": 384, + "enabled": true, + "rect": { + "height": 0, + "x": 8.47726568115926, + "y": 805.6989567998571, + "width": 0 + }, + "index": 385, + "ref": "e386" + }, + { + "hittable": false, + "index": 386, + "identifier": "dictation", + "rect": { + "height": 68.73516393505099, + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 68.08529584750863 + }, + "parentIndex": 383, + "enabled": true, + "type": "Button", + "label": "Dictate", + "depth": 5, + "ref": "e387" + }, + { + "parentIndex": 386, + "enabled": true, + "rect": { + "height": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 0 + }, + "type": "StaticText", + "depth": 6, + "index": 387, + "hittable": false, + "ref": "e388" + }, + { + "rect": { + "height": 68.73516393505099, + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 68.08529584750863 + }, + "enabled": true, + "index": 388, + "hittable": true, + "depth": 5, + "type": "Button", + "label": "Dictate", + "parentIndex": 383, + "identifier": "dictation", + "ref": "e389" + }, + { + "index": 389, + "type": "StaticText", + "parentIndex": 388, + "rect": { + "height": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 0 + }, + "hittable": false, + "depth": 6, + "enabled": true, + "ref": "e390" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 390, + "totalNodeCount": 390, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 32, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 32 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 32 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776097 + } +} diff --git a/scroll-regression/ios/chat-content-dismissed.json b/scroll-regression/ios/chat-content-dismissed.json new file mode 100644 index 0000000000..1af47474e6 --- /dev/null +++ b/scroll-regression/ios/chat-content-dismissed.json @@ -0,0 +1,6455 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 0, + "enabled": true, + "type": "Application", + "label": "Paseo Debug", + "hittable": true, + "depth": 0, + "ref": "e1" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 0, + "index": 1, + "enabled": true, + "type": "Window", + "hittable": false, + "depth": 1, + "ref": "e2" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 1, + "index": 2, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 2, + "ref": "e3" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 2, + "index": 3, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 3, + "ref": "e4" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 3, + "index": 4, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 4, + "ref": "e5" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 0, + "index": 5, + "enabled": true, + "type": "Window", + "hittable": false, + "depth": 1, + "ref": "e6" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 5, + "index": 6, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 2, + "ref": "e7" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 6, + "index": 7, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 3, + "ref": "e8" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 7, + "index": 8, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 4, + "ref": "e9" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 8, + "index": 9, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 5, + "ref": "e10" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 9, + "index": 10, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 6, + "ref": "e11" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 10, + "index": 11, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 7, + "ref": "e12" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 11, + "index": 12, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 8, + "ref": "e13" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "index": 13, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 9, + "ref": "e14" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "index": 14, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 9, + "ref": "e15" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 14, + "index": 15, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 10, + "ref": "e16" + }, + { + "enabled": true, + "parentIndex": 14, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "depth": 10, + "index": 16, + "type": "Other", + "ref": "e17" + }, + { + "enabled": true, + "parentIndex": 16, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "hittable": false, + "depth": 11, + "index": 17, + "type": "Other", + "ref": "e18" + }, + { + "enabled": true, + "parentIndex": 16, + "type": "Other", + "hittable": false, + "index": 18, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 11, + "ref": "e19" + }, + { + "enabled": true, + "parentIndex": 18, + "type": "Other", + "hittable": false, + "index": 19, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 12, + "ref": "e20" + }, + { + "enabled": true, + "parentIndex": 19, + "type": "Other", + "hittable": false, + "index": 20, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 13, + "ref": "e21" + }, + { + "index": 21, + "depth": 14, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 20, + "enabled": true, + "type": "Other", + "ref": "e22" + }, + { + "index": 22, + "depth": 15, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 21, + "enabled": true, + "type": "Other", + "ref": "e23" + }, + { + "index": 23, + "depth": 16, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 22, + "enabled": true, + "type": "Other", + "ref": "e24" + }, + { + "index": 24, + "depth": 17, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 23, + "enabled": true, + "type": "Other", + "ref": "e25" + }, + { + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "depth": 18, + "type": "Other", + "index": 25, + "hittable": false, + "parentIndex": 24, + "enabled": true, + "ref": "e26" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 19, + "type": "Other", + "index": 26, + "hittable": false, + "parentIndex": 25, + "enabled": true, + "ref": "e27" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 20, + "type": "Other", + "index": 27, + "hittable": false, + "parentIndex": 26, + "enabled": true, + "ref": "e28" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "label": "Switch tabs (1 open)", + "depth": 21, + "type": "Other", + "index": 28, + "hittable": false, + "parentIndex": 27, + "enabled": true, + "ref": "e29" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "depth": 22, + "type": "Other", + "index": 29, + "hittable": false, + "parentIndex": 28, + "enabled": true, + "ref": "e30" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "depth": 23, + "type": "Other", + "index": 30, + "hittable": false, + "parentIndex": 29, + "enabled": true, + "ref": "e31" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "depth": 24, + "type": "Other", + "index": 31, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "hittable": false, + "parentIndex": 30, + "enabled": true, + "ref": "e32" + }, + { + "rect": { + "y": 0, + "height": 126, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "depth": 25, + "type": "Other", + "index": 32, + "identifier": "composer-dock-header", + "hittable": false, + "parentIndex": 31, + "enabled": true, + "ref": "e33" + }, + { + "depth": 26, + "index": 33, + "enabled": true, + "type": "Other", + "rect": { + "y": 70, + "height": 56, + "width": 402, + "x": 0 + }, + "hittable": false, + "parentIndex": 32, + "ref": "e34" + }, + { + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 8 + }, + "hittable": false, + "depth": 26, + "index": 34, + "parentIndex": 32, + "identifier": "menu-button", + "enabled": true, + "type": "Button", + "label": "Open menu", + "ref": "e35" + }, + { + "rect": { + "y": 80.6666669845581, + "height": 34, + "width": 314, + "x": 48 + }, + "depth": 26, + "parentIndex": 32, + "index": 35, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "main", + "ref": "e36" + }, + { + "rect": { + "y": 80.6666669845581, + "height": 34, + "width": 278, + "x": 48 + }, + "parentIndex": 35, + "index": 36, + "type": "Other", + "depth": 27, + "enabled": true, + "hittable": false, + "label": "main", + "ref": "e37" + }, + { + "rect": { + "y": 80.6666669845581, + "height": 18, + "width": 278, + "x": 48 + }, + "parentIndex": 36, + "identifier": "workspace-header-title", + "index": 37, + "type": "StaticText", + "depth": 28, + "enabled": true, + "label": "main", + "hittable": false, + "ref": "e38" + }, + { + "rect": { + "y": 80.6666669845581, + "height": 18, + "width": 278, + "x": 48 + }, + "type": "StaticText", + "enabled": true, + "depth": 29, + "index": 38, + "hittable": false, + "parentIndex": 37, + "label": "main", + "ref": "e39" + }, + { + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 163.3333282470703, + "x": 48 + }, + "identifier": "workspace-header-subtitle", + "type": "StaticText", + "enabled": true, + "depth": 28, + "index": 39, + "hittable": false, + "parentIndex": 36, + "label": "composer-dock-ios-fixture", + "ref": "e40" + }, + { + "parentIndex": 39, + "depth": 29, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 163.3333282470703, + "x": 48 + }, + "hittable": false, + "index": 40, + "label": "composer-dock-ios-fixture", + "enabled": true, + "type": "StaticText", + "ref": "e41" + }, + { + "parentIndex": 36, + "depth": 28, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4, + "x": 217.3333282470703 + }, + "hittable": false, + "index": 41, + "label": "·", + "enabled": true, + "type": "StaticText", + "ref": "e42" + }, + { + "parentIndex": 41, + "depth": 29, + "rect": { + "width": 4, + "y": 98.6666669845581, + "x": 217.3333282470703, + "height": 15.666671752929688 + }, + "hittable": false, + "index": 42, + "label": "·", + "enabled": true, + "type": "StaticText", + "ref": "e43" + }, + { + "index": 43, + "hittable": false, + "depth": 28, + "type": "Other", + "rect": { + "width": 68.00001525878906, + "y": 98.6666669845581, + "x": 227.3333282470703, + "height": 16 + }, + "enabled": true, + "parentIndex": 36, + "label": "dev-new", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "ref": "e44" + }, + { + "hittable": false, + "index": 44, + "depth": 28, + "type": "Other", + "rect": { + "width": 12, + "height": 12, + "x": 227.3333282470703, + "y": 100.6666669845581 + }, + "enabled": true, + "parentIndex": 36, + "ref": "e45" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 44, + "index": 45, + "depth": 29, + "rect": { + "width": 11, + "height": 11, + "x": 227.8333282470703, + "y": 101.1666669845581 + }, + "hittable": false, + "ref": "e46" + }, + { + "rect": { + "width": 11, + "height": 5, + "x": 227.8333282470703, + "y": 101.1666669845581 + }, + "enabled": true, + "depth": 30, + "type": "Other", + "parentIndex": 45, + "index": 46, + "hittable": false, + "ref": "e47" + }, + { + "type": "Other", + "parentIndex": 45, + "enabled": true, + "rect": { + "width": 11, + "height": 5, + "x": 227.8333282470703, + "y": 107.1666669845581 + }, + "index": 47, + "hittable": false, + "depth": 30, + "ref": "e48" + }, + { + "type": "Other", + "parentIndex": 45, + "enabled": true, + "rect": { + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703, + "y": 103.1666669845581 + }, + "index": 48, + "hittable": false, + "depth": 30, + "ref": "e49" + }, + { + "type": "Other", + "parentIndex": 45, + "enabled": true, + "rect": { + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703, + "y": 109.1666669845581 + }, + "index": 49, + "hittable": false, + "depth": 30, + "ref": "e50" + }, + { + "enabled": true, + "type": "StaticText", + "label": "dev-new", + "parentIndex": 36, + "rect": { + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703, + "y": 98.6666669845581 + }, + "hittable": false, + "depth": 28, + "index": 50, + "ref": "e51" + }, + { + "type": "StaticText", + "depth": 29, + "parentIndex": 50, + "hittable": false, + "rect": { + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703, + "y": 98.6666669845581 + }, + "label": "dev-new", + "enabled": true, + "index": 51, + "ref": "e52" + }, + { + "type": "Button", + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "parentIndex": 35, + "hittable": false, + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 330 + }, + "label": "Workspace actions", + "enabled": true, + "index": 52, + "ref": "e53" + }, + { + "identifier": "workspace-explorer-toggle", + "index": 53, + "type": "Button", + "hittable": false, + "depth": 26, + "parentIndex": 32, + "enabled": true, + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 362 + }, + "label": "Open Explorer sidebar", + "ref": "e54" + }, + { + "index": 54, + "depth": 25, + "hittable": false, + "type": "Other", + "parentIndex": 31, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e55" + }, + { + "index": 55, + "depth": 25, + "hittable": false, + "type": "Other", + "parentIndex": 31, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e56" + }, + { + "label": "Switch tabs (1 open)", + "index": 56, + "enabled": true, + "identifier": "workspace-tab-switcher-trigger", + "parentIndex": 31, + "rect": { + "y": 126, + "height": 34, + "width": 402, + "x": 0 + }, + "type": "Button", + "hittable": false, + "depth": 25, + "ref": "e57" + }, + { + "index": 57, + "enabled": true, + "identifier": "workspace-active-tab-icon", + "parentIndex": 56, + "rect": { + "x": 20, + "width": 14, + "height": 14, + "y": 136 + }, + "hittable": false, + "type": "Other", + "depth": 26, + "ref": "e58" + }, + { + "index": 58, + "enabled": true, + "identifier": "workspace-tabs-row", + "parentIndex": 31, + "rect": { + "x": 0, + "width": 402, + "height": 35, + "y": 126 + }, + "hittable": false, + "type": "Other", + "depth": 25, + "ref": "e59" + }, + { + "depth": 25, + "enabled": true, + "index": 59, + "type": "Other", + "parentIndex": 31, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "ref": "e60" + }, + { + "depth": 25, + "index": 60, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 31, + "ref": "e61" + }, + { + "depth": 26, + "index": 61, + "label": "Add attachment", + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 60, + "ref": "e62" + }, + { + "depth": 27, + "index": 62, + "parentIndex": 61, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "hittable": false, + "type": "Other", + "ref": "e63" + }, + { + "depth": 27, + "index": 63, + "parentIndex": 61, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "hittable": false, + "type": "Other", + "ref": "e64" + }, + { + "index": 64, + "identifier": "composer-viewport", + "depth": 27, + "type": "Other", + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "parentIndex": 61, + "ref": "e65" + }, + { + "parentIndex": 64, + "enabled": true, + "index": 65, + "label": "Message agent... Message, @files, /commands", + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "hittable": false, + "depth": 28, + "ref": "e66" + }, + { + "hittable": false, + "depth": 29, + "index": 66, + "parentIndex": 65, + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "identifier": "composer-dock-content", + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "ref": "e67" + }, + { + "hittable": false, + "depth": 30, + "index": 67, + "parentIndex": 66, + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "type": "Other", + "enabled": true, + "ref": "e68" + }, + { + "hittable": false, + "depth": 30, + "index": 68, + "parentIndex": 66, + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "ref": "e69" + }, + { + "hittable": false, + "depth": 31, + "index": 69, + "parentIndex": 68, + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "type": "Other", + "enabled": true, + "ref": "e70" + }, + { + "hittable": false, + "depth": 31, + "index": 70, + "parentIndex": 68, + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "identifier": "agent-chat-scroll", + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "ref": "e71" + }, + { + "rect": { + "x": 0, + "width": 402, + "height": 575, + "y": 161 + }, + "depth": 32, + "hittable": false, + "enabled": true, + "label": "Thinking", + "index": 71, + "parentIndex": 70, + "type": "ScrollView", + "ref": "e72" + }, + { + "rect": { + "x": 0, + "width": 402, + "height": 3379, + "y": -2643 + }, + "depth": 33, + "hittable": false, + "enabled": true, + "label": "Thinking", + "index": 72, + "parentIndex": 71, + "type": "Other", + "ref": "e73" + }, + { + "hittable": false, + "index": 73, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 3379, + "y": -2643 + }, + "depth": 34, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 72, + "ref": "e74" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "index": 74, + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -2643 + }, + "ref": "e75" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 74, + "index": 75, + "identifier": "older-history-slot", + "depth": 36, + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -2643 + }, + "ref": "e76" + }, + { + "enabled": true, + "hittable": false, + "depth": 35, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "height": 570, + "y": -2611 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 76, + "parentIndex": 73, + "ref": "e77" + }, + { + "hittable": false, + "index": 77, + "depth": 36, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 566, + "y": -2611 + }, + "type": "Other", + "parentIndex": 76, + "identifier": "assistant-message", + "ref": "e78" + }, + { + "hittable": false, + "index": 78, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 36, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -2599 + }, + "type": "Other", + "parentIndex": 76, + "ref": "e79" + }, + { + "depth": 37, + "hittable": false, + "parentIndex": 78, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -2599 + }, + "index": 79, + "enabled": true, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e80" + }, + { + "depth": 38, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -2599 + }, + "index": 80, + "enabled": true, + "type": "Other", + "parentIndex": 79, + "ref": "e81" + }, + { + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 38, + "parentIndex": 79, + "hittable": false, + "enabled": true, + "index": 81, + "type": "TextView", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e82" + }, + { + "index": 82, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -2599 + }, + "parentIndex": 81, + "hittable": false, + "enabled": true, + "type": "TextView", + "depth": 39, + "ref": "e83" + }, + { + "enabled": true, + "depth": 39, + "rect": { + "x": 349, + "width": 30, + "height": 242, + "y": -2599 + }, + "hittable": false, + "index": 83, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "parentIndex": 81, + "ref": "e84" + }, + { + "hittable": false, + "index": 84, + "parentIndex": 83, + "enabled": true, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -2638 + }, + "type": "Other", + "depth": 40, + "ref": "e85" + }, + { + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -2390 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 81, + "value": "0%", + "hittable": false, + "enabled": true, + "index": 85, + "ref": "e86" + }, + { + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -2363 + }, + "enabled": true, + "hittable": false, + "parentIndex": 85, + "type": "Other", + "index": 86, + "depth": 40, + "ref": "e87" + }, + { + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -2333 + }, + "index": 87, + "enabled": true, + "type": "Other", + "parentIndex": 76, + "depth": 36, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e88" + }, + { + "enabled": true, + "index": 88, + "parentIndex": 87, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -2333 + }, + "hittable": false, + "type": "Other", + "depth": 37, + "ref": "e89" + }, + { + "hittable": false, + "depth": 38, + "enabled": true, + "parentIndex": 88, + "index": 89, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -2333 + }, + "type": "Other", + "ref": "e90" + }, + { + "parentIndex": 88, + "enabled": true, + "hittable": false, + "index": 90, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "depth": 38, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e91" + }, + { + "type": "TextView", + "parentIndex": 90, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -2333 + }, + "index": 91, + "enabled": true, + "hittable": false, + "depth": 39, + "ref": "e92" + }, + { + "type": "Other", + "enabled": true, + "value": "0%", + "index": 92, + "rect": { + "x": 349, + "width": 30, + "height": 264, + "y": -2333 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "parentIndex": 90, + "ref": "e93" + }, + { + "index": 93, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -2372 + }, + "hittable": false, + "depth": 40, + "parentIndex": 92, + "enabled": true, + "type": "Other", + "ref": "e94" + }, + { + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -2102 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "value": "0%", + "enabled": true, + "hittable": false, + "parentIndex": 90, + "index": 94, + "ref": "e95" + }, + { + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -2075 + }, + "index": 95, + "type": "Other", + "hittable": false, + "parentIndex": 94, + "depth": 40, + "enabled": true, + "ref": "e96" + }, + { + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -2041 + }, + "index": 96, + "enabled": true, + "depth": 35, + "label": "Thinking", + "parentIndex": 73, + "type": "Other", + "ref": "e97" + }, + { + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -2041 + }, + "enabled": true, + "hittable": false, + "identifier": "tool-call-badge", + "type": "Other", + "index": 97, + "parentIndex": 96, + "depth": 36, + "ref": "e98" + }, + { + "label": "Thinking", + "enabled": true, + "hittable": false, + "type": "Button", + "index": 98, + "parentIndex": 96, + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -2041 + }, + "ref": "e99" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -2009 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 99, + "depth": 35, + "parentIndex": 73, + "ref": "e100" + }, + { + "type": "Other", + "hittable": false, + "index": 100, + "identifier": "tool-call-badge", + "parentIndex": 99, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -2009 + }, + "enabled": true, + "depth": 36, + "ref": "e101" + }, + { + "index": 101, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -2009 + }, + "hittable": false, + "type": "Button", + "depth": 36, + "enabled": true, + "parentIndex": 99, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "ref": "e102" + }, + { + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "height": 36, + "y": -1977 + }, + "label": "Search, scrollToEnd", + "type": "Other", + "enabled": true, + "index": 102, + "depth": 35, + "parentIndex": 73, + "ref": "e103" + }, + { + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1977 + }, + "parentIndex": 102, + "hittable": false, + "index": 103, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "ref": "e104" + }, + { + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1977 + }, + "parentIndex": 102, + "type": "Button", + "hittable": false, + "label": "Search, scrollToEnd", + "enabled": true, + "depth": 36, + "index": 104, + "ref": "e105" + }, + { + "index": 105, + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "height": 646, + "y": -1941 + }, + "type": "Other", + "depth": 35, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "ref": "e106" + }, + { + "parentIndex": 105, + "depth": 36, + "identifier": "assistant-message", + "rect": { + "x": 20, + "width": 362, + "height": 642, + "y": -1941 + }, + "type": "Other", + "hittable": false, + "index": 106, + "enabled": true, + "ref": "e107" + }, + { + "index": 107, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "depth": 36, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -1929 + }, + "parentIndex": 105, + "ref": "e108" + }, + { + "depth": 37, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "parentIndex": 107, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -1929 + }, + "hittable": false, + "index": 108, + "ref": "e109" + }, + { + "type": "Other", + "index": 109, + "parentIndex": 108, + "depth": 38, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -1929 + }, + "hittable": false, + "ref": "e110" + }, + { + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 110, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "parentIndex": 108, + "enabled": true, + "depth": 38, + "hittable": false, + "type": "TextView", + "ref": "e111" + }, + { + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -1929 + }, + "parentIndex": 110, + "enabled": true, + "type": "TextView", + "depth": 39, + "index": 111, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e112" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "index": 112, + "rect": { + "x": 349, + "width": 30, + "height": 132, + "y": -1929 + }, + "hittable": false, + "type": "Other", + "depth": 39, + "parentIndex": 110, + "ref": "e113" + }, + { + "hittable": false, + "parentIndex": 112, + "index": 113, + "depth": 40, + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -1968 + }, + "enabled": true, + "ref": "e114" + }, + { + "type": "Other", + "hittable": false, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -1830 + }, + "index": 114, + "parentIndex": 110, + "ref": "e115" + }, + { + "parentIndex": 114, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -1803 + }, + "hittable": false, + "index": 115, + "enabled": true, + "type": "Other", + "depth": 40, + "ref": "e116" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1769 + }, + "index": 116, + "parentIndex": 105, + "type": "StaticText", + "hittable": false, + "depth": 36, + "label": "•", + "enabled": true, + "ref": "e117" + }, + { + "enabled": true, + "depth": 37, + "label": "•", + "hittable": false, + "parentIndex": 116, + "type": "StaticText", + "index": 117, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1769 + }, + "ref": "e118" + }, + { + "index": 118, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 105, + "depth": 36, + "enabled": true, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1769 + }, + "type": "Other", + "ref": "e119" + }, + { + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1769 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 119, + "parentIndex": 118, + "hittable": false, + "depth": 37, + "type": "Other", + "ref": "e120" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1769 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 119, + "depth": 38, + "index": 120, + "ref": "e121" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "parentIndex": 119, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 121, + "enabled": true, + "depth": 38, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "type": "TextView", + "ref": "e122" + }, + { + "type": "TextView", + "depth": 39, + "parentIndex": 121, + "hittable": false, + "index": 122, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1769 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "ref": "e123" + }, + { + "value": "0%", + "depth": 39, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 123, + "enabled": true, + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -1769 + }, + "type": "Other", + "parentIndex": 121, + "ref": "e124" + }, + { + "hittable": false, + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -1808 + }, + "depth": 40, + "enabled": true, + "parentIndex": 123, + "type": "Other", + "index": 124, + "ref": "e125" + }, + { + "index": 125, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -1714 + }, + "enabled": true, + "type": "Other", + "parentIndex": 121, + "depth": 39, + "ref": "e126" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -1687 + }, + "hittable": false, + "index": 126, + "depth": 40, + "parentIndex": 125, + "type": "Other", + "enabled": true, + "ref": "e127" + }, + { + "index": 127, + "depth": 36, + "parentIndex": 105, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1677 + }, + "label": "•", + "enabled": true, + "hittable": false, + "type": "StaticText", + "ref": "e128" + }, + { + "type": "StaticText", + "index": 128, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1677 + }, + "parentIndex": 127, + "enabled": true, + "label": "•", + "depth": 37, + "hittable": false, + "ref": "e129" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 105, + "index": 129, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 36, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1677 + }, + "enabled": true, + "ref": "e130" + }, + { + "hittable": false, + "type": "Other", + "index": 130, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1677 + }, + "parentIndex": 129, + "depth": 37, + "enabled": true, + "ref": "e131" + }, + { + "enabled": true, + "parentIndex": 130, + "hittable": false, + "depth": 38, + "type": "Other", + "index": 131, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1677 + }, + "ref": "e132" + }, + { + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 38, + "parentIndex": 130, + "index": 132, + "ref": "e133" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1677 + }, + "type": "TextView", + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 39, + "parentIndex": 132, + "enabled": true, + "index": 133, + "ref": "e134" + }, + { + "hittable": false, + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -1677 + }, + "index": 134, + "type": "Other", + "parentIndex": 132, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "depth": 39, + "enabled": true, + "ref": "e135" + }, + { + "parentIndex": 134, + "hittable": false, + "depth": 40, + "index": 135, + "type": "Other", + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -1716 + }, + "enabled": true, + "ref": "e136" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -1622 + }, + "enabled": true, + "index": 136, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "value": "0%", + "ref": "e137" + }, + { + "parentIndex": 136, + "hittable": false, + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -1595 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "index": 137, + "ref": "e138" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1585 + }, + "index": 138, + "depth": 36, + "parentIndex": 105, + "label": "•", + "type": "StaticText", + "enabled": true, + "hittable": false, + "ref": "e139" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1585 + }, + "label": "•", + "enabled": true, + "type": "StaticText", + "index": 139, + "depth": 37, + "hittable": false, + "parentIndex": 138, + "ref": "e140" + }, + { + "enabled": true, + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 36, + "index": 140, + "parentIndex": 105, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1585 + }, + "ref": "e141" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "type": "Other", + "depth": 37, + "hittable": false, + "index": 141, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1585 + }, + "parentIndex": 140, + "ref": "e142" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1585 + }, + "enabled": true, + "depth": 38, + "index": 142, + "type": "Other", + "parentIndex": 141, + "hittable": false, + "ref": "e143" + }, + { + "depth": 38, + "parentIndex": 141, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 143, + "enabled": true, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "ref": "e144" + }, + { + "parentIndex": 143, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "enabled": true, + "index": 144, + "hittable": false, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -1585 + }, + "ref": "e145" + }, + { + "index": 145, + "depth": 39, + "type": "Other", + "value": "0%", + "enabled": true, + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -1585 + }, + "parentIndex": 143, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "ref": "e146" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "index": 146, + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -1624 + }, + "depth": 40, + "parentIndex": 145, + "ref": "e147" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -1530 + }, + "parentIndex": 143, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "index": 147, + "enabled": true, + "hittable": false, + "depth": 39, + "type": "Other", + "ref": "e148" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -1503 + }, + "depth": 40, + "enabled": true, + "index": 148, + "parentIndex": 147, + "type": "Other", + "hittable": false, + "ref": "e149" + }, + { + "index": 149, + "depth": 36, + "parentIndex": 105, + "hittable": false, + "label": "•", + "type": "StaticText", + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1493 + }, + "enabled": true, + "ref": "e150" + }, + { + "type": "StaticText", + "depth": 37, + "hittable": false, + "index": 150, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -1493 + }, + "label": "•", + "enabled": true, + "parentIndex": 149, + "ref": "e151" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 36, + "hittable": false, + "enabled": true, + "parentIndex": 105, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -1493 + }, + "index": 151, + "ref": "e152" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -1493 + }, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "Other", + "index": 152, + "parentIndex": 151, + "hittable": false, + "ref": "e153" + }, + { + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -1493 + }, + "enabled": true, + "type": "Other", + "parentIndex": 152, + "depth": 38, + "index": 153, + "ref": "e154" + }, + { + "type": "TextView", + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 152, + "hittable": false, + "depth": 38, + "index": 154, + "ref": "e155" + }, + { + "enabled": true, + "parentIndex": 154, + "index": 155, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -1493 + }, + "type": "TextView", + "depth": 39, + "ref": "e156" + }, + { + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 66, + "y": -1493 + }, + "parentIndex": 154, + "hittable": false, + "index": 156, + "type": "Other", + "enabled": true, + "depth": 39, + "ref": "e157" + }, + { + "parentIndex": 156, + "hittable": false, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -1532 + }, + "index": 157, + "type": "Other", + "enabled": true, + "ref": "e158" + }, + { + "parentIndex": 154, + "index": 158, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -1460 + }, + "value": "0%", + "type": "Other", + "depth": 39, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "ref": "e159" + }, + { + "index": 159, + "hittable": false, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -1433 + }, + "type": "Other", + "enabled": true, + "parentIndex": 158, + "ref": "e160" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "enabled": true, + "index": 160, + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -1411 + }, + "depth": 36, + "type": "Other", + "parentIndex": 105, + "ref": "e161" + }, + { + "depth": 37, + "hittable": false, + "index": 161, + "parentIndex": 160, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -1411 + }, + "ref": "e162" + }, + { + "depth": 38, + "hittable": false, + "index": 162, + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -1411 + }, + "enabled": true, + "type": "Other", + "parentIndex": 161, + "ref": "e163" + }, + { + "hittable": false, + "index": 163, + "enabled": true, + "depth": 38, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 161, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "type": "TextView", + "ref": "e164" + }, + { + "hittable": false, + "type": "TextView", + "depth": 39, + "index": 164, + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -1411 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "parentIndex": 163, + "ref": "e165" + }, + { + "index": 165, + "enabled": true, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "width": 30, + "height": 88, + "y": -1411 + }, + "type": "Other", + "parentIndex": 163, + "value": "0%", + "hittable": false, + "ref": "e166" + }, + { + "parentIndex": 165, + "depth": 40, + "index": 166, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -1450 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e167" + }, + { + "type": "Other", + "parentIndex": 163, + "depth": 39, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -1356 + }, + "index": 167, + "enabled": true, + "ref": "e168" + }, + { + "index": 168, + "type": "Other", + "parentIndex": 167, + "hittable": false, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -1329 + }, + "depth": 40, + "enabled": true, + "ref": "e169" + }, + { + "enabled": true, + "index": 169, + "hittable": false, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 73, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -1295 + }, + "depth": 35, + "ref": "e170" + }, + { + "enabled": true, + "depth": 36, + "type": "Other", + "parentIndex": 169, + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1295 + }, + "index": 170, + "hittable": false, + "ref": "e171" + }, + { + "hittable": false, + "index": 171, + "type": "Button", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 36, + "parentIndex": 169, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1295 + }, + "enabled": true, + "ref": "e172" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "x": 12, + "width": 378, + "height": 36, + "y": -1263 + }, + "type": "Other", + "index": 172, + "parentIndex": 73, + "enabled": true, + "hittable": false, + "depth": 35, + "ref": "e173" + }, + { + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1263 + }, + "type": "Other", + "depth": 36, + "index": 173, + "hittable": false, + "parentIndex": 172, + "enabled": true, + "identifier": "tool-call-badge", + "ref": "e174" + }, + { + "index": 174, + "type": "Button", + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -1263 + }, + "depth": 36, + "enabled": true, + "parentIndex": 172, + "ref": "e175" + }, + { + "rect": { + "x": 12, + "width": 378, + "height": 570, + "y": -1227 + }, + "index": 175, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "enabled": true, + "depth": 35, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e176" + }, + { + "index": 176, + "enabled": true, + "parentIndex": 175, + "hittable": false, + "depth": 36, + "rect": { + "x": 20, + "width": 362, + "height": 566, + "y": -1227 + }, + "type": "Other", + "identifier": "assistant-message", + "ref": "e177" + }, + { + "type": "Other", + "enabled": true, + "depth": 36, + "index": 177, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -1215 + }, + "parentIndex": 175, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e178" + }, + { + "parentIndex": 177, + "index": 178, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -1215 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 37, + "ref": "e179" + }, + { + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -1215 + }, + "index": 179, + "depth": 38, + "hittable": false, + "type": "Other", + "parentIndex": 178, + "ref": "e180" + }, + { + "index": 180, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "depth": 38, + "parentIndex": 178, + "type": "TextView", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "ref": "e181" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": -1215 + }, + "hittable": false, + "index": 181, + "parentIndex": 180, + "type": "TextView", + "depth": 39, + "ref": "e182" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "width": 30, + "height": 242, + "y": -1215 + }, + "parentIndex": 180, + "index": 182, + "depth": 39, + "enabled": true, + "type": "Other", + "hittable": false, + "value": "0%", + "ref": "e183" + }, + { + "parentIndex": 182, + "enabled": true, + "index": 183, + "depth": 40, + "hittable": false, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -1254 + }, + "type": "Other", + "ref": "e184" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "type": "Other", + "value": "0%", + "parentIndex": 180, + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -1006 + }, + "enabled": true, + "index": 184, + "ref": "e185" + }, + { + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -979 + }, + "enabled": true, + "depth": 40, + "index": 185, + "hittable": false, + "type": "Other", + "parentIndex": 184, + "ref": "e186" + }, + { + "enabled": true, + "parentIndex": 175, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 186, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -949 + }, + "type": "Other", + "depth": 36, + "ref": "e187" + }, + { + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -949 + }, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "index": 187, + "depth": 37, + "parentIndex": 186, + "ref": "e188" + }, + { + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -949 + }, + "parentIndex": 187, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 188, + "ref": "e189" + }, + { + "index": 189, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 187, + "hittable": false, + "depth": 38, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "enabled": true, + "ref": "e190" + }, + { + "depth": 39, + "enabled": true, + "index": 190, + "type": "TextView", + "parentIndex": 189, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 264, + "y": -949 + }, + "ref": "e191" + }, + { + "rect": { + "x": 349, + "width": 30, + "height": 264, + "y": -949 + }, + "type": "Other", + "index": 191, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "parentIndex": 189, + "depth": 39, + "value": "0%", + "ref": "e192" + }, + { + "parentIndex": 191, + "index": 192, + "enabled": true, + "depth": 40, + "type": "Other", + "hittable": false, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -988 + }, + "ref": "e193" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -718 + }, + "type": "Other", + "enabled": true, + "value": "0%", + "index": 193, + "hittable": false, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 189, + "ref": "e194" + }, + { + "index": 194, + "hittable": false, + "enabled": true, + "depth": 40, + "parentIndex": 193, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -691 + }, + "type": "Other", + "ref": "e195" + }, + { + "hittable": false, + "label": "Thinking", + "index": 195, + "parentIndex": 73, + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -657 + }, + "type": "Other", + "enabled": true, + "depth": 35, + "ref": "e196" + }, + { + "identifier": "tool-call-badge", + "enabled": true, + "type": "Other", + "index": 196, + "parentIndex": 195, + "depth": 36, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -657 + }, + "ref": "e197" + }, + { + "enabled": true, + "label": "Thinking", + "type": "Button", + "index": 197, + "parentIndex": 195, + "depth": 36, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -657 + }, + "ref": "e198" + }, + { + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": -625 + }, + "index": 198, + "type": "Other", + "parentIndex": 73, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "enabled": true, + "ref": "e199" + }, + { + "type": "Other", + "enabled": true, + "depth": 36, + "index": 199, + "identifier": "tool-call-badge", + "hittable": false, + "parentIndex": 198, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -625 + }, + "ref": "e200" + }, + { + "index": 200, + "depth": 36, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "type": "Button", + "hittable": false, + "parentIndex": 198, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -625 + }, + "enabled": true, + "ref": "e201" + }, + { + "hittable": false, + "label": "Search, scrollToEnd", + "depth": 35, + "parentIndex": 73, + "type": "Other", + "index": 201, + "rect": { + "x": 12, + "width": 378, + "height": 36, + "y": -593 + }, + "enabled": true, + "ref": "e202" + }, + { + "enabled": true, + "hittable": false, + "identifier": "tool-call-badge", + "index": 202, + "type": "Other", + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -593 + }, + "parentIndex": 201, + "ref": "e203" + }, + { + "parentIndex": 201, + "depth": 36, + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Button", + "index": 203, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": -593 + }, + "enabled": true, + "ref": "e204" + }, + { + "type": "Other", + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "hittable": false, + "index": 204, + "depth": 35, + "rect": { + "x": 12, + "width": 378, + "height": 646, + "y": -557 + }, + "ref": "e205" + }, + { + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 642, + "y": -557 + }, + "enabled": true, + "type": "Other", + "depth": 36, + "identifier": "assistant-message", + "parentIndex": 204, + "index": 205, + "ref": "e206" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "index": 206, + "parentIndex": 204, + "enabled": true, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -545 + }, + "depth": 36, + "ref": "e207" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -545 + }, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "index": 207, + "depth": 37, + "parentIndex": 206, + "enabled": true, + "ref": "e208" + }, + { + "parentIndex": 207, + "enabled": true, + "index": 208, + "type": "Other", + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -545 + }, + "hittable": false, + "ref": "e209" + }, + { + "enabled": true, + "hittable": false, + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "index": 209, + "depth": 38, + "parentIndex": 207, + "ref": "e210" + }, + { + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "height": 132, + "y": -545 + }, + "type": "TextView", + "parentIndex": 209, + "index": 210, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "enabled": true, + "ref": "e211" + }, + { + "rect": { + "x": 349, + "width": 30, + "height": 132, + "y": -545 + }, + "value": "0%", + "enabled": true, + "parentIndex": 209, + "hittable": false, + "index": 211, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "ref": "e212" + }, + { + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -584 + }, + "index": 212, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 211, + "depth": 40, + "ref": "e213" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": -446 + }, + "depth": 39, + "value": "0%", + "index": 213, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 209, + "ref": "e214" + }, + { + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": -419 + }, + "depth": 40, + "enabled": true, + "parentIndex": 213, + "type": "Other", + "hittable": false, + "index": 214, + "ref": "e215" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -385 + }, + "type": "StaticText", + "label": "•", + "enabled": true, + "index": 215, + "hittable": false, + "depth": 36, + "parentIndex": 204, + "ref": "e216" + }, + { + "hittable": false, + "parentIndex": 215, + "label": "•", + "index": 216, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -385 + }, + "type": "StaticText", + "enabled": true, + "depth": 37, + "ref": "e217" + }, + { + "depth": 36, + "type": "Other", + "parentIndex": 204, + "index": 217, + "enabled": true, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -385 + }, + "ref": "e218" + }, + { + "type": "Other", + "parentIndex": 217, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -385 + }, + "index": 218, + "depth": 37, + "ref": "e219" + }, + { + "depth": 38, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -385 + }, + "index": 219, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 218, + "ref": "e220" + }, + { + "depth": 38, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 220, + "type": "TextView", + "enabled": true, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 218, + "ref": "e221" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -385 + }, + "depth": 39, + "parentIndex": 220, + "hittable": false, + "type": "TextView", + "index": 221, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "ref": "e222" + }, + { + "index": 222, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "parentIndex": 220, + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -385 + }, + "depth": 39, + "hittable": false, + "ref": "e223" + }, + { + "parentIndex": 222, + "hittable": false, + "type": "Other", + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -424 + }, + "index": 223, + "depth": 40, + "enabled": true, + "ref": "e224" + }, + { + "value": "0%", + "index": 224, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -330 + }, + "hittable": false, + "enabled": true, + "parentIndex": 220, + "depth": 39, + "ref": "e225" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 224, + "depth": 40, + "hittable": false, + "index": 225, + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -303 + }, + "ref": "e226" + }, + { + "depth": 36, + "enabled": true, + "parentIndex": 204, + "index": 226, + "label": "•", + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -293 + }, + "type": "StaticText", + "hittable": false, + "ref": "e227" + }, + { + "index": 227, + "label": "•", + "depth": 37, + "hittable": false, + "type": "StaticText", + "enabled": true, + "parentIndex": 226, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -293 + }, + "ref": "e228" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -293 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 228, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 36, + "parentIndex": 204, + "ref": "e229" + }, + { + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -293 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "Other", + "depth": 37, + "parentIndex": 228, + "index": 229, + "ref": "e230" + }, + { + "index": 230, + "enabled": true, + "depth": 38, + "hittable": false, + "parentIndex": 229, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -293 + }, + "type": "Other", + "ref": "e231" + }, + { + "depth": 38, + "type": "TextView", + "hittable": false, + "enabled": true, + "parentIndex": 229, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 231, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e232" + }, + { + "enabled": true, + "depth": 39, + "type": "TextView", + "hittable": false, + "index": 232, + "parentIndex": 231, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -293 + }, + "ref": "e233" + }, + { + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -293 + }, + "depth": 39, + "parentIndex": 231, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "hittable": false, + "index": 233, + "ref": "e234" + }, + { + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -332 + }, + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 233, + "index": 234, + "ref": "e235" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -238 + }, + "enabled": true, + "hittable": false, + "index": 235, + "depth": 39, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "parentIndex": 231, + "ref": "e236" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -211 + }, + "hittable": false, + "index": 236, + "depth": 40, + "type": "Other", + "parentIndex": 235, + "enabled": true, + "ref": "e237" + }, + { + "enabled": true, + "label": "•", + "parentIndex": 204, + "type": "StaticText", + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -201 + }, + "index": 237, + "depth": 36, + "ref": "e238" + }, + { + "hittable": false, + "enabled": true, + "type": "StaticText", + "depth": 37, + "label": "•", + "parentIndex": 237, + "index": 238, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -201 + }, + "ref": "e239" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -201 + }, + "parentIndex": 204, + "type": "Other", + "depth": 36, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "hittable": false, + "index": 239, + "ref": "e240" + }, + { + "parentIndex": 239, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 240, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -201 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 37, + "ref": "e241" + }, + { + "parentIndex": 240, + "enabled": true, + "hittable": false, + "depth": 38, + "index": 241, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -201 + }, + "type": "Other", + "ref": "e242" + }, + { + "enabled": true, + "depth": 38, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 240, + "hittable": false, + "index": 242, + "type": "TextView", + "ref": "e243" + }, + { + "parentIndex": 242, + "depth": 39, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88, + "y": -201 + }, + "index": 243, + "type": "TextView", + "enabled": true, + "hittable": false, + "ref": "e244" + }, + { + "value": "0%", + "type": "Other", + "hittable": false, + "index": 244, + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 88, + "y": -201 + }, + "enabled": true, + "depth": 39, + "parentIndex": 242, + "label": "Vertical scroll bar, 1 page", + "ref": "e245" + }, + { + "index": 245, + "enabled": true, + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -240 + }, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 244, + "ref": "e246" + }, + { + "hittable": false, + "parentIndex": 242, + "depth": 39, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -146 + }, + "enabled": true, + "index": 246, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e247" + }, + { + "index": 247, + "type": "Other", + "parentIndex": 246, + "hittable": false, + "depth": 40, + "enabled": true, + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -119 + }, + "ref": "e248" + }, + { + "hittable": false, + "label": "•", + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -109 + }, + "parentIndex": 204, + "depth": 36, + "type": "StaticText", + "index": 248, + "enabled": true, + "ref": "e249" + }, + { + "depth": 37, + "parentIndex": 248, + "type": "StaticText", + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "height": 22, + "y": -109 + }, + "index": 249, + "label": "•", + "enabled": true, + "ref": "e250" + }, + { + "hittable": false, + "parentIndex": 204, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 250, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -109 + }, + "depth": 36, + "enabled": true, + "ref": "e251" + }, + { + "hittable": false, + "index": 251, + "type": "Other", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -109 + }, + "enabled": true, + "depth": 37, + "parentIndex": 250, + "ref": "e252" + }, + { + "index": 252, + "type": "Other", + "depth": 38, + "parentIndex": 251, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -109 + }, + "hittable": false, + "enabled": true, + "ref": "e253" + }, + { + "depth": 38, + "rect": { + "x": 0, + "width": 0, + "height": 0, + "y": 0 + }, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "index": 253, + "type": "TextView", + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 251, + "ref": "e254" + }, + { + "hittable": false, + "enabled": true, + "type": "TextView", + "depth": 39, + "index": 254, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 253, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 66, + "y": -109 + }, + "ref": "e255" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "width": 30, + "height": 66, + "y": -109 + }, + "parentIndex": 253, + "type": "Other", + "value": "0%", + "enabled": true, + "index": 255, + "ref": "e256" + }, + { + "type": "Other", + "parentIndex": 255, + "depth": 40, + "hittable": false, + "rect": { + "x": 376.00000063578284, + "width": 3, + "height": 36, + "y": -148 + }, + "enabled": true, + "index": 256, + "ref": "e257" + }, + { + "depth": 39, + "parentIndex": 253, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30, + "y": -76 + }, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "index": 257, + "value": "0%", + "type": "Other", + "ref": "e258" + }, + { + "index": 258, + "enabled": true, + "hittable": false, + "rect": { + "x": 2.333333969116211, + "width": 36, + "height": 3, + "y": -49 + }, + "type": "Other", + "depth": 40, + "parentIndex": 257, + "ref": "e259" + }, + { + "type": "Other", + "depth": 36, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -27 + }, + "parentIndex": 204, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 259, + "enabled": true, + "ref": "e260" + }, + { + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -27 + }, + "parentIndex": 259, + "depth": 37, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "index": 260, + "enabled": true, + "ref": "e261" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -27 + }, + "hittable": false, + "index": 261, + "enabled": true, + "parentIndex": 260, + "depth": 38, + "type": "Other", + "ref": "e262" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 61, + "y": 0 + }, + "enabled": true, + "hittable": false, + "parentIndex": 260, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "type": "TextView", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 262, + "ref": "e263" + }, + { + "type": "TextView", + "index": 263, + "enabled": true, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "height": 88, + "y": -27 + }, + "parentIndex": 262, + "ref": "e264" + }, + { + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "x": 349, + "width": 30, + "height": 88, + "y": -27 + }, + "parentIndex": 262, + "index": 264, + "hittable": false, + "type": "Other", + "value": "0%", + "enabled": true, + "ref": "e265" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": -66 + }, + "depth": 40, + "parentIndex": 264, + "enabled": true, + "index": 265, + "ref": "e266" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "index": 266, + "depth": 39, + "type": "Other", + "parentIndex": 262, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": 28 + }, + "value": "0%", + "ref": "e267" + }, + { + "hittable": false, + "index": 267, + "depth": 40, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": 55 + }, + "enabled": true, + "parentIndex": 266, + "type": "Other", + "ref": "e268" + }, + { + "rect": { + "x": 12, + "width": 378, + "height": 32, + "y": 89 + }, + "type": "Other", + "index": 268, + "parentIndex": 73, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "enabled": true, + "depth": 35, + "ref": "e269" + }, + { + "index": 269, + "parentIndex": 268, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": 89 + }, + "enabled": true, + "identifier": "tool-call-badge", + "depth": 36, + "type": "Other", + "hittable": false, + "ref": "e270" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": 89 + }, + "depth": 36, + "hittable": false, + "index": 270, + "type": "Button", + "parentIndex": 268, + "ref": "e271" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "type": "Other", + "depth": 35, + "index": 271, + "parentIndex": 73, + "rect": { + "x": 12, + "width": 378, + "height": 36, + "y": 121 + }, + "hittable": false, + "enabled": true, + "ref": "e272" + }, + { + "identifier": "tool-call-badge", + "parentIndex": 271, + "depth": 36, + "hittable": false, + "index": 272, + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": 121 + }, + "type": "Other", + "ref": "e273" + }, + { + "parentIndex": 271, + "hittable": false, + "index": 273, + "type": "Button", + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "height": 32, + "y": 121 + }, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 36, + "ref": "e274" + }, + { + "hittable": false, + "index": 274, + "rect": { + "x": 12, + "width": 378, + "height": 512, + "y": 157 + }, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "ref": "e275" + }, + { + "hittable": false, + "depth": 36, + "identifier": "assistant-message", + "rect": { + "x": 20, + "width": 362, + "height": 512, + "y": 157 + }, + "parentIndex": 274, + "enabled": true, + "type": "Other", + "index": 275, + "ref": "e276" + }, + { + "depth": 36, + "enabled": true, + "hittable": false, + "index": 276, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": 169 + }, + "parentIndex": 274, + "type": "Other", + "ref": "e277" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": 169 + }, + "parentIndex": 276, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "depth": 37, + "index": 277, + "hittable": false, + "enabled": true, + "ref": "e278" + }, + { + "type": "Other", + "parentIndex": 277, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": 169 + }, + "hittable": false, + "index": 278, + "enabled": true, + "ref": "e279" + }, + { + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 279, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": 169 + }, + "parentIndex": 277, + "hittable": false, + "ref": "e280" + }, + { + "enabled": true, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "height": 242, + "y": 169 + }, + "parentIndex": 279, + "hittable": false, + "index": 280, + "depth": 39, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "ref": "e281" + }, + { + "index": 281, + "rect": { + "x": 349, + "width": 30, + "height": 242, + "y": 169 + }, + "hittable": false, + "enabled": true, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 279, + "type": "Other", + "depth": 39, + "ref": "e282" + }, + { + "parentIndex": 281, + "depth": 40, + "hittable": false, + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": 130 + }, + "index": 282, + "enabled": true, + "ref": "e283" + }, + { + "hittable": false, + "index": 283, + "depth": 39, + "parentIndex": 279, + "value": "0%", + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": 378 + }, + "ref": "e284" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 283, + "hittable": false, + "index": 284, + "depth": 40, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": 405 + }, + "ref": "e285" + }, + { + "type": "Other", + "hittable": false, + "index": 285, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "rect": { + "x": 20, + "width": 362, + "height": 176, + "y": 435 + }, + "depth": 36, + "parentIndex": 274, + "enabled": true, + "ref": "e286" + }, + { + "type": "Other", + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "index": 286, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 176, + "y": 435 + }, + "depth": 37, + "parentIndex": 285, + "ref": "e287" + }, + { + "index": 287, + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "height": 176, + "y": 435 + }, + "depth": 38, + "parentIndex": 286, + "ref": "e288" + }, + { + "parentIndex": 286, + "rect": { + "x": 20, + "width": 362, + "height": 176, + "y": 435 + }, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "depth": 38, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "TextView", + "index": 288, + "ref": "e289" + }, + { + "index": 289, + "depth": 39, + "parentIndex": 288, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "height": 176, + "y": 435 + }, + "enabled": true, + "type": "TextView", + "ref": "e290" + }, + { + "rect": { + "x": 349, + "width": 30, + "height": 176, + "y": 435 + }, + "enabled": true, + "type": "Other", + "depth": 39, + "value": "0%", + "index": 290, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 288, + "ref": "e291" + }, + { + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": 396 + }, + "depth": 40, + "parentIndex": 290, + "enabled": true, + "hittable": false, + "index": 291, + "type": "Other", + "ref": "e292" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 30, + "y": 578 + }, + "enabled": true, + "type": "Other", + "depth": 39, + "index": 292, + "parentIndex": 288, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "ref": "e293" + }, + { + "hittable": false, + "depth": 40, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": 605 + }, + "index": 293, + "enabled": true, + "type": "Other", + "parentIndex": 292, + "ref": "e294" + }, + { + "label": "(end of synthetic stream)", + "enabled": true, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "height": 22, + "y": 635 + }, + "depth": 36, + "hittable": false, + "parentIndex": 274, + "index": 294, + "ref": "e295" + }, + { + "index": 295, + "label": "(end of synthetic stream)", + "rect": { + "x": 20, + "width": 362, + "height": 22, + "y": 635 + }, + "hittable": false, + "enabled": true, + "parentIndex": 294, + "depth": 37, + "type": "Other", + "ref": "e296" + }, + { + "parentIndex": 295, + "rect": { + "x": 20, + "width": 362, + "height": 22, + "y": 635 + }, + "enabled": true, + "hittable": false, + "depth": 38, + "type": "Other", + "index": 296, + "ref": "e297" + }, + { + "value": "(end of synthetic stream)", + "rect": { + "x": 20, + "width": 362, + "height": 22, + "y": 635 + }, + "parentIndex": 295, + "label": "(end of synthetic stream)", + "type": "TextView", + "hittable": false, + "index": 297, + "enabled": true, + "depth": 38, + "ref": "e298" + }, + { + "index": 298, + "type": "TextView", + "hittable": false, + "enabled": true, + "parentIndex": 297, + "rect": { + "x": 20, + "width": 183.234375, + "height": 22, + "y": 635 + }, + "depth": 39, + "label": "(end of synthetic stream)", + "ref": "e299" + }, + { + "rect": { + "x": 349, + "width": 30, + "height": 22, + "y": 635 + }, + "type": "Other", + "value": "0%", + "hittable": false, + "index": 299, + "depth": 39, + "enabled": true, + "parentIndex": 297, + "label": "Vertical scroll bar, 1 page", + "ref": "e300" + }, + { + "rect": { + "x": 376, + "width": 3, + "height": 36, + "y": 596 + }, + "index": 300, + "depth": 40, + "enabled": true, + "parentIndex": 299, + "type": "Other", + "hittable": false, + "ref": "e301" + }, + { + "rect": { + "x": 20, + "width": 362, + "height": 11, + "y": 643 + }, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "type": "Other", + "depth": 39, + "parentIndex": 297, + "value": "0%", + "index": 301, + "ref": "e302" + }, + { + "index": 302, + "parentIndex": 301, + "depth": 40, + "rect": { + "x": -19, + "width": 36, + "height": 3, + "y": 651 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e303" + }, + { + "depth": 35, + "hittable": false, + "label": "Copy turn", + "enabled": true, + "rect": { + "height": 67, + "width": 378, + "x": 12, + "y": 669 + }, + "parentIndex": 73, + "index": 303, + "type": "Other", + "ref": "e304" + }, + { + "depth": 36, + "hittable": false, + "label": "Copy turn", + "enabled": true, + "rect": { + "height": 22, + "width": 22, + "x": 16, + "y": 682 + }, + "parentIndex": 303, + "index": 304, + "type": "Button", + "ref": "e305" + }, + { + "label": "Fork chat from here", + "index": 305, + "rect": { + "height": 22, + "width": 22, + "x": 46, + "y": 682 + }, + "enabled": true, + "hittable": false, + "parentIndex": 303, + "type": "Other", + "depth": 36, + "ref": "e306" + }, + { + "label": "Fork chat from here", + "index": 306, + "rect": { + "height": 22, + "width": 22, + "x": 46, + "y": 682 + }, + "enabled": true, + "identifier": "assistant-fork-menu-trigger", + "hittable": false, + "type": "Button", + "parentIndex": 305, + "depth": 37, + "ref": "e307" + }, + { + "rect": { + "height": 15.666671752929688, + "width": 85.33332824707031, + "x": 76, + "y": 685.3333332538605 + }, + "hittable": false, + "depth": 36, + "parentIndex": 303, + "enabled": true, + "label": "Worked for 9s, ended 8:44 PM", + "type": "Button", + "index": 307, + "ref": "e308" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "type": "Other", + "depth": 33, + "index": 308, + "enabled": true, + "parentIndex": 71, + "rect": { + "height": 30, + "width": 402, + "x": 0, + "y": 466 + }, + "ref": "e309" + }, + { + "index": 309, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "height": 3, + "width": 393, + "x": 3, + "y": 466 + }, + "depth": 34, + "parentIndex": 308, + "ref": "e310" + }, + { + "hittable": false, + "rect": { + "height": 273, + "width": 30, + "x": 369, + "y": 463 + }, + "enabled": true, + "label": "Vertical scroll bar, 13 pages", + "parentIndex": 71, + "index": 310, + "depth": 33, + "type": "Other", + "value": "0%", + "ref": "e311" + }, + { + "depth": 34, + "type": "Other", + "index": 311, + "enabled": true, + "rect": { + "height": 45.33333333333337, + "width": 3, + "x": 396, + "y": 687.6666666666666 + }, + "parentIndex": 310, + "hittable": false, + "ref": "e312" + }, + { + "index": 312, + "enabled": true, + "parentIndex": 71, + "value": "0%", + "label": "Vertical scroll bar, 13 pages", + "hittable": false, + "type": "Other", + "depth": 33, + "rect": { + "height": 273, + "width": 30, + "x": 369, + "y": 463 + }, + "ref": "e313" + }, + { + "depth": 34, + "parentIndex": 312, + "type": "Other", + "rect": { + "height": 45.33333333333337, + "width": 3, + "x": 396, + "y": 687.6666666666666 + }, + "hittable": false, + "index": 313, + "enabled": true, + "ref": "e314" + }, + { + "value": "0%", + "index": 314, + "label": "Horizontal scroll bar, 1 page", + "depth": 33, + "rect": { + "height": 30, + "width": 402, + "x": 0, + "y": 466 + }, + "type": "Other", + "parentIndex": 71, + "enabled": true, + "hittable": false, + "ref": "e315" + }, + { + "type": "Other", + "rect": { + "height": 3, + "width": 393, + "x": 3, + "y": 466 + }, + "index": 315, + "hittable": false, + "enabled": true, + "depth": 34, + "parentIndex": 314, + "ref": "e316" + }, + { + "depth": 29, + "index": 316, + "enabled": true, + "type": "Other", + "identifier": "composer-viewport-content", + "label": "Message agent... Message, @files, /commands", + "hittable": false, + "rect": { + "height": 138, + "width": 402, + "x": 0, + "y": 736 + }, + "parentIndex": 65, + "ref": "e317" + }, + { + "hittable": false, + "parentIndex": 316, + "identifier": "message-input-root", + "rect": { + "height": 88, + "width": 370, + "x": 16, + "y": 736 + }, + "enabled": true, + "depth": 30, + "type": "Other", + "index": 317, + "ref": "e318" + }, + { + "index": 318, + "enabled": true, + "parentIndex": 316, + "hittable": false, + "depth": 30, + "rect": { + "height": 88, + "width": 370, + "x": 16, + "y": 736 + }, + "type": "Other", + "ref": "e319" + }, + { + "rect": { + "height": 30, + "width": 344, + "x": 29, + "y": 745 + }, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "index": 319, + "type": "Other", + "depth": 30, + "hittable": false, + "parentIndex": 316, + "ref": "e320" + }, + { + "type": "TextView", + "hittable": false, + "index": 320, + "enabled": true, + "depth": 31, + "parentIndex": 319, + "label": "Message agent... Message, @files, /commands", + "rect": { + "height": 30, + "width": 344, + "x": 29, + "y": 745 + }, + "ref": "e321" + }, + { + "hittable": false, + "depth": 32, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 320, + "type": "Other", + "index": 321, + "rect": { + "height": 30, + "width": 30, + "x": 340, + "y": 745 + }, + "value": "0%", + "enabled": true, + "ref": "e322" + }, + { + "depth": 33, + "enabled": true, + "parentIndex": 321, + "type": "Other", + "hittable": false, + "rect": { + "height": 31, + "width": 3, + "x": 367, + "y": 741 + }, + "index": 322, + "ref": "e323" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 323, + "depth": 32, + "enabled": true, + "rect": { + "height": 15, + "width": 344, + "x": 29, + "y": 757 + }, + "type": "Other", + "parentIndex": 320, + "ref": "e324" + }, + { + "rect": { + "height": 3, + "width": 338, + "x": 32, + "y": 769 + }, + "depth": 33, + "parentIndex": 323, + "hittable": false, + "index": 324, + "type": "Other", + "enabled": true, + "ref": "e325" + }, + { + "identifier": "message-input-attach-button", + "label": "Add attachment", + "index": 325, + "type": "Button", + "hittable": false, + "parentIndex": 316, + "rect": { + "height": 28, + "width": 28, + "x": 23, + "y": 787 + }, + "depth": 30, + "enabled": true, + "ref": "e326" + }, + { + "depth": 30, + "hittable": false, + "label": "Select model (Ten second stream)", + "index": 326, + "rect": { + "height": 28, + "width": 232, + "x": 51, + "y": 787 + }, + "type": "Other", + "enabled": true, + "parentIndex": 316, + "ref": "e327" + }, + { + "hittable": false, + "enabled": true, + "type": "Button", + "rect": { + "height": 28, + "width": 202, + "x": 51, + "y": 787 + }, + "depth": 31, + "parentIndex": 326, + "identifier": "combined-model-selector", + "label": "Select model (Ten second stream)", + "index": 327, + "ref": "e328" + }, + { + "label": "Context window 3% used", + "rect": { + "height": 28, + "width": 28, + "x": 283, + "y": 787 + }, + "enabled": true, + "identifier": "context-window-meter", + "hittable": false, + "index": 328, + "depth": 30, + "parentIndex": 316, + "type": "Image", + "ref": "e329" + }, + { + "parentIndex": 316, + "type": "Button", + "index": 329, + "rect": { + "height": 28, + "width": 28, + "x": 315, + "y": 787 + }, + "enabled": true, + "hittable": false, + "depth": 30, + "label": "Start dictation", + "ref": "e330" + }, + { + "enabled": true, + "depth": 30, + "type": "Button", + "hittable": false, + "label": "Enable Voice mode", + "index": 330, + "parentIndex": 316, + "rect": { + "height": 28, + "width": 28, + "x": 351, + "y": 787 + }, + "ref": "e331" + }, + { + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "enabled": true, + "index": 331, + "type": "Other", + "hittable": false, + "depth": 11, + "parentIndex": 16, + "ref": "e332" + }, + { + "hittable": false, + "index": 332, + "type": "Other", + "parentIndex": 10, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 7, + "enabled": true, + "ref": "e333" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 332, + "index": 333, + "depth": 8, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e334" + }, + { + "depth": 9, + "type": "Other", + "hittable": false, + "index": 334, + "parentIndex": 333, + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e335" + }, + { + "depth": 1, + "parentIndex": 0, + "enabled": true, + "hittable": false, + "index": 335, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "type": "Window", + "ref": "e336" + }, + { + "hittable": false, + "index": 336, + "type": "Other", + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 2, + "parentIndex": 335, + "ref": "e337" + }, + { + "parentIndex": 336, + "enabled": true, + "depth": 3, + "hittable": false, + "index": 337, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e338" + }, + { + "type": "Other", + "rect": { + "height": 336, + "width": 402, + "x": 0, + "y": 874 + }, + "hittable": false, + "index": 338, + "enabled": true, + "depth": 3, + "parentIndex": 336, + "ref": "e339" + }, + { + "depth": 4, + "rect": { + "height": 278, + "width": 402, + "x": 0, + "y": 874 + }, + "index": 339, + "type": "Other", + "parentIndex": 338, + "hittable": false, + "enabled": true, + "ref": "e340" + }, + { + "type": "Window", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "label": "Emoji", + "parentIndex": 0, + "hittable": true, + "depth": 1, + "enabled": true, + "index": 340, + "ref": "e341" + }, + { + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "hittable": true, + "index": 341, + "depth": 2, + "parentIndex": 340, + "type": "Other", + "label": "Emoji", + "ref": "e342" + }, + { + "rect": { + "height": 336, + "width": 402, + "x": 0, + "y": 874 + }, + "type": "Other", + "enabled": true, + "depth": 3, + "hittable": false, + "index": 342, + "label": "Emoji", + "parentIndex": 341, + "ref": "e343" + }, + { + "index": 343, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "depth": 4, + "type": "Other", + "enabled": true, + "parentIndex": 342, + "hittable": false, + "ref": "e344" + }, + { + "enabled": true, + "hittable": false, + "depth": 5, + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "parentIndex": 343, + "index": 344, + "ref": "e345" + }, + { + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "type": "Other", + "parentIndex": 344, + "hittable": false, + "enabled": true, + "depth": 6, + "index": 345, + "ref": "e346" + }, + { + "type": "Other", + "depth": 4, + "label": "Typing Predictions", + "hittable": false, + "index": 346, + "identifier": "SystemInputAssistantView", + "enabled": true, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "parentIndex": 342, + "ref": "e347" + }, + { + "type": "Other", + "depth": 5, + "index": 347, + "label": "Typing Predictions", + "parentIndex": 346, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "enabled": true, + "hittable": false, + "ref": "e348" + }, + { + "identifier": "CenterPageView", + "type": "Other", + "index": 348, + "depth": 6, + "hittable": false, + "parentIndex": 347, + "label": "Typing Predictions", + "enabled": true, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "ref": "e349" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 348, + "type": "Other", + "rect": { + "height": 1245, + "width": 402, + "x": 0, + "y": 274 + }, + "index": 349, + "depth": 7, + "ref": "e350" + }, + { + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "depth": 8, + "type": "ScrollView", + "hittable": false, + "index": 350, + "enabled": true, + "parentIndex": 349, + "ref": "e351" + }, + { + "parentIndex": 348, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "enabled": true, + "hittable": false, + "index": 351, + "type": "Other", + "depth": 7, + "label": "Typing Predictions", + "ref": "e352" + }, + { + "index": 352, + "type": "Other", + "hittable": false, + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "label": "Typing Predictions", + "enabled": true, + "depth": 8, + "parentIndex": 351, + "ref": "e353" + }, + { + "hittable": false, + "index": 353, + "enabled": true, + "depth": 9, + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "parentIndex": 352, + "ref": "e354" + }, + { + "enabled": true, + "parentIndex": 353, + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 874 + }, + "index": 354, + "depth": 10, + "hittable": false, + "ref": "e355" + }, + { + "rect": { + "height": 45, + "width": 134, + "x": 0, + "y": 874 + }, + "hittable": false, + "parentIndex": 354, + "depth": 11, + "enabled": true, + "type": "Other", + "index": 355, + "ref": "e356" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 134, + "x": 134, + "y": 874 + }, + "index": 356, + "enabled": true, + "depth": 11, + "parentIndex": 354, + "hittable": false, + "ref": "e357" + }, + { + "index": 357, + "rect": { + "height": 45, + "width": 134, + "x": 268, + "y": 874 + }, + "parentIndex": 354, + "hittable": false, + "type": "Other", + "depth": 11, + "enabled": true, + "ref": "e358" + }, + { + "index": 358, + "depth": 4, + "hittable": false, + "parentIndex": 342, + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 919 + }, + "type": "Other", + "enabled": true, + "ref": "e359" + }, + { + "parentIndex": 358, + "hittable": false, + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 919 + }, + "index": 359, + "depth": 5, + "type": "Other", + "enabled": true, + "ref": "e360" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 6, + "parentIndex": 359, + "index": 360, + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 919 + }, + "ref": "e361" + }, + { + "type": "Other", + "enabled": true, + "index": 361, + "parentIndex": 360, + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 919 + }, + "hittable": false, + "depth": 7, + "ref": "e362" + }, + { + "label": "q", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 919 + }, + "index": 362, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 4, + "parentIndex": 342, + "ref": "e363" + }, + { + "index": 363, + "type": "Keyboard", + "hittable": false, + "depth": 5, + "enabled": true, + "parentIndex": 362, + "label": "q", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 919 + }, + "ref": "e364" + }, + { + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 919 + }, + "type": "Other", + "hittable": false, + "depth": 6, + "label": "q", + "enabled": true, + "index": 364, + "parentIndex": 363, + "ref": "e365" + }, + { + "identifier": "UIKeyboardLayoutStar Preview", + "label": "q", + "type": "Other", + "hittable": false, + "depth": 7, + "index": 365, + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 919 + }, + "enabled": true, + "parentIndex": 364, + "ref": "e366" + }, + { + "parentIndex": 365, + "hittable": false, + "depth": 8, + "rect": { + "height": 46, + "width": 40.333333333333336, + "x": 0, + "y": 926 + }, + "label": "q", + "index": 366, + "type": "Key", + "enabled": true, + "ref": "e367" + }, + { + "index": 367, + "depth": 8, + "hittable": false, + "label": "w", + "enabled": true, + "rect": { + "height": 46, + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 926 + }, + "type": "Key", + "parentIndex": 365, + "ref": "e368" + }, + { + "label": "e", + "depth": 8, + "parentIndex": 365, + "type": "Key", + "hittable": false, + "index": 368, + "enabled": true, + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 926 + }, + "ref": "e369" + }, + { + "type": "Key", + "index": 369, + "hittable": false, + "label": "r", + "rect": { + "height": 46, + "width": 40, + "x": 120.66666666666669, + "y": 926 + }, + "depth": 8, + "parentIndex": 365, + "enabled": true, + "ref": "e370" + }, + { + "index": 370, + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 926 + }, + "depth": 8, + "hittable": false, + "enabled": true, + "type": "Key", + "parentIndex": 365, + "label": "t", + "ref": "e371" + }, + { + "depth": 8, + "parentIndex": 365, + "label": "y", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 926 + }, + "enabled": true, + "hittable": false, + "type": "Key", + "index": 371, + "ref": "e372" + }, + { + "hittable": false, + "depth": 8, + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 241.33333333333337, + "y": 926 + }, + "index": 372, + "enabled": true, + "label": "u", + "parentIndex": 365, + "ref": "e373" + }, + { + "index": 373, + "enabled": true, + "depth": 8, + "parentIndex": 365, + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 926 + }, + "label": "i", + "hittable": false, + "ref": "e374" + }, + { + "enabled": true, + "index": 374, + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 321.6666666666667, + "y": 926 + }, + "depth": 8, + "hittable": false, + "label": "o", + "parentIndex": 365, + "ref": "e375" + }, + { + "hittable": false, + "type": "Key", + "index": 375, + "label": "p", + "enabled": true, + "depth": 8, + "parentIndex": 365, + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 926 + }, + "ref": "e376" + }, + { + "parentIndex": 365, + "enabled": true, + "depth": 8, + "index": 376, + "hittable": false, + "rect": { + "height": 46, + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 980 + }, + "type": "Key", + "label": "a", + "ref": "e377" + }, + { + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 60, + "y": 980 + }, + "hittable": false, + "parentIndex": 365, + "index": 377, + "enabled": true, + "type": "Key", + "label": "s", + "depth": 8, + "ref": "e378" + }, + { + "depth": 8, + "index": 378, + "enabled": true, + "label": "d", + "type": "Key", + "parentIndex": 365, + "rect": { + "height": 46, + "width": 40, + "x": 100.33333333333334, + "y": 980 + }, + "hittable": false, + "ref": "e379" + }, + { + "type": "Key", + "label": "f", + "depth": 8, + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 980 + }, + "hittable": false, + "parentIndex": 365, + "enabled": true, + "index": 379, + "ref": "e380" + }, + { + "index": 380, + "type": "Key", + "label": "g", + "enabled": true, + "parentIndex": 365, + "depth": 8, + "rect": { + "height": 46, + "width": 40, + "x": 181.2026666666667, + "y": 980 + }, + "hittable": false, + "ref": "e381" + }, + { + "label": "h", + "index": 381, + "enabled": true, + "parentIndex": 365, + "hittable": false, + "depth": 8, + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 980 + }, + "ref": "e382" + }, + { + "enabled": true, + "label": "j", + "index": 382, + "rect": { + "height": 46, + "width": 40, + "x": 261.536, + "y": 980 + }, + "type": "Key", + "hittable": false, + "depth": 8, + "parentIndex": 365, + "ref": "e383" + }, + { + "enabled": true, + "depth": 8, + "index": 383, + "hittable": false, + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 301.536, + "y": 980 + }, + "type": "Key", + "label": "k", + "parentIndex": 365, + "ref": "e384" + }, + { + "hittable": false, + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 980 + }, + "index": 384, + "depth": 8, + "parentIndex": 365, + "enabled": true, + "label": "l", + "type": "Key", + "ref": "e385" + }, + { + "type": "Button", + "index": 385, + "hittable": false, + "depth": 8, + "parentIndex": 365, + "rect": { + "height": 46, + "width": 51.333333333333336, + "x": 0, + "y": 1034 + }, + "label": "shift", + "enabled": true, + "identifier": "shift", + "ref": "e386" + }, + { + "label": "z", + "depth": 8, + "parentIndex": 365, + "type": "Key", + "enabled": true, + "index": 386, + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 60, + "y": 1034 + }, + "hittable": false, + "ref": "e387" + }, + { + "hittable": false, + "label": "x", + "index": 387, + "type": "Key", + "enabled": true, + "parentIndex": 365, + "rect": { + "height": 46, + "width": 40, + "x": 100.33333333333334, + "y": 1034 + }, + "depth": 8, + "ref": "e388" + }, + { + "label": "c", + "enabled": true, + "index": 388, + "type": "Key", + "parentIndex": 365, + "hittable": false, + "depth": 8, + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 1034 + }, + "ref": "e389" + }, + { + "label": "v", + "index": 389, + "hittable": false, + "depth": 8, + "parentIndex": 365, + "enabled": true, + "rect": { + "height": 46, + "width": 40, + "x": 181.2026666666667, + "y": 1034 + }, + "type": "Key", + "ref": "e390" + }, + { + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 1034 + }, + "label": "b", + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 365, + "index": 390, + "type": "Key", + "ref": "e391" + }, + { + "hittable": false, + "type": "Key", + "enabled": true, + "parentIndex": 365, + "rect": { + "height": 46, + "width": 40, + "x": 261.536, + "y": 1034 + }, + "index": 391, + "label": "n", + "depth": 8, + "ref": "e392" + }, + { + "label": "m", + "hittable": false, + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 301.536, + "y": 1034 + }, + "parentIndex": 365, + "index": 392, + "type": "Key", + "enabled": true, + "depth": 8, + "ref": "e393" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 1034 + }, + "index": 393, + "identifier": "delete", + "label": "delete", + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 365, + "ref": "e394" + }, + { + "index": 394, + "type": "Key", + "identifier": "more", + "enabled": true, + "parentIndex": 365, + "depth": 8, + "label": "numbers", + "hittable": false, + "rect": { + "height": 46, + "width": 101, + "x": 0, + "y": 1088 + }, + "ref": "e395" + }, + { + "identifier": "space", + "hittable": false, + "rect": { + "height": 46, + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 1088 + }, + "depth": 8, + "parentIndex": 365, + "type": "Key", + "enabled": true, + "index": 395, + "label": "space", + "ref": "e396" + }, + { + "rect": { + "height": 46, + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 1088 + }, + "label": "return", + "identifier": "Return", + "index": 396, + "enabled": true, + "hittable": false, + "type": "Button", + "parentIndex": 365, + "depth": 8, + "ref": "e397" + }, + { + "parentIndex": 342, + "depth": 4, + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 919 + }, + "type": "Other", + "label": "Emoji", + "index": 397, + "enabled": true, + "hittable": false, + "ref": "e398" + }, + { + "type": "Button", + "depth": 5, + "label": "Emoji", + "hittable": false, + "parentIndex": 397, + "index": 398, + "rect": { + "height": 68.73516393505088, + "width": 68.0852958475086, + "x": 8.47726568115926, + "y": 1141.6989567998571 + }, + "enabled": true, + "ref": "e399" + }, + { + "parentIndex": 398, + "hittable": false, + "rect": { + "height": 0, + "width": 0, + "x": 8.47726568115926, + "y": 1141.6989567998571 + }, + "type": "StaticText", + "enabled": true, + "index": 399, + "depth": 6, + "ref": "e400" + }, + { + "depth": 5, + "hittable": false, + "type": "Button", + "index": 400, + "enabled": true, + "parentIndex": 397, + "identifier": "dictation", + "rect": { + "height": 68.7351639350511, + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 1141.3656234665239 + }, + "label": "Dictate", + "ref": "e401" + }, + { + "type": "StaticText", + "hittable": false, + "parentIndex": 400, + "index": 401, + "depth": 6, + "rect": { + "height": 0, + "width": 0, + "x": 325.43743847133214, + "y": 1141.3656234665239 + }, + "enabled": true, + "ref": "e402" + }, + { + "label": "Dictate", + "enabled": true, + "parentIndex": 397, + "rect": { + "height": 68.7351639350511, + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 1141.3656234665239 + }, + "depth": 5, + "index": 402, + "type": "Button", + "identifier": "dictation", + "hittable": false, + "ref": "e403" + }, + { + "type": "StaticText", + "index": 403, + "rect": { + "height": 0, + "width": 0, + "x": 325.43743847133214, + "y": 1141.3656234665239 + }, + "enabled": true, + "depth": 6, + "parentIndex": 402, + "hittable": false, + "ref": "e404" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 404, + "totalNodeCount": 404, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 25, + "p50Ms": 253, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 25 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 25 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776090 + } +} diff --git a/scroll-regression/ios/chat-empty-open.json b/scroll-regression/ios/chat-empty-open.json new file mode 100644 index 0000000000..bf8a5fea17 --- /dev/null +++ b/scroll-regression/ios/chat-empty-open.json @@ -0,0 +1,6461 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "label": "Paseo Debug", + "enabled": true, + "index": 0, + "depth": 0, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "hittable": true, + "ref": "e1" + }, + { + "type": "Window", + "hittable": false, + "enabled": true, + "parentIndex": 0, + "depth": 1, + "index": 1, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e2" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 1, + "depth": 2, + "index": 2, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "ref": "e3" + }, + { + "type": "Other", + "hittable": false, + "index": 3, + "enabled": true, + "parentIndex": 2, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "depth": 3, + "ref": "e4" + }, + { + "parentIndex": 3, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "depth": 4, + "index": 4, + "hittable": false, + "ref": "e5" + }, + { + "depth": 1, + "type": "Window", + "index": 5, + "parentIndex": 0, + "enabled": true, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "ref": "e6" + }, + { + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "index": 6, + "parentIndex": 5, + "enabled": true, + "depth": 2, + "hittable": false, + "ref": "e7" + }, + { + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "enabled": true, + "hittable": false, + "depth": 3, + "parentIndex": 6, + "type": "Other", + "index": 7, + "ref": "e8" + }, + { + "depth": 4, + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 7, + "index": 8, + "ref": "e9" + }, + { + "index": 9, + "enabled": true, + "depth": 5, + "type": "Other", + "hittable": false, + "parentIndex": 8, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "ref": "e10" + }, + { + "index": 10, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 6, + "type": "Other", + "parentIndex": 9, + "enabled": true, + "hittable": false, + "ref": "e11" + }, + { + "parentIndex": 10, + "depth": 7, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 11, + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "ref": "e12" + }, + { + "index": 12, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "type": "Other", + "enabled": true, + "depth": 8, + "parentIndex": 11, + "hittable": false, + "ref": "e13" + }, + { + "parentIndex": 12, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "index": 13, + "enabled": true, + "type": "Other", + "depth": 9, + "ref": "e14" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 9, + "type": "Other", + "index": 14, + "parentIndex": 12, + "ref": "e15" + }, + { + "type": "Other", + "index": 15, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "depth": 10, + "parentIndex": 14, + "hittable": false, + "ref": "e16" + }, + { + "enabled": true, + "index": 16, + "hittable": false, + "parentIndex": 14, + "type": "Other", + "depth": 10, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e17" + }, + { + "type": "Other", + "parentIndex": 16, + "index": 17, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "depth": 11, + "ref": "e18" + }, + { + "type": "Other", + "depth": 11, + "index": 18, + "hittable": false, + "enabled": true, + "parentIndex": 16, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "ref": "e19" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "index": 19, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 18, + "depth": 12, + "ref": "e20" + }, + { + "type": "Other", + "hittable": false, + "index": 20, + "parentIndex": 19, + "depth": 13, + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "ref": "e21" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "enabled": true, + "depth": 14, + "index": 21, + "parentIndex": 20, + "hittable": false, + "ref": "e22" + }, + { + "parentIndex": 21, + "enabled": true, + "depth": 15, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "index": 22, + "type": "Other", + "hittable": false, + "ref": "e23" + }, + { + "enabled": true, + "depth": 16, + "hittable": false, + "type": "Other", + "parentIndex": 22, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "index": 23, + "ref": "e24" + }, + { + "parentIndex": 23, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 24, + "depth": 17, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "ref": "e25" + }, + { + "parentIndex": 24, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "type": "Other", + "depth": 18, + "enabled": true, + "hittable": false, + "index": 25, + "ref": "e26" + }, + { + "index": 26, + "depth": 19, + "parentIndex": 25, + "hittable": false, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "enabled": true, + "ref": "e27" + }, + { + "parentIndex": 26, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "enabled": true, + "type": "Other", + "index": 27, + "depth": 20, + "hittable": false, + "ref": "e28" + }, + { + "label": "Switch tabs (1 open)", + "hittable": false, + "parentIndex": 27, + "index": 28, + "enabled": true, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "depth": 21, + "ref": "e29" + }, + { + "index": 29, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 22, + "label": "Open menu", + "parentIndex": 28, + "ref": "e30" + }, + { + "hittable": false, + "depth": 23, + "enabled": true, + "parentIndex": 29, + "label": "Open menu", + "type": "Other", + "index": 30, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "ref": "e31" + }, + { + "parentIndex": 30, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "hittable": false, + "index": 31, + "label": "Open menu", + "enabled": true, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "depth": 24, + "ref": "e32" + }, + { + "hittable": false, + "type": "Other", + "depth": 25, + "label": "Open menu", + "identifier": "composer-dock-header", + "enabled": true, + "parentIndex": 31, + "index": 32, + "rect": { + "y": 0, + "height": 126, + "x": 0, + "width": 402 + }, + "ref": "e33" + }, + { + "index": 33, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 26, + "parentIndex": 32, + "rect": { + "y": 70, + "height": 56, + "x": 0, + "width": 402 + }, + "ref": "e34" + }, + { + "index": 34, + "hittable": false, + "enabled": true, + "identifier": "menu-button", + "depth": 26, + "type": "Button", + "label": "Open menu", + "rect": { + "y": 81.6666669845581, + "height": 32, + "x": 8, + "width": 32 + }, + "parentIndex": 32, + "ref": "e35" + }, + { + "label": "main", + "rect": { + "y": 80.6666669845581, + "height": 34, + "x": 48, + "width": 314 + }, + "hittable": false, + "depth": 26, + "type": "Other", + "index": 35, + "enabled": true, + "parentIndex": 32, + "ref": "e36" + }, + { + "label": "main", + "index": 36, + "type": "Other", + "rect": { + "y": 80.6666669845581, + "height": 34, + "x": 48, + "width": 278 + }, + "enabled": true, + "depth": 27, + "hittable": false, + "parentIndex": 35, + "ref": "e37" + }, + { + "identifier": "workspace-header-title", + "type": "StaticText", + "rect": { + "y": 80.6666669845581, + "height": 18, + "x": 48, + "width": 278 + }, + "parentIndex": 36, + "index": 37, + "hittable": false, + "depth": 28, + "enabled": true, + "label": "main", + "ref": "e38" + }, + { + "hittable": false, + "enabled": true, + "index": 38, + "rect": { + "y": 80.6666669845581, + "height": 18, + "x": 48, + "width": 278 + }, + "parentIndex": 37, + "type": "StaticText", + "depth": 29, + "label": "main", + "ref": "e39" + }, + { + "enabled": true, + "depth": 28, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "x": 48, + "width": 163.3333282470703 + }, + "type": "StaticText", + "identifier": "workspace-header-subtitle", + "hittable": false, + "index": 39, + "label": "composer-dock-ios-fixture", + "parentIndex": 36, + "ref": "e40" + }, + { + "index": 40, + "type": "StaticText", + "hittable": false, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "x": 48, + "width": 163.3333282470703 + }, + "enabled": true, + "depth": 29, + "parentIndex": 39, + "label": "composer-dock-ios-fixture", + "ref": "e41" + }, + { + "hittable": false, + "type": "StaticText", + "index": 41, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4 + }, + "enabled": true, + "depth": 28, + "parentIndex": 36, + "label": "·", + "ref": "e42" + }, + { + "hittable": false, + "type": "StaticText", + "index": 42, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4 + }, + "enabled": true, + "depth": 29, + "parentIndex": 41, + "label": "·", + "ref": "e43" + }, + { + "index": 43, + "type": "Other", + "hittable": false, + "rect": { + "x": 227.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 68.00001525878906 + }, + "enabled": true, + "depth": 28, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "parentIndex": 36, + "ref": "e44" + }, + { + "hittable": false, + "type": "Other", + "index": 44, + "rect": { + "x": 227.3333282470703, + "y": 100.6666669845581, + "height": 12, + "width": 12 + }, + "enabled": true, + "depth": 28, + "parentIndex": 36, + "ref": "e45" + }, + { + "hittable": false, + "type": "Other", + "index": 45, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 11, + "width": 11 + }, + "enabled": true, + "depth": 29, + "parentIndex": 44, + "ref": "e46" + }, + { + "hittable": false, + "type": "Other", + "index": 46, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 5, + "width": 11 + }, + "enabled": true, + "depth": 30, + "parentIndex": 45, + "ref": "e47" + }, + { + "hittable": false, + "type": "Other", + "index": 47, + "rect": { + "x": 227.8333282470703, + "y": 107.1666669845581, + "height": 5, + "width": 11 + }, + "enabled": true, + "depth": 30, + "parentIndex": 45, + "ref": "e48" + }, + { + "hittable": false, + "type": "Other", + "index": 48, + "rect": { + "x": 229.8333282470703, + "y": 103.1666669845581, + "height": 1, + "width": 1.0049999999999955 + }, + "enabled": true, + "depth": 30, + "parentIndex": 45, + "ref": "e49" + }, + { + "hittable": false, + "type": "Other", + "index": 49, + "rect": { + "x": 229.8333282470703, + "y": 109.1666669845581, + "height": 1, + "width": 1.0049999999999955 + }, + "enabled": true, + "depth": 30, + "parentIndex": 45, + "ref": "e50" + }, + { + "hittable": false, + "type": "StaticText", + "index": 50, + "rect": { + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906 + }, + "enabled": true, + "depth": 28, + "parentIndex": 36, + "label": "dev-new", + "ref": "e51" + }, + { + "hittable": false, + "type": "StaticText", + "index": 51, + "rect": { + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906 + }, + "enabled": true, + "depth": 29, + "parentIndex": 50, + "label": "dev-new", + "ref": "e52" + }, + { + "index": 52, + "type": "Button", + "hittable": false, + "rect": { + "x": 330, + "y": 81.6666669845581, + "height": 32, + "width": 32 + }, + "enabled": true, + "depth": 27, + "identifier": "workspace-header-menu-trigger", + "label": "Workspace actions", + "parentIndex": 35, + "ref": "e53" + }, + { + "index": 53, + "type": "Button", + "hittable": false, + "rect": { + "x": 362, + "y": 81.6666669845581, + "height": 32, + "width": 32 + }, + "enabled": true, + "depth": 26, + "identifier": "workspace-explorer-toggle", + "label": "Open Explorer sidebar", + "parentIndex": 32, + "ref": "e54" + }, + { + "hittable": false, + "type": "Other", + "index": 54, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "depth": 25, + "parentIndex": 31, + "ref": "e55" + }, + { + "hittable": false, + "type": "Other", + "index": 55, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "depth": 25, + "parentIndex": 31, + "ref": "e56" + }, + { + "index": 56, + "type": "Button", + "hittable": false, + "rect": { + "x": 0, + "y": 126, + "height": 34, + "width": 402 + }, + "enabled": true, + "depth": 25, + "identifier": "workspace-tab-switcher-trigger", + "label": "Switch tabs (1 open)", + "parentIndex": 31, + "ref": "e57" + }, + { + "hittable": false, + "type": "Other", + "index": 57, + "rect": { + "x": 20, + "y": 136, + "height": 14, + "width": 14 + }, + "enabled": true, + "depth": 26, + "identifier": "workspace-active-tab-icon", + "parentIndex": 56, + "ref": "e58" + }, + { + "hittable": false, + "type": "Other", + "index": 58, + "rect": { + "x": 0, + "y": 126, + "height": 35, + "width": 402 + }, + "enabled": true, + "depth": 25, + "identifier": "workspace-tabs-row", + "parentIndex": 31, + "ref": "e59" + }, + { + "hittable": false, + "type": "Other", + "index": 59, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 25, + "parentIndex": 31, + "ref": "e60" + }, + { + "hittable": false, + "type": "Other", + "index": 60, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 25, + "parentIndex": 31, + "ref": "e61" + }, + { + "hittable": false, + "type": "Other", + "index": 61, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 26, + "parentIndex": 60, + "label": "Add attachment", + "ref": "e62" + }, + { + "hittable": false, + "type": "Other", + "index": 62, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 27, + "parentIndex": 61, + "ref": "e63" + }, + { + "hittable": false, + "type": "Other", + "index": 63, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 27, + "parentIndex": 61, + "ref": "e64" + }, + { + "index": 64, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 27, + "identifier": "composer-viewport", + "label": "Message agent... Message, @files, /commands", + "parentIndex": 61, + "ref": "e65" + }, + { + "hittable": false, + "type": "Other", + "index": 65, + "rect": { + "x": 0, + "y": -141, + "height": 713, + "width": 402 + }, + "enabled": true, + "depth": 28, + "parentIndex": 64, + "label": "Message agent... Message, @files, /commands", + "ref": "e66" + }, + { + "index": 66, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 29, + "identifier": "composer-dock-content", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 65, + "ref": "e67" + }, + { + "hittable": false, + "type": "Other", + "index": 67, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 30, + "parentIndex": 66, + "ref": "e68" + }, + { + "hittable": false, + "type": "Other", + "index": 68, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 30, + "parentIndex": 66, + "label": "Horizontal scroll bar, 1 page", + "ref": "e69" + }, + { + "hittable": false, + "type": "Other", + "index": 69, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 31, + "parentIndex": 68, + "ref": "e70" + }, + { + "index": 70, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 31, + "identifier": "agent-chat-scroll", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 68, + "ref": "e71" + }, + { + "hittable": false, + "type": "ScrollView", + "index": 71, + "rect": { + "x": 0, + "y": -141, + "height": 575, + "width": 402 + }, + "enabled": true, + "depth": 32, + "parentIndex": 70, + "label": "Thinking", + "ref": "e72" + }, + { + "hittable": false, + "type": "Other", + "index": 72, + "rect": { + "x": 0, + "y": -2945, + "height": 3379, + "width": 402 + }, + "enabled": true, + "depth": 33, + "parentIndex": 71, + "label": "Thinking", + "ref": "e73" + }, + { + "hittable": false, + "type": "Other", + "index": 73, + "rect": { + "x": 0, + "y": -2945, + "height": 3379, + "width": 402 + }, + "enabled": true, + "depth": 34, + "parentIndex": 72, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e74" + }, + { + "hittable": false, + "type": "Other", + "index": 74, + "rect": { + "x": 12, + "y": -2945, + "height": 32, + "width": 378 + }, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "ref": "e75" + }, + { + "hittable": false, + "type": "Other", + "index": 75, + "rect": { + "x": 12, + "y": -2945, + "height": 32, + "width": 378 + }, + "enabled": true, + "depth": 36, + "identifier": "older-history-slot", + "parentIndex": 74, + "ref": "e76" + }, + { + "hittable": false, + "type": "Other", + "index": 76, + "rect": { + "x": 12, + "y": -2913, + "height": 570, + "width": 378 + }, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e77" + }, + { + "hittable": false, + "type": "Other", + "index": 77, + "rect": { + "x": 20, + "y": -2913, + "height": 566, + "width": 362 + }, + "enabled": true, + "depth": 36, + "identifier": "assistant-message", + "parentIndex": 76, + "ref": "e78" + }, + { + "hittable": false, + "type": "Other", + "index": 78, + "rect": { + "x": 20, + "y": -2901, + "height": 242, + "width": 362 + }, + "enabled": true, + "depth": 36, + "parentIndex": 76, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e79" + }, + { + "hittable": false, + "type": "Other", + "index": 79, + "rect": { + "x": 20, + "y": -2901, + "height": 242, + "width": 362 + }, + "enabled": true, + "depth": 37, + "parentIndex": 78, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e80" + }, + { + "hittable": false, + "type": "Other", + "index": 80, + "rect": { + "x": 20, + "y": -2901, + "height": 242, + "width": 362 + }, + "enabled": true, + "depth": 38, + "parentIndex": 79, + "ref": "e81" + }, + { + "index": 81, + "type": "TextView", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "depth": 38, + "parentIndex": 79, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e82" + }, + { + "hittable": false, + "type": "TextView", + "index": 82, + "rect": { + "x": 20, + "y": -2901, + "height": 242, + "width": 362 + }, + "enabled": true, + "depth": 39, + "parentIndex": 81, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "ref": "e83" + }, + { + "index": 83, + "type": "Other", + "value": "0%", + "hittable": false, + "rect": { + "x": 349, + "y": -2901, + "height": 242, + "width": 30 + }, + "enabled": true, + "depth": 39, + "parentIndex": 81, + "label": "Vertical scroll bar, 1 page", + "ref": "e84" + }, + { + "hittable": false, + "type": "Other", + "index": 84, + "rect": { + "x": 376, + "y": -2940, + "height": 36, + "width": 3 + }, + "enabled": true, + "depth": 40, + "parentIndex": 83, + "ref": "e85" + }, + { + "index": 85, + "type": "Other", + "value": "0%", + "hittable": false, + "rect": { + "x": 20, + "y": -2692, + "height": 30, + "width": 362 + }, + "enabled": true, + "depth": 39, + "parentIndex": 81, + "label": "Horizontal scroll bar, 1 page", + "ref": "e86" + }, + { + "hittable": false, + "type": "Other", + "index": 86, + "rect": { + "x": -19, + "y": -2665, + "height": 3, + "width": 36 + }, + "enabled": true, + "depth": 40, + "parentIndex": 85, + "ref": "e87" + }, + { + "hittable": false, + "type": "Other", + "index": 87, + "rect": { + "x": 20, + "y": -2635, + "height": 264, + "width": 362 + }, + "enabled": true, + "depth": 36, + "parentIndex": 76, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e88" + }, + { + "hittable": false, + "type": "Other", + "index": 88, + "rect": { + "x": 20, + "y": -2635, + "height": 264, + "width": 362 + }, + "enabled": true, + "depth": 37, + "parentIndex": 87, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e89" + }, + { + "hittable": false, + "type": "Other", + "index": 89, + "rect": { + "x": 20, + "y": -2635, + "height": 264, + "width": 362 + }, + "enabled": true, + "depth": 38, + "parentIndex": 88, + "ref": "e90" + }, + { + "index": 90, + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "depth": 38, + "parentIndex": 88, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e91" + }, + { + "hittable": false, + "type": "TextView", + "index": 91, + "rect": { + "x": 20, + "y": -2635, + "height": 264, + "width": 362 + }, + "enabled": true, + "depth": 39, + "parentIndex": 90, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "ref": "e92" + }, + { + "index": 92, + "type": "Other", + "value": "0%", + "hittable": false, + "rect": { + "x": 349, + "y": -2635, + "height": 264, + "width": 30 + }, + "enabled": true, + "depth": 39, + "parentIndex": 90, + "label": "Vertical scroll bar, 1 page", + "ref": "e93" + }, + { + "hittable": false, + "type": "Other", + "index": 93, + "rect": { + "x": 376, + "y": -2674, + "height": 36, + "width": 3 + }, + "enabled": true, + "depth": 40, + "parentIndex": 92, + "ref": "e94" + }, + { + "index": 94, + "type": "Other", + "value": "0%", + "hittable": false, + "rect": { + "x": 20, + "y": -2404, + "height": 30, + "width": 362 + }, + "enabled": true, + "depth": 39, + "parentIndex": 90, + "label": "Horizontal scroll bar, 1 page", + "ref": "e95" + }, + { + "hittable": false, + "type": "Other", + "index": 95, + "rect": { + "x": -19, + "y": -2377, + "height": 3, + "width": 36 + }, + "enabled": true, + "depth": 40, + "parentIndex": 94, + "ref": "e96" + }, + { + "parentIndex": 73, + "hittable": false, + "type": "Other", + "index": 96, + "depth": 35, + "enabled": true, + "rect": { + "y": -2343, + "height": 32, + "x": 12, + "width": 378 + }, + "label": "Thinking", + "ref": "e97" + }, + { + "rect": { + "y": -2343, + "height": 32, + "x": 7, + "width": 388 + }, + "type": "Other", + "depth": 36, + "hittable": false, + "index": 97, + "identifier": "tool-call-badge", + "parentIndex": 96, + "enabled": true, + "ref": "e98" + }, + { + "type": "Button", + "enabled": true, + "depth": 36, + "parentIndex": 96, + "label": "Thinking", + "hittable": false, + "rect": { + "y": -2343, + "height": 32, + "x": 7, + "width": 388 + }, + "index": 98, + "ref": "e99" + }, + { + "hittable": false, + "type": "Other", + "depth": 35, + "parentIndex": 73, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 99, + "rect": { + "y": -2311, + "height": 32, + "x": 12, + "width": 378 + }, + "enabled": true, + "ref": "e100" + }, + { + "depth": 36, + "enabled": true, + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "y": -2311, + "height": 32, + "x": 7, + "width": 388 + }, + "index": 100, + "parentIndex": 99, + "hittable": false, + "ref": "e101" + }, + { + "type": "Button", + "depth": 36, + "parentIndex": 99, + "hittable": false, + "index": 101, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -2311, + "height": 32, + "x": 7, + "width": 388 + }, + "enabled": true, + "ref": "e102" + }, + { + "label": "Search, scrollToEnd", + "depth": 35, + "rect": { + "y": -2279, + "height": 36, + "x": 12, + "width": 378 + }, + "type": "Other", + "parentIndex": 73, + "enabled": true, + "hittable": false, + "index": 102, + "ref": "e103" + }, + { + "depth": 36, + "index": 103, + "parentIndex": 102, + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "rect": { + "y": -2279, + "height": 32, + "x": 7, + "width": 388 + }, + "hittable": false, + "ref": "e104" + }, + { + "index": 104, + "type": "Button", + "depth": 36, + "hittable": false, + "parentIndex": 102, + "enabled": true, + "label": "Search, scrollToEnd", + "rect": { + "y": -2279, + "height": 32, + "x": 7, + "width": 388 + }, + "ref": "e105" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -2243, + "height": 646, + "x": 12, + "width": 378 + }, + "enabled": true, + "depth": 35, + "type": "Other", + "index": 105, + "parentIndex": 73, + "hittable": false, + "ref": "e106" + }, + { + "rect": { + "y": -2243, + "height": 642, + "x": 20, + "width": 362 + }, + "depth": 36, + "identifier": "assistant-message", + "index": 106, + "parentIndex": 105, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e107" + }, + { + "depth": 36, + "parentIndex": 105, + "type": "Other", + "rect": { + "y": -2231, + "height": 132, + "x": 20, + "width": 362 + }, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "index": 107, + "ref": "e108" + }, + { + "enabled": true, + "depth": 37, + "parentIndex": 107, + "index": 108, + "rect": { + "y": -2231, + "height": 132, + "x": 20, + "width": 362 + }, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "ref": "e109" + }, + { + "hittable": false, + "depth": 38, + "rect": { + "y": -2231, + "height": 132, + "x": 20, + "width": 362 + }, + "index": 109, + "parentIndex": 108, + "enabled": true, + "type": "Other", + "ref": "e110" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "parentIndex": 108, + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "enabled": true, + "index": 110, + "depth": 38, + "ref": "e111" + }, + { + "hittable": false, + "parentIndex": 110, + "enabled": true, + "rect": { + "y": -2231, + "height": 132, + "x": 20, + "width": 362 + }, + "index": 111, + "depth": 39, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "ref": "e112" + }, + { + "rect": { + "y": -2231, + "height": 132, + "x": 349, + "width": 30 + }, + "parentIndex": 110, + "type": "Other", + "depth": 39, + "value": "0%", + "enabled": true, + "hittable": false, + "index": 112, + "label": "Vertical scroll bar, 1 page", + "ref": "e113" + }, + { + "depth": 40, + "parentIndex": 112, + "rect": { + "y": -2270, + "height": 36, + "x": 376, + "width": 3 + }, + "type": "Other", + "hittable": false, + "index": 113, + "enabled": true, + "ref": "e114" + }, + { + "value": "0%", + "parentIndex": 110, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "index": 114, + "hittable": false, + "depth": 39, + "rect": { + "y": -2132, + "height": 30, + "x": 20, + "width": 362 + }, + "ref": "e115" + }, + { + "enabled": true, + "index": 115, + "parentIndex": 114, + "depth": 40, + "rect": { + "y": -2105, + "height": 3, + "x": -19, + "width": 36 + }, + "type": "Other", + "hittable": false, + "ref": "e116" + }, + { + "depth": 36, + "type": "StaticText", + "enabled": true, + "label": "•", + "hittable": false, + "parentIndex": 105, + "rect": { + "y": -2071, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "index": 116, + "ref": "e117" + }, + { + "label": "•", + "hittable": false, + "enabled": true, + "rect": { + "y": -2071, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "index": 117, + "parentIndex": 116, + "type": "StaticText", + "depth": 37, + "ref": "e118" + }, + { + "index": 118, + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "depth": 36, + "parentIndex": 105, + "rect": { + "y": -2071, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e119" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 118, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -2071, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 119, + "depth": 37, + "ref": "e120" + }, + { + "rect": { + "y": -2071, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "index": 120, + "parentIndex": 119, + "enabled": true, + "depth": 38, + "type": "Other", + "ref": "e121" + }, + { + "type": "TextView", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 121, + "hittable": false, + "depth": 38, + "parentIndex": 119, + "ref": "e122" + }, + { + "enabled": true, + "index": 122, + "depth": 39, + "rect": { + "y": -2071, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 121, + "ref": "e123" + }, + { + "type": "Other", + "rect": { + "y": -2071, + "height": 88, + "x": 349.00000063578284, + "width": 30 + }, + "depth": 39, + "parentIndex": 121, + "label": "Vertical scroll bar, 1 page", + "index": 123, + "hittable": false, + "value": "0%", + "enabled": true, + "ref": "e124" + }, + { + "enabled": true, + "rect": { + "y": -2110, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "index": 124, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 123, + "ref": "e125" + }, + { + "enabled": true, + "index": 125, + "type": "Other", + "rect": { + "y": -2016, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "parentIndex": 121, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "depth": 39, + "ref": "e126" + }, + { + "parentIndex": 125, + "rect": { + "y": -1989, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "hittable": false, + "type": "Other", + "index": 126, + "depth": 40, + "enabled": true, + "ref": "e127" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": -1979, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "index": 127, + "label": "•", + "depth": 36, + "parentIndex": 105, + "type": "StaticText", + "ref": "e128" + }, + { + "hittable": false, + "index": 128, + "type": "StaticText", + "label": "•", + "rect": { + "y": -1979, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "depth": 37, + "enabled": true, + "parentIndex": 127, + "ref": "e129" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 105, + "rect": { + "y": -1979, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 129, + "depth": 36, + "ref": "e130" + }, + { + "depth": 37, + "parentIndex": 129, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": -1979, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 130, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e131" + }, + { + "type": "Other", + "depth": 38, + "hittable": false, + "enabled": true, + "rect": { + "y": -1979, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 131, + "parentIndex": 130, + "ref": "e132" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 132, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "parentIndex": 130, + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "depth": 38, + "hittable": false, + "ref": "e133" + }, + { + "enabled": true, + "depth": 39, + "index": 133, + "rect": { + "y": -1979, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "parentIndex": 132, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "hittable": false, + "ref": "e134" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 132, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "index": 134, + "rect": { + "y": -1979, + "height": 88, + "x": 349.00000063578284, + "width": 30 + }, + "value": "0%", + "depth": 39, + "ref": "e135" + }, + { + "depth": 40, + "rect": { + "y": -2018, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 134, + "index": 135, + "ref": "e136" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "index": 136, + "depth": 39, + "type": "Other", + "value": "0%", + "parentIndex": 132, + "rect": { + "y": -1924, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "ref": "e137" + }, + { + "type": "Other", + "index": 137, + "rect": { + "y": -1897, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "enabled": true, + "parentIndex": 136, + "depth": 40, + "hittable": false, + "ref": "e138" + }, + { + "rect": { + "y": -1887, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "label": "•", + "type": "StaticText", + "index": 138, + "parentIndex": 105, + "depth": 36, + "hittable": false, + "enabled": true, + "ref": "e139" + }, + { + "parentIndex": 138, + "hittable": false, + "type": "StaticText", + "index": 139, + "rect": { + "y": -1887, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "label": "•", + "enabled": true, + "depth": 37, + "ref": "e140" + }, + { + "rect": { + "y": -1887, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "parentIndex": 105, + "type": "Other", + "hittable": false, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 140, + "depth": 36, + "ref": "e141" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "rect": { + "y": -1887, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 141, + "depth": 37, + "parentIndex": 140, + "hittable": false, + "type": "Other", + "ref": "e142" + }, + { + "parentIndex": 141, + "index": 142, + "enabled": true, + "hittable": false, + "depth": 38, + "rect": { + "y": -1887, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "type": "Other", + "ref": "e143" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "parentIndex": 141, + "type": "TextView", + "hittable": false, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "index": 143, + "depth": 38, + "ref": "e144" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -1887, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 144, + "enabled": true, + "hittable": false, + "parentIndex": 143, + "type": "TextView", + "depth": 39, + "ref": "e145" + }, + { + "rect": { + "y": -1887, + "height": 88, + "x": 349.00000063578284, + "width": 30 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "parentIndex": 143, + "index": 145, + "value": "0%", + "enabled": true, + "hittable": false, + "depth": 39, + "ref": "e146" + }, + { + "rect": { + "y": -1926, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "parentIndex": 145, + "depth": 40, + "hittable": false, + "type": "Other", + "index": 146, + "enabled": true, + "ref": "e147" + }, + { + "index": 147, + "enabled": true, + "value": "0%", + "depth": 39, + "rect": { + "y": -1832, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "type": "Other", + "parentIndex": 143, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e148" + }, + { + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "rect": { + "y": -1805, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "index": 148, + "parentIndex": 147, + "ref": "e149" + }, + { + "parentIndex": 105, + "type": "StaticText", + "index": 149, + "hittable": false, + "depth": 36, + "label": "•", + "enabled": true, + "rect": { + "y": -1795, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "ref": "e150" + }, + { + "type": "StaticText", + "enabled": true, + "index": 150, + "depth": 37, + "rect": { + "y": -1795, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "label": "•", + "parentIndex": 149, + "hittable": false, + "ref": "e151" + }, + { + "rect": { + "y": -1795, + "height": 66, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "type": "Other", + "depth": 36, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "enabled": true, + "parentIndex": 105, + "index": 151, + "ref": "e152" + }, + { + "index": 152, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 37, + "type": "Other", + "rect": { + "y": -1795, + "height": 66, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "enabled": true, + "parentIndex": 151, + "ref": "e153" + }, + { + "parentIndex": 152, + "index": 153, + "hittable": false, + "type": "Other", + "depth": 38, + "rect": { + "y": -1795, + "height": 66, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e154" + }, + { + "depth": 38, + "enabled": true, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "TextView", + "parentIndex": 152, + "index": 154, + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "ref": "e155" + }, + { + "type": "TextView", + "rect": { + "y": -1795, + "height": 66, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "index": 155, + "parentIndex": 154, + "enabled": true, + "depth": 39, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e156" + }, + { + "enabled": true, + "type": "Other", + "depth": 39, + "hittable": false, + "value": "0%", + "parentIndex": 154, + "rect": { + "y": -1795, + "height": 66, + "x": 349.00000063578284, + "width": 30 + }, + "label": "Vertical scroll bar, 1 page", + "index": 156, + "ref": "e157" + }, + { + "enabled": true, + "parentIndex": 156, + "rect": { + "y": -1834, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "hittable": false, + "depth": 40, + "type": "Other", + "index": 157, + "ref": "e158" + }, + { + "hittable": false, + "index": 158, + "parentIndex": 154, + "type": "Other", + "enabled": true, + "rect": { + "y": -1762, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "ref": "e159" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": -1735, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "depth": 40, + "parentIndex": 158, + "index": 159, + "enabled": true, + "ref": "e160" + }, + { + "depth": 36, + "parentIndex": 105, + "rect": { + "y": -1713, + "height": 88, + "x": 20, + "width": 362 + }, + "index": 160, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "type": "Other", + "ref": "e161" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 37, + "index": 161, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": -1713, + "height": 88, + "x": 20, + "width": 362 + }, + "parentIndex": 160, + "ref": "e162" + }, + { + "index": 162, + "parentIndex": 161, + "rect": { + "y": -1713, + "height": 88, + "x": 20, + "width": 362 + }, + "depth": 38, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e163" + }, + { + "type": "TextView", + "parentIndex": 161, + "enabled": true, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "index": 163, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "hittable": false, + "ref": "e164" + }, + { + "rect": { + "y": -1713, + "height": 88, + "x": 20, + "width": 362 + }, + "parentIndex": 163, + "index": 164, + "type": "TextView", + "depth": 39, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "hittable": false, + "ref": "e165" + }, + { + "value": "0%", + "type": "Other", + "hittable": false, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "index": 165, + "depth": 39, + "rect": { + "y": -1713, + "height": 88, + "x": 349, + "width": 30 + }, + "parentIndex": 163, + "ref": "e166" + }, + { + "depth": 40, + "enabled": true, + "parentIndex": 165, + "type": "Other", + "hittable": false, + "index": 166, + "rect": { + "y": -1752, + "height": 36, + "x": 376, + "width": 3 + }, + "ref": "e167" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "index": 167, + "rect": { + "y": -1658, + "height": 30, + "x": 20, + "width": 362 + }, + "parentIndex": 163, + "type": "Other", + "value": "0%", + "depth": 39, + "hittable": false, + "ref": "e168" + }, + { + "enabled": true, + "parentIndex": 167, + "type": "Other", + "hittable": false, + "index": 168, + "rect": { + "y": -1631, + "height": 3, + "x": -19, + "width": 36 + }, + "depth": 40, + "ref": "e169" + }, + { + "index": 169, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": -1597, + "height": 32, + "x": 12, + "width": 378 + }, + "type": "Other", + "hittable": false, + "depth": 35, + "parentIndex": 73, + "enabled": true, + "ref": "e170" + }, + { + "depth": 36, + "identifier": "tool-call-badge", + "rect": { + "y": -1597, + "height": 32, + "x": 7, + "width": 388 + }, + "index": 170, + "type": "Other", + "parentIndex": 169, + "enabled": true, + "hittable": false, + "ref": "e171" + }, + { + "index": 171, + "type": "Button", + "parentIndex": 169, + "rect": { + "y": -1597, + "height": 32, + "x": 7, + "width": 388 + }, + "depth": 36, + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "ref": "e172" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -1565, + "height": 36, + "x": 12, + "width": 378 + }, + "depth": 35, + "parentIndex": 73, + "enabled": true, + "type": "Other", + "index": 172, + "hittable": false, + "ref": "e173" + }, + { + "type": "Other", + "hittable": false, + "index": 173, + "depth": 36, + "rect": { + "y": -1565, + "height": 32, + "x": 7, + "width": 388 + }, + "identifier": "tool-call-badge", + "enabled": true, + "parentIndex": 172, + "ref": "e174" + }, + { + "parentIndex": 172, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Button", + "depth": 36, + "enabled": true, + "rect": { + "y": -1565, + "height": 32, + "x": 7, + "width": 388 + }, + "index": 174, + "ref": "e175" + }, + { + "depth": 35, + "parentIndex": 73, + "index": 175, + "rect": { + "y": -1529, + "height": 570, + "x": 12, + "width": 378 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e176" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "y": -1529, + "height": 566, + "x": 20, + "width": 362 + }, + "enabled": true, + "depth": 36, + "index": 176, + "identifier": "assistant-message", + "parentIndex": 175, + "ref": "e177" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -1517, + "height": 242, + "x": 20, + "width": 362 + }, + "index": 177, + "enabled": true, + "type": "Other", + "parentIndex": 175, + "hittable": false, + "depth": 36, + "ref": "e178" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": -1517, + "height": 242, + "x": 20, + "width": 362 + }, + "depth": 37, + "index": 178, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 177, + "ref": "e179" + }, + { + "hittable": false, + "index": 179, + "type": "Other", + "enabled": true, + "parentIndex": 178, + "depth": 38, + "rect": { + "y": -1517, + "height": 242, + "x": 20, + "width": 362 + }, + "ref": "e180" + }, + { + "depth": 38, + "parentIndex": 178, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "index": 180, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "hittable": false, + "ref": "e181" + }, + { + "index": 181, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "enabled": true, + "hittable": false, + "rect": { + "y": -1517, + "height": 242, + "x": 20, + "width": 362 + }, + "type": "TextView", + "parentIndex": 180, + "depth": 39, + "ref": "e182" + }, + { + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "hittable": false, + "index": 182, + "rect": { + "y": -1517, + "height": 242, + "x": 349, + "width": 30 + }, + "type": "Other", + "depth": 39, + "parentIndex": 180, + "enabled": true, + "ref": "e183" + }, + { + "parentIndex": 182, + "depth": 40, + "enabled": true, + "index": 183, + "rect": { + "y": -1556, + "height": 36, + "x": 376, + "width": 3 + }, + "type": "Other", + "hittable": false, + "ref": "e184" + }, + { + "depth": 39, + "index": 184, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "parentIndex": 180, + "hittable": false, + "rect": { + "y": -1308, + "height": 30, + "x": 20, + "width": 362 + }, + "type": "Other", + "ref": "e185" + }, + { + "depth": 40, + "enabled": true, + "index": 185, + "hittable": false, + "rect": { + "y": -1281, + "height": 3, + "x": -19, + "width": 36 + }, + "type": "Other", + "parentIndex": 184, + "ref": "e186" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 36, + "index": 186, + "rect": { + "y": -1251, + "height": 264, + "x": 20, + "width": 362 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 175, + "ref": "e187" + }, + { + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 187, + "parentIndex": 186, + "depth": 37, + "hittable": false, + "enabled": true, + "rect": { + "y": -1251, + "height": 264, + "x": 20, + "width": 362 + }, + "ref": "e188" + }, + { + "parentIndex": 187, + "enabled": true, + "type": "Other", + "depth": 38, + "index": 188, + "hittable": false, + "rect": { + "y": -1251, + "height": 264, + "x": 20, + "width": 362 + }, + "ref": "e189" + }, + { + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "index": 189, + "hittable": false, + "depth": 38, + "parentIndex": 187, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "ref": "e190" + }, + { + "depth": 39, + "hittable": false, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "parentIndex": 189, + "rect": { + "y": -1251, + "height": 264, + "x": 20, + "width": 362 + }, + "index": 190, + "enabled": true, + "ref": "e191" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": -1251, + "height": 264, + "x": 349, + "width": 30 + }, + "enabled": true, + "parentIndex": 189, + "label": "Vertical scroll bar, 1 page", + "index": 191, + "value": "0%", + "depth": 39, + "ref": "e192" + }, + { + "depth": 40, + "hittable": false, + "enabled": true, + "parentIndex": 191, + "rect": { + "y": -1290, + "height": 36, + "x": 376, + "width": 3 + }, + "index": 192, + "type": "Other", + "ref": "e193" + }, + { + "hittable": false, + "type": "Other", + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "index": 193, + "parentIndex": 189, + "depth": 39, + "rect": { + "y": -1020, + "height": 30, + "x": 20, + "width": 362 + }, + "ref": "e194" + }, + { + "hittable": false, + "depth": 40, + "type": "Other", + "rect": { + "y": -993, + "height": 3, + "x": -19, + "width": 36 + }, + "index": 194, + "enabled": true, + "parentIndex": 193, + "ref": "e195" + }, + { + "index": 195, + "label": "Thinking", + "enabled": true, + "parentIndex": 73, + "type": "Other", + "depth": 35, + "rect": { + "y": -959, + "height": 32, + "x": 12, + "width": 378 + }, + "hittable": false, + "ref": "e196" + }, + { + "hittable": false, + "rect": { + "y": -959, + "height": 32, + "x": 7, + "width": 388 + }, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "depth": 36, + "index": 196, + "parentIndex": 195, + "ref": "e197" + }, + { + "index": 197, + "hittable": false, + "parentIndex": 195, + "type": "Button", + "rect": { + "y": -959, + "height": 32, + "x": 7, + "width": 388 + }, + "depth": 36, + "label": "Thinking", + "enabled": true, + "ref": "e198" + }, + { + "index": 198, + "parentIndex": 73, + "type": "Other", + "hittable": false, + "rect": { + "y": -927, + "height": 32, + "x": 12, + "width": 378 + }, + "depth": 35, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "enabled": true, + "ref": "e199" + }, + { + "parentIndex": 198, + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "y": -927, + "height": 32, + "x": 7, + "width": 388 + }, + "index": 199, + "hittable": false, + "depth": 36, + "enabled": true, + "ref": "e200" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 200, + "hittable": false, + "depth": 36, + "rect": { + "y": -927, + "height": 32, + "x": 7, + "width": 388 + }, + "parentIndex": 198, + "type": "Button", + "enabled": true, + "ref": "e201" + }, + { + "rect": { + "y": -895, + "height": 36, + "x": 12, + "width": 378 + }, + "label": "Search, scrollToEnd", + "index": 201, + "parentIndex": 73, + "hittable": false, + "depth": 35, + "type": "Other", + "enabled": true, + "ref": "e202" + }, + { + "index": 202, + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "y": -895, + "height": 32, + "x": 7, + "width": 388 + }, + "hittable": false, + "parentIndex": 201, + "enabled": true, + "ref": "e203" + }, + { + "type": "Button", + "index": 203, + "enabled": true, + "label": "Search, scrollToEnd", + "rect": { + "y": -895, + "height": 32, + "x": 7, + "width": 388 + }, + "hittable": false, + "depth": 36, + "parentIndex": 201, + "ref": "e204" + }, + { + "hittable": false, + "parentIndex": 73, + "type": "Other", + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 204, + "rect": { + "y": -859, + "height": 646, + "x": 12, + "width": 378 + }, + "depth": 35, + "ref": "e205" + }, + { + "depth": 36, + "hittable": false, + "enabled": true, + "index": 205, + "parentIndex": 204, + "type": "Other", + "rect": { + "y": -859, + "height": 642, + "x": 20, + "width": 362 + }, + "identifier": "assistant-message", + "ref": "e206" + }, + { + "type": "Other", + "enabled": true, + "index": 206, + "depth": 36, + "parentIndex": 204, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -847, + "height": 132, + "x": 20, + "width": 362 + }, + "ref": "e207" + }, + { + "enabled": true, + "rect": { + "y": -847, + "height": 132, + "x": 20, + "width": 362 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 37, + "hittable": false, + "type": "Other", + "parentIndex": 206, + "index": 207, + "ref": "e208" + }, + { + "index": 208, + "enabled": true, + "rect": { + "y": -847, + "height": 132, + "x": 20, + "width": 362 + }, + "depth": 38, + "parentIndex": 207, + "type": "Other", + "hittable": false, + "ref": "e209" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "enabled": true, + "depth": 38, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 207, + "index": 209, + "hittable": false, + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "ref": "e210" + }, + { + "rect": { + "y": -847, + "height": 132, + "x": 20, + "width": 362 + }, + "depth": 39, + "parentIndex": 209, + "index": 210, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "type": "TextView", + "hittable": false, + "ref": "e211" + }, + { + "enabled": true, + "rect": { + "y": -847, + "height": 132, + "x": 349, + "width": 30 + }, + "hittable": false, + "value": "0%", + "type": "Other", + "depth": 39, + "parentIndex": 209, + "label": "Vertical scroll bar, 1 page", + "index": 211, + "ref": "e212" + }, + { + "type": "Other", + "index": 212, + "rect": { + "y": -886, + "height": 36, + "x": 376, + "width": 3 + }, + "parentIndex": 211, + "enabled": true, + "depth": 40, + "hittable": false, + "ref": "e213" + }, + { + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "enabled": true, + "type": "Other", + "index": 213, + "rect": { + "y": -748, + "height": 30, + "x": 20, + "width": 362 + }, + "parentIndex": 209, + "ref": "e214" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": -721, + "height": 3, + "x": -19, + "width": 36 + }, + "type": "Other", + "index": 214, + "depth": 40, + "parentIndex": 213, + "ref": "e215" + }, + { + "depth": 36, + "label": "•", + "rect": { + "y": -687, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "type": "StaticText", + "index": 215, + "parentIndex": 204, + "enabled": true, + "hittable": false, + "ref": "e216" + }, + { + "type": "StaticText", + "index": 216, + "enabled": true, + "label": "•", + "rect": { + "y": -687, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "parentIndex": 215, + "depth": 37, + "hittable": false, + "ref": "e217" + }, + { + "hittable": false, + "depth": 36, + "parentIndex": 204, + "index": 217, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -687, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "type": "Other", + "enabled": true, + "ref": "e218" + }, + { + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "rect": { + "y": -687, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 218, + "hittable": false, + "depth": 37, + "parentIndex": 217, + "ref": "e219" + }, + { + "index": 219, + "hittable": false, + "depth": 38, + "type": "Other", + "enabled": true, + "parentIndex": 218, + "rect": { + "y": -687, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "ref": "e220" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 218, + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 220, + "depth": 38, + "enabled": true, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e221" + }, + { + "enabled": true, + "index": 221, + "rect": { + "y": -687, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 39, + "parentIndex": 220, + "hittable": false, + "type": "TextView", + "ref": "e222" + }, + { + "parentIndex": 220, + "value": "0%", + "index": 222, + "rect": { + "y": -687, + "height": 88, + "x": 349.00000063578284, + "width": 30 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "depth": 39, + "ref": "e223" + }, + { + "hittable": false, + "index": 223, + "enabled": true, + "type": "Other", + "rect": { + "y": -726, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "parentIndex": 222, + "depth": 40, + "ref": "e224" + }, + { + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "value": "0%", + "type": "Other", + "parentIndex": 220, + "rect": { + "y": -632, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 224, + "enabled": true, + "hittable": false, + "ref": "e225" + }, + { + "index": 225, + "enabled": true, + "depth": 40, + "rect": { + "y": -605, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "type": "Other", + "parentIndex": 224, + "hittable": false, + "ref": "e226" + }, + { + "depth": 36, + "index": 226, + "hittable": false, + "type": "StaticText", + "label": "•", + "rect": { + "y": -595, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "enabled": true, + "parentIndex": 204, + "ref": "e227" + }, + { + "type": "StaticText", + "rect": { + "y": -595, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "label": "•", + "hittable": false, + "enabled": true, + "depth": 37, + "parentIndex": 226, + "index": 227, + "ref": "e228" + }, + { + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -595, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "parentIndex": 204, + "depth": 36, + "type": "Other", + "index": 228, + "ref": "e229" + }, + { + "parentIndex": 228, + "hittable": false, + "rect": { + "y": -595, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 37, + "type": "Other", + "index": 229, + "ref": "e230" + }, + { + "parentIndex": 229, + "depth": 38, + "rect": { + "y": -595, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 230, + "ref": "e231" + }, + { + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "parentIndex": 229, + "type": "TextView", + "hittable": false, + "depth": 38, + "index": 231, + "ref": "e232" + }, + { + "parentIndex": 231, + "type": "TextView", + "index": 232, + "enabled": true, + "depth": 39, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -595, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "ref": "e233" + }, + { + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "hittable": false, + "type": "Other", + "value": "0%", + "rect": { + "y": -595, + "height": 88, + "x": 349.00000063578284, + "width": 30 + }, + "index": 233, + "enabled": true, + "parentIndex": 231, + "ref": "e234" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": -634, + "height": 36, + "x": 376.00000063578284, + "width": 3 + }, + "depth": 40, + "parentIndex": 233, + "index": 234, + "ref": "e235" + }, + { + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "depth": 39, + "rect": { + "y": -540, + "height": 30, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 235, + "enabled": true, + "value": "0%", + "parentIndex": 231, + "ref": "e236" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 235, + "rect": { + "y": -513, + "height": 3, + "x": 2.333333969116211, + "width": 36 + }, + "depth": 40, + "type": "Other", + "index": 236, + "ref": "e237" + }, + { + "parentIndex": 204, + "label": "•", + "depth": 36, + "enabled": true, + "index": 237, + "hittable": false, + "type": "StaticText", + "rect": { + "y": -503, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "ref": "e238" + }, + { + "label": "•", + "enabled": true, + "index": 238, + "type": "StaticText", + "depth": 37, + "hittable": false, + "rect": { + "y": -503, + "height": 22, + "x": 30, + "width": 7.333332061767578 + }, + "parentIndex": 237, + "ref": "e239" + }, + { + "rect": { + "y": -503, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "hittable": false, + "depth": 36, + "index": 239, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 204, + "type": "Other", + "ref": "e240" + }, + { + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 37, + "parentIndex": 239, + "type": "Other", + "enabled": true, + "rect": { + "y": -503, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "index": 240, + "ref": "e241" + }, + { + "parentIndex": 240, + "rect": { + "y": -503, + "height": 88, + "x": 41.33333396911621, + "width": 340.6666564941406 + }, + "enabled": true, + "hittable": false, + "index": 241, + "depth": 38, + "type": "Other", + "ref": "e242" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "height": 0, + "x": 0, + "width": 0 + }, + "type": "TextView", + "enabled": true, + "hittable": false, + "index": 242, + "parentIndex": 240, + "depth": 38, + "ref": "e243" + }, + { + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -503, + "height": 88 + }, + "hittable": false, + "enabled": true, + "index": 243, + "parentIndex": 242, + "depth": 39, + "ref": "e244" + }, + { + "type": "Other", + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": -503, + "height": 88 + }, + "parentIndex": 242, + "enabled": true, + "index": 244, + "value": "0%", + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "ref": "e245" + }, + { + "index": 245, + "parentIndex": 244, + "depth": 40, + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": -542, + "height": 36 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e246" + }, + { + "index": 246, + "value": "0%", + "depth": 39, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -448, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 242, + "ref": "e247" + }, + { + "index": 247, + "parentIndex": 246, + "type": "Other", + "depth": 40, + "enabled": true, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": -421, + "height": 3 + }, + "hittable": false, + "ref": "e248" + }, + { + "index": 248, + "parentIndex": 204, + "type": "StaticText", + "depth": 36, + "enabled": true, + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -411, + "height": 22 + }, + "hittable": false, + "label": "•", + "ref": "e249" + }, + { + "label": "•", + "hittable": false, + "depth": 37, + "index": 249, + "enabled": true, + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -411, + "height": 22 + }, + "type": "StaticText", + "parentIndex": 248, + "ref": "e250" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -411, + "height": 66 + }, + "parentIndex": 204, + "hittable": false, + "enabled": true, + "index": 250, + "type": "Other", + "depth": 36, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e251" + }, + { + "parentIndex": 250, + "type": "Other", + "depth": 37, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -411, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 251, + "hittable": false, + "ref": "e252" + }, + { + "index": 252, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -411, + "height": 66 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 38, + "parentIndex": 251, + "ref": "e253" + }, + { + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 38, + "parentIndex": 251, + "enabled": true, + "index": 253, + "type": "TextView", + "hittable": false, + "ref": "e254" + }, + { + "hittable": false, + "parentIndex": 253, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "TextView", + "index": 254, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -411, + "height": 66 + }, + "depth": 39, + "ref": "e255" + }, + { + "label": "Vertical scroll bar, 1 page", + "index": 255, + "value": "0%", + "hittable": false, + "enabled": true, + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": -411, + "height": 66 + }, + "parentIndex": 253, + "depth": 39, + "type": "Other", + "ref": "e256" + }, + { + "enabled": true, + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": -450, + "height": 36 + }, + "hittable": false, + "parentIndex": 255, + "type": "Other", + "depth": 40, + "index": 256, + "ref": "e257" + }, + { + "enabled": true, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 253, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -378, + "height": 30 + }, + "hittable": false, + "value": "0%", + "type": "Other", + "index": 257, + "ref": "e258" + }, + { + "parentIndex": 257, + "enabled": true, + "depth": 40, + "type": "Other", + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": -351, + "height": 3 + }, + "hittable": false, + "index": 258, + "ref": "e259" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -329, + "height": 88 + }, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 204, + "hittable": false, + "index": 259, + "enabled": true, + "depth": 36, + "ref": "e260" + }, + { + "parentIndex": 259, + "index": 260, + "depth": 37, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -329, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "ref": "e261" + }, + { + "parentIndex": 260, + "enabled": true, + "hittable": false, + "index": 261, + "depth": 38, + "rect": { + "width": 362, + "x": 20, + "y": -329, + "height": 88 + }, + "type": "Other", + "ref": "e262" + }, + { + "hittable": false, + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "index": 262, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "type": "TextView", + "parentIndex": 260, + "depth": 38, + "ref": "e263" + }, + { + "depth": 39, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "index": 263, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": -329, + "height": 88 + }, + "type": "TextView", + "parentIndex": 262, + "ref": "e264" + }, + { + "rect": { + "width": 30, + "x": 349, + "y": -329, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "parentIndex": 262, + "depth": 39, + "hittable": false, + "enabled": true, + "index": 264, + "value": "0%", + "ref": "e265" + }, + { + "hittable": false, + "index": 265, + "rect": { + "width": 3, + "x": 376, + "y": -368, + "height": 36 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "parentIndex": 264, + "ref": "e266" + }, + { + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": -274, + "height": 30 + }, + "hittable": false, + "depth": 39, + "parentIndex": 262, + "value": "0%", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "index": 266, + "ref": "e267" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "y": -247, + "height": 3 + }, + "index": 267, + "type": "Other", + "depth": 40, + "parentIndex": 266, + "ref": "e268" + }, + { + "hittable": false, + "parentIndex": 73, + "index": 268, + "type": "Other", + "enabled": true, + "rect": { + "width": 378, + "x": 12, + "y": -213, + "height": 32 + }, + "depth": 35, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e269" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 388, + "x": 7, + "y": -213, + "height": 32 + }, + "index": 269, + "depth": 36, + "hittable": false, + "identifier": "tool-call-badge", + "parentIndex": 268, + "ref": "e270" + }, + { + "index": 270, + "depth": 36, + "enabled": true, + "rect": { + "width": 388, + "x": 7, + "y": -213, + "height": 32 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "parentIndex": 268, + "type": "Button", + "ref": "e271" + }, + { + "hittable": false, + "index": 271, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": -181, + "height": 36 + }, + "enabled": true, + "parentIndex": 73, + "ref": "e272" + }, + { + "hittable": false, + "parentIndex": 271, + "rect": { + "width": 388, + "x": 7, + "y": -181, + "height": 32 + }, + "enabled": true, + "index": 272, + "type": "Other", + "identifier": "tool-call-badge", + "depth": 36, + "ref": "e273" + }, + { + "index": 273, + "enabled": true, + "hittable": false, + "type": "Button", + "depth": 36, + "parentIndex": 271, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "width": 388, + "x": 7, + "y": -181, + "height": 32 + }, + "ref": "e274" + }, + { + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "y": -145, + "height": 512 + }, + "index": 274, + "type": "Other", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 35, + "parentIndex": 73, + "ref": "e275" + }, + { + "depth": 36, + "enabled": true, + "index": 275, + "type": "Other", + "hittable": false, + "identifier": "assistant-message", + "rect": { + "width": 362, + "x": 20, + "y": -145, + "height": 512 + }, + "parentIndex": 274, + "ref": "e276" + }, + { + "type": "Other", + "parentIndex": 274, + "rect": { + "width": 362, + "x": 20, + "y": -133, + "height": 242 + }, + "enabled": true, + "depth": 36, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "index": 276, + "ref": "e277" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -133, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "index": 277, + "type": "Other", + "enabled": true, + "depth": 37, + "parentIndex": 276, + "ref": "e278" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "index": 278, + "depth": 38, + "parentIndex": 277, + "rect": { + "width": 362, + "x": 20, + "y": -133, + "height": 242 + }, + "ref": "e279" + }, + { + "depth": 38, + "parentIndex": 277, + "rect": { + "width": 362, + "x": 20, + "y": 0, + "height": 109 + }, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 279, + "hittable": false, + "type": "TextView", + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e280" + }, + { + "depth": 39, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -133, + "height": 242 + }, + "type": "TextView", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "index": 280, + "hittable": false, + "parentIndex": 279, + "ref": "e281" + }, + { + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "width": 30, + "x": 349, + "y": -133, + "height": 242 + }, + "index": 281, + "parentIndex": 279, + "value": "0%", + "hittable": false, + "enabled": true, + "ref": "e282" + }, + { + "rect": { + "width": 3, + "x": 376, + "y": -172, + "height": 36 + }, + "enabled": true, + "type": "Other", + "parentIndex": 281, + "hittable": false, + "index": 282, + "depth": 40, + "ref": "e283" + }, + { + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "index": 283, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": 76, + "height": 30 + }, + "hittable": false, + "parentIndex": 279, + "value": "0%", + "depth": 39, + "ref": "e284" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "index": 284, + "depth": 40, + "parentIndex": 283, + "rect": { + "width": 36, + "x": -19, + "y": 103, + "height": 3 + }, + "ref": "e285" + }, + { + "type": "Other", + "index": 285, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 274, + "depth": 36, + "rect": { + "width": 362, + "x": 20, + "y": 133, + "height": 176 + }, + "enabled": true, + "hittable": false, + "ref": "e286" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "index": 286, + "depth": 37, + "enabled": true, + "parentIndex": 285, + "hittable": false, + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 133, + "height": 176 + }, + "ref": "e287" + }, + { + "index": 287, + "parentIndex": 286, + "enabled": true, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 133, + "height": 176 + }, + "type": "Other", + "depth": 38, + "ref": "e288" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "parentIndex": 286, + "rect": { + "width": 362, + "x": 20, + "y": 133, + "height": 176 + }, + "index": 288, + "depth": 38, + "type": "TextView", + "ref": "e289" + }, + { + "hittable": false, + "depth": 39, + "parentIndex": 288, + "index": 289, + "rect": { + "width": 362, + "x": 20, + "y": 133, + "height": 176 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "type": "TextView", + "ref": "e290" + }, + { + "parentIndex": 288, + "rect": { + "width": 30, + "x": 349, + "y": 133, + "height": 176 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 39, + "index": 290, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "ref": "e291" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 290, + "type": "Other", + "rect": { + "width": 3, + "x": 376, + "y": 94, + "height": 36 + }, + "index": 291, + "depth": 40, + "ref": "e292" + }, + { + "depth": 39, + "value": "0%", + "type": "Other", + "enabled": true, + "index": 292, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 288, + "rect": { + "width": 362, + "x": 20, + "y": 276, + "height": 30 + }, + "hittable": false, + "ref": "e293" + }, + { + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 292, + "rect": { + "width": 36, + "x": -19, + "y": 303, + "height": 3 + }, + "index": 293, + "ref": "e294" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": 333, + "height": 22 + }, + "index": 294, + "label": "(end of synthetic stream)", + "enabled": true, + "type": "Other", + "depth": 36, + "parentIndex": 274, + "hittable": false, + "ref": "e295" + }, + { + "index": 295, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": 333, + "height": 22 + }, + "type": "Other", + "depth": 37, + "label": "(end of synthetic stream)", + "hittable": false, + "parentIndex": 294, + "ref": "e296" + }, + { + "type": "Other", + "index": 296, + "parentIndex": 295, + "hittable": false, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": 333, + "height": 22 + }, + "depth": 38, + "ref": "e297" + }, + { + "label": "(end of synthetic stream)", + "depth": 38, + "type": "TextView", + "rect": { + "width": 362, + "x": 20, + "y": 333, + "height": 22 + }, + "index": 297, + "value": "(end of synthetic stream)", + "enabled": true, + "parentIndex": 295, + "hittable": false, + "ref": "e298" + }, + { + "parentIndex": 297, + "enabled": true, + "hittable": false, + "depth": 39, + "type": "TextView", + "index": 298, + "rect": { + "width": 183.234375, + "x": 20, + "y": 333, + "height": 22 + }, + "label": "(end of synthetic stream)", + "ref": "e299" + }, + { + "type": "Other", + "depth": 39, + "rect": { + "width": 30, + "x": 349, + "y": 333, + "height": 22 + }, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "index": 299, + "parentIndex": 297, + "hittable": false, + "ref": "e300" + }, + { + "rect": { + "width": 3, + "x": 376, + "y": 294, + "height": 36 + }, + "hittable": false, + "type": "Other", + "index": 300, + "depth": 40, + "parentIndex": 299, + "enabled": true, + "ref": "e301" + }, + { + "parentIndex": 297, + "rect": { + "width": 362, + "x": 20, + "y": 341, + "height": 11 + }, + "depth": 39, + "enabled": true, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "index": 301, + "type": "Other", + "hittable": false, + "ref": "e302" + }, + { + "index": 302, + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "y": 349, + "height": 3 + }, + "type": "Other", + "hittable": false, + "depth": 40, + "parentIndex": 301, + "ref": "e303" + }, + { + "hittable": false, + "index": 303, + "label": "Copy turn", + "depth": 35, + "enabled": true, + "parentIndex": 73, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": 367, + "height": 67 + }, + "ref": "e304" + }, + { + "parentIndex": 303, + "rect": { + "width": 22, + "x": 16, + "y": 380, + "height": 22 + }, + "enabled": true, + "label": "Copy turn", + "depth": 36, + "index": 304, + "hittable": false, + "type": "Button", + "ref": "e305" + }, + { + "type": "Other", + "parentIndex": 303, + "depth": 36, + "enabled": true, + "label": "Fork chat from here", + "index": 305, + "hittable": false, + "rect": { + "width": 22, + "x": 46, + "y": 380, + "height": 22 + }, + "ref": "e306" + }, + { + "type": "Button", + "index": 306, + "depth": 37, + "enabled": true, + "parentIndex": 305, + "hittable": false, + "label": "Fork chat from here", + "identifier": "assistant-fork-menu-trigger", + "rect": { + "width": 22, + "x": 46, + "y": 380, + "height": 22 + }, + "ref": "e307" + }, + { + "index": 307, + "hittable": false, + "parentIndex": 303, + "rect": { + "width": 85.33332824707031, + "x": 76, + "y": 383.3333332538605, + "height": 15.666671752929688 + }, + "label": "Worked for 9s, ended 8:44 PM", + "enabled": true, + "depth": 36, + "type": "Button", + "ref": "e308" + }, + { + "parentIndex": 71, + "index": 308, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "depth": 33, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 164, + "height": 30 + }, + "type": "Other", + "ref": "e309" + }, + { + "hittable": false, + "depth": 34, + "type": "Other", + "parentIndex": 308, + "enabled": true, + "rect": { + "width": 393, + "x": 3, + "y": 164, + "height": 3 + }, + "index": 309, + "ref": "e310" + }, + { + "hittable": false, + "type": "Other", + "label": "Vertical scroll bar, 13 pages", + "value": "0%", + "index": 310, + "rect": { + "width": 30, + "x": 369, + "y": 161, + "height": 273 + }, + "depth": 33, + "parentIndex": 71, + "enabled": true, + "ref": "e311" + }, + { + "enabled": true, + "index": 311, + "rect": { + "width": 3, + "x": 396, + "y": 385.6666666666667, + "height": 45.333333333333314 + }, + "hittable": false, + "type": "Other", + "depth": 34, + "parentIndex": 310, + "ref": "e312" + }, + { + "rect": { + "width": 30, + "x": 369, + "y": 161, + "height": 273 + }, + "type": "Other", + "label": "Vertical scroll bar, 13 pages", + "hittable": false, + "enabled": true, + "parentIndex": 71, + "depth": 33, + "value": "0%", + "index": 312, + "ref": "e313" + }, + { + "hittable": false, + "rect": { + "width": 3, + "x": 396, + "y": 385.6666666666667, + "height": 45.333333333333314 + }, + "type": "Other", + "enabled": true, + "parentIndex": 312, + "depth": 34, + "index": 313, + "ref": "e314" + }, + { + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 164, + "height": 30 + }, + "index": 314, + "parentIndex": 71, + "depth": 33, + "type": "Other", + "hittable": false, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "ref": "e315" + }, + { + "rect": { + "width": 393, + "x": 3, + "y": 164, + "height": 3 + }, + "enabled": true, + "index": 315, + "depth": 34, + "hittable": false, + "type": "Other", + "parentIndex": 314, + "ref": "e316" + }, + { + "identifier": "composer-viewport-content", + "enabled": true, + "index": 316, + "parentIndex": 65, + "type": "Other", + "hittable": false, + "depth": 29, + "label": "Message agent... Message, @files, /commands", + "rect": { + "width": 402, + "x": 0, + "y": 434, + "height": 138 + }, + "ref": "e317" + }, + { + "depth": 30, + "identifier": "message-input-root", + "hittable": false, + "type": "Other", + "rect": { + "width": 370, + "x": 16, + "y": 434, + "height": 88 + }, + "index": 317, + "enabled": true, + "parentIndex": 316, + "ref": "e318" + }, + { + "rect": { + "width": 370, + "x": 16, + "y": 434, + "height": 88 + }, + "enabled": true, + "hittable": false, + "index": 318, + "depth": 30, + "type": "Other", + "parentIndex": 316, + "ref": "e319" + }, + { + "index": 319, + "parentIndex": 316, + "depth": 30, + "rect": { + "width": 344, + "x": 29, + "y": 443, + "height": 30 + }, + "hittable": false, + "label": "Message agent... Message, @files, /commands", + "type": "Other", + "enabled": true, + "ref": "e320" + }, + { + "rect": { + "width": 344, + "x": 29, + "y": 443, + "height": 30 + }, + "label": "Message agent... Message, @files, /commands", + "index": 320, + "parentIndex": 319, + "depth": 31, + "type": "TextView", + "enabled": true, + "hittable": false, + "ref": "e321" + }, + { + "rect": { + "width": 30, + "x": 340, + "y": 443, + "height": 30 + }, + "hittable": false, + "value": "0%", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "index": 321, + "depth": 32, + "type": "Other", + "parentIndex": 320, + "ref": "e322" + }, + { + "parentIndex": 321, + "rect": { + "width": 3, + "x": 367, + "y": 439, + "height": 31 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 322, + "depth": 33, + "ref": "e323" + }, + { + "type": "Other", + "index": 323, + "enabled": true, + "hittable": false, + "depth": 32, + "rect": { + "width": 344, + "x": 29, + "y": 455, + "height": 15 + }, + "value": "0%", + "parentIndex": 320, + "label": "Horizontal scroll bar, 1 page", + "ref": "e324" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 338, + "x": 32, + "y": 467, + "height": 3 + }, + "index": 324, + "hittable": false, + "depth": 33, + "parentIndex": 323, + "ref": "e325" + }, + { + "depth": 30, + "label": "Add attachment", + "identifier": "message-input-attach-button", + "parentIndex": 316, + "type": "Button", + "hittable": false, + "index": 325, + "rect": { + "width": 28, + "x": 23, + "y": 485, + "height": 28 + }, + "enabled": true, + "ref": "e326" + }, + { + "label": "Select model (Ten second stream)", + "index": 326, + "depth": 30, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 316, + "rect": { + "width": 232, + "x": 51, + "y": 485, + "height": 28 + }, + "ref": "e327" + }, + { + "rect": { + "width": 202, + "x": 51, + "y": 485, + "height": 28 + }, + "depth": 31, + "identifier": "combined-model-selector", + "label": "Select model (Ten second stream)", + "hittable": false, + "type": "Button", + "enabled": true, + "index": 327, + "parentIndex": 326, + "ref": "e328" + }, + { + "hittable": false, + "index": 328, + "type": "Image", + "depth": 30, + "identifier": "context-window-meter", + "label": "Context window 3% used", + "enabled": true, + "parentIndex": 316, + "rect": { + "width": 28, + "x": 283, + "y": 485, + "height": 28 + }, + "ref": "e329" + }, + { + "depth": 30, + "rect": { + "width": 28, + "x": 315, + "y": 485, + "height": 28 + }, + "parentIndex": 316, + "enabled": true, + "label": "Start dictation", + "hittable": false, + "type": "Button", + "index": 329, + "ref": "e330" + }, + { + "hittable": false, + "depth": 30, + "type": "Button", + "rect": { + "width": 28, + "x": 351, + "y": 485, + "height": 28 + }, + "label": "Enable Voice mode", + "parentIndex": 316, + "index": 330, + "enabled": true, + "ref": "e331" + }, + { + "index": 331, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 11, + "enabled": true, + "parentIndex": 16, + "ref": "e332" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 332, + "parentIndex": 10, + "ref": "e333" + }, + { + "parentIndex": 332, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "index": 333, + "type": "Other", + "depth": 8, + "ref": "e334" + }, + { + "index": 334, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "enabled": true, + "depth": 9, + "parentIndex": 333, + "ref": "e335" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "type": "Window", + "depth": 1, + "parentIndex": 0, + "index": 335, + "ref": "e336" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 335, + "hittable": false, + "type": "Other", + "depth": 2, + "enabled": true, + "index": 336, + "ref": "e337" + }, + { + "depth": 3, + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 336, + "index": 337, + "ref": "e338" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "depth": 3, + "index": 338, + "parentIndex": 336, + "enabled": true, + "type": "Other", + "ref": "e339" + }, + { + "index": 339, + "type": "Other", + "parentIndex": 338, + "enabled": true, + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 278 + }, + "hittable": false, + "ref": "e340" + }, + { + "label": "Emoji", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Window", + "depth": 1, + "hittable": true, + "parentIndex": 0, + "index": 340, + "ref": "e341" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 340, + "label": "Emoji", + "depth": 2, + "enabled": true, + "index": 341, + "hittable": true, + "type": "Other", + "ref": "e342" + }, + { + "index": 342, + "depth": 3, + "parentIndex": 341, + "hittable": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "enabled": true, + "label": "Emoji", + "ref": "e343" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "type": "Other", + "index": 343, + "parentIndex": 342, + "depth": 4, + "ref": "e344" + }, + { + "parentIndex": 343, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "index": 344, + "depth": 5, + "type": "Other", + "hittable": false, + "ref": "e345" + }, + { + "depth": 6, + "hittable": false, + "index": 345, + "parentIndex": 344, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "ref": "e346" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "type": "Other", + "label": "Typing Predictions", + "parentIndex": 342, + "identifier": "SystemInputAssistantView", + "depth": 4, + "index": 346, + "hittable": true, + "ref": "e347" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "hittable": true, + "label": "Typing Predictions", + "index": 347, + "type": "Other", + "depth": 5, + "parentIndex": 346, + "ref": "e348" + }, + { + "index": 348, + "enabled": true, + "depth": 6, + "label": "Typing Predictions", + "identifier": "CenterPageView", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "parentIndex": 347, + "type": "Other", + "hittable": true, + "ref": "e349" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 348, + "enabled": true, + "index": 349, + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "y": -62, + "height": 1245 + }, + "ref": "e350" + }, + { + "depth": 8, + "index": 350, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "type": "ScrollView", + "enabled": true, + "parentIndex": 349, + "hittable": false, + "ref": "e351" + }, + { + "label": "Typing Predictions", + "type": "Other", + "parentIndex": 348, + "index": 351, + "hittable": true, + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "ref": "e352" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "type": "Other", + "parentIndex": 351, + "hittable": true, + "depth": 8, + "index": 352, + "enabled": true, + "ref": "e353" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "hittable": true, + "parentIndex": 352, + "label": "I", + "enabled": true, + "index": 353, + "depth": 9, + "type": "Other", + "ref": "e354" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 354, + "hittable": true, + "type": "Other", + "enabled": true, + "depth": 10, + "parentIndex": 353, + "label": "I", + "ref": "e355" + }, + { + "hittable": true, + "enabled": true, + "rect": { + "width": 134, + "x": 0, + "y": 538, + "height": 45 + }, + "type": "Other", + "index": 355, + "parentIndex": 354, + "label": "I", + "depth": 11, + "ref": "e356" + }, + { + "rect": { + "width": 134, + "x": 134, + "y": 538, + "height": 45 + }, + "label": "The", + "depth": 11, + "enabled": true, + "parentIndex": 354, + "hittable": true, + "index": 356, + "type": "Other", + "ref": "e357" + }, + { + "depth": 11, + "type": "Other", + "rect": { + "width": 134, + "x": 268, + "y": 538, + "height": 45 + }, + "hittable": true, + "label": "I’m", + "enabled": true, + "parentIndex": 354, + "index": 357, + "ref": "e358" + }, + { + "parentIndex": 342, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 358, + "type": "Other", + "depth": 4, + "ref": "e359" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "depth": 5, + "index": 359, + "hittable": false, + "parentIndex": 358, + "enabled": true, + "ref": "e360" + }, + { + "depth": 6, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "parentIndex": 359, + "enabled": true, + "index": 360, + "ref": "e361" + }, + { + "depth": 7, + "parentIndex": 360, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "index": 361, + "hittable": false, + "ref": "e362" + }, + { + "depth": 4, + "parentIndex": 342, + "enabled": true, + "type": "Other", + "label": "Q", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 362, + "hittable": false, + "ref": "e363" + }, + { + "index": 363, + "depth": 5, + "parentIndex": 362, + "enabled": true, + "hittable": false, + "type": "Keyboard", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "label": "Q", + "ref": "e364" + }, + { + "parentIndex": 363, + "hittable": false, + "depth": 6, + "label": "Q", + "index": 364, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "enabled": true, + "type": "Other", + "ref": "e365" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 365, + "enabled": true, + "label": "Q", + "depth": 7, + "parentIndex": 364, + "hittable": false, + "type": "Other", + "identifier": "UIKeyboardLayoutStar Preview", + "ref": "e366" + }, + { + "enabled": true, + "type": "Key", + "label": "Q", + "hittable": false, + "rect": { + "width": 40.333333333333336, + "x": 0, + "y": 590, + "height": 46 + }, + "index": 366, + "parentIndex": 365, + "depth": 8, + "ref": "e367" + }, + { + "label": "W", + "hittable": false, + "depth": 8, + "type": "Key", + "enabled": true, + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 590, + "height": 46 + }, + "parentIndex": 365, + "index": 367, + "ref": "e368" + }, + { + "hittable": false, + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 590, + "height": 46 + }, + "type": "Key", + "index": 368, + "depth": 8, + "enabled": true, + "label": "E", + "parentIndex": 365, + "ref": "e369" + }, + { + "hittable": false, + "index": 369, + "depth": 8, + "enabled": true, + "rect": { + "width": 40, + "x": 120.66666666666669, + "y": 590, + "height": 46 + }, + "parentIndex": 365, + "label": "R", + "type": "Key", + "ref": "e370" + }, + { + "depth": 8, + "label": "T", + "type": "Key", + "parentIndex": 365, + "enabled": true, + "index": 370, + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 590, + "height": 46 + }, + "hittable": false, + "ref": "e371" + }, + { + "enabled": true, + "label": "Y", + "depth": 8, + "parentIndex": 365, + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 590, + "height": 46 + }, + "index": 371, + "type": "Key", + "hittable": false, + "ref": "e372" + }, + { + "hittable": false, + "depth": 8, + "label": "U", + "rect": { + "width": 40, + "x": 241.33333333333337, + "y": 590, + "height": 46 + }, + "enabled": true, + "parentIndex": 365, + "type": "Key", + "index": 372, + "ref": "e373" + }, + { + "hittable": false, + "depth": 8, + "label": "I", + "index": 373, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 590, + "height": 46 + }, + "enabled": true, + "parentIndex": 365, + "ref": "e374" + }, + { + "rect": { + "width": 40, + "x": 321.6666666666667, + "y": 590, + "height": 46 + }, + "parentIndex": 365, + "index": 374, + "label": "O", + "hittable": false, + "enabled": true, + "type": "Key", + "depth": 8, + "ref": "e375" + }, + { + "label": "P", + "parentIndex": 365, + "enabled": true, + "depth": 8, + "index": 375, + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 590, + "height": 46 + }, + "type": "Key", + "ref": "e376" + }, + { + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 644, + "height": 46 + }, + "enabled": true, + "type": "Key", + "depth": 8, + "index": 376, + "parentIndex": 365, + "label": "A", + "hittable": false, + "ref": "e377" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 644, + "height": 46 + }, + "index": 377, + "depth": 8, + "label": "S", + "type": "Key", + "parentIndex": 365, + "enabled": true, + "hittable": false, + "ref": "e378" + }, + { + "enabled": true, + "label": "D", + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 644, + "height": 46 + }, + "index": 378, + "parentIndex": 365, + "type": "Key", + "hittable": false, + "depth": 8, + "ref": "e379" + }, + { + "depth": 8, + "index": 379, + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 644, + "height": 46 + }, + "enabled": true, + "label": "F", + "hittable": false, + "parentIndex": 365, + "type": "Key", + "ref": "e380" + }, + { + "index": 380, + "hittable": false, + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 644, + "height": 46 + }, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "G", + "parentIndex": 365, + "ref": "e381" + }, + { + "index": 381, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 644, + "height": 46 + }, + "label": "H", + "type": "Key", + "parentIndex": 365, + "enabled": true, + "depth": 8, + "hittable": false, + "ref": "e382" + }, + { + "label": "J", + "type": "Key", + "depth": 8, + "rect": { + "width": 40, + "x": 261.536, + "y": 644, + "height": 46 + }, + "enabled": true, + "hittable": false, + "parentIndex": 365, + "index": 382, + "ref": "e383" + }, + { + "index": 383, + "parentIndex": 365, + "enabled": true, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 644, + "height": 46 + }, + "type": "Key", + "label": "K", + "hittable": false, + "ref": "e384" + }, + { + "type": "Key", + "parentIndex": 365, + "label": "L", + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 644, + "height": 46 + }, + "enabled": true, + "index": 384, + "hittable": false, + "depth": 8, + "ref": "e385" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 365, + "rect": { + "width": 51.333333333333336, + "x": 0, + "y": 698, + "height": 46 + }, + "type": "Button", + "label": "shift", + "index": 385, + "identifier": "shift", + "selected": true, + "depth": 8, + "ref": "e386" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 698, + "height": 46 + }, + "index": 386, + "label": "Z", + "hittable": false, + "parentIndex": 365, + "depth": 8, + "type": "Key", + "enabled": true, + "ref": "e387" + }, + { + "parentIndex": 365, + "enabled": true, + "hittable": false, + "label": "X", + "depth": 8, + "index": 387, + "type": "Key", + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 698, + "height": 46 + }, + "ref": "e388" + }, + { + "parentIndex": 365, + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 698, + "height": 46 + }, + "index": 388, + "type": "Key", + "label": "C", + "depth": 8, + "hittable": false, + "enabled": true, + "ref": "e389" + }, + { + "depth": 8, + "enabled": true, + "type": "Key", + "label": "V", + "parentIndex": 365, + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 698, + "height": 46 + }, + "index": 389, + "hittable": false, + "ref": "e390" + }, + { + "depth": 8, + "label": "B", + "hittable": false, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 698, + "height": 46 + }, + "parentIndex": 365, + "type": "Key", + "index": 390, + "ref": "e391" + }, + { + "parentIndex": 365, + "label": "N", + "index": 391, + "rect": { + "width": 40, + "x": 261.536, + "y": 698, + "height": 46 + }, + "type": "Key", + "hittable": false, + "enabled": true, + "depth": 8, + "ref": "e392" + }, + { + "index": 392, + "type": "Key", + "label": "M", + "hittable": false, + "depth": 8, + "parentIndex": 365, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 698, + "height": 46 + }, + "ref": "e393" + }, + { + "parentIndex": 365, + "enabled": true, + "index": 393, + "label": "delete", + "hittable": false, + "depth": 8, + "type": "Key", + "identifier": "delete", + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 698, + "height": 46 + }, + "ref": "e394" + }, + { + "type": "Key", + "label": "numbers", + "depth": 8, + "identifier": "more", + "enabled": true, + "index": 394, + "parentIndex": 365, + "hittable": false, + "rect": { + "width": 101, + "x": 0, + "y": 752, + "height": 46 + }, + "ref": "e395" + }, + { + "hittable": false, + "label": "space", + "index": 395, + "depth": 8, + "identifier": "space", + "parentIndex": 365, + "enabled": true, + "type": "Key", + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 752, + "height": 46 + }, + "ref": "e396" + }, + { + "hittable": false, + "type": "Button", + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 752, + "height": 46 + }, + "depth": 8, + "identifier": "Return", + "enabled": true, + "label": "return", + "index": 396, + "parentIndex": 365, + "ref": "e397" + }, + { + "parentIndex": 342, + "type": "Other", + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "index": 397, + "hittable": true, + "label": "Emoji", + "enabled": true, + "ref": "e398" + }, + { + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 68.73516393505099 + }, + "type": "Button", + "enabled": true, + "label": "Emoji", + "depth": 5, + "hittable": true, + "parentIndex": 397, + "index": 398, + "ref": "e399" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "depth": 6, + "rect": { + "width": 0, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 0 + }, + "index": 399, + "parentIndex": 398, + "ref": "e400" + }, + { + "parentIndex": 397, + "enabled": true, + "type": "Button", + "depth": 5, + "label": "Dictate", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "index": 400, + "hittable": false, + "identifier": "dictation", + "ref": "e401" + }, + { + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "index": 401, + "hittable": false, + "depth": 6, + "enabled": true, + "type": "StaticText", + "parentIndex": 400, + "ref": "e402" + }, + { + "type": "Button", + "index": 402, + "depth": 5, + "identifier": "dictation", + "label": "Dictate", + "enabled": true, + "hittable": true, + "parentIndex": 397, + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "ref": "e403" + }, + { + "depth": 6, + "hittable": false, + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "type": "StaticText", + "index": 403, + "parentIndex": 402, + "enabled": true, + "ref": "e404" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 404, + "totalNodeCount": 404, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 24, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 24 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 24 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776089 + } +} diff --git a/scroll-regression/ios/chat-flick.json b/scroll-regression/ios/chat-flick.json new file mode 100644 index 0000000000..d029450913 --- /dev/null +++ b/scroll-regression/ios/chat-flick.json @@ -0,0 +1,8318 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "enabled": true, + "hittable": true, + "index": 0, + "depth": 0, + "label": "Paseo Debug", + "type": "Application", + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "ref": "e1" + }, + { + "type": "Window", + "depth": 1, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 0, + "enabled": true, + "index": 1, + "hittable": false, + "ref": "e2" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 1, + "index": 2, + "depth": 2, + "ref": "e3" + }, + { + "hittable": false, + "type": "Other", + "depth": 3, + "parentIndex": 2, + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 3, + "ref": "e4" + }, + { + "enabled": true, + "parentIndex": 3, + "index": 4, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "depth": 4, + "ref": "e5" + }, + { + "depth": 5, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 5, + "parentIndex": 4, + "ref": "e6" + }, + { + "hittable": false, + "depth": 6, + "type": "Other", + "parentIndex": 5, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 6, + "ref": "e7" + }, + { + "hittable": false, + "index": 7, + "depth": 7, + "parentIndex": 6, + "type": "Other", + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "ref": "e8" + }, + { + "type": "Other", + "index": 8, + "depth": 8, + "parentIndex": 7, + "enabled": true, + "hittable": false, + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "ref": "e9" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 9, + "type": "Other", + "parentIndex": 8, + "enabled": true, + "hittable": false, + "index": 9, + "ref": "e10" + }, + { + "index": 10, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 9, + "type": "Other", + "enabled": true, + "parentIndex": 8, + "ref": "e11" + }, + { + "parentIndex": 10, + "enabled": true, + "hittable": false, + "depth": 10, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 11, + "ref": "e12" + }, + { + "index": 12, + "parentIndex": 10, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 10, + "ref": "e13" + }, + { + "hittable": false, + "index": 13, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 12, + "type": "Other", + "depth": 11, + "enabled": true, + "ref": "e14" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 12, + "hittable": false, + "depth": 11, + "index": 14, + "enabled": true, + "ref": "e15" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 14, + "depth": 12, + "type": "Other", + "index": 15, + "ref": "e16" + }, + { + "index": 16, + "type": "Other", + "hittable": false, + "depth": 13, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "parentIndex": 15, + "ref": "e17" + }, + { + "depth": 14, + "parentIndex": 16, + "type": "Other", + "index": 17, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "ref": "e18" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 17, + "depth": 15, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "index": 18, + "type": "Other", + "ref": "e19" + }, + { + "parentIndex": 18, + "index": 19, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "depth": 16, + "hittable": false, + "type": "Other", + "ref": "e20" + }, + { + "enabled": true, + "index": 20, + "depth": 17, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "parentIndex": 19, + "ref": "e21" + }, + { + "hittable": false, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "depth": 18, + "type": "Other", + "parentIndex": 20, + "enabled": true, + "index": 21, + "ref": "e22" + }, + { + "index": 22, + "type": "Other", + "enabled": true, + "parentIndex": 21, + "hittable": false, + "depth": 19, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "ref": "e23" + }, + { + "index": 23, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 22, + "enabled": true, + "depth": 20, + "type": "Other", + "hittable": false, + "ref": "e24" + }, + { + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "depth": 21, + "index": 24, + "enabled": true, + "label": "Switch tabs (2 open)", + "type": "Other", + "parentIndex": 23, + "hittable": false, + "ref": "e25" + }, + { + "hittable": false, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "parentIndex": 24, + "index": 25, + "enabled": true, + "type": "Other", + "depth": 22, + "ref": "e26" + }, + { + "hittable": false, + "index": 26, + "depth": 23, + "type": "Other", + "parentIndex": 25, + "label": "Open menu", + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "ref": "e27" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 26, + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "index": 27, + "depth": 24, + "ref": "e28" + }, + { + "identifier": "composer-dock-header", + "index": 28, + "hittable": false, + "depth": 25, + "parentIndex": 27, + "label": "Open menu", + "type": "Other", + "enabled": true, + "rect": { + "height": 126, + "y": 0, + "width": 402, + "x": 0 + }, + "ref": "e29" + }, + { + "enabled": true, + "type": "Other", + "index": 29, + "hittable": false, + "rect": { + "height": 56, + "y": 70, + "width": 402, + "x": 0 + }, + "depth": 26, + "parentIndex": 28, + "ref": "e30" + }, + { + "rect": { + "height": 32, + "y": 81.6666669845581, + "width": 32, + "x": 8 + }, + "hittable": false, + "enabled": true, + "depth": 26, + "type": "Button", + "parentIndex": 28, + "identifier": "menu-button", + "label": "Open menu", + "index": 30, + "ref": "e31" + }, + { + "hittable": false, + "index": 31, + "parentIndex": 30, + "enabled": true, + "rect": { + "height": 12, + "y": 91.6666669845581, + "width": 16, + "x": 16 + }, + "depth": 27, + "type": "Other", + "ref": "e32" + }, + { + "enabled": true, + "depth": 28, + "index": 32, + "hittable": false, + "type": "Other", + "parentIndex": 31, + "rect": { + "height": 1.3333358764648438, + "y": 91.6666669845581, + "width": 16, + "x": 16 + }, + "ref": "e33" + }, + { + "depth": 28, + "hittable": false, + "rect": { + "height": 1.6666717529296875, + "y": 97.00000047683716, + "width": 16, + "x": 16 + }, + "index": 33, + "enabled": true, + "type": "Other", + "parentIndex": 31, + "ref": "e34" + }, + { + "parentIndex": 31, + "enabled": true, + "rect": { + "height": 1.6666641235351562, + "y": 102.33333396911621, + "width": 8, + "x": 16 + }, + "type": "Other", + "index": 34, + "depth": 28, + "hittable": false, + "ref": "e35" + }, + { + "type": "Other", + "label": "main", + "depth": 26, + "rect": { + "height": 34, + "y": 80.6666669845581, + "width": 314, + "x": 48 + }, + "hittable": false, + "index": 35, + "enabled": true, + "parentIndex": 28, + "ref": "e36" + }, + { + "depth": 27, + "index": 36, + "hittable": false, + "enabled": true, + "parentIndex": 35, + "label": "main", + "type": "Other", + "rect": { + "height": 34, + "y": 80.6666669845581, + "width": 278, + "x": 48 + }, + "ref": "e37" + }, + { + "rect": { + "height": 18, + "y": 80.6666669845581, + "width": 278, + "x": 48 + }, + "identifier": "workspace-header-title", + "type": "StaticText", + "enabled": true, + "depth": 28, + "index": 37, + "parentIndex": 36, + "label": "main", + "hittable": false, + "ref": "e38" + }, + { + "rect": { + "height": 18, + "y": 80.6666669845581, + "width": 278, + "x": 48 + }, + "depth": 29, + "parentIndex": 37, + "enabled": true, + "index": 38, + "hittable": false, + "type": "StaticText", + "label": "main", + "ref": "e39" + }, + { + "identifier": "workspace-header-subtitle", + "depth": 28, + "type": "StaticText", + "enabled": true, + "rect": { + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48 + }, + "parentIndex": 36, + "hittable": false, + "index": 39, + "label": "composer-dock-ios-fixture", + "ref": "e40" + }, + { + "label": "composer-dock-ios-fixture", + "rect": { + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48 + }, + "depth": 29, + "enabled": true, + "index": 40, + "type": "StaticText", + "hittable": false, + "parentIndex": 39, + "ref": "e41" + }, + { + "label": "·", + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "depth": 28, + "enabled": true, + "index": 41, + "type": "StaticText", + "hittable": false, + "parentIndex": 36, + "ref": "e42" + }, + { + "label": "·", + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "depth": 29, + "enabled": true, + "index": 42, + "type": "StaticText", + "hittable": false, + "parentIndex": 41, + "ref": "e43" + }, + { + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "rect": { + "y": 98.6666669845581, + "width": 68.00001525878906, + "height": 16, + "x": 227.3333282470703 + }, + "depth": 28, + "enabled": true, + "index": 43, + "type": "Other", + "hittable": false, + "parentIndex": 36, + "ref": "e44" + }, + { + "rect": { + "y": 100.6666669845581, + "width": 12, + "height": 12, + "x": 227.3333282470703 + }, + "depth": 28, + "enabled": true, + "index": 44, + "type": "Other", + "hittable": false, + "parentIndex": 36, + "ref": "e45" + }, + { + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 11, + "x": 227.8333282470703 + }, + "depth": 29, + "enabled": true, + "index": 45, + "type": "Other", + "hittable": false, + "parentIndex": 44, + "ref": "e46" + }, + { + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "depth": 30, + "enabled": true, + "index": 46, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "ref": "e47" + }, + { + "rect": { + "y": 107.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "depth": 30, + "enabled": true, + "index": 47, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "ref": "e48" + }, + { + "rect": { + "y": 103.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "depth": 30, + "enabled": true, + "index": 48, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "ref": "e49" + }, + { + "rect": { + "y": 109.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "depth": 30, + "enabled": true, + "index": 49, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "ref": "e50" + }, + { + "label": "dev-new", + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "depth": 28, + "enabled": true, + "index": 50, + "type": "StaticText", + "hittable": false, + "parentIndex": 36, + "ref": "e51" + }, + { + "label": "dev-new", + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "depth": 29, + "enabled": true, + "index": 51, + "type": "StaticText", + "hittable": false, + "parentIndex": 50, + "ref": "e52" + }, + { + "identifier": "workspace-header-menu-trigger", + "label": "Workspace actions", + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 330 + }, + "depth": 27, + "enabled": true, + "index": 52, + "type": "Button", + "hittable": false, + "parentIndex": 35, + "ref": "e53" + }, + { + "identifier": "workspace-explorer-toggle", + "label": "Open Explorer sidebar", + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 362 + }, + "depth": 26, + "enabled": true, + "index": 53, + "type": "Button", + "hittable": false, + "parentIndex": 28, + "ref": "e54" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 54, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "ref": "e55" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 55, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "ref": "e56" + }, + { + "identifier": "workspace-tab-switcher-trigger", + "label": "Switch tabs (2 open)", + "rect": { + "y": 126, + "width": 402, + "height": 34, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 56, + "type": "Button", + "hittable": false, + "parentIndex": 27, + "ref": "e57" + }, + { + "identifier": "workspace-active-tab-icon", + "rect": { + "y": 136, + "width": 14, + "height": 14, + "x": 20 + }, + "depth": 26, + "enabled": true, + "index": 57, + "type": "Other", + "hittable": false, + "parentIndex": 56, + "ref": "e58" + }, + { + "identifier": "workspace-tabs-row", + "rect": { + "y": 126, + "width": 402, + "height": 35, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 58, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "ref": "e59" + }, + { + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 59, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "ref": "e60" + }, + { + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 25, + "enabled": true, + "index": 60, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "ref": "e61" + }, + { + "label": "Add attachment", + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 26, + "enabled": true, + "index": 61, + "type": "Other", + "hittable": false, + "parentIndex": 60, + "ref": "e62" + }, + { + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 27, + "enabled": true, + "index": 62, + "type": "Other", + "hittable": false, + "parentIndex": 61, + "ref": "e63" + }, + { + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 27, + "enabled": true, + "index": 63, + "type": "Other", + "hittable": false, + "parentIndex": 61, + "ref": "e64" + }, + { + "identifier": "composer-viewport", + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 161, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 27, + "enabled": true, + "index": 64, + "type": "Other", + "hittable": false, + "parentIndex": 61, + "ref": "e65" + }, + { + "label": "Scroll to bottom", + "rect": { + "y": -141, + "width": 402, + "height": 713, + "x": 0 + }, + "depth": 28, + "enabled": true, + "index": 65, + "type": "Other", + "hittable": false, + "parentIndex": 64, + "ref": "e66" + }, + { + "identifier": "composer-dock-content", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -141, + "width": 402, + "height": 575, + "x": 0 + }, + "depth": 29, + "enabled": true, + "index": 66, + "type": "Other", + "hittable": false, + "parentIndex": 65, + "ref": "e67" + }, + { + "rect": { + "y": -141, + "width": 402, + "height": 575, + "x": 0 + }, + "depth": 30, + "enabled": true, + "index": 67, + "type": "Other", + "hittable": false, + "parentIndex": 66, + "ref": "e68" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -141, + "width": 402, + "height": 575, + "x": 0 + }, + "depth": 30, + "enabled": true, + "index": 68, + "type": "Other", + "hittable": false, + "parentIndex": 66, + "ref": "e69" + }, + { + "rect": { + "y": -141, + "width": 402, + "height": 575, + "x": 0 + }, + "depth": 31, + "enabled": true, + "index": 69, + "type": "Other", + "hittable": false, + "parentIndex": 68, + "ref": "e70" + }, + { + "identifier": "agent-chat-scroll", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -141, + "width": 402, + "height": 575, + "x": 0 + }, + "depth": 31, + "enabled": true, + "index": 70, + "type": "Other", + "hittable": false, + "parentIndex": 68, + "ref": "e71" + }, + { + "label": "Thinking", + "rect": { + "y": -141, + "width": 402, + "height": 575.0000000000002, + "x": 0 + }, + "depth": 32, + "enabled": true, + "index": 71, + "type": "ScrollView", + "hittable": false, + "parentIndex": 70, + "ref": "e72" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3831.666829427083, + "width": 402, + "height": 6169.33349609375, + "x": 0 + }, + "depth": 33, + "enabled": true, + "index": 72, + "type": "Other", + "hittable": false, + "parentIndex": 71, + "ref": "e73" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3831.666829427083, + "width": 402, + "height": 6169.33349609375, + "x": 0 + }, + "depth": 34, + "enabled": true, + "index": 73, + "type": "Other", + "hittable": false, + "parentIndex": 72, + "ref": "e74" + }, + { + "rect": { + "y": -3831.666829427083, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 74, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e75" + }, + { + "identifier": "older-history-slot", + "rect": { + "y": -3831.666829427083, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 36, + "enabled": true, + "index": 75, + "type": "Other", + "hittable": false, + "parentIndex": 74, + "ref": "e76" + }, + { + "rect": { + "y": -3799.666829427083, + "width": 378, + "height": 747, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 76, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e77" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3052.666829427083, + "width": 378, + "height": 1725.33349609375, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 77, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e78" + }, + { + "identifier": "user-message", + "rect": { + "y": -3052.666829427083, + "width": 362, + "height": 1725.33349609375, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 78, + "type": "Other", + "hittable": false, + "parentIndex": 77, + "ref": "e79" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3052.666829427083, + "width": 362, + "height": 1725.33349609375, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 79, + "type": "Other", + "hittable": false, + "parentIndex": 77, + "ref": "e80" + }, + { + "rect": { + "y": -3052.666829427083, + "width": 362, + "height": 1693.33349609375, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 80, + "type": "Other", + "hittable": false, + "parentIndex": 79, + "ref": "e81" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3036.666829427083, + "width": 330, + "height": 1661.66650390625, + "x": 36 + }, + "depth": 37, + "enabled": true, + "index": 81, + "type": "StaticText", + "hittable": false, + "parentIndex": 79, + "ref": "e82" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "y": -3036.666829427083, + "width": 330, + "height": 1661.66650390625, + "x": 36 + }, + "depth": 38, + "enabled": true, + "index": 82, + "type": "StaticText", + "hittable": false, + "parentIndex": 81, + "ref": "e83" + }, + { + "identifier": "user-message-trailing-row", + "rect": { + "y": -1351.3334554036458, + "width": 107.66665649414062, + "height": 24, + "x": 274.3333282470703 + }, + "depth": 37, + "enabled": true, + "index": 83, + "type": "Other", + "hittable": false, + "parentIndex": 79, + "ref": "e84" + }, + { + "identifier": "user-message-timestamp", + "label": "8:53 PM", + "rect": { + "y": -1347.3334554036458, + "width": 49.666656494140625, + "height": 15.66650390625, + "x": 274.3333282470703 + }, + "depth": 37, + "enabled": true, + "index": 84, + "type": "StaticText", + "hittable": false, + "parentIndex": 79, + "ref": "e85" + }, + { + "label": "8:53 PM", + "rect": { + "y": -1347.3334554036458, + "width": 49.666656494140625, + "height": 15.66650390625, + "x": 274.3333282470703 + }, + "depth": 38, + "enabled": true, + "index": 85, + "type": "StaticText", + "hittable": false, + "parentIndex": 84, + "ref": "e86" + }, + { + "label": "Rewind to this message", + "rect": { + "y": -1351.3334554036458, + "width": 24, + "height": 24, + "x": 331.99999618530273 + }, + "depth": 37, + "enabled": true, + "index": 86, + "type": "Other", + "hittable": false, + "parentIndex": 79, + "ref": "e87" + }, + { + "identifier": "rewind-menu-trigger", + "label": "Rewind to this message", + "rect": { + "y": -1351.3334554036458, + "width": 24, + "height": 24, + "x": 331.99999618530273 + }, + "depth": 38, + "enabled": true, + "index": 87, + "type": "Button", + "hittable": false, + "parentIndex": 86, + "ref": "e88" + }, + { + "label": "Copy message", + "rect": { + "y": -1350.3334554036458, + "width": 22, + "height": 22, + "x": 363.99999237060547 + }, + "depth": 37, + "enabled": true, + "index": 88, + "type": "Button", + "hittable": false, + "parentIndex": 79, + "ref": "e89" + }, + { + "label": "Cycle 1", + "rect": { + "y": -1327.3333333333333, + "width": 378, + "height": 394, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 89, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e90" + }, + { + "identifier": "assistant-message", + "rect": { + "y": -1327.3333333333333, + "width": 362, + "height": 390, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 90, + "type": "Other", + "hittable": false, + "parentIndex": 89, + "ref": "e91" + }, + { + "label": "Cycle 1", + "rect": { + "y": -1291.3333333333333, + "width": 84, + "height": 33, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 91, + "type": "Other", + "hittable": false, + "parentIndex": 89, + "ref": "e92" + }, + { + "label": "Cycle 1", + "rect": { + "y": -1291.3333333333333, + "width": 84, + "height": 33, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 92, + "type": "Other", + "hittable": false, + "parentIndex": 91, + "ref": "e93" + }, + { + "rect": { + "y": -1291.3333333333333, + "width": 84, + "height": 33, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 93, + "type": "Other", + "hittable": false, + "parentIndex": 92, + "ref": "e94" + }, + { + "value": "Cycle 1", + "label": "Cycle 1", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 94, + "type": "TextView", + "hittable": false, + "parentIndex": 92, + "ref": "e95" + }, + { + "label": "Cycle 1", + "rect": { + "y": -1291.3333333333333, + "width": 83.7953545153141, + "height": 33, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 95, + "type": "TextView", + "hittable": false, + "parentIndex": 94, + "ref": "e96" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -1291.3333333333333, + "width": 30, + "height": 33, + "x": 71 + }, + "depth": 39, + "enabled": true, + "index": 96, + "type": "Other", + "hittable": false, + "parentIndex": 94, + "ref": "e97" + }, + { + "rect": { + "y": -1330.3333333333333, + "width": 3, + "height": 36, + "x": 98 + }, + "depth": 40, + "enabled": true, + "index": 97, + "type": "Other", + "hittable": false, + "parentIndex": 96, + "ref": "e98" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -1277.8333333333333, + "width": 84, + "height": 16.5, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 98, + "type": "Other", + "hittable": false, + "parentIndex": 94, + "ref": "e99" + }, + { + "rect": { + "y": -1264.3333333333333, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 99, + "type": "Other", + "hittable": false, + "parentIndex": 98, + "ref": "e100" + }, + { + "rect": { + "y": -1291.3333333333333, + "width": 362, + "height": 42, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 100, + "type": "Other", + "hittable": false, + "parentIndex": 89, + "ref": "e101" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": -1225.3333333333333, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 101, + "type": "Other", + "hittable": false, + "parentIndex": 89, + "ref": "e102" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": -1225.3333333333333, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 102, + "type": "Other", + "hittable": false, + "parentIndex": 101, + "ref": "e103" + }, + { + "rect": { + "y": -1225.3333333333333, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 103, + "type": "Other", + "hittable": false, + "parentIndex": 102, + "ref": "e104" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 104, + "type": "TextView", + "hittable": false, + "parentIndex": 102, + "ref": "e105" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "rect": { + "y": -1225.3333333333333, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 105, + "type": "TextView", + "hittable": false, + "parentIndex": 104, + "ref": "e106" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -1225.3333333333333, + "width": 30, + "height": 264, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 106, + "type": "Other", + "hittable": false, + "parentIndex": 104, + "ref": "e107" + }, + { + "rect": { + "y": -1264.3333333333333, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 107, + "type": "Other", + "hittable": false, + "parentIndex": 106, + "ref": "e108" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -994.3333333333333, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 108, + "type": "Other", + "hittable": false, + "parentIndex": 104, + "ref": "e109" + }, + { + "rect": { + "y": -967.3333333333333, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 109, + "type": "Other", + "hittable": false, + "parentIndex": 108, + "ref": "e110" + }, + { + "label": "Thinking", + "rect": { + "y": -933.3333333333333, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 110, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e111" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -933.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 111, + "type": "Other", + "hittable": false, + "parentIndex": 110, + "ref": "e112" + }, + { + "label": "Thinking", + "rect": { + "y": -933.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 112, + "type": "Button", + "hittable": false, + "parentIndex": 110, + "ref": "e113" + }, + { + "label": "Thinking", + "rect": { + "y": -926.3333333333333, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 113, + "type": "Other", + "hittable": false, + "parentIndex": 112, + "ref": "e114" + }, + { + "label": "Thinking", + "rect": { + "y": -926.3333333333333, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 114, + "type": "StaticText", + "hittable": false, + "parentIndex": 113, + "ref": "e115" + }, + { + "label": "Thinking", + "rect": { + "y": -926.3333333333333, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 115, + "type": "StaticText", + "hittable": false, + "parentIndex": 114, + "ref": "e116" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -901.3333333333333, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 116, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e117" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -901.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 117, + "type": "Other", + "hittable": false, + "parentIndex": 116, + "ref": "e118" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -901.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 118, + "type": "Button", + "hittable": false, + "parentIndex": 116, + "ref": "e119" + }, + { + "label": "Read", + "rect": { + "y": -894.3333333333333, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 119, + "type": "Other", + "hittable": false, + "parentIndex": 118, + "ref": "e120" + }, + { + "label": "Read", + "rect": { + "y": -894.3333333333333, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 120, + "type": "StaticText", + "hittable": false, + "parentIndex": 119, + "ref": "e121" + }, + { + "label": "Read", + "rect": { + "y": -894.3333333333333, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 121, + "type": "StaticText", + "hittable": false, + "parentIndex": 120, + "ref": "e122" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -894.3333333333333, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 38, + "enabled": true, + "index": 122, + "type": "StaticText", + "hittable": false, + "parentIndex": 119, + "ref": "e123" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -894.3333333333333, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 39, + "enabled": true, + "index": 123, + "type": "StaticText", + "hittable": false, + "parentIndex": 122, + "ref": "e124" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": -869.3333333333333, + "width": 378, + "height": 36, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 124, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e125" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -869.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 125, + "type": "Other", + "hittable": false, + "parentIndex": 124, + "ref": "e126" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": -869.3333333333333, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 126, + "type": "Button", + "hittable": false, + "parentIndex": 124, + "ref": "e127" + }, + { + "label": "Search", + "rect": { + "y": -862.3333333333333, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 127, + "type": "Other", + "hittable": false, + "parentIndex": 126, + "ref": "e128" + }, + { + "label": "Search", + "rect": { + "y": -862.3333333333333, + "width": 48, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 128, + "type": "StaticText", + "hittable": false, + "parentIndex": 127, + "ref": "e129" + }, + { + "label": "Search", + "rect": { + "y": -862.3333333333333, + "width": 48, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 129, + "type": "StaticText", + "hittable": false, + "parentIndex": 128, + "ref": "e130" + }, + { + "label": "scrollToEnd", + "rect": { + "y": -862.3333333333333, + "width": 79.66667175292969, + "height": 18, + "x": 98 + }, + "depth": 38, + "enabled": true, + "index": 130, + "type": "StaticText", + "hittable": false, + "parentIndex": 127, + "ref": "e131" + }, + { + "label": "scrollToEnd", + "rect": { + "y": -862.3333333333333, + "width": 79.66667175292969, + "height": 18, + "x": 98 + }, + "depth": 39, + "enabled": true, + "index": 131, + "type": "StaticText", + "hittable": false, + "parentIndex": 130, + "ref": "e132" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -833.3333333333333, + "width": 378, + "height": 646, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 132, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e133" + }, + { + "identifier": "assistant-message", + "rect": { + "y": -833.3333333333333, + "width": 362, + "height": 642, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 133, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e134" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -821.3333333333333, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 134, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e135" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -821.3333333333333, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 135, + "type": "Other", + "hittable": false, + "parentIndex": 134, + "ref": "e136" + }, + { + "rect": { + "y": -821.3333333333333, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 136, + "type": "Other", + "hittable": false, + "parentIndex": 135, + "ref": "e137" + }, + { + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 137, + "type": "TextView", + "hittable": false, + "parentIndex": 135, + "ref": "e138" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -821.3333333333333, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 138, + "type": "TextView", + "hittable": false, + "parentIndex": 137, + "ref": "e139" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -821.3333333333333, + "width": 30, + "height": 132, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 139, + "type": "Other", + "hittable": false, + "parentIndex": 137, + "ref": "e140" + }, + { + "rect": { + "y": -860.3333333333333, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 140, + "type": "Other", + "hittable": false, + "parentIndex": 139, + "ref": "e141" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -722.3333333333333, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 141, + "type": "Other", + "hittable": false, + "parentIndex": 137, + "ref": "e142" + }, + { + "rect": { + "y": -695.3333333333333, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 142, + "type": "Other", + "hittable": false, + "parentIndex": 141, + "ref": "e143" + }, + { + "label": "•", + "rect": { + "y": -661.3333333333333, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 143, + "type": "StaticText", + "hittable": false, + "parentIndex": 132, + "ref": "e144" + }, + { + "label": "•", + "rect": { + "y": -661.3333333333333, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 144, + "type": "StaticText", + "hittable": false, + "parentIndex": 143, + "ref": "e145" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -661.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 145, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e146" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -661.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 146, + "type": "Other", + "hittable": false, + "parentIndex": 145, + "ref": "e147" + }, + { + "rect": { + "y": -661.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 147, + "type": "Other", + "hittable": false, + "parentIndex": 146, + "ref": "e148" + }, + { + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 148, + "type": "TextView", + "hittable": false, + "parentIndex": 146, + "ref": "e149" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -661.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 149, + "type": "TextView", + "hittable": false, + "parentIndex": 148, + "ref": "e150" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -661.3333333333333, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 150, + "type": "Other", + "hittable": false, + "parentIndex": 148, + "ref": "e151" + }, + { + "rect": { + "y": -700.3333333333333, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 151, + "type": "Other", + "hittable": false, + "parentIndex": 150, + "ref": "e152" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -606.3333333333333, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 152, + "type": "Other", + "hittable": false, + "parentIndex": 148, + "ref": "e153" + }, + { + "rect": { + "y": -579.3333333333333, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 153, + "type": "Other", + "hittable": false, + "parentIndex": 152, + "ref": "e154" + }, + { + "label": "•", + "rect": { + "y": -569.3333333333333, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 154, + "type": "StaticText", + "hittable": false, + "parentIndex": 132, + "ref": "e155" + }, + { + "label": "•", + "rect": { + "y": -569.3333333333333, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 155, + "type": "StaticText", + "hittable": false, + "parentIndex": 154, + "ref": "e156" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -569.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 156, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e157" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -569.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 157, + "type": "Other", + "hittable": false, + "parentIndex": 156, + "ref": "e158" + }, + { + "rect": { + "y": -569.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 158, + "type": "Other", + "hittable": false, + "parentIndex": 157, + "ref": "e159" + }, + { + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 159, + "type": "TextView", + "hittable": false, + "parentIndex": 157, + "ref": "e160" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -569.3333333333333, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 160, + "type": "TextView", + "hittable": false, + "parentIndex": 159, + "ref": "e161" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -569.3333333333333, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 161, + "type": "Other", + "hittable": false, + "parentIndex": 159, + "ref": "e162" + }, + { + "rect": { + "y": -608.3333333333333, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 162, + "type": "Other", + "hittable": false, + "parentIndex": 161, + "ref": "e163" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -514.3333333333333, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 163, + "type": "Other", + "hittable": false, + "parentIndex": 159, + "ref": "e164" + }, + { + "rect": { + "y": -487.33333333333326, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 164, + "type": "Other", + "hittable": false, + "parentIndex": 163, + "ref": "e165" + }, + { + "label": "•", + "rect": { + "y": -477.33333333333326, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 165, + "type": "StaticText", + "hittable": false, + "parentIndex": 132, + "ref": "e166" + }, + { + "label": "•", + "rect": { + "y": -477.33333333333326, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 166, + "type": "StaticText", + "hittable": false, + "parentIndex": 165, + "ref": "e167" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -477.33333333333326, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 167, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e168" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -477.33333333333326, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 168, + "type": "Other", + "hittable": false, + "parentIndex": 167, + "ref": "e169" + }, + { + "rect": { + "y": -477.33333333333326, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 169, + "type": "Other", + "hittable": false, + "parentIndex": 168, + "ref": "e170" + }, + { + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 170, + "type": "TextView", + "hittable": false, + "parentIndex": 168, + "ref": "e171" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -477.33333333333326, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 171, + "type": "TextView", + "hittable": false, + "parentIndex": 170, + "ref": "e172" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -477.33333333333326, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 172, + "type": "Other", + "hittable": false, + "parentIndex": 170, + "ref": "e173" + }, + { + "rect": { + "y": -516.3333333333333, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 173, + "type": "Other", + "hittable": false, + "parentIndex": 172, + "ref": "e174" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -422.33333333333326, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 174, + "type": "Other", + "hittable": false, + "parentIndex": 170, + "ref": "e175" + }, + { + "rect": { + "y": -395.33333333333326, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 175, + "type": "Other", + "hittable": false, + "parentIndex": 174, + "ref": "e176" + }, + { + "label": "•", + "rect": { + "y": -385.33333333333326, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 176, + "type": "StaticText", + "hittable": false, + "parentIndex": 132, + "ref": "e177" + }, + { + "label": "•", + "rect": { + "y": -385.33333333333326, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 177, + "type": "StaticText", + "hittable": false, + "parentIndex": 176, + "ref": "e178" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": -385.33333333333326, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 178, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e179" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": -385.33333333333326, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 179, + "type": "Other", + "hittable": false, + "parentIndex": 178, + "ref": "e180" + }, + { + "rect": { + "y": -385.33333333333326, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 180, + "type": "Other", + "hittable": false, + "parentIndex": 179, + "ref": "e181" + }, + { + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 181, + "type": "TextView", + "hittable": false, + "parentIndex": 179, + "ref": "e182" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": -385.33333333333326, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 182, + "type": "TextView", + "hittable": false, + "parentIndex": 181, + "ref": "e183" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -385.33333333333326, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 183, + "type": "Other", + "hittable": false, + "parentIndex": 181, + "ref": "e184" + }, + { + "rect": { + "y": -424.33333333333326, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 184, + "type": "Other", + "hittable": false, + "parentIndex": 183, + "ref": "e185" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -352.33333333333326, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 185, + "type": "Other", + "hittable": false, + "parentIndex": 181, + "ref": "e186" + }, + { + "rect": { + "y": -325.33333333333326, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 186, + "type": "Other", + "hittable": false, + "parentIndex": 185, + "ref": "e187" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -303.33333333333326, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 187, + "type": "Other", + "hittable": false, + "parentIndex": 132, + "ref": "e188" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -303.33333333333326, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 188, + "type": "Other", + "hittable": false, + "parentIndex": 187, + "ref": "e189" + }, + { + "rect": { + "y": -303.33333333333326, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 189, + "type": "Other", + "hittable": false, + "parentIndex": 188, + "ref": "e190" + }, + { + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "depth": 38, + "enabled": true, + "index": 190, + "type": "TextView", + "hittable": false, + "parentIndex": 188, + "ref": "e191" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -303.33333333333326, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 191, + "type": "TextView", + "hittable": false, + "parentIndex": 190, + "ref": "e192" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -303.33333333333326, + "width": 30, + "height": 88, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 192, + "type": "Other", + "hittable": false, + "parentIndex": 190, + "ref": "e193" + }, + { + "rect": { + "y": -342.33333333333326, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 193, + "type": "Other", + "hittable": false, + "parentIndex": 192, + "ref": "e194" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -248.33333333333326, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 194, + "type": "Other", + "hittable": false, + "parentIndex": 190, + "ref": "e195" + }, + { + "rect": { + "y": -221.33333333333326, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 195, + "type": "Other", + "hittable": false, + "parentIndex": 194, + "ref": "e196" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": -187.33333333333326, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 196, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e197" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -187.33333333333326, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 197, + "type": "Other", + "hittable": false, + "parentIndex": 196, + "ref": "e198" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": -187.33333333333326, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 198, + "type": "Button", + "hittable": false, + "parentIndex": 196, + "ref": "e199" + }, + { + "label": "Edit", + "rect": { + "y": -180.33333333333326, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 199, + "type": "Other", + "hittable": false, + "parentIndex": 198, + "ref": "e200" + }, + { + "label": "Edit", + "rect": { + "y": -180.33333333333326, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 200, + "type": "StaticText", + "hittable": false, + "parentIndex": 199, + "ref": "e201" + }, + { + "label": "Edit", + "rect": { + "y": -180.33333333333326, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 201, + "type": "StaticText", + "hittable": false, + "parentIndex": 200, + "ref": "e202" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": -180.33333333333326, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "depth": 38, + "enabled": true, + "index": 202, + "type": "StaticText", + "hittable": false, + "parentIndex": 199, + "ref": "e203" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": -180.33333333333326, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "depth": 39, + "enabled": true, + "index": 203, + "type": "StaticText", + "hittable": false, + "parentIndex": 202, + "ref": "e204" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -155.33333333333326, + "width": 378, + "height": 36, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 204, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e205" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -155.33333333333326, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 205, + "type": "Other", + "hittable": false, + "parentIndex": 204, + "ref": "e206" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -155.33333333333326, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 206, + "type": "Button", + "hittable": false, + "parentIndex": 204, + "ref": "e207" + }, + { + "label": "Shell", + "rect": { + "y": -148.33333333333326, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 207, + "type": "Other", + "hittable": false, + "parentIndex": 206, + "ref": "e208" + }, + { + "label": "Shell", + "rect": { + "y": -148.33333333333326, + "width": 33.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 208, + "type": "StaticText", + "hittable": false, + "parentIndex": 207, + "ref": "e209" + }, + { + "label": "Shell", + "rect": { + "y": -148.33333333333326, + "width": 33.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 209, + "type": "StaticText", + "hittable": false, + "parentIndex": 208, + "ref": "e210" + }, + { + "label": "node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -148.33333333333326, + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242 + }, + "depth": 38, + "enabled": true, + "index": 210, + "type": "StaticText", + "hittable": false, + "parentIndex": 207, + "ref": "e211" + }, + { + "label": "node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -148.33333333333326, + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242 + }, + "depth": 39, + "enabled": true, + "index": 211, + "type": "StaticText", + "hittable": false, + "parentIndex": 210, + "ref": "e212" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -119.33333333333326, + "width": 378, + "height": 570, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 212, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e213" + }, + { + "identifier": "assistant-message", + "rect": { + "y": -119.33333333333326, + "width": 362, + "height": 566, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 213, + "type": "Other", + "hittable": false, + "parentIndex": 212, + "ref": "e214" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -107.33333333333326, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 214, + "type": "Other", + "hittable": false, + "parentIndex": 212, + "ref": "e215" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -107.33333333333326, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 215, + "type": "Other", + "hittable": false, + "parentIndex": 214, + "ref": "e216" + }, + { + "rect": { + "y": -107.33333333333326, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 216, + "type": "Other", + "hittable": false, + "parentIndex": 215, + "ref": "e217" + }, + { + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 0, + "width": 362, + "height": 134.66666666666674, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 217, + "type": "TextView", + "hittable": false, + "parentIndex": 215, + "ref": "e218" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "rect": { + "y": -107.33333333333326, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 218, + "type": "TextView", + "hittable": false, + "parentIndex": 217, + "ref": "e219" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -107.33333333333326, + "width": 30, + "height": 242, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 219, + "type": "Other", + "hittable": false, + "parentIndex": 217, + "ref": "e220" + }, + { + "rect": { + "y": -146.33333333333326, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 220, + "type": "Other", + "hittable": false, + "parentIndex": 219, + "ref": "e221" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 101.66666666666674, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 221, + "type": "Other", + "hittable": false, + "parentIndex": 217, + "ref": "e222" + }, + { + "rect": { + "y": 128.66666666666674, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 222, + "type": "Other", + "hittable": false, + "parentIndex": 221, + "ref": "e223" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 158.66666666666674, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 223, + "type": "Other", + "hittable": false, + "parentIndex": 212, + "ref": "e224" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 158.66666666666674, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 224, + "type": "Other", + "hittable": false, + "parentIndex": 223, + "ref": "e225" + }, + { + "rect": { + "y": 158.66666666666674, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 225, + "type": "Other", + "hittable": false, + "parentIndex": 224, + "ref": "e226" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 158.66666666666674, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 226, + "type": "TextView", + "hittable": false, + "parentIndex": 224, + "ref": "e227" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "rect": { + "y": 158.66666666666674, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 227, + "type": "TextView", + "hittable": false, + "parentIndex": 226, + "ref": "e228" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 158.66666666666674, + "width": 30, + "height": 264, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 228, + "type": "Other", + "hittable": false, + "parentIndex": 226, + "ref": "e229" + }, + { + "rect": { + "y": 119.66666666666674, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 229, + "type": "Other", + "hittable": false, + "parentIndex": 228, + "ref": "e230" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 389.66666666666674, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 230, + "type": "Other", + "hittable": false, + "parentIndex": 226, + "ref": "e231" + }, + { + "rect": { + "y": 416.66666666666674, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 231, + "type": "Other", + "hittable": false, + "parentIndex": 230, + "ref": "e232" + }, + { + "label": "Thinking", + "rect": { + "y": 450.66666666666674, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 232, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e233" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 450.66666666666674, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 233, + "type": "Other", + "hittable": false, + "parentIndex": 232, + "ref": "e234" + }, + { + "label": "Thinking", + "rect": { + "y": 450.66666666666674, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 234, + "type": "Button", + "hittable": false, + "parentIndex": 232, + "ref": "e235" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 482.66666666666674, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 235, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e236" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 482.66666666666674, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 236, + "type": "Other", + "hittable": false, + "parentIndex": 235, + "ref": "e237" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 482.66666666666674, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 237, + "type": "Button", + "hittable": false, + "parentIndex": 235, + "ref": "e238" + }, + { + "label": "Read", + "rect": { + "y": 489.66666666666674, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 238, + "type": "Other", + "hittable": false, + "parentIndex": 237, + "ref": "e239" + }, + { + "label": "Read", + "rect": { + "y": 489.66666666666674, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 239, + "type": "StaticText", + "hittable": false, + "parentIndex": 238, + "ref": "e240" + }, + { + "label": "Read", + "rect": { + "y": 489.66666666666674, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 240, + "type": "StaticText", + "hittable": false, + "parentIndex": 239, + "ref": "e241" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 489.66666666666674, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 38, + "enabled": true, + "index": 241, + "type": "StaticText", + "hittable": false, + "parentIndex": 238, + "ref": "e242" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 489.66666666666674, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 39, + "enabled": true, + "index": 242, + "type": "StaticText", + "hittable": false, + "parentIndex": 241, + "ref": "e243" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": 514.6666666666667, + "width": 378, + "height": 36, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 243, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e244" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 514.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 244, + "type": "Other", + "hittable": false, + "parentIndex": 243, + "ref": "e245" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": 514.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 245, + "type": "Button", + "hittable": false, + "parentIndex": 243, + "ref": "e246" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 550.6666666666667, + "width": 378, + "height": 646, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 246, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e247" + }, + { + "identifier": "assistant-message", + "rect": { + "y": 550.6666666666667, + "width": 362, + "height": 642, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 247, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e248" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 562.6666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 248, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e249" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 562.6666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 249, + "type": "Other", + "hittable": false, + "parentIndex": 248, + "ref": "e250" + }, + { + "rect": { + "y": 562.6666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 250, + "type": "Other", + "hittable": false, + "parentIndex": 249, + "ref": "e251" + }, + { + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 562.6666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 251, + "type": "TextView", + "hittable": false, + "parentIndex": 249, + "ref": "e252" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 562.6666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 252, + "type": "TextView", + "hittable": false, + "parentIndex": 251, + "ref": "e253" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 562.6666666666667, + "width": 30, + "height": 132, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 253, + "type": "Other", + "hittable": false, + "parentIndex": 251, + "ref": "e254" + }, + { + "rect": { + "y": 523.6666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 254, + "type": "Other", + "hittable": false, + "parentIndex": 253, + "ref": "e255" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 661.6666666666667, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 255, + "type": "Other", + "hittable": false, + "parentIndex": 251, + "ref": "e256" + }, + { + "rect": { + "y": 688.6666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 256, + "type": "Other", + "hittable": false, + "parentIndex": 255, + "ref": "e257" + }, + { + "label": "•", + "rect": { + "y": 722.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 257, + "type": "StaticText", + "hittable": false, + "parentIndex": 246, + "ref": "e258" + }, + { + "label": "•", + "rect": { + "y": 722.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 258, + "type": "StaticText", + "hittable": false, + "parentIndex": 257, + "ref": "e259" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 722.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 259, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e260" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 722.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 260, + "type": "Other", + "hittable": false, + "parentIndex": 259, + "ref": "e261" + }, + { + "rect": { + "y": 722.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 261, + "type": "Other", + "hittable": false, + "parentIndex": 260, + "ref": "e262" + }, + { + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 722.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 262, + "type": "TextView", + "hittable": false, + "parentIndex": 260, + "ref": "e263" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 722.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 263, + "type": "TextView", + "hittable": false, + "parentIndex": 262, + "ref": "e264" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 722.6666666666667, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 264, + "type": "Other", + "hittable": false, + "parentIndex": 262, + "ref": "e265" + }, + { + "rect": { + "y": 683.6666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 265, + "type": "Other", + "hittable": false, + "parentIndex": 264, + "ref": "e266" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 777.6666666666667, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 266, + "type": "Other", + "hittable": false, + "parentIndex": 262, + "ref": "e267" + }, + { + "rect": { + "y": 804.6666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 267, + "type": "Other", + "hittable": false, + "parentIndex": 266, + "ref": "e268" + }, + { + "label": "•", + "rect": { + "y": 814.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 268, + "type": "StaticText", + "hittable": false, + "parentIndex": 246, + "ref": "e269" + }, + { + "label": "•", + "rect": { + "y": 814.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 269, + "type": "StaticText", + "hittable": false, + "parentIndex": 268, + "ref": "e270" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 814.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 270, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e271" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 814.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 271, + "type": "Other", + "hittable": false, + "parentIndex": 270, + "ref": "e272" + }, + { + "rect": { + "y": 814.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 272, + "type": "Other", + "hittable": false, + "parentIndex": 271, + "ref": "e273" + }, + { + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 814.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 273, + "type": "TextView", + "hittable": false, + "parentIndex": 271, + "ref": "e274" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 814.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 274, + "type": "TextView", + "hittable": false, + "parentIndex": 273, + "ref": "e275" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 814.6666666666667, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 275, + "type": "Other", + "hittable": false, + "parentIndex": 273, + "ref": "e276" + }, + { + "rect": { + "y": 775.6666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 276, + "type": "Other", + "hittable": false, + "parentIndex": 275, + "ref": "e277" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 869.6666666666667, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 277, + "type": "Other", + "hittable": false, + "parentIndex": 273, + "ref": "e278" + }, + { + "rect": { + "y": 896.6666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 278, + "type": "Other", + "hittable": false, + "parentIndex": 277, + "ref": "e279" + }, + { + "label": "•", + "rect": { + "y": 906.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 279, + "type": "StaticText", + "hittable": false, + "parentIndex": 246, + "ref": "e280" + }, + { + "label": "•", + "rect": { + "y": 906.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 280, + "type": "StaticText", + "hittable": false, + "parentIndex": 279, + "ref": "e281" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 906.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 281, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e282" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 906.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 282, + "type": "Other", + "hittable": false, + "parentIndex": 281, + "ref": "e283" + }, + { + "rect": { + "y": 906.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 283, + "type": "Other", + "hittable": false, + "parentIndex": 282, + "ref": "e284" + }, + { + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 906.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 284, + "type": "TextView", + "hittable": false, + "parentIndex": 282, + "ref": "e285" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 906.6666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 285, + "type": "TextView", + "hittable": false, + "parentIndex": 284, + "ref": "e286" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 906.6666666666667, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 286, + "type": "Other", + "hittable": false, + "parentIndex": 284, + "ref": "e287" + }, + { + "rect": { + "y": 867.6666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 287, + "type": "Other", + "hittable": false, + "parentIndex": 286, + "ref": "e288" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 961.6666666666667, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 288, + "type": "Other", + "hittable": false, + "parentIndex": 284, + "ref": "e289" + }, + { + "rect": { + "y": 988.6666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 289, + "type": "Other", + "hittable": false, + "parentIndex": 288, + "ref": "e290" + }, + { + "label": "•", + "rect": { + "y": 998.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 290, + "type": "StaticText", + "hittable": false, + "parentIndex": 246, + "ref": "e291" + }, + { + "label": "•", + "rect": { + "y": 998.6666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 291, + "type": "StaticText", + "hittable": false, + "parentIndex": 290, + "ref": "e292" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 998.6666666666667, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 292, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e293" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 998.6666666666667, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 293, + "type": "Other", + "hittable": false, + "parentIndex": 292, + "ref": "e294" + }, + { + "rect": { + "y": 998.6666666666667, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 294, + "type": "Other", + "hittable": false, + "parentIndex": 293, + "ref": "e295" + }, + { + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 998.6666666666667, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 295, + "type": "TextView", + "hittable": false, + "parentIndex": 293, + "ref": "e296" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 998.6666666666667, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 296, + "type": "TextView", + "hittable": false, + "parentIndex": 295, + "ref": "e297" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 998.6666666666667, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 297, + "type": "Other", + "hittable": false, + "parentIndex": 295, + "ref": "e298" + }, + { + "rect": { + "y": 959.6666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 298, + "type": "Other", + "hittable": false, + "parentIndex": 297, + "ref": "e299" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 1031.6666666666667, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 299, + "type": "Other", + "hittable": false, + "parentIndex": 295, + "ref": "e300" + }, + { + "rect": { + "y": 1058.6666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 300, + "type": "Other", + "hittable": false, + "parentIndex": 299, + "ref": "e301" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 1080.6666666666667, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 301, + "type": "Other", + "hittable": false, + "parentIndex": 246, + "ref": "e302" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 1080.6666666666667, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 302, + "type": "Other", + "hittable": false, + "parentIndex": 301, + "ref": "e303" + }, + { + "rect": { + "y": 1080.6666666666667, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 303, + "type": "Other", + "hittable": false, + "parentIndex": 302, + "ref": "e304" + }, + { + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 1080.6666666666667, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 304, + "type": "TextView", + "hittable": false, + "parentIndex": 302, + "ref": "e305" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 1080.6666666666667, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 305, + "type": "TextView", + "hittable": false, + "parentIndex": 304, + "ref": "e306" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 1080.6666666666667, + "width": 30, + "height": 88, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 306, + "type": "Other", + "hittable": false, + "parentIndex": 304, + "ref": "e307" + }, + { + "rect": { + "y": 1041.6666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 307, + "type": "Other", + "hittable": false, + "parentIndex": 306, + "ref": "e308" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 1135.6666666666667, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 308, + "type": "Other", + "hittable": false, + "parentIndex": 304, + "ref": "e309" + }, + { + "rect": { + "y": 1162.6666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 309, + "type": "Other", + "hittable": false, + "parentIndex": 308, + "ref": "e310" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": 1196.6666666666667, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 310, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e311" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 1196.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 311, + "type": "Other", + "hittable": false, + "parentIndex": 310, + "ref": "e312" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": 1196.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 312, + "type": "Button", + "hittable": false, + "parentIndex": 310, + "ref": "e313" + }, + { + "label": "Edit", + "rect": { + "y": 1203.6666666666667, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 313, + "type": "Other", + "hittable": false, + "parentIndex": 312, + "ref": "e314" + }, + { + "label": "Edit", + "rect": { + "y": 1203.6666666666667, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 314, + "type": "StaticText", + "hittable": false, + "parentIndex": 313, + "ref": "e315" + }, + { + "label": "Edit", + "rect": { + "y": 1203.6666666666667, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 315, + "type": "StaticText", + "hittable": false, + "parentIndex": 314, + "ref": "e316" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": 1203.6666666666667, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "depth": 38, + "enabled": true, + "index": 316, + "type": "StaticText", + "hittable": false, + "parentIndex": 313, + "ref": "e317" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "y": 1203.6666666666667, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "depth": 39, + "enabled": true, + "index": 317, + "type": "StaticText", + "hittable": false, + "parentIndex": 316, + "ref": "e318" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": 1228.6666666666667, + "width": 378, + "height": 36, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 318, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e319" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 1228.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 319, + "type": "Other", + "hittable": false, + "parentIndex": 318, + "ref": "e320" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": 1228.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 320, + "type": "Button", + "hittable": false, + "parentIndex": 318, + "ref": "e321" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 1264.6666666666667, + "width": 378, + "height": 570, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 321, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e322" + }, + { + "identifier": "assistant-message", + "rect": { + "y": 1264.6666666666667, + "width": 362, + "height": 566, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 322, + "type": "Other", + "hittable": false, + "parentIndex": 321, + "ref": "e323" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 1276.6666666666667, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 323, + "type": "Other", + "hittable": false, + "parentIndex": 321, + "ref": "e324" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 1276.6666666666667, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 324, + "type": "Other", + "hittable": false, + "parentIndex": 323, + "ref": "e325" + }, + { + "rect": { + "y": 1276.6666666666667, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 325, + "type": "Other", + "hittable": false, + "parentIndex": 324, + "ref": "e326" + }, + { + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 1276.6666666666667, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 326, + "type": "TextView", + "hittable": false, + "parentIndex": 324, + "ref": "e327" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "rect": { + "y": 1276.6666666666667, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 327, + "type": "TextView", + "hittable": false, + "parentIndex": 326, + "ref": "e328" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 1276.6666666666667, + "width": 30, + "height": 242, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 328, + "type": "Other", + "hittable": false, + "parentIndex": 326, + "ref": "e329" + }, + { + "rect": { + "y": 1237.6666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 329, + "type": "Other", + "hittable": false, + "parentIndex": 328, + "ref": "e330" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 1485.6666666666667, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 330, + "type": "Other", + "hittable": false, + "parentIndex": 326, + "ref": "e331" + }, + { + "rect": { + "y": 1512.6666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 331, + "type": "Other", + "hittable": false, + "parentIndex": 330, + "ref": "e332" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 1542.6666666666667, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 332, + "type": "Other", + "hittable": false, + "parentIndex": 321, + "ref": "e333" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 1542.6666666666667, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 333, + "type": "Other", + "hittable": false, + "parentIndex": 332, + "ref": "e334" + }, + { + "rect": { + "y": 1542.6666666666667, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 334, + "type": "Other", + "hittable": false, + "parentIndex": 333, + "ref": "e335" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 1542.6666666666667, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 335, + "type": "TextView", + "hittable": false, + "parentIndex": 333, + "ref": "e336" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "rect": { + "y": 1542.6666666666667, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 336, + "type": "TextView", + "hittable": false, + "parentIndex": 335, + "ref": "e337" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 1542.6666666666667, + "width": 30, + "height": 264, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 337, + "type": "Other", + "hittable": false, + "parentIndex": 335, + "ref": "e338" + }, + { + "rect": { + "y": 1503.6666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 338, + "type": "Other", + "hittable": false, + "parentIndex": 337, + "ref": "e339" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 1773.6666666666667, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 339, + "type": "Other", + "hittable": false, + "parentIndex": 335, + "ref": "e340" + }, + { + "rect": { + "y": 1800.6666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 340, + "type": "Other", + "hittable": false, + "parentIndex": 339, + "ref": "e341" + }, + { + "label": "Thinking", + "rect": { + "y": 1834.6666666666667, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 341, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e342" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 1834.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 342, + "type": "Other", + "hittable": false, + "parentIndex": 341, + "ref": "e343" + }, + { + "label": "Thinking", + "rect": { + "y": 1834.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 343, + "type": "Button", + "hittable": false, + "parentIndex": 341, + "ref": "e344" + }, + { + "label": "Thinking", + "rect": { + "y": 1841.6666666666667, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 344, + "type": "Other", + "hittable": false, + "parentIndex": 343, + "ref": "e345" + }, + { + "label": "Thinking", + "rect": { + "y": 1841.6666666666667, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 345, + "type": "StaticText", + "hittable": false, + "parentIndex": 344, + "ref": "e346" + }, + { + "label": "Thinking", + "rect": { + "y": 1841.6666666666667, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 346, + "type": "StaticText", + "hittable": false, + "parentIndex": 345, + "ref": "e347" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 1866.6666666666667, + "width": 378, + "height": 32, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 347, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e348" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 1866.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 348, + "type": "Other", + "hittable": false, + "parentIndex": 347, + "ref": "e349" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 1866.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 349, + "type": "Button", + "hittable": false, + "parentIndex": 347, + "ref": "e350" + }, + { + "label": "Read", + "rect": { + "y": 1873.6666666666667, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "enabled": true, + "index": 350, + "type": "Other", + "hittable": false, + "parentIndex": 349, + "ref": "e351" + }, + { + "label": "Read", + "rect": { + "y": 1873.6666666666667, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 38, + "enabled": true, + "index": 351, + "type": "StaticText", + "hittable": false, + "parentIndex": 350, + "ref": "e352" + }, + { + "label": "Read", + "rect": { + "y": 1873.6666666666667, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 39, + "enabled": true, + "index": 352, + "type": "StaticText", + "hittable": false, + "parentIndex": 351, + "ref": "e353" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 1873.6666666666667, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 38, + "enabled": true, + "index": 353, + "type": "StaticText", + "hittable": false, + "parentIndex": 350, + "ref": "e354" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": 1873.6666666666667, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 39, + "enabled": true, + "index": 354, + "type": "StaticText", + "hittable": false, + "parentIndex": 353, + "ref": "e355" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": 1898.6666666666667, + "width": 378, + "height": 36, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 355, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e356" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": 1898.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 356, + "type": "Other", + "hittable": false, + "parentIndex": 355, + "ref": "e357" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": 1898.6666666666667, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "enabled": true, + "index": 357, + "type": "Button", + "hittable": false, + "parentIndex": 355, + "ref": "e358" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1934.666666666667, + "width": 378, + "height": 336, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 358, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e359" + }, + { + "identifier": "assistant-message", + "rect": { + "y": 1934.666666666667, + "width": 362, + "height": 336, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 359, + "type": "Other", + "hittable": false, + "parentIndex": 358, + "ref": "e360" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1946.666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 360, + "type": "Other", + "hittable": false, + "parentIndex": 358, + "ref": "e361" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1946.666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 361, + "type": "Other", + "hittable": false, + "parentIndex": 360, + "ref": "e362" + }, + { + "rect": { + "y": 1946.666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 362, + "type": "Other", + "hittable": false, + "parentIndex": 361, + "ref": "e363" + }, + { + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1946.666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 363, + "type": "TextView", + "hittable": false, + "parentIndex": 361, + "ref": "e364" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1946.666666666667, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 364, + "type": "TextView", + "hittable": false, + "parentIndex": 363, + "ref": "e365" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 1946.666666666667, + "width": 30, + "height": 132, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 365, + "type": "Other", + "hittable": false, + "parentIndex": 363, + "ref": "e366" + }, + { + "rect": { + "y": 1907.666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 366, + "type": "Other", + "hittable": false, + "parentIndex": 365, + "ref": "e367" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 2045.666666666667, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 367, + "type": "Other", + "hittable": false, + "parentIndex": 363, + "ref": "e368" + }, + { + "rect": { + "y": 2072.666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 368, + "type": "Other", + "hittable": false, + "parentIndex": 367, + "ref": "e369" + }, + { + "label": "•", + "rect": { + "y": 2106.666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 369, + "type": "StaticText", + "hittable": false, + "parentIndex": 358, + "ref": "e370" + }, + { + "label": "•", + "rect": { + "y": 2106.666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 370, + "type": "StaticText", + "hittable": false, + "parentIndex": 369, + "ref": "e371" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 2106.666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 371, + "type": "Other", + "hittable": false, + "parentIndex": 358, + "ref": "e372" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 2106.666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 372, + "type": "Other", + "hittable": false, + "parentIndex": 371, + "ref": "e373" + }, + { + "rect": { + "y": 2106.666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 373, + "type": "Other", + "hittable": false, + "parentIndex": 372, + "ref": "e374" + }, + { + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 2106.666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 374, + "type": "TextView", + "hittable": false, + "parentIndex": 372, + "ref": "e375" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 2106.666666666667, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 375, + "type": "TextView", + "hittable": false, + "parentIndex": 374, + "ref": "e376" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 2106.666666666667, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 376, + "type": "Other", + "hittable": false, + "parentIndex": 374, + "ref": "e377" + }, + { + "rect": { + "y": 2067.666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 377, + "type": "Other", + "hittable": false, + "parentIndex": 376, + "ref": "e378" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 2161.666666666667, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 378, + "type": "Other", + "hittable": false, + "parentIndex": 374, + "ref": "e379" + }, + { + "rect": { + "y": 2188.666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 379, + "type": "Other", + "hittable": false, + "parentIndex": 378, + "ref": "e380" + }, + { + "label": "•", + "rect": { + "y": 2198.666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "enabled": true, + "index": 380, + "type": "StaticText", + "hittable": false, + "parentIndex": 358, + "ref": "e381" + }, + { + "label": "•", + "rect": { + "y": 2198.666666666667, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "enabled": true, + "index": 381, + "type": "StaticText", + "hittable": false, + "parentIndex": 380, + "ref": "e382" + }, + { + "label": "We rely on onContentSizeChange to dete", + "rect": { + "y": 2198.666666666667, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 36, + "enabled": true, + "index": 382, + "type": "Other", + "hittable": false, + "parentIndex": 358, + "ref": "e383" + }, + { + "label": "We rely on onContentSizeChange to dete", + "rect": { + "y": 2198.666666666667, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 37, + "enabled": true, + "index": 383, + "type": "Other", + "hittable": false, + "parentIndex": 382, + "ref": "e384" + }, + { + "rect": { + "y": 2198.666666666667, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 384, + "type": "Other", + "hittable": false, + "parentIndex": 383, + "ref": "e385" + }, + { + "value": "We rely on onContentSizeChange to dete", + "label": "We rely on onContentSizeChange to dete", + "rect": { + "y": 2198.666666666667, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 38, + "enabled": true, + "index": 385, + "type": "TextView", + "hittable": false, + "parentIndex": 383, + "ref": "e386" + }, + { + "label": "We rely on onContentSizeChange to dete", + "rect": { + "y": 2198.666666666667, + "width": 278.07421875, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 386, + "type": "TextView", + "hittable": false, + "parentIndex": 385, + "ref": "e387" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 2198.666666666667, + "width": 30, + "height": 22, + "x": 349.00000063578284 + }, + "depth": 39, + "enabled": true, + "index": 387, + "type": "Other", + "hittable": false, + "parentIndex": 385, + "ref": "e388" + }, + { + "rect": { + "y": 2159.666666666667, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "index": 388, + "type": "Other", + "hittable": false, + "parentIndex": 387, + "ref": "e389" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 2206.666666666667, + "width": 340.6666564941406, + "height": 11, + "x": 41.33333396911621 + }, + "depth": 39, + "enabled": true, + "index": 389, + "type": "Other", + "hittable": false, + "parentIndex": 385, + "ref": "e390" + }, + { + "rect": { + "y": 2214.666666666667, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "depth": 40, + "enabled": true, + "index": 390, + "type": "Other", + "hittable": false, + "parentIndex": 389, + "ref": "e391" + }, + { + "label": "(end of synthetic stream)", + "rect": { + "y": 2236.666666666667, + "width": 362, + "height": 22, + "x": 20 + }, + "depth": 36, + "enabled": true, + "index": 391, + "type": "Other", + "hittable": false, + "parentIndex": 358, + "ref": "e392" + }, + { + "label": "(end of synthetic stream)", + "rect": { + "y": 2236.666666666667, + "width": 362, + "height": 22, + "x": 20 + }, + "depth": 37, + "enabled": true, + "index": 392, + "type": "Other", + "hittable": false, + "parentIndex": 391, + "ref": "e393" + }, + { + "rect": { + "y": 2236.666666666667, + "width": 362, + "height": 22, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 393, + "type": "Other", + "hittable": false, + "parentIndex": 392, + "ref": "e394" + }, + { + "value": "(end of synthetic stream)", + "label": "(end of synthetic stream)", + "rect": { + "y": 2236.666666666667, + "width": 362, + "height": 22, + "x": 20 + }, + "depth": 38, + "enabled": true, + "index": 394, + "type": "TextView", + "hittable": false, + "parentIndex": 392, + "ref": "e395" + }, + { + "label": "(end of synthetic stream)", + "rect": { + "y": 2236.666666666667, + "width": 183.234375, + "height": 22, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 395, + "type": "TextView", + "hittable": false, + "parentIndex": 394, + "ref": "e396" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 2236.666666666667, + "width": 30, + "height": 22, + "x": 349 + }, + "depth": 39, + "enabled": true, + "index": 396, + "type": "Other", + "hittable": false, + "parentIndex": 394, + "ref": "e397" + }, + { + "rect": { + "y": 2197.666666666667, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "enabled": true, + "index": 397, + "type": "Other", + "hittable": false, + "parentIndex": 396, + "ref": "e398" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 2244.666666666667, + "width": 362, + "height": 11, + "x": 20 + }, + "depth": 39, + "enabled": true, + "index": 398, + "type": "Other", + "hittable": false, + "parentIndex": 394, + "ref": "e399" + }, + { + "rect": { + "y": 2252.666666666667, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "enabled": true, + "index": 399, + "type": "Other", + "hittable": false, + "parentIndex": 398, + "ref": "e400" + }, + { + "label": "Copy turn", + "rect": { + "y": 2270.666666666667, + "width": 378, + "height": 67, + "x": 12 + }, + "depth": 35, + "enabled": true, + "index": 400, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "ref": "e401" + }, + { + "label": "Copy turn", + "rect": { + "y": 2283.666666666667, + "width": 22, + "height": 22, + "x": 16 + }, + "depth": 36, + "enabled": true, + "index": 401, + "type": "Button", + "hittable": false, + "parentIndex": 400, + "ref": "e402" + }, + { + "label": "Fork chat from here", + "rect": { + "y": 2283.666666666667, + "width": 22, + "height": 22, + "x": 46 + }, + "depth": 36, + "enabled": true, + "index": 402, + "type": "Other", + "hittable": false, + "parentIndex": 400, + "ref": "e403" + }, + { + "identifier": "assistant-fork-menu-trigger", + "label": "Fork chat from here", + "rect": { + "y": 2283.666666666667, + "width": 22, + "height": 22, + "x": 46 + }, + "depth": 37, + "enabled": true, + "index": 403, + "type": "Button", + "hittable": false, + "parentIndex": 402, + "ref": "e404" + }, + { + "label": "Worked for 10s, ended 8:53 PM", + "rect": { + "y": 2286.9999999205274, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "depth": 36, + "enabled": true, + "index": 404, + "type": "Button", + "hittable": false, + "parentIndex": 400, + "ref": "e405" + }, + { + "label": "Worked for 10s", + "rect": { + "y": 2286.9999999205274, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "depth": 37, + "enabled": true, + "index": 405, + "type": "StaticText", + "hittable": false, + "parentIndex": 404, + "ref": "e406" + }, + { + "label": "Worked for 10s", + "rect": { + "y": 2286.9999999205274, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "depth": 38, + "enabled": true, + "index": 406, + "type": "StaticText", + "hittable": false, + "parentIndex": 405, + "ref": "e407" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 164, + "width": 402, + "height": 30, + "x": 0 + }, + "depth": 33, + "enabled": true, + "index": 407, + "type": "Other", + "hittable": false, + "parentIndex": 71, + "ref": "e408" + }, + { + "rect": { + "y": 164, + "width": 393, + "height": 3, + "x": 3 + }, + "depth": 34, + "enabled": true, + "index": 408, + "type": "Other", + "hittable": false, + "parentIndex": 407, + "ref": "e409" + }, + { + "value": "32%", + "label": "Vertical scroll bar, 23 pages", + "rect": { + "y": 161, + "width": 30, + "height": 273.0000000000002, + "x": 369 + }, + "depth": 33, + "enabled": true, + "index": 409, + "type": "Other", + "hittable": false, + "parentIndex": 71, + "ref": "e410" + }, + { + "rect": { + "y": 320.3333333333337, + "width": 3, + "height": 36, + "x": 396 + }, + "depth": 34, + "enabled": true, + "index": 410, + "type": "Other", + "hittable": false, + "parentIndex": 409, + "ref": "e411" + }, + { + "value": "32%", + "label": "Vertical scroll bar, 23 pages", + "rect": { + "y": 161, + "width": 30, + "height": 273.0000000000002, + "x": 369 + }, + "depth": 33, + "enabled": true, + "index": 411, + "type": "Other", + "hittable": false, + "parentIndex": 71, + "ref": "e412" + }, + { + "rect": { + "y": 320.3333333333337, + "width": 3, + "height": 36, + "x": 396 + }, + "depth": 34, + "enabled": true, + "index": 412, + "type": "Other", + "hittable": false, + "parentIndex": 411, + "ref": "e413" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 164, + "width": 402, + "height": 30, + "x": 0 + }, + "depth": 33, + "enabled": true, + "index": 413, + "type": "Other", + "hittable": false, + "parentIndex": 71, + "ref": "e414" + }, + { + "rect": { + "y": 164, + "width": 393, + "height": 3, + "x": 3 + }, + "depth": 34, + "enabled": true, + "index": 414, + "type": "Other", + "hittable": false, + "parentIndex": 413, + "ref": "e415" + }, + { + "label": "Scroll to bottom", + "rect": { + "y": 370, + "width": 48, + "height": 48, + "x": 177 + }, + "depth": 31, + "enabled": true, + "index": 415, + "type": "Other", + "hittable": false, + "parentIndex": 68, + "ref": "e416" + }, + { + "identifier": "scroll-to-bottom-button", + "label": "Scroll to bottom", + "rect": { + "y": 370, + "width": 48, + "height": 48, + "x": 177 + }, + "depth": 32, + "enabled": true, + "index": 416, + "type": "Button", + "hittable": false, + "parentIndex": 415, + "ref": "e417" + }, + { + "identifier": "composer-viewport-content", + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 434, + "width": 402, + "height": 138, + "x": 0 + }, + "depth": 29, + "enabled": true, + "index": 417, + "type": "Other", + "hittable": false, + "parentIndex": 65, + "ref": "e418" + }, + { + "identifier": "message-input-root", + "rect": { + "y": 434, + "width": 370, + "height": 88, + "x": 16 + }, + "depth": 30, + "enabled": true, + "index": 418, + "type": "Other", + "hittable": false, + "parentIndex": 417, + "ref": "e419" + }, + { + "rect": { + "y": 434, + "width": 370, + "height": 88, + "x": 16 + }, + "depth": 30, + "enabled": true, + "index": 419, + "type": "Other", + "hittable": false, + "parentIndex": 417, + "ref": "e420" + }, + { + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 443, + "width": 344, + "height": 30, + "x": 29 + }, + "depth": 30, + "enabled": true, + "index": 420, + "type": "Other", + "hittable": false, + "parentIndex": 417, + "ref": "e421" + }, + { + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 443, + "width": 344, + "height": 30, + "x": 29 + }, + "depth": 31, + "enabled": true, + "index": 421, + "type": "TextView", + "hittable": false, + "parentIndex": 420, + "ref": "e422" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 443, + "width": 30, + "height": 30, + "x": 340 + }, + "depth": 32, + "enabled": true, + "index": 422, + "type": "Other", + "hittable": false, + "parentIndex": 421, + "ref": "e423" + }, + { + "rect": { + "y": 439, + "width": 3, + "height": 31, + "x": 367 + }, + "depth": 33, + "enabled": true, + "index": 423, + "type": "Other", + "hittable": false, + "parentIndex": 422, + "ref": "e424" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 455, + "width": 344, + "height": 15, + "x": 29 + }, + "depth": 32, + "enabled": true, + "index": 424, + "type": "Other", + "hittable": false, + "parentIndex": 421, + "ref": "e425" + }, + { + "rect": { + "y": 467, + "width": 338, + "height": 3, + "x": 32 + }, + "depth": 33, + "enabled": true, + "index": 425, + "type": "Other", + "hittable": false, + "parentIndex": 424, + "ref": "e426" + }, + { + "identifier": "message-input-attach-button", + "label": "Add attachment", + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 23 + }, + "depth": 30, + "enabled": true, + "index": 426, + "type": "Button", + "hittable": false, + "parentIndex": 417, + "ref": "e427" + }, + { + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 23 + }, + "depth": 31, + "enabled": true, + "index": 427, + "type": "Other", + "hittable": false, + "parentIndex": 426, + "ref": "e428" + }, + { + "rect": { + "y": 489, + "width": 20, + "height": 20, + "x": 27 + }, + "depth": 32, + "enabled": true, + "index": 428, + "type": "Other", + "hittable": false, + "parentIndex": 427, + "ref": "e429" + }, + { + "rect": { + "y": 492.3333333333333, + "width": 13.333333333333332, + "height": 13.333333333333371, + "x": 30.333333333333332 + }, + "depth": 33, + "enabled": true, + "index": 429, + "type": "Other", + "hittable": false, + "parentIndex": 428, + "ref": "e430" + }, + { + "rect": { + "y": 498.16666666666663, + "width": 13.333333333333332, + "height": 1.6666666666666856, + "x": 30.333333333333332 + }, + "depth": 34, + "enabled": true, + "index": 430, + "type": "Other", + "hittable": false, + "parentIndex": 429, + "ref": "e431" + }, + { + "rect": { + "y": 492.33333333333337, + "width": 1.6666666666666643, + "height": 13.333333333333314, + "x": 36.16666666666667 + }, + "depth": 34, + "enabled": true, + "index": 431, + "type": "Other", + "hittable": false, + "parentIndex": 429, + "ref": "e432" + }, + { + "label": "Select model (Ten second stream)", + "rect": { + "y": 485, + "width": 232, + "height": 28, + "x": 51 + }, + "depth": 30, + "enabled": true, + "index": 432, + "type": "Other", + "hittable": false, + "parentIndex": 417, + "ref": "e433" + }, + { + "identifier": "combined-model-selector", + "label": "Select model (Ten second stream)", + "rect": { + "y": 485, + "width": 202, + "height": 28, + "x": 51 + }, + "depth": 31, + "enabled": true, + "index": 433, + "type": "Button", + "hittable": false, + "parentIndex": 432, + "ref": "e434" + }, + { + "rect": { + "y": 489, + "width": 20, + "height": 20, + "x": 59 + }, + "depth": 32, + "enabled": true, + "index": 434, + "type": "Other", + "hittable": false, + "parentIndex": 433, + "ref": "e435" + }, + { + "rect": { + "y": 489, + "width": 20, + "height": 20, + "x": 59 + }, + "depth": 33, + "enabled": true, + "index": 435, + "type": "Other", + "hittable": false, + "parentIndex": 434, + "ref": "e436" + }, + { + "rect": { + "y": 491.5, + "width": 18.33333333333332, + "height": 15, + "x": 59.833333333333336 + }, + "depth": 34, + "enabled": true, + "index": 436, + "type": "Other", + "hittable": false, + "parentIndex": 435, + "ref": "e437" + }, + { + "rect": { + "y": 494.83333333333337, + "width": 15, + "height": 11.666666666666686, + "x": 61.5 + }, + "depth": 35, + "enabled": true, + "index": 437, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e438" + }, + { + "rect": { + "y": 491.5, + "width": 5, + "height": 5, + "x": 64.83333333333333 + }, + "depth": 35, + "enabled": true, + "index": 438, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e439" + }, + { + "rect": { + "y": 499.83333333333337, + "width": 3.3333333333333357, + "height": 1.6666666666666856, + "x": 59.83333333333333 + }, + "depth": 35, + "enabled": true, + "index": 439, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e440" + }, + { + "rect": { + "y": 499, + "width": 1.6666666666666714, + "height": 3.3333333333333144, + "x": 65.66666666666666 + }, + "depth": 35, + "enabled": true, + "index": 440, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e441" + }, + { + "rect": { + "y": 499, + "width": 1.6666666666666714, + "height": 3.3333333333333144, + "x": 70.66666666666667 + }, + "depth": 35, + "enabled": true, + "index": 441, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e442" + }, + { + "rect": { + "y": 499.83333333333337, + "width": 3.3333333333333286, + "height": 1.6666666666666856, + "x": 74.83333333333334 + }, + "depth": 35, + "enabled": true, + "index": 442, + "type": "Other", + "hittable": false, + "parentIndex": 436, + "ref": "e443" + }, + { + "label": "Ten second stream", + "rect": { + "y": 490, + "width": 130.3333282470703, + "height": 18, + "x": 83 + }, + "depth": 32, + "enabled": true, + "index": 443, + "type": "StaticText", + "hittable": false, + "parentIndex": 433, + "ref": "e444" + }, + { + "label": "Ten second stream", + "rect": { + "y": 490, + "width": 130.3333282470703, + "height": 18, + "x": 83 + }, + "depth": 33, + "enabled": true, + "index": 444, + "type": "StaticText", + "hittable": false, + "parentIndex": 443, + "ref": "e445" + }, + { + "identifier": "context-window-meter", + "label": "Context window 2% used", + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 283 + }, + "depth": 30, + "enabled": true, + "index": 445, + "type": "Image", + "hittable": false, + "parentIndex": 417, + "ref": "e446" + }, + { + "label": "Start dictation", + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 315 + }, + "depth": 30, + "enabled": true, + "index": 446, + "type": "Button", + "hittable": false, + "parentIndex": 417, + "ref": "e447" + }, + { + "label": "Enable Voice mode", + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 351 + }, + "depth": 30, + "enabled": true, + "index": 447, + "type": "Button", + "hittable": false, + "parentIndex": 417, + "ref": "e448" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 11, + "enabled": true, + "index": 448, + "type": "Other", + "hittable": false, + "parentIndex": 12, + "ref": "e449" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 7, + "enabled": true, + "index": 449, + "type": "Other", + "hittable": false, + "parentIndex": 6, + "ref": "e450" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 8, + "enabled": true, + "index": 450, + "type": "Other", + "hittable": false, + "parentIndex": 449, + "ref": "e451" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 9, + "enabled": true, + "index": 451, + "type": "Other", + "hittable": false, + "parentIndex": 450, + "ref": "e452" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 1, + "enabled": true, + "index": 452, + "type": "Window", + "hittable": false, + "parentIndex": 0, + "ref": "e453" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 2, + "enabled": true, + "index": 453, + "type": "Other", + "hittable": false, + "parentIndex": 452, + "ref": "e454" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 3, + "enabled": true, + "index": 454, + "type": "Other", + "hittable": false, + "parentIndex": 453, + "ref": "e455" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 336, + "x": 0 + }, + "depth": 3, + "enabled": true, + "index": 455, + "type": "Other", + "hittable": false, + "parentIndex": 453, + "ref": "e456" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 278, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 456, + "type": "Other", + "hittable": false, + "parentIndex": 455, + "ref": "e457" + }, + { + "label": "Emoji", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 1, + "enabled": true, + "index": 457, + "type": "Window", + "hittable": true, + "parentIndex": 0, + "ref": "e458" + }, + { + "label": "Emoji", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 2, + "enabled": true, + "index": 458, + "type": "Other", + "hittable": true, + "parentIndex": 457, + "ref": "e459" + }, + { + "label": "Emoji", + "rect": { + "y": 538, + "width": 402, + "height": 336, + "x": 0 + }, + "depth": 3, + "enabled": true, + "index": 459, + "type": "Other", + "hittable": true, + "parentIndex": 458, + "ref": "e460" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 460, + "type": "Other", + "hittable": false, + "parentIndex": 459, + "ref": "e461" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 5, + "enabled": true, + "index": 461, + "type": "Other", + "hittable": false, + "parentIndex": 460, + "ref": "e462" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 6, + "enabled": true, + "index": 462, + "type": "Other", + "hittable": false, + "parentIndex": 461, + "ref": "e463" + }, + { + "identifier": "SystemInputAssistantView", + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 463, + "type": "Other", + "hittable": true, + "parentIndex": 459, + "ref": "e464" + }, + { + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 5, + "enabled": true, + "index": 464, + "type": "Other", + "hittable": true, + "parentIndex": 463, + "ref": "e465" + }, + { + "identifier": "CenterPageView", + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 6, + "enabled": true, + "index": 465, + "type": "Other", + "hittable": true, + "parentIndex": 464, + "ref": "e466" + }, + { + "rect": { + "y": -62, + "width": 402, + "height": 1245, + "x": 0 + }, + "depth": 7, + "enabled": true, + "index": 466, + "type": "Other", + "hittable": false, + "parentIndex": 465, + "ref": "e467" + }, + { + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 8, + "enabled": true, + "index": 467, + "type": "ScrollView", + "hittable": false, + "parentIndex": 466, + "ref": "e468" + }, + { + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 7, + "enabled": true, + "index": 468, + "type": "Other", + "hittable": true, + "parentIndex": 465, + "ref": "e469" + }, + { + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 8, + "enabled": true, + "index": 469, + "type": "Other", + "hittable": true, + "parentIndex": 468, + "ref": "e470" + }, + { + "label": "I", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 9, + "enabled": true, + "index": 470, + "type": "Other", + "hittable": true, + "parentIndex": 469, + "ref": "e471" + }, + { + "label": "I", + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 10, + "enabled": true, + "index": 471, + "type": "Other", + "hittable": true, + "parentIndex": 470, + "ref": "e472" + }, + { + "label": "I", + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 0 + }, + "depth": 11, + "enabled": true, + "index": 472, + "type": "Other", + "hittable": true, + "parentIndex": 471, + "ref": "e473" + }, + { + "label": "The", + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 134 + }, + "depth": 11, + "enabled": true, + "index": 473, + "type": "Other", + "hittable": true, + "parentIndex": 471, + "ref": "e474" + }, + { + "label": "I’m", + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 268 + }, + "depth": 11, + "enabled": true, + "index": 474, + "type": "Other", + "hittable": true, + "parentIndex": 471, + "ref": "e475" + }, + { + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 475, + "type": "Other", + "hittable": false, + "parentIndex": 459, + "ref": "e476" + }, + { + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "depth": 5, + "enabled": true, + "index": 476, + "type": "Other", + "hittable": false, + "parentIndex": 475, + "ref": "e477" + }, + { + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "depth": 6, + "enabled": true, + "index": 477, + "type": "Other", + "hittable": false, + "parentIndex": 476, + "ref": "e478" + }, + { + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "depth": 7, + "enabled": true, + "index": 478, + "type": "Other", + "hittable": false, + "parentIndex": 477, + "ref": "e479" + }, + { + "label": "Q", + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 479, + "type": "Other", + "hittable": false, + "parentIndex": 459, + "ref": "e480" + }, + { + "label": "Q", + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 5, + "enabled": true, + "index": 480, + "type": "Keyboard", + "hittable": false, + "parentIndex": 479, + "ref": "e481" + }, + { + "label": "Q", + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 6, + "enabled": true, + "index": 481, + "type": "Other", + "hittable": false, + "parentIndex": 480, + "ref": "e482" + }, + { + "identifier": "UIKeyboardLayoutStar Preview", + "label": "Q", + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 7, + "enabled": true, + "index": 482, + "type": "Other", + "hittable": false, + "parentIndex": 481, + "ref": "e483" + }, + { + "label": "Q", + "rect": { + "y": 590, + "width": 40.333333333333336, + "height": 46, + "x": 0 + }, + "depth": 8, + "enabled": true, + "index": 483, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e484" + }, + { + "label": "W", + "rect": { + "y": 590, + "width": 40.00000000000001, + "height": 46, + "x": 40.333333333333336 + }, + "depth": 8, + "enabled": true, + "index": 484, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e485" + }, + { + "label": "E", + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 80.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 485, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e486" + }, + { + "label": "R", + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 120.66666666666669 + }, + "depth": 8, + "enabled": true, + "index": 486, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e487" + }, + { + "label": "T", + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 160.66666666666669 + }, + "depth": 8, + "enabled": true, + "index": 487, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e488" + }, + { + "label": "Y", + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 201.00000000000003 + }, + "depth": 8, + "enabled": true, + "index": 488, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e489" + }, + { + "label": "U", + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 241.33333333333337 + }, + "depth": 8, + "enabled": true, + "index": 489, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e490" + }, + { + "label": "I", + "rect": { + "y": 590, + "width": 40.333333333333314, + "height": 46, + "x": 281.33333333333337 + }, + "depth": 8, + "enabled": true, + "index": 490, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e491" + }, + { + "label": "O", + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 321.6666666666667 + }, + "depth": 8, + "enabled": true, + "index": 491, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e492" + }, + { + "label": "P", + "rect": { + "y": 590, + "width": 40.333333333333314, + "height": 46, + "x": 361.6666666666667 + }, + "depth": 8, + "enabled": true, + "index": 492, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e493" + }, + { + "label": "A", + "rect": { + "y": 644, + "width": 40.33333333333333, + "height": 46, + "x": 19.666666666666668 + }, + "depth": 8, + "enabled": true, + "index": 493, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e494" + }, + { + "label": "S", + "rect": { + "y": 644, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "depth": 8, + "enabled": true, + "index": 494, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e495" + }, + { + "label": "D", + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 495, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e496" + }, + { + "label": "F", + "rect": { + "y": 644, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 496, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e497" + }, + { + "label": "G", + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "depth": 8, + "enabled": true, + "index": 497, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e498" + }, + { + "label": "H", + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "depth": 8, + "enabled": true, + "index": 498, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e499" + }, + { + "label": "J", + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 261.536 + }, + "depth": 8, + "enabled": true, + "index": 499, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e500" + }, + { + "label": "K", + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "depth": 8, + "enabled": true, + "index": 500, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e501" + }, + { + "label": "L", + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 341.8693333333333 + }, + "depth": 8, + "enabled": true, + "index": 501, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e502" + }, + { + "identifier": "shift", + "label": "shift", + "rect": { + "y": 698, + "width": 51.333333333333336, + "height": 46, + "x": 0 + }, + "selected": true, + "enabled": true, + "depth": 8, + "index": 502, + "type": "Button", + "hittable": false, + "parentIndex": 482, + "ref": "e503" + }, + { + "label": "Z", + "rect": { + "y": 698, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "depth": 8, + "enabled": true, + "index": 503, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e504" + }, + { + "label": "X", + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 504, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e505" + }, + { + "label": "C", + "rect": { + "y": 698, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 505, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e506" + }, + { + "label": "V", + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "depth": 8, + "enabled": true, + "index": 506, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e507" + }, + { + "label": "B", + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "depth": 8, + "enabled": true, + "index": 507, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e508" + }, + { + "label": "N", + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 261.536 + }, + "depth": 8, + "enabled": true, + "index": 508, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e509" + }, + { + "label": "M", + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "depth": 8, + "enabled": true, + "index": 509, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e510" + }, + { + "identifier": "delete", + "label": "delete", + "rect": { + "y": 698, + "width": 51.333333333333314, + "height": 46, + "x": 350.42133333333334 + }, + "depth": 8, + "enabled": true, + "index": 510, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e511" + }, + { + "identifier": "more", + "label": "numbers", + "rect": { + "y": 752, + "width": 101, + "height": 46, + "x": 0 + }, + "depth": 8, + "enabled": true, + "index": 511, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e512" + }, + { + "identifier": "space", + "label": "space", + "rect": { + "y": 752, + "width": 201.33333333333334, + "height": 46, + "x": 100.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 512, + "type": "Key", + "hittable": false, + "parentIndex": 482, + "ref": "e513" + }, + { + "identifier": "Return", + "label": "return", + "rect": { + "y": 752, + "width": 100.33333333333331, + "height": 46, + "x": 301.6666666666667 + }, + "depth": 8, + "enabled": true, + "index": 513, + "type": "Button", + "hittable": false, + "parentIndex": 482, + "ref": "e514" + }, + { + "label": "Emoji", + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "depth": 4, + "enabled": true, + "index": 514, + "type": "Other", + "hittable": true, + "parentIndex": 459, + "ref": "e515" + }, + { + "label": "Emoji", + "rect": { + "y": 805.6989567998571, + "width": 68.0852958475086, + "height": 68.73516393505099, + "x": 8.47726568115926 + }, + "depth": 5, + "enabled": true, + "index": 515, + "type": "Button", + "hittable": true, + "parentIndex": 514, + "ref": "e516" + }, + { + "rect": { + "y": 805.6989567998571, + "width": 0, + "height": 0, + "x": 8.47726568115926 + }, + "depth": 6, + "enabled": true, + "index": 516, + "type": "StaticText", + "hittable": false, + "parentIndex": 515, + "ref": "e517" + }, + { + "identifier": "dictation", + "label": "Dictate", + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "depth": 5, + "enabled": true, + "index": 517, + "type": "Button", + "hittable": false, + "parentIndex": 514, + "ref": "e518" + }, + { + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "depth": 6, + "enabled": true, + "index": 518, + "type": "StaticText", + "hittable": false, + "parentIndex": 517, + "ref": "e519" + }, + { + "identifier": "dictation", + "label": "Dictate", + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "depth": 5, + "enabled": true, + "index": 519, + "type": "Button", + "hittable": true, + "parentIndex": 514, + "ref": "e520" + }, + { + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "depth": 6, + "enabled": true, + "index": 520, + "type": "StaticText", + "hittable": false, + "parentIndex": 519, + "ref": "e521" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 521, + "totalNodeCount": 521, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 120, + "p50Ms": 143, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 120 + } + } + }, + "refsGeneration": 776184 + } +} diff --git a/scroll-regression/ios/chat-flick.png b/scroll-regression/ios/chat-flick.png new file mode 100644 index 0000000000..62929a0774 Binary files /dev/null and b/scroll-regression/ios/chat-flick.png differ diff --git a/scroll-regression/ios/chat-gesture-open.json b/scroll-regression/ios/chat-gesture-open.json new file mode 100644 index 0000000000..5b1ffa8099 --- /dev/null +++ b/scroll-regression/ios/chat-gesture-open.json @@ -0,0 +1,8318 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Application", + "hittable": true, + "index": 0, + "depth": 0, + "label": "Paseo Debug", + "ref": "e1" + }, + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Window", + "hittable": false, + "parentIndex": 0, + "index": 1, + "depth": 1, + "ref": "e2" + }, + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 1, + "index": 2, + "depth": 2, + "ref": "e3" + }, + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 2, + "index": 3, + "depth": 3, + "ref": "e4" + }, + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 3, + "index": 4, + "depth": 4, + "ref": "e5" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 4, + "depth": 5, + "index": 5, + "ref": "e6" + }, + { + "hittable": false, + "depth": 6, + "type": "Other", + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 6, + "parentIndex": 5, + "ref": "e7" + }, + { + "hittable": false, + "depth": 7, + "type": "Other", + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "index": 7, + "parentIndex": 6, + "ref": "e8" + }, + { + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "index": 8, + "enabled": true, + "type": "Other", + "depth": 8, + "parentIndex": 7, + "ref": "e9" + }, + { + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "index": 9, + "enabled": true, + "type": "Other", + "depth": 9, + "parentIndex": 8, + "ref": "e10" + }, + { + "enabled": true, + "parentIndex": 8, + "type": "Other", + "index": 10, + "hittable": false, + "depth": 9, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "ref": "e11" + }, + { + "parentIndex": 10, + "index": 11, + "depth": 10, + "hittable": false, + "type": "Other", + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e12" + }, + { + "parentIndex": 10, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 12, + "depth": 10, + "hittable": false, + "type": "Other", + "ref": "e13" + }, + { + "parentIndex": 12, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 13, + "depth": 11, + "hittable": false, + "type": "Other", + "ref": "e14" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "type": "Other", + "depth": 11, + "index": 14, + "parentIndex": 12, + "ref": "e15" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "type": "Other", + "depth": 12, + "index": 15, + "parentIndex": 14, + "ref": "e16" + }, + { + "parentIndex": 15, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 13, + "index": 16, + "ref": "e17" + }, + { + "parentIndex": 16, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 14, + "index": 17, + "ref": "e18" + }, + { + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 18, + "parentIndex": 17, + "type": "Other", + "depth": 15, + "hittable": false, + "ref": "e19" + }, + { + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 19, + "parentIndex": 18, + "type": "Other", + "depth": 16, + "hittable": false, + "ref": "e20" + }, + { + "hittable": false, + "depth": 17, + "enabled": true, + "parentIndex": 19, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "index": 20, + "type": "Other", + "ref": "e21" + }, + { + "enabled": true, + "parentIndex": 20, + "type": "Other", + "index": 21, + "hittable": false, + "depth": 18, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "ref": "e22" + }, + { + "depth": 19, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 21, + "index": 22, + "ref": "e23" + }, + { + "depth": 20, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 22, + "index": 23, + "ref": "e24" + }, + { + "type": "Other", + "parentIndex": 23, + "label": "Switch tabs (2 open)", + "hittable": false, + "depth": 21, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 24, + "ref": "e25" + }, + { + "type": "Other", + "parentIndex": 24, + "label": "Open menu", + "hittable": false, + "depth": 22, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "index": 25, + "ref": "e26" + }, + { + "depth": 23, + "label": "Open menu", + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "index": 26, + "parentIndex": 25, + "enabled": true, + "type": "Other", + "ref": "e27" + }, + { + "depth": 24, + "label": "Open menu", + "index": 27, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "parentIndex": 26, + "enabled": true, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "type": "Other", + "ref": "e28" + }, + { + "type": "Other", + "index": 28, + "enabled": true, + "label": "Open menu", + "identifier": "composer-dock-header", + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 126, + "width": 402 + }, + "depth": 25, + "parentIndex": 27, + "ref": "e29" + }, + { + "type": "Other", + "index": 29, + "enabled": true, + "hittable": false, + "rect": { + "y": 70, + "x": 0, + "height": 56, + "width": 402 + }, + "depth": 26, + "parentIndex": 28, + "ref": "e30" + }, + { + "rect": { + "y": 81.6666669845581, + "x": 8, + "height": 32, + "width": 32 + }, + "identifier": "menu-button", + "index": 30, + "label": "Open menu", + "enabled": true, + "type": "Button", + "hittable": false, + "depth": 26, + "parentIndex": 28, + "ref": "e31" + }, + { + "type": "Other", + "rect": { + "y": 91.6666669845581, + "x": 16, + "height": 12, + "width": 16 + }, + "depth": 27, + "enabled": true, + "hittable": false, + "index": 31, + "parentIndex": 30, + "ref": "e32" + }, + { + "depth": 28, + "enabled": true, + "type": "Other", + "index": 32, + "hittable": false, + "parentIndex": 31, + "rect": { + "y": 91.6666669845581, + "x": 16, + "height": 1.3333358764648438, + "width": 16 + }, + "ref": "e33" + }, + { + "depth": 28, + "enabled": true, + "type": "Other", + "index": 33, + "hittable": false, + "parentIndex": 31, + "rect": { + "y": 97.00000047683716, + "x": 16, + "height": 1.6666717529296875, + "width": 16 + }, + "ref": "e34" + }, + { + "depth": 28, + "enabled": true, + "type": "Other", + "index": 34, + "hittable": false, + "parentIndex": 31, + "rect": { + "y": 102.33333396911621, + "width": 8, + "height": 1.6666641235351562, + "x": 16 + }, + "ref": "e35" + }, + { + "depth": 26, + "enabled": true, + "type": "Other", + "index": 35, + "label": "main", + "hittable": false, + "parentIndex": 28, + "rect": { + "y": 80.6666669845581, + "width": 314, + "height": 34, + "x": 48 + }, + "ref": "e36" + }, + { + "parentIndex": 35, + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 34, + "x": 48 + }, + "index": 36, + "label": "main", + "enabled": true, + "hittable": false, + "depth": 27, + "type": "Other", + "ref": "e37" + }, + { + "parentIndex": 36, + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 18, + "x": 48 + }, + "index": 37, + "label": "main", + "enabled": true, + "hittable": false, + "depth": 28, + "identifier": "workspace-header-title", + "type": "StaticText", + "ref": "e38" + }, + { + "depth": 29, + "hittable": false, + "rect": { + "y": 80.6666669845581, + "width": 278, + "height": 18, + "x": 48 + }, + "index": 38, + "enabled": true, + "type": "StaticText", + "label": "main", + "parentIndex": 37, + "ref": "e39" + }, + { + "hittable": false, + "label": "composer-dock-ios-fixture", + "identifier": "workspace-header-subtitle", + "index": 39, + "parentIndex": 36, + "type": "StaticText", + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "height": 15.666671752929688, + "x": 48 + }, + "enabled": true, + "depth": 28, + "ref": "e40" + }, + { + "hittable": false, + "label": "composer-dock-ios-fixture", + "index": 40, + "parentIndex": 39, + "type": "StaticText", + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "height": 15.666671752929688, + "x": 48 + }, + "enabled": true, + "depth": 29, + "ref": "e41" + }, + { + "hittable": false, + "parentIndex": 36, + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "depth": 28, + "index": 41, + "label": "·", + "type": "StaticText", + "enabled": true, + "ref": "e42" + }, + { + "hittable": false, + "parentIndex": 41, + "rect": { + "y": 98.6666669845581, + "width": 4, + "height": 15.666671752929688, + "x": 217.3333282470703 + }, + "depth": 29, + "index": 42, + "label": "·", + "type": "StaticText", + "enabled": true, + "ref": "e43" + }, + { + "hittable": false, + "parentIndex": 36, + "rect": { + "y": 98.6666669845581, + "width": 68.00001525878906, + "height": 16, + "x": 227.3333282470703 + }, + "depth": 28, + "index": 43, + "label": "dev-new", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "type": "Other", + "enabled": true, + "ref": "e44" + }, + { + "enabled": true, + "rect": { + "y": 100.6666669845581, + "width": 12, + "height": 12, + "x": 227.3333282470703 + }, + "index": 44, + "type": "Other", + "depth": 28, + "hittable": false, + "parentIndex": 36, + "ref": "e45" + }, + { + "enabled": true, + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 11, + "x": 227.8333282470703 + }, + "index": 45, + "type": "Other", + "depth": 29, + "hittable": false, + "parentIndex": 44, + "ref": "e46" + }, + { + "rect": { + "y": 101.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "index": 46, + "type": "Other", + "hittable": false, + "depth": 30, + "enabled": true, + "parentIndex": 45, + "ref": "e47" + }, + { + "enabled": true, + "index": 47, + "hittable": false, + "parentIndex": 45, + "type": "Other", + "rect": { + "y": 107.1666669845581, + "width": 11, + "height": 5, + "x": 227.8333282470703 + }, + "depth": 30, + "ref": "e48" + }, + { + "rect": { + "y": 103.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "index": 48, + "enabled": true, + "depth": 30, + "ref": "e49" + }, + { + "rect": { + "y": 109.1666669845581, + "width": 1.0049999999999955, + "height": 1, + "x": 229.8333282470703 + }, + "type": "Other", + "hittable": false, + "parentIndex": 45, + "index": 49, + "enabled": true, + "depth": 30, + "ref": "e50" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "type": "StaticText", + "hittable": false, + "parentIndex": 36, + "index": 50, + "label": "dev-new", + "enabled": true, + "depth": 28, + "ref": "e51" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "height": 16, + "x": 242.3333282470703 + }, + "type": "StaticText", + "hittable": false, + "parentIndex": 50, + "index": 51, + "label": "dev-new", + "enabled": true, + "depth": 29, + "ref": "e52" + }, + { + "rect": { + "y": 81.6666669845581, + "width": 32, + "height": 32, + "x": 330 + }, + "type": "Button", + "hittable": false, + "parentIndex": 35, + "index": 52, + "label": "Workspace actions", + "enabled": true, + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "ref": "e53" + }, + { + "rect": { + "width": 32, + "height": 32, + "y": 81.6666669845581, + "x": 362 + }, + "type": "Button", + "hittable": false, + "parentIndex": 28, + "index": 53, + "label": "Open Explorer sidebar", + "enabled": true, + "identifier": "workspace-explorer-toggle", + "depth": 26, + "ref": "e54" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "index": 54, + "enabled": true, + "depth": 25, + "ref": "e55" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "index": 55, + "enabled": true, + "depth": 25, + "ref": "e56" + }, + { + "rect": { + "width": 402, + "height": 34, + "y": 126, + "x": 0 + }, + "type": "Button", + "hittable": false, + "parentIndex": 27, + "index": 56, + "label": "Switch tabs (2 open)", + "enabled": true, + "identifier": "workspace-tab-switcher-trigger", + "depth": 25, + "ref": "e57" + }, + { + "rect": { + "width": 14, + "height": 14, + "y": 136, + "x": 20 + }, + "type": "Other", + "hittable": false, + "parentIndex": 56, + "index": 57, + "enabled": true, + "identifier": "workspace-active-tab-icon", + "depth": 26, + "ref": "e58" + }, + { + "rect": { + "width": 402, + "height": 35, + "y": 126, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "index": 58, + "enabled": true, + "identifier": "workspace-tabs-row", + "depth": 25, + "ref": "e59" + }, + { + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "index": 59, + "enabled": true, + "depth": 25, + "ref": "e60" + }, + { + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "index": 60, + "enabled": true, + "depth": 25, + "ref": "e61" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "depth": 26, + "parentIndex": 60, + "index": 61, + "type": "Other", + "label": "Add attachment", + "ref": "e62" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "depth": 27, + "parentIndex": 61, + "index": 62, + "type": "Other", + "enabled": true, + "ref": "e63" + }, + { + "index": 63, + "enabled": true, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "depth": 27, + "type": "Other", + "parentIndex": 61, + "hittable": false, + "ref": "e64" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "index": 64, + "identifier": "composer-viewport", + "parentIndex": 61, + "depth": 27, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "ref": "e65" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "label": "Scroll to bottom", + "index": 65, + "parentIndex": 64, + "depth": 28, + "rect": { + "width": 402, + "height": 713, + "y": -141, + "x": 0 + }, + "ref": "e66" + }, + { + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "identifier": "composer-dock-content", + "depth": 29, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 66, + "parentIndex": 65, + "ref": "e67" + }, + { + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "depth": 30, + "parentIndex": 66, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 67, + "ref": "e68" + }, + { + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "parentIndex": 66, + "depth": 30, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "type": "Other", + "index": 68, + "ref": "e69" + }, + { + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "parentIndex": 68, + "depth": 31, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 69, + "ref": "e70" + }, + { + "enabled": true, + "identifier": "agent-chat-scroll", + "depth": 31, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "parentIndex": 68, + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "index": 70, + "ref": "e71" + }, + { + "enabled": true, + "depth": 32, + "label": "Thinking", + "hittable": false, + "type": "ScrollView", + "parentIndex": 70, + "rect": { + "width": 402, + "height": 575, + "y": -141, + "x": 0 + }, + "index": 71, + "ref": "e72" + }, + { + "rect": { + "width": 402, + "height": 6169.33349609375, + "y": -4730.33349609375, + "x": 0 + }, + "index": 72, + "type": "Other", + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "enabled": true, + "hittable": false, + "depth": 33, + "parentIndex": 71, + "ref": "e73" + }, + { + "hittable": false, + "parentIndex": 72, + "type": "Other", + "rect": { + "width": 402, + "height": 6169.33349609375, + "y": -4730.33349609375, + "x": 0 + }, + "index": 73, + "depth": 34, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "enabled": true, + "ref": "e74" + }, + { + "type": "Other", + "enabled": true, + "index": 74, + "parentIndex": 73, + "hittable": false, + "depth": 35, + "rect": { + "width": 378, + "height": 32, + "y": -4730.33349609375, + "x": 12 + }, + "ref": "e75" + }, + { + "identifier": "older-history-slot", + "type": "Other", + "enabled": true, + "index": 75, + "parentIndex": 74, + "hittable": false, + "depth": 36, + "rect": { + "width": 378, + "height": 32, + "y": -4730.33349609375, + "x": 12 + }, + "ref": "e76" + }, + { + "parentIndex": 73, + "index": 76, + "depth": 35, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 378, + "height": 747, + "y": -4698.33349609375, + "x": 12 + }, + "ref": "e77" + }, + { + "type": "Other", + "hittable": false, + "index": 77, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "width": 378, + "height": 1725.33349609375, + "y": -3951.33349609375, + "x": 12 + }, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "ref": "e78" + }, + { + "type": "Other", + "hittable": false, + "index": 78, + "identifier": "user-message", + "rect": { + "width": 362, + "height": 1725.33349609375, + "y": -3951.33349609375, + "x": 20 + }, + "enabled": true, + "depth": 36, + "parentIndex": 77, + "ref": "e79" + }, + { + "type": "Other", + "hittable": false, + "index": 79, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "width": 362, + "height": 1725.33349609375, + "y": -3951.33349609375, + "x": 20 + }, + "enabled": true, + "depth": 36, + "parentIndex": 77, + "ref": "e80" + }, + { + "type": "Other", + "hittable": false, + "index": 80, + "rect": { + "x": 20, + "y": -3951.33349609375, + "width": 362, + "height": 1693.33349609375 + }, + "depth": 37, + "enabled": true, + "parentIndex": 79, + "ref": "e81" + }, + { + "type": "StaticText", + "hittable": false, + "index": 81, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "x": 36, + "y": -3935.33349609375, + "width": 330, + "height": 1661.66650390625 + }, + "enabled": true, + "depth": 37, + "parentIndex": 79, + "ref": "e82" + }, + { + "type": "StaticText", + "hittable": false, + "index": 82, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "x": 36, + "y": -3935.33349609375, + "width": 330, + "height": 1661.66650390625 + }, + "enabled": true, + "depth": 38, + "parentIndex": 81, + "ref": "e83" + }, + { + "type": "Other", + "hittable": false, + "index": 83, + "identifier": "user-message-trailing-row", + "rect": { + "x": 274.3333282470703, + "y": -2250.0001220703125, + "width": 107.66665649414062, + "height": 24 + }, + "enabled": true, + "depth": 37, + "parentIndex": 79, + "ref": "e84" + }, + { + "type": "StaticText", + "hittable": false, + "index": 84, + "identifier": "user-message-timestamp", + "label": "8:53 PM", + "rect": { + "x": 274.3333282470703, + "y": -2246.0001220703125, + "width": 49.666656494140625, + "height": 15.66650390625 + }, + "enabled": true, + "depth": 37, + "parentIndex": 79, + "ref": "e85" + }, + { + "type": "StaticText", + "hittable": false, + "index": 85, + "label": "8:53 PM", + "rect": { + "x": 274.3333282470703, + "y": -2246.0001220703125, + "width": 49.666656494140625, + "height": 15.66650390625 + }, + "enabled": true, + "depth": 38, + "parentIndex": 84, + "ref": "e86" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 79, + "rect": { + "x": 331.99999618530273, + "y": -2250.0001220703125, + "width": 24, + "height": 24 + }, + "label": "Rewind to this message", + "index": 86, + "depth": 37, + "ref": "e87" + }, + { + "type": "Button", + "enabled": true, + "hittable": false, + "parentIndex": 86, + "rect": { + "x": 331.99999618530273, + "y": -2250.0001220703125, + "width": 24, + "height": 24 + }, + "label": "Rewind to this message", + "identifier": "rewind-menu-trigger", + "index": 87, + "depth": 38, + "ref": "e88" + }, + { + "label": "Copy message", + "depth": 37, + "type": "Button", + "index": 88, + "parentIndex": 79, + "enabled": true, + "hittable": false, + "rect": { + "x": 363.99999237060547, + "y": -2249.0001220703125, + "width": 22, + "height": 22 + }, + "ref": "e89" + }, + { + "type": "Other", + "parentIndex": 73, + "label": "Cycle 1", + "enabled": true, + "rect": { + "x": 12, + "y": -2226, + "width": 378, + "height": 394 + }, + "hittable": false, + "index": 89, + "depth": 35, + "ref": "e90" + }, + { + "identifier": "assistant-message", + "type": "Other", + "parentIndex": 89, + "enabled": true, + "rect": { + "x": 20, + "y": -2226, + "width": 362, + "height": 390 + }, + "hittable": false, + "index": 90, + "depth": 36, + "ref": "e91" + }, + { + "enabled": true, + "label": "Cycle 1", + "hittable": false, + "depth": 36, + "parentIndex": 89, + "rect": { + "x": 20, + "y": -2190, + "width": 84, + "height": 33 + }, + "type": "Other", + "index": 91, + "ref": "e92" + }, + { + "enabled": true, + "label": "Cycle 1", + "hittable": false, + "depth": 37, + "parentIndex": 91, + "rect": { + "x": 20, + "y": -2190, + "width": 84, + "height": 33 + }, + "type": "Other", + "index": 92, + "ref": "e93" + }, + { + "parentIndex": 92, + "depth": 38, + "type": "Other", + "rect": { + "x": 20, + "y": -2190, + "width": 84, + "height": 33 + }, + "enabled": true, + "index": 93, + "hittable": false, + "ref": "e94" + }, + { + "depth": 38, + "label": "Cycle 1", + "index": 94, + "type": "TextView", + "enabled": true, + "value": "Cycle 1", + "parentIndex": 92, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "hittable": false, + "ref": "e95" + }, + { + "depth": 39, + "index": 95, + "parentIndex": 94, + "label": "Cycle 1", + "type": "TextView", + "rect": { + "x": 20, + "y": -2190, + "width": 83.7953545153141, + "height": 33 + }, + "hittable": false, + "enabled": true, + "ref": "e96" + }, + { + "hittable": false, + "depth": 39, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "parentIndex": 94, + "rect": { + "x": 71, + "y": -2190, + "width": 30, + "height": 33 + }, + "index": 96, + "enabled": true, + "ref": "e97" + }, + { + "index": 97, + "enabled": true, + "parentIndex": 96, + "depth": 40, + "hittable": false, + "rect": { + "x": 98, + "y": -2229, + "width": 3, + "height": 36 + }, + "type": "Other", + "ref": "e98" + }, + { + "depth": 39, + "rect": { + "x": 20, + "y": -2176.5, + "width": 84, + "height": 16.5 + }, + "enabled": true, + "index": 98, + "parentIndex": 94, + "hittable": false, + "type": "Other", + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "ref": "e99" + }, + { + "hittable": false, + "parentIndex": 98, + "index": 99, + "type": "Other", + "enabled": true, + "rect": { + "x": -19, + "y": -2163, + "width": 36, + "height": 3 + }, + "depth": 40, + "ref": "e100" + }, + { + "index": 100, + "parentIndex": 89, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "y": -2190, + "width": 362, + "height": 42 + }, + "depth": 36, + "enabled": true, + "ref": "e101" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 20, + "y": -2124, + "width": 362, + "height": 264 + }, + "type": "Other", + "index": 101, + "enabled": true, + "hittable": false, + "depth": 36, + "parentIndex": 89, + "ref": "e102" + }, + { + "hittable": false, + "depth": 37, + "rect": { + "x": 20, + "y": -2124, + "width": 362, + "height": 264 + }, + "index": 102, + "enabled": true, + "parentIndex": 101, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e103" + }, + { + "rect": { + "x": 20, + "y": -2124, + "width": 362, + "height": 264 + }, + "index": 103, + "enabled": true, + "depth": 38, + "hittable": false, + "parentIndex": 102, + "type": "Other", + "ref": "e104" + }, + { + "enabled": true, + "parentIndex": 102, + "index": 104, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "hittable": false, + "depth": 38, + "ref": "e105" + }, + { + "hittable": false, + "index": 105, + "type": "TextView", + "parentIndex": 104, + "rect": { + "x": 20, + "y": -2124, + "width": 362, + "height": 264 + }, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "depth": 39, + "ref": "e106" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "depth": 39, + "rect": { + "x": 349, + "y": -2124, + "width": 30, + "height": 264 + }, + "index": 106, + "parentIndex": 104, + "enabled": true, + "value": "0%", + "ref": "e107" + }, + { + "index": 107, + "depth": 40, + "type": "Other", + "parentIndex": 106, + "rect": { + "x": 376, + "y": -2163, + "width": 3, + "height": 36 + }, + "enabled": true, + "hittable": false, + "ref": "e108" + }, + { + "enabled": true, + "index": 108, + "value": "0%", + "parentIndex": 104, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "rect": { + "x": 20, + "y": -1893, + "width": 362, + "height": 30 + }, + "type": "Other", + "ref": "e109" + }, + { + "depth": 40, + "rect": { + "x": -19, + "y": -1866, + "width": 36, + "height": 3 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 109, + "parentIndex": 108, + "ref": "e110" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 73, + "index": 110, + "hittable": false, + "rect": { + "x": 12, + "y": -1832, + "width": 378, + "height": 32 + }, + "depth": 35, + "label": "Thinking", + "ref": "e111" + }, + { + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "y": -1832, + "width": 388, + "height": 32 + }, + "enabled": true, + "index": 111, + "depth": 36, + "parentIndex": 110, + "hittable": false, + "ref": "e112" + }, + { + "type": "Button", + "parentIndex": 110, + "label": "Thinking", + "index": 112, + "rect": { + "x": 7, + "y": -1832, + "width": 388, + "height": 32 + }, + "enabled": true, + "depth": 36, + "hittable": false, + "ref": "e113" + }, + { + "type": "Other", + "label": "Thinking", + "index": 113, + "enabled": true, + "depth": 37, + "rect": { + "x": 42, + "y": -1825, + "width": 344, + "height": 18 + }, + "hittable": false, + "parentIndex": 112, + "ref": "e114" + }, + { + "type": "StaticText", + "rect": { + "x": 42, + "y": -1825, + "width": 58.666664123535156, + "height": 18 + }, + "index": 114, + "enabled": true, + "depth": 38, + "hittable": false, + "label": "Thinking", + "parentIndex": 113, + "ref": "e115" + }, + { + "rect": { + "x": 42, + "y": -1825, + "width": 58.666664123535156, + "height": 18 + }, + "hittable": false, + "parentIndex": 114, + "type": "StaticText", + "index": 115, + "enabled": true, + "depth": 39, + "label": "Thinking", + "ref": "e116" + }, + { + "index": 116, + "parentIndex": 73, + "rect": { + "x": 12, + "y": -1800, + "width": 378, + "height": 32 + }, + "enabled": true, + "hittable": false, + "depth": 35, + "type": "Other", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "ref": "e117" + }, + { + "identifier": "tool-call-badge", + "index": 117, + "type": "Other", + "hittable": false, + "parentIndex": 116, + "enabled": true, + "rect": { + "x": 7, + "y": -1800, + "width": 388, + "height": 32 + }, + "depth": 36, + "ref": "e118" + }, + { + "type": "Button", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "depth": 36, + "parentIndex": 116, + "rect": { + "x": 7, + "y": -1800, + "width": 388, + "height": 32 + }, + "enabled": true, + "index": 118, + "ref": "e119" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "label": "Read", + "depth": 37, + "parentIndex": 118, + "rect": { + "x": 42, + "y": -1793, + "width": 344, + "height": 18 + }, + "index": 119, + "ref": "e120" + }, + { + "parentIndex": 119, + "label": "Read", + "rect": { + "x": 42, + "y": -1793, + "width": 35, + "height": 18 + }, + "index": 120, + "type": "StaticText", + "enabled": true, + "hittable": false, + "depth": 38, + "ref": "e121" + }, + { + "parentIndex": 120, + "type": "StaticText", + "label": "Read", + "hittable": false, + "rect": { + "x": 42, + "y": -1793, + "width": 35, + "height": 18 + }, + "depth": 39, + "index": 121, + "enabled": true, + "ref": "e122" + }, + { + "depth": 38, + "index": 122, + "hittable": false, + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "parentIndex": 119, + "enabled": true, + "rect": { + "x": 85, + "y": -1793, + "width": 301, + "height": 18 + }, + "ref": "e123" + }, + { + "index": 123, + "parentIndex": 122, + "label": "packages/app/src/components/conversation-list.tsx", + "type": "StaticText", + "rect": { + "x": 85, + "y": -1793, + "width": 301, + "height": 18 + }, + "hittable": false, + "enabled": true, + "depth": 39, + "ref": "e124" + }, + { + "rect": { + "x": 12, + "y": -1768, + "width": 378, + "height": 36 + }, + "parentIndex": 73, + "depth": 35, + "type": "Other", + "index": 124, + "enabled": true, + "label": "Search, scrollToEnd", + "hittable": false, + "ref": "e125" + }, + { + "hittable": false, + "rect": { + "x": 7, + "y": -1768, + "width": 388, + "height": 32 + }, + "type": "Other", + "enabled": true, + "parentIndex": 124, + "index": 125, + "depth": 36, + "identifier": "tool-call-badge", + "ref": "e126" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 7, + "y": -1768, + "width": 388, + "height": 32 + }, + "label": "Search, scrollToEnd", + "type": "Button", + "parentIndex": 124, + "depth": 36, + "index": 126, + "ref": "e127" + }, + { + "type": "Other", + "hittable": false, + "depth": 37, + "index": 127, + "rect": { + "x": 42, + "y": -1761, + "width": 344, + "height": 18 + }, + "label": "Search", + "enabled": true, + "parentIndex": 126, + "ref": "e128" + }, + { + "enabled": true, + "rect": { + "x": 42, + "y": -1761, + "width": 48, + "height": 18 + }, + "label": "Search", + "index": 128, + "depth": 38, + "parentIndex": 127, + "hittable": false, + "type": "StaticText", + "ref": "e129" + }, + { + "hittable": false, + "index": 129, + "depth": 39, + "label": "Search", + "rect": { + "x": 42, + "y": -1761, + "width": 48, + "height": 18 + }, + "parentIndex": 128, + "enabled": true, + "type": "StaticText", + "ref": "e130" + }, + { + "enabled": true, + "label": "scrollToEnd", + "rect": { + "x": 98, + "y": -1761, + "width": 79.66667175292969, + "height": 18 + }, + "index": 130, + "hittable": false, + "type": "StaticText", + "depth": 38, + "parentIndex": 127, + "ref": "e131" + }, + { + "depth": 39, + "parentIndex": 130, + "index": 131, + "label": "scrollToEnd", + "rect": { + "x": 98, + "y": -1761, + "width": 79.66667175292969, + "height": 18 + }, + "enabled": true, + "hittable": false, + "type": "StaticText", + "ref": "e132" + }, + { + "enabled": true, + "parentIndex": 73, + "index": 132, + "depth": 35, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "rect": { + "x": 12, + "y": -1732, + "width": 378, + "height": 646 + }, + "ref": "e133" + }, + { + "parentIndex": 132, + "index": 133, + "depth": 36, + "identifier": "assistant-message", + "rect": { + "x": 20, + "y": -1732, + "width": 362, + "height": 642 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e134" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 132, + "index": 134, + "depth": 36, + "enabled": true, + "rect": { + "x": 20, + "y": -1720, + "width": 362, + "height": 132 + }, + "hittable": false, + "type": "Other", + "ref": "e135" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 37, + "parentIndex": 134, + "type": "Other", + "index": 135, + "rect": { + "x": 20, + "y": -1720, + "width": 362, + "height": 132 + }, + "hittable": false, + "enabled": true, + "ref": "e136" + }, + { + "enabled": true, + "parentIndex": 135, + "type": "Other", + "depth": 38, + "rect": { + "x": 20, + "y": -1720, + "width": 362, + "height": 132 + }, + "index": 136, + "hittable": false, + "ref": "e137" + }, + { + "depth": 38, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 137, + "enabled": true, + "hittable": false, + "parentIndex": 135, + "ref": "e138" + }, + { + "index": 138, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 20, + "y": -1720, + "width": 362, + "height": 132 + }, + "enabled": true, + "type": "TextView", + "depth": 39, + "parentIndex": 137, + "hittable": false, + "ref": "e139" + }, + { + "value": "0%", + "depth": 39, + "parentIndex": 137, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "index": 139, + "enabled": true, + "rect": { + "x": 349, + "y": -1720, + "width": 30, + "height": 132 + }, + "hittable": false, + "ref": "e140" + }, + { + "enabled": true, + "rect": { + "x": 376, + "y": -1759, + "width": 3, + "height": 36 + }, + "depth": 40, + "type": "Other", + "index": 140, + "hittable": false, + "parentIndex": 139, + "ref": "e141" + }, + { + "value": "0%", + "depth": 39, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "rect": { + "x": 20, + "y": -1621, + "width": 362, + "height": 30 + }, + "index": 141, + "parentIndex": 137, + "ref": "e142" + }, + { + "hittable": false, + "rect": { + "x": -19, + "y": -1594, + "width": 36, + "height": 3 + }, + "type": "Other", + "index": 142, + "enabled": true, + "parentIndex": 141, + "depth": 40, + "ref": "e143" + }, + { + "hittable": false, + "depth": 36, + "rect": { + "x": 30, + "y": -1560, + "width": 7.333332061767578, + "height": 22 + }, + "parentIndex": 132, + "type": "StaticText", + "index": 143, + "enabled": true, + "label": "•", + "ref": "e144" + }, + { + "depth": 37, + "parentIndex": 143, + "enabled": true, + "hittable": false, + "type": "StaticText", + "index": 144, + "label": "•", + "rect": { + "x": 30, + "y": -1560, + "width": 7.333332061767578, + "height": 22 + }, + "ref": "e145" + }, + { + "rect": { + "x": 41.33333396911621, + "y": -1560, + "width": 340.6666564941406, + "height": 88 + }, + "hittable": false, + "depth": 36, + "type": "Other", + "index": 145, + "enabled": true, + "parentIndex": 132, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e146" + }, + { + "enabled": true, + "hittable": false, + "depth": 37, + "parentIndex": 145, + "rect": { + "x": 41.33333396911621, + "y": -1560, + "width": 340.6666564941406, + "height": 88 + }, + "index": 146, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "Other", + "ref": "e147" + }, + { + "depth": 38, + "enabled": true, + "parentIndex": 146, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -1560, + "width": 340.6666564941406, + "height": 88 + }, + "hittable": false, + "index": 147, + "ref": "e148" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "depth": 38, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 148, + "parentIndex": 146, + "type": "TextView", + "enabled": true, + "hittable": false, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e149" + }, + { + "index": 149, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "type": "TextView", + "parentIndex": 148, + "rect": { + "x": 41.33333396911621, + "y": -1560, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 39, + "ref": "e150" + }, + { + "type": "Other", + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 148, + "rect": { + "x": 349.00000063578284, + "y": -1560, + "width": 30, + "height": 88 + }, + "value": "0%", + "enabled": true, + "index": 150, + "depth": 39, + "ref": "e151" + }, + { + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -1599, + "width": 3, + "height": 36 + }, + "enabled": true, + "index": 151, + "parentIndex": 150, + "ref": "e152" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "x": 41.33333396911621, + "y": -1505, + "width": 340.6666564941406, + "height": 30 + }, + "index": 152, + "hittable": false, + "depth": 39, + "type": "Other", + "parentIndex": 148, + "enabled": true, + "ref": "e153" + }, + { + "rect": { + "x": 2.333333969116211, + "y": -1478, + "width": 36, + "height": 3 + }, + "index": 153, + "hittable": false, + "depth": 40, + "type": "Other", + "enabled": true, + "parentIndex": 152, + "ref": "e154" + }, + { + "type": "StaticText", + "hittable": false, + "index": 154, + "depth": 36, + "enabled": true, + "rect": { + "x": 30, + "y": -1468, + "width": 7.333332061767578, + "height": 22 + }, + "parentIndex": 132, + "label": "•", + "ref": "e155" + }, + { + "parentIndex": 154, + "index": 155, + "hittable": false, + "type": "StaticText", + "label": "•", + "enabled": true, + "rect": { + "x": 30, + "y": -1468, + "width": 7.333332061767578, + "height": 22 + }, + "depth": 37, + "ref": "e156" + }, + { + "rect": { + "x": 41.33333396911621, + "y": -1468, + "width": 340.6666564941406, + "height": 88 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "index": 156, + "enabled": true, + "depth": 36, + "hittable": false, + "parentIndex": 132, + "ref": "e157" + }, + { + "type": "Other", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 157, + "hittable": false, + "parentIndex": 156, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -1468, + "width": 340.6666564941406, + "height": 88 + }, + "enabled": true, + "ref": "e158" + }, + { + "enabled": true, + "parentIndex": 157, + "index": 158, + "rect": { + "x": 41.33333396911621, + "y": -1468, + "width": 340.6666564941406, + "height": 88 + }, + "type": "Other", + "depth": 38, + "hittable": false, + "ref": "e159" + }, + { + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "depth": 38, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 157, + "index": 159, + "type": "TextView", + "enabled": true, + "ref": "e160" + }, + { + "hittable": false, + "index": 160, + "type": "TextView", + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "y": -1468, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 159, + "depth": 39, + "ref": "e161" + }, + { + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "index": 161, + "rect": { + "x": 349.00000063578284, + "y": -1468, + "width": 30, + "height": 88 + }, + "value": "0%", + "hittable": false, + "depth": 39, + "parentIndex": 159, + "ref": "e162" + }, + { + "depth": 40, + "type": "Other", + "hittable": false, + "parentIndex": 161, + "rect": { + "x": 376.00000063578284, + "y": -1507, + "width": 3, + "height": 36 + }, + "index": 162, + "enabled": true, + "ref": "e163" + }, + { + "index": 163, + "type": "Other", + "parentIndex": 159, + "value": "0%", + "rect": { + "x": 41.33333396911621, + "y": -1413, + "width": 340.6666564941406, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "enabled": true, + "ref": "e164" + }, + { + "parentIndex": 163, + "rect": { + "x": 2.333333969116211, + "y": -1386, + "width": 36, + "height": 3 + }, + "type": "Other", + "depth": 40, + "hittable": false, + "index": 164, + "enabled": true, + "ref": "e165" + }, + { + "depth": 36, + "type": "StaticText", + "label": "•", + "enabled": true, + "rect": { + "x": 30, + "y": -1376, + "width": 7.333332061767578, + "height": 22 + }, + "hittable": false, + "parentIndex": 132, + "index": 165, + "ref": "e166" + }, + { + "parentIndex": 165, + "depth": 37, + "type": "StaticText", + "rect": { + "x": 30, + "y": -1376, + "width": 7.333332061767578, + "height": 22 + }, + "hittable": false, + "index": 166, + "enabled": true, + "label": "•", + "ref": "e167" + }, + { + "hittable": false, + "index": 167, + "depth": 36, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "Other", + "parentIndex": 132, + "rect": { + "x": 41.33333396911621, + "y": -1376, + "width": 340.6666564941406, + "height": 88 + }, + "enabled": true, + "ref": "e168" + }, + { + "index": 168, + "rect": { + "x": 41.33333396911621, + "y": -1376, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 37, + "parentIndex": 167, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e169" + }, + { + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -1376, + "width": 340.6666564941406, + "height": 88 + }, + "hittable": false, + "depth": 38, + "index": 169, + "parentIndex": 168, + "enabled": true, + "ref": "e170" + }, + { + "index": 170, + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "enabled": true, + "parentIndex": 168, + "depth": 38, + "ref": "e171" + }, + { + "enabled": true, + "type": "TextView", + "hittable": false, + "rect": { + "x": 41.33333396911621, + "y": -1376, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 170, + "depth": 39, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 171, + "ref": "e172" + }, + { + "index": 172, + "parentIndex": 170, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "value": "0%", + "hittable": false, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -1376, + "width": 30, + "height": 88 + }, + "ref": "e173" + }, + { + "depth": 40, + "index": 173, + "hittable": false, + "rect": { + "x": 376.00000063578284, + "y": -1415, + "width": 3, + "height": 36 + }, + "enabled": true, + "type": "Other", + "parentIndex": 172, + "ref": "e174" + }, + { + "hittable": false, + "rect": { + "x": 41.33333396911621, + "y": -1321, + "width": 340.6666564941406, + "height": 30 + }, + "index": 174, + "depth": 39, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 170, + "value": "0%", + "ref": "e175" + }, + { + "rect": { + "x": 2.333333969116211, + "y": -1294, + "width": 36, + "height": 3 + }, + "hittable": false, + "depth": 40, + "type": "Other", + "index": 175, + "parentIndex": 174, + "enabled": true, + "ref": "e176" + }, + { + "index": 176, + "type": "StaticText", + "label": "•", + "hittable": false, + "parentIndex": 132, + "enabled": true, + "rect": { + "x": 30, + "y": -1284, + "width": 7.333332061767578, + "height": 22 + }, + "depth": 36, + "ref": "e177" + }, + { + "depth": 37, + "hittable": false, + "parentIndex": 176, + "index": 177, + "label": "•", + "rect": { + "x": 30, + "y": -1284, + "width": 7.333332061767578, + "height": 22 + }, + "enabled": true, + "type": "StaticText", + "ref": "e178" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 132, + "index": 178, + "depth": 36, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "x": 41.33333396911621, + "y": -1284, + "width": 340.6666564941406, + "height": 66 + }, + "ref": "e179" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "Other", + "rect": { + "x": 41.33333396911621, + "y": -1284, + "width": 340.6666564941406, + "height": 66 + }, + "depth": 37, + "enabled": true, + "index": 179, + "hittable": false, + "parentIndex": 178, + "ref": "e180" + }, + { + "rect": { + "x": 41.33333396911621, + "y": -1284, + "width": 340.6666564941406, + "height": 66 + }, + "index": 180, + "hittable": false, + "type": "Other", + "depth": 38, + "enabled": true, + "parentIndex": 179, + "ref": "e181" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + }, + "index": 181, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 38, + "type": "TextView", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "parentIndex": 179, + "ref": "e182" + }, + { + "index": 182, + "depth": 39, + "parentIndex": 181, + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "y": -1284, + "width": 340.6666564941406, + "height": 66 + }, + "ref": "e183" + }, + { + "depth": 39, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "index": 183, + "rect": { + "x": 349.00000063578284, + "y": -1284, + "width": 30, + "height": 66 + }, + "value": "0%", + "parentIndex": 181, + "enabled": true, + "hittable": false, + "ref": "e184" + }, + { + "parentIndex": 183, + "depth": 40, + "enabled": true, + "rect": { + "x": 376.00000063578284, + "y": -1323, + "width": 3, + "height": 36 + }, + "hittable": false, + "type": "Other", + "index": 184, + "ref": "e185" + }, + { + "parentIndex": 181, + "depth": 39, + "enabled": true, + "value": "0%", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -1251, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 185, + "ref": "e186" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 185, + "depth": 40, + "index": 186, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": -1224, + "height": 3 + }, + "ref": "e187" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 132, + "hittable": false, + "depth": 36, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -1202, + "height": 88 + }, + "index": 187, + "type": "Other", + "ref": "e188" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -1202, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "index": 188, + "enabled": true, + "depth": 37, + "parentIndex": 187, + "ref": "e189" + }, + { + "index": 189, + "enabled": true, + "hittable": false, + "depth": 38, + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": -1202, + "height": 88 + }, + "parentIndex": 188, + "ref": "e190" + }, + { + "index": 190, + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "depth": 38, + "type": "TextView", + "hittable": false, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "parentIndex": 188, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e191" + }, + { + "enabled": true, + "depth": 39, + "type": "TextView", + "hittable": false, + "index": 191, + "parentIndex": 190, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "width": 362, + "x": 20, + "y": -1202, + "height": 88 + }, + "ref": "e192" + }, + { + "hittable": false, + "rect": { + "width": 30, + "x": 349, + "y": -1202, + "height": 88 + }, + "depth": 39, + "parentIndex": 190, + "index": 192, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "ref": "e193" + }, + { + "rect": { + "width": 3, + "x": 376, + "y": -1241, + "height": 36 + }, + "index": 193, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 40, + "parentIndex": 192, + "ref": "e194" + }, + { + "type": "Other", + "depth": 39, + "index": 194, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": -1147, + "height": 30 + }, + "enabled": true, + "parentIndex": 190, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e195" + }, + { + "rect": { + "width": 36, + "x": -19, + "y": -1120, + "height": 3 + }, + "enabled": true, + "parentIndex": 194, + "index": 195, + "type": "Other", + "depth": 40, + "hittable": false, + "ref": "e196" + }, + { + "hittable": false, + "index": 196, + "parentIndex": 73, + "enabled": true, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "width": 378, + "x": 12, + "y": -1086, + "height": 32 + }, + "depth": 35, + "ref": "e197" + }, + { + "depth": 36, + "parentIndex": 196, + "hittable": false, + "rect": { + "width": 388, + "x": 7, + "y": -1086, + "height": 32 + }, + "identifier": "tool-call-badge", + "type": "Other", + "index": 197, + "enabled": true, + "ref": "e198" + }, + { + "type": "Button", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "hittable": false, + "depth": 36, + "parentIndex": 196, + "index": 198, + "rect": { + "width": 388, + "x": 7, + "y": -1086, + "height": 32 + }, + "ref": "e199" + }, + { + "label": "Edit", + "rect": { + "width": 344, + "x": 42, + "y": -1079, + "height": 18 + }, + "index": 199, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 198, + "depth": 37, + "ref": "e200" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 199, + "depth": 38, + "type": "StaticText", + "index": 200, + "label": "Edit", + "rect": { + "width": 26.666664123535156, + "x": 42, + "y": -1079, + "height": 18 + }, + "ref": "e201" + }, + { + "type": "StaticText", + "enabled": true, + "index": 201, + "hittable": false, + "depth": 39, + "rect": { + "width": 26.666664123535156, + "x": 42, + "y": -1079, + "height": 18 + }, + "label": "Edit", + "parentIndex": 200, + "ref": "e202" + }, + { + "hittable": false, + "index": 202, + "parentIndex": 199, + "type": "StaticText", + "rect": { + "width": 309.3333435058594, + "x": 76.66666793823242, + "y": -1079, + "height": 18 + }, + "depth": 38, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "ref": "e203" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 202, + "hittable": false, + "index": 203, + "rect": { + "width": 309.3333435058594, + "x": 76.66666793823242, + "y": -1079, + "height": 18 + }, + "enabled": true, + "depth": 39, + "type": "StaticText", + "ref": "e204" + }, + { + "parentIndex": 73, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": -1054, + "height": 36 + }, + "enabled": true, + "hittable": false, + "depth": 35, + "index": 204, + "ref": "e205" + }, + { + "type": "Other", + "parentIndex": 204, + "depth": 36, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "x": 7, + "y": -1054, + "height": 32 + }, + "index": 205, + "hittable": false, + "enabled": true, + "ref": "e206" + }, + { + "type": "Button", + "index": 206, + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "depth": 36, + "parentIndex": 204, + "rect": { + "width": 388, + "x": 7, + "y": -1054, + "height": 32 + }, + "ref": "e207" + }, + { + "parentIndex": 206, + "label": "Shell", + "type": "Other", + "rect": { + "width": 344, + "x": 42, + "y": -1047, + "height": 18 + }, + "index": 207, + "depth": 37, + "hittable": false, + "enabled": true, + "ref": "e208" + }, + { + "enabled": true, + "parentIndex": 207, + "depth": 38, + "label": "Shell", + "index": 208, + "type": "StaticText", + "rect": { + "width": 33.666664123535156, + "x": 42, + "y": -1047, + "height": 18 + }, + "hittable": false, + "ref": "e209" + }, + { + "enabled": true, + "label": "Shell", + "parentIndex": 208, + "hittable": false, + "index": 209, + "depth": 39, + "rect": { + "width": 33.666664123535156, + "x": 42, + "y": -1047, + "height": 18 + }, + "type": "StaticText", + "ref": "e210" + }, + { + "type": "StaticText", + "label": "node scripts/simulate-stream-burst.mjs", + "rect": { + "width": 271.3333435058594, + "x": 83.66666793823242, + "y": -1047, + "height": 18 + }, + "depth": 38, + "hittable": false, + "index": 210, + "parentIndex": 207, + "enabled": true, + "ref": "e211" + }, + { + "rect": { + "width": 271.3333435058594, + "x": 83.66666793823242, + "y": -1047, + "height": 18 + }, + "parentIndex": 210, + "index": 211, + "depth": 39, + "hittable": false, + "type": "StaticText", + "label": "node scripts/simulate-stream-burst.mjs", + "enabled": true, + "ref": "e212" + }, + { + "hittable": false, + "index": 212, + "enabled": true, + "depth": 35, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 378, + "x": 12, + "y": -1018, + "height": 570 + }, + "type": "Other", + "parentIndex": 73, + "ref": "e213" + }, + { + "identifier": "assistant-message", + "index": 213, + "rect": { + "width": 362, + "x": 20, + "y": -1018, + "height": 566 + }, + "enabled": true, + "type": "Other", + "depth": 36, + "parentIndex": 212, + "hittable": false, + "ref": "e214" + }, + { + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 362, + "x": 20, + "y": -1006, + "height": 242 + }, + "depth": 36, + "index": 214, + "type": "Other", + "enabled": true, + "parentIndex": 212, + "ref": "e215" + }, + { + "type": "Other", + "index": 215, + "parentIndex": 214, + "enabled": true, + "depth": 37, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": -1006, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e216" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -1006, + "height": 242 + }, + "type": "Other", + "depth": 38, + "enabled": true, + "parentIndex": 215, + "index": 216, + "hittable": false, + "ref": "e217" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 215, + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 217, + "ref": "e218" + }, + { + "enabled": true, + "parentIndex": 217, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": -1006, + "height": 242 + }, + "type": "TextView", + "depth": 39, + "index": 218, + "ref": "e219" + }, + { + "index": 219, + "enabled": true, + "hittable": false, + "rect": { + "width": 30, + "x": 349, + "y": -1006, + "height": 242 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 217, + "type": "Other", + "value": "0%", + "ref": "e220" + }, + { + "parentIndex": 219, + "type": "Other", + "depth": 40, + "rect": { + "width": 3, + "x": 376, + "y": -1045, + "height": 36 + }, + "index": 220, + "enabled": true, + "hittable": false, + "ref": "e221" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -797, + "height": 30 + }, + "index": 221, + "depth": 39, + "hittable": false, + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 217, + "value": "0%", + "ref": "e222" + }, + { + "parentIndex": 221, + "type": "Other", + "enabled": true, + "depth": 40, + "hittable": false, + "rect": { + "width": 36, + "x": -19, + "y": -770, + "height": 3 + }, + "index": 222, + "ref": "e223" + }, + { + "depth": 36, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "hittable": false, + "type": "Other", + "index": 223, + "parentIndex": 212, + "rect": { + "width": 362, + "x": 20, + "y": -740, + "height": 264 + }, + "ref": "e224" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -740, + "height": 264 + }, + "index": 224, + "parentIndex": 223, + "type": "Other", + "enabled": true, + "depth": 37, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e225" + }, + { + "index": 225, + "rect": { + "width": 362, + "x": 20, + "y": -740, + "height": 264 + }, + "depth": 38, + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 224, + "ref": "e226" + }, + { + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 226, + "hittable": false, + "parentIndex": 224, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "TextView", + "enabled": true, + "depth": 38, + "ref": "e227" + }, + { + "index": 227, + "hittable": false, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "enabled": true, + "depth": 39, + "rect": { + "width": 362, + "x": 20, + "y": -740, + "height": 264 + }, + "parentIndex": 226, + "ref": "e228" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "rect": { + "width": 30, + "x": 349, + "y": -740, + "height": 264 + }, + "index": 228, + "depth": 39, + "enabled": true, + "parentIndex": 226, + "ref": "e229" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 40, + "parentIndex": 228, + "index": 229, + "rect": { + "width": 3, + "x": 376, + "y": -779, + "height": 36 + }, + "ref": "e230" + }, + { + "depth": 39, + "value": "0%", + "type": "Other", + "hittable": false, + "index": 230, + "rect": { + "width": 362, + "x": 20, + "y": -509, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 226, + "enabled": true, + "ref": "e231" + }, + { + "hittable": false, + "parentIndex": 230, + "depth": 40, + "rect": { + "width": 36, + "x": -19, + "y": -482, + "height": 3 + }, + "type": "Other", + "index": 231, + "enabled": true, + "ref": "e232" + }, + { + "enabled": true, + "hittable": false, + "index": 232, + "type": "Other", + "depth": 35, + "rect": { + "width": 378, + "x": 12, + "y": -448, + "height": 32 + }, + "parentIndex": 73, + "label": "Thinking", + "ref": "e233" + }, + { + "type": "Other", + "hittable": false, + "index": 233, + "parentIndex": 232, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "x": 7, + "y": -448, + "height": 32 + }, + "enabled": true, + "depth": 36, + "ref": "e234" + }, + { + "type": "Button", + "depth": 36, + "enabled": true, + "hittable": false, + "index": 234, + "label": "Thinking", + "rect": { + "width": 388, + "x": 7, + "y": -448, + "height": 32 + }, + "parentIndex": 232, + "ref": "e235" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 235, + "hittable": false, + "type": "Other", + "parentIndex": 73, + "enabled": true, + "depth": 35, + "rect": { + "width": 378, + "x": 12, + "y": -416, + "height": 32 + }, + "ref": "e236" + }, + { + "type": "Other", + "index": 236, + "depth": 36, + "parentIndex": 235, + "enabled": true, + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "x": 7, + "y": -416, + "height": 32 + }, + "hittable": false, + "ref": "e237" + }, + { + "type": "Button", + "index": 237, + "depth": 36, + "rect": { + "width": 388, + "x": 7, + "y": -416, + "height": 32 + }, + "enabled": true, + "parentIndex": 235, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "ref": "e238" + }, + { + "index": 238, + "hittable": false, + "parentIndex": 237, + "rect": { + "width": 344, + "x": 42, + "y": -409, + "height": 18 + }, + "type": "Other", + "enabled": true, + "depth": 37, + "label": "Read", + "ref": "e239" + }, + { + "hittable": false, + "enabled": true, + "type": "StaticText", + "parentIndex": 238, + "label": "Read", + "rect": { + "width": 35, + "x": 42, + "y": -409, + "height": 18 + }, + "depth": 38, + "index": 239, + "ref": "e240" + }, + { + "parentIndex": 239, + "label": "Read", + "index": 240, + "hittable": false, + "rect": { + "width": 35, + "x": 42, + "y": -409, + "height": 18 + }, + "type": "StaticText", + "enabled": true, + "depth": 39, + "ref": "e241" + }, + { + "rect": { + "width": 301, + "x": 85, + "y": -409, + "height": 18 + }, + "index": 241, + "depth": 38, + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "enabled": true, + "parentIndex": 238, + "hittable": false, + "ref": "e242" + }, + { + "enabled": true, + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "width": 301, + "x": 85, + "y": -409, + "height": 18 + }, + "index": 242, + "hittable": false, + "type": "StaticText", + "parentIndex": 241, + "depth": 39, + "ref": "e243" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "y": -384, + "height": 36 + }, + "depth": 35, + "type": "Other", + "parentIndex": 73, + "label": "Search, scrollToEnd", + "index": 243, + "ref": "e244" + }, + { + "index": 244, + "identifier": "tool-call-badge", + "parentIndex": 243, + "enabled": true, + "rect": { + "width": 388, + "x": 7, + "y": -384, + "height": 32 + }, + "type": "Other", + "hittable": false, + "depth": 36, + "ref": "e245" + }, + { + "type": "Button", + "rect": { + "width": 388, + "x": 7, + "y": -384, + "height": 32 + }, + "parentIndex": 243, + "hittable": false, + "depth": 36, + "label": "Search, scrollToEnd", + "enabled": true, + "index": 245, + "ref": "e246" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 378, + "x": 12, + "y": -348, + "height": 646 + }, + "index": 246, + "hittable": false, + "depth": 35, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "ref": "e247" + }, + { + "index": 247, + "enabled": true, + "hittable": false, + "parentIndex": 246, + "depth": 36, + "type": "Other", + "identifier": "assistant-message", + "rect": { + "width": 362, + "x": 20, + "y": -348, + "height": 642 + }, + "ref": "e248" + }, + { + "index": 248, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "depth": 36, + "parentIndex": 246, + "rect": { + "width": 362, + "x": 20, + "y": -336, + "height": 132 + }, + "ref": "e249" + }, + { + "hittable": false, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "width": 362, + "x": 20, + "y": -336, + "height": 132 + }, + "depth": 37, + "parentIndex": 248, + "enabled": true, + "index": 249, + "ref": "e250" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "index": 250, + "rect": { + "width": 362, + "x": 20, + "y": -336, + "height": 132 + }, + "depth": 38, + "parentIndex": 249, + "ref": "e251" + }, + { + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "parentIndex": 249, + "depth": 38, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 251, + "hittable": false, + "enabled": true, + "ref": "e252" + }, + { + "index": 252, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -336, + "height": 132 + }, + "hittable": false, + "depth": 39, + "parentIndex": 251, + "ref": "e253" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 251, + "value": "0%", + "index": 253, + "type": "Other", + "enabled": true, + "rect": { + "width": 30, + "x": 349, + "y": -336, + "height": 132 + }, + "hittable": false, + "depth": 39, + "ref": "e254" + }, + { + "parentIndex": 253, + "index": 254, + "type": "Other", + "rect": { + "width": 3, + "x": 376, + "y": -375, + "height": 36 + }, + "enabled": true, + "hittable": false, + "depth": 40, + "ref": "e255" + }, + { + "depth": 39, + "rect": { + "width": 362, + "x": 20, + "y": -237, + "height": 30 + }, + "hittable": false, + "parentIndex": 251, + "index": 255, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e256" + }, + { + "depth": 40, + "hittable": false, + "parentIndex": 255, + "index": 256, + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "y": -210, + "height": 3 + }, + "type": "Other", + "ref": "e257" + }, + { + "type": "StaticText", + "label": "•", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -176, + "height": 22 + }, + "hittable": false, + "enabled": true, + "index": 257, + "parentIndex": 246, + "depth": 36, + "ref": "e258" + }, + { + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -176, + "height": 22 + }, + "enabled": true, + "label": "•", + "index": 258, + "hittable": false, + "depth": 37, + "parentIndex": 257, + "ref": "e259" + }, + { + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -176, + "height": 88 + }, + "index": 259, + "enabled": true, + "depth": 36, + "hittable": false, + "parentIndex": 246, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e260" + }, + { + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -176, + "height": 88 + }, + "depth": 37, + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "parentIndex": 259, + "index": 260, + "ref": "e261" + }, + { + "type": "Other", + "index": 261, + "enabled": true, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -176, + "height": 88 + }, + "parentIndex": 260, + "depth": 38, + "ref": "e262" + }, + { + "hittable": false, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "type": "TextView", + "index": 262, + "enabled": true, + "parentIndex": 260, + "depth": 38, + "ref": "e263" + }, + { + "enabled": true, + "type": "TextView", + "index": 263, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 39, + "parentIndex": 262, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -176, + "height": 88 + }, + "ref": "e264" + }, + { + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": -176, + "height": 88 + }, + "index": 264, + "type": "Other", + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "enabled": true, + "parentIndex": 262, + "ref": "e265" + }, + { + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": -215, + "height": 36 + }, + "enabled": true, + "hittable": false, + "parentIndex": 264, + "depth": 40, + "index": 265, + "type": "Other", + "ref": "e266" + }, + { + "value": "0%", + "index": 266, + "enabled": true, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -121, + "height": 30 + }, + "hittable": false, + "parentIndex": 262, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "ref": "e267" + }, + { + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": -94, + "height": 3 + }, + "type": "Other", + "index": 267, + "hittable": false, + "enabled": true, + "depth": 40, + "parentIndex": 266, + "ref": "e268" + }, + { + "label": "•", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -84, + "height": 22 + }, + "enabled": true, + "index": 268, + "depth": 36, + "parentIndex": 246, + "type": "StaticText", + "hittable": false, + "ref": "e269" + }, + { + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": -84, + "height": 22 + }, + "label": "•", + "enabled": true, + "hittable": false, + "depth": 37, + "index": 269, + "parentIndex": 268, + "type": "StaticText", + "ref": "e270" + }, + { + "type": "Other", + "depth": 36, + "index": 270, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -84, + "height": 88 + }, + "parentIndex": 246, + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e271" + }, + { + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -84, + "height": 88 + }, + "index": 271, + "enabled": true, + "depth": 37, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 270, + "hittable": false, + "ref": "e272" + }, + { + "hittable": false, + "parentIndex": 271, + "depth": 38, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -84, + "height": 88 + }, + "index": 272, + "enabled": true, + "ref": "e273" + }, + { + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 0, + "height": 4 + }, + "depth": 38, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "index": 273, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 271, + "ref": "e274" + }, + { + "depth": 39, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -84, + "height": 88 + }, + "type": "TextView", + "enabled": true, + "hittable": false, + "index": 274, + "parentIndex": 273, + "ref": "e275" + }, + { + "value": "0%", + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "index": 275, + "enabled": true, + "hittable": false, + "parentIndex": 273, + "depth": 39, + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": -84, + "height": 88 + }, + "ref": "e276" + }, + { + "depth": 40, + "index": 276, + "type": "Other", + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": -123, + "height": 36 + }, + "parentIndex": 275, + "enabled": true, + "hittable": false, + "ref": "e277" + }, + { + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "type": "Other", + "enabled": true, + "parentIndex": 273, + "hittable": false, + "index": 277, + "value": "0%", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": -29, + "height": 30 + }, + "ref": "e278" + }, + { + "index": 278, + "depth": 40, + "parentIndex": 277, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": -2, + "height": 3 + }, + "ref": "e279" + }, + { + "parentIndex": 246, + "enabled": true, + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 8, + "height": 22 + }, + "hittable": false, + "index": 279, + "type": "StaticText", + "depth": 36, + "label": "•", + "ref": "e280" + }, + { + "type": "StaticText", + "index": 280, + "label": "•", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 8, + "height": 22 + }, + "hittable": false, + "depth": 37, + "parentIndex": 279, + "enabled": true, + "ref": "e281" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 8, + "height": 88 + }, + "hittable": false, + "index": 281, + "parentIndex": 246, + "enabled": true, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 36, + "ref": "e282" + }, + { + "hittable": false, + "enabled": true, + "depth": 37, + "parentIndex": 281, + "index": 282, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 8, + "height": 88 + }, + "ref": "e283" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 8, + "height": 88 + }, + "hittable": false, + "depth": 38, + "parentIndex": 282, + "type": "Other", + "index": 283, + "enabled": true, + "ref": "e284" + }, + { + "enabled": true, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 282, + "hittable": false, + "type": "TextView", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 8, + "height": 88 + }, + "index": 284, + "depth": 38, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e285" + }, + { + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 8, + "height": 88 + }, + "index": 285, + "hittable": false, + "type": "TextView", + "parentIndex": 284, + "depth": 39, + "ref": "e286" + }, + { + "type": "Other", + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": 8, + "height": 88 + }, + "hittable": false, + "value": "0%", + "depth": 39, + "parentIndex": 284, + "label": "Vertical scroll bar, 1 page", + "index": 286, + "enabled": true, + "ref": "e287" + }, + { + "index": 287, + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": -31, + "height": 36 + }, + "hittable": false, + "depth": 40, + "enabled": true, + "type": "Other", + "parentIndex": 286, + "ref": "e288" + }, + { + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 63, + "height": 30 + }, + "index": 288, + "enabled": true, + "hittable": false, + "depth": 39, + "parentIndex": 284, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e289" + }, + { + "depth": 40, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": 90, + "height": 3 + }, + "index": 289, + "hittable": false, + "enabled": true, + "parentIndex": 288, + "type": "Other", + "ref": "e290" + }, + { + "hittable": false, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 100, + "height": 22 + }, + "index": 290, + "depth": 36, + "enabled": true, + "label": "•", + "parentIndex": 246, + "ref": "e291" + }, + { + "hittable": false, + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 100, + "height": 22 + }, + "parentIndex": 290, + "index": 291, + "type": "StaticText", + "depth": 37, + "enabled": true, + "label": "•", + "ref": "e292" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 100, + "height": 66 + }, + "parentIndex": 246, + "hittable": false, + "depth": 36, + "index": 292, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e293" + }, + { + "parentIndex": 292, + "index": 293, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 100, + "height": 66 + }, + "enabled": true, + "ref": "e294" + }, + { + "index": 294, + "parentIndex": 293, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 100, + "height": 66 + }, + "hittable": false, + "depth": 38, + "enabled": true, + "ref": "e295" + }, + { + "type": "TextView", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 295, + "enabled": true, + "parentIndex": 293, + "hittable": false, + "depth": 38, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 100, + "height": 66 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e296" + }, + { + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "TextView", + "parentIndex": 295, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 100, + "height": 66 + }, + "depth": 39, + "hittable": false, + "index": 296, + "ref": "e297" + }, + { + "hittable": false, + "type": "Other", + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "index": 297, + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": 100, + "height": 66 + }, + "parentIndex": 295, + "enabled": true, + "ref": "e298" + }, + { + "enabled": true, + "index": 298, + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": 61, + "height": 36 + }, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 297, + "ref": "e299" + }, + { + "parentIndex": 295, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 39, + "index": 299, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 133, + "height": 30 + }, + "ref": "e300" + }, + { + "hittable": false, + "type": "Other", + "depth": 40, + "enabled": true, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": 160, + "height": 3 + }, + "index": 300, + "parentIndex": 299, + "ref": "e301" + }, + { + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 182, + "height": 88 + }, + "index": 301, + "parentIndex": 246, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "enabled": true, + "depth": 36, + "ref": "e302" + }, + { + "index": 302, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 301, + "type": "Other", + "depth": 37, + "rect": { + "width": 362, + "x": 20, + "y": 182, + "height": 88 + }, + "hittable": false, + "enabled": true, + "ref": "e303" + }, + { + "depth": 38, + "hittable": false, + "parentIndex": 302, + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 182, + "height": 88 + }, + "enabled": true, + "index": 303, + "ref": "e304" + }, + { + "hittable": false, + "type": "TextView", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 304, + "parentIndex": 302, + "depth": 38, + "rect": { + "width": 362, + "x": 20, + "y": 182, + "height": 88 + }, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "ref": "e305" + }, + { + "hittable": false, + "depth": 39, + "rect": { + "width": 362, + "x": 20, + "y": 182, + "height": 88 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "enabled": true, + "parentIndex": 304, + "index": 305, + "ref": "e306" + }, + { + "hittable": false, + "rect": { + "width": 30, + "x": 349, + "y": 182, + "height": 88 + }, + "enabled": true, + "type": "Other", + "index": 306, + "parentIndex": 304, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "ref": "e307" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 306, + "index": 307, + "depth": 40, + "rect": { + "width": 3, + "x": 376, + "y": 143, + "height": 36 + }, + "enabled": true, + "ref": "e308" + }, + { + "parentIndex": 304, + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 237, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "index": 308, + "hittable": false, + "depth": 39, + "enabled": true, + "value": "0%", + "ref": "e309" + }, + { + "enabled": true, + "depth": 40, + "type": "Other", + "parentIndex": 308, + "hittable": false, + "rect": { + "width": 36, + "x": -19, + "y": 264, + "height": 3 + }, + "index": 309, + "ref": "e310" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": 298, + "height": 32 + }, + "hittable": false, + "depth": 35, + "parentIndex": 73, + "index": 310, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e311" + }, + { + "type": "Other", + "rect": { + "width": 388, + "x": 7, + "y": 298, + "height": 32 + }, + "identifier": "tool-call-badge", + "index": 311, + "hittable": false, + "enabled": true, + "depth": 36, + "parentIndex": 310, + "ref": "e312" + }, + { + "parentIndex": 310, + "rect": { + "width": 388, + "x": 7, + "y": 298, + "height": 32 + }, + "index": 312, + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "type": "Button", + "hittable": false, + "depth": 36, + "ref": "e313" + }, + { + "type": "Other", + "label": "Edit", + "index": 313, + "depth": 37, + "enabled": true, + "rect": { + "width": 344, + "x": 42, + "y": 305, + "height": 18 + }, + "hittable": false, + "parentIndex": 312, + "ref": "e314" + }, + { + "hittable": false, + "type": "StaticText", + "depth": 38, + "label": "Edit", + "rect": { + "width": 26.666664123535156, + "x": 42, + "y": 305, + "height": 18 + }, + "parentIndex": 313, + "index": 314, + "enabled": true, + "ref": "e315" + }, + { + "type": "StaticText", + "rect": { + "width": 26.666664123535156, + "x": 42, + "y": 305, + "height": 18 + }, + "hittable": false, + "label": "Edit", + "enabled": true, + "parentIndex": 314, + "index": 315, + "depth": 39, + "ref": "e316" + }, + { + "type": "StaticText", + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 38, + "rect": { + "width": 309.3333435058594, + "x": 76.66666793823242, + "y": 305, + "height": 18 + }, + "parentIndex": 313, + "hittable": false, + "index": 316, + "enabled": true, + "ref": "e317" + }, + { + "rect": { + "width": 309.3333435058594, + "x": 76.66666793823242, + "y": 305, + "height": 18 + }, + "depth": 39, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "index": 317, + "parentIndex": 316, + "hittable": false, + "type": "StaticText", + "ref": "e318" + }, + { + "rect": { + "width": 378, + "x": 12, + "y": 330, + "height": 36 + }, + "parentIndex": 73, + "depth": 35, + "enabled": true, + "index": 318, + "hittable": false, + "type": "Other", + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "ref": "e319" + }, + { + "depth": 36, + "rect": { + "width": 388, + "x": 7, + "y": 330, + "height": 32 + }, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "index": 319, + "hittable": false, + "parentIndex": 318, + "ref": "e320" + }, + { + "depth": 36, + "enabled": true, + "parentIndex": 318, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "index": 320, + "rect": { + "width": 388, + "x": 7, + "y": 330, + "height": 32 + }, + "hittable": false, + "type": "Button", + "ref": "e321" + }, + { + "depth": 35, + "rect": { + "width": 378, + "x": 12, + "y": 366, + "height": 570 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "parentIndex": 73, + "enabled": true, + "hittable": false, + "index": 321, + "ref": "e322" + }, + { + "index": 322, + "rect": { + "width": 362, + "x": 20, + "y": 366, + "height": 566 + }, + "depth": 36, + "hittable": false, + "type": "Other", + "identifier": "assistant-message", + "parentIndex": 321, + "enabled": true, + "ref": "e323" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 362, + "x": 20, + "y": 378, + "height": 242 + }, + "enabled": true, + "hittable": false, + "index": 323, + "parentIndex": 321, + "depth": 36, + "type": "Other", + "ref": "e324" + }, + { + "depth": 37, + "hittable": false, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": 378, + "height": 242 + }, + "type": "Other", + "index": 324, + "parentIndex": 323, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e325" + }, + { + "enabled": true, + "index": 325, + "parentIndex": 324, + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 378, + "height": 242 + }, + "hittable": false, + "depth": 38, + "ref": "e326" + }, + { + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 362, + "x": 20, + "y": 378, + "height": 242 + }, + "depth": 38, + "index": 326, + "hittable": false, + "parentIndex": 324, + "type": "TextView", + "ref": "e327" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "index": 327, + "parentIndex": 326, + "rect": { + "width": 362, + "x": 20, + "y": 378, + "height": 242 + }, + "hittable": false, + "enabled": true, + "type": "TextView", + "depth": 39, + "ref": "e328" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "x": 349, + "y": 378, + "height": 242 + }, + "index": 328, + "hittable": false, + "type": "Other", + "value": "0%", + "depth": 39, + "parentIndex": 326, + "enabled": true, + "ref": "e329" + }, + { + "index": 329, + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "width": 3, + "x": 376, + "y": 339, + "height": 36 + }, + "enabled": true, + "parentIndex": 328, + "ref": "e330" + }, + { + "hittable": false, + "depth": 39, + "type": "Other", + "enabled": true, + "index": 330, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "width": 362, + "x": 20, + "y": 587, + "height": 30 + }, + "parentIndex": 326, + "ref": "e331" + }, + { + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "y": 614, + "height": 3 + }, + "index": 331, + "depth": 40, + "type": "Other", + "hittable": false, + "parentIndex": 330, + "ref": "e332" + }, + { + "parentIndex": 321, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": 644, + "height": 264 + }, + "depth": 36, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 332, + "hittable": false, + "type": "Other", + "ref": "e333" + }, + { + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 644, + "height": 264 + }, + "enabled": true, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 333, + "parentIndex": 332, + "depth": 37, + "ref": "e334" + }, + { + "depth": 38, + "type": "Other", + "index": 334, + "parentIndex": 333, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 644, + "height": 264 + }, + "enabled": true, + "ref": "e335" + }, + { + "enabled": true, + "parentIndex": 333, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 38, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 644, + "height": 264 + }, + "index": 335, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e336" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": 644, + "height": 264 + }, + "type": "TextView", + "depth": 39, + "enabled": true, + "index": 336, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "hittable": false, + "parentIndex": 335, + "ref": "e337" + }, + { + "hittable": false, + "depth": 39, + "value": "0%", + "parentIndex": 335, + "type": "Other", + "index": 337, + "rect": { + "width": 30, + "x": 349, + "y": 644, + "height": 264 + }, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "ref": "e338" + }, + { + "type": "Other", + "depth": 40, + "enabled": true, + "rect": { + "width": 3, + "x": 376, + "y": 605, + "height": 36 + }, + "parentIndex": 337, + "index": 338, + "hittable": false, + "ref": "e339" + }, + { + "hittable": false, + "parentIndex": 335, + "rect": { + "width": 362, + "x": 20, + "y": 875, + "height": 30 + }, + "type": "Other", + "enabled": true, + "depth": 39, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "index": 339, + "ref": "e340" + }, + { + "type": "Other", + "depth": 40, + "hittable": false, + "rect": { + "width": 36, + "x": -19, + "y": 902, + "height": 3 + }, + "index": 340, + "enabled": true, + "parentIndex": 339, + "ref": "e341" + }, + { + "depth": 35, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": 936, + "height": 32 + }, + "parentIndex": 73, + "label": "Thinking", + "index": 341, + "ref": "e342" + }, + { + "index": 342, + "hittable": false, + "parentIndex": 341, + "rect": { + "width": 388, + "x": 7, + "y": 936, + "height": 32 + }, + "identifier": "tool-call-badge", + "enabled": true, + "type": "Other", + "depth": 36, + "ref": "e343" + }, + { + "index": 343, + "label": "Thinking", + "rect": { + "width": 388, + "x": 7, + "y": 936, + "height": 32 + }, + "enabled": true, + "parentIndex": 341, + "depth": 36, + "hittable": false, + "type": "Button", + "ref": "e344" + }, + { + "hittable": false, + "parentIndex": 343, + "type": "Other", + "index": 344, + "enabled": true, + "rect": { + "width": 344, + "x": 42, + "y": 943, + "height": 18 + }, + "label": "Thinking", + "depth": 37, + "ref": "e345" + }, + { + "parentIndex": 344, + "rect": { + "width": 58.666664123535156, + "x": 42, + "y": 943, + "height": 18 + }, + "index": 345, + "label": "Thinking", + "enabled": true, + "hittable": false, + "type": "StaticText", + "depth": 38, + "ref": "e346" + }, + { + "type": "StaticText", + "depth": 39, + "parentIndex": 345, + "enabled": true, + "index": 346, + "rect": { + "width": 58.666664123535156, + "x": 42, + "y": 943, + "height": 18 + }, + "hittable": false, + "label": "Thinking", + "ref": "e347" + }, + { + "index": 347, + "parentIndex": 73, + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "y": 968, + "height": 32 + }, + "depth": 35, + "enabled": true, + "type": "Other", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "ref": "e348" + }, + { + "parentIndex": 347, + "hittable": false, + "identifier": "tool-call-badge", + "index": 348, + "rect": { + "width": 388, + "x": 7, + "y": 968, + "height": 32 + }, + "depth": 36, + "type": "Other", + "enabled": true, + "ref": "e349" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 36, + "type": "Button", + "rect": { + "width": 388, + "x": 7, + "y": 968, + "height": 32 + }, + "enabled": true, + "index": 349, + "hittable": false, + "parentIndex": 347, + "ref": "e350" + }, + { + "label": "Read", + "enabled": true, + "rect": { + "width": 344, + "x": 42, + "y": 975, + "height": 18 + }, + "type": "Other", + "index": 350, + "parentIndex": 349, + "hittable": false, + "depth": 37, + "ref": "e351" + }, + { + "parentIndex": 350, + "depth": 38, + "enabled": true, + "hittable": false, + "label": "Read", + "rect": { + "width": 35, + "x": 42, + "y": 975, + "height": 18 + }, + "type": "StaticText", + "index": 351, + "ref": "e352" + }, + { + "rect": { + "width": 35, + "x": 42, + "y": 975, + "height": 18 + }, + "index": 352, + "parentIndex": 351, + "depth": 39, + "hittable": false, + "enabled": true, + "label": "Read", + "type": "StaticText", + "ref": "e353" + }, + { + "type": "StaticText", + "index": 353, + "rect": { + "width": 301, + "x": 85, + "y": 975, + "height": 18 + }, + "hittable": false, + "label": "packages/app/src/components/conversation-list.tsx", + "enabled": true, + "depth": 38, + "parentIndex": 350, + "ref": "e354" + }, + { + "parentIndex": 353, + "enabled": true, + "hittable": false, + "rect": { + "width": 301, + "x": 85, + "y": 975, + "height": 18 + }, + "label": "packages/app/src/components/conversation-list.tsx", + "depth": 39, + "index": 354, + "type": "StaticText", + "ref": "e355" + }, + { + "index": 355, + "enabled": true, + "depth": 35, + "type": "Other", + "hittable": false, + "label": "Search, scrollToEnd", + "rect": { + "width": 378, + "x": 12, + "y": 1000, + "height": 36 + }, + "parentIndex": 73, + "ref": "e356" + }, + { + "rect": { + "width": 388, + "x": 7, + "y": 1000, + "height": 32 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "identifier": "tool-call-badge", + "parentIndex": 355, + "index": 356, + "depth": 36, + "ref": "e357" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "width": 388, + "x": 7, + "y": 1000, + "height": 32 + }, + "index": 357, + "hittable": false, + "depth": 36, + "parentIndex": 355, + "type": "Button", + "enabled": true, + "ref": "e358" + }, + { + "rect": { + "width": 378, + "x": 12, + "y": 1036, + "height": 336 + }, + "index": 358, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "parentIndex": 73, + "depth": 35, + "ref": "e359" + }, + { + "parentIndex": 358, + "identifier": "assistant-message", + "type": "Other", + "rect": { + "width": 362, + "x": 20, + "y": 1036, + "height": 336 + }, + "enabled": true, + "hittable": false, + "depth": 36, + "index": 359, + "ref": "e360" + }, + { + "type": "Other", + "index": 360, + "rect": { + "width": 362, + "x": 20, + "y": 1048, + "height": 132 + }, + "enabled": true, + "hittable": false, + "parentIndex": 358, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 36, + "ref": "e361" + }, + { + "depth": 37, + "enabled": true, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 361, + "hittable": false, + "parentIndex": 360, + "rect": { + "width": 362, + "x": 20, + "y": 1048, + "height": 132 + }, + "ref": "e362" + }, + { + "parentIndex": 361, + "rect": { + "width": 362, + "x": 20, + "y": 1048, + "height": 132 + }, + "hittable": false, + "type": "Other", + "depth": 38, + "enabled": true, + "index": 362, + "ref": "e363" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": 1048, + "height": 132 + }, + "hittable": false, + "index": 363, + "enabled": true, + "depth": 38, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 361, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "ref": "e364" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 39, + "type": "TextView", + "enabled": true, + "parentIndex": 363, + "index": 364, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 1048, + "height": 132 + }, + "ref": "e365" + }, + { + "rect": { + "width": 30, + "x": 349, + "y": 1048, + "height": 132 + }, + "parentIndex": 363, + "value": "0%", + "hittable": false, + "type": "Other", + "index": 365, + "enabled": true, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "ref": "e366" + }, + { + "parentIndex": 365, + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "index": 366, + "rect": { + "width": 3, + "x": 376, + "y": 1009, + "height": 36 + }, + "ref": "e367" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": 1147, + "height": 30 + }, + "value": "0%", + "index": 367, + "depth": 39, + "parentIndex": 363, + "enabled": true, + "type": "Other", + "ref": "e368" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 367, + "depth": 40, + "rect": { + "width": 36, + "x": -19, + "y": 1174, + "height": 3 + }, + "index": 368, + "ref": "e369" + }, + { + "type": "StaticText", + "label": "•", + "depth": 36, + "index": 369, + "parentIndex": 358, + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 1208, + "height": 22 + }, + "enabled": true, + "hittable": false, + "ref": "e370" + }, + { + "index": 370, + "enabled": true, + "parentIndex": 369, + "type": "StaticText", + "depth": 37, + "label": "•", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 1208, + "height": 22 + }, + "hittable": false, + "ref": "e371" + }, + { + "parentIndex": 358, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 36, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1208, + "height": 88 + }, + "index": 371, + "enabled": true, + "ref": "e372" + }, + { + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "enabled": true, + "parentIndex": 371, + "index": 372, + "depth": 37, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1208, + "height": 88 + }, + "ref": "e373" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1208, + "height": 88 + }, + "parentIndex": 372, + "index": 373, + "type": "Other", + "depth": 38, + "enabled": true, + "hittable": false, + "ref": "e374" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1208, + "height": 88 + }, + "index": 374, + "parentIndex": 372, + "enabled": true, + "depth": 38, + "ref": "e375" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "type": "TextView", + "hittable": false, + "parentIndex": 374, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1208, + "height": 88 + }, + "index": 375, + "depth": 39, + "ref": "e376" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 39, + "index": 376, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 374, + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": 1208, + "height": 88 + }, + "ref": "e377" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 376, + "index": 377, + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": 1169, + "height": 36 + }, + "depth": 40, + "hittable": false, + "ref": "e378" + }, + { + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1263, + "height": 30 + }, + "value": "0%", + "type": "Other", + "enabled": true, + "index": 378, + "parentIndex": 374, + "ref": "e379" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": 1290, + "height": 3 + }, + "index": 379, + "enabled": true, + "parentIndex": 378, + "depth": 40, + "ref": "e380" + }, + { + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 1300, + "height": 22 + }, + "label": "•", + "parentIndex": 358, + "depth": 36, + "enabled": true, + "index": 380, + "type": "StaticText", + "hittable": false, + "ref": "e381" + }, + { + "depth": 37, + "parentIndex": 380, + "label": "•", + "rect": { + "width": 7.333332061767578, + "x": 30, + "y": 1300, + "height": 22 + }, + "index": 381, + "type": "StaticText", + "enabled": true, + "hittable": false, + "ref": "e382" + }, + { + "type": "Other", + "index": 382, + "enabled": true, + "depth": 36, + "label": "We rely on onContentSizeChange to dete", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1300, + "height": 22 + }, + "hittable": false, + "parentIndex": 358, + "ref": "e383" + }, + { + "index": 383, + "depth": 37, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1300, + "height": 22 + }, + "type": "Other", + "label": "We rely on onContentSizeChange to dete", + "hittable": false, + "parentIndex": 382, + "enabled": true, + "ref": "e384" + }, + { + "index": 384, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 383, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1300, + "height": 22 + }, + "depth": 38, + "ref": "e385" + }, + { + "index": 385, + "label": "We rely on onContentSizeChange to dete", + "type": "TextView", + "value": "We rely on onContentSizeChange to dete", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1300, + "height": 22 + }, + "enabled": true, + "hittable": false, + "depth": 38, + "parentIndex": 383, + "ref": "e386" + }, + { + "hittable": false, + "parentIndex": 385, + "depth": 39, + "rect": { + "width": 278.07421875, + "x": 41.33333396911621, + "y": 1300, + "height": 22 + }, + "index": 386, + "type": "TextView", + "enabled": true, + "label": "We rely on onContentSizeChange to dete", + "ref": "e387" + }, + { + "type": "Other", + "index": 387, + "value": "0%", + "parentIndex": 385, + "rect": { + "width": 30, + "x": 349.00000063578284, + "y": 1300, + "height": 22 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "enabled": true, + "depth": 39, + "ref": "e388" + }, + { + "rect": { + "width": 3, + "x": 376.00000063578284, + "y": 1261, + "height": 36 + }, + "index": 388, + "hittable": false, + "parentIndex": 387, + "depth": 40, + "type": "Other", + "enabled": true, + "ref": "e389" + }, + { + "parentIndex": 385, + "enabled": true, + "depth": 39, + "value": "0%", + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "index": 389, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "y": 1308, + "height": 11 + }, + "hittable": false, + "ref": "e390" + }, + { + "type": "Other", + "enabled": true, + "depth": 40, + "rect": { + "width": 36, + "x": 2.333333969116211, + "y": 1316, + "height": 3 + }, + "hittable": false, + "parentIndex": 389, + "index": 390, + "ref": "e391" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": 1338, + "height": 22 + }, + "hittable": false, + "type": "Other", + "index": 391, + "enabled": true, + "depth": 36, + "parentIndex": 358, + "label": "(end of synthetic stream)", + "ref": "e392" + }, + { + "parentIndex": 391, + "index": 392, + "enabled": true, + "type": "Other", + "hittable": false, + "label": "(end of synthetic stream)", + "depth": 37, + "rect": { + "width": 362, + "x": 20, + "y": 1338, + "height": 22 + }, + "ref": "e393" + }, + { + "hittable": false, + "index": 393, + "type": "Other", + "parentIndex": 392, + "depth": 38, + "rect": { + "width": 362, + "x": 20, + "y": 1338, + "height": 22 + }, + "enabled": true, + "ref": "e394" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": 1338, + "height": 22 + }, + "enabled": true, + "value": "(end of synthetic stream)", + "label": "(end of synthetic stream)", + "index": 394, + "depth": 38, + "parentIndex": 392, + "hittable": false, + "type": "TextView", + "ref": "e395" + }, + { + "hittable": false, + "rect": { + "width": 183.234375, + "x": 20, + "y": 1338, + "height": 22 + }, + "index": 395, + "type": "TextView", + "label": "(end of synthetic stream)", + "enabled": true, + "depth": 39, + "parentIndex": 394, + "ref": "e396" + }, + { + "rect": { + "width": 30, + "x": 349, + "y": 1338, + "height": 22 + }, + "index": 396, + "depth": 39, + "parentIndex": 394, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "hittable": false, + "type": "Other", + "value": "0%", + "ref": "e397" + }, + { + "parentIndex": 396, + "enabled": true, + "index": 397, + "type": "Other", + "depth": 40, + "rect": { + "width": 3, + "x": 376, + "y": 1299, + "height": 36 + }, + "hittable": false, + "ref": "e398" + }, + { + "hittable": false, + "value": "0%", + "rect": { + "width": 362, + "x": 20, + "y": 1346, + "height": 11 + }, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 394, + "depth": 39, + "type": "Other", + "index": 398, + "enabled": true, + "ref": "e399" + }, + { + "parentIndex": 398, + "hittable": false, + "index": 399, + "depth": 40, + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "y": 1354, + "height": 3 + }, + "type": "Other", + "ref": "e400" + }, + { + "label": "Copy turn", + "enabled": true, + "index": 400, + "rect": { + "width": 378, + "x": 12, + "y": 1372, + "height": 67 + }, + "hittable": false, + "depth": 35, + "type": "Other", + "parentIndex": 73, + "ref": "e401" + }, + { + "label": "Copy turn", + "parentIndex": 400, + "hittable": false, + "enabled": true, + "type": "Button", + "index": 401, + "rect": { + "width": 22, + "x": 16, + "y": 1385, + "height": 22 + }, + "depth": 36, + "ref": "e402" + }, + { + "enabled": true, + "parentIndex": 400, + "label": "Fork chat from here", + "type": "Other", + "hittable": false, + "depth": 36, + "rect": { + "width": 22, + "x": 46, + "y": 1385, + "height": 22 + }, + "index": 402, + "ref": "e403" + }, + { + "parentIndex": 402, + "type": "Button", + "label": "Fork chat from here", + "rect": { + "width": 22, + "x": 46, + "y": 1385, + "height": 22 + }, + "enabled": true, + "identifier": "assistant-fork-menu-trigger", + "hittable": false, + "index": 403, + "depth": 37, + "ref": "e404" + }, + { + "depth": 36, + "label": "Worked for 10s, ended 8:53 PM", + "type": "Button", + "index": 404, + "hittable": false, + "rect": { + "width": 91.33332824707031, + "x": 76, + "y": 1388.3333332538605, + "height": 15.666671752929688 + }, + "enabled": true, + "parentIndex": 400, + "ref": "e405" + }, + { + "index": 405, + "type": "StaticText", + "hittable": false, + "label": "Worked for 10s", + "parentIndex": 404, + "depth": 37, + "enabled": true, + "rect": { + "width": 91.33332824707031, + "x": 76, + "y": 1388.3333332538605, + "height": 15.666671752929688 + }, + "ref": "e406" + }, + { + "rect": { + "width": 91.33332824707031, + "x": 76, + "y": 1388.3333332538605, + "height": 15.666671752929688 + }, + "enabled": true, + "parentIndex": 405, + "hittable": false, + "label": "Worked for 10s", + "type": "StaticText", + "index": 406, + "depth": 38, + "ref": "e407" + }, + { + "enabled": true, + "index": 407, + "parentIndex": 71, + "rect": { + "width": 402, + "x": 0, + "y": 164, + "height": 30 + }, + "depth": 33, + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e408" + }, + { + "type": "Other", + "depth": 34, + "hittable": false, + "parentIndex": 407, + "rect": { + "width": 393, + "x": 3, + "y": 164, + "height": 3 + }, + "index": 408, + "enabled": true, + "ref": "e409" + }, + { + "depth": 33, + "hittable": false, + "type": "Other", + "value": "17%", + "label": "Vertical scroll bar, 23 pages", + "enabled": true, + "parentIndex": 71, + "rect": { + "width": 30, + "x": 369, + "y": 161, + "height": 273 + }, + "index": 409, + "ref": "e410" + }, + { + "hittable": false, + "parentIndex": 409, + "rect": { + "width": 3, + "x": 396, + "y": 353.66666666666674, + "height": 36 + }, + "type": "Other", + "enabled": true, + "index": 410, + "depth": 34, + "ref": "e411" + }, + { + "label": "Vertical scroll bar, 23 pages", + "enabled": true, + "depth": 33, + "rect": { + "width": 30, + "x": 369, + "y": 161, + "height": 273 + }, + "index": 411, + "type": "Other", + "hittable": false, + "value": "17%", + "parentIndex": 71, + "ref": "e412" + }, + { + "enabled": true, + "parentIndex": 411, + "rect": { + "width": 3, + "x": 396, + "y": 353.66666666666674, + "height": 36 + }, + "depth": 34, + "hittable": false, + "type": "Other", + "index": 412, + "ref": "e413" + }, + { + "value": "0%", + "depth": 33, + "parentIndex": 71, + "index": 413, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 402, + "x": 0, + "y": 164, + "height": 30 + }, + "hittable": false, + "enabled": true, + "ref": "e414" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 413, + "index": 414, + "hittable": false, + "depth": 34, + "rect": { + "width": 393, + "x": 3, + "y": 164, + "height": 3 + }, + "ref": "e415" + }, + { + "label": "Scroll to bottom", + "enabled": true, + "index": 415, + "rect": { + "width": 48, + "x": 177, + "y": 370, + "height": 48 + }, + "hittable": false, + "type": "Other", + "depth": 31, + "parentIndex": 68, + "ref": "e416" + }, + { + "identifier": "scroll-to-bottom-button", + "hittable": false, + "index": 416, + "parentIndex": 415, + "depth": 32, + "rect": { + "width": 48, + "x": 177, + "y": 370, + "height": 48 + }, + "label": "Scroll to bottom", + "enabled": true, + "type": "Button", + "ref": "e417" + }, + { + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "parentIndex": 65, + "hittable": false, + "index": 417, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 434, + "height": 138 + }, + "identifier": "composer-viewport-content", + "depth": 29, + "ref": "e418" + }, + { + "rect": { + "width": 370, + "x": 16, + "y": 434, + "height": 88 + }, + "index": 418, + "identifier": "message-input-root", + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 30, + "parentIndex": 417, + "ref": "e419" + }, + { + "type": "Other", + "depth": 30, + "parentIndex": 417, + "rect": { + "width": 370, + "x": 16, + "y": 434, + "height": 88 + }, + "index": 419, + "enabled": true, + "hittable": false, + "ref": "e420" + }, + { + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "rect": { + "width": 344, + "x": 29, + "y": 443, + "height": 30 + }, + "hittable": false, + "depth": 30, + "index": 420, + "type": "Other", + "parentIndex": 417, + "ref": "e421" + }, + { + "hittable": false, + "index": 421, + "enabled": true, + "rect": { + "width": 344, + "x": 29, + "y": 443, + "height": 30 + }, + "depth": 31, + "parentIndex": 420, + "label": "Message agent... Message, @files, /commands", + "type": "TextView", + "ref": "e422" + }, + { + "type": "Other", + "value": "0%", + "rect": { + "width": 30, + "x": 340, + "y": 443, + "height": 30 + }, + "index": 422, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "parentIndex": 421, + "hittable": false, + "depth": 32, + "ref": "e423" + }, + { + "hittable": false, + "rect": { + "width": 3, + "x": 367, + "y": 439, + "height": 31 + }, + "enabled": true, + "parentIndex": 422, + "index": 423, + "depth": 33, + "type": "Other", + "ref": "e424" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 421, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "index": 424, + "depth": 32, + "type": "Other", + "rect": { + "width": 344, + "x": 29, + "y": 455, + "height": 15 + }, + "ref": "e425" + }, + { + "rect": { + "width": 338, + "x": 32, + "y": 467, + "height": 3 + }, + "enabled": true, + "parentIndex": 424, + "type": "Other", + "index": 425, + "hittable": false, + "depth": 33, + "ref": "e426" + }, + { + "type": "Button", + "enabled": true, + "depth": 30, + "index": 426, + "identifier": "message-input-attach-button", + "hittable": false, + "parentIndex": 417, + "rect": { + "width": 28, + "x": 23, + "y": 485, + "height": 28 + }, + "label": "Add attachment", + "ref": "e427" + }, + { + "depth": 31, + "index": 427, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 426, + "rect": { + "width": 28, + "x": 23, + "y": 485, + "height": 28 + }, + "ref": "e428" + }, + { + "depth": 32, + "hittable": false, + "rect": { + "width": 20, + "x": 27, + "y": 489, + "height": 20 + }, + "type": "Other", + "index": 428, + "parentIndex": 427, + "enabled": true, + "ref": "e429" + }, + { + "hittable": false, + "parentIndex": 428, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 492.3333333333333, + "height": 13.333333333333371 + }, + "depth": 33, + "type": "Other", + "enabled": true, + "index": 429, + "ref": "e430" + }, + { + "depth": 34, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 498.16666666666663, + "height": 1.6666666666666856 + }, + "parentIndex": 429, + "index": 430, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e431" + }, + { + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "y": 492.33333333333337, + "height": 13.333333333333314 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 34, + "parentIndex": 429, + "index": 431, + "ref": "e432" + }, + { + "parentIndex": 417, + "depth": 30, + "enabled": true, + "hittable": false, + "index": 432, + "type": "Other", + "label": "Select model (Ten second stream)", + "rect": { + "width": 232, + "x": 51, + "y": 485, + "height": 28 + }, + "ref": "e433" + }, + { + "hittable": false, + "index": 433, + "enabled": true, + "type": "Button", + "depth": 31, + "rect": { + "width": 202, + "x": 51, + "y": 485, + "height": 28 + }, + "parentIndex": 432, + "label": "Select model (Ten second stream)", + "identifier": "combined-model-selector", + "ref": "e434" + }, + { + "index": 434, + "depth": 32, + "enabled": true, + "parentIndex": 433, + "hittable": false, + "rect": { + "width": 20, + "x": 59, + "y": 489, + "height": 20 + }, + "type": "Other", + "ref": "e435" + }, + { + "hittable": false, + "depth": 33, + "enabled": true, + "index": 435, + "parentIndex": 434, + "type": "Other", + "rect": { + "width": 20, + "x": 59, + "y": 489, + "height": 20 + }, + "ref": "e436" + }, + { + "type": "Other", + "index": 436, + "hittable": false, + "parentIndex": 435, + "rect": { + "width": 18.33333333333332, + "x": 59.833333333333336, + "y": 491.5, + "height": 15 + }, + "depth": 34, + "enabled": true, + "ref": "e437" + }, + { + "rect": { + "width": 15, + "x": 61.5, + "y": 494.83333333333337, + "height": 11.666666666666686 + }, + "hittable": false, + "parentIndex": 436, + "index": 437, + "depth": 35, + "type": "Other", + "enabled": true, + "ref": "e438" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 5, + "x": 64.83333333333333, + "y": 491.5, + "height": 5 + }, + "index": 438, + "parentIndex": 436, + "depth": 35, + "ref": "e439" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 3.3333333333333357, + "x": 59.83333333333333, + "y": 499.83333333333337, + "height": 1.6666666666666856 + }, + "depth": 35, + "index": 439, + "enabled": true, + "parentIndex": 436, + "ref": "e440" + }, + { + "rect": { + "width": 1.6666666666666714, + "x": 65.66666666666666, + "y": 499, + "height": 3.3333333333333144 + }, + "type": "Other", + "parentIndex": 436, + "enabled": true, + "hittable": false, + "index": 440, + "depth": 35, + "ref": "e441" + }, + { + "depth": 35, + "parentIndex": 436, + "index": 441, + "enabled": true, + "rect": { + "width": 1.6666666666666714, + "x": 70.66666666666667, + "y": 499, + "height": 3.3333333333333144 + }, + "hittable": false, + "type": "Other", + "ref": "e442" + }, + { + "index": 442, + "parentIndex": 436, + "rect": { + "width": 3.3333333333333286, + "x": 74.83333333333334, + "y": 499.83333333333337, + "height": 1.6666666666666856 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 35, + "ref": "e443" + }, + { + "hittable": false, + "index": 443, + "label": "Ten second stream", + "rect": { + "width": 130.3333282470703, + "x": 83, + "y": 490, + "height": 18 + }, + "type": "StaticText", + "parentIndex": 433, + "enabled": true, + "depth": 32, + "ref": "e444" + }, + { + "parentIndex": 443, + "index": 444, + "enabled": true, + "rect": { + "width": 130.3333282470703, + "x": 83, + "y": 490, + "height": 18 + }, + "hittable": false, + "type": "StaticText", + "depth": 33, + "label": "Ten second stream", + "ref": "e445" + }, + { + "label": "Context window 2% used", + "identifier": "context-window-meter", + "rect": { + "width": 28, + "x": 283, + "y": 485, + "height": 28 + }, + "depth": 30, + "type": "Image", + "enabled": true, + "hittable": false, + "index": 445, + "parentIndex": 417, + "ref": "e446" + }, + { + "enabled": true, + "index": 446, + "depth": 30, + "hittable": false, + "label": "Start dictation", + "parentIndex": 417, + "rect": { + "width": 28, + "x": 315, + "y": 485, + "height": 28 + }, + "type": "Button", + "ref": "e447" + }, + { + "index": 447, + "label": "Enable Voice mode", + "type": "Button", + "rect": { + "width": 28, + "x": 351, + "y": 485, + "height": 28 + }, + "hittable": false, + "depth": 30, + "parentIndex": 417, + "enabled": true, + "ref": "e448" + }, + { + "parentIndex": 12, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "depth": 11, + "index": 448, + "type": "Other", + "ref": "e449" + }, + { + "index": 449, + "parentIndex": 6, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 7, + "enabled": true, + "ref": "e450" + }, + { + "hittable": false, + "depth": 8, + "type": "Other", + "enabled": true, + "parentIndex": 449, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 450, + "ref": "e451" + }, + { + "depth": 9, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 451, + "hittable": false, + "parentIndex": 450, + "ref": "e452" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 1, + "index": 452, + "hittable": false, + "enabled": true, + "parentIndex": 0, + "type": "Window", + "ref": "e453" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "index": 453, + "parentIndex": 452, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 2, + "ref": "e454" + }, + { + "depth": 3, + "index": 454, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "parentIndex": 453, + "ref": "e455" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "depth": 3, + "parentIndex": 453, + "index": 455, + "ref": "e456" + }, + { + "index": 456, + "depth": 4, + "parentIndex": 455, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 278 + }, + "type": "Other", + "hittable": false, + "ref": "e457" + }, + { + "label": "Emoji", + "parentIndex": 0, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 457, + "enabled": true, + "depth": 1, + "type": "Window", + "hittable": true, + "ref": "e458" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "enabled": true, + "depth": 2, + "hittable": true, + "index": 458, + "parentIndex": 457, + "ref": "e459" + }, + { + "hittable": true, + "label": "Emoji", + "type": "Other", + "enabled": true, + "parentIndex": 458, + "index": 459, + "depth": 3, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "ref": "e460" + }, + { + "type": "Other", + "index": 460, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 4, + "hittable": false, + "parentIndex": 459, + "ref": "e461" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "hittable": false, + "parentIndex": 460, + "depth": 5, + "type": "Other", + "index": 461, + "ref": "e462" + }, + { + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 6, + "enabled": true, + "parentIndex": 461, + "hittable": false, + "index": 462, + "ref": "e463" + }, + { + "label": "Typing Predictions", + "type": "Other", + "enabled": true, + "identifier": "SystemInputAssistantView", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 4, + "hittable": true, + "index": 463, + "parentIndex": 459, + "ref": "e464" + }, + { + "enabled": true, + "hittable": true, + "parentIndex": 463, + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 464, + "depth": 5, + "type": "Other", + "ref": "e465" + }, + { + "enabled": true, + "hittable": true, + "identifier": "CenterPageView", + "type": "Other", + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "label": "Typing Predictions", + "index": 465, + "parentIndex": 464, + "ref": "e466" + }, + { + "parentIndex": 465, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": -62, + "height": 1245 + }, + "index": 466, + "depth": 7, + "hittable": false, + "ref": "e467" + }, + { + "index": 467, + "type": "ScrollView", + "enabled": true, + "parentIndex": 466, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 8, + "hittable": false, + "ref": "e468" + }, + { + "enabled": true, + "parentIndex": 465, + "type": "Other", + "label": "Typing Predictions", + "depth": 7, + "hittable": true, + "index": 468, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e469" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "parentIndex": 468, + "enabled": true, + "label": "Typing Predictions", + "index": 469, + "depth": 8, + "hittable": true, + "type": "Other", + "ref": "e470" + }, + { + "type": "Other", + "label": "I", + "parentIndex": 469, + "index": 470, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "hittable": true, + "enabled": true, + "depth": 9, + "ref": "e471" + }, + { + "index": 471, + "parentIndex": 470, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "hittable": true, + "label": "I", + "type": "Other", + "enabled": true, + "depth": 10, + "ref": "e472" + }, + { + "hittable": true, + "depth": 11, + "parentIndex": 471, + "index": 472, + "type": "Other", + "label": "I", + "enabled": true, + "rect": { + "width": 134, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e473" + }, + { + "label": "The", + "hittable": true, + "parentIndex": 471, + "rect": { + "width": 134, + "x": 134, + "y": 538, + "height": 45 + }, + "index": 473, + "enabled": true, + "depth": 11, + "type": "Other", + "ref": "e474" + }, + { + "index": 474, + "hittable": true, + "parentIndex": 471, + "depth": 11, + "rect": { + "width": 134, + "x": 268, + "y": 538, + "height": 45 + }, + "type": "Other", + "enabled": true, + "label": "I’m", + "ref": "e475" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "enabled": true, + "type": "Other", + "depth": 4, + "index": 475, + "hittable": false, + "parentIndex": 459, + "ref": "e476" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "parentIndex": 475, + "index": 476, + "enabled": true, + "depth": 5, + "ref": "e477" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "index": 477, + "enabled": true, + "depth": 6, + "parentIndex": 476, + "hittable": false, + "ref": "e478" + }, + { + "depth": 7, + "parentIndex": 477, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 478, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "ref": "e479" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "depth": 4, + "label": "Q", + "index": 479, + "parentIndex": 459, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e480" + }, + { + "label": "Q", + "type": "Keyboard", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 480, + "hittable": false, + "enabled": true, + "depth": 5, + "parentIndex": 479, + "ref": "e481" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "hittable": false, + "index": 481, + "enabled": true, + "type": "Other", + "parentIndex": 480, + "depth": 6, + "label": "Q", + "ref": "e482" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "type": "Other", + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "parentIndex": 481, + "index": 482, + "depth": 7, + "label": "Q", + "enabled": true, + "ref": "e483" + }, + { + "index": 483, + "type": "Key", + "hittable": false, + "rect": { + "width": 40.333333333333336, + "x": 0, + "y": 590, + "height": 46 + }, + "depth": 8, + "parentIndex": 482, + "label": "Q", + "enabled": true, + "ref": "e484" + }, + { + "type": "Key", + "index": 484, + "parentIndex": 482, + "label": "W", + "hittable": false, + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 590, + "height": 46 + }, + "depth": 8, + "enabled": true, + "ref": "e485" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 590, + "height": 46 + }, + "enabled": true, + "hittable": false, + "type": "Key", + "label": "E", + "depth": 8, + "parentIndex": 482, + "index": 485, + "ref": "e486" + }, + { + "index": 486, + "hittable": false, + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40, + "x": 120.66666666666669, + "y": 590, + "height": 46 + }, + "label": "R", + "type": "Key", + "enabled": true, + "ref": "e487" + }, + { + "label": "T", + "depth": 8, + "hittable": false, + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 590, + "height": 46 + }, + "enabled": true, + "index": 487, + "parentIndex": 482, + "type": "Key", + "ref": "e488" + }, + { + "hittable": false, + "depth": 8, + "parentIndex": 482, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 590, + "height": 46 + }, + "enabled": true, + "label": "Y", + "index": 488, + "ref": "e489" + }, + { + "index": 489, + "hittable": false, + "parentIndex": 482, + "type": "Key", + "label": "U", + "depth": 8, + "enabled": true, + "rect": { + "width": 40, + "x": 241.33333333333337, + "y": 590, + "height": 46 + }, + "ref": "e490" + }, + { + "type": "Key", + "depth": 8, + "parentIndex": 482, + "index": 490, + "enabled": true, + "label": "I", + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 590, + "height": 46 + }, + "hittable": false, + "ref": "e491" + }, + { + "index": 491, + "depth": 8, + "type": "Key", + "rect": { + "width": 40, + "x": 321.6666666666667, + "y": 590, + "height": 46 + }, + "hittable": false, + "enabled": true, + "label": "O", + "parentIndex": 482, + "ref": "e492" + }, + { + "label": "P", + "parentIndex": 482, + "index": 492, + "depth": 8, + "type": "Key", + "hittable": false, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 590, + "height": 46 + }, + "ref": "e493" + }, + { + "parentIndex": 482, + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 644, + "height": 46 + }, + "hittable": false, + "label": "A", + "index": 493, + "depth": 8, + "type": "Key", + "enabled": true, + "ref": "e494" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 644, + "height": 46 + }, + "depth": 8, + "label": "S", + "hittable": false, + "index": 494, + "enabled": true, + "parentIndex": 482, + "type": "Key", + "ref": "e495" + }, + { + "index": 495, + "enabled": true, + "depth": 8, + "label": "D", + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 644, + "height": 46 + }, + "hittable": false, + "parentIndex": 482, + "type": "Key", + "ref": "e496" + }, + { + "enabled": true, + "depth": 8, + "type": "Key", + "label": "F", + "index": 496, + "hittable": false, + "parentIndex": 482, + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 644, + "height": 46 + }, + "ref": "e497" + }, + { + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 644, + "height": 46 + }, + "index": 497, + "depth": 8, + "enabled": true, + "label": "G", + "hittable": false, + "parentIndex": 482, + "type": "Key", + "ref": "e498" + }, + { + "parentIndex": 482, + "enabled": true, + "label": "H", + "index": 498, + "depth": 8, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 644, + "height": 46 + }, + "hittable": false, + "ref": "e499" + }, + { + "type": "Key", + "depth": 8, + "rect": { + "width": 40, + "x": 261.536, + "y": 644, + "height": 46 + }, + "parentIndex": 482, + "label": "J", + "index": 499, + "enabled": true, + "hittable": false, + "ref": "e500" + }, + { + "index": 500, + "hittable": false, + "parentIndex": 482, + "depth": 8, + "label": "K", + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 644, + "height": 46 + }, + "ref": "e501" + }, + { + "parentIndex": 482, + "hittable": false, + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 644, + "height": 46 + }, + "index": 501, + "type": "Key", + "label": "L", + "depth": 8, + "ref": "e502" + }, + { + "enabled": true, + "identifier": "shift", + "hittable": false, + "type": "Button", + "parentIndex": 482, + "depth": 8, + "rect": { + "width": 51.333333333333336, + "x": 0, + "y": 698, + "height": 46 + }, + "index": 502, + "selected": true, + "label": "shift", + "ref": "e503" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 698, + "height": 46 + }, + "hittable": false, + "depth": 8, + "parentIndex": 482, + "type": "Key", + "label": "Z", + "index": 503, + "enabled": true, + "ref": "e504" + }, + { + "depth": 8, + "type": "Key", + "label": "X", + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 698, + "height": 46 + }, + "index": 504, + "hittable": false, + "enabled": true, + "parentIndex": 482, + "ref": "e505" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 698, + "height": 46 + }, + "index": 505, + "enabled": true, + "type": "Key", + "hittable": false, + "depth": 8, + "label": "C", + "parentIndex": 482, + "ref": "e506" + }, + { + "depth": 8, + "parentIndex": 482, + "index": 506, + "label": "V", + "enabled": true, + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 698, + "height": 46 + }, + "type": "Key", + "hittable": false, + "ref": "e507" + }, + { + "hittable": false, + "parentIndex": 482, + "enabled": true, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 698, + "height": 46 + }, + "index": 507, + "type": "Key", + "label": "B", + "ref": "e508" + }, + { + "label": "N", + "hittable": false, + "enabled": true, + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40, + "x": 261.536, + "y": 698, + "height": 46 + }, + "type": "Key", + "index": 508, + "ref": "e509" + }, + { + "label": "M", + "hittable": false, + "enabled": true, + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 698, + "height": 46 + }, + "type": "Key", + "index": 509, + "ref": "e510" + }, + { + "label": "delete", + "parentIndex": 482, + "hittable": false, + "identifier": "delete", + "type": "Key", + "enabled": true, + "depth": 8, + "index": 510, + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 698, + "height": 46 + }, + "ref": "e511" + }, + { + "identifier": "more", + "label": "numbers", + "depth": 8, + "index": 511, + "hittable": false, + "enabled": true, + "type": "Key", + "rect": { + "width": 101, + "x": 0, + "y": 752, + "height": 46 + }, + "parentIndex": 482, + "ref": "e512" + }, + { + "hittable": false, + "label": "space", + "enabled": true, + "depth": 8, + "index": 512, + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 752, + "height": 46 + }, + "parentIndex": 482, + "type": "Key", + "identifier": "space", + "ref": "e513" + }, + { + "index": 513, + "depth": 8, + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 752, + "height": 46 + }, + "parentIndex": 482, + "label": "return", + "type": "Button", + "enabled": true, + "identifier": "Return", + "hittable": false, + "ref": "e514" + }, + { + "parentIndex": 459, + "index": 514, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "label": "Emoji", + "enabled": true, + "hittable": true, + "depth": 4, + "ref": "e515" + }, + { + "enabled": true, + "parentIndex": 514, + "depth": 5, + "type": "Button", + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 68.73516393505099 + }, + "index": 515, + "hittable": true, + "label": "Emoji", + "ref": "e516" + }, + { + "hittable": false, + "rect": { + "width": 0, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 0 + }, + "depth": 6, + "parentIndex": 515, + "index": 516, + "enabled": true, + "type": "StaticText", + "ref": "e517" + }, + { + "parentIndex": 514, + "type": "Button", + "hittable": false, + "label": "Dictate", + "index": 517, + "depth": 5, + "identifier": "dictation", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "enabled": true, + "ref": "e518" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 517, + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "type": "StaticText", + "index": 518, + "depth": 6, + "ref": "e519" + }, + { + "identifier": "dictation", + "type": "Button", + "enabled": true, + "hittable": true, + "index": 519, + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "depth": 5, + "parentIndex": 514, + "label": "Dictate", + "ref": "e520" + }, + { + "enabled": true, + "index": 520, + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "depth": 6, + "hittable": false, + "parentIndex": 519, + "type": "StaticText", + "ref": "e521" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 521, + "totalNodeCount": 521, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 118, + "p50Ms": 142, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 118 + } + } + }, + "refsGeneration": 776182 + } +} diff --git a/scroll-regression/ios/chat-gesture-open.png b/scroll-regression/ios/chat-gesture-open.png new file mode 100644 index 0000000000..f644cf6d6b Binary files /dev/null and b/scroll-regression/ios/chat-gesture-open.png differ diff --git a/scroll-regression/ios/chat-header-dismissed.json b/scroll-regression/ios/chat-header-dismissed.json new file mode 100644 index 0000000000..7b232468c1 --- /dev/null +++ b/scroll-regression/ios/chat-header-dismissed.json @@ -0,0 +1,6055 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "enabled": true, + "depth": 0, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": true, + "index": 0, + "label": "Paseo Debug", + "ref": "e1" + }, + { + "parentIndex": 0, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "enabled": true, + "hittable": false, + "type": "Window", + "depth": 1, + "index": 1, + "ref": "e2" + }, + { + "depth": 2, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 1, + "hittable": false, + "index": 2, + "ref": "e3" + }, + { + "type": "Other", + "depth": 3, + "enabled": true, + "parentIndex": 2, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "index": 3, + "hittable": false, + "ref": "e4" + }, + { + "hittable": false, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "type": "Other", + "depth": 4, + "parentIndex": 3, + "enabled": true, + "index": 4, + "ref": "e5" + }, + { + "index": 5, + "type": "Window", + "parentIndex": 0, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "depth": 1, + "enabled": true, + "hittable": false, + "ref": "e6" + }, + { + "hittable": false, + "parentIndex": 5, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "enabled": true, + "type": "Other", + "index": 6, + "depth": 2, + "ref": "e7" + }, + { + "hittable": false, + "index": 7, + "parentIndex": 6, + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "type": "Other", + "depth": 3, + "ref": "e8" + }, + { + "depth": 4, + "index": 8, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 7, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "ref": "e9" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 8, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "depth": 5, + "index": 9, + "ref": "e10" + }, + { + "type": "Other", + "depth": 6, + "index": 10, + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 9, + "hittable": false, + "ref": "e11" + }, + { + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "hittable": false, + "type": "Other", + "index": 11, + "parentIndex": 10, + "enabled": true, + "depth": 7, + "ref": "e12" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "type": "Other", + "index": 12, + "parentIndex": 11, + "enabled": true, + "depth": 8, + "ref": "e13" + }, + { + "type": "Other", + "index": 13, + "depth": 9, + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "parentIndex": 12, + "ref": "e14" + }, + { + "type": "Other", + "hittable": false, + "index": 14, + "depth": 9, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "enabled": true, + "ref": "e15" + }, + { + "type": "Other", + "hittable": false, + "index": 15, + "depth": 10, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 14, + "enabled": true, + "ref": "e16" + }, + { + "type": "Other", + "hittable": false, + "index": 16, + "depth": 10, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 14, + "enabled": true, + "ref": "e17" + }, + { + "type": "Other", + "hittable": false, + "index": 17, + "depth": 11, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 16, + "enabled": true, + "ref": "e18" + }, + { + "type": "Other", + "hittable": false, + "index": 18, + "depth": 11, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 16, + "enabled": true, + "ref": "e19" + }, + { + "type": "Other", + "hittable": false, + "index": 19, + "depth": 12, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 18, + "enabled": true, + "ref": "e20" + }, + { + "type": "Other", + "hittable": false, + "index": 20, + "depth": 13, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 19, + "enabled": true, + "ref": "e21" + }, + { + "type": "Other", + "hittable": false, + "index": 21, + "depth": 14, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 20, + "enabled": true, + "ref": "e22" + }, + { + "type": "Other", + "hittable": false, + "index": 22, + "depth": 15, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 21, + "enabled": true, + "ref": "e23" + }, + { + "type": "Other", + "hittable": false, + "index": 23, + "depth": 16, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 22, + "enabled": true, + "ref": "e24" + }, + { + "type": "Other", + "hittable": false, + "index": 24, + "depth": 17, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 23, + "enabled": true, + "ref": "e25" + }, + { + "type": "Other", + "hittable": false, + "index": 25, + "depth": 18, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 24, + "enabled": true, + "ref": "e26" + }, + { + "type": "Other", + "hittable": false, + "index": 26, + "depth": 19, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 25, + "enabled": true, + "ref": "e27" + }, + { + "parentIndex": 26, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "depth": 20, + "enabled": true, + "type": "Other", + "index": 27, + "ref": "e28" + }, + { + "type": "Other", + "hittable": false, + "index": 28, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "parentIndex": 27, + "label": "Switch tabs (1 open)", + "depth": 21, + "ref": "e29" + }, + { + "label": "Open menu", + "enabled": true, + "parentIndex": 28, + "index": 29, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "type": "Other", + "depth": 22, + "ref": "e30" + }, + { + "parentIndex": 29, + "index": 30, + "type": "Other", + "label": "Open menu", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 23, + "enabled": true, + "hittable": false, + "ref": "e31" + }, + { + "depth": 24, + "label": "Open menu", + "type": "Other", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 31, + "enabled": true, + "hittable": false, + "parentIndex": 30, + "ref": "e32" + }, + { + "enabled": true, + "identifier": "composer-dock-header", + "index": 32, + "depth": 25, + "parentIndex": 31, + "type": "Other", + "label": "Open menu", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 126, + "y": 0 + }, + "ref": "e33" + }, + { + "type": "Other", + "depth": 26, + "index": 33, + "rect": { + "width": 402, + "x": 0, + "height": 56, + "y": 70 + }, + "hittable": false, + "parentIndex": 32, + "enabled": true, + "ref": "e34" + }, + { + "label": "Open menu", + "parentIndex": 32, + "identifier": "menu-button", + "index": 34, + "enabled": true, + "type": "Button", + "hittable": false, + "depth": 26, + "rect": { + "width": 32, + "x": 8, + "height": 32, + "y": 81.6666669845581 + }, + "ref": "e35" + }, + { + "rect": { + "width": 314, + "x": 48, + "height": 34, + "y": 80.6666669845581 + }, + "index": 35, + "enabled": true, + "depth": 26, + "hittable": false, + "parentIndex": 32, + "type": "Other", + "label": "main", + "ref": "e36" + }, + { + "depth": 27, + "label": "main", + "parentIndex": 35, + "index": 36, + "enabled": true, + "rect": { + "width": 278, + "x": 48, + "height": 34, + "y": 80.6666669845581 + }, + "hittable": false, + "type": "Other", + "ref": "e37" + }, + { + "enabled": true, + "parentIndex": 36, + "index": 37, + "hittable": false, + "type": "StaticText", + "label": "main", + "depth": 28, + "rect": { + "width": 278, + "x": 48, + "height": 18, + "y": 80.6666669845581 + }, + "identifier": "workspace-header-title", + "ref": "e38" + }, + { + "depth": 29, + "type": "StaticText", + "hittable": false, + "index": 38, + "enabled": true, + "rect": { + "width": 278, + "x": 48, + "height": 18, + "y": 80.6666669845581 + }, + "parentIndex": 37, + "label": "main", + "ref": "e39" + }, + { + "label": "composer-dock-ios-fixture", + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "depth": 28, + "hittable": false, + "enabled": true, + "index": 39, + "parentIndex": 36, + "identifier": "workspace-header-subtitle", + "type": "StaticText", + "ref": "e40" + }, + { + "parentIndex": 39, + "index": 40, + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "enabled": true, + "label": "composer-dock-ios-fixture", + "type": "StaticText", + "hittable": false, + "depth": 29, + "ref": "e41" + }, + { + "parentIndex": 36, + "enabled": true, + "hittable": false, + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "index": 41, + "label": "·", + "depth": 28, + "type": "StaticText", + "ref": "e42" + }, + { + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "enabled": true, + "type": "StaticText", + "index": 42, + "hittable": false, + "depth": 29, + "label": "·", + "parentIndex": 41, + "ref": "e43" + }, + { + "rect": { + "width": 68.00001525878906, + "x": 227.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "depth": 28, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "enabled": true, + "hittable": false, + "parentIndex": 36, + "type": "Other", + "index": 43, + "ref": "e44" + }, + { + "index": 44, + "enabled": true, + "depth": 28, + "type": "Other", + "hittable": false, + "rect": { + "width": 12, + "x": 227.3333282470703, + "height": 12, + "y": 100.6666669845581 + }, + "parentIndex": 36, + "ref": "e45" + }, + { + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 11, + "y": 101.1666669845581 + }, + "parentIndex": 44, + "hittable": false, + "index": 45, + "depth": 29, + "type": "Other", + "enabled": true, + "ref": "e46" + }, + { + "depth": 30, + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 101.1666669845581 + }, + "type": "Other", + "parentIndex": 45, + "enabled": true, + "index": 46, + "hittable": false, + "ref": "e47" + }, + { + "depth": 30, + "index": 47, + "hittable": false, + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 107.1666669845581 + }, + "parentIndex": 45, + "enabled": true, + "type": "Other", + "ref": "e48" + }, + { + "type": "Other", + "parentIndex": 45, + "hittable": false, + "index": 48, + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 103.1666669845581 + }, + "depth": 30, + "enabled": true, + "ref": "e49" + }, + { + "hittable": false, + "parentIndex": 45, + "depth": 30, + "type": "Other", + "index": 49, + "enabled": true, + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 109.1666669845581 + }, + "ref": "e50" + }, + { + "depth": 28, + "parentIndex": 36, + "index": 50, + "type": "StaticText", + "hittable": false, + "label": "dev-new", + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "enabled": true, + "ref": "e51" + }, + { + "label": "dev-new", + "enabled": true, + "hittable": false, + "parentIndex": 50, + "type": "StaticText", + "depth": 29, + "index": 51, + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "ref": "e52" + }, + { + "index": 52, + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "rect": { + "width": 32, + "x": 330, + "height": 32, + "y": 81.6666669845581 + }, + "enabled": true, + "label": "Workspace actions", + "type": "Button", + "hittable": false, + "parentIndex": 35, + "ref": "e53" + }, + { + "type": "Button", + "rect": { + "width": 32, + "x": 362, + "height": 32, + "y": 81.6666669845581 + }, + "hittable": false, + "parentIndex": 32, + "identifier": "workspace-explorer-toggle", + "index": 53, + "enabled": true, + "label": "Open Explorer sidebar", + "depth": 26, + "ref": "e54" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 54, + "parentIndex": 31, + "hittable": false, + "depth": 25, + "ref": "e55" + }, + { + "enabled": true, + "hittable": false, + "index": 55, + "type": "Other", + "parentIndex": 31, + "depth": 25, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "ref": "e56" + }, + { + "hittable": false, + "depth": 25, + "type": "Button", + "label": "Switch tabs (1 open)", + "index": 56, + "rect": { + "width": 402, + "x": 0, + "height": 34, + "y": 126 + }, + "enabled": true, + "parentIndex": 31, + "identifier": "workspace-tab-switcher-trigger", + "ref": "e57" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 56, + "hittable": false, + "index": 57, + "depth": 26, + "rect": { + "width": 14, + "x": 20, + "height": 14, + "y": 136 + }, + "identifier": "workspace-active-tab-icon", + "ref": "e58" + }, + { + "index": 58, + "type": "Other", + "depth": 25, + "hittable": false, + "identifier": "workspace-tabs-row", + "enabled": true, + "parentIndex": 31, + "rect": { + "width": 402, + "x": 0, + "height": 35, + "y": 126 + }, + "ref": "e59" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "index": 59, + "enabled": true, + "parentIndex": 31, + "type": "Other", + "depth": 25, + "ref": "e60" + }, + { + "index": 60, + "enabled": true, + "depth": 25, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "parentIndex": 31, + "type": "Other", + "hittable": false, + "ref": "e61" + }, + { + "depth": 26, + "label": "Add attachment", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "type": "Other", + "index": 61, + "parentIndex": 60, + "ref": "e62" + }, + { + "type": "Other", + "enabled": true, + "index": 62, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "depth": 27, + "parentIndex": 61, + "ref": "e63" + }, + { + "enabled": true, + "parentIndex": 61, + "hittable": false, + "type": "Other", + "depth": 27, + "index": 63, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "ref": "e64" + }, + { + "hittable": false, + "parentIndex": 61, + "depth": 27, + "index": 64, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "enabled": true, + "label": "Message agent...", + "identifier": "composer-viewport", + "type": "Other", + "ref": "e65" + }, + { + "parentIndex": 64, + "enabled": true, + "depth": 28, + "label": "Message agent...", + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "index": 65, + "ref": "e66" + }, + { + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "depth": 29, + "label": "Horizontal scroll bar, 1 page", + "index": 66, + "parentIndex": 65, + "identifier": "composer-dock-content", + "hittable": false, + "enabled": true, + "ref": "e67" + }, + { + "parentIndex": 66, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "depth": 30, + "enabled": true, + "hittable": false, + "index": 67, + "ref": "e68" + }, + { + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "index": 68, + "depth": 30, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "parentIndex": 66, + "ref": "e69" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 68, + "index": 69, + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "depth": 31, + "ref": "e70" + }, + { + "identifier": "agent-chat-scroll", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "parentIndex": 68, + "type": "Other", + "hittable": false, + "index": 70, + "label": "Horizontal scroll bar, 1 page", + "depth": 31, + "ref": "e71" + }, + { + "type": "ScrollView", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": 161 + }, + "label": "Search, scrollToEnd", + "depth": 32, + "hittable": false, + "index": 71, + "enabled": true, + "parentIndex": 70, + "ref": "e72" + }, + { + "label": "Search, scrollToEnd", + "parentIndex": 71, + "enabled": true, + "depth": 33, + "hittable": false, + "index": 72, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 3379, + "y": -2911 + }, + "ref": "e73" + }, + { + "hittable": false, + "type": "Other", + "label": "Search, scrollToEnd", + "rect": { + "width": 402, + "x": 0, + "height": 3379, + "y": -2911 + }, + "parentIndex": 72, + "depth": 34, + "enabled": true, + "index": 73, + "ref": "e74" + }, + { + "rect": { + "width": 378, + "x": 12, + "height": 32, + "y": -2911 + }, + "enabled": true, + "parentIndex": 73, + "index": 74, + "hittable": false, + "depth": 35, + "type": "Other", + "ref": "e75" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "height": 32, + "y": -2911 + }, + "identifier": "older-history-slot", + "index": 75, + "parentIndex": 74, + "enabled": true, + "depth": 36, + "ref": "e76" + }, + { + "enabled": true, + "rect": { + "width": 378, + "x": 12, + "height": 634, + "y": -2879 + }, + "type": "Other", + "hittable": false, + "depth": 35, + "index": 76, + "parentIndex": 73, + "ref": "e77" + }, + { + "type": "Other", + "label": "Search, scrollToEnd", + "rect": { + "width": 378, + "x": 12, + "height": 36, + "y": -2245 + }, + "depth": 35, + "hittable": false, + "index": 77, + "parentIndex": 73, + "enabled": true, + "ref": "e78" + }, + { + "index": 78, + "enabled": true, + "depth": 36, + "parentIndex": 77, + "identifier": "tool-call-badge", + "hittable": false, + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -2245 + }, + "type": "Other", + "ref": "e79" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "index": 79, + "depth": 36, + "parentIndex": 77, + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -2245 + }, + "type": "Button", + "enabled": true, + "ref": "e80" + }, + { + "depth": 35, + "rect": { + "width": 378, + "x": 12, + "height": 646, + "y": -2209 + }, + "hittable": false, + "index": 80, + "parentIndex": 73, + "type": "Other", + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e81" + }, + { + "hittable": false, + "identifier": "assistant-message", + "depth": 36, + "index": 81, + "parentIndex": 80, + "type": "Other", + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "height": 642, + "y": -2209 + }, + "ref": "e82" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "width": 362, + "x": 20, + "height": 132, + "y": -2197 + }, + "depth": 36, + "type": "Other", + "hittable": false, + "index": 82, + "parentIndex": 80, + "enabled": true, + "ref": "e83" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 83, + "parentIndex": 82, + "rect": { + "width": 362, + "x": 20, + "height": 132, + "y": -2197 + }, + "depth": 37, + "ref": "e84" + }, + { + "depth": 38, + "hittable": false, + "type": "Other", + "parentIndex": 83, + "index": 84, + "rect": { + "width": 362, + "x": 20, + "height": 132, + "y": -2197 + }, + "enabled": true, + "ref": "e85" + }, + { + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "parentIndex": 83, + "depth": 38, + "type": "TextView", + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "index": 85, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e86" + }, + { + "hittable": false, + "index": 86, + "parentIndex": 85, + "rect": { + "width": 362, + "x": 20, + "height": 132, + "y": -2197 + }, + "enabled": true, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 39, + "ref": "e87" + }, + { + "index": 87, + "rect": { + "width": 30, + "x": 349, + "height": 132, + "y": -2197 + }, + "value": "0%", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "parentIndex": 85, + "type": "Other", + "ref": "e88" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 87, + "depth": 40, + "index": 88, + "rect": { + "width": 3, + "x": 376, + "height": 36, + "y": -2236 + }, + "ref": "e89" + }, + { + "enabled": true, + "parentIndex": 85, + "rect": { + "width": 362, + "x": 20, + "height": 30, + "y": -2098 + }, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "depth": 39, + "index": 89, + "ref": "e90" + }, + { + "parentIndex": 89, + "hittable": false, + "index": 90, + "depth": 40, + "enabled": true, + "rect": { + "width": 36, + "x": -19, + "height": 3, + "y": -2071 + }, + "type": "Other", + "ref": "e91" + }, + { + "type": "StaticText", + "index": 91, + "label": "•", + "enabled": true, + "hittable": false, + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -2037 + }, + "parentIndex": 80, + "depth": 36, + "ref": "e92" + }, + { + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -2037 + }, + "depth": 37, + "hittable": false, + "label": "•", + "index": 92, + "type": "StaticText", + "parentIndex": 91, + "enabled": true, + "ref": "e93" + }, + { + "depth": 36, + "index": 93, + "type": "Other", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -2037 + }, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 80, + "ref": "e94" + }, + { + "depth": 37, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -2037 + }, + "type": "Other", + "index": 94, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "parentIndex": 93, + "ref": "e95" + }, + { + "parentIndex": 94, + "depth": 38, + "index": 95, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -2037 + }, + "hittable": false, + "type": "Other", + "ref": "e96" + }, + { + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "index": 96, + "type": "TextView", + "depth": 38, + "parentIndex": 94, + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "enabled": true, + "ref": "e97" + }, + { + "type": "TextView", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -2037 + }, + "index": 97, + "enabled": true, + "hittable": false, + "parentIndex": 96, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 39, + "ref": "e98" + }, + { + "index": 98, + "enabled": true, + "hittable": false, + "parentIndex": 96, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "rect": { + "width": 30, + "x": 349.00000063578284, + "height": 88, + "y": -2037 + }, + "ref": "e99" + }, + { + "rect": { + "width": 3, + "x": 376.00000063578284, + "height": 36, + "y": -2076 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 99, + "parentIndex": 98, + "depth": 40, + "ref": "e100" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30, + "y": -1982 + }, + "type": "Other", + "index": 100, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "depth": 39, + "hittable": false, + "parentIndex": 96, + "ref": "e101" + }, + { + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "index": 101, + "rect": { + "width": 36, + "x": 2.333333969116211, + "height": 3, + "y": -1955 + }, + "parentIndex": 100, + "ref": "e102" + }, + { + "depth": 36, + "label": "•", + "enabled": true, + "type": "StaticText", + "hittable": false, + "index": 102, + "parentIndex": 80, + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1945 + }, + "ref": "e103" + }, + { + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1945 + }, + "label": "•", + "parentIndex": 102, + "hittable": false, + "depth": 37, + "type": "StaticText", + "enabled": true, + "index": 103, + "ref": "e104" + }, + { + "type": "Other", + "depth": 36, + "index": 104, + "enabled": true, + "parentIndex": 80, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1945 + }, + "ref": "e105" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1945 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 105, + "depth": 37, + "parentIndex": 104, + "ref": "e106" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1945 + }, + "type": "Other", + "parentIndex": 105, + "index": 106, + "depth": 38, + "hittable": false, + "enabled": true, + "ref": "e107" + }, + { + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 107, + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 38, + "parentIndex": 105, + "hittable": false, + "enabled": true, + "ref": "e108" + }, + { + "type": "TextView", + "parentIndex": 107, + "enabled": true, + "hittable": false, + "depth": 39, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 108, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1945 + }, + "ref": "e109" + }, + { + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "value": "0%", + "type": "Other", + "index": 109, + "rect": { + "width": 30, + "x": 349.00000063578284, + "height": 88, + "y": -1945 + }, + "parentIndex": 107, + "hittable": false, + "depth": 39, + "ref": "e110" + }, + { + "rect": { + "width": 3, + "x": 376.00000063578284, + "height": 36, + "y": -1984 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "index": 110, + "hittable": false, + "parentIndex": 109, + "ref": "e111" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30, + "y": -1890 + }, + "hittable": false, + "depth": 39, + "type": "Other", + "index": 111, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "parentIndex": 107, + "ref": "e112" + }, + { + "type": "Other", + "index": 112, + "hittable": false, + "rect": { + "width": 36, + "x": 2.333333969116211, + "height": 3, + "y": -1863 + }, + "depth": 40, + "parentIndex": 111, + "enabled": true, + "ref": "e113" + }, + { + "index": 113, + "hittable": false, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1853 + }, + "parentIndex": 80, + "enabled": true, + "label": "•", + "depth": 36, + "ref": "e114" + }, + { + "index": 114, + "parentIndex": 113, + "enabled": true, + "depth": 37, + "hittable": false, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1853 + }, + "label": "•", + "ref": "e115" + }, + { + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1853 + }, + "index": 115, + "type": "Other", + "enabled": true, + "depth": 36, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 80, + "hittable": false, + "ref": "e116" + }, + { + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 116, + "depth": 37, + "enabled": true, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1853 + }, + "parentIndex": 115, + "ref": "e117" + }, + { + "enabled": true, + "type": "Other", + "index": 117, + "parentIndex": 116, + "hittable": false, + "depth": 38, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1853 + }, + "ref": "e118" + }, + { + "parentIndex": 116, + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 118, + "depth": 38, + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "enabled": true, + "ref": "e119" + }, + { + "hittable": false, + "depth": 39, + "type": "TextView", + "index": 119, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88, + "y": -1853 + }, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 118, + "ref": "e120" + }, + { + "parentIndex": 118, + "hittable": false, + "value": "0%", + "index": 120, + "rect": { + "width": 30, + "x": 349.00000063578284, + "height": 88, + "y": -1853 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "ref": "e121" + }, + { + "parentIndex": 120, + "index": 121, + "type": "Other", + "depth": 40, + "hittable": false, + "rect": { + "width": 3, + "x": 376.00000063578284, + "height": 36, + "y": -1892 + }, + "enabled": true, + "ref": "e122" + }, + { + "hittable": false, + "parentIndex": 118, + "index": 122, + "value": "0%", + "type": "Other", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30, + "y": -1798 + }, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "ref": "e123" + }, + { + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "width": 36, + "x": 2.333333969116211, + "height": 3, + "y": -1771 + }, + "index": 123, + "enabled": true, + "parentIndex": 122, + "ref": "e124" + }, + { + "type": "StaticText", + "depth": 36, + "enabled": true, + "index": 124, + "hittable": false, + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1761 + }, + "parentIndex": 80, + "label": "•", + "ref": "e125" + }, + { + "depth": 37, + "enabled": true, + "hittable": false, + "index": 125, + "parentIndex": 124, + "rect": { + "width": 7.333332061767578, + "x": 30, + "height": 22, + "y": -1761 + }, + "type": "StaticText", + "label": "•", + "ref": "e126" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 80, + "depth": 36, + "index": 126, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66, + "y": -1761 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "Other", + "ref": "e127" + }, + { + "index": 127, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66, + "y": -1761 + }, + "enabled": true, + "type": "Other", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 37, + "parentIndex": 126, + "hittable": false, + "ref": "e128" + }, + { + "index": 128, + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66, + "y": -1761 + }, + "parentIndex": 127, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 38, + "ref": "e129" + }, + { + "parentIndex": 127, + "depth": 38, + "type": "TextView", + "hittable": false, + "enabled": true, + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 129, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e130" + }, + { + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "type": "TextView", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66, + "y": -1761 + }, + "parentIndex": 129, + "index": 130, + "depth": 39, + "ref": "e131" + }, + { + "type": "Other", + "parentIndex": 129, + "enabled": true, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 131, + "rect": { + "width": 30, + "x": 349.00000063578284, + "height": 66, + "y": -1761 + }, + "depth": 39, + "value": "0%", + "ref": "e132" + }, + { + "rect": { + "width": 3, + "x": 376.00000063578284, + "height": 36, + "y": -1800 + }, + "hittable": false, + "depth": 40, + "enabled": true, + "parentIndex": 131, + "index": 132, + "type": "Other", + "ref": "e133" + }, + { + "type": "Other", + "depth": 39, + "hittable": false, + "index": 133, + "enabled": true, + "parentIndex": 129, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30, + "y": -1728 + }, + "ref": "e134" + }, + { + "parentIndex": 133, + "index": 134, + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "width": 36, + "x": 2.333333969116211, + "height": 3, + "y": -1701 + }, + "enabled": true, + "ref": "e135" + }, + { + "index": 135, + "depth": 36, + "rect": { + "width": 362, + "x": 20, + "height": 88, + "y": -1679 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 80, + "ref": "e136" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 136, + "type": "Other", + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "height": 88, + "y": -1679 + }, + "hittable": false, + "depth": 37, + "parentIndex": 135, + "ref": "e137" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 136, + "enabled": true, + "depth": 38, + "rect": { + "width": 362, + "x": 20, + "height": 88, + "y": -1679 + }, + "index": 137, + "ref": "e138" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "parentIndex": 136, + "enabled": true, + "hittable": false, + "index": 138, + "rect": { + "width": 0, + "x": 0, + "height": 0, + "y": 0 + }, + "ref": "e139" + }, + { + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "height": 88, + "y": -1679 + }, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 39, + "index": 139, + "parentIndex": 138, + "type": "TextView", + "ref": "e140" + }, + { + "hittable": false, + "rect": { + "width": 30, + "x": 349, + "height": 88, + "y": -1679 + }, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "depth": 39, + "index": 140, + "parentIndex": 138, + "type": "Other", + "value": "0%", + "ref": "e141" + }, + { + "rect": { + "width": 3, + "x": 376, + "height": 36, + "y": -1718 + }, + "index": 141, + "type": "Other", + "parentIndex": 140, + "enabled": true, + "hittable": false, + "depth": 40, + "ref": "e142" + }, + { + "rect": { + "width": 362, + "x": 20, + "height": 30, + "y": -1624 + }, + "hittable": false, + "parentIndex": 138, + "value": "0%", + "index": 142, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "ref": "e143" + }, + { + "hittable": false, + "parentIndex": 142, + "depth": 40, + "rect": { + "width": 36, + "x": -19, + "height": 3, + "y": -1597 + }, + "type": "Other", + "enabled": true, + "index": 143, + "ref": "e144" + }, + { + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 35, + "hittable": false, + "index": 144, + "rect": { + "width": 378, + "x": 12, + "height": 32, + "y": -1563 + }, + "parentIndex": 73, + "type": "Other", + "ref": "e145" + }, + { + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -1563 + }, + "index": 145, + "identifier": "tool-call-badge", + "parentIndex": 144, + "depth": 36, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e146" + }, + { + "type": "Button", + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "index": 146, + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -1563 + }, + "depth": 36, + "parentIndex": 144, + "hittable": false, + "ref": "e147" + }, + { + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "parentIndex": 73, + "depth": 35, + "rect": { + "width": 378, + "x": 12, + "height": 36, + "y": -1531 + }, + "hittable": false, + "type": "Other", + "index": 147, + "ref": "e148" + }, + { + "hittable": false, + "depth": 36, + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -1531 + }, + "index": 148, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "parentIndex": 147, + "ref": "e149" + }, + { + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "enabled": true, + "index": 149, + "parentIndex": 147, + "type": "Button", + "depth": 36, + "rect": { + "width": 388, + "x": 7, + "height": 32, + "y": -1531 + }, + "ref": "e150" + }, + { + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "height": 570, + "y": -1495 + }, + "parentIndex": 73, + "hittable": false, + "enabled": true, + "depth": 35, + "index": 150, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e151" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "height": 566, + "y": -1495 + }, + "type": "Other", + "identifier": "assistant-message", + "depth": 36, + "parentIndex": 150, + "index": 151, + "ref": "e152" + }, + { + "type": "Other", + "index": 152, + "rect": { + "width": 362, + "x": 20, + "height": 242, + "y": -1483 + }, + "depth": 36, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "enabled": true, + "parentIndex": 150, + "ref": "e153" + }, + { + "type": "Other", + "index": 153, + "rect": { + "y": -1483, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 37, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "enabled": true, + "parentIndex": 152, + "ref": "e154" + }, + { + "type": "Other", + "depth": 38, + "enabled": true, + "parentIndex": 153, + "hittable": false, + "index": 154, + "rect": { + "y": -1483, + "width": 362, + "height": 242, + "x": 20 + }, + "ref": "e155" + }, + { + "hittable": false, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "index": 155, + "depth": 38, + "parentIndex": 153, + "enabled": true, + "ref": "e156" + }, + { + "index": 156, + "depth": 39, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "hittable": false, + "rect": { + "y": -1483, + "width": 362, + "height": 242, + "x": 20 + }, + "parentIndex": 155, + "type": "TextView", + "ref": "e157" + }, + { + "index": 157, + "depth": 39, + "value": "0%", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "rect": { + "y": -1483, + "width": 30, + "height": 242, + "x": 349 + }, + "parentIndex": 155, + "type": "Other", + "ref": "e158" + }, + { + "hittable": false, + "enabled": true, + "depth": 40, + "index": 158, + "type": "Other", + "rect": { + "y": -1522, + "width": 3, + "height": 36, + "x": 376 + }, + "parentIndex": 157, + "ref": "e159" + }, + { + "rect": { + "y": -1274, + "width": 362, + "height": 30, + "x": 20 + }, + "enabled": true, + "depth": 39, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "parentIndex": 155, + "index": 159, + "ref": "e160" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": -1247, + "width": 36, + "height": 3, + "x": -19 + }, + "index": 160, + "parentIndex": 159, + "depth": 40, + "hittable": false, + "ref": "e161" + }, + { + "rect": { + "y": -1217, + "width": 362, + "height": 264, + "x": 20 + }, + "enabled": true, + "index": 161, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 150, + "depth": 36, + "type": "Other", + "hittable": false, + "ref": "e162" + }, + { + "index": 162, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 37, + "enabled": true, + "parentIndex": 161, + "type": "Other", + "rect": { + "y": -1217, + "width": 362, + "height": 264, + "x": 20 + }, + "ref": "e163" + }, + { + "type": "Other", + "index": 163, + "depth": 38, + "hittable": false, + "parentIndex": 162, + "rect": { + "y": -1217, + "width": 362, + "height": 264, + "x": 20 + }, + "enabled": true, + "ref": "e164" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "enabled": true, + "depth": 38, + "type": "TextView", + "index": 164, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 162, + "ref": "e165" + }, + { + "type": "TextView", + "parentIndex": 164, + "enabled": true, + "depth": 39, + "rect": { + "y": -1217, + "width": 362, + "height": 264, + "x": 20 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "hittable": false, + "index": 165, + "ref": "e166" + }, + { + "type": "Other", + "value": "0%", + "depth": 39, + "hittable": false, + "rect": { + "y": -1217, + "width": 30, + "height": 264, + "x": 349 + }, + "parentIndex": 164, + "index": 166, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "ref": "e167" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": -1256, + "width": 3, + "height": 36, + "x": 376 + }, + "index": 167, + "parentIndex": 166, + "depth": 40, + "enabled": true, + "ref": "e168" + }, + { + "enabled": true, + "depth": 39, + "value": "0%", + "parentIndex": 164, + "type": "Other", + "hittable": false, + "rect": { + "y": -986, + "width": 362, + "height": 30, + "x": 20 + }, + "index": 168, + "label": "Horizontal scroll bar, 1 page", + "ref": "e169" + }, + { + "enabled": true, + "depth": 40, + "hittable": false, + "index": 169, + "type": "Other", + "parentIndex": 168, + "rect": { + "y": -959, + "width": 36, + "height": 3, + "x": -19 + }, + "ref": "e170" + }, + { + "label": "Thinking", + "parentIndex": 73, + "hittable": false, + "index": 170, + "depth": 35, + "rect": { + "y": -925, + "width": 378, + "height": 32, + "x": 12 + }, + "enabled": true, + "type": "Other", + "ref": "e171" + }, + { + "index": 171, + "depth": 36, + "enabled": true, + "type": "Other", + "rect": { + "y": -925, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 170, + "identifier": "tool-call-badge", + "hittable": false, + "ref": "e172" + }, + { + "rect": { + "y": -925, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "index": 172, + "label": "Thinking", + "hittable": false, + "type": "Button", + "parentIndex": 170, + "depth": 36, + "ref": "e173" + }, + { + "depth": 35, + "parentIndex": 73, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 173, + "hittable": false, + "rect": { + "y": -893, + "width": 378, + "height": 32, + "x": 12 + }, + "enabled": true, + "type": "Other", + "ref": "e174" + }, + { + "type": "Other", + "index": 174, + "depth": 36, + "rect": { + "y": -893, + "width": 388, + "height": 32, + "x": 7 + }, + "hittable": false, + "parentIndex": 173, + "enabled": true, + "identifier": "tool-call-badge", + "ref": "e175" + }, + { + "parentIndex": 173, + "type": "Button", + "rect": { + "y": -893, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 175, + "depth": 36, + "hittable": false, + "ref": "e176" + }, + { + "type": "Other", + "rect": { + "y": -861, + "width": 378, + "height": 36, + "x": 12 + }, + "hittable": false, + "enabled": true, + "depth": 35, + "index": 176, + "label": "Search, scrollToEnd", + "parentIndex": 73, + "ref": "e177" + }, + { + "parentIndex": 176, + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "index": 177, + "hittable": false, + "rect": { + "y": -861, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "ref": "e178" + }, + { + "parentIndex": 176, + "index": 178, + "enabled": true, + "label": "Search, scrollToEnd", + "depth": 36, + "type": "Button", + "hittable": false, + "rect": { + "y": -861, + "width": 388, + "height": 32, + "x": 7 + }, + "ref": "e179" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 35, + "index": 179, + "parentIndex": 73, + "rect": { + "y": -825, + "width": 378, + "height": 646, + "x": 12 + }, + "ref": "e180" + }, + { + "rect": { + "y": -825, + "width": 362, + "height": 642, + "x": 20 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "identifier": "assistant-message", + "parentIndex": 179, + "index": 180, + "depth": 36, + "ref": "e181" + }, + { + "type": "Other", + "depth": 36, + "index": 181, + "hittable": false, + "rect": { + "y": -813, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 179, + "ref": "e182" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "depth": 37, + "index": 182, + "rect": { + "y": -813, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "type": "Other", + "parentIndex": 181, + "ref": "e183" + }, + { + "type": "Other", + "parentIndex": 182, + "index": 183, + "rect": { + "y": -813, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "depth": 38, + "hittable": false, + "ref": "e184" + }, + { + "enabled": true, + "type": "TextView", + "index": 184, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 38, + "parentIndex": 182, + "hittable": false, + "ref": "e185" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -813, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "hittable": false, + "type": "TextView", + "parentIndex": 184, + "index": 185, + "depth": 39, + "ref": "e186" + }, + { + "parentIndex": 184, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -813, + "width": 30, + "height": 132, + "x": 349 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "value": "0%", + "index": 186, + "depth": 39, + "ref": "e187" + }, + { + "type": "Other", + "rect": { + "y": -852, + "width": 3, + "height": 36, + "x": 376 + }, + "parentIndex": 186, + "enabled": true, + "index": 187, + "depth": 40, + "hittable": false, + "ref": "e188" + }, + { + "index": 188, + "parentIndex": 184, + "depth": 39, + "type": "Other", + "rect": { + "y": -714, + "width": 362, + "height": 30, + "x": 20 + }, + "hittable": false, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "ref": "e189" + }, + { + "index": 189, + "depth": 40, + "rect": { + "y": -687, + "width": 36, + "height": 3, + "x": -19 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 188, + "ref": "e190" + }, + { + "parentIndex": 179, + "enabled": true, + "depth": 36, + "hittable": false, + "rect": { + "y": -653, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 190, + "type": "StaticText", + "label": "•", + "ref": "e191" + }, + { + "parentIndex": 190, + "enabled": true, + "depth": 37, + "hittable": false, + "rect": { + "y": -653, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 191, + "type": "StaticText", + "label": "•", + "ref": "e192" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 179, + "rect": { + "y": -653, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "Other", + "index": 192, + "enabled": true, + "depth": 36, + "ref": "e193" + }, + { + "rect": { + "y": -653, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 37, + "enabled": true, + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 193, + "parentIndex": 192, + "ref": "e194" + }, + { + "enabled": true, + "type": "Other", + "depth": 38, + "rect": { + "y": -653, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 193, + "hittable": false, + "index": 194, + "ref": "e195" + }, + { + "depth": 38, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 195, + "enabled": true, + "parentIndex": 193, + "hittable": false, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e196" + }, + { + "rect": { + "y": -653, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "TextView", + "enabled": true, + "index": 196, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 195, + "depth": 39, + "hittable": false, + "ref": "e197" + }, + { + "parentIndex": 195, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -653, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "enabled": true, + "type": "Other", + "value": "0%", + "hittable": false, + "index": 197, + "depth": 39, + "ref": "e198" + }, + { + "rect": { + "y": -692, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "parentIndex": 197, + "depth": 40, + "hittable": false, + "index": 198, + "type": "Other", + "enabled": true, + "ref": "e199" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": -598, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "label": "Horizontal scroll bar, 1 page", + "index": 199, + "depth": 39, + "parentIndex": 195, + "value": "0%", + "hittable": false, + "ref": "e200" + }, + { + "depth": 40, + "index": 200, + "enabled": true, + "hittable": false, + "rect": { + "y": -571, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 199, + "type": "Other", + "ref": "e201" + }, + { + "type": "StaticText", + "index": 201, + "enabled": true, + "parentIndex": 179, + "depth": 36, + "label": "•", + "rect": { + "y": -561, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "hittable": false, + "ref": "e202" + }, + { + "index": 202, + "hittable": false, + "rect": { + "y": -561, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "enabled": true, + "label": "•", + "type": "StaticText", + "depth": 37, + "parentIndex": 201, + "ref": "e203" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 36, + "enabled": true, + "hittable": false, + "index": 203, + "parentIndex": 179, + "type": "Other", + "rect": { + "y": -561, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e204" + }, + { + "hittable": false, + "rect": { + "y": -561, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "index": 204, + "parentIndex": 203, + "depth": 37, + "enabled": true, + "ref": "e205" + }, + { + "depth": 38, + "rect": { + "y": -561, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "Other", + "index": 205, + "enabled": true, + "parentIndex": 204, + "hittable": false, + "ref": "e206" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "depth": 38, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 206, + "parentIndex": 204, + "hittable": false, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "ref": "e207" + }, + { + "hittable": false, + "index": 207, + "parentIndex": 206, + "depth": 39, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "TextView", + "rect": { + "y": -561, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e208" + }, + { + "depth": 39, + "parentIndex": 206, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "index": 208, + "type": "Other", + "value": "0%", + "rect": { + "y": -561, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "ref": "e209" + }, + { + "enabled": true, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 208, + "rect": { + "y": -600, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "index": 209, + "ref": "e210" + }, + { + "depth": 39, + "rect": { + "y": -506, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "enabled": true, + "value": "0%", + "index": 210, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "parentIndex": 206, + "ref": "e211" + }, + { + "rect": { + "y": -479, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "index": 211, + "parentIndex": 210, + "hittable": false, + "depth": 40, + "enabled": true, + "type": "Other", + "ref": "e212" + }, + { + "parentIndex": 179, + "hittable": false, + "index": 212, + "enabled": true, + "depth": 36, + "type": "StaticText", + "rect": { + "y": -469, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "ref": "e213" + }, + { + "rect": { + "y": -469, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "hittable": false, + "depth": 37, + "type": "StaticText", + "enabled": true, + "label": "•", + "parentIndex": 212, + "index": 213, + "ref": "e214" + }, + { + "index": 214, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 36, + "hittable": false, + "rect": { + "y": -469, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "Other", + "parentIndex": 179, + "ref": "e215" + }, + { + "depth": 37, + "type": "Other", + "parentIndex": 214, + "hittable": false, + "index": 215, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -469, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e216" + }, + { + "type": "Other", + "rect": { + "y": -469, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "index": 216, + "enabled": true, + "depth": 38, + "parentIndex": 215, + "ref": "e217" + }, + { + "enabled": true, + "hittable": false, + "depth": 38, + "parentIndex": 215, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "type": "TextView", + "index": 217, + "ref": "e218" + }, + { + "index": 218, + "type": "TextView", + "hittable": false, + "enabled": true, + "depth": 39, + "parentIndex": 217, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -469, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e219" + }, + { + "value": "0%", + "parentIndex": 217, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "hittable": false, + "index": 219, + "rect": { + "y": -469, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "depth": 39, + "ref": "e220" + }, + { + "type": "Other", + "depth": 40, + "index": 220, + "enabled": true, + "parentIndex": 219, + "hittable": false, + "rect": { + "y": -508, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "ref": "e221" + }, + { + "value": "0%", + "depth": 39, + "parentIndex": 217, + "index": 221, + "rect": { + "y": -414, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "enabled": true, + "ref": "e222" + }, + { + "parentIndex": 221, + "hittable": false, + "depth": 40, + "type": "Other", + "index": 222, + "rect": { + "y": -387, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "enabled": true, + "ref": "e223" + }, + { + "depth": 36, + "rect": { + "y": -377, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 223, + "enabled": true, + "parentIndex": 179, + "label": "•", + "hittable": false, + "type": "StaticText", + "ref": "e224" + }, + { + "depth": 37, + "enabled": true, + "type": "StaticText", + "label": "•", + "parentIndex": 223, + "hittable": false, + "index": 224, + "rect": { + "y": -377, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "ref": "e225" + }, + { + "parentIndex": 179, + "index": 225, + "rect": { + "y": -377, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "depth": 36, + "enabled": true, + "type": "Other", + "ref": "e226" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 226, + "depth": 37, + "rect": { + "y": -377, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 225, + "ref": "e227" + }, + { + "hittable": false, + "depth": 38, + "index": 227, + "rect": { + "y": -377, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "parentIndex": 226, + "enabled": true, + "type": "Other", + "ref": "e228" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 226, + "enabled": true, + "depth": 38, + "index": 228, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "ref": "e229" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "rect": { + "y": -377, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "depth": 39, + "parentIndex": 228, + "enabled": true, + "type": "TextView", + "index": 229, + "ref": "e230" + }, + { + "rect": { + "y": -377, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 228, + "hittable": false, + "depth": 39, + "type": "Other", + "enabled": true, + "value": "0%", + "index": 230, + "ref": "e231" + }, + { + "index": 231, + "rect": { + "y": -416, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "hittable": false, + "enabled": true, + "parentIndex": 230, + "depth": 40, + "type": "Other", + "ref": "e232" + }, + { + "parentIndex": 228, + "type": "Other", + "index": 232, + "depth": 39, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "rect": { + "y": -344, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "ref": "e233" + }, + { + "rect": { + "y": -317, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "index": 233, + "hittable": false, + "depth": 40, + "enabled": true, + "type": "Other", + "parentIndex": 232, + "ref": "e234" + }, + { + "rect": { + "y": -295, + "width": 362, + "height": 88, + "x": 20 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 234, + "depth": 36, + "parentIndex": 179, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e235" + }, + { + "type": "Other", + "hittable": false, + "index": 235, + "rect": { + "y": -295, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 37, + "parentIndex": 234, + "ref": "e236" + }, + { + "rect": { + "y": -295, + "width": 362, + "height": 88, + "x": 20 + }, + "parentIndex": 235, + "depth": 38, + "type": "Other", + "index": 236, + "enabled": true, + "hittable": false, + "ref": "e237" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "hittable": false, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "enabled": true, + "type": "TextView", + "index": 237, + "parentIndex": 235, + "ref": "e238" + }, + { + "type": "TextView", + "hittable": false, + "index": 238, + "depth": 39, + "parentIndex": 237, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -295, + "width": 362, + "height": 88, + "x": 20 + }, + "ref": "e239" + }, + { + "hittable": false, + "depth": 39, + "rect": { + "y": -295, + "width": 30, + "height": 88, + "x": 349 + }, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "index": 239, + "enabled": true, + "parentIndex": 237, + "ref": "e240" + }, + { + "type": "Other", + "index": 240, + "hittable": false, + "depth": 40, + "rect": { + "y": -334, + "width": 3, + "height": 36, + "x": 376 + }, + "enabled": true, + "parentIndex": 239, + "ref": "e241" + }, + { + "rect": { + "y": -240, + "width": 362, + "height": 30, + "x": 20 + }, + "value": "0%", + "hittable": false, + "index": 241, + "depth": 39, + "parentIndex": 237, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "ref": "e242" + }, + { + "index": 242, + "parentIndex": 241, + "rect": { + "y": -213, + "width": 36, + "height": 3, + "x": -19 + }, + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "ref": "e243" + }, + { + "type": "Other", + "rect": { + "y": -179, + "width": 378, + "height": 32, + "x": 12 + }, + "hittable": false, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "index": 243, + "ref": "e244" + }, + { + "rect": { + "y": -179, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 244, + "depth": 36, + "enabled": true, + "parentIndex": 243, + "type": "Other", + "identifier": "tool-call-badge", + "hittable": false, + "ref": "e245" + }, + { + "hittable": false, + "parentIndex": 243, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 36, + "index": 245, + "rect": { + "y": -179, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "type": "Button", + "ref": "e246" + }, + { + "depth": 35, + "type": "Other", + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "index": 246, + "parentIndex": 73, + "enabled": true, + "rect": { + "y": -147, + "width": 378, + "height": 36, + "x": 12 + }, + "ref": "e247" + }, + { + "hittable": false, + "index": 247, + "type": "Other", + "depth": 36, + "parentIndex": 246, + "identifier": "tool-call-badge", + "enabled": true, + "rect": { + "y": -147, + "width": 388, + "height": 32, + "x": 7 + }, + "ref": "e248" + }, + { + "index": 248, + "parentIndex": 246, + "rect": { + "y": -147, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "type": "Button", + "depth": 36, + "hittable": false, + "ref": "e249" + }, + { + "rect": { + "y": -111, + "width": 378, + "height": 512, + "x": 12 + }, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "parentIndex": 73, + "index": 249, + "depth": 35, + "type": "Other", + "ref": "e250" + }, + { + "hittable": false, + "identifier": "assistant-message", + "depth": 36, + "type": "Other", + "enabled": true, + "index": 250, + "rect": { + "y": -111, + "width": 362, + "height": 512, + "x": 20 + }, + "parentIndex": 249, + "ref": "e251" + }, + { + "enabled": true, + "depth": 36, + "parentIndex": 249, + "hittable": false, + "type": "Other", + "index": 251, + "rect": { + "y": -99, + "width": 362, + "height": 242, + "x": 20 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e252" + }, + { + "index": 252, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -99, + "width": 362, + "height": 242, + "x": 20 + }, + "hittable": false, + "depth": 37, + "type": "Other", + "parentIndex": 251, + "ref": "e253" + }, + { + "rect": { + "y": -99, + "width": 362, + "height": 242, + "x": 20 + }, + "index": 253, + "hittable": false, + "depth": 38, + "enabled": true, + "type": "Other", + "parentIndex": 252, + "ref": "e254" + }, + { + "type": "TextView", + "index": 254, + "depth": 38, + "parentIndex": 252, + "rect": { + "y": 0, + "width": 362, + "height": 143, + "x": 20 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "ref": "e255" + }, + { + "hittable": false, + "index": 255, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "rect": { + "y": -99, + "width": 362, + "height": 242, + "x": 20 + }, + "type": "TextView", + "depth": 39, + "parentIndex": 254, + "ref": "e256" + }, + { + "parentIndex": 254, + "enabled": true, + "index": 256, + "type": "Other", + "value": "0%", + "depth": 39, + "rect": { + "y": -99, + "width": 30, + "height": 242, + "x": 349 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "ref": "e257" + }, + { + "index": 257, + "enabled": true, + "type": "Other", + "depth": 40, + "rect": { + "y": -138, + "width": 3, + "height": 36, + "x": 376 + }, + "hittable": false, + "parentIndex": 256, + "ref": "e258" + }, + { + "depth": 39, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 254, + "value": "0%", + "type": "Other", + "rect": { + "y": 110, + "width": 362, + "height": 30, + "x": 20 + }, + "index": 258, + "ref": "e259" + }, + { + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 259, + "rect": { + "y": 137, + "width": 36, + "height": 3, + "x": -19 + }, + "parentIndex": 258, + "ref": "e260" + }, + { + "parentIndex": 249, + "hittable": false, + "index": 260, + "rect": { + "y": 167, + "width": 362, + "height": 176, + "x": 20 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "depth": 36, + "type": "Other", + "ref": "e261" + }, + { + "hittable": false, + "parentIndex": 260, + "enabled": true, + "type": "Other", + "rect": { + "y": 167, + "width": 362, + "height": 176, + "x": 20 + }, + "index": 261, + "depth": 37, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "ref": "e262" + }, + { + "index": 262, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": 167, + "width": 362, + "height": 176, + "x": 20 + }, + "parentIndex": 261, + "depth": 38, + "ref": "e263" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "depth": 38, + "index": 263, + "enabled": true, + "parentIndex": 261, + "rect": { + "y": 167, + "width": 362, + "height": 176, + "x": 20 + }, + "hittable": false, + "ref": "e264" + }, + { + "depth": 39, + "index": 264, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 263, + "type": "TextView", + "rect": { + "y": 167, + "width": 362, + "height": 176, + "x": 20 + }, + "hittable": false, + "enabled": true, + "ref": "e265" + }, + { + "parentIndex": 263, + "index": 265, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "hittable": false, + "depth": 39, + "rect": { + "y": 167, + "width": 30, + "height": 176, + "x": 349 + }, + "enabled": true, + "ref": "e266" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 265, + "rect": { + "y": 128, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "index": 266, + "enabled": true, + "ref": "e267" + }, + { + "enabled": true, + "hittable": false, + "value": "0%", + "rect": { + "y": 310, + "width": 362, + "height": 30, + "x": 20 + }, + "parentIndex": 263, + "index": 267, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "depth": 39, + "ref": "e268" + }, + { + "type": "Other", + "rect": { + "y": 337, + "width": 36, + "height": 3, + "x": -19 + }, + "parentIndex": 267, + "hittable": false, + "depth": 40, + "enabled": true, + "index": 268, + "ref": "e269" + }, + { + "hittable": false, + "label": "(end of synthetic stream)", + "rect": { + "y": 367, + "width": 362, + "height": 22, + "x": 20 + }, + "depth": 36, + "parentIndex": 249, + "type": "Other", + "enabled": true, + "index": 269, + "ref": "e270" + }, + { + "enabled": true, + "depth": 37, + "index": 270, + "label": "(end of synthetic stream)", + "type": "Other", + "rect": { + "y": 367, + "width": 362, + "height": 22, + "x": 20 + }, + "hittable": false, + "parentIndex": 269, + "ref": "e271" + }, + { + "type": "Other", + "rect": { + "y": 367, + "width": 362, + "height": 22, + "x": 20 + }, + "parentIndex": 270, + "hittable": false, + "index": 271, + "depth": 38, + "enabled": true, + "ref": "e272" + }, + { + "parentIndex": 270, + "value": "(end of synthetic stream)", + "index": 272, + "depth": 38, + "rect": { + "y": 367, + "width": 362, + "height": 22, + "x": 20 + }, + "enabled": true, + "label": "(end of synthetic stream)", + "hittable": false, + "type": "TextView", + "ref": "e273" + }, + { + "parentIndex": 272, + "label": "(end of synthetic stream)", + "enabled": true, + "hittable": false, + "index": 273, + "depth": 39, + "type": "TextView", + "rect": { + "y": 367, + "width": 183.234375, + "height": 22, + "x": 20 + }, + "ref": "e274" + }, + { + "hittable": false, + "rect": { + "y": 367, + "width": 30, + "height": 22, + "x": 349 + }, + "index": 274, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "parentIndex": 272, + "depth": 39, + "ref": "e275" + }, + { + "depth": 40, + "enabled": true, + "hittable": false, + "index": 275, + "type": "Other", + "rect": { + "y": 328, + "width": 3, + "height": 36, + "x": 376 + }, + "parentIndex": 274, + "ref": "e276" + }, + { + "rect": { + "y": 375, + "width": 362, + "height": 11, + "x": 20 + }, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "parentIndex": 272, + "depth": 39, + "hittable": false, + "enabled": true, + "index": 276, + "value": "0%", + "ref": "e277" + }, + { + "hittable": false, + "index": 277, + "rect": { + "y": 383, + "width": 36, + "height": 3, + "x": -19 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "parentIndex": 276, + "ref": "e278" + }, + { + "type": "Other", + "rect": { + "y": 401, + "width": 378, + "height": 67, + "x": 12 + }, + "hittable": false, + "depth": 35, + "parentIndex": 73, + "enabled": true, + "label": "Copy turn", + "index": 278, + "ref": "e279" + }, + { + "label": "Copy turn", + "hittable": false, + "index": 279, + "rect": { + "y": 414, + "width": 22, + "height": 22, + "x": 16 + }, + "enabled": true, + "type": "Button", + "depth": 36, + "parentIndex": 278, + "ref": "e280" + }, + { + "hittable": false, + "parentIndex": 278, + "index": 280, + "type": "Other", + "enabled": true, + "rect": { + "y": 414, + "width": 22, + "height": 22, + "x": 46 + }, + "depth": 36, + "label": "Fork chat from here", + "ref": "e281" + }, + { + "type": "Button", + "enabled": true, + "index": 281, + "rect": { + "y": 414, + "width": 22, + "height": 22, + "x": 46 + }, + "depth": 37, + "hittable": false, + "identifier": "assistant-fork-menu-trigger", + "parentIndex": 280, + "label": "Fork chat from here", + "ref": "e282" + }, + { + "index": 282, + "depth": 36, + "enabled": true, + "rect": { + "y": 417.3333332538605, + "width": 85.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "hittable": false, + "label": "Worked for 9s, ended 8:44 PM", + "parentIndex": 278, + "type": "Button", + "ref": "e283" + }, + { + "hittable": false, + "index": 283, + "label": "Horizontal scroll bar, 1 page", + "depth": 33, + "type": "Other", + "rect": { + "y": 466, + "width": 402, + "height": 30, + "x": 0 + }, + "enabled": true, + "parentIndex": 71, + "value": "0%", + "ref": "e284" + }, + { + "hittable": false, + "parentIndex": 283, + "rect": { + "y": 466, + "width": 393, + "height": 3, + "x": 3 + }, + "enabled": true, + "index": 284, + "type": "Other", + "depth": 34, + "ref": "e285" + }, + { + "rect": { + "y": 463, + "width": 30, + "height": 5, + "x": 369 + }, + "enabled": true, + "value": "0%", + "hittable": false, + "type": "Other", + "depth": 33, + "parentIndex": 71, + "label": "Vertical scroll bar, 676 pages", + "index": 285, + "ref": "e286" + }, + { + "hittable": false, + "index": 286, + "rect": { + "y": 419.6666666666667, + "width": 3, + "height": 45.333333333333314, + "x": 396 + }, + "type": "Other", + "enabled": true, + "parentIndex": 285, + "depth": 34, + "ref": "e287" + }, + { + "depth": 33, + "value": "0%", + "label": "Vertical scroll bar, 676 pages", + "index": 287, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": 463, + "width": 30, + "height": 5, + "x": 369 + }, + "parentIndex": 71, + "ref": "e288" + }, + { + "type": "Other", + "parentIndex": 287, + "rect": { + "y": 419.6666666666667, + "width": 3, + "height": 45.333333333333314, + "x": 396 + }, + "enabled": true, + "depth": 34, + "hittable": false, + "index": 288, + "ref": "e289" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 289, + "value": "0%", + "rect": { + "y": 466, + "width": 402, + "height": 30, + "x": 0 + }, + "enabled": true, + "type": "Other", + "parentIndex": 71, + "depth": 33, + "ref": "e290" + }, + { + "enabled": true, + "index": 290, + "depth": 34, + "hittable": false, + "rect": { + "y": 466, + "width": 393, + "height": 3, + "x": 3 + }, + "parentIndex": 289, + "type": "Other", + "ref": "e291" + }, + { + "rect": { + "y": 468, + "width": 402, + "height": 406, + "x": 0 + }, + "label": "Message agent...", + "index": 291, + "enabled": true, + "hittable": false, + "depth": 29, + "type": "Other", + "identifier": "composer-viewport-content", + "parentIndex": 65, + "ref": "e292" + }, + { + "depth": 30, + "enabled": true, + "parentIndex": 291, + "hittable": false, + "rect": { + "y": 468, + "width": 370, + "height": 356, + "x": 16 + }, + "index": 292, + "type": "Other", + "identifier": "message-input-root", + "ref": "e293" + }, + { + "index": 293, + "hittable": false, + "parentIndex": 291, + "type": "Other", + "depth": 30, + "enabled": true, + "rect": { + "y": 468, + "width": 370, + "height": 356, + "x": 16 + }, + "ref": "e294" + }, + { + "label": "Message agent...", + "rect": { + "y": 477, + "width": 344, + "height": 298, + "x": 29 + }, + "index": 294, + "depth": 30, + "type": "Other", + "parentIndex": 291, + "hittable": false, + "enabled": true, + "ref": "e295" + }, + { + "depth": 31, + "parentIndex": 294, + "enabled": true, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "index": 295, + "label": "Message agent...", + "hittable": false, + "rect": { + "y": 477, + "width": 344, + "height": 298, + "x": 29 + }, + "type": "TextView", + "ref": "e296" + }, + { + "depth": 32, + "enabled": true, + "index": 296, + "value": "100%", + "type": "Other", + "rect": { + "y": 477, + "width": 30, + "height": 298, + "x": 340 + }, + "parentIndex": 295, + "label": "Vertical scroll bar, 2 pages", + "hittable": false, + "ref": "e297" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 296, + "depth": 33, + "rect": { + "y": 547, + "width": 3, + "height": 225, + "x": 367 + }, + "type": "Other", + "index": 297, + "ref": "e298" + }, + { + "index": 298, + "hittable": false, + "depth": 32, + "value": "0%", + "parentIndex": 295, + "type": "Other", + "rect": { + "y": 742, + "width": 344, + "height": 30, + "x": 29 + }, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "ref": "e299" + }, + { + "hittable": false, + "rect": { + "y": 769, + "width": 335, + "height": 3, + "x": 32 + }, + "index": 299, + "enabled": true, + "parentIndex": 298, + "depth": 33, + "type": "Other", + "ref": "e300" + }, + { + "parentIndex": 291, + "identifier": "message-input-attach-button", + "depth": 30, + "label": "Add attachment", + "type": "Button", + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 23 + }, + "index": 300, + "hittable": false, + "enabled": true, + "ref": "e301" + }, + { + "type": "Other", + "index": 301, + "hittable": false, + "depth": 30, + "rect": { + "y": 787, + "width": 232, + "height": 28, + "x": 51 + }, + "enabled": true, + "label": "Select model (Ten second stream)", + "parentIndex": 291, + "ref": "e302" + }, + { + "identifier": "combined-model-selector", + "rect": { + "y": 787, + "width": 202, + "height": 28, + "x": 51 + }, + "index": 302, + "hittable": false, + "depth": 31, + "label": "Select model (Ten second stream)", + "parentIndex": 301, + "enabled": true, + "type": "Button", + "ref": "e303" + }, + { + "parentIndex": 291, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 283 + }, + "hittable": false, + "index": 303, + "enabled": true, + "label": "Context window 3% used", + "identifier": "context-window-meter", + "type": "Image", + "depth": 30, + "ref": "e304" + }, + { + "enabled": true, + "type": "Button", + "index": 304, + "label": "Start dictation", + "hittable": false, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 315 + }, + "depth": 30, + "parentIndex": 291, + "ref": "e305" + }, + { + "type": "Button", + "index": 305, + "enabled": true, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 351 + }, + "label": "Send message", + "hittable": false, + "depth": 30, + "parentIndex": 291, + "ref": "e306" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 16, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 11, + "index": 306, + "ref": "e307" + }, + { + "enabled": true, + "index": 307, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "parentIndex": 10, + "depth": 7, + "type": "Other", + "ref": "e308" + }, + { + "index": 308, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 307, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 8, + "ref": "e309" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "depth": 9, + "type": "Other", + "index": 309, + "parentIndex": 308, + "enabled": true, + "ref": "e310" + }, + { + "parentIndex": 0, + "index": 310, + "type": "Window", + "hittable": false, + "depth": 1, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "ref": "e311" + }, + { + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 2, + "hittable": false, + "parentIndex": 310, + "enabled": true, + "index": 311, + "ref": "e312" + }, + { + "hittable": false, + "depth": 3, + "parentIndex": 311, + "enabled": true, + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "index": 312, + "ref": "e313" + }, + { + "parentIndex": 311, + "rect": { + "y": 874, + "width": 402, + "height": 336, + "x": 0 + }, + "enabled": true, + "depth": 3, + "type": "Other", + "hittable": false, + "index": 313, + "ref": "e314" + }, + { + "depth": 4, + "enabled": true, + "parentIndex": 313, + "type": "Other", + "rect": { + "y": 874, + "width": 402, + "height": 278, + "x": 0 + }, + "hittable": false, + "index": 314, + "ref": "e315" + }, + { + "hittable": true, + "depth": 1, + "label": "Emoji", + "enabled": true, + "index": 315, + "parentIndex": 0, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Window", + "ref": "e316" + }, + { + "depth": 2, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "label": "Emoji", + "enabled": true, + "parentIndex": 315, + "index": 316, + "hittable": true, + "type": "Other", + "ref": "e317" + }, + { + "parentIndex": 316, + "rect": { + "y": 874, + "width": 402, + "height": 336, + "x": 0 + }, + "label": "Emoji", + "depth": 3, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 317, + "ref": "e318" + }, + { + "type": "Other", + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "hittable": false, + "index": 318, + "depth": 4, + "enabled": true, + "parentIndex": 317, + "ref": "e319" + }, + { + "parentIndex": 318, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "depth": 5, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 319, + "ref": "e320" + }, + { + "enabled": true, + "depth": 6, + "hittable": false, + "index": 320, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "parentIndex": 319, + "type": "Other", + "ref": "e321" + }, + { + "parentIndex": 317, + "enabled": true, + "index": 321, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "label": "Typing Predictions", + "hittable": false, + "depth": 4, + "identifier": "SystemInputAssistantView", + "type": "Other", + "ref": "e322" + }, + { + "hittable": false, + "label": "Typing Predictions", + "parentIndex": 321, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "index": 322, + "type": "Other", + "enabled": true, + "depth": 5, + "ref": "e323" + }, + { + "index": 323, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "label": "Typing Predictions", + "type": "Other", + "enabled": true, + "parentIndex": 322, + "hittable": false, + "identifier": "CenterPageView", + "depth": 6, + "ref": "e324" + }, + { + "parentIndex": 323, + "depth": 7, + "rect": { + "y": 274, + "width": 402, + "height": 1245, + "x": 0 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 324, + "ref": "e325" + }, + { + "parentIndex": 324, + "type": "ScrollView", + "depth": 8, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "hittable": false, + "index": 325, + "enabled": true, + "ref": "e326" + }, + { + "depth": 7, + "hittable": false, + "parentIndex": 323, + "type": "Other", + "enabled": true, + "label": "Typing Predictions", + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "index": 326, + "ref": "e327" + }, + { + "type": "Other", + "label": "Typing Predictions", + "parentIndex": 326, + "index": 327, + "depth": 8, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "hittable": false, + "enabled": true, + "ref": "e328" + }, + { + "enabled": true, + "depth": 9, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "hittable": false, + "parentIndex": 327, + "type": "Other", + "index": 328, + "ref": "e329" + }, + { + "parentIndex": 328, + "type": "Other", + "depth": 10, + "rect": { + "y": 874, + "width": 402, + "height": 45, + "x": 0 + }, + "index": 329, + "enabled": true, + "hittable": false, + "ref": "e330" + }, + { + "index": 330, + "enabled": true, + "parentIndex": 329, + "hittable": false, + "type": "Other", + "depth": 11, + "rect": { + "y": 874, + "width": 134, + "height": 45, + "x": 0 + }, + "ref": "e331" + }, + { + "type": "Other", + "index": 331, + "enabled": true, + "depth": 11, + "parentIndex": 329, + "rect": { + "y": 874, + "width": 134, + "height": 45, + "x": 134 + }, + "hittable": false, + "ref": "e332" + }, + { + "depth": 11, + "type": "Other", + "rect": { + "y": 874, + "width": 134, + "height": 45, + "x": 268 + }, + "enabled": true, + "hittable": false, + "parentIndex": 329, + "index": 332, + "ref": "e333" + }, + { + "index": 333, + "type": "Other", + "parentIndex": 317, + "hittable": false, + "rect": { + "y": 919, + "width": 402, + "height": 233, + "x": 0 + }, + "enabled": true, + "depth": 4, + "ref": "e334" + }, + { + "index": 334, + "type": "Other", + "enabled": true, + "parentIndex": 333, + "depth": 5, + "rect": { + "y": 919, + "width": 402, + "height": 291, + "x": 0 + }, + "hittable": false, + "ref": "e335" + }, + { + "depth": 6, + "index": 335, + "hittable": false, + "rect": { + "y": 919, + "width": 402, + "height": 291, + "x": 0 + }, + "parentIndex": 334, + "enabled": true, + "type": "Other", + "ref": "e336" + }, + { + "hittable": false, + "depth": 7, + "parentIndex": 335, + "rect": { + "y": 919, + "width": 402, + "height": 291, + "x": 0 + }, + "index": 336, + "enabled": true, + "type": "Other", + "ref": "e337" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 317, + "depth": 4, + "rect": { + "y": 919, + "width": 402, + "height": 233, + "x": 0 + }, + "index": 337, + "label": "q", + "hittable": false, + "ref": "e338" + }, + { + "enabled": true, + "index": 338, + "type": "Keyboard", + "label": "q", + "rect": { + "y": 919, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 5, + "parentIndex": 337, + "hittable": false, + "ref": "e339" + }, + { + "parentIndex": 338, + "depth": 6, + "index": 339, + "label": "q", + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 919, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e340" + }, + { + "enabled": true, + "hittable": false, + "label": "q", + "index": 340, + "parentIndex": 339, + "rect": { + "y": 919, + "width": 402, + "height": 233, + "x": 0 + }, + "depth": 7, + "type": "Other", + "identifier": "UIKeyboardLayoutStar Preview", + "ref": "e341" + }, + { + "depth": 8, + "label": "q", + "parentIndex": 340, + "rect": { + "y": 926, + "width": 40.333333333333336, + "height": 46, + "x": 0 + }, + "index": 341, + "type": "Key", + "hittable": false, + "enabled": true, + "ref": "e342" + }, + { + "rect": { + "y": 926, + "width": 40.00000000000001, + "height": 46, + "x": 40.333333333333336 + }, + "parentIndex": 340, + "hittable": false, + "label": "w", + "index": 342, + "type": "Key", + "enabled": true, + "depth": 8, + "ref": "e343" + }, + { + "depth": 8, + "hittable": false, + "index": 343, + "enabled": true, + "type": "Key", + "label": "e", + "parentIndex": 340, + "rect": { + "y": 926, + "width": 40.33333333333334, + "height": 46, + "x": 80.33333333333334 + }, + "ref": "e344" + }, + { + "enabled": true, + "hittable": false, + "index": 344, + "depth": 8, + "type": "Key", + "rect": { + "y": 926, + "width": 40, + "height": 46, + "x": 120.66666666666669 + }, + "parentIndex": 340, + "label": "r", + "ref": "e345" + }, + { + "depth": 8, + "type": "Key", + "hittable": false, + "index": 345, + "enabled": true, + "rect": { + "y": 926, + "width": 40.33333333333334, + "height": 46, + "x": 160.66666666666669 + }, + "parentIndex": 340, + "label": "t", + "ref": "e346" + }, + { + "depth": 8, + "parentIndex": 340, + "index": 346, + "rect": { + "y": 926, + "width": 40.33333333333334, + "height": 46, + "x": 201.00000000000003 + }, + "label": "y", + "enabled": true, + "type": "Key", + "hittable": false, + "ref": "e347" + }, + { + "parentIndex": 340, + "index": 347, + "label": "u", + "hittable": false, + "enabled": true, + "type": "Key", + "rect": { + "y": 926, + "width": 40, + "height": 46, + "x": 241.33333333333337 + }, + "depth": 8, + "ref": "e348" + }, + { + "hittable": false, + "rect": { + "y": 926, + "width": 40.333333333333314, + "height": 46, + "x": 281.33333333333337 + }, + "label": "i", + "index": 348, + "parentIndex": 340, + "type": "Key", + "enabled": true, + "depth": 8, + "ref": "e349" + }, + { + "depth": 8, + "rect": { + "y": 926, + "width": 40, + "height": 46, + "x": 321.6666666666667 + }, + "label": "o", + "hittable": false, + "parentIndex": 340, + "index": 349, + "enabled": true, + "type": "Key", + "ref": "e350" + }, + { + "depth": 8, + "label": "p", + "rect": { + "y": 926, + "width": 40.333333333333314, + "height": 46, + "x": 361.6666666666667 + }, + "enabled": true, + "parentIndex": 340, + "hittable": false, + "index": 350, + "type": "Key", + "ref": "e351" + }, + { + "depth": 8, + "index": 351, + "type": "Key", + "enabled": true, + "label": "a", + "parentIndex": 340, + "hittable": false, + "rect": { + "y": 980, + "width": 40.33333333333333, + "height": 46, + "x": 19.666666666666668 + }, + "ref": "e352" + }, + { + "rect": { + "y": 980, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "label": "s", + "parentIndex": 340, + "type": "Key", + "hittable": false, + "enabled": true, + "index": 352, + "depth": 8, + "ref": "e353" + }, + { + "type": "Key", + "depth": 8, + "rect": { + "y": 980, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "parentIndex": 340, + "label": "d", + "hittable": false, + "enabled": true, + "index": 353, + "ref": "e354" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 340, + "index": 354, + "label": "f", + "depth": 8, + "type": "Key", + "rect": { + "y": 980, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "ref": "e355" + }, + { + "rect": { + "y": 980, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "enabled": true, + "type": "Key", + "depth": 8, + "hittable": false, + "index": 355, + "label": "g", + "parentIndex": 340, + "ref": "e356" + }, + { + "parentIndex": 340, + "hittable": false, + "label": "h", + "enabled": true, + "rect": { + "y": 980, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "index": 356, + "depth": 8, + "type": "Key", + "ref": "e357" + }, + { + "enabled": true, + "label": "j", + "index": 357, + "parentIndex": 340, + "depth": 8, + "hittable": false, + "rect": { + "y": 980, + "width": 40, + "height": 46, + "x": 261.536 + }, + "type": "Key", + "ref": "e358" + }, + { + "rect": { + "y": 980, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "type": "Key", + "index": 358, + "depth": 8, + "enabled": true, + "hittable": false, + "label": "k", + "parentIndex": 340, + "ref": "e359" + }, + { + "hittable": false, + "depth": 8, + "parentIndex": 340, + "label": "l", + "type": "Key", + "index": 359, + "rect": { + "y": 980, + "width": 40.333333333333314, + "height": 46, + "x": 341.8693333333333 + }, + "enabled": true, + "ref": "e360" + }, + { + "depth": 8, + "hittable": false, + "index": 360, + "type": "Button", + "rect": { + "y": 1034, + "width": 51.333333333333336, + "height": 46, + "x": 0 + }, + "identifier": "shift", + "label": "shift", + "parentIndex": 340, + "enabled": true, + "ref": "e361" + }, + { + "index": 361, + "hittable": false, + "depth": 8, + "rect": { + "y": 1034, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "enabled": true, + "label": "z", + "parentIndex": 340, + "type": "Key", + "ref": "e362" + }, + { + "label": "x", + "type": "Key", + "index": 362, + "hittable": false, + "enabled": true, + "parentIndex": 340, + "rect": { + "y": 1034, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "depth": 8, + "ref": "e363" + }, + { + "type": "Key", + "label": "c", + "index": 363, + "enabled": true, + "parentIndex": 340, + "rect": { + "y": 1034, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "hittable": false, + "depth": 8, + "ref": "e364" + }, + { + "parentIndex": 340, + "enabled": true, + "hittable": false, + "type": "Key", + "index": 364, + "rect": { + "y": 1034, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "label": "v", + "depth": 8, + "ref": "e365" + }, + { + "parentIndex": 340, + "index": 365, + "enabled": true, + "type": "Key", + "label": "b", + "hittable": false, + "rect": { + "y": 1034, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "depth": 8, + "ref": "e366" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 340, + "type": "Key", + "index": 366, + "rect": { + "y": 1034, + "width": 40, + "height": 46, + "x": 261.536 + }, + "label": "n", + "depth": 8, + "ref": "e367" + }, + { + "rect": { + "y": 1034, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "hittable": false, + "label": "m", + "depth": 8, + "parentIndex": 340, + "index": 367, + "type": "Key", + "enabled": true, + "ref": "e368" + }, + { + "label": "delete", + "identifier": "delete", + "enabled": true, + "hittable": false, + "depth": 8, + "type": "Key", + "index": 368, + "rect": { + "y": 1034, + "width": 51.333333333333314, + "height": 46, + "x": 350.42133333333334 + }, + "parentIndex": 340, + "ref": "e369" + }, + { + "enabled": true, + "parentIndex": 340, + "label": "numbers", + "hittable": false, + "depth": 8, + "index": 369, + "type": "Key", + "rect": { + "y": 1088, + "width": 101, + "height": 46, + "x": 0 + }, + "identifier": "more", + "ref": "e370" + }, + { + "type": "Key", + "index": 370, + "rect": { + "y": 1088, + "width": 201.33333333333334, + "height": 46, + "x": 100.33333333333334 + }, + "label": "space", + "identifier": "space", + "depth": 8, + "parentIndex": 340, + "enabled": true, + "hittable": false, + "ref": "e371" + }, + { + "identifier": "Return", + "enabled": true, + "type": "Button", + "index": 371, + "hittable": false, + "depth": 8, + "parentIndex": 340, + "label": "return", + "rect": { + "y": 1088, + "width": 100.33333333333331, + "height": 46, + "x": 301.6666666666667 + }, + "ref": "e372" + }, + { + "hittable": false, + "index": 372, + "enabled": true, + "label": "Emoji", + "type": "Other", + "rect": { + "y": 919, + "width": 402, + "height": 291, + "x": 0 + }, + "parentIndex": 317, + "depth": 4, + "ref": "e373" + }, + { + "label": "Emoji", + "rect": { + "y": 1141.6989567998571, + "width": 68.0852958475086, + "height": 68.73516393505088, + "x": 8.47726568115926 + }, + "hittable": false, + "index": 373, + "parentIndex": 372, + "enabled": true, + "type": "Button", + "depth": 5, + "ref": "e374" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 373, + "type": "StaticText", + "index": 374, + "depth": 6, + "rect": { + "y": 1141.6989567998571, + "width": 0, + "height": 0, + "x": 8.47726568115926 + }, + "ref": "e375" + }, + { + "label": "Dictate", + "hittable": false, + "type": "Button", + "index": 375, + "enabled": true, + "identifier": "dictation", + "depth": 5, + "parentIndex": 372, + "rect": { + "y": 1141.3656234665239, + "width": 68.08529584750863, + "height": 68.7351639350511, + "x": 325.43743847133214 + }, + "ref": "e376" + }, + { + "rect": { + "y": 1141.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "index": 376, + "parentIndex": 375, + "type": "StaticText", + "depth": 6, + "hittable": false, + "enabled": true, + "ref": "e377" + }, + { + "index": 377, + "enabled": true, + "depth": 5, + "label": "Dictate", + "type": "Button", + "hittable": false, + "rect": { + "y": 1141.3656234665239, + "width": 68.08529584750863, + "height": 68.7351639350511, + "x": 325.43743847133214 + }, + "identifier": "dictation", + "parentIndex": 372, + "ref": "e378" + }, + { + "rect": { + "y": 1141.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "type": "StaticText", + "enabled": true, + "hittable": false, + "depth": 6, + "parentIndex": 377, + "index": 378, + "ref": "e379" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 379, + "totalNodeCount": 379, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 28, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 28 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 28 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776093 + } +} diff --git a/scroll-regression/ios/chat-header-dismissed.png b/scroll-regression/ios/chat-header-dismissed.png new file mode 100644 index 0000000000..08676b91ec Binary files /dev/null and b/scroll-regression/ios/chat-header-dismissed.png differ diff --git a/scroll-regression/ios/chat-native-after-idle.png b/scroll-regression/ios/chat-native-after-idle.png new file mode 100644 index 0000000000..6fac9042c7 Binary files /dev/null and b/scroll-regression/ios/chat-native-after-idle.png differ diff --git a/scroll-regression/ios/chat-native-after-submit.png b/scroll-regression/ios/chat-native-after-submit.png new file mode 100644 index 0000000000..cf9b7c500b Binary files /dev/null and b/scroll-regression/ios/chat-native-after-submit.png differ diff --git a/scroll-regression/ios/chat-native-bottom-idle.png b/scroll-regression/ios/chat-native-bottom-idle.png new file mode 100644 index 0000000000..281bd9ab0f Binary files /dev/null and b/scroll-regression/ios/chat-native-bottom-idle.png differ diff --git a/scroll-regression/ios/chat-native-finished.json b/scroll-regression/ios/chat-native-finished.json new file mode 100644 index 0000000000..861a6ec3cb --- /dev/null +++ b/scroll-regression/ios/chat-native-finished.json @@ -0,0 +1,6884 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "label": "Paseo Debug", + "enabled": true, + "index": 0, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 0, + "hittable": true, + "type": "Application", + "ref": "e1" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "parentIndex": 0, + "depth": 1, + "index": 1, + "type": "Window", + "ref": "e2" + }, + { + "type": "Other", + "index": 2, + "parentIndex": 1, + "depth": 2, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e3" + }, + { + "parentIndex": 2, + "hittable": false, + "index": 3, + "type": "Other", + "enabled": true, + "depth": 3, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e4" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "index": 4, + "parentIndex": 3, + "depth": 4, + "ref": "e5" + }, + { + "depth": 5, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 5, + "enabled": true, + "hittable": false, + "parentIndex": 4, + "type": "Other", + "ref": "e6" + }, + { + "depth": 6, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 5, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 6, + "ref": "e7" + }, + { + "parentIndex": 6, + "depth": 7, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 7, + "ref": "e8" + }, + { + "index": 8, + "parentIndex": 7, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 8, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e9" + }, + { + "type": "Other", + "depth": 9, + "index": 9, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 8, + "enabled": true, + "hittable": false, + "ref": "e10" + }, + { + "enabled": true, + "type": "Other", + "depth": 9, + "hittable": false, + "index": 10, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 8, + "ref": "e11" + }, + { + "enabled": true, + "depth": 10, + "index": 11, + "hittable": false, + "parentIndex": 10, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e12" + }, + { + "depth": 10, + "parentIndex": 10, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "index": 12, + "type": "Other", + "ref": "e13" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 11, + "enabled": true, + "type": "Other", + "index": 13, + "hittable": false, + "parentIndex": 12, + "ref": "e14" + }, + { + "depth": 11, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 12, + "enabled": true, + "hittable": false, + "index": 14, + "ref": "e15" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 14, + "enabled": true, + "index": 15, + "depth": 12, + "ref": "e16" + }, + { + "type": "Other", + "parentIndex": 15, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 13, + "hittable": false, + "index": 16, + "ref": "e17" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "index": 17, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 14, + "parentIndex": 16, + "ref": "e18" + }, + { + "hittable": false, + "index": 18, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 15, + "parentIndex": 17, + "type": "Other", + "ref": "e19" + }, + { + "hittable": false, + "depth": 16, + "type": "Other", + "parentIndex": 18, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 19, + "enabled": true, + "ref": "e20" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 17, + "hittable": false, + "type": "Other", + "parentIndex": 19, + "index": 20, + "ref": "e21" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 18, + "hittable": false, + "type": "Other", + "parentIndex": 20, + "index": 21, + "ref": "e22" + }, + { + "index": 22, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 21, + "enabled": true, + "type": "Other", + "depth": 19, + "ref": "e23" + }, + { + "index": 23, + "parentIndex": 22, + "hittable": false, + "enabled": true, + "depth": 20, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e24" + }, + { + "type": "Other", + "label": "Switch tabs (1 open)", + "depth": 21, + "index": 24, + "hittable": false, + "parentIndex": 23, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e25" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "label": "Open menu", + "index": 25, + "parentIndex": 24, + "hittable": false, + "enabled": true, + "depth": 22, + "type": "Other", + "ref": "e26" + }, + { + "label": "Open menu", + "index": 26, + "depth": 23, + "parentIndex": 25, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "ref": "e27" + }, + { + "type": "Other", + "parentIndex": 26, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "depth": 24, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "label": "Open menu", + "index": 27, + "ref": "e28" + }, + { + "type": "Other", + "identifier": "composer-dock-header", + "index": 28, + "depth": 25, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 126 + }, + "parentIndex": 27, + "label": "Open menu", + "hittable": false, + "ref": "e29" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 70, + "height": 56 + }, + "parentIndex": 28, + "depth": 26, + "hittable": false, + "type": "Other", + "index": 29, + "enabled": true, + "ref": "e30" + }, + { + "label": "Open menu", + "identifier": "menu-button", + "index": 30, + "enabled": true, + "type": "Button", + "hittable": false, + "depth": 26, + "parentIndex": 28, + "rect": { + "x": 8, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "ref": "e31" + }, + { + "enabled": true, + "hittable": false, + "depth": 26, + "parentIndex": 28, + "type": "Other", + "rect": { + "x": 48, + "width": 314, + "y": 80.6666669845581, + "height": 34 + }, + "label": "main", + "index": 31, + "ref": "e32" + }, + { + "type": "Other", + "parentIndex": 31, + "depth": 27, + "label": "main", + "index": 32, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 34 + }, + "hittable": false, + "enabled": true, + "ref": "e33" + }, + { + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "parentIndex": 32, + "enabled": true, + "label": "main", + "index": 33, + "identifier": "workspace-header-title", + "hittable": false, + "depth": 28, + "type": "StaticText", + "ref": "e34" + }, + { + "label": "main", + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "parentIndex": 33, + "depth": 29, + "index": 34, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e35" + }, + { + "index": 35, + "enabled": true, + "identifier": "workspace-header-subtitle", + "type": "StaticText", + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "hittable": false, + "depth": 28, + "parentIndex": 32, + "label": "composer-dock-ios-fixture", + "ref": "e36" + }, + { + "index": 36, + "parentIndex": 35, + "enabled": true, + "label": "composer-dock-ios-fixture", + "type": "StaticText", + "hittable": false, + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "depth": 29, + "ref": "e37" + }, + { + "hittable": false, + "index": 37, + "type": "StaticText", + "enabled": true, + "label": "·", + "parentIndex": 32, + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "depth": 28, + "ref": "e38" + }, + { + "index": 38, + "type": "StaticText", + "depth": 29, + "parentIndex": 37, + "enabled": true, + "hittable": false, + "label": "·", + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "ref": "e39" + }, + { + "label": "dev-new", + "type": "Other", + "enabled": true, + "index": 39, + "rect": { + "x": 227.3333282470703, + "width": 68.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "hittable": false, + "parentIndex": 32, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "depth": 28, + "ref": "e40" + }, + { + "hittable": false, + "index": 40, + "parentIndex": 32, + "type": "Other", + "enabled": true, + "depth": 28, + "rect": { + "x": 227.3333282470703, + "width": 12, + "y": 100.6666669845581, + "height": 12 + }, + "ref": "e41" + }, + { + "depth": 29, + "enabled": true, + "type": "Other", + "index": 41, + "hittable": false, + "parentIndex": 40, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 11 + }, + "ref": "e42" + }, + { + "enabled": true, + "index": 42, + "type": "Other", + "hittable": false, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 5 + }, + "depth": 30, + "parentIndex": 41, + "ref": "e43" + }, + { + "enabled": true, + "index": 43, + "type": "Other", + "hittable": false, + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 107.1666669845581, + "height": 5 + }, + "depth": 30, + "parentIndex": 41, + "ref": "e44" + }, + { + "index": 44, + "hittable": false, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 103.1666669845581, + "height": 1 + }, + "parentIndex": 41, + "enabled": true, + "depth": 30, + "type": "Other", + "ref": "e45" + }, + { + "hittable": false, + "type": "Other", + "index": 45, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 109.1666669845581, + "height": 1 + }, + "enabled": true, + "depth": 30, + "parentIndex": 41, + "ref": "e46" + }, + { + "label": "dev-new", + "enabled": true, + "type": "StaticText", + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "index": 46, + "hittable": false, + "depth": 28, + "parentIndex": 32, + "ref": "e47" + }, + { + "hittable": false, + "label": "dev-new", + "index": 47, + "type": "StaticText", + "enabled": true, + "parentIndex": 46, + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "depth": 29, + "ref": "e48" + }, + { + "parentIndex": 31, + "depth": 27, + "hittable": false, + "type": "Button", + "enabled": true, + "label": "Workspace actions", + "identifier": "workspace-header-menu-trigger", + "index": 48, + "rect": { + "x": 330, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "ref": "e49" + }, + { + "enabled": true, + "index": 49, + "parentIndex": 28, + "type": "Button", + "label": "Open Explorer sidebar", + "identifier": "workspace-explorer-toggle", + "hittable": false, + "depth": 26, + "rect": { + "x": 362, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "ref": "e50" + }, + { + "hittable": false, + "index": 50, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "enabled": true, + "depth": 25, + "parentIndex": 27, + "ref": "e51" + }, + { + "index": 51, + "hittable": false, + "parentIndex": 27, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 25, + "ref": "e52" + }, + { + "label": "Switch tabs (1 open)", + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 34 + }, + "hittable": false, + "identifier": "workspace-tab-switcher-trigger", + "enabled": true, + "depth": 25, + "parentIndex": 27, + "index": 52, + "type": "Button", + "ref": "e53" + }, + { + "rect": { + "x": 20, + "width": 14, + "y": 136, + "height": 14 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 26, + "index": 53, + "identifier": "workspace-active-tab-icon", + "parentIndex": 52, + "ref": "e54" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 35 + }, + "depth": 25, + "enabled": true, + "type": "Other", + "index": 54, + "identifier": "workspace-tabs-row", + "hittable": false, + "parentIndex": 27, + "ref": "e55" + }, + { + "hittable": false, + "depth": 25, + "index": 55, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "parentIndex": 27, + "type": "Other", + "enabled": true, + "ref": "e56" + }, + { + "depth": 25, + "parentIndex": 27, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "index": 56, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e57" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "enabled": true, + "index": 57, + "type": "Other", + "hittable": false, + "parentIndex": 56, + "depth": 26, + "label": "Add attachment", + "ref": "e58" + }, + { + "parentIndex": 57, + "index": 58, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 27, + "ref": "e59" + }, + { + "depth": 27, + "parentIndex": 57, + "type": "Other", + "index": 59, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "hittable": false, + "ref": "e60" + }, + { + "index": 60, + "depth": 27, + "enabled": true, + "type": "Other", + "hittable": false, + "identifier": "composer-viewport", + "parentIndex": 57, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "label": "Message agent... Message, @files, /commands", + "ref": "e61" + }, + { + "depth": 28, + "parentIndex": 60, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 61, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "label": "Scroll to bottom", + "ref": "e62" + }, + { + "hittable": false, + "depth": 29, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "enabled": true, + "identifier": "composer-dock-content", + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "index": 62, + "parentIndex": 61, + "ref": "e63" + }, + { + "parentIndex": 62, + "enabled": true, + "hittable": false, + "index": 63, + "type": "Other", + "depth": 30, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "ref": "e64" + }, + { + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "index": 64, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "depth": 30, + "parentIndex": 62, + "ref": "e65" + }, + { + "depth": 31, + "index": 65, + "parentIndex": 64, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e66" + }, + { + "hittable": false, + "index": 66, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "type": "Other", + "depth": 31, + "enabled": true, + "identifier": "agent-chat-scroll", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 64, + "ref": "e67" + }, + { + "label": "Thinking", + "depth": 32, + "index": 67, + "parentIndex": 66, + "type": "ScrollView", + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 575 + }, + "ref": "e68" + }, + { + "hittable": false, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "index": 68, + "rect": { + "x": 0, + "width": 402, + "y": -4428.33349609375, + "height": 6169.33349609375 + }, + "parentIndex": 67, + "depth": 33, + "type": "Other", + "enabled": true, + "ref": "e69" + }, + { + "type": "Other", + "depth": 34, + "index": 69, + "rect": { + "x": 0, + "width": 402, + "y": -4428.33349609375, + "height": 6169.33349609375 + }, + "hittable": false, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "parentIndex": 68, + "enabled": true, + "ref": "e70" + }, + { + "depth": 35, + "enabled": true, + "parentIndex": 69, + "index": 70, + "type": "Other", + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "y": -4428.33349609375, + "height": 32 + }, + "ref": "e71" + }, + { + "index": 71, + "hittable": false, + "type": "Other", + "parentIndex": 70, + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -4428.33349609375, + "height": 32 + }, + "depth": 36, + "identifier": "older-history-slot", + "ref": "e72" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 69, + "type": "Other", + "index": 72, + "rect": { + "x": 12, + "width": 378, + "y": -4396.33349609375, + "height": 747 + }, + "depth": 35, + "ref": "e73" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "hittable": false, + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "y": -3649.33349609375, + "height": 1725.33349609375 + }, + "parentIndex": 69, + "index": 73, + "depth": 35, + "enabled": true, + "ref": "e74" + }, + { + "identifier": "user-message", + "depth": 36, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 74, + "parentIndex": 73, + "rect": { + "x": 20, + "width": 362, + "y": -3649.33349609375, + "height": 1725.33349609375 + }, + "ref": "e75" + }, + { + "hittable": false, + "type": "Other", + "depth": 36, + "rect": { + "x": 20, + "width": 362, + "y": -3649.33349609375, + "height": 1725.33349609375 + }, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "index": 75, + "enabled": true, + "parentIndex": 73, + "ref": "e76" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -3649.33349609375, + "height": 1693.33349609375 + }, + "index": 76, + "hittable": false, + "type": "Other", + "depth": 37, + "enabled": true, + "parentIndex": 75, + "ref": "e77" + }, + { + "enabled": true, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "type": "StaticText", + "index": 77, + "depth": 37, + "hittable": false, + "rect": { + "x": 36, + "width": 330, + "y": -3633.33349609375, + "height": 1661.66650390625 + }, + "parentIndex": 75, + "ref": "e78" + }, + { + "type": "StaticText", + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "hittable": false, + "rect": { + "x": 36, + "width": 330, + "y": -3633.33349609375, + "height": 1661.66650390625 + }, + "parentIndex": 77, + "index": 78, + "depth": 38, + "enabled": true, + "ref": "e79" + }, + { + "depth": 37, + "rect": { + "x": 274.3333282470703, + "width": 107.66665649414062, + "y": -1948.0001220703125, + "height": 24 + }, + "index": 79, + "enabled": true, + "identifier": "user-message-trailing-row", + "parentIndex": 75, + "type": "Other", + "hittable": false, + "ref": "e80" + }, + { + "label": "8:53 PM", + "type": "StaticText", + "index": 80, + "rect": { + "x": 274.3333282470703, + "width": 49.666656494140625, + "y": -1944.0001220703125, + "height": 15.66650390625 + }, + "parentIndex": 75, + "identifier": "user-message-timestamp", + "hittable": false, + "enabled": true, + "depth": 37, + "ref": "e81" + }, + { + "rect": { + "x": 274.3333282470703, + "width": 49.666656494140625, + "y": -1944.0001220703125, + "height": 15.66650390625 + }, + "enabled": true, + "hittable": false, + "label": "8:53 PM", + "index": 81, + "depth": 38, + "type": "StaticText", + "parentIndex": 80, + "ref": "e82" + }, + { + "rect": { + "x": 331.99999618530273, + "width": 24, + "y": -1948.0001220703125, + "height": 24 + }, + "hittable": false, + "enabled": true, + "label": "Rewind to this message", + "index": 82, + "depth": 37, + "parentIndex": 75, + "type": "Other", + "ref": "e83" + }, + { + "type": "Button", + "hittable": false, + "identifier": "rewind-menu-trigger", + "index": 83, + "depth": 38, + "label": "Rewind to this message", + "enabled": true, + "parentIndex": 82, + "rect": { + "x": 331.99999618530273, + "width": 24, + "y": -1948.0001220703125, + "height": 24 + }, + "ref": "e84" + }, + { + "label": "Copy message", + "depth": 37, + "index": 84, + "hittable": false, + "parentIndex": 75, + "rect": { + "x": 363.99999237060547, + "width": 22, + "y": -1947.0001220703125, + "height": 22 + }, + "type": "Button", + "enabled": true, + "ref": "e85" + }, + { + "index": 85, + "rect": { + "x": 12, + "width": 378, + "y": -1924, + "height": 394 + }, + "depth": 35, + "enabled": true, + "parentIndex": 69, + "hittable": false, + "type": "Other", + "label": "Cycle 1", + "ref": "e86" + }, + { + "index": 86, + "depth": 36, + "type": "Other", + "enabled": true, + "parentIndex": 85, + "identifier": "assistant-message", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -1924, + "height": 390 + }, + "ref": "e87" + }, + { + "index": 87, + "rect": { + "x": 20, + "width": 84, + "y": -1888, + "height": 33 + }, + "parentIndex": 85, + "depth": 36, + "type": "Other", + "hittable": false, + "label": "Cycle 1", + "enabled": true, + "ref": "e88" + }, + { + "index": 88, + "hittable": false, + "rect": { + "x": 20, + "width": 84, + "y": -1888, + "height": 33 + }, + "enabled": true, + "parentIndex": 87, + "type": "Other", + "depth": 37, + "label": "Cycle 1", + "ref": "e89" + }, + { + "parentIndex": 88, + "enabled": true, + "depth": 38, + "hittable": false, + "index": 89, + "rect": { + "x": 20, + "width": 84, + "y": -1888, + "height": 33 + }, + "type": "Other", + "ref": "e90" + }, + { + "value": "Cycle 1", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 90, + "hittable": false, + "depth": 38, + "type": "TextView", + "parentIndex": 88, + "label": "Cycle 1", + "enabled": true, + "ref": "e91" + }, + { + "rect": { + "x": 20, + "width": 83.7953545153141, + "y": -1888, + "height": 33 + }, + "depth": 39, + "type": "TextView", + "parentIndex": 90, + "index": 91, + "enabled": true, + "label": "Cycle 1", + "hittable": false, + "ref": "e92" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "x": 71, + "width": 30, + "y": -1888, + "height": 33 + }, + "value": "0%", + "index": 92, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "parentIndex": 90, + "ref": "e93" + }, + { + "enabled": true, + "index": 93, + "parentIndex": 92, + "rect": { + "x": 98, + "width": 3, + "y": -1927, + "height": 36 + }, + "hittable": false, + "type": "Other", + "depth": 40, + "ref": "e94" + }, + { + "index": 94, + "type": "Other", + "depth": 39, + "enabled": true, + "value": "0%", + "parentIndex": 90, + "rect": { + "x": 20, + "width": 84, + "y": -1874.5, + "height": 16.5 + }, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e95" + }, + { + "depth": 40, + "type": "Other", + "parentIndex": 94, + "enabled": true, + "index": 95, + "hittable": false, + "rect": { + "x": -19, + "width": 36, + "y": -1861, + "height": 3 + }, + "ref": "e96" + }, + { + "parentIndex": 85, + "rect": { + "x": 20, + "width": 362, + "y": -1888, + "height": 42 + }, + "depth": 36, + "enabled": true, + "index": 96, + "hittable": false, + "type": "Other", + "ref": "e97" + }, + { + "hittable": false, + "index": 97, + "rect": { + "x": 20, + "width": 362, + "y": -1822, + "height": 264 + }, + "type": "Other", + "depth": 36, + "parentIndex": 85, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "ref": "e98" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "index": 98, + "rect": { + "x": 20, + "width": 362, + "y": -1822, + "height": 264 + }, + "type": "Other", + "depth": 37, + "enabled": true, + "parentIndex": 97, + "ref": "e99" + }, + { + "depth": 38, + "parentIndex": 98, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -1822, + "height": 264 + }, + "index": 99, + "ref": "e100" + }, + { + "index": 100, + "parentIndex": 98, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 38, + "type": "TextView", + "ref": "e101" + }, + { + "enabled": true, + "type": "TextView", + "index": 101, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": -1822, + "height": 264 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "parentIndex": 100, + "hittable": false, + "ref": "e102" + }, + { + "hittable": false, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 100, + "rect": { + "x": 349, + "width": 30, + "y": -1822, + "height": 264 + }, + "type": "Other", + "index": 102, + "value": "0%", + "ref": "e103" + }, + { + "enabled": true, + "index": 103, + "rect": { + "x": 376, + "width": 3, + "y": -1861, + "height": 36 + }, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 102, + "ref": "e104" + }, + { + "enabled": true, + "index": 104, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -1591, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 100, + "type": "Other", + "value": "0%", + "ref": "e105" + }, + { + "depth": 40, + "type": "Other", + "index": 105, + "hittable": false, + "rect": { + "x": -19, + "width": 36, + "y": -1564, + "height": 3 + }, + "enabled": true, + "parentIndex": 104, + "ref": "e106" + }, + { + "type": "Other", + "parentIndex": 69, + "enabled": true, + "label": "Thinking", + "hittable": false, + "depth": 35, + "index": 106, + "rect": { + "x": 12, + "width": 378, + "y": -1530, + "height": 32 + }, + "ref": "e107" + }, + { + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "hittable": false, + "index": 107, + "depth": 36, + "parentIndex": 106, + "rect": { + "x": 7, + "width": 388, + "y": -1530, + "height": 32 + }, + "ref": "e108" + }, + { + "enabled": true, + "type": "Button", + "rect": { + "x": 7, + "width": 388, + "y": -1530, + "height": 32 + }, + "depth": 36, + "index": 108, + "hittable": false, + "parentIndex": 106, + "label": "Thinking", + "ref": "e109" + }, + { + "enabled": true, + "rect": { + "x": 42, + "width": 344, + "y": -1523, + "height": 18 + }, + "label": "Thinking", + "type": "Other", + "hittable": false, + "index": 109, + "depth": 37, + "parentIndex": 108, + "ref": "e110" + }, + { + "depth": 38, + "hittable": false, + "parentIndex": 109, + "rect": { + "x": 42, + "width": 58.666664123535156, + "y": -1523, + "height": 18 + }, + "type": "StaticText", + "label": "Thinking", + "index": 110, + "enabled": true, + "ref": "e111" + }, + { + "index": 111, + "enabled": true, + "type": "StaticText", + "label": "Thinking", + "depth": 39, + "rect": { + "x": 42, + "width": 58.666664123535156, + "y": -1523, + "height": 18 + }, + "parentIndex": 110, + "hittable": false, + "ref": "e112" + }, + { + "parentIndex": 69, + "index": 112, + "type": "Other", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "x": 12, + "width": 378, + "y": -1498, + "height": 32 + }, + "enabled": true, + "hittable": false, + "depth": 35, + "ref": "e113" + }, + { + "parentIndex": 112, + "type": "Other", + "identifier": "tool-call-badge", + "enabled": true, + "index": 113, + "rect": { + "x": 7, + "width": 388, + "y": -1498, + "height": 32 + }, + "depth": 36, + "hittable": false, + "ref": "e114" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 112, + "rect": { + "x": 7, + "width": 388, + "y": -1498, + "height": 32 + }, + "index": 114, + "type": "Button", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 36, + "ref": "e115" + }, + { + "enabled": true, + "index": 115, + "label": "Read", + "rect": { + "x": 42, + "width": 344, + "y": -1491, + "height": 18 + }, + "hittable": false, + "type": "Other", + "parentIndex": 114, + "depth": 37, + "ref": "e116" + }, + { + "index": 116, + "parentIndex": 115, + "depth": 38, + "type": "StaticText", + "hittable": false, + "label": "Read", + "enabled": true, + "rect": { + "x": 42, + "width": 35, + "y": -1491, + "height": 18 + }, + "ref": "e117" + }, + { + "rect": { + "x": 42, + "width": 35, + "y": -1491, + "height": 18 + }, + "label": "Read", + "parentIndex": 116, + "hittable": false, + "index": 117, + "depth": 39, + "enabled": true, + "type": "StaticText", + "ref": "e118" + }, + { + "enabled": true, + "index": 118, + "depth": 38, + "label": "packages/app/src/components/conversation-list.tsx", + "hittable": false, + "parentIndex": 115, + "rect": { + "x": 85, + "width": 301, + "y": -1491, + "height": 18 + }, + "type": "StaticText", + "ref": "e119" + }, + { + "parentIndex": 118, + "enabled": true, + "hittable": false, + "rect": { + "x": 85, + "width": 301, + "y": -1491, + "height": 18 + }, + "index": 119, + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "depth": 39, + "ref": "e120" + }, + { + "label": "Search, scrollToEnd", + "type": "Other", + "rect": { + "x": 12, + "width": 378, + "y": -1466, + "height": 36 + }, + "index": 120, + "depth": 35, + "parentIndex": 69, + "hittable": false, + "enabled": true, + "ref": "e121" + }, + { + "hittable": false, + "depth": 36, + "index": 121, + "enabled": true, + "parentIndex": 120, + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "width": 388, + "y": -1466, + "height": 32 + }, + "ref": "e122" + }, + { + "type": "Button", + "hittable": false, + "enabled": true, + "depth": 36, + "parentIndex": 120, + "rect": { + "x": 7, + "width": 388, + "y": -1466, + "height": 32 + }, + "label": "Search, scrollToEnd", + "index": 122, + "ref": "e123" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "label": "Search", + "depth": 37, + "index": 123, + "parentIndex": 122, + "rect": { + "x": 42, + "width": 344, + "y": -1459, + "height": 18 + }, + "ref": "e124" + }, + { + "enabled": true, + "index": 124, + "rect": { + "x": 42, + "width": 48, + "y": -1459, + "height": 18 + }, + "depth": 38, + "parentIndex": 123, + "label": "Search", + "hittable": false, + "type": "StaticText", + "ref": "e125" + }, + { + "index": 125, + "type": "StaticText", + "depth": 39, + "rect": { + "x": 42, + "width": 48, + "y": -1459, + "height": 18 + }, + "enabled": true, + "parentIndex": 124, + "label": "Search", + "hittable": false, + "ref": "e126" + }, + { + "enabled": true, + "label": "scrollToEnd", + "index": 126, + "rect": { + "x": 98, + "width": 79.66667175292969, + "y": -1459, + "height": 18 + }, + "depth": 38, + "parentIndex": 123, + "type": "StaticText", + "hittable": false, + "ref": "e127" + }, + { + "rect": { + "x": 98, + "width": 79.66667175292969, + "y": -1459, + "height": 18 + }, + "enabled": true, + "label": "scrollToEnd", + "hittable": false, + "index": 127, + "type": "StaticText", + "depth": 39, + "parentIndex": 126, + "ref": "e128" + }, + { + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 35, + "enabled": true, + "rect": { + "x": 12, + "width": 378, + "y": -1430, + "height": 646 + }, + "parentIndex": 69, + "index": 128, + "hittable": false, + "ref": "e129" + }, + { + "type": "Other", + "index": 129, + "parentIndex": 128, + "rect": { + "x": 20, + "width": 362, + "y": -1430, + "height": 642 + }, + "depth": 36, + "identifier": "assistant-message", + "enabled": true, + "hittable": false, + "ref": "e130" + }, + { + "type": "Other", + "depth": 36, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -1418, + "height": 132 + }, + "parentIndex": 128, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 130, + "ref": "e131" + }, + { + "depth": 37, + "index": 131, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 20, + "width": 362, + "y": -1418, + "height": 132 + }, + "parentIndex": 130, + "enabled": true, + "hittable": false, + "ref": "e132" + }, + { + "hittable": false, + "type": "Other", + "index": 132, + "enabled": true, + "parentIndex": 131, + "rect": { + "x": 20, + "width": 362, + "y": -1418, + "height": 132 + }, + "depth": 38, + "ref": "e133" + }, + { + "enabled": true, + "index": 133, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "parentIndex": 131, + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 38, + "ref": "e134" + }, + { + "index": 134, + "depth": 39, + "type": "TextView", + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 133, + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -1418, + "height": 132 + }, + "ref": "e135" + }, + { + "rect": { + "x": 349, + "width": 30, + "y": -1418, + "height": 132 + }, + "type": "Other", + "value": "0%", + "index": 135, + "depth": 39, + "parentIndex": 133, + "enabled": true, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "ref": "e136" + }, + { + "depth": 40, + "index": 136, + "hittable": false, + "parentIndex": 135, + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "y": -1457, + "height": 36 + }, + "enabled": true, + "ref": "e137" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 20, + "width": 362, + "y": -1319, + "height": 30 + }, + "type": "Other", + "value": "0%", + "parentIndex": 133, + "depth": 39, + "index": 137, + "hittable": false, + "ref": "e138" + }, + { + "hittable": false, + "parentIndex": 137, + "type": "Other", + "rect": { + "x": -19, + "width": 36, + "y": -1292, + "height": 3 + }, + "index": 138, + "depth": 40, + "enabled": true, + "ref": "e139" + }, + { + "parentIndex": 128, + "index": 139, + "depth": 36, + "enabled": true, + "label": "•", + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1258, + "height": 22 + }, + "type": "StaticText", + "ref": "e140" + }, + { + "type": "StaticText", + "index": 140, + "depth": 37, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1258, + "height": 22 + }, + "enabled": true, + "label": "•", + "hittable": false, + "parentIndex": 139, + "ref": "e141" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 36, + "type": "Other", + "hittable": false, + "index": 141, + "parentIndex": 128, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1258, + "height": 88 + }, + "ref": "e142" + }, + { + "depth": 37, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1258, + "height": 88 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 141, + "type": "Other", + "enabled": true, + "index": 142, + "hittable": false, + "ref": "e143" + }, + { + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1258, + "height": 88 + }, + "parentIndex": 142, + "depth": 38, + "hittable": false, + "type": "Other", + "index": 143, + "ref": "e144" + }, + { + "type": "TextView", + "depth": 38, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 144, + "parentIndex": 142, + "hittable": false, + "ref": "e145" + }, + { + "index": 145, + "enabled": true, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1258, + "height": 88 + }, + "depth": 39, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 144, + "ref": "e146" + }, + { + "index": 146, + "hittable": false, + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1258, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 144, + "value": "0%", + "enabled": true, + "ref": "e147" + }, + { + "index": 147, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1297, + "height": 36 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 146, + "ref": "e148" + }, + { + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 144, + "index": 148, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1203, + "height": 30 + }, + "value": "0%", + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 39, + "ref": "e149" + }, + { + "depth": 40, + "parentIndex": 148, + "hittable": false, + "enabled": true, + "index": 149, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1176, + "height": 3 + }, + "type": "Other", + "ref": "e150" + }, + { + "index": 150, + "type": "StaticText", + "depth": 36, + "hittable": false, + "parentIndex": 128, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1166, + "height": 22 + }, + "enabled": true, + "label": "•", + "ref": "e151" + }, + { + "type": "StaticText", + "hittable": false, + "label": "•", + "depth": 37, + "parentIndex": 150, + "enabled": true, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1166, + "height": 22 + }, + "index": 151, + "ref": "e152" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "depth": 36, + "enabled": true, + "hittable": false, + "parentIndex": 128, + "index": 152, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1166, + "height": 88 + }, + "ref": "e153" + }, + { + "hittable": false, + "depth": 37, + "parentIndex": 152, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 153, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1166, + "height": 88 + }, + "type": "Other", + "ref": "e154" + }, + { + "depth": 38, + "index": 154, + "hittable": false, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1166, + "height": 88 + }, + "enabled": true, + "type": "Other", + "parentIndex": 153, + "ref": "e155" + }, + { + "hittable": false, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "depth": 38, + "index": 155, + "enabled": true, + "parentIndex": 153, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e156" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1166, + "height": 88 + }, + "depth": 39, + "hittable": false, + "enabled": true, + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 156, + "parentIndex": 155, + "ref": "e157" + }, + { + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1166, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "enabled": true, + "index": 157, + "parentIndex": 155, + "depth": 39, + "value": "0%", + "ref": "e158" + }, + { + "depth": 40, + "hittable": false, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1205, + "height": 36 + }, + "type": "Other", + "enabled": true, + "index": 158, + "parentIndex": 157, + "ref": "e159" + }, + { + "value": "0%", + "index": 159, + "depth": 39, + "type": "Other", + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1111, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 155, + "ref": "e160" + }, + { + "parentIndex": 159, + "index": 160, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -1084, + "height": 3 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 40, + "ref": "e161" + }, + { + "depth": 36, + "label": "•", + "hittable": false, + "parentIndex": 128, + "enabled": true, + "index": 161, + "type": "StaticText", + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1074, + "height": 22 + }, + "ref": "e162" + }, + { + "parentIndex": 161, + "depth": 37, + "type": "StaticText", + "index": 162, + "hittable": false, + "label": "•", + "enabled": true, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -1074, + "height": 22 + }, + "ref": "e163" + }, + { + "type": "Other", + "depth": 36, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1074, + "height": 88 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 163, + "parentIndex": 128, + "hittable": false, + "ref": "e164" + }, + { + "type": "Other", + "depth": 37, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "index": 164, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1074, + "height": 88 + }, + "hittable": false, + "parentIndex": 163, + "ref": "e165" + }, + { + "type": "Other", + "index": 165, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1074, + "height": 88 + }, + "depth": 38, + "parentIndex": 164, + "hittable": false, + "ref": "e166" + }, + { + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "enabled": true, + "hittable": false, + "parentIndex": 164, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 166, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "depth": 38, + "ref": "e167" + }, + { + "hittable": false, + "depth": 39, + "index": 167, + "parentIndex": 166, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1074, + "height": 88 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "ref": "e168" + }, + { + "index": 168, + "depth": 39, + "parentIndex": 166, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -1074, + "height": 88 + }, + "ref": "e169" + }, + { + "depth": 40, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1113, + "height": 36 + }, + "hittable": false, + "parentIndex": 168, + "type": "Other", + "enabled": true, + "index": 169, + "ref": "e170" + }, + { + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -1019, + "height": 30 + }, + "enabled": true, + "hittable": false, + "value": "0%", + "parentIndex": 166, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "index": 170, + "ref": "e171" + }, + { + "enabled": true, + "parentIndex": 170, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -992, + "height": 3 + }, + "hittable": false, + "index": 171, + "type": "Other", + "ref": "e172" + }, + { + "type": "StaticText", + "index": 172, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -982, + "height": 22 + }, + "depth": 36, + "parentIndex": 128, + "hittable": false, + "enabled": true, + "label": "•", + "ref": "e173" + }, + { + "label": "•", + "depth": 37, + "enabled": true, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": -982, + "height": 22 + }, + "type": "StaticText", + "hittable": false, + "index": 173, + "parentIndex": 172, + "ref": "e174" + }, + { + "depth": 36, + "index": 174, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -982, + "height": 66 + }, + "parentIndex": 128, + "ref": "e175" + }, + { + "type": "Other", + "parentIndex": 174, + "enabled": true, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -982, + "height": 66 + }, + "index": 175, + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e176" + }, + { + "parentIndex": 175, + "depth": 38, + "hittable": false, + "index": 176, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -982, + "height": 66 + }, + "type": "Other", + "enabled": true, + "ref": "e177" + }, + { + "parentIndex": 175, + "type": "TextView", + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "index": 177, + "depth": 38, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "ref": "e178" + }, + { + "parentIndex": 177, + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "enabled": true, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -982, + "height": 66 + }, + "index": 178, + "ref": "e179" + }, + { + "enabled": true, + "value": "0%", + "type": "Other", + "depth": 39, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": -982, + "height": 66 + }, + "hittable": false, + "parentIndex": 177, + "index": 179, + "label": "Vertical scroll bar, 1 page", + "ref": "e180" + }, + { + "index": 180, + "parentIndex": 179, + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": -1021, + "height": 36 + }, + "ref": "e181" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": -949, + "height": 30 + }, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 177, + "enabled": true, + "type": "Other", + "index": 181, + "hittable": false, + "ref": "e182" + }, + { + "hittable": false, + "parentIndex": 181, + "type": "Other", + "enabled": true, + "index": 182, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": -922, + "height": 3 + }, + "ref": "e183" + }, + { + "type": "Other", + "hittable": false, + "index": 183, + "depth": 36, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -900, + "height": 88 + }, + "parentIndex": 128, + "ref": "e184" + }, + { + "depth": 37, + "index": 184, + "parentIndex": 183, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "x": 20, + "width": 362, + "y": -900, + "height": 88 + }, + "type": "Other", + "hittable": false, + "ref": "e185" + }, + { + "enabled": true, + "depth": 38, + "hittable": false, + "parentIndex": 184, + "index": 185, + "rect": { + "x": 20, + "width": 362, + "y": -900, + "height": 88 + }, + "type": "Other", + "ref": "e186" + }, + { + "enabled": true, + "type": "TextView", + "hittable": false, + "index": 186, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "depth": 38, + "parentIndex": 184, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e187" + }, + { + "enabled": true, + "hittable": false, + "depth": 39, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 186, + "index": 187, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": -900, + "height": 88 + }, + "ref": "e188" + }, + { + "rect": { + "x": 349, + "width": 30, + "y": -900, + "height": 88 + }, + "value": "0%", + "type": "Other", + "hittable": false, + "parentIndex": 186, + "label": "Vertical scroll bar, 1 page", + "index": 188, + "depth": 39, + "enabled": true, + "ref": "e189" + }, + { + "enabled": true, + "type": "Other", + "index": 189, + "rect": { + "x": 376, + "width": 3, + "y": -939, + "height": 36 + }, + "depth": 40, + "hittable": false, + "parentIndex": 188, + "ref": "e190" + }, + { + "value": "0%", + "index": 190, + "depth": 39, + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -845, + "height": 30 + }, + "parentIndex": 186, + "ref": "e191" + }, + { + "type": "Other", + "hittable": false, + "depth": 40, + "index": 191, + "enabled": true, + "parentIndex": 190, + "rect": { + "x": -19, + "width": 36, + "y": -818, + "height": 3 + }, + "ref": "e192" + }, + { + "rect": { + "x": 12, + "width": 378, + "y": -784, + "height": 32 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 35, + "index": 192, + "parentIndex": 69, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e193" + }, + { + "rect": { + "x": 7, + "width": 388, + "y": -784, + "height": 32 + }, + "identifier": "tool-call-badge", + "type": "Other", + "enabled": true, + "parentIndex": 192, + "depth": 36, + "hittable": false, + "index": 193, + "ref": "e194" + }, + { + "hittable": false, + "index": 194, + "parentIndex": 192, + "depth": 36, + "type": "Button", + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "y": -784, + "height": 32 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e195" + }, + { + "parentIndex": 194, + "enabled": true, + "rect": { + "x": 42, + "width": 344, + "y": -777, + "height": 18 + }, + "index": 195, + "type": "Other", + "label": "Edit", + "depth": 37, + "hittable": false, + "ref": "e196" + }, + { + "label": "Edit", + "rect": { + "x": 42, + "width": 26.666664123535156, + "y": -777, + "height": 18 + }, + "type": "StaticText", + "enabled": true, + "index": 196, + "depth": 38, + "hittable": false, + "parentIndex": 195, + "ref": "e197" + }, + { + "label": "Edit", + "type": "StaticText", + "index": 197, + "parentIndex": 196, + "rect": { + "x": 42, + "width": 26.666664123535156, + "y": -777, + "height": 18 + }, + "depth": 39, + "enabled": true, + "hittable": false, + "ref": "e198" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "index": 198, + "hittable": false, + "type": "StaticText", + "parentIndex": 195, + "enabled": true, + "depth": 38, + "rect": { + "x": 76.66666793823242, + "width": 309.3333435058594, + "y": -777, + "height": 18 + }, + "ref": "e199" + }, + { + "type": "StaticText", + "enabled": true, + "hittable": false, + "rect": { + "x": 76.66666793823242, + "width": 309.3333435058594, + "y": -777, + "height": 18 + }, + "index": 199, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 39, + "parentIndex": 198, + "ref": "e200" + }, + { + "hittable": false, + "index": 200, + "parentIndex": 69, + "type": "Other", + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "x": 12, + "width": 378, + "y": -752, + "height": 36 + }, + "depth": 35, + "ref": "e201" + }, + { + "hittable": false, + "depth": 36, + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "width": 388, + "y": -752, + "height": 32 + }, + "enabled": true, + "index": 201, + "type": "Other", + "parentIndex": 200, + "ref": "e202" + }, + { + "type": "Button", + "parentIndex": 200, + "rect": { + "x": 7, + "width": 388, + "y": -752, + "height": 32 + }, + "enabled": true, + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "index": 202, + "depth": 36, + "ref": "e203" + }, + { + "depth": 35, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "parentIndex": 69, + "index": 203, + "rect": { + "x": 12, + "width": 378, + "y": -716, + "height": 570 + }, + "type": "Other", + "ref": "e204" + }, + { + "identifier": "assistant-message", + "rect": { + "x": 20, + "width": 362, + "y": -716, + "height": 566 + }, + "enabled": true, + "depth": 36, + "type": "Other", + "hittable": false, + "index": 204, + "parentIndex": 203, + "ref": "e205" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -704, + "height": 242 + }, + "enabled": true, + "depth": 36, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 203, + "index": 205, + "ref": "e206" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -704, + "height": 242 + }, + "parentIndex": 205, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 37, + "type": "Other", + "hittable": false, + "index": 206, + "enabled": true, + "ref": "e207" + }, + { + "index": 207, + "depth": 38, + "parentIndex": 206, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -704, + "height": 242 + }, + "type": "Other", + "enabled": true, + "ref": "e208" + }, + { + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 208, + "parentIndex": 206, + "enabled": true, + "hittable": false, + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "ref": "e209" + }, + { + "hittable": false, + "type": "TextView", + "rect": { + "x": 20, + "width": 362, + "y": -704, + "height": 242 + }, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "index": 209, + "parentIndex": 208, + "depth": 39, + "ref": "e210" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 208, + "value": "0%", + "rect": { + "x": 349, + "width": 30, + "y": -704, + "height": 242 + }, + "label": "Vertical scroll bar, 1 page", + "index": 210, + "depth": 39, + "ref": "e211" + }, + { + "index": 211, + "enabled": true, + "rect": { + "x": 376, + "width": 3, + "y": -743, + "height": 36 + }, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 210, + "ref": "e212" + }, + { + "hittable": false, + "index": 212, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "type": "Other", + "parentIndex": 208, + "rect": { + "x": 20, + "width": 362, + "y": -495, + "height": 30 + }, + "enabled": true, + "ref": "e213" + }, + { + "depth": 40, + "type": "Other", + "parentIndex": 212, + "rect": { + "x": -19, + "width": 36, + "y": -468, + "height": 3 + }, + "hittable": false, + "enabled": true, + "index": 213, + "ref": "e214" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": -438, + "height": 264 + }, + "parentIndex": 203, + "index": 214, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 36, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e215" + }, + { + "hittable": false, + "parentIndex": 214, + "enabled": true, + "depth": 37, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 215, + "rect": { + "x": 20, + "width": 362, + "y": -438, + "height": 264 + }, + "ref": "e216" + }, + { + "enabled": true, + "type": "Other", + "index": 216, + "rect": { + "x": 20, + "width": 362, + "y": -438, + "height": 264 + }, + "depth": 38, + "parentIndex": 215, + "hittable": false, + "ref": "e217" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "parentIndex": 215, + "depth": 38, + "type": "TextView", + "index": 217, + "hittable": false, + "rect": { + "x": 0, + "width": 0, + "y": 0, + "height": 0 + }, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e218" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "type": "TextView", + "hittable": false, + "index": 218, + "rect": { + "x": 20, + "width": 362, + "y": -438, + "height": 264 + }, + "depth": 39, + "enabled": true, + "parentIndex": 217, + "ref": "e219" + }, + { + "index": 219, + "value": "0%", + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "x": 349, + "width": 30, + "y": -438, + "height": 264 + }, + "depth": 39, + "parentIndex": 217, + "label": "Vertical scroll bar, 1 page", + "ref": "e220" + }, + { + "enabled": true, + "rect": { + "x": 376, + "width": 3, + "y": -477, + "height": 36 + }, + "hittable": false, + "parentIndex": 219, + "index": 220, + "type": "Other", + "depth": 40, + "ref": "e221" + }, + { + "hittable": false, + "depth": 39, + "type": "Other", + "rect": { + "x": 20, + "width": 362, + "y": -207, + "height": 30 + }, + "index": 221, + "parentIndex": 217, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "ref": "e222" + }, + { + "type": "Other", + "depth": 40, + "parentIndex": 221, + "enabled": true, + "hittable": false, + "index": 222, + "rect": { + "x": -19, + "width": 36, + "y": -180, + "height": 3 + }, + "ref": "e223" + }, + { + "index": 223, + "type": "Other", + "hittable": false, + "parentIndex": 69, + "depth": 35, + "enabled": true, + "label": "Thinking", + "rect": { + "x": 12, + "width": 378, + "y": -146, + "height": 32 + }, + "ref": "e224" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 7, + "width": 388, + "y": -146, + "height": 32 + }, + "identifier": "tool-call-badge", + "hittable": false, + "index": 224, + "depth": 36, + "parentIndex": 223, + "ref": "e225" + }, + { + "parentIndex": 223, + "depth": 36, + "type": "Button", + "rect": { + "x": 7, + "width": 388, + "y": -146, + "height": 32 + }, + "enabled": true, + "index": 225, + "hittable": false, + "label": "Thinking", + "ref": "e226" + }, + { + "parentIndex": 225, + "type": "Other", + "enabled": true, + "index": 226, + "depth": 37, + "label": "Thinking", + "hittable": false, + "rect": { + "x": 42, + "width": 344, + "y": -139, + "height": 18 + }, + "ref": "e227" + }, + { + "type": "StaticText", + "depth": 38, + "label": "Thinking", + "hittable": false, + "rect": { + "x": 42, + "width": 58.666664123535156, + "y": -139, + "height": 18 + }, + "parentIndex": 226, + "enabled": true, + "index": 227, + "ref": "e228" + }, + { + "depth": 39, + "rect": { + "x": 42, + "width": 58.666664123535156, + "y": -139, + "height": 18 + }, + "parentIndex": 227, + "enabled": true, + "hittable": false, + "label": "Thinking", + "type": "StaticText", + "index": 228, + "ref": "e229" + }, + { + "hittable": false, + "parentIndex": 69, + "index": 229, + "rect": { + "x": 12, + "width": 378, + "y": -114, + "height": 32 + }, + "enabled": true, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 35, + "type": "Other", + "ref": "e230" + }, + { + "index": 230, + "depth": 36, + "rect": { + "x": 7, + "width": 388, + "y": -114, + "height": 32 + }, + "enabled": true, + "parentIndex": 229, + "identifier": "tool-call-badge", + "type": "Other", + "hittable": false, + "ref": "e231" + }, + { + "index": 231, + "type": "Button", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": -114, + "height": 32 + }, + "enabled": true, + "parentIndex": 229, + "depth": 36, + "ref": "e232" + }, + { + "depth": 35, + "enabled": true, + "label": "Search, scrollToEnd", + "index": 232, + "rect": { + "x": 12, + "width": 378, + "y": -82, + "height": 36 + }, + "type": "Other", + "hittable": false, + "parentIndex": 69, + "ref": "e233" + }, + { + "type": "Other", + "index": 233, + "parentIndex": 232, + "identifier": "tool-call-badge", + "hittable": false, + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "y": -82, + "height": 32 + }, + "depth": 36, + "ref": "e234" + }, + { + "parentIndex": 232, + "enabled": true, + "depth": 36, + "type": "Button", + "rect": { + "x": 7, + "width": 388, + "y": -82, + "height": 32 + }, + "index": 234, + "label": "Search, scrollToEnd", + "hittable": false, + "ref": "e235" + }, + { + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 12, + "width": 378, + "y": -46, + "height": 646 + }, + "parentIndex": 69, + "depth": 35, + "hittable": false, + "enabled": true, + "index": 235, + "ref": "e236" + }, + { + "parentIndex": 235, + "depth": 36, + "type": "Other", + "hittable": false, + "identifier": "assistant-message", + "enabled": true, + "index": 236, + "rect": { + "x": 20, + "width": 362, + "y": -46, + "height": 642 + }, + "ref": "e237" + }, + { + "depth": 36, + "parentIndex": 235, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": -34, + "height": 132 + }, + "type": "Other", + "index": 237, + "ref": "e238" + }, + { + "index": 238, + "hittable": false, + "type": "Other", + "parentIndex": 237, + "enabled": true, + "depth": 37, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "x": 20, + "width": 362, + "y": -34, + "height": 132 + }, + "ref": "e239" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 238, + "depth": 38, + "hittable": false, + "index": 239, + "rect": { + "x": 20, + "width": 362, + "y": -34, + "height": 132 + }, + "ref": "e240" + }, + { + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 0, + "height": 98 + }, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 238, + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "type": "TextView", + "index": 240, + "ref": "e241" + }, + { + "enabled": true, + "type": "TextView", + "depth": 39, + "index": 241, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 240, + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": -34, + "height": 132 + }, + "ref": "e242" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349, + "width": 30, + "y": -34, + "height": 132 + }, + "enabled": true, + "hittable": false, + "parentIndex": 240, + "type": "Other", + "value": "0%", + "depth": 39, + "index": 242, + "ref": "e243" + }, + { + "parentIndex": 242, + "hittable": false, + "type": "Other", + "index": 243, + "enabled": true, + "depth": 40, + "rect": { + "x": 376, + "width": 3, + "y": -73, + "height": 36 + }, + "ref": "e244" + }, + { + "enabled": true, + "rect": { + "x": 20, + "width": 362, + "y": 65, + "height": 30 + }, + "index": 244, + "parentIndex": 240, + "value": "0%", + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "ref": "e245" + }, + { + "parentIndex": 244, + "depth": 40, + "index": 245, + "enabled": true, + "rect": { + "x": -19, + "width": 36, + "y": 92, + "height": 3 + }, + "type": "Other", + "hittable": false, + "ref": "e246" + }, + { + "depth": 36, + "type": "StaticText", + "label": "•", + "enabled": true, + "parentIndex": 235, + "index": 246, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 126, + "height": 22 + }, + "ref": "e247" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 126, + "height": 22 + }, + "type": "StaticText", + "enabled": true, + "index": 247, + "label": "•", + "parentIndex": 246, + "depth": 37, + "hittable": false, + "ref": "e248" + }, + { + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 126, + "height": 88 + }, + "depth": 36, + "index": 248, + "parentIndex": 235, + "hittable": false, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e249" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 126, + "height": 88 + }, + "depth": 37, + "index": 249, + "parentIndex": 248, + "ref": "e250" + }, + { + "enabled": true, + "depth": 38, + "index": 250, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 126, + "height": 88 + }, + "parentIndex": 249, + "hittable": false, + "type": "Other", + "ref": "e251" + }, + { + "index": 251, + "type": "TextView", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 249, + "hittable": false, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 126, + "height": 88 + }, + "ref": "e252" + }, + { + "parentIndex": 251, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 126, + "height": 88 + }, + "type": "TextView", + "enabled": true, + "index": 252, + "depth": 39, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e253" + }, + { + "enabled": true, + "index": 253, + "hittable": false, + "value": "0%", + "parentIndex": 251, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": 126, + "height": 88 + }, + "type": "Other", + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "ref": "e254" + }, + { + "type": "Other", + "parentIndex": 253, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": 87, + "height": 36 + }, + "hittable": false, + "depth": 40, + "enabled": true, + "index": 254, + "ref": "e255" + }, + { + "index": 255, + "depth": 39, + "value": "0%", + "parentIndex": 251, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 181, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e256" + }, + { + "hittable": false, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": 208, + "height": 3 + }, + "enabled": true, + "type": "Other", + "parentIndex": 255, + "index": 256, + "ref": "e257" + }, + { + "enabled": true, + "label": "•", + "hittable": false, + "depth": 36, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 218, + "height": 22 + }, + "parentIndex": 235, + "index": 257, + "type": "StaticText", + "ref": "e258" + }, + { + "enabled": true, + "type": "StaticText", + "index": 258, + "label": "•", + "parentIndex": 257, + "hittable": false, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 218, + "height": 22 + }, + "depth": 37, + "ref": "e259" + }, + { + "enabled": true, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 218, + "height": 88 + }, + "parentIndex": 235, + "index": 259, + "depth": 36, + "type": "Other", + "ref": "e260" + }, + { + "depth": 37, + "enabled": true, + "index": 260, + "type": "Other", + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 218, + "height": 88 + }, + "parentIndex": 259, + "ref": "e261" + }, + { + "depth": 38, + "hittable": false, + "index": 261, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 218, + "height": 88 + }, + "enabled": true, + "type": "Other", + "parentIndex": 260, + "ref": "e262" + }, + { + "parentIndex": 260, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 218, + "height": 88 + }, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 38, + "index": 262, + "type": "TextView", + "hittable": false, + "enabled": true, + "ref": "e263" + }, + { + "hittable": false, + "type": "TextView", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 218, + "height": 88 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 39, + "index": 263, + "enabled": true, + "parentIndex": 262, + "ref": "e264" + }, + { + "hittable": false, + "depth": 39, + "index": 264, + "enabled": true, + "value": "0%", + "parentIndex": 262, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": 218, + "height": 88 + }, + "ref": "e265" + }, + { + "enabled": true, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": 179, + "height": 36 + }, + "parentIndex": 264, + "type": "Other", + "index": 265, + "hittable": false, + "depth": 40, + "ref": "e266" + }, + { + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 273, + "height": 30 + }, + "depth": 39, + "parentIndex": 262, + "index": 266, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "ref": "e267" + }, + { + "hittable": false, + "depth": 40, + "index": 267, + "type": "Other", + "parentIndex": 266, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": 300, + "height": 3 + }, + "enabled": true, + "ref": "e268" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 235, + "depth": 36, + "index": 268, + "type": "StaticText", + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 310, + "height": 22 + }, + "label": "•", + "ref": "e269" + }, + { + "depth": 37, + "label": "•", + "type": "StaticText", + "parentIndex": 268, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 310, + "height": 22 + }, + "hittable": false, + "enabled": true, + "index": 269, + "ref": "e270" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 270, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 310, + "height": 88 + }, + "depth": 36, + "type": "Other", + "enabled": true, + "parentIndex": 235, + "hittable": false, + "ref": "e271" + }, + { + "hittable": false, + "index": 271, + "parentIndex": 270, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 310, + "height": 88 + }, + "depth": 37, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e272" + }, + { + "type": "Other", + "index": 272, + "enabled": true, + "parentIndex": 271, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 310, + "height": 88 + }, + "hittable": false, + "ref": "e273" + }, + { + "depth": 38, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 310, + "height": 88 + }, + "parentIndex": 271, + "hittable": false, + "index": 273, + "type": "TextView", + "enabled": true, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e274" + }, + { + "type": "TextView", + "hittable": false, + "parentIndex": 273, + "index": 274, + "depth": 39, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 310, + "height": 88 + }, + "ref": "e275" + }, + { + "parentIndex": 273, + "index": 275, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "value": "0%", + "depth": 39, + "hittable": false, + "type": "Other", + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": 310, + "height": 88 + }, + "ref": "e276" + }, + { + "parentIndex": 275, + "hittable": false, + "depth": 40, + "enabled": true, + "index": 276, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": 271, + "height": 36 + }, + "type": "Other", + "ref": "e277" + }, + { + "value": "0%", + "depth": 39, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 365, + "height": 30 + }, + "index": 277, + "hittable": false, + "parentIndex": 273, + "ref": "e278" + }, + { + "parentIndex": 277, + "index": 278, + "hittable": false, + "enabled": true, + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": 392, + "height": 3 + }, + "type": "Other", + "depth": 40, + "ref": "e279" + }, + { + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 402, + "height": 22 + }, + "label": "•", + "index": 279, + "type": "StaticText", + "parentIndex": 235, + "depth": 36, + "hittable": false, + "enabled": true, + "ref": "e280" + }, + { + "parentIndex": 279, + "hittable": false, + "label": "•", + "type": "StaticText", + "index": 280, + "depth": 37, + "rect": { + "x": 30, + "width": 7.333332061767578, + "y": 402, + "height": 22 + }, + "enabled": true, + "ref": "e281" + }, + { + "type": "Other", + "enabled": true, + "depth": 36, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 281, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 402, + "height": 66 + }, + "parentIndex": 235, + "hittable": false, + "ref": "e282" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 402, + "height": 66 + }, + "depth": 37, + "parentIndex": 281, + "index": 282, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e283" + }, + { + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 402, + "height": 66 + }, + "depth": 38, + "parentIndex": 282, + "index": 283, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e284" + }, + { + "depth": 38, + "index": 284, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 402, + "height": 66 + }, + "type": "TextView", + "enabled": true, + "hittable": false, + "parentIndex": 282, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e285" + }, + { + "index": 285, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "enabled": true, + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 402, + "height": 66 + }, + "type": "TextView", + "depth": 39, + "parentIndex": 284, + "ref": "e286" + }, + { + "enabled": true, + "rect": { + "x": 349.00000063578284, + "width": 30, + "y": 402, + "height": 66 + }, + "index": 286, + "type": "Other", + "hittable": false, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 284, + "ref": "e287" + }, + { + "index": 287, + "depth": 40, + "enabled": true, + "parentIndex": 286, + "type": "Other", + "hittable": false, + "rect": { + "x": 376.00000063578284, + "width": 3, + "y": 363, + "height": 36 + }, + "ref": "e288" + }, + { + "depth": 39, + "value": "0%", + "parentIndex": 284, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 41.33333396911621, + "width": 340.6666564941406, + "y": 435, + "height": 30 + }, + "index": 288, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e289" + }, + { + "rect": { + "x": 2.333333969116211, + "width": 36, + "y": 462, + "height": 3 + }, + "depth": 40, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 289, + "parentIndex": 288, + "ref": "e290" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 36, + "enabled": true, + "hittable": false, + "parentIndex": 235, + "index": 290, + "rect": { + "x": 20, + "width": 362, + "y": 484, + "height": 88 + }, + "type": "Other", + "ref": "e291" + }, + { + "index": 291, + "rect": { + "x": 20, + "width": 362, + "y": 484, + "height": 88 + }, + "enabled": true, + "hittable": false, + "depth": 37, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 290, + "ref": "e292" + }, + { + "index": 292, + "parentIndex": 291, + "type": "Other", + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 484, + "height": 88 + }, + "enabled": true, + "hittable": false, + "ref": "e293" + }, + { + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 291, + "hittable": false, + "enabled": true, + "depth": 38, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "index": 293, + "rect": { + "x": 20, + "width": 362, + "y": 484, + "height": 88 + }, + "ref": "e294" + }, + { + "type": "TextView", + "depth": 39, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 294, + "parentIndex": 293, + "rect": { + "x": 20, + "width": 362, + "y": 484, + "height": 88 + }, + "enabled": true, + "ref": "e295" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "x": 349, + "width": 30, + "y": 484, + "height": 88 + }, + "index": 295, + "depth": 39, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 293, + "value": "0%", + "ref": "e296" + }, + { + "enabled": true, + "index": 296, + "rect": { + "x": 376, + "width": 3, + "y": 445, + "height": 36 + }, + "type": "Other", + "depth": 40, + "parentIndex": 295, + "hittable": false, + "ref": "e297" + }, + { + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": 539, + "height": 30 + }, + "index": 297, + "depth": 39, + "type": "Other", + "parentIndex": 293, + "enabled": true, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "ref": "e298" + }, + { + "depth": 40, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 298, + "rect": { + "x": -19, + "width": 36, + "y": 566, + "height": 3 + }, + "parentIndex": 297, + "ref": "e299" + }, + { + "parentIndex": 69, + "index": 299, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "rect": { + "x": 12, + "width": 378, + "y": 600, + "height": 32 + }, + "depth": 35, + "ref": "e300" + }, + { + "identifier": "tool-call-badge", + "index": 300, + "hittable": false, + "depth": 36, + "enabled": true, + "parentIndex": 299, + "type": "Other", + "rect": { + "x": 7, + "width": 388, + "y": 600, + "height": 32 + }, + "ref": "e301" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 36, + "type": "Button", + "hittable": false, + "index": 301, + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "y": 600, + "height": 32 + }, + "parentIndex": 299, + "ref": "e302" + }, + { + "parentIndex": 69, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 35, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "x": 12, + "width": 378, + "y": 632, + "height": 36 + }, + "index": 302, + "ref": "e303" + }, + { + "identifier": "tool-call-badge", + "type": "Other", + "parentIndex": 302, + "depth": 36, + "enabled": true, + "index": 303, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": 632, + "height": 32 + }, + "ref": "e304" + }, + { + "parentIndex": 302, + "index": 304, + "hittable": false, + "rect": { + "x": 7, + "width": 388, + "y": 632, + "height": 32 + }, + "type": "Button", + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 36, + "ref": "e305" + }, + { + "depth": 37, + "rect": { + "x": 42, + "width": 344, + "y": 639, + "height": 18 + }, + "hittable": false, + "parentIndex": 304, + "label": "Shell", + "enabled": true, + "index": 305, + "type": "Other", + "ref": "e306" + }, + { + "type": "StaticText", + "label": "Shell", + "enabled": true, + "rect": { + "x": 42, + "width": 33.666664123535156, + "y": 639, + "height": 18 + }, + "index": 306, + "hittable": false, + "depth": 38, + "parentIndex": 305, + "ref": "e307" + }, + { + "index": 307, + "rect": { + "x": 42, + "width": 33.666664123535156, + "y": 639, + "height": 18 + }, + "parentIndex": 306, + "type": "StaticText", + "enabled": true, + "label": "Shell", + "depth": 39, + "hittable": false, + "ref": "e308" + }, + { + "label": "node scripts/simulate-stream-burst.mjs", + "rect": { + "x": 83.66666793823242, + "width": 271.3333435058594, + "y": 639, + "height": 18 + }, + "type": "StaticText", + "parentIndex": 305, + "index": 308, + "hittable": false, + "enabled": true, + "depth": 38, + "ref": "e309" + }, + { + "label": "node scripts/simulate-stream-burst.mjs", + "enabled": true, + "hittable": false, + "index": 309, + "parentIndex": 308, + "rect": { + "x": 83.66666793823242, + "width": 271.3333435058594, + "y": 639, + "height": 18 + }, + "depth": 39, + "type": "StaticText", + "ref": "e310" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "y": 668, + "height": 570 + }, + "depth": 35, + "enabled": true, + "type": "Other", + "parentIndex": 69, + "index": 310, + "ref": "e311" + }, + { + "type": "Other", + "identifier": "assistant-message", + "depth": 36, + "enabled": true, + "hittable": false, + "parentIndex": 310, + "index": 311, + "rect": { + "x": 20, + "width": 362, + "y": 668, + "height": 566 + }, + "ref": "e312" + }, + { + "depth": 36, + "enabled": true, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "x": 20, + "width": 362, + "y": 680, + "height": 242 + }, + "hittable": false, + "parentIndex": 310, + "index": 312, + "ref": "e313" + }, + { + "index": 313, + "type": "Other", + "depth": 37, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "rect": { + "x": 20, + "width": 362, + "y": 680, + "height": 242 + }, + "parentIndex": 312, + "enabled": true, + "ref": "e314" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 313, + "index": 314, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 680, + "height": 242 + }, + "type": "Other", + "ref": "e315" + }, + { + "parentIndex": 313, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 680, + "height": 242 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "TextView", + "enabled": true, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 315, + "hittable": false, + "ref": "e316" + }, + { + "parentIndex": 315, + "index": 316, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "rect": { + "x": 20, + "width": 362, + "y": 680, + "height": 242 + }, + "depth": 39, + "enabled": true, + "type": "TextView", + "ref": "e317" + }, + { + "enabled": true, + "parentIndex": 315, + "value": "0%", + "rect": { + "x": 349, + "width": 30, + "y": 680, + "height": 242 + }, + "index": 317, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "type": "Other", + "ref": "e318" + }, + { + "enabled": true, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 317, + "index": 318, + "rect": { + "x": 376, + "width": 3, + "y": 641, + "height": 36 + }, + "ref": "e319" + }, + { + "type": "Other", + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "value": "0%", + "parentIndex": 315, + "index": 319, + "rect": { + "x": 20, + "width": 362, + "y": 889, + "height": 30 + }, + "ref": "e320" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "index": 320, + "parentIndex": 319, + "rect": { + "x": -19, + "width": 36, + "y": 916, + "height": 3 + }, + "depth": 40, + "ref": "e321" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": 946, + "height": 264 + }, + "hittable": false, + "depth": 36, + "parentIndex": 310, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "Other", + "enabled": true, + "index": 321, + "ref": "e322" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 20, + "width": 362, + "y": 946, + "height": 264 + }, + "index": 322, + "depth": 37, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 321, + "ref": "e323" + }, + { + "parentIndex": 322, + "type": "Other", + "enabled": true, + "depth": 38, + "rect": { + "x": 20, + "width": 362, + "y": 946, + "height": 264 + }, + "index": 323, + "hittable": false, + "ref": "e324" + }, + { + "enabled": true, + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 38, + "parentIndex": 322, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "x": 20, + "width": 362, + "y": 946, + "height": 264 + }, + "index": 324, + "ref": "e325" + }, + { + "hittable": false, + "enabled": true, + "type": "TextView", + "index": 325, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "parentIndex": 324, + "depth": 39, + "rect": { + "x": 20, + "width": 362, + "y": 946, + "height": 264 + }, + "ref": "e326" + }, + { + "depth": 39, + "parentIndex": 324, + "value": "0%", + "type": "Other", + "rect": { + "x": 349, + "width": 30, + "y": 946, + "height": 264 + }, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "index": 326, + "ref": "e327" + }, + { + "enabled": true, + "hittable": false, + "depth": 40, + "index": 327, + "parentIndex": 326, + "type": "Other", + "rect": { + "x": 376, + "width": 3, + "y": 907, + "height": 36 + }, + "ref": "e328" + }, + { + "rect": { + "x": 20, + "width": 362, + "y": 1177, + "height": 30 + }, + "value": "0%", + "hittable": false, + "enabled": true, + "depth": 39, + "index": 328, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 324, + "ref": "e329" + }, + { + "parentIndex": 328, + "rect": { + "x": -19, + "width": 36, + "y": 1204, + "height": 3 + }, + "type": "Other", + "enabled": true, + "depth": 40, + "hittable": false, + "index": 329, + "ref": "e330" + }, + { + "rect": { + "x": 12, + "width": 378, + "y": 1238, + "height": 32 + }, + "parentIndex": 69, + "type": "Other", + "enabled": true, + "label": "Thinking", + "hittable": false, + "index": 330, + "depth": 35, + "ref": "e331" + }, + { + "index": 331, + "enabled": true, + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "hittable": false, + "parentIndex": 330, + "rect": { + "x": 7, + "width": 388, + "y": 1238, + "height": 32 + }, + "ref": "e332" + }, + { + "type": "Button", + "index": 332, + "enabled": true, + "rect": { + "x": 7, + "width": 388, + "y": 1238, + "height": 32 + }, + "parentIndex": 330, + "depth": 36, + "label": "Thinking", + "hittable": false, + "ref": "e333" + }, + { + "index": 333, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "parentIndex": 69, + "depth": 35, + "hittable": false, + "rect": { + "x": 12, + "width": 378, + "y": 1270, + "height": 32 + }, + "enabled": true, + "type": "Other", + "ref": "e334" + }, + { + "enabled": true, + "parentIndex": 333, + "index": 334, + "hittable": false, + "identifier": "tool-call-badge", + "rect": { + "x": 7, + "width": 388, + "y": 1270, + "height": 32 + }, + "type": "Other", + "depth": 36, + "ref": "e335" + }, + { + "rect": { + "x": 7, + "width": 388, + "y": 1270, + "height": 32 + }, + "enabled": true, + "hittable": false, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 335, + "type": "Button", + "depth": 36, + "parentIndex": 333, + "ref": "e336" + }, + { + "hittable": false, + "rect": { + "x": 42, + "width": 344, + "y": 1277, + "height": 18 + }, + "parentIndex": 335, + "type": "Other", + "label": "Read", + "enabled": true, + "depth": 37, + "index": 336, + "ref": "e337" + }, + { + "rect": { + "x": 42, + "width": 35, + "y": 1277, + "height": 18 + }, + "hittable": false, + "depth": 38, + "label": "Read", + "index": 337, + "enabled": true, + "parentIndex": 336, + "type": "StaticText", + "ref": "e338" + }, + { + "depth": 39, + "parentIndex": 337, + "index": 338, + "type": "StaticText", + "enabled": true, + "hittable": false, + "rect": { + "x": 42, + "width": 35, + "y": 1277, + "height": 18 + }, + "label": "Read", + "ref": "e339" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "index": 339, + "depth": 38, + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "x": 85, + "width": 301, + "y": 1277, + "height": 18 + }, + "parentIndex": 336, + "ref": "e340" + }, + { + "type": "StaticText", + "hittable": false, + "rect": { + "x": 85, + "width": 301, + "y": 1277, + "height": 18 + }, + "depth": 39, + "label": "packages/app/src/components/conversation-list.tsx", + "index": 340, + "parentIndex": 339, + "enabled": true, + "ref": "e341" + }, + { + "type": "Other", + "hittable": false, + "rect": { + "y": 1302, + "x": 12, + "width": 378, + "height": 36 + }, + "depth": 35, + "label": "Search, scrollToEnd", + "index": 341, + "parentIndex": 69, + "enabled": true, + "ref": "e342" + }, + { + "hittable": false, + "rect": { + "y": 1302, + "x": 7, + "width": 388, + "height": 32 + }, + "parentIndex": 341, + "depth": 36, + "identifier": "tool-call-badge", + "enabled": true, + "type": "Other", + "index": 342, + "ref": "e343" + }, + { + "parentIndex": 341, + "hittable": false, + "type": "Button", + "depth": 36, + "rect": { + "y": 1302, + "x": 7, + "width": 388, + "height": 32 + }, + "enabled": true, + "index": 343, + "label": "Search, scrollToEnd", + "ref": "e344" + }, + { + "hittable": false, + "rect": { + "y": 1309, + "x": 42, + "width": 344, + "height": 18 + }, + "parentIndex": 343, + "type": "Other", + "enabled": true, + "index": 344, + "label": "Search", + "depth": 37, + "ref": "e345" + }, + { + "parentIndex": 344, + "rect": { + "y": 1309, + "x": 42, + "width": 48, + "height": 18 + }, + "hittable": false, + "label": "Search", + "depth": 38, + "index": 345, + "type": "StaticText", + "enabled": true, + "ref": "e346" + }, + { + "type": "StaticText", + "index": 346, + "hittable": false, + "label": "Search", + "rect": { + "y": 1309, + "x": 42, + "width": 48, + "height": 18 + }, + "enabled": true, + "depth": 39, + "parentIndex": 345, + "ref": "e347" + }, + { + "type": "StaticText", + "hittable": false, + "depth": 38, + "enabled": true, + "rect": { + "y": 1309, + "x": 98, + "width": 79.66667175292969, + "height": 18 + }, + "index": 347, + "label": "scrollToEnd", + "parentIndex": 344, + "ref": "e348" + }, + { + "label": "scrollToEnd", + "depth": 39, + "index": 348, + "rect": { + "y": 1309, + "x": 98, + "width": 79.66667175292969, + "height": 18 + }, + "hittable": false, + "parentIndex": 347, + "type": "StaticText", + "enabled": true, + "ref": "e349" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 69, + "depth": 35, + "rect": { + "y": 1338, + "x": 12, + "width": 378, + "height": 336 + }, + "type": "Other", + "hittable": false, + "index": 349, + "enabled": true, + "ref": "e350" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": 1338, + "x": 20, + "width": 362, + "height": 336 + }, + "parentIndex": 349, + "enabled": true, + "identifier": "assistant-message", + "index": 350, + "depth": 36, + "ref": "e351" + }, + { + "parentIndex": 349, + "type": "Other", + "index": 351, + "depth": 36, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "hittable": false, + "rect": { + "y": 1350, + "x": 20, + "width": 362, + "height": 132 + }, + "ref": "e352" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "index": 352, + "rect": { + "y": 1350, + "x": 20, + "width": 362, + "height": 132 + }, + "parentIndex": 351, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 37, + "ref": "e353" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "index": 353, + "parentIndex": 352, + "depth": 38, + "rect": { + "y": 1350, + "x": 20, + "width": 362, + "height": 132 + }, + "ref": "e354" + }, + { + "parentIndex": 352, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "index": 354, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "depth": 38, + "rect": { + "y": 1350, + "x": 20, + "width": 362, + "height": 132 + }, + "ref": "e355" + }, + { + "enabled": true, + "index": 355, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 1350, + "x": 20, + "width": 362, + "height": 132 + }, + "depth": 39, + "parentIndex": 354, + "hittable": false, + "ref": "e356" + }, + { + "enabled": true, + "rect": { + "y": 1350, + "x": 349, + "width": 30, + "height": 132 + }, + "depth": 39, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 354, + "hittable": false, + "type": "Other", + "index": 356, + "ref": "e357" + }, + { + "enabled": true, + "index": 357, + "depth": 40, + "rect": { + "y": 1311, + "x": 376, + "width": 3, + "height": 36 + }, + "parentIndex": 356, + "hittable": false, + "type": "Other", + "ref": "e358" + }, + { + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "enabled": true, + "value": "0%", + "index": 358, + "rect": { + "y": 1449, + "x": 20, + "width": 362, + "height": 30 + }, + "hittable": false, + "parentIndex": 354, + "ref": "e359" + }, + { + "depth": 40, + "parentIndex": 358, + "type": "Other", + "rect": { + "y": 1476, + "x": -19, + "width": 36, + "height": 3 + }, + "enabled": true, + "index": 359, + "hittable": false, + "ref": "e360" + }, + { + "hittable": false, + "label": "•", + "rect": { + "y": 1510, + "x": 30, + "width": 7.333332061767578, + "height": 22 + }, + "enabled": true, + "depth": 36, + "type": "StaticText", + "parentIndex": 349, + "index": 360, + "ref": "e361" + }, + { + "enabled": true, + "hittable": false, + "index": 361, + "rect": { + "y": 1510, + "x": 30, + "width": 7.333332061767578, + "height": 22 + }, + "label": "•", + "depth": 37, + "parentIndex": 360, + "type": "StaticText", + "ref": "e362" + }, + { + "hittable": false, + "type": "Other", + "index": 362, + "enabled": true, + "parentIndex": 349, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 1510, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88 + }, + "depth": 36, + "ref": "e363" + }, + { + "type": "Other", + "rect": { + "y": 1510, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 362, + "enabled": true, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 363, + "depth": 37, + "ref": "e364" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "index": 364, + "depth": 38, + "parentIndex": 363, + "rect": { + "y": 1510, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88 + }, + "ref": "e365" + }, + { + "rect": { + "y": 1510, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88 + }, + "parentIndex": 363, + "index": 365, + "depth": 38, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "TextView", + "hittable": false, + "ref": "e366" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "index": 366, + "enabled": true, + "parentIndex": 365, + "type": "TextView", + "depth": 39, + "rect": { + "y": 1510, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 88 + }, + "ref": "e367" + }, + { + "enabled": true, + "index": 367, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "rect": { + "y": 1510, + "x": 349.00000063578284, + "width": 30, + "height": 88 + }, + "depth": 39, + "value": "0%", + "parentIndex": 365, + "ref": "e368" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": 1471, + "x": 376.00000063578284, + "width": 3, + "height": 36 + }, + "depth": 40, + "parentIndex": 367, + "index": 368, + "ref": "e369" + }, + { + "type": "Other", + "depth": 39, + "index": 369, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "hittable": false, + "parentIndex": 365, + "rect": { + "y": 1565, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 30 + }, + "ref": "e370" + }, + { + "index": 370, + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "y": 1592, + "x": 2.333333969116211, + "width": 36, + "height": 3 + }, + "parentIndex": 369, + "enabled": true, + "ref": "e371" + }, + { + "hittable": false, + "depth": 36, + "rect": { + "y": 1602, + "x": 30, + "width": 7.333332061767578, + "height": 22 + }, + "type": "StaticText", + "enabled": true, + "label": "•", + "parentIndex": 349, + "index": 371, + "ref": "e372" + }, + { + "index": 372, + "rect": { + "y": 1602, + "x": 30, + "width": 7.333332061767578, + "height": 22 + }, + "depth": 37, + "label": "•", + "parentIndex": 371, + "hittable": false, + "enabled": true, + "type": "StaticText", + "ref": "e373" + }, + { + "parentIndex": 349, + "index": 373, + "hittable": false, + "enabled": true, + "rect": { + "y": 1602, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 22 + }, + "label": "We rely on onContentSizeChange to dete", + "depth": 36, + "type": "Other", + "ref": "e374" + }, + { + "type": "Other", + "hittable": false, + "index": 374, + "label": "We rely on onContentSizeChange to dete", + "rect": { + "y": 1602, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 22 + }, + "depth": 37, + "parentIndex": 373, + "enabled": true, + "ref": "e375" + }, + { + "index": 375, + "enabled": true, + "parentIndex": 374, + "type": "Other", + "hittable": false, + "rect": { + "y": 1602, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 22 + }, + "depth": 38, + "ref": "e376" + }, + { + "label": "We rely on onContentSizeChange to dete", + "type": "TextView", + "value": "We rely on onContentSizeChange to dete", + "depth": 38, + "index": 376, + "parentIndex": 374, + "enabled": true, + "rect": { + "y": 1602, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 22 + }, + "hittable": false, + "ref": "e377" + }, + { + "enabled": true, + "rect": { + "y": 1602, + "x": 41.33333396911621, + "width": 278.07421875, + "height": 22 + }, + "label": "We rely on onContentSizeChange to dete", + "index": 377, + "depth": 39, + "parentIndex": 376, + "type": "TextView", + "hittable": false, + "ref": "e378" + }, + { + "type": "Other", + "enabled": true, + "depth": 39, + "hittable": false, + "value": "0%", + "parentIndex": 376, + "index": 378, + "rect": { + "y": 1602, + "x": 349.00000063578284, + "width": 30, + "height": 22 + }, + "label": "Vertical scroll bar, 1 page", + "ref": "e379" + }, + { + "depth": 40, + "type": "Other", + "rect": { + "y": 1563, + "x": 376.00000063578284, + "width": 3, + "height": 36 + }, + "index": 379, + "hittable": false, + "enabled": true, + "parentIndex": 378, + "ref": "e380" + }, + { + "value": "0%", + "parentIndex": 376, + "rect": { + "y": 1610, + "x": 41.33333396911621, + "width": 340.6666564941406, + "height": 11 + }, + "depth": 39, + "index": 380, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "ref": "e381" + }, + { + "rect": { + "y": 1618, + "x": 2.333333969116211, + "width": 36, + "height": 3 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 40, + "parentIndex": 380, + "index": 381, + "ref": "e382" + }, + { + "label": "(end of synthetic stream)", + "parentIndex": 349, + "index": 382, + "depth": 36, + "enabled": true, + "hittable": false, + "rect": { + "y": 1640, + "x": 20, + "width": 362, + "height": 22 + }, + "type": "Other", + "ref": "e383" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 382, + "label": "(end of synthetic stream)", + "type": "Other", + "rect": { + "y": 1640, + "x": 20, + "width": 362, + "height": 22 + }, + "depth": 37, + "index": 383, + "ref": "e384" + }, + { + "enabled": true, + "depth": 38, + "index": 384, + "rect": { + "y": 1640, + "x": 20, + "width": 362, + "height": 22 + }, + "hittable": false, + "parentIndex": 383, + "type": "Other", + "ref": "e385" + }, + { + "index": 385, + "rect": { + "y": 1640, + "x": 20, + "width": 362, + "height": 22 + }, + "value": "(end of synthetic stream)", + "parentIndex": 383, + "enabled": true, + "hittable": false, + "type": "TextView", + "label": "(end of synthetic stream)", + "depth": 38, + "ref": "e386" + }, + { + "type": "TextView", + "hittable": false, + "index": 386, + "label": "(end of synthetic stream)", + "depth": 39, + "parentIndex": 385, + "enabled": true, + "rect": { + "y": 1640, + "x": 20, + "width": 183.234375, + "height": 22 + }, + "ref": "e387" + }, + { + "value": "0%", + "rect": { + "y": 1640, + "x": 349, + "width": 30, + "height": 22 + }, + "parentIndex": 385, + "hittable": false, + "type": "Other", + "depth": 39, + "index": 387, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "ref": "e388" + }, + { + "depth": 40, + "hittable": false, + "rect": { + "y": 1601, + "x": 376, + "width": 3, + "height": 36 + }, + "enabled": true, + "type": "Other", + "parentIndex": 387, + "index": 388, + "ref": "e389" + }, + { + "parentIndex": 385, + "value": "0%", + "index": 389, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "y": 1648, + "x": 20, + "width": 362, + "height": 11 + }, + "enabled": true, + "depth": 39, + "hittable": false, + "ref": "e390" + }, + { + "type": "Other", + "index": 390, + "hittable": false, + "enabled": true, + "rect": { + "y": 1656, + "x": -19, + "width": 36, + "height": 3 + }, + "depth": 40, + "parentIndex": 389, + "ref": "e391" + }, + { + "depth": 35, + "label": "Copy turn", + "rect": { + "y": 1674, + "x": 12, + "width": 378, + "height": 67 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 391, + "parentIndex": 69, + "ref": "e392" + }, + { + "enabled": true, + "rect": { + "y": 1687, + "x": 16, + "width": 22, + "height": 22 + }, + "index": 392, + "parentIndex": 391, + "hittable": false, + "depth": 36, + "type": "Button", + "label": "Copy turn", + "ref": "e393" + }, + { + "index": 393, + "type": "Other", + "label": "Fork chat from here", + "enabled": true, + "rect": { + "y": 1687, + "x": 46, + "width": 22, + "height": 22 + }, + "hittable": false, + "depth": 36, + "parentIndex": 391, + "ref": "e394" + }, + { + "enabled": true, + "identifier": "assistant-fork-menu-trigger", + "depth": 37, + "hittable": false, + "parentIndex": 393, + "rect": { + "y": 1687, + "x": 46, + "width": 22, + "height": 22 + }, + "index": 394, + "type": "Button", + "label": "Fork chat from here", + "ref": "e395" + }, + { + "enabled": true, + "rect": { + "y": 1690.3333332538605, + "x": 76, + "width": 91.33332824707031, + "height": 15.666671752929688 + }, + "type": "Button", + "label": "Worked for 10s, ended 8:53 PM", + "index": 395, + "hittable": false, + "depth": 36, + "parentIndex": 391, + "ref": "e396" + }, + { + "label": "Worked for 10s", + "depth": 37, + "rect": { + "y": 1690.3333332538605, + "x": 76, + "width": 91.33332824707031, + "height": 15.666671752929688 + }, + "hittable": false, + "parentIndex": 395, + "index": 396, + "type": "StaticText", + "enabled": true, + "ref": "e397" + }, + { + "rect": { + "y": 1690.3333332538605, + "x": 76, + "width": 91.33332824707031, + "height": 15.666671752929688 + }, + "depth": 38, + "type": "StaticText", + "label": "Worked for 10s", + "enabled": true, + "hittable": false, + "parentIndex": 396, + "index": 397, + "ref": "e398" + }, + { + "index": 398, + "enabled": true, + "value": "0%", + "depth": 33, + "rect": { + "y": 164, + "x": 0, + "width": 402, + "height": 30 + }, + "hittable": false, + "parentIndex": 67, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "ref": "e399" + }, + { + "type": "Other", + "index": 399, + "enabled": true, + "parentIndex": 398, + "hittable": false, + "depth": 34, + "rect": { + "y": 164, + "x": 3, + "width": 393, + "height": 3 + }, + "ref": "e400" + }, + { + "depth": 33, + "enabled": true, + "hittable": false, + "parentIndex": 67, + "label": "Vertical scroll bar, 11 pages", + "index": 400, + "type": "Other", + "value": "18%", + "rect": { + "y": 161, + "x": 369, + "width": 30, + "height": 575 + }, + "ref": "e401" + }, + { + "hittable": false, + "parentIndex": 400, + "enabled": true, + "depth": 34, + "type": "Other", + "rect": { + "y": 587.3333333333333, + "x": 396, + "width": 3, + "height": 53 + }, + "index": 401, + "ref": "e402" + }, + { + "hittable": false, + "index": 402, + "depth": 33, + "type": "Other", + "enabled": true, + "rect": { + "y": 161, + "x": 369, + "width": 30, + "height": 575 + }, + "label": "Vertical scroll bar, 11 pages", + "parentIndex": 67, + "value": "18%", + "ref": "e403" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 402, + "index": 403, + "enabled": true, + "depth": 34, + "rect": { + "y": 587.3333333333333, + "x": 396, + "width": 3, + "height": 53 + }, + "ref": "e404" + }, + { + "rect": { + "y": 164, + "x": 0, + "width": 402, + "height": 30 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 67, + "depth": 33, + "index": 404, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e405" + }, + { + "type": "Other", + "hittable": false, + "index": 405, + "rect": { + "y": 164, + "x": 3, + "width": 393, + "height": 3 + }, + "depth": 34, + "parentIndex": 404, + "enabled": true, + "ref": "e406" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 64, + "label": "Scroll to bottom", + "index": 406, + "depth": 31, + "rect": { + "y": 672, + "x": 177, + "width": 48, + "height": 48 + }, + "ref": "e407" + }, + { + "rect": { + "y": 672, + "x": 177, + "width": 48, + "height": 48 + }, + "label": "Scroll to bottom", + "parentIndex": 406, + "type": "Button", + "enabled": true, + "hittable": false, + "depth": 32, + "identifier": "scroll-to-bottom-button", + "index": 407, + "ref": "e408" + }, + { + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "rect": { + "y": 736, + "x": 0, + "width": 402, + "height": 138 + }, + "index": 408, + "hittable": false, + "parentIndex": 61, + "depth": 29, + "identifier": "composer-viewport-content", + "ref": "e409" + }, + { + "parentIndex": 408, + "identifier": "message-input-root", + "hittable": false, + "enabled": true, + "depth": 30, + "rect": { + "y": 736, + "x": 16, + "width": 370, + "height": 88 + }, + "type": "Other", + "index": 409, + "ref": "e410" + }, + { + "enabled": true, + "hittable": false, + "index": 410, + "depth": 30, + "type": "Other", + "rect": { + "y": 736, + "x": 16, + "width": 370, + "height": 88 + }, + "parentIndex": 408, + "ref": "e411" + }, + { + "parentIndex": 408, + "rect": { + "y": 745, + "x": 29, + "width": 344, + "height": 30 + }, + "hittable": false, + "label": "Message agent... Message, @files, /commands", + "type": "Other", + "enabled": true, + "depth": 30, + "index": 411, + "ref": "e412" + }, + { + "type": "TextView", + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "parentIndex": 411, + "hittable": false, + "index": 412, + "rect": { + "y": 745, + "x": 29, + "width": 344, + "height": 30 + }, + "depth": 31, + "ref": "e413" + }, + { + "rect": { + "y": 745, + "x": 340, + "width": 30, + "height": 30 + }, + "index": 413, + "enabled": true, + "hittable": false, + "parentIndex": 412, + "value": "0%", + "depth": 32, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "ref": "e414" + }, + { + "depth": 33, + "index": 414, + "enabled": true, + "hittable": false, + "rect": { + "y": 1160, + "x": 367, + "width": 3, + "height": 19 + }, + "parentIndex": 413, + "type": "Other", + "ref": "e415" + }, + { + "index": 415, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "y": 757, + "x": 29, + "width": 344, + "height": 15 + }, + "hittable": false, + "parentIndex": 412, + "type": "Other", + "enabled": true, + "depth": 32, + "ref": "e416" + }, + { + "depth": 33, + "index": 416, + "hittable": false, + "rect": { + "y": 769, + "x": 32, + "width": 338, + "height": 3 + }, + "parentIndex": 415, + "type": "Other", + "enabled": true, + "ref": "e417" + }, + { + "label": "Add attachment", + "depth": 30, + "index": 417, + "parentIndex": 408, + "hittable": false, + "type": "Button", + "identifier": "message-input-attach-button", + "rect": { + "y": 787, + "x": 23, + "width": 28, + "height": 28 + }, + "enabled": true, + "ref": "e418" + }, + { + "label": "Select model (Ten second stream)", + "hittable": false, + "type": "Other", + "index": 418, + "rect": { + "y": 787, + "x": 51, + "width": 232, + "height": 28 + }, + "depth": 30, + "enabled": true, + "parentIndex": 408, + "ref": "e419" + }, + { + "index": 419, + "identifier": "combined-model-selector", + "rect": { + "y": 787, + "x": 51, + "width": 202, + "height": 28 + }, + "depth": 31, + "type": "Button", + "label": "Select model (Ten second stream)", + "parentIndex": 418, + "hittable": false, + "enabled": true, + "ref": "e420" + }, + { + "identifier": "context-window-meter", + "index": 420, + "depth": 30, + "label": "Context window 2% used", + "enabled": true, + "parentIndex": 408, + "hittable": false, + "type": "Image", + "rect": { + "y": 787, + "x": 283, + "width": 28, + "height": 28 + }, + "ref": "e421" + }, + { + "parentIndex": 408, + "rect": { + "y": 787, + "x": 315, + "width": 28, + "height": 28 + }, + "label": "Start dictation", + "type": "Button", + "hittable": false, + "index": 421, + "enabled": true, + "depth": 30, + "ref": "e422" + }, + { + "label": "Enable Voice mode", + "rect": { + "y": 787, + "x": 351, + "width": 28, + "height": 28 + }, + "depth": 30, + "hittable": false, + "index": 422, + "type": "Button", + "enabled": true, + "parentIndex": 408, + "ref": "e423" + }, + { + "depth": 11, + "parentIndex": 12, + "index": 423, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "ref": "e424" + }, + { + "type": "Other", + "hittable": false, + "depth": 7, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "index": 424, + "parentIndex": 6, + "ref": "e425" + }, + { + "depth": 8, + "hittable": false, + "index": 425, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "parentIndex": 424, + "type": "Other", + "ref": "e426" + }, + { + "type": "Other", + "depth": 9, + "index": 426, + "parentIndex": 425, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "ref": "e427" + }, + { + "parentIndex": 0, + "enabled": true, + "depth": 1, + "type": "Window", + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "index": 427, + "hittable": true, + "ref": "e428" + }, + { + "hittable": true, + "index": 428, + "depth": 2, + "type": "Other", + "parentIndex": 427, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "ref": "e429" + }, + { + "index": 429, + "type": "Other", + "hittable": true, + "depth": 3, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "parentIndex": 428, + "ref": "e430" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 430, + "totalNodeCount": 430, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 43, + "p50Ms": 253, + "p95Ms": 1664, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 43 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1664ms over 43 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776108 + } +} diff --git a/scroll-regression/ios/chat-native-submitted.png b/scroll-regression/ios/chat-native-submitted.png new file mode 100644 index 0000000000..2c3a66ee12 Binary files /dev/null and b/scroll-regression/ios/chat-native-submitted.png differ diff --git a/scroll-regression/ios/chat-reopened.json b/scroll-regression/ios/chat-reopened.json new file mode 100644 index 0000000000..2a70c3c302 --- /dev/null +++ b/scroll-regression/ios/chat-reopened.json @@ -0,0 +1,6060 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "type": "Application", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "index": 0, + "depth": 0, + "label": "Paseo Debug", + "ref": "e1" + }, + { + "enabled": true, + "type": "Window", + "depth": 1, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 0, + "index": 1, + "ref": "e2" + }, + { + "parentIndex": 1, + "depth": 2, + "index": 2, + "enabled": true, + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "ref": "e3" + }, + { + "index": 3, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "parentIndex": 2, + "hittable": false, + "depth": 3, + "ref": "e4" + }, + { + "index": 4, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "parentIndex": 3, + "hittable": false, + "depth": 4, + "ref": "e5" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 0, + "hittable": false, + "index": 5, + "depth": 1, + "type": "Window", + "enabled": true, + "ref": "e6" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 2, + "parentIndex": 5, + "index": 6, + "type": "Other", + "ref": "e7" + }, + { + "index": 7, + "parentIndex": 6, + "type": "Other", + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 3, + "ref": "e8" + }, + { + "index": 8, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 4, + "parentIndex": 7, + "type": "Other", + "enabled": true, + "ref": "e9" + }, + { + "type": "Other", + "depth": 5, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 8, + "hittable": false, + "index": 9, + "ref": "e10" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "index": 10, + "depth": 6, + "parentIndex": 9, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e11" + }, + { + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 7, + "parentIndex": 10, + "type": "Other", + "index": 11, + "hittable": false, + "ref": "e12" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "index": 12, + "parentIndex": 11, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 8, + "ref": "e13" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 9, + "parentIndex": 12, + "type": "Other", + "hittable": false, + "index": 13, + "ref": "e14" + }, + { + "depth": 9, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 14, + "parentIndex": 12, + "ref": "e15" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 14, + "index": 15, + "type": "Other", + "depth": 10, + "ref": "e16" + }, + { + "parentIndex": 14, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 16, + "depth": 10, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e17" + }, + { + "enabled": true, + "depth": 11, + "parentIndex": 16, + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "index": 17, + "ref": "e18" + }, + { + "parentIndex": 16, + "hittable": false, + "enabled": true, + "depth": 11, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "index": 18, + "type": "Other", + "ref": "e19" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 18, + "hittable": false, + "index": 19, + "enabled": true, + "depth": 12, + "type": "Other", + "ref": "e20" + }, + { + "enabled": true, + "type": "Other", + "index": 20, + "parentIndex": 19, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 13, + "ref": "e21" + }, + { + "enabled": true, + "type": "Other", + "index": 21, + "parentIndex": 20, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 14, + "ref": "e22" + }, + { + "depth": 15, + "parentIndex": 21, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "index": 22, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e23" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "depth": 16, + "parentIndex": 22, + "index": 23, + "type": "Other", + "enabled": true, + "ref": "e24" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 17, + "index": 24, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 23, + "ref": "e25" + }, + { + "index": 25, + "enabled": true, + "parentIndex": 24, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "type": "Other", + "depth": 18, + "ref": "e26" + }, + { + "depth": 19, + "index": 26, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "parentIndex": 25, + "hittable": false, + "ref": "e27" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "index": 27, + "parentIndex": 26, + "enabled": true, + "depth": 20, + "ref": "e28" + }, + { + "label": "Switch tabs (1 open)", + "type": "Other", + "parentIndex": 27, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 21, + "index": 28, + "enabled": true, + "ref": "e29" + }, + { + "label": "Open menu", + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 28, + "enabled": true, + "index": 29, + "depth": 22, + "hittable": false, + "ref": "e30" + }, + { + "label": "Open menu", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "index": 30, + "depth": 23, + "parentIndex": 29, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e31" + }, + { + "index": 31, + "type": "Other", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "hittable": false, + "label": "Open menu", + "depth": 24, + "parentIndex": 30, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "ref": "e32" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 126 + }, + "type": "Other", + "hittable": false, + "index": 32, + "identifier": "composer-dock-header", + "label": "Open menu", + "enabled": true, + "parentIndex": 31, + "depth": 25, + "ref": "e33" + }, + { + "hittable": false, + "rect": { + "y": 70, + "width": 402, + "x": 0, + "height": 56 + }, + "index": 33, + "enabled": true, + "depth": 26, + "parentIndex": 32, + "type": "Other", + "ref": "e34" + }, + { + "identifier": "menu-button", + "label": "Open menu", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 8, + "height": 32 + }, + "hittable": false, + "parentIndex": 32, + "depth": 26, + "type": "Button", + "index": 34, + "enabled": true, + "ref": "e35" + }, + { + "type": "Other", + "index": 35, + "label": "main", + "parentIndex": 32, + "depth": 26, + "enabled": true, + "hittable": false, + "rect": { + "y": 80.6666669845581, + "width": 314, + "x": 48, + "height": 34 + }, + "ref": "e36" + }, + { + "type": "Other", + "enabled": true, + "label": "main", + "index": 36, + "hittable": false, + "depth": 27, + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 34 + }, + "parentIndex": 35, + "ref": "e37" + }, + { + "enabled": true, + "hittable": false, + "identifier": "workspace-header-title", + "index": 37, + "label": "main", + "depth": 28, + "type": "StaticText", + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 18 + }, + "parentIndex": 36, + "ref": "e38" + }, + { + "type": "StaticText", + "index": 38, + "depth": 29, + "label": "main", + "enabled": true, + "hittable": false, + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 18 + }, + "parentIndex": 37, + "ref": "e39" + }, + { + "type": "StaticText", + "index": 39, + "identifier": "workspace-header-subtitle", + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688 + }, + "enabled": true, + "label": "composer-dock-ios-fixture", + "hittable": false, + "depth": 28, + "parentIndex": 36, + "ref": "e40" + }, + { + "depth": 29, + "label": "composer-dock-ios-fixture", + "parentIndex": 39, + "hittable": false, + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688 + }, + "index": 40, + "type": "StaticText", + "enabled": true, + "ref": "e41" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688 + }, + "enabled": true, + "index": 41, + "hittable": false, + "type": "StaticText", + "parentIndex": 36, + "depth": 28, + "label": "·", + "ref": "e42" + }, + { + "hittable": false, + "depth": 29, + "index": 42, + "label": "·", + "parentIndex": 41, + "rect": { + "y": 98.6666669845581, + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688 + }, + "type": "StaticText", + "enabled": true, + "ref": "e43" + }, + { + "hittable": false, + "depth": 28, + "index": 43, + "label": "dev-new", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "parentIndex": 36, + "rect": { + "y": 98.6666669845581, + "width": 68.00001525878906, + "x": 227.3333282470703, + "height": 16 + }, + "type": "Other", + "enabled": true, + "ref": "e44" + }, + { + "index": 44, + "enabled": true, + "rect": { + "y": 100.6666669845581, + "width": 12, + "x": 227.3333282470703, + "height": 12 + }, + "type": "Other", + "depth": 28, + "hittable": false, + "parentIndex": 36, + "ref": "e45" + }, + { + "rect": { + "y": 101.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 11 + }, + "parentIndex": 44, + "enabled": true, + "index": 45, + "type": "Other", + "hittable": false, + "depth": 29, + "ref": "e46" + }, + { + "enabled": true, + "depth": 30, + "type": "Other", + "parentIndex": 45, + "index": 46, + "hittable": false, + "rect": { + "y": 101.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 5 + }, + "ref": "e47" + }, + { + "hittable": false, + "index": 47, + "rect": { + "y": 107.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 5 + }, + "enabled": true, + "depth": 30, + "parentIndex": 45, + "type": "Other", + "ref": "e48" + }, + { + "enabled": true, + "hittable": false, + "index": 48, + "depth": 30, + "rect": { + "y": 103.1666669845581, + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1 + }, + "type": "Other", + "parentIndex": 45, + "ref": "e49" + }, + { + "rect": { + "y": 109.1666669845581, + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1 + }, + "type": "Other", + "depth": 30, + "parentIndex": 45, + "enabled": true, + "hittable": false, + "index": 49, + "ref": "e50" + }, + { + "label": "dev-new", + "enabled": true, + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16 + }, + "hittable": false, + "parentIndex": 36, + "index": 50, + "type": "StaticText", + "depth": 28, + "ref": "e51" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16 + }, + "hittable": false, + "label": "dev-new", + "index": 51, + "parentIndex": 50, + "enabled": true, + "type": "StaticText", + "depth": 29, + "ref": "e52" + }, + { + "hittable": false, + "identifier": "workspace-header-menu-trigger", + "type": "Button", + "label": "Workspace actions", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 330, + "height": 32 + }, + "depth": 27, + "index": 52, + "parentIndex": 35, + "enabled": true, + "ref": "e53" + }, + { + "hittable": false, + "type": "Button", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 362, + "height": 32 + }, + "identifier": "workspace-explorer-toggle", + "label": "Open Explorer sidebar", + "index": 53, + "depth": 26, + "parentIndex": 32, + "enabled": true, + "ref": "e54" + }, + { + "type": "Other", + "index": 54, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "depth": 25, + "enabled": true, + "parentIndex": 31, + "ref": "e55" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 25, + "index": 55, + "parentIndex": 31, + "ref": "e56" + }, + { + "enabled": true, + "depth": 25, + "type": "Button", + "identifier": "workspace-tab-switcher-trigger", + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 34 + }, + "parentIndex": 31, + "hittable": false, + "index": 56, + "label": "Switch tabs (1 open)", + "ref": "e57" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": 136, + "width": 14, + "x": 20, + "height": 14 + }, + "index": 57, + "depth": 26, + "parentIndex": 56, + "identifier": "workspace-active-tab-icon", + "ref": "e58" + }, + { + "depth": 25, + "parentIndex": 31, + "identifier": "workspace-tabs-row", + "type": "Other", + "enabled": true, + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 35 + }, + "hittable": false, + "index": 58, + "ref": "e59" + }, + { + "index": 59, + "depth": 25, + "enabled": true, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "parentIndex": 31, + "type": "Other", + "hittable": false, + "ref": "e60" + }, + { + "depth": 25, + "parentIndex": 31, + "index": 60, + "hittable": false, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "enabled": true, + "type": "Other", + "ref": "e61" + }, + { + "label": "Add attachment", + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 26, + "index": 61, + "parentIndex": 60, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "ref": "e62" + }, + { + "type": "Other", + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "index": 62, + "hittable": false, + "enabled": true, + "depth": 27, + "parentIndex": 61, + "ref": "e63" + }, + { + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "type": "Other", + "parentIndex": 61, + "hittable": false, + "index": 63, + "depth": 27, + "enabled": true, + "ref": "e64" + }, + { + "identifier": "composer-viewport", + "type": "Other", + "depth": 27, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "index": 64, + "enabled": true, + "label": "Message agent...", + "parentIndex": 61, + "hittable": false, + "ref": "e65" + }, + { + "enabled": true, + "hittable": false, + "depth": 28, + "parentIndex": 64, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 713 + }, + "index": 65, + "label": "Message agent...", + "type": "Other", + "ref": "e66" + }, + { + "index": 66, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 65, + "identifier": "composer-dock-content", + "enabled": true, + "type": "Other", + "depth": 29, + "ref": "e67" + }, + { + "index": 67, + "parentIndex": 66, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "enabled": true, + "hittable": false, + "depth": 30, + "type": "Other", + "ref": "e68" + }, + { + "index": 68, + "parentIndex": 66, + "label": "Horizontal scroll bar, 1 page", + "depth": 30, + "type": "Other", + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "enabled": true, + "hittable": false, + "ref": "e69" + }, + { + "type": "Other", + "index": 69, + "enabled": true, + "depth": 31, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "hittable": false, + "parentIndex": 68, + "ref": "e70" + }, + { + "enabled": true, + "depth": 31, + "label": "Horizontal scroll bar, 1 page", + "index": 70, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "identifier": "agent-chat-scroll", + "type": "Other", + "parentIndex": 68, + "hittable": false, + "ref": "e71" + }, + { + "type": "ScrollView", + "hittable": false, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 307 + }, + "index": 71, + "parentIndex": 70, + "label": "Search, scrollToEnd", + "depth": 32, + "enabled": true, + "ref": "e72" + }, + { + "label": "Search, scrollToEnd", + "rect": { + "y": -3213, + "width": 402, + "x": 0, + "height": 3379 + }, + "depth": 33, + "parentIndex": 71, + "index": 72, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e73" + }, + { + "label": "Search, scrollToEnd", + "type": "Other", + "parentIndex": 72, + "rect": { + "y": -3213, + "width": 402, + "x": 0, + "height": 3379 + }, + "index": 73, + "enabled": true, + "depth": 34, + "hittable": false, + "ref": "e74" + }, + { + "hittable": false, + "rect": { + "y": -3213, + "width": 378, + "x": 12, + "height": 32 + }, + "index": 74, + "enabled": true, + "type": "Other", + "depth": 35, + "parentIndex": 73, + "ref": "e75" + }, + { + "type": "Other", + "index": 75, + "hittable": false, + "rect": { + "y": -3213, + "width": 378, + "x": 12, + "height": 32 + }, + "enabled": true, + "parentIndex": 74, + "depth": 36, + "identifier": "older-history-slot", + "ref": "e76" + }, + { + "depth": 35, + "rect": { + "y": -3181, + "width": 378, + "x": 12, + "height": 634 + }, + "parentIndex": 73, + "index": 76, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e77" + }, + { + "label": "Search, scrollToEnd", + "depth": 35, + "enabled": true, + "parentIndex": 73, + "index": 77, + "type": "Other", + "rect": { + "y": -2547, + "width": 378, + "x": 12, + "height": 36 + }, + "hittable": false, + "ref": "e78" + }, + { + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "index": 78, + "hittable": false, + "parentIndex": 77, + "enabled": true, + "rect": { + "y": -2547, + "width": 388, + "x": 7, + "height": 32 + }, + "ref": "e79" + }, + { + "rect": { + "y": -2547, + "width": 388, + "x": 7, + "height": 32 + }, + "index": 79, + "type": "Button", + "depth": 36, + "hittable": false, + "enabled": true, + "parentIndex": 77, + "label": "Search, scrollToEnd", + "ref": "e80" + }, + { + "rect": { + "y": -2511, + "width": 378, + "x": 12, + "height": 646 + }, + "index": 80, + "enabled": true, + "depth": 35, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 73, + "hittable": false, + "type": "Other", + "ref": "e81" + }, + { + "hittable": false, + "rect": { + "y": -2511, + "width": 362, + "x": 20, + "height": 642 + }, + "depth": 36, + "type": "Other", + "identifier": "assistant-message", + "index": 81, + "enabled": true, + "parentIndex": 80, + "ref": "e82" + }, + { + "index": 82, + "hittable": false, + "rect": { + "y": -2499, + "width": 362, + "x": 20, + "height": 132 + }, + "depth": 36, + "parentIndex": 80, + "type": "Other", + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e83" + }, + { + "rect": { + "y": -2499, + "width": 362, + "x": 20, + "height": 132 + }, + "type": "Other", + "index": 83, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 82, + "depth": 37, + "enabled": true, + "hittable": false, + "ref": "e84" + }, + { + "hittable": false, + "index": 84, + "enabled": true, + "parentIndex": 83, + "depth": 38, + "rect": { + "y": -2499, + "width": 362, + "x": 20, + "height": 132 + }, + "type": "Other", + "ref": "e85" + }, + { + "parentIndex": 83, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 38, + "enabled": true, + "index": 85, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "hittable": false, + "ref": "e86" + }, + { + "type": "TextView", + "index": 86, + "hittable": false, + "parentIndex": 85, + "depth": 39, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "rect": { + "y": -2499, + "width": 362, + "x": 20, + "height": 132 + }, + "ref": "e87" + }, + { + "index": 87, + "hittable": false, + "depth": 39, + "type": "Other", + "parentIndex": 85, + "rect": { + "y": -2499, + "width": 30, + "x": 349, + "height": 132 + }, + "enabled": true, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "ref": "e88" + }, + { + "type": "Other", + "rect": { + "y": -2538, + "width": 3, + "x": 376, + "height": 36 + }, + "hittable": false, + "parentIndex": 87, + "index": 88, + "enabled": true, + "depth": 40, + "ref": "e89" + }, + { + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 85, + "index": 89, + "enabled": true, + "value": "0%", + "rect": { + "y": -2400, + "width": 362, + "x": 20, + "height": 30 + }, + "hittable": false, + "ref": "e90" + }, + { + "type": "Other", + "parentIndex": 89, + "index": 90, + "rect": { + "y": -2373, + "width": 36, + "x": -19, + "height": 3 + }, + "hittable": false, + "enabled": true, + "depth": 40, + "ref": "e91" + }, + { + "parentIndex": 80, + "enabled": true, + "depth": 36, + "label": "•", + "rect": { + "y": -2339, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "type": "StaticText", + "hittable": false, + "index": 91, + "ref": "e92" + }, + { + "enabled": true, + "depth": 37, + "parentIndex": 91, + "rect": { + "y": -2339, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "type": "StaticText", + "label": "•", + "hittable": false, + "index": 92, + "ref": "e93" + }, + { + "hittable": false, + "index": 93, + "depth": 36, + "rect": { + "y": -2339, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "Other", + "parentIndex": 80, + "ref": "e94" + }, + { + "hittable": false, + "depth": 37, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": -2339, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "type": "Other", + "parentIndex": 93, + "enabled": true, + "index": 94, + "ref": "e95" + }, + { + "depth": 38, + "type": "Other", + "index": 95, + "hittable": false, + "enabled": true, + "parentIndex": 94, + "rect": { + "y": -2339, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e96" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 38, + "parentIndex": 94, + "type": "TextView", + "index": 96, + "enabled": true, + "ref": "e97" + }, + { + "index": 97, + "type": "TextView", + "enabled": true, + "parentIndex": 96, + "hittable": false, + "depth": 39, + "rect": { + "y": -2339, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e98" + }, + { + "value": "0%", + "enabled": true, + "type": "Other", + "rect": { + "y": -2339, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "index": 98, + "hittable": false, + "parentIndex": 96, + "ref": "e99" + }, + { + "depth": 40, + "enabled": true, + "type": "Other", + "index": 99, + "parentIndex": 98, + "rect": { + "y": -2378, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "hittable": false, + "ref": "e100" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 96, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 100, + "depth": 39, + "rect": { + "y": -2284, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "ref": "e101" + }, + { + "type": "Other", + "enabled": true, + "index": 101, + "parentIndex": 100, + "rect": { + "y": -2257, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "hittable": false, + "depth": 40, + "ref": "e102" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 80, + "rect": { + "y": -2247, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "depth": 36, + "label": "•", + "index": 102, + "type": "StaticText", + "ref": "e103" + }, + { + "depth": 37, + "index": 103, + "type": "StaticText", + "parentIndex": 102, + "hittable": false, + "enabled": true, + "label": "•", + "rect": { + "y": -2247, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "ref": "e104" + }, + { + "depth": 36, + "parentIndex": 80, + "type": "Other", + "hittable": false, + "rect": { + "y": -2247, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 104, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "ref": "e105" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 37, + "rect": { + "y": -2247, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "hittable": false, + "enabled": true, + "index": 105, + "type": "Other", + "parentIndex": 104, + "ref": "e106" + }, + { + "rect": { + "y": -2247, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "type": "Other", + "enabled": true, + "index": 106, + "depth": 38, + "parentIndex": 105, + "hittable": false, + "ref": "e107" + }, + { + "parentIndex": 105, + "hittable": false, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 107, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "depth": 38, + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "ref": "e108" + }, + { + "index": 108, + "enabled": true, + "type": "TextView", + "rect": { + "y": -2247, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 107, + "depth": 39, + "ref": "e109" + }, + { + "hittable": false, + "depth": 39, + "parentIndex": 107, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "rect": { + "y": -2247, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "type": "Other", + "index": 109, + "enabled": true, + "ref": "e110" + }, + { + "enabled": true, + "parentIndex": 109, + "hittable": false, + "type": "Other", + "rect": { + "y": -2286, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "depth": 40, + "index": 110, + "ref": "e111" + }, + { + "enabled": true, + "depth": 39, + "rect": { + "y": -2192, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "index": 111, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 107, + "hittable": false, + "value": "0%", + "ref": "e112" + }, + { + "rect": { + "y": -2165, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "parentIndex": 111, + "hittable": false, + "index": 112, + "enabled": true, + "type": "Other", + "depth": 40, + "ref": "e113" + }, + { + "hittable": false, + "rect": { + "y": -2155, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "enabled": true, + "index": 113, + "depth": 36, + "parentIndex": 80, + "type": "StaticText", + "label": "•", + "ref": "e114" + }, + { + "parentIndex": 113, + "index": 114, + "hittable": false, + "depth": 37, + "type": "StaticText", + "label": "•", + "rect": { + "y": -2155, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "enabled": true, + "ref": "e115" + }, + { + "enabled": true, + "type": "Other", + "depth": 36, + "hittable": false, + "index": 115, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 80, + "rect": { + "y": -2155, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e116" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 115, + "depth": 37, + "rect": { + "y": -2155, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 116, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e117" + }, + { + "rect": { + "y": -2155, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 117, + "hittable": false, + "enabled": true, + "parentIndex": 116, + "depth": 38, + "type": "Other", + "ref": "e118" + }, + { + "depth": 38, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "index": 118, + "type": "TextView", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 116, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "ref": "e119" + }, + { + "hittable": false, + "enabled": true, + "depth": 39, + "rect": { + "y": -2155, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 119, + "parentIndex": 118, + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "ref": "e120" + }, + { + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "value": "0%", + "enabled": true, + "rect": { + "y": -2155, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "type": "Other", + "hittable": false, + "parentIndex": 118, + "index": 120, + "ref": "e121" + }, + { + "rect": { + "y": -2194, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "parentIndex": 120, + "hittable": false, + "depth": 40, + "enabled": true, + "type": "Other", + "index": 121, + "ref": "e122" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "rect": { + "y": -2100, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "depth": 39, + "parentIndex": 118, + "type": "Other", + "index": 122, + "hittable": false, + "ref": "e123" + }, + { + "hittable": false, + "depth": 40, + "type": "Other", + "enabled": true, + "index": 123, + "parentIndex": 122, + "rect": { + "y": -2073, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "ref": "e124" + }, + { + "index": 124, + "type": "StaticText", + "label": "•", + "hittable": false, + "depth": 36, + "enabled": true, + "parentIndex": 80, + "rect": { + "y": -2063, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "ref": "e125" + }, + { + "hittable": false, + "type": "StaticText", + "index": 125, + "rect": { + "y": -2063, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "depth": 37, + "label": "•", + "enabled": true, + "parentIndex": 124, + "ref": "e126" + }, + { + "hittable": false, + "index": 126, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 80, + "rect": { + "y": -2063, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "enabled": true, + "depth": 36, + "type": "Other", + "ref": "e127" + }, + { + "enabled": true, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": -2063, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "parentIndex": 126, + "index": 127, + "hittable": false, + "type": "Other", + "ref": "e128" + }, + { + "hittable": false, + "enabled": true, + "depth": 38, + "type": "Other", + "index": 128, + "parentIndex": 127, + "rect": { + "y": -2063, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "ref": "e129" + }, + { + "index": 129, + "hittable": false, + "parentIndex": 127, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "TextView", + "depth": 38, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "ref": "e130" + }, + { + "enabled": true, + "parentIndex": 129, + "rect": { + "y": -2063, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "index": 130, + "depth": 39, + "type": "TextView", + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e131" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 129, + "type": "Other", + "enabled": true, + "depth": 39, + "rect": { + "y": -2063, + "width": 30, + "x": 349.00000063578284, + "height": 66 + }, + "index": 131, + "value": "0%", + "ref": "e132" + }, + { + "rect": { + "y": -2102, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "index": 132, + "hittable": false, + "enabled": true, + "depth": 40, + "type": "Other", + "parentIndex": 131, + "ref": "e133" + }, + { + "type": "Other", + "parentIndex": 129, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "rect": { + "y": -2030, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "index": 133, + "enabled": true, + "value": "0%", + "ref": "e134" + }, + { + "type": "Other", + "rect": { + "y": -2003, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "parentIndex": 133, + "index": 134, + "enabled": true, + "depth": 40, + "hittable": false, + "ref": "e135" + }, + { + "hittable": false, + "parentIndex": 80, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "Other", + "depth": 36, + "index": 135, + "rect": { + "y": -1981, + "width": 362, + "x": 20, + "height": 88 + }, + "enabled": true, + "ref": "e136" + }, + { + "parentIndex": 135, + "index": 136, + "hittable": false, + "rect": { + "y": -1981, + "width": 362, + "x": 20, + "height": 88 + }, + "depth": 37, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "ref": "e137" + }, + { + "type": "Other", + "depth": 38, + "enabled": true, + "hittable": false, + "parentIndex": 136, + "rect": { + "y": -1981, + "width": 362, + "x": 20, + "height": 88 + }, + "index": 137, + "ref": "e138" + }, + { + "enabled": true, + "index": 138, + "hittable": false, + "depth": 38, + "type": "TextView", + "parentIndex": 136, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e139" + }, + { + "depth": 39, + "index": 139, + "type": "TextView", + "parentIndex": 138, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "rect": { + "y": -1981, + "width": 362, + "x": 20, + "height": 88 + }, + "enabled": true, + "ref": "e140" + }, + { + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "value": "0%", + "index": 140, + "hittable": false, + "rect": { + "y": -1981, + "width": 30, + "x": 349, + "height": 88 + }, + "enabled": true, + "parentIndex": 138, + "type": "Other", + "ref": "e141" + }, + { + "hittable": false, + "index": 141, + "rect": { + "y": -2020, + "width": 3, + "x": 376, + "height": 36 + }, + "parentIndex": 140, + "type": "Other", + "enabled": true, + "depth": 40, + "ref": "e142" + }, + { + "value": "0%", + "enabled": true, + "hittable": false, + "depth": 39, + "parentIndex": 138, + "type": "Other", + "rect": { + "y": -1926, + "width": 362, + "x": 20, + "height": 30 + }, + "index": 142, + "label": "Horizontal scroll bar, 1 page", + "ref": "e143" + }, + { + "depth": 40, + "rect": { + "y": -1899, + "width": 36, + "x": -19, + "height": 3 + }, + "index": 143, + "hittable": false, + "parentIndex": 142, + "type": "Other", + "enabled": true, + "ref": "e144" + }, + { + "depth": 35, + "parentIndex": 73, + "enabled": true, + "type": "Other", + "index": 144, + "hittable": false, + "rect": { + "y": -1865, + "width": 378, + "x": 12, + "height": 32 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e145" + }, + { + "parentIndex": 144, + "identifier": "tool-call-badge", + "hittable": false, + "index": 145, + "type": "Other", + "rect": { + "y": -1865, + "width": 388, + "x": 7, + "height": 32 + }, + "enabled": true, + "depth": 36, + "ref": "e146" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 36, + "rect": { + "y": -1865, + "width": 388, + "x": 7, + "height": 32 + }, + "index": 146, + "parentIndex": 144, + "hittable": false, + "type": "Button", + "enabled": true, + "ref": "e147" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": -1833, + "width": 378, + "x": 12, + "height": 36 + }, + "index": 147, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "hittable": false, + "parentIndex": 73, + "ref": "e148" + }, + { + "type": "Other", + "identifier": "tool-call-badge", + "rect": { + "y": -1833, + "width": 388, + "x": 7, + "height": 32 + }, + "enabled": true, + "hittable": false, + "parentIndex": 147, + "index": 148, + "depth": 36, + "ref": "e149" + }, + { + "depth": 36, + "hittable": false, + "parentIndex": 147, + "index": 149, + "rect": { + "y": -1833, + "width": 388, + "x": 7, + "height": 32 + }, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "type": "Button", + "enabled": true, + "ref": "e150" + }, + { + "rect": { + "y": -1797, + "width": 378, + "x": 12, + "height": 570 + }, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "depth": 35, + "parentIndex": 73, + "hittable": false, + "index": 150, + "ref": "e151" + }, + { + "type": "Other", + "index": 151, + "depth": 36, + "identifier": "assistant-message", + "parentIndex": 150, + "enabled": true, + "rect": { + "y": -1797, + "width": 362, + "x": 20, + "height": 566 + }, + "hittable": false, + "ref": "e152" + }, + { + "rect": { + "y": -1785, + "width": 362, + "x": 20, + "height": 242 + }, + "index": 152, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 150, + "type": "Other", + "depth": 36, + "enabled": true, + "hittable": false, + "ref": "e153" + }, + { + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -1785, + "width": 362, + "x": 20, + "height": 242 + }, + "hittable": false, + "type": "Other", + "index": 153, + "depth": 37, + "parentIndex": 152, + "ref": "e154" + }, + { + "type": "Other", + "rect": { + "y": -1785, + "width": 362, + "x": 20, + "height": 242 + }, + "hittable": false, + "parentIndex": 153, + "index": 154, + "depth": 38, + "enabled": true, + "ref": "e155" + }, + { + "parentIndex": 153, + "hittable": false, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "enabled": true, + "depth": 38, + "index": 155, + "type": "TextView", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e156" + }, + { + "rect": { + "y": -1785, + "width": 362, + "x": 20, + "height": 242 + }, + "enabled": true, + "parentIndex": 155, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "type": "TextView", + "hittable": false, + "depth": 39, + "index": 156, + "ref": "e157" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 155, + "enabled": true, + "rect": { + "y": -1785, + "width": 30, + "x": 349, + "height": 242 + }, + "index": 157, + "hittable": false, + "type": "Other", + "value": "0%", + "depth": 39, + "ref": "e158" + }, + { + "type": "Other", + "index": 158, + "hittable": false, + "rect": { + "y": -1824, + "width": 3, + "x": 376, + "height": 36 + }, + "enabled": true, + "depth": 40, + "parentIndex": 157, + "ref": "e159" + }, + { + "parentIndex": 155, + "hittable": false, + "type": "Other", + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "enabled": true, + "index": 159, + "rect": { + "y": -1576, + "width": 362, + "x": 20, + "height": 30 + }, + "ref": "e160" + }, + { + "parentIndex": 159, + "hittable": false, + "type": "Other", + "rect": { + "y": -1549, + "width": 36, + "x": -19, + "height": 3 + }, + "enabled": true, + "depth": 40, + "index": 160, + "ref": "e161" + }, + { + "depth": 36, + "type": "Other", + "rect": { + "y": -1519, + "width": 362, + "x": 20, + "height": 264 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "index": 161, + "enabled": true, + "parentIndex": 150, + "ref": "e162" + }, + { + "parentIndex": 161, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": -1519, + "width": 362, + "x": 20, + "height": 264 + }, + "type": "Other", + "depth": 37, + "index": 162, + "enabled": true, + "ref": "e163" + }, + { + "index": 163, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 162, + "rect": { + "y": -1519, + "width": 362, + "x": 20, + "height": 264 + }, + "depth": 38, + "ref": "e164" + }, + { + "index": 164, + "hittable": false, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "depth": 38, + "enabled": true, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 162, + "ref": "e165" + }, + { + "rect": { + "y": -1519, + "width": 362, + "x": 20, + "height": 264 + }, + "parentIndex": 164, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "depth": 39, + "type": "TextView", + "hittable": false, + "index": 165, + "enabled": true, + "ref": "e166" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 164, + "rect": { + "y": -1519, + "width": 30, + "x": 349, + "height": 264 + }, + "depth": 39, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "index": 166, + "enabled": true, + "ref": "e167" + }, + { + "depth": 40, + "hittable": false, + "parentIndex": 166, + "enabled": true, + "index": 167, + "type": "Other", + "rect": { + "y": -1558, + "width": 3, + "x": 376, + "height": 36 + }, + "ref": "e168" + }, + { + "type": "Other", + "value": "0%", + "enabled": true, + "parentIndex": 164, + "index": 168, + "rect": { + "y": -1288, + "width": 362, + "x": 20, + "height": 30 + }, + "depth": 39, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "ref": "e169" + }, + { + "index": 169, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 40, + "parentIndex": 168, + "rect": { + "y": -1261, + "width": 36, + "x": -19, + "height": 3 + }, + "ref": "e170" + }, + { + "rect": { + "y": -1227, + "width": 378, + "x": 12, + "height": 32 + }, + "index": 170, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 35, + "label": "Thinking", + "parentIndex": 73, + "ref": "e171" + }, + { + "parentIndex": 170, + "index": 171, + "rect": { + "y": -1227, + "width": 388, + "x": 7, + "height": 32 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "identifier": "tool-call-badge", + "depth": 36, + "ref": "e172" + }, + { + "parentIndex": 170, + "label": "Thinking", + "index": 172, + "enabled": true, + "type": "Button", + "rect": { + "y": -1227, + "width": 388, + "x": 7, + "height": 32 + }, + "hittable": false, + "depth": 36, + "ref": "e173" + }, + { + "enabled": true, + "rect": { + "y": -1195, + "width": 378, + "x": 12, + "height": 32 + }, + "index": 173, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "type": "Other", + "parentIndex": 73, + "depth": 35, + "hittable": false, + "ref": "e174" + }, + { + "identifier": "tool-call-badge", + "depth": 36, + "index": 174, + "rect": { + "y": -1195, + "width": 388, + "x": 7, + "height": 32 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 173, + "ref": "e175" + }, + { + "rect": { + "y": -1195, + "width": 388, + "x": 7, + "height": 32 + }, + "parentIndex": 173, + "type": "Button", + "hittable": false, + "index": 175, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 36, + "enabled": true, + "ref": "e176" + }, + { + "index": 176, + "label": "Search, scrollToEnd", + "parentIndex": 73, + "type": "Other", + "depth": 35, + "enabled": true, + "hittable": false, + "rect": { + "y": -1163, + "width": 378, + "x": 12, + "height": 36 + }, + "ref": "e177" + }, + { + "enabled": true, + "type": "Other", + "index": 177, + "hittable": false, + "rect": { + "y": -1163, + "width": 388, + "x": 7, + "height": 32 + }, + "depth": 36, + "parentIndex": 176, + "identifier": "tool-call-badge", + "ref": "e178" + }, + { + "index": 178, + "type": "Button", + "label": "Search, scrollToEnd", + "enabled": true, + "hittable": false, + "depth": 36, + "parentIndex": 176, + "rect": { + "y": -1163, + "width": 388, + "x": 7, + "height": 32 + }, + "ref": "e179" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 179, + "rect": { + "y": -1127, + "width": 378, + "x": 12, + "height": 646 + }, + "depth": 35, + "enabled": true, + "hittable": false, + "parentIndex": 73, + "type": "Other", + "ref": "e180" + }, + { + "identifier": "assistant-message", + "enabled": true, + "hittable": false, + "rect": { + "y": -1127, + "width": 362, + "x": 20, + "height": 642 + }, + "index": 180, + "parentIndex": 179, + "depth": 36, + "type": "Other", + "ref": "e181" + }, + { + "parentIndex": 179, + "type": "Other", + "hittable": false, + "index": 181, + "rect": { + "y": -1115, + "width": 362, + "x": 20, + "height": 132 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "depth": 36, + "ref": "e182" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "index": 182, + "rect": { + "y": -1115, + "width": 362, + "x": 20, + "height": 132 + }, + "parentIndex": 181, + "type": "Other", + "hittable": false, + "depth": 37, + "ref": "e183" + }, + { + "rect": { + "y": -1115, + "width": 362, + "x": 20, + "height": 132 + }, + "enabled": true, + "type": "Other", + "depth": 38, + "parentIndex": 182, + "index": 183, + "hittable": false, + "ref": "e184" + }, + { + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "enabled": true, + "depth": 38, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 182, + "index": 184, + "hittable": false, + "ref": "e185" + }, + { + "depth": 39, + "rect": { + "y": -1115, + "width": 362, + "x": 20, + "height": 132 + }, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "index": 185, + "parentIndex": 184, + "enabled": true, + "ref": "e186" + }, + { + "rect": { + "y": -1115, + "width": 30, + "x": 349, + "height": 132 + }, + "value": "0%", + "index": 186, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 184, + "enabled": true, + "depth": 39, + "type": "Other", + "ref": "e187" + }, + { + "depth": 40, + "index": 187, + "enabled": true, + "parentIndex": 186, + "hittable": false, + "type": "Other", + "rect": { + "y": -1154, + "width": 3, + "x": 376, + "height": 36 + }, + "ref": "e188" + }, + { + "type": "Other", + "index": 188, + "enabled": true, + "hittable": false, + "depth": 39, + "parentIndex": 184, + "value": "0%", + "rect": { + "y": -1016, + "width": 362, + "x": 20, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "ref": "e189" + }, + { + "index": 189, + "hittable": false, + "depth": 40, + "enabled": true, + "parentIndex": 188, + "rect": { + "y": -989, + "width": 36, + "x": -19, + "height": 3 + }, + "type": "Other", + "ref": "e190" + }, + { + "depth": 36, + "hittable": false, + "type": "StaticText", + "rect": { + "y": -955, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "label": "•", + "index": 190, + "enabled": true, + "parentIndex": 179, + "ref": "e191" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "rect": { + "y": -955, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "index": 191, + "label": "•", + "depth": 37, + "parentIndex": 190, + "ref": "e192" + }, + { + "index": 192, + "parentIndex": 179, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 36, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": -955, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e193" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 193, + "parentIndex": 192, + "hittable": false, + "type": "Other", + "rect": { + "y": -955, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 37, + "enabled": true, + "ref": "e194" + }, + { + "rect": { + "y": -955, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "type": "Other", + "depth": 38, + "hittable": false, + "parentIndex": 193, + "enabled": true, + "index": 194, + "ref": "e195" + }, + { + "depth": 38, + "parentIndex": 193, + "index": 195, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "TextView", + "ref": "e196" + }, + { + "parentIndex": 195, + "rect": { + "y": -955, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 196, + "depth": 39, + "enabled": true, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "ref": "e197" + }, + { + "value": "0%", + "rect": { + "y": -955, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "index": 197, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 39, + "parentIndex": 195, + "ref": "e198" + }, + { + "hittable": false, + "parentIndex": 197, + "enabled": true, + "type": "Other", + "index": 198, + "depth": 40, + "rect": { + "y": -994, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "ref": "e199" + }, + { + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "y": -900, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "value": "0%", + "index": 199, + "hittable": false, + "depth": 39, + "enabled": true, + "parentIndex": 195, + "ref": "e200" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 40, + "parentIndex": 199, + "rect": { + "y": -873, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "index": 200, + "ref": "e201" + }, + { + "depth": 36, + "enabled": true, + "label": "•", + "index": 201, + "rect": { + "y": -863, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "type": "StaticText", + "hittable": false, + "parentIndex": 179, + "ref": "e202" + }, + { + "rect": { + "y": -863, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "label": "•", + "parentIndex": 201, + "hittable": false, + "index": 202, + "depth": 37, + "enabled": true, + "type": "StaticText", + "ref": "e203" + }, + { + "index": 203, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -863, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 36, + "hittable": false, + "parentIndex": 179, + "enabled": true, + "type": "Other", + "ref": "e204" + }, + { + "depth": 37, + "type": "Other", + "rect": { + "y": -863, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 204, + "parentIndex": 203, + "hittable": false, + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e205" + }, + { + "hittable": false, + "index": 205, + "enabled": true, + "type": "Other", + "depth": 38, + "parentIndex": 204, + "rect": { + "y": -863, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "ref": "e206" + }, + { + "index": 206, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "enabled": true, + "hittable": false, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 38, + "type": "TextView", + "parentIndex": 204, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e207" + }, + { + "parentIndex": 206, + "enabled": true, + "hittable": false, + "rect": { + "y": -863, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "depth": 39, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "index": 207, + "ref": "e208" + }, + { + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "depth": 39, + "parentIndex": 206, + "hittable": false, + "value": "0%", + "type": "Other", + "rect": { + "y": -863, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "index": 208, + "ref": "e209" + }, + { + "parentIndex": 208, + "index": 209, + "hittable": false, + "depth": 40, + "rect": { + "y": -902, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "enabled": true, + "type": "Other", + "ref": "e210" + }, + { + "hittable": false, + "parentIndex": 206, + "depth": 39, + "enabled": true, + "type": "Other", + "rect": { + "y": -808, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "index": 210, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "ref": "e211" + }, + { + "depth": 40, + "type": "Other", + "rect": { + "y": -781, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "parentIndex": 210, + "hittable": false, + "enabled": true, + "index": 211, + "ref": "e212" + }, + { + "enabled": true, + "label": "•", + "parentIndex": 179, + "type": "StaticText", + "depth": 36, + "index": 212, + "rect": { + "y": -771, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "hittable": false, + "ref": "e213" + }, + { + "label": "•", + "parentIndex": 212, + "index": 213, + "enabled": true, + "type": "StaticText", + "hittable": false, + "rect": { + "y": -771, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "depth": 37, + "ref": "e214" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 36, + "parentIndex": 179, + "rect": { + "y": -771, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "index": 214, + "ref": "e215" + }, + { + "enabled": true, + "rect": { + "y": -771, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 214, + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 215, + "depth": 37, + "type": "Other", + "ref": "e216" + }, + { + "depth": 38, + "rect": { + "y": -771, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "hittable": false, + "index": 216, + "type": "Other", + "enabled": true, + "parentIndex": 215, + "ref": "e217" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "type": "TextView", + "depth": 38, + "parentIndex": 215, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "index": 217, + "ref": "e218" + }, + { + "type": "TextView", + "rect": { + "y": -771, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 88 + }, + "parentIndex": 217, + "index": 218, + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "depth": 39, + "ref": "e219" + }, + { + "index": 219, + "value": "0%", + "rect": { + "y": -771, + "width": 30, + "x": 349.00000063578284, + "height": 88 + }, + "depth": 39, + "parentIndex": 217, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "enabled": true, + "ref": "e220" + }, + { + "depth": 40, + "hittable": false, + "parentIndex": 219, + "type": "Other", + "rect": { + "y": -810, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "enabled": true, + "index": 220, + "ref": "e221" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "depth": 39, + "value": "0%", + "rect": { + "y": -716, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "parentIndex": 217, + "index": 221, + "ref": "e222" + }, + { + "rect": { + "y": -689, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "enabled": true, + "hittable": false, + "index": 222, + "depth": 40, + "type": "Other", + "parentIndex": 221, + "ref": "e223" + }, + { + "enabled": true, + "type": "StaticText", + "parentIndex": 179, + "depth": 36, + "hittable": false, + "rect": { + "y": -679, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "index": 223, + "label": "•", + "ref": "e224" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 223, + "depth": 37, + "type": "StaticText", + "index": 224, + "label": "•", + "rect": { + "y": -679, + "width": 7.333332061767578, + "x": 30, + "height": 22 + }, + "ref": "e225" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 36, + "parentIndex": 179, + "hittable": false, + "index": 225, + "enabled": true, + "rect": { + "y": -679, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "type": "Other", + "ref": "e226" + }, + { + "type": "Other", + "depth": 37, + "rect": { + "y": -679, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "hittable": false, + "parentIndex": 225, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 226, + "enabled": true, + "ref": "e227" + }, + { + "type": "Other", + "rect": { + "y": -679, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "index": 227, + "enabled": true, + "hittable": false, + "depth": 38, + "parentIndex": 226, + "ref": "e228" + }, + { + "depth": 38, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "parentIndex": 226, + "index": 228, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "enabled": true, + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e229" + }, + { + "parentIndex": 228, + "depth": 39, + "type": "TextView", + "hittable": false, + "rect": { + "y": -679, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 66 + }, + "index": 229, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "ref": "e230" + }, + { + "rect": { + "y": -679, + "width": 30, + "x": 349.00000063578284, + "height": 66 + }, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 228, + "type": "Other", + "index": 230, + "hittable": false, + "depth": 39, + "enabled": true, + "ref": "e231" + }, + { + "depth": 40, + "parentIndex": 230, + "rect": { + "y": -718, + "width": 3, + "x": 376.00000063578284, + "height": 36 + }, + "type": "Other", + "index": 231, + "enabled": true, + "hittable": false, + "ref": "e232" + }, + { + "rect": { + "y": -646, + "width": 340.6666564941406, + "x": 41.33333396911621, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "index": 232, + "hittable": false, + "parentIndex": 228, + "type": "Other", + "value": "0%", + "ref": "e233" + }, + { + "parentIndex": 232, + "depth": 40, + "index": 233, + "rect": { + "y": -619, + "width": 36, + "x": 2.333333969116211, + "height": 3 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e234" + }, + { + "index": 234, + "depth": 36, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -597, + "width": 362, + "x": 20, + "height": 88 + }, + "parentIndex": 179, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e235" + }, + { + "rect": { + "y": -597, + "width": 362, + "x": 20, + "height": 88 + }, + "parentIndex": 234, + "hittable": false, + "enabled": true, + "depth": 37, + "type": "Other", + "index": 235, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e236" + }, + { + "hittable": false, + "depth": 38, + "parentIndex": 235, + "enabled": true, + "index": 236, + "rect": { + "y": -597, + "width": 362, + "x": 20, + "height": 88 + }, + "type": "Other", + "ref": "e237" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 235, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "index": 237, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "depth": 38, + "ref": "e238" + }, + { + "parentIndex": 237, + "type": "TextView", + "hittable": false, + "enabled": true, + "rect": { + "y": -597, + "width": 362, + "x": 20, + "height": 88 + }, + "index": 238, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 39, + "ref": "e239" + }, + { + "type": "Other", + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 237, + "rect": { + "y": -597, + "width": 30, + "x": 349, + "height": 88 + }, + "enabled": true, + "index": 239, + "hittable": false, + "ref": "e240" + }, + { + "rect": { + "y": -636, + "width": 3, + "x": 376, + "height": 36 + }, + "index": 240, + "hittable": false, + "parentIndex": 239, + "depth": 40, + "type": "Other", + "enabled": true, + "ref": "e241" + }, + { + "rect": { + "y": -542, + "width": 362, + "x": 20, + "height": 30 + }, + "enabled": true, + "parentIndex": 237, + "type": "Other", + "index": 241, + "hittable": false, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "ref": "e242" + }, + { + "depth": 40, + "type": "Other", + "hittable": false, + "rect": { + "y": -515, + "width": 36, + "x": -19, + "height": 3 + }, + "index": 242, + "parentIndex": 241, + "enabled": true, + "ref": "e243" + }, + { + "hittable": false, + "parentIndex": 73, + "type": "Other", + "index": 243, + "enabled": true, + "rect": { + "y": -481, + "width": 378, + "x": 12, + "height": 32 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "depth": 35, + "ref": "e244" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 243, + "enabled": true, + "index": 244, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "y": -481, + "width": 388, + "x": 7, + "height": 32 + }, + "ref": "e245" + }, + { + "parentIndex": 243, + "hittable": false, + "index": 245, + "depth": 36, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "rect": { + "y": -481, + "width": 388, + "x": 7, + "height": 32 + }, + "type": "Button", + "ref": "e246" + }, + { + "rect": { + "y": -449, + "width": 378, + "x": 12, + "height": 36 + }, + "index": 246, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "enabled": true, + "ref": "e247" + }, + { + "enabled": true, + "depth": 36, + "type": "Other", + "index": 247, + "identifier": "tool-call-badge", + "hittable": false, + "rect": { + "y": -449, + "width": 388, + "x": 7, + "height": 32 + }, + "parentIndex": 246, + "ref": "e248" + }, + { + "depth": 36, + "type": "Button", + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -449, + "width": 388, + "x": 7, + "height": 32 + }, + "index": 248, + "parentIndex": 246, + "hittable": false, + "enabled": true, + "ref": "e249" + }, + { + "parentIndex": 73, + "rect": { + "y": -413, + "width": 378, + "x": 12, + "height": 512 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 249, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "depth": 35, + "ref": "e250" + }, + { + "hittable": false, + "depth": 36, + "rect": { + "y": -413, + "width": 362, + "x": 20, + "height": 512 + }, + "enabled": true, + "identifier": "assistant-message", + "parentIndex": 249, + "index": 250, + "type": "Other", + "ref": "e251" + }, + { + "type": "Other", + "depth": 36, + "enabled": true, + "parentIndex": 249, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "rect": { + "y": -401, + "width": 362, + "x": 20, + "height": 242 + }, + "index": 251, + "ref": "e252" + }, + { + "depth": 37, + "parentIndex": 251, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -401, + "width": 362, + "x": 20, + "height": 242 + }, + "index": 252, + "ref": "e253" + }, + { + "type": "Other", + "rect": { + "y": -401, + "width": 362, + "x": 20, + "height": 242 + }, + "depth": 38, + "hittable": false, + "parentIndex": 252, + "index": 253, + "enabled": true, + "ref": "e254" + }, + { + "type": "TextView", + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 252, + "rect": { + "y": 0, + "width": 0, + "x": 0, + "height": 0 + }, + "index": 254, + "enabled": true, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e255" + }, + { + "index": 255, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "parentIndex": 254, + "enabled": true, + "depth": 39, + "type": "TextView", + "hittable": false, + "rect": { + "y": -401, + "width": 362, + "x": 20, + "height": 242 + }, + "ref": "e256" + }, + { + "hittable": false, + "rect": { + "y": -401, + "width": 30, + "x": 349, + "height": 242 + }, + "type": "Other", + "index": 256, + "depth": 39, + "enabled": true, + "parentIndex": 254, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "ref": "e257" + }, + { + "type": "Other", + "hittable": false, + "index": 257, + "depth": 40, + "parentIndex": 256, + "enabled": true, + "rect": { + "y": -440, + "width": 3, + "x": 376, + "height": 36 + }, + "ref": "e258" + }, + { + "value": "0%", + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 254, + "rect": { + "y": -192, + "width": 362, + "x": 20, + "height": 30 + }, + "enabled": true, + "depth": 39, + "hittable": false, + "index": 258, + "ref": "e259" + }, + { + "enabled": true, + "parentIndex": 258, + "index": 259, + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "y": -165, + "width": 36, + "x": -19, + "height": 3 + }, + "ref": "e260" + }, + { + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "enabled": true, + "rect": { + "y": -135, + "width": 362, + "x": 20, + "height": 176 + }, + "depth": 36, + "parentIndex": 249, + "hittable": false, + "index": 260, + "ref": "e261" + }, + { + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "rect": { + "y": -135, + "width": 362, + "x": 20, + "height": 176 + }, + "depth": 37, + "enabled": true, + "parentIndex": 260, + "index": 261, + "hittable": false, + "ref": "e262" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 261, + "index": 262, + "depth": 38, + "type": "Other", + "rect": { + "y": -135, + "width": 362, + "x": 20, + "height": 176 + }, + "ref": "e263" + }, + { + "hittable": false, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "depth": 38, + "index": 263, + "enabled": true, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 261, + "rect": { + "y": 0, + "width": 362, + "x": 20, + "height": 41 + }, + "ref": "e264" + }, + { + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 263, + "index": 264, + "rect": { + "y": -135, + "width": 362, + "x": 20, + "height": 176 + }, + "type": "TextView", + "depth": 39, + "enabled": true, + "ref": "e265" + }, + { + "type": "Other", + "index": 265, + "rect": { + "y": -135, + "width": 30, + "x": 349, + "height": 176 + }, + "value": "0%", + "enabled": true, + "parentIndex": 263, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "ref": "e266" + }, + { + "index": 266, + "rect": { + "y": -174, + "width": 3, + "x": 376, + "height": 36 + }, + "hittable": false, + "type": "Other", + "parentIndex": 265, + "depth": 40, + "enabled": true, + "ref": "e267" + }, + { + "parentIndex": 263, + "value": "0%", + "hittable": false, + "rect": { + "y": 8, + "width": 362, + "x": 20, + "height": 30 + }, + "type": "Other", + "index": 267, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "ref": "e268" + }, + { + "parentIndex": 267, + "index": 268, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 40, + "rect": { + "y": 35, + "width": 36, + "x": -19, + "height": 3 + }, + "ref": "e269" + }, + { + "type": "Other", + "rect": { + "y": 65, + "width": 362, + "x": 20, + "height": 22 + }, + "hittable": false, + "label": "(end of synthetic stream)", + "index": 269, + "depth": 36, + "parentIndex": 249, + "enabled": true, + "ref": "e270" + }, + { + "enabled": true, + "label": "(end of synthetic stream)", + "index": 270, + "depth": 37, + "type": "Other", + "parentIndex": 269, + "rect": { + "y": 65, + "width": 362, + "x": 20, + "height": 22 + }, + "hittable": false, + "ref": "e271" + }, + { + "depth": 38, + "hittable": false, + "index": 271, + "parentIndex": 270, + "enabled": true, + "rect": { + "y": 65, + "width": 362, + "x": 20, + "height": 22 + }, + "type": "Other", + "ref": "e272" + }, + { + "parentIndex": 270, + "enabled": true, + "type": "TextView", + "rect": { + "y": 65, + "width": 362, + "x": 20, + "height": 22 + }, + "index": 272, + "label": "(end of synthetic stream)", + "hittable": false, + "depth": 38, + "value": "(end of synthetic stream)", + "ref": "e273" + }, + { + "depth": 39, + "parentIndex": 272, + "enabled": true, + "hittable": false, + "index": 273, + "label": "(end of synthetic stream)", + "type": "TextView", + "rect": { + "y": 65, + "width": 183.234375, + "x": 20, + "height": 22 + }, + "ref": "e274" + }, + { + "parentIndex": 272, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "y": 65, + "width": 30, + "x": 349, + "height": 22 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 274, + "ref": "e275" + }, + { + "rect": { + "y": 26, + "width": 3, + "x": 376, + "height": 36 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 274, + "index": 275, + "depth": 40, + "ref": "e276" + }, + { + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 272, + "type": "Other", + "value": "0%", + "index": 276, + "enabled": true, + "rect": { + "y": 73, + "width": 362, + "x": 20, + "height": 11 + }, + "hittable": false, + "ref": "e277" + }, + { + "enabled": true, + "index": 277, + "type": "Other", + "parentIndex": 276, + "depth": 40, + "rect": { + "y": 81, + "width": 36, + "x": -19, + "height": 3 + }, + "hittable": false, + "ref": "e278" + }, + { + "label": "Copy turn", + "parentIndex": 73, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 278, + "depth": 35, + "rect": { + "y": 99, + "width": 378, + "x": 12, + "height": 67 + }, + "ref": "e279" + }, + { + "rect": { + "y": 112, + "width": 22, + "x": 16, + "height": 22 + }, + "label": "Copy turn", + "hittable": false, + "depth": 36, + "type": "Button", + "parentIndex": 278, + "index": 279, + "enabled": true, + "ref": "e280" + }, + { + "parentIndex": 278, + "type": "Other", + "depth": 36, + "hittable": false, + "label": "Fork chat from here", + "enabled": true, + "rect": { + "y": 112, + "width": 22, + "x": 46, + "height": 22 + }, + "index": 280, + "ref": "e281" + }, + { + "enabled": true, + "index": 281, + "label": "Fork chat from here", + "rect": { + "y": 112, + "width": 22, + "x": 46, + "height": 22 + }, + "hittable": false, + "parentIndex": 280, + "depth": 37, + "identifier": "assistant-fork-menu-trigger", + "type": "Button", + "ref": "e282" + }, + { + "rect": { + "y": 115.33333325386047, + "width": 85.33332824707031, + "x": 76, + "height": 15.666671752929688 + }, + "label": "Worked for 9s, ended 8:44 PM", + "type": "Button", + "enabled": true, + "parentIndex": 278, + "hittable": false, + "depth": 36, + "index": 282, + "ref": "e283" + }, + { + "depth": 33, + "parentIndex": 71, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "index": 283, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": -138, + "width": 402, + "x": 0, + "height": 30 + }, + "ref": "e284" + }, + { + "rect": { + "y": -138, + "width": 393, + "x": 3, + "height": 3 + }, + "hittable": false, + "type": "Other", + "parentIndex": 283, + "enabled": true, + "index": 284, + "depth": 34, + "ref": "e285" + }, + { + "index": 285, + "parentIndex": 71, + "enabled": true, + "label": "Vertical scroll bar, 12 pages", + "hittable": false, + "value": "0%", + "rect": { + "y": -141, + "width": 30, + "x": 369, + "height": 307 + }, + "depth": 33, + "type": "Other", + "ref": "e286" + }, + { + "depth": 34, + "parentIndex": 285, + "hittable": false, + "type": "Other", + "rect": { + "y": 127, + "width": 3, + "x": 396, + "height": 36 + }, + "index": 286, + "enabled": true, + "ref": "e287" + }, + { + "value": "0%", + "hittable": false, + "rect": { + "y": -141, + "width": 30, + "x": 369, + "height": 307 + }, + "enabled": true, + "index": 287, + "depth": 33, + "label": "Vertical scroll bar, 12 pages", + "type": "Other", + "parentIndex": 71, + "ref": "e288" + }, + { + "index": 288, + "enabled": true, + "hittable": false, + "depth": 34, + "type": "Other", + "parentIndex": 287, + "rect": { + "y": 127, + "width": 3, + "x": 396, + "height": 36 + }, + "ref": "e289" + }, + { + "type": "Other", + "depth": 33, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "rect": { + "y": -138, + "width": 402, + "x": 0, + "height": 30 + }, + "index": 289, + "parentIndex": 71, + "ref": "e290" + }, + { + "depth": 34, + "rect": { + "y": -138, + "width": 393, + "x": 3, + "height": 3 + }, + "parentIndex": 289, + "type": "Other", + "index": 290, + "hittable": false, + "enabled": true, + "ref": "e291" + }, + { + "enabled": true, + "identifier": "composer-viewport-content", + "index": 291, + "label": "Message agent...", + "hittable": false, + "depth": 29, + "type": "Other", + "rect": { + "y": 166, + "width": 402, + "x": 0, + "height": 406 + }, + "parentIndex": 65, + "ref": "e292" + }, + { + "depth": 30, + "parentIndex": 291, + "hittable": false, + "identifier": "message-input-root", + "rect": { + "y": 166, + "width": 370, + "x": 16, + "height": 356 + }, + "type": "Other", + "index": 292, + "enabled": true, + "ref": "e293" + }, + { + "index": 293, + "depth": 30, + "parentIndex": 291, + "type": "Other", + "rect": { + "y": 166, + "width": 370, + "x": 16, + "height": 356 + }, + "hittable": false, + "enabled": true, + "ref": "e294" + }, + { + "enabled": true, + "parentIndex": 291, + "rect": { + "y": 175, + "width": 344, + "x": 29, + "height": 298 + }, + "type": "Other", + "hittable": false, + "index": 294, + "label": "Message agent...", + "depth": 30, + "ref": "e295" + }, + { + "hittable": false, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "index": 295, + "parentIndex": 294, + "enabled": true, + "label": "Message agent...", + "rect": { + "y": 175, + "width": 344, + "x": 29, + "height": 298 + }, + "type": "TextView", + "depth": 31, + "ref": "e296" + }, + { + "parentIndex": 295, + "depth": 32, + "rect": { + "y": 175, + "width": 30, + "x": 340, + "height": 298 + }, + "value": "100%", + "label": "Vertical scroll bar, 2 pages", + "index": 296, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e297" + }, + { + "parentIndex": 296, + "depth": 33, + "rect": { + "y": 245, + "width": 3, + "x": 367, + "height": 225 + }, + "index": 297, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e298" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 440, + "width": 344, + "x": 29, + "height": 30 + }, + "depth": 32, + "index": 298, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 295, + "ref": "e299" + }, + { + "rect": { + "y": 467, + "width": 335, + "x": 32, + "height": 3 + }, + "index": 299, + "enabled": true, + "type": "Other", + "depth": 33, + "hittable": false, + "parentIndex": 298, + "ref": "e300" + }, + { + "type": "Button", + "depth": 30, + "hittable": false, + "index": 300, + "identifier": "message-input-attach-button", + "rect": { + "y": 485, + "width": 28, + "x": 23, + "height": 28 + }, + "enabled": true, + "parentIndex": 291, + "label": "Add attachment", + "ref": "e301" + }, + { + "index": 301, + "enabled": true, + "hittable": false, + "depth": 30, + "parentIndex": 291, + "rect": { + "y": 485, + "width": 232, + "x": 51, + "height": 28 + }, + "type": "Other", + "label": "Select model (Ten second stream)", + "ref": "e302" + }, + { + "parentIndex": 301, + "rect": { + "y": 485, + "width": 202, + "x": 51, + "height": 28 + }, + "index": 302, + "identifier": "combined-model-selector", + "depth": 31, + "type": "Button", + "enabled": true, + "label": "Select model (Ten second stream)", + "hittable": false, + "ref": "e303" + }, + { + "rect": { + "y": 485, + "width": 28, + "x": 283, + "height": 28 + }, + "type": "Image", + "enabled": true, + "label": "Context window 3% used", + "depth": 30, + "identifier": "context-window-meter", + "parentIndex": 291, + "index": 303, + "hittable": false, + "ref": "e304" + }, + { + "parentIndex": 291, + "type": "Button", + "index": 304, + "label": "Start dictation", + "enabled": true, + "hittable": false, + "rect": { + "y": 485, + "width": 28, + "x": 315, + "height": 28 + }, + "depth": 30, + "ref": "e305" + }, + { + "hittable": false, + "rect": { + "y": 485, + "width": 28, + "x": 351, + "height": 28 + }, + "enabled": true, + "parentIndex": 291, + "index": 305, + "depth": 30, + "type": "Button", + "label": "Send message", + "ref": "e306" + }, + { + "index": 306, + "type": "Other", + "enabled": true, + "depth": 11, + "parentIndex": 16, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e307" + }, + { + "index": 307, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 10, + "hittable": false, + "type": "Other", + "depth": 7, + "ref": "e308" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 307, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "index": 308, + "depth": 8, + "ref": "e309" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "depth": 9, + "parentIndex": 308, + "type": "Other", + "index": 309, + "ref": "e310" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Window", + "parentIndex": 0, + "index": 310, + "depth": 1, + "ref": "e311" + }, + { + "hittable": false, + "depth": 2, + "parentIndex": 310, + "type": "Other", + "index": 311, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "ref": "e312" + }, + { + "hittable": false, + "parentIndex": 311, + "type": "Other", + "index": 312, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 3, + "ref": "e313" + }, + { + "type": "Other", + "index": 313, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 336 + }, + "hittable": false, + "parentIndex": 311, + "depth": 3, + "ref": "e314" + }, + { + "parentIndex": 313, + "depth": 4, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 314, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 278 + }, + "ref": "e315" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "label": "Emoji", + "depth": 1, + "enabled": true, + "index": 315, + "parentIndex": 0, + "type": "Window", + "hittable": true, + "ref": "e316" + }, + { + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 2, + "label": "Emoji", + "parentIndex": 315, + "enabled": true, + "index": 316, + "hittable": true, + "ref": "e317" + }, + { + "parentIndex": 316, + "label": "Emoji", + "depth": 3, + "type": "Other", + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 336 + }, + "enabled": true, + "index": 317, + "hittable": true, + "ref": "e318" + }, + { + "type": "Other", + "depth": 4, + "parentIndex": 317, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "enabled": true, + "hittable": false, + "index": 318, + "ref": "e319" + }, + { + "depth": 5, + "hittable": false, + "type": "Other", + "parentIndex": 318, + "enabled": true, + "index": 319, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "ref": "e320" + }, + { + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "enabled": true, + "type": "Other", + "parentIndex": 319, + "depth": 6, + "hittable": false, + "index": 320, + "ref": "e321" + }, + { + "hittable": true, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "index": 321, + "label": "Typing Predictions", + "identifier": "SystemInputAssistantView", + "depth": 4, + "type": "Other", + "parentIndex": 317, + "enabled": true, + "ref": "e322" + }, + { + "label": "Typing Predictions", + "parentIndex": 321, + "index": 322, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "hittable": true, + "type": "Other", + "depth": 5, + "enabled": true, + "ref": "e323" + }, + { + "parentIndex": 322, + "hittable": true, + "label": "Typing Predictions", + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "index": 323, + "depth": 6, + "enabled": true, + "type": "Other", + "identifier": "CenterPageView", + "ref": "e324" + }, + { + "index": 324, + "parentIndex": 323, + "rect": { + "y": -62, + "width": 402, + "x": 0, + "height": 1245 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 7, + "ref": "e325" + }, + { + "type": "ScrollView", + "parentIndex": 324, + "hittable": false, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "depth": 8, + "index": 325, + "ref": "e326" + }, + { + "hittable": true, + "index": 326, + "label": "Typing Predictions", + "depth": 7, + "parentIndex": 323, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "type": "Other", + "ref": "e327" + }, + { + "hittable": true, + "type": "Other", + "index": 327, + "parentIndex": 326, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "depth": 8, + "label": "Typing Predictions", + "enabled": true, + "ref": "e328" + }, + { + "index": 328, + "label": "“thirteen”", + "hittable": true, + "enabled": true, + "depth": 9, + "parentIndex": 327, + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "type": "Other", + "ref": "e329" + }, + { + "hittable": true, + "label": "“thirteen”", + "index": 329, + "type": "Other", + "rect": { + "y": 538, + "width": 402, + "x": 0, + "height": 45 + }, + "enabled": true, + "parentIndex": 328, + "depth": 10, + "ref": "e330" + }, + { + "hittable": true, + "index": 330, + "rect": { + "y": 538, + "width": 134, + "x": 0, + "height": 45 + }, + "enabled": true, + "type": "Other", + "label": "“thirteen”", + "parentIndex": 329, + "depth": 11, + "ref": "e331" + }, + { + "rect": { + "y": 538, + "width": 134, + "x": 134, + "height": 45 + }, + "index": 331, + "enabled": true, + "parentIndex": 329, + "type": "Other", + "label": "this", + "hittable": true, + "depth": 11, + "ref": "e332" + }, + { + "parentIndex": 329, + "hittable": true, + "rect": { + "y": 538, + "width": 134, + "x": 268, + "height": 45 + }, + "index": 332, + "type": "Other", + "depth": 11, + "label": "thinking", + "enabled": true, + "ref": "e333" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 317, + "index": 333, + "depth": 4, + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 233 + }, + "ref": "e334" + }, + { + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 291 + }, + "type": "Other", + "depth": 5, + "parentIndex": 333, + "enabled": true, + "hittable": false, + "index": 334, + "ref": "e335" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 291 + }, + "index": 335, + "parentIndex": 334, + "enabled": true, + "depth": 6, + "ref": "e336" + }, + { + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 291 + }, + "enabled": true, + "depth": 7, + "parentIndex": 335, + "hittable": false, + "index": 336, + "type": "Other", + "ref": "e337" + }, + { + "label": "q", + "type": "Other", + "parentIndex": 317, + "hittable": false, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 233 + }, + "index": 337, + "depth": 4, + "ref": "e338" + }, + { + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 233 + }, + "type": "Keyboard", + "enabled": true, + "parentIndex": 337, + "hittable": false, + "label": "q", + "index": 338, + "depth": 5, + "ref": "e339" + }, + { + "parentIndex": 338, + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 233 + }, + "depth": 6, + "index": 339, + "label": "q", + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e340" + }, + { + "type": "Other", + "index": 340, + "parentIndex": 339, + "hittable": false, + "enabled": true, + "label": "q", + "depth": 7, + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 233 + }, + "identifier": "UIKeyboardLayoutStar Preview", + "ref": "e341" + }, + { + "depth": 8, + "parentIndex": 340, + "enabled": true, + "label": "q", + "hittable": false, + "type": "Key", + "rect": { + "y": 590, + "width": 40.333333333333336, + "x": 0, + "height": 46 + }, + "index": 341, + "ref": "e342" + }, + { + "index": 342, + "parentIndex": 340, + "depth": 8, + "rect": { + "y": 590, + "width": 40.00000000000001, + "x": 40.333333333333336, + "height": 46 + }, + "hittable": false, + "enabled": true, + "type": "Key", + "label": "w", + "ref": "e343" + }, + { + "label": "e", + "depth": 8, + "hittable": false, + "type": "Key", + "rect": { + "y": 590, + "width": 40.33333333333334, + "x": 80.33333333333334, + "height": 46 + }, + "index": 343, + "enabled": true, + "parentIndex": 340, + "ref": "e344" + }, + { + "enabled": true, + "parentIndex": 340, + "type": "Key", + "label": "r", + "rect": { + "y": 590, + "width": 40, + "x": 120.66666666666669, + "height": 46 + }, + "depth": 8, + "hittable": false, + "index": 344, + "ref": "e345" + }, + { + "depth": 8, + "rect": { + "y": 590, + "width": 40.33333333333334, + "x": 160.66666666666669, + "height": 46 + }, + "label": "t", + "hittable": false, + "enabled": true, + "parentIndex": 340, + "type": "Key", + "index": 345, + "ref": "e346" + }, + { + "type": "Key", + "rect": { + "y": 590, + "width": 40.33333333333334, + "x": 201.00000000000003, + "height": 46 + }, + "enabled": true, + "parentIndex": 340, + "depth": 8, + "hittable": false, + "label": "y", + "index": 346, + "ref": "e347" + }, + { + "parentIndex": 340, + "type": "Key", + "depth": 8, + "index": 347, + "label": "u", + "rect": { + "y": 590, + "width": 40, + "x": 241.33333333333337, + "height": 46 + }, + "hittable": false, + "enabled": true, + "ref": "e348" + }, + { + "type": "Key", + "enabled": true, + "rect": { + "y": 590, + "width": 40.333333333333314, + "x": 281.33333333333337, + "height": 46 + }, + "depth": 8, + "hittable": false, + "index": 348, + "parentIndex": 340, + "label": "i", + "ref": "e349" + }, + { + "parentIndex": 340, + "hittable": false, + "enabled": true, + "depth": 8, + "index": 349, + "type": "Key", + "rect": { + "y": 590, + "width": 40, + "x": 321.6666666666667, + "height": 46 + }, + "label": "o", + "ref": "e350" + }, + { + "depth": 8, + "rect": { + "y": 590, + "width": 40.333333333333314, + "x": 361.6666666666667, + "height": 46 + }, + "parentIndex": 340, + "enabled": true, + "label": "p", + "hittable": false, + "index": 350, + "type": "Key", + "ref": "e351" + }, + { + "depth": 8, + "hittable": false, + "index": 351, + "enabled": true, + "parentIndex": 340, + "type": "Key", + "rect": { + "y": 644, + "width": 40.33333333333333, + "x": 19.666666666666668, + "height": 46 + }, + "label": "a", + "ref": "e352" + }, + { + "type": "Key", + "enabled": true, + "rect": { + "y": 644, + "width": 40.33333333333334, + "x": 60, + "height": 46 + }, + "depth": 8, + "hittable": false, + "index": 352, + "parentIndex": 340, + "label": "s", + "ref": "e353" + }, + { + "hittable": false, + "rect": { + "y": 644, + "width": 40, + "x": 100.33333333333334, + "height": 46 + }, + "index": 353, + "type": "Key", + "label": "d", + "parentIndex": 340, + "enabled": true, + "depth": 8, + "ref": "e354" + }, + { + "label": "f", + "depth": 8, + "parentIndex": 340, + "type": "Key", + "enabled": true, + "index": 354, + "hittable": false, + "rect": { + "y": 644, + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46 + }, + "ref": "e355" + }, + { + "enabled": true, + "type": "Key", + "parentIndex": 340, + "hittable": false, + "rect": { + "y": 644, + "width": 40, + "x": 181.2026666666667, + "height": 46 + }, + "label": "g", + "depth": 8, + "index": 355, + "ref": "e356" + }, + { + "depth": 8, + "type": "Key", + "hittable": false, + "rect": { + "y": 644, + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46 + }, + "index": 356, + "enabled": true, + "label": "h", + "parentIndex": 340, + "ref": "e357" + }, + { + "parentIndex": 340, + "label": "j", + "type": "Key", + "index": 357, + "depth": 8, + "rect": { + "y": 644, + "width": 40, + "x": 261.536, + "height": 46 + }, + "enabled": true, + "hittable": false, + "ref": "e358" + }, + { + "type": "Key", + "hittable": false, + "depth": 8, + "label": "k", + "parentIndex": 340, + "index": 358, + "enabled": true, + "rect": { + "y": 644, + "width": 40.333333333333314, + "x": 301.536, + "height": 46 + }, + "ref": "e359" + }, + { + "type": "Key", + "label": "l", + "hittable": false, + "index": 359, + "parentIndex": 340, + "depth": 8, + "rect": { + "y": 644, + "width": 40.333333333333314, + "x": 341.8693333333333, + "height": 46 + }, + "enabled": true, + "ref": "e360" + }, + { + "parentIndex": 340, + "enabled": true, + "rect": { + "y": 698, + "width": 51.333333333333336, + "x": 0, + "height": 46 + }, + "label": "shift", + "type": "Button", + "depth": 8, + "index": 360, + "hittable": false, + "identifier": "shift", + "ref": "e361" + }, + { + "label": "z", + "hittable": false, + "enabled": true, + "depth": 8, + "type": "Key", + "rect": { + "y": 698, + "width": 40.33333333333334, + "x": 60, + "height": 46 + }, + "parentIndex": 340, + "index": 361, + "ref": "e362" + }, + { + "hittable": false, + "rect": { + "y": 698, + "width": 40, + "x": 100.33333333333334, + "height": 46 + }, + "label": "x", + "depth": 8, + "type": "Key", + "enabled": true, + "index": 362, + "parentIndex": 340, + "ref": "e363" + }, + { + "label": "c", + "enabled": true, + "depth": 8, + "hittable": false, + "rect": { + "y": 698, + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46 + }, + "parentIndex": 340, + "type": "Key", + "index": 363, + "ref": "e364" + }, + { + "parentIndex": 340, + "index": 364, + "enabled": true, + "type": "Key", + "hittable": false, + "rect": { + "y": 698, + "width": 40, + "x": 181.2026666666667, + "height": 46 + }, + "label": "v", + "depth": 8, + "ref": "e365" + }, + { + "enabled": true, + "rect": { + "y": 698, + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46 + }, + "index": 365, + "parentIndex": 340, + "type": "Key", + "label": "b", + "depth": 8, + "hittable": false, + "ref": "e366" + }, + { + "enabled": true, + "label": "n", + "rect": { + "y": 698, + "width": 40, + "x": 261.536, + "height": 46 + }, + "index": 366, + "depth": 8, + "type": "Key", + "hittable": false, + "parentIndex": 340, + "ref": "e367" + }, + { + "rect": { + "y": 698, + "width": 40.333333333333314, + "x": 301.536, + "height": 46 + }, + "parentIndex": 340, + "enabled": true, + "depth": 8, + "index": 367, + "label": "m", + "type": "Key", + "hittable": false, + "ref": "e368" + }, + { + "rect": { + "y": 698, + "width": 51.333333333333314, + "x": 350.42133333333334, + "height": 46 + }, + "label": "delete", + "depth": 8, + "hittable": false, + "type": "Key", + "enabled": true, + "index": 368, + "identifier": "delete", + "parentIndex": 340, + "ref": "e369" + }, + { + "hittable": false, + "identifier": "more", + "label": "numbers", + "type": "Key", + "enabled": true, + "rect": { + "y": 752, + "width": 101, + "x": 0, + "height": 46 + }, + "index": 369, + "parentIndex": 340, + "depth": 8, + "ref": "e370" + }, + { + "rect": { + "y": 752, + "width": 201.33333333333334, + "x": 100.33333333333334, + "height": 46 + }, + "type": "Key", + "parentIndex": 340, + "depth": 8, + "identifier": "space", + "hittable": false, + "enabled": true, + "index": 370, + "label": "space", + "ref": "e371" + }, + { + "hittable": false, + "depth": 8, + "index": 371, + "rect": { + "y": 752, + "width": 100.33333333333331, + "x": 301.6666666666667, + "height": 46 + }, + "enabled": true, + "parentIndex": 340, + "type": "Button", + "identifier": "Return", + "label": "return", + "ref": "e372" + }, + { + "type": "Other", + "label": "Emoji", + "parentIndex": 317, + "hittable": true, + "rect": { + "y": 583, + "width": 402, + "x": 0, + "height": 291 + }, + "index": 372, + "enabled": true, + "depth": 4, + "ref": "e373" + }, + { + "hittable": true, + "label": "Emoji", + "parentIndex": 372, + "index": 373, + "depth": 5, + "rect": { + "y": 805.6989567998571, + "width": 68.0852958475086, + "x": 8.47726568115926, + "height": 68.73516393505099 + }, + "enabled": true, + "type": "Button", + "ref": "e374" + }, + { + "rect": { + "y": 805.6989567998571, + "width": 0, + "x": 8.47726568115926, + "height": 0 + }, + "parentIndex": 373, + "depth": 6, + "type": "StaticText", + "hittable": false, + "index": 374, + "enabled": true, + "ref": "e375" + }, + { + "hittable": false, + "depth": 5, + "index": 375, + "identifier": "dictation", + "parentIndex": 372, + "type": "Button", + "label": "Dictate", + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.73516393505099 + }, + "enabled": true, + "ref": "e376" + }, + { + "depth": 6, + "enabled": true, + "type": "StaticText", + "index": 376, + "parentIndex": 375, + "hittable": false, + "rect": { + "y": 805.3656234665239, + "width": 0, + "x": 325.43743847133214, + "height": 0 + }, + "ref": "e377" + }, + { + "label": "Dictate", + "depth": 5, + "parentIndex": 372, + "identifier": "dictation", + "enabled": true, + "hittable": true, + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.73516393505099 + }, + "index": 377, + "type": "Button", + "ref": "e378" + }, + { + "index": 378, + "rect": { + "y": 805.3656234665239, + "width": 0, + "x": 325.43743847133214, + "height": 0 + }, + "type": "StaticText", + "enabled": true, + "parentIndex": 377, + "depth": 6, + "hittable": false, + "ref": "e379" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 379, + "totalNodeCount": 379, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 30, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 30 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 30 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776095 + } +} diff --git a/scroll-regression/ios/chat-scroll-input.json b/scroll-regression/ios/chat-scroll-input.json new file mode 100644 index 0000000000..9b59757fc9 --- /dev/null +++ b/scroll-regression/ios/chat-scroll-input.json @@ -0,0 +1,6535 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "label": "Paseo Debug", + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 0, + "index": 0, + "enabled": true, + "type": "Application", + "ref": "e1" + }, + { + "hittable": false, + "parentIndex": 0, + "type": "Window", + "index": 1, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "depth": 1, + "ref": "e2" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 2, + "parentIndex": 1, + "depth": 2, + "hittable": false, + "ref": "e3" + }, + { + "hittable": false, + "parentIndex": 2, + "depth": 3, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "index": 3, + "type": "Other", + "ref": "e4" + }, + { + "parentIndex": 3, + "index": 4, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 4, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e5" + }, + { + "depth": 1, + "type": "Window", + "index": 5, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 0, + "hittable": false, + "ref": "e6" + }, + { + "enabled": true, + "depth": 2, + "index": 6, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "parentIndex": 5, + "hittable": false, + "ref": "e7" + }, + { + "depth": 3, + "parentIndex": 6, + "enabled": true, + "index": 7, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "ref": "e8" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 7, + "depth": 4, + "type": "Other", + "hittable": false, + "index": 8, + "ref": "e9" + }, + { + "index": 9, + "parentIndex": 8, + "depth": 5, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e10" + }, + { + "depth": 6, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 10, + "type": "Other", + "parentIndex": 9, + "ref": "e11" + }, + { + "depth": 7, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 10, + "enabled": true, + "type": "Other", + "index": 11, + "hittable": false, + "ref": "e12" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 8, + "index": 12, + "parentIndex": 11, + "ref": "e13" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "parentIndex": 12, + "depth": 9, + "index": 13, + "enabled": true, + "type": "Other", + "ref": "e14" + }, + { + "type": "Other", + "hittable": false, + "index": 14, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 12, + "enabled": true, + "depth": 9, + "ref": "e15" + }, + { + "parentIndex": 14, + "enabled": true, + "index": 15, + "type": "Other", + "depth": 10, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "ref": "e16" + }, + { + "hittable": false, + "parentIndex": 14, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "depth": 10, + "index": 16, + "ref": "e17" + }, + { + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 17, + "type": "Other", + "parentIndex": 16, + "depth": 11, + "enabled": true, + "ref": "e18" + }, + { + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 16, + "enabled": true, + "depth": 11, + "index": 18, + "type": "Other", + "ref": "e19" + }, + { + "enabled": true, + "index": 19, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 12, + "type": "Other", + "parentIndex": 18, + "hittable": false, + "ref": "e20" + }, + { + "parentIndex": 19, + "index": 20, + "type": "Other", + "hittable": false, + "depth": 13, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "ref": "e21" + }, + { + "parentIndex": 20, + "index": 21, + "type": "Other", + "hittable": false, + "depth": 14, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "ref": "e22" + }, + { + "parentIndex": 21, + "enabled": true, + "depth": 15, + "hittable": false, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 22, + "ref": "e23" + }, + { + "hittable": false, + "index": 23, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 22, + "enabled": true, + "type": "Other", + "depth": 16, + "ref": "e24" + }, + { + "depth": 17, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 24, + "parentIndex": 23, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e25" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 25, + "type": "Other", + "hittable": false, + "depth": 18, + "parentIndex": 24, + "enabled": true, + "ref": "e26" + }, + { + "type": "Other", + "parentIndex": 25, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 26, + "hittable": false, + "depth": 19, + "ref": "e27" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "parentIndex": 26, + "depth": 20, + "enabled": true, + "index": 27, + "hittable": false, + "ref": "e28" + }, + { + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "label": "Switch tabs (1 open)", + "parentIndex": 27, + "index": 28, + "hittable": false, + "depth": 21, + "ref": "e29" + }, + { + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "index": 29, + "label": "Open menu", + "depth": 22, + "parentIndex": 28, + "hittable": false, + "ref": "e30" + }, + { + "depth": 23, + "index": 30, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "enabled": true, + "label": "Open menu", + "parentIndex": 29, + "type": "Other", + "ref": "e31" + }, + { + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "label": "Open menu", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "type": "Other", + "index": 31, + "hittable": false, + "depth": 24, + "parentIndex": 30, + "ref": "e32" + }, + { + "enabled": true, + "parentIndex": 31, + "hittable": false, + "label": "Open menu", + "index": 32, + "rect": { + "y": 0, + "height": 126, + "width": 402, + "x": 0 + }, + "type": "Other", + "identifier": "composer-dock-header", + "depth": 25, + "ref": "e33" + }, + { + "type": "Other", + "rect": { + "y": 70, + "height": 56, + "width": 402, + "x": 0 + }, + "parentIndex": 32, + "index": 33, + "depth": 26, + "enabled": true, + "hittable": false, + "ref": "e34" + }, + { + "type": "Button", + "hittable": false, + "enabled": true, + "depth": 26, + "parentIndex": 32, + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 8 + }, + "label": "Open menu", + "identifier": "menu-button", + "index": 34, + "ref": "e35" + }, + { + "index": 35, + "label": "main", + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 26, + "parentIndex": 32, + "rect": { + "y": 80.6666669845581, + "height": 34, + "width": 314, + "x": 48 + }, + "ref": "e36" + }, + { + "depth": 27, + "type": "Other", + "enabled": true, + "rect": { + "y": 80.6666669845581, + "height": 34, + "width": 278, + "x": 48 + }, + "hittable": false, + "index": 36, + "parentIndex": 35, + "label": "main", + "ref": "e37" + }, + { + "index": 37, + "depth": 28, + "rect": { + "y": 80.6666669845581, + "height": 18, + "width": 278, + "x": 48 + }, + "parentIndex": 36, + "identifier": "workspace-header-title", + "enabled": true, + "type": "StaticText", + "label": "main", + "hittable": false, + "ref": "e38" + }, + { + "parentIndex": 37, + "hittable": false, + "label": "main", + "index": 38, + "enabled": true, + "rect": { + "y": 80.6666669845581, + "height": 18, + "width": 278, + "x": 48 + }, + "depth": 29, + "type": "StaticText", + "ref": "e39" + }, + { + "depth": 28, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 163.3333282470703, + "x": 48 + }, + "parentIndex": 36, + "index": 39, + "enabled": true, + "identifier": "workspace-header-subtitle", + "type": "StaticText", + "hittable": false, + "label": "composer-dock-ios-fixture", + "ref": "e40" + }, + { + "depth": 29, + "index": 40, + "label": "composer-dock-ios-fixture", + "hittable": false, + "parentIndex": 39, + "type": "StaticText", + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 163.3333282470703, + "x": 48 + }, + "enabled": true, + "ref": "e41" + }, + { + "enabled": true, + "hittable": false, + "index": 41, + "label": "·", + "depth": 28, + "parentIndex": 36, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4, + "x": 217.3333282470703 + }, + "type": "StaticText", + "ref": "e42" + }, + { + "enabled": true, + "rect": { + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4, + "x": 217.3333282470703 + }, + "index": 42, + "depth": 29, + "parentIndex": 41, + "label": "·", + "hittable": false, + "type": "StaticText", + "ref": "e43" + }, + { + "enabled": true, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "index": 43, + "rect": { + "y": 98.6666669845581, + "height": 16, + "width": 68.00001525878906, + "x": 227.3333282470703 + }, + "depth": 28, + "label": "dev-new", + "parentIndex": 36, + "type": "Other", + "hittable": false, + "ref": "e44" + }, + { + "depth": 28, + "rect": { + "y": 100.6666669845581, + "height": 12, + "width": 12, + "x": 227.3333282470703 + }, + "index": 44, + "type": "Other", + "parentIndex": 36, + "hittable": false, + "enabled": true, + "ref": "e45" + }, + { + "parentIndex": 44, + "index": 45, + "type": "Other", + "hittable": false, + "rect": { + "y": 101.1666669845581, + "height": 11, + "width": 11, + "x": 227.8333282470703 + }, + "depth": 29, + "enabled": true, + "ref": "e46" + }, + { + "type": "Other", + "depth": 30, + "index": 46, + "rect": { + "y": 101.1666669845581, + "height": 5, + "width": 11, + "x": 227.8333282470703 + }, + "hittable": false, + "parentIndex": 45, + "enabled": true, + "ref": "e47" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 45, + "depth": 30, + "rect": { + "y": 107.1666669845581, + "height": 5, + "width": 11, + "x": 227.8333282470703 + }, + "index": 47, + "type": "Other", + "ref": "e48" + }, + { + "rect": { + "y": 103.1666669845581, + "height": 1, + "width": 1.0049999999999955, + "x": 229.8333282470703 + }, + "parentIndex": 45, + "depth": 30, + "index": 48, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e49" + }, + { + "rect": { + "y": 109.1666669845581, + "height": 1, + "width": 1.0049999999999955, + "x": 229.8333282470703 + }, + "parentIndex": 45, + "hittable": false, + "enabled": true, + "index": 49, + "depth": 30, + "type": "Other", + "ref": "e50" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906, + "x": 242.3333282470703 + }, + "type": "StaticText", + "label": "dev-new", + "index": 50, + "depth": 28, + "parentIndex": 36, + "ref": "e51" + }, + { + "parentIndex": 50, + "hittable": false, + "rect": { + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906, + "x": 242.3333282470703 + }, + "depth": 29, + "label": "dev-new", + "type": "StaticText", + "index": 51, + "enabled": true, + "ref": "e52" + }, + { + "label": "Workspace actions", + "enabled": true, + "index": 52, + "identifier": "workspace-header-menu-trigger", + "type": "Button", + "hittable": false, + "depth": 27, + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 330 + }, + "parentIndex": 35, + "ref": "e53" + }, + { + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 362 + }, + "label": "Open Explorer sidebar", + "index": 53, + "enabled": true, + "type": "Button", + "depth": 26, + "parentIndex": 32, + "identifier": "workspace-explorer-toggle", + "hittable": false, + "ref": "e54" + }, + { + "depth": 25, + "parentIndex": 31, + "hittable": false, + "type": "Other", + "index": 54, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e55" + }, + { + "enabled": true, + "parentIndex": 31, + "index": 55, + "hittable": false, + "type": "Other", + "depth": 25, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e56" + }, + { + "identifier": "workspace-tab-switcher-trigger", + "parentIndex": 31, + "depth": 25, + "hittable": false, + "enabled": true, + "index": 56, + "label": "Switch tabs (1 open)", + "rect": { + "y": 126, + "height": 34, + "width": 402, + "x": 0 + }, + "type": "Button", + "ref": "e57" + }, + { + "index": 57, + "identifier": "workspace-active-tab-icon", + "enabled": true, + "depth": 26, + "parentIndex": 56, + "hittable": false, + "type": "Other", + "rect": { + "y": 136, + "height": 14, + "width": 14, + "x": 20 + }, + "ref": "e58" + }, + { + "identifier": "workspace-tabs-row", + "enabled": true, + "type": "Other", + "rect": { + "y": 126, + "height": 35, + "width": 402, + "x": 0 + }, + "hittable": false, + "index": 58, + "depth": 25, + "parentIndex": 31, + "ref": "e59" + }, + { + "parentIndex": 31, + "depth": 25, + "index": 59, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "ref": "e60" + }, + { + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "enabled": true, + "type": "Other", + "depth": 25, + "index": 60, + "hittable": false, + "parentIndex": 31, + "ref": "e61" + }, + { + "enabled": true, + "index": 61, + "label": "Add attachment", + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "type": "Other", + "parentIndex": 60, + "depth": 26, + "hittable": false, + "ref": "e62" + }, + { + "hittable": false, + "type": "Other", + "depth": 27, + "index": 62, + "enabled": true, + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "parentIndex": 61, + "ref": "e63" + }, + { + "type": "Other", + "index": 63, + "depth": 27, + "enabled": true, + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "hittable": false, + "parentIndex": 61, + "ref": "e64" + }, + { + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "parentIndex": 61, + "depth": 27, + "enabled": true, + "hittable": false, + "identifier": "composer-viewport", + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "index": 64, + "ref": "e65" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 64, + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 161, + "height": 713, + "width": 402, + "x": 0 + }, + "enabled": true, + "depth": 28, + "index": 65, + "ref": "e66" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "depth": 29, + "type": "Other", + "identifier": "composer-dock-content", + "parentIndex": 65, + "enabled": true, + "index": 66, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "ref": "e67" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "parentIndex": 66, + "index": 67, + "depth": 30, + "ref": "e68" + }, + { + "parentIndex": 66, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 30, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 68, + "ref": "e69" + }, + { + "depth": 31, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "type": "Other", + "index": 69, + "enabled": true, + "hittable": false, + "parentIndex": 68, + "ref": "e70" + }, + { + "depth": 31, + "identifier": "agent-chat-scroll", + "hittable": false, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "parentIndex": 68, + "enabled": true, + "index": 70, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "ref": "e71" + }, + { + "parentIndex": 70, + "label": "Thinking", + "enabled": true, + "depth": 32, + "hittable": false, + "rect": { + "y": 161, + "height": 575, + "width": 402, + "x": 0 + }, + "index": 71, + "type": "ScrollView", + "ref": "e72" + }, + { + "depth": 33, + "hittable": false, + "type": "Other", + "label": "Thinking", + "index": 72, + "parentIndex": 71, + "enabled": true, + "rect": { + "y": -2643, + "height": 3379, + "width": 402, + "x": 0 + }, + "ref": "e73" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "parentIndex": 72, + "type": "Other", + "depth": 34, + "index": 73, + "rect": { + "y": -2643, + "height": 3379, + "width": 402, + "x": 0 + }, + "hittable": false, + "ref": "e74" + }, + { + "depth": 35, + "rect": { + "y": -2643, + "height": 32, + "width": 378, + "x": 12 + }, + "parentIndex": 73, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 74, + "ref": "e75" + }, + { + "rect": { + "y": -2643, + "height": 32, + "width": 378, + "x": 12 + }, + "depth": 36, + "hittable": false, + "index": 75, + "identifier": "older-history-slot", + "type": "Other", + "enabled": true, + "parentIndex": 74, + "ref": "e76" + }, + { + "hittable": false, + "parentIndex": 73, + "index": 76, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -2611, + "height": 570, + "width": 378, + "x": 12 + }, + "enabled": true, + "depth": 35, + "type": "Other", + "ref": "e77" + }, + { + "type": "Other", + "parentIndex": 76, + "depth": 36, + "index": 77, + "identifier": "assistant-message", + "hittable": false, + "enabled": true, + "rect": { + "y": -2611, + "height": 566, + "width": 362, + "x": 20 + }, + "ref": "e78" + }, + { + "type": "Other", + "rect": { + "y": -2599, + "height": 242, + "width": 362, + "x": 20 + }, + "depth": 36, + "hittable": false, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 76, + "index": 78, + "ref": "e79" + }, + { + "rect": { + "y": -2599, + "height": 242, + "width": 362, + "x": 20 + }, + "depth": 37, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "index": 79, + "type": "Other", + "parentIndex": 78, + "ref": "e80" + }, + { + "enabled": true, + "type": "Other", + "index": 80, + "rect": { + "y": -2599, + "height": 242, + "width": 362, + "x": 20 + }, + "parentIndex": 79, + "depth": 38, + "hittable": false, + "ref": "e81" + }, + { + "parentIndex": 79, + "depth": 38, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "type": "TextView", + "index": 81, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "hittable": false, + "ref": "e82" + }, + { + "type": "TextView", + "hittable": false, + "enabled": true, + "index": 82, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "depth": 39, + "rect": { + "y": -2599, + "height": 242, + "width": 362, + "x": 20 + }, + "parentIndex": 81, + "ref": "e83" + }, + { + "enabled": true, + "value": "0%", + "type": "Other", + "parentIndex": 81, + "index": 83, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "rect": { + "y": -2599, + "height": 242, + "width": 30, + "x": 349 + }, + "ref": "e84" + }, + { + "index": 84, + "rect": { + "y": -2638, + "height": 36, + "width": 3, + "x": 376 + }, + "enabled": true, + "parentIndex": 83, + "type": "Other", + "hittable": false, + "depth": 40, + "ref": "e85" + }, + { + "depth": 39, + "rect": { + "y": -2390, + "height": 30, + "width": 362, + "x": 20 + }, + "hittable": false, + "enabled": true, + "index": 85, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "value": "0%", + "parentIndex": 81, + "ref": "e86" + }, + { + "parentIndex": 85, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 86, + "rect": { + "y": -2363, + "height": 3, + "width": 36, + "x": -19 + }, + "depth": 40, + "ref": "e87" + }, + { + "depth": 36, + "index": 87, + "type": "Other", + "rect": { + "y": -2333, + "height": 264, + "width": 362, + "x": 20 + }, + "enabled": true, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 76, + "ref": "e88" + }, + { + "hittable": false, + "depth": 37, + "enabled": true, + "rect": { + "y": -2333, + "height": 264, + "width": 362, + "x": 20 + }, + "index": 88, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 87, + "type": "Other", + "ref": "e89" + }, + { + "index": 89, + "type": "Other", + "rect": { + "y": -2333, + "height": 264, + "width": 362, + "x": 20 + }, + "enabled": true, + "hittable": false, + "depth": 38, + "parentIndex": 88, + "ref": "e90" + }, + { + "index": 90, + "type": "TextView", + "hittable": false, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "parentIndex": 88, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "depth": 38, + "ref": "e91" + }, + { + "index": 91, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "type": "TextView", + "enabled": true, + "depth": 39, + "rect": { + "y": -2333, + "height": 264, + "width": 362, + "x": 20 + }, + "parentIndex": 90, + "ref": "e92" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 90, + "value": "0%", + "index": 92, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -2333, + "height": 264, + "width": 30, + "x": 349 + }, + "hittable": false, + "depth": 39, + "ref": "e93" + }, + { + "index": 93, + "rect": { + "y": -2372, + "height": 36, + "width": 3, + "x": 376 + }, + "enabled": true, + "parentIndex": 92, + "depth": 40, + "hittable": false, + "type": "Other", + "ref": "e94" + }, + { + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "index": 94, + "rect": { + "y": -2102, + "height": 30, + "width": 362, + "x": 20 + }, + "parentIndex": 90, + "enabled": true, + "ref": "e95" + }, + { + "enabled": true, + "index": 95, + "rect": { + "y": -2075, + "height": 3, + "width": 36, + "x": -19 + }, + "parentIndex": 94, + "type": "Other", + "depth": 40, + "hittable": false, + "ref": "e96" + }, + { + "enabled": true, + "index": 96, + "hittable": false, + "label": "Thinking", + "type": "Other", + "parentIndex": 73, + "depth": 35, + "rect": { + "y": -2041, + "height": 32, + "width": 378, + "x": 12 + }, + "ref": "e97" + }, + { + "index": 97, + "hittable": false, + "identifier": "tool-call-badge", + "parentIndex": 96, + "depth": 36, + "rect": { + "y": -2041, + "height": 32, + "width": 388, + "x": 7 + }, + "enabled": true, + "type": "Other", + "ref": "e98" + }, + { + "label": "Thinking", + "type": "Button", + "hittable": false, + "depth": 36, + "index": 98, + "parentIndex": 96, + "rect": { + "y": -2041, + "height": 32, + "width": 388, + "x": 7 + }, + "enabled": true, + "ref": "e99" + }, + { + "hittable": false, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -2009, + "height": 32, + "width": 378, + "x": 12 + }, + "parentIndex": 73, + "index": 99, + "enabled": true, + "depth": 35, + "type": "Other", + "ref": "e100" + }, + { + "index": 100, + "parentIndex": 99, + "identifier": "tool-call-badge", + "rect": { + "y": -2009, + "height": 32, + "width": 388, + "x": 7 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 36, + "ref": "e101" + }, + { + "index": 101, + "parentIndex": 99, + "hittable": false, + "type": "Button", + "enabled": true, + "depth": 36, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -2009, + "height": 32, + "width": 388, + "x": 7 + }, + "ref": "e102" + }, + { + "parentIndex": 101, + "label": "Read", + "hittable": false, + "depth": 37, + "type": "Other", + "index": 102, + "enabled": true, + "rect": { + "y": -2002, + "height": 18, + "width": 344, + "x": 42 + }, + "ref": "e103" + }, + { + "depth": 38, + "index": 103, + "type": "StaticText", + "enabled": true, + "label": "Read", + "rect": { + "y": -2002, + "height": 18, + "width": 35, + "x": 42 + }, + "parentIndex": 102, + "hittable": false, + "ref": "e104" + }, + { + "index": 104, + "depth": 39, + "type": "StaticText", + "label": "Read", + "rect": { + "y": -2002, + "height": 18, + "width": 35, + "x": 42 + }, + "parentIndex": 103, + "hittable": false, + "enabled": true, + "ref": "e105" + }, + { + "index": 105, + "parentIndex": 102, + "label": "packages/app/src/components/conversation-list.tsx", + "hittable": false, + "type": "StaticText", + "enabled": true, + "depth": 38, + "rect": { + "y": -2002, + "height": 18, + "width": 301, + "x": 85 + }, + "ref": "e106" + }, + { + "hittable": false, + "parentIndex": 105, + "enabled": true, + "type": "StaticText", + "index": 106, + "depth": 39, + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -2002, + "height": 18, + "width": 301, + "x": 85 + }, + "ref": "e107" + }, + { + "type": "Other", + "index": 107, + "parentIndex": 73, + "label": "Search, scrollToEnd", + "rect": { + "y": -1977, + "height": 36, + "width": 378, + "x": 12 + }, + "enabled": true, + "depth": 35, + "hittable": false, + "ref": "e108" + }, + { + "enabled": true, + "parentIndex": 107, + "type": "Other", + "depth": 36, + "index": 108, + "rect": { + "y": -1977, + "height": 32, + "width": 388, + "x": 7 + }, + "hittable": false, + "identifier": "tool-call-badge", + "ref": "e109" + }, + { + "index": 109, + "hittable": false, + "type": "Button", + "enabled": true, + "label": "Search, scrollToEnd", + "rect": { + "y": -1977, + "height": 32, + "width": 388, + "x": 7 + }, + "depth": 36, + "parentIndex": 107, + "ref": "e110" + }, + { + "depth": 35, + "type": "Other", + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -1941, + "height": 646, + "width": 378, + "x": 12 + }, + "enabled": true, + "parentIndex": 73, + "index": 110, + "ref": "e111" + }, + { + "hittable": false, + "index": 111, + "enabled": true, + "depth": 36, + "identifier": "assistant-message", + "rect": { + "y": -1941, + "height": 642, + "width": 362, + "x": 20 + }, + "type": "Other", + "parentIndex": 110, + "ref": "e112" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -1929, + "height": 132, + "width": 362, + "x": 20 + }, + "type": "Other", + "index": 112, + "enabled": true, + "parentIndex": 110, + "depth": 36, + "hittable": false, + "ref": "e113" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 112, + "rect": { + "y": -1929, + "height": 132, + "width": 362, + "x": 20 + }, + "enabled": true, + "type": "Other", + "depth": 37, + "index": 113, + "hittable": false, + "ref": "e114" + }, + { + "hittable": false, + "parentIndex": 113, + "type": "Other", + "depth": 38, + "index": 114, + "rect": { + "y": -1929, + "height": 132, + "width": 362, + "x": 20 + }, + "enabled": true, + "ref": "e115" + }, + { + "depth": 38, + "type": "TextView", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "parentIndex": 113, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "index": 115, + "enabled": true, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e116" + }, + { + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -1929, + "height": 132, + "width": 362, + "x": 20 + }, + "parentIndex": 115, + "depth": 39, + "hittable": false, + "index": 116, + "type": "TextView", + "ref": "e117" + }, + { + "index": 117, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "hittable": false, + "enabled": true, + "depth": 39, + "parentIndex": 115, + "rect": { + "y": -1929, + "height": 132, + "width": 30, + "x": 349 + }, + "ref": "e118" + }, + { + "type": "Other", + "index": 118, + "hittable": false, + "depth": 40, + "parentIndex": 117, + "rect": { + "y": -1968, + "height": 36, + "width": 3, + "x": 376 + }, + "enabled": true, + "ref": "e119" + }, + { + "index": 119, + "depth": 39, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 115, + "type": "Other", + "value": "0%", + "hittable": false, + "rect": { + "y": -1830, + "height": 30, + "width": 362, + "x": 20 + }, + "ref": "e120" + }, + { + "enabled": true, + "index": 120, + "rect": { + "y": -1803, + "height": 3, + "width": 36, + "x": -19 + }, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 119, + "ref": "e121" + }, + { + "label": "•", + "index": 121, + "enabled": true, + "type": "StaticText", + "parentIndex": 110, + "hittable": false, + "depth": 36, + "rect": { + "y": -1769, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "ref": "e122" + }, + { + "label": "•", + "rect": { + "y": -1769, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "depth": 37, + "enabled": true, + "hittable": false, + "parentIndex": 121, + "index": 122, + "type": "StaticText", + "ref": "e123" + }, + { + "rect": { + "y": -1769, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "Other", + "hittable": false, + "depth": 36, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 123, + "parentIndex": 110, + "enabled": true, + "ref": "e124" + }, + { + "parentIndex": 123, + "type": "Other", + "rect": { + "y": -1769, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "index": 124, + "enabled": true, + "hittable": false, + "depth": 37, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e125" + }, + { + "depth": 38, + "rect": { + "y": -1769, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 125, + "parentIndex": 124, + "ref": "e126" + }, + { + "type": "TextView", + "hittable": false, + "depth": 38, + "parentIndex": 124, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 126, + "ref": "e127" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 127, + "type": "TextView", + "enabled": true, + "rect": { + "y": -1769, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 39, + "parentIndex": 126, + "ref": "e128" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 128, + "enabled": true, + "value": "0%", + "rect": { + "y": -1769, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "depth": 39, + "parentIndex": 126, + "type": "Other", + "ref": "e129" + }, + { + "index": 129, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 128, + "depth": 40, + "rect": { + "y": -1808, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "ref": "e130" + }, + { + "depth": 39, + "value": "0%", + "parentIndex": 126, + "enabled": true, + "rect": { + "y": -1714, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "index": 130, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "ref": "e131" + }, + { + "type": "Other", + "depth": 40, + "index": 131, + "enabled": true, + "parentIndex": 130, + "rect": { + "y": -1687, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "hittable": false, + "ref": "e132" + }, + { + "parentIndex": 110, + "rect": { + "y": -1677, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "hittable": false, + "index": 132, + "enabled": true, + "depth": 36, + "type": "StaticText", + "label": "•", + "ref": "e133" + }, + { + "enabled": true, + "rect": { + "y": -1677, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "index": 133, + "depth": 37, + "parentIndex": 132, + "hittable": false, + "type": "StaticText", + "label": "•", + "ref": "e134" + }, + { + "parentIndex": 110, + "rect": { + "y": -1677, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "index": 134, + "type": "Other", + "depth": 36, + "enabled": true, + "ref": "e135" + }, + { + "index": 135, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "y": -1677, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "parentIndex": 134, + "depth": 37, + "ref": "e136" + }, + { + "type": "Other", + "parentIndex": 135, + "index": 136, + "depth": 38, + "enabled": true, + "rect": { + "y": -1677, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "ref": "e137" + }, + { + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 137, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 135, + "type": "TextView", + "depth": 38, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "hittable": false, + "ref": "e138" + }, + { + "rect": { + "y": -1677, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 39, + "parentIndex": 137, + "index": 138, + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "ref": "e139" + }, + { + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "index": 139, + "type": "Other", + "hittable": false, + "parentIndex": 137, + "enabled": true, + "rect": { + "y": -1677, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "ref": "e140" + }, + { + "enabled": true, + "hittable": false, + "index": 140, + "rect": { + "y": -1716, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "depth": 40, + "type": "Other", + "parentIndex": 139, + "ref": "e141" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -1622, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "value": "0%", + "enabled": true, + "type": "Other", + "depth": 39, + "parentIndex": 137, + "index": 141, + "ref": "e142" + }, + { + "depth": 40, + "type": "Other", + "enabled": true, + "parentIndex": 141, + "hittable": false, + "index": 142, + "rect": { + "y": -1595, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "ref": "e143" + }, + { + "depth": 36, + "rect": { + "y": -1585, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "label": "•", + "type": "StaticText", + "parentIndex": 110, + "index": 143, + "hittable": false, + "enabled": true, + "ref": "e144" + }, + { + "depth": 37, + "hittable": false, + "index": 144, + "label": "•", + "enabled": true, + "parentIndex": 143, + "rect": { + "y": -1585, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "type": "StaticText", + "ref": "e145" + }, + { + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -1585, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "enabled": true, + "depth": 36, + "hittable": false, + "index": 145, + "parentIndex": 110, + "ref": "e146" + }, + { + "rect": { + "y": -1585, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "index": 146, + "parentIndex": 145, + "enabled": true, + "depth": 37, + "type": "Other", + "ref": "e147" + }, + { + "depth": 38, + "type": "Other", + "hittable": false, + "parentIndex": 146, + "rect": { + "y": -1585, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "index": 147, + "enabled": true, + "ref": "e148" + }, + { + "index": 148, + "parentIndex": 146, + "type": "TextView", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 38, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "ref": "e149" + }, + { + "enabled": true, + "index": 149, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "parentIndex": 148, + "rect": { + "y": -1585, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 39, + "ref": "e150" + }, + { + "index": 150, + "parentIndex": 148, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "type": "Other", + "value": "0%", + "enabled": true, + "rect": { + "y": -1585, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "ref": "e151" + }, + { + "index": 151, + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "rect": { + "y": -1624, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "parentIndex": 150, + "ref": "e152" + }, + { + "value": "0%", + "rect": { + "y": -1530, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "enabled": true, + "hittable": false, + "parentIndex": 148, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "index": 152, + "type": "Other", + "ref": "e153" + }, + { + "rect": { + "y": -1503, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "parentIndex": 152, + "depth": 40, + "index": 153, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e154" + }, + { + "index": 154, + "hittable": false, + "depth": 36, + "parentIndex": 110, + "label": "•", + "type": "StaticText", + "enabled": true, + "rect": { + "y": -1493, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "ref": "e155" + }, + { + "hittable": false, + "rect": { + "y": -1493, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "index": 155, + "label": "•", + "depth": 37, + "parentIndex": 154, + "type": "StaticText", + "enabled": true, + "ref": "e156" + }, + { + "rect": { + "y": -1493, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "enabled": true, + "parentIndex": 110, + "index": 156, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "Other", + "depth": 36, + "ref": "e157" + }, + { + "parentIndex": 156, + "hittable": false, + "depth": 37, + "type": "Other", + "rect": { + "y": -1493, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "index": 157, + "ref": "e158" + }, + { + "index": 158, + "type": "Other", + "rect": { + "y": -1493, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 38, + "enabled": true, + "parentIndex": 157, + "ref": "e159" + }, + { + "enabled": true, + "type": "TextView", + "parentIndex": 157, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "depth": 38, + "index": 159, + "ref": "e160" + }, + { + "type": "TextView", + "rect": { + "y": -1493, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "depth": 39, + "index": 160, + "parentIndex": 159, + "hittable": false, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e161" + }, + { + "rect": { + "y": -1493, + "height": 66, + "width": 30, + "x": 349.00000063578284 + }, + "depth": 39, + "parentIndex": 159, + "index": 161, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e162" + }, + { + "depth": 40, + "parentIndex": 161, + "index": 162, + "type": "Other", + "rect": { + "y": -1532, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "enabled": true, + "hittable": false, + "ref": "e163" + }, + { + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -1460, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "parentIndex": 159, + "hittable": false, + "depth": 39, + "index": 163, + "value": "0%", + "ref": "e164" + }, + { + "depth": 40, + "index": 164, + "type": "Other", + "rect": { + "y": -1433, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "parentIndex": 163, + "enabled": true, + "hittable": false, + "ref": "e165" + }, + { + "index": 165, + "rect": { + "y": -1411, + "height": 88, + "width": 362, + "x": 20 + }, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 36, + "hittable": false, + "type": "Other", + "parentIndex": 110, + "ref": "e166" + }, + { + "index": 166, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -1411, + "height": 88, + "width": 362, + "x": 20 + }, + "depth": 37, + "parentIndex": 165, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e167" + }, + { + "type": "Other", + "index": 167, + "depth": 38, + "rect": { + "y": -1411, + "height": 88, + "width": 362, + "x": 20 + }, + "enabled": true, + "hittable": false, + "parentIndex": 166, + "ref": "e168" + }, + { + "hittable": false, + "parentIndex": 166, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 168, + "depth": 38, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "enabled": true, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "ref": "e169" + }, + { + "enabled": true, + "index": 169, + "rect": { + "y": -1411, + "height": 88, + "width": 362, + "x": 20 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 168, + "hittable": false, + "depth": 39, + "type": "TextView", + "ref": "e170" + }, + { + "enabled": true, + "type": "Other", + "index": 170, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 168, + "depth": 39, + "value": "0%", + "rect": { + "y": -1411, + "height": 88, + "width": 30, + "x": 349 + }, + "ref": "e171" + }, + { + "depth": 40, + "rect": { + "y": -1450, + "height": 36, + "width": 3, + "x": 376 + }, + "hittable": false, + "index": 171, + "type": "Other", + "parentIndex": 170, + "enabled": true, + "ref": "e172" + }, + { + "value": "0%", + "rect": { + "y": -1356, + "height": 30, + "width": 362, + "x": 20 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 172, + "parentIndex": 168, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "ref": "e173" + }, + { + "enabled": true, + "index": 173, + "parentIndex": 172, + "depth": 40, + "rect": { + "y": -1329, + "height": 3, + "width": 36, + "x": -19 + }, + "hittable": false, + "type": "Other", + "ref": "e174" + }, + { + "enabled": true, + "rect": { + "y": -1295, + "height": 32, + "width": 378, + "x": 12 + }, + "depth": 35, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "index": 174, + "parentIndex": 73, + "hittable": false, + "type": "Other", + "ref": "e175" + }, + { + "type": "Other", + "depth": 36, + "parentIndex": 174, + "identifier": "tool-call-badge", + "enabled": true, + "rect": { + "y": -1295, + "height": 32, + "width": 388, + "x": 7 + }, + "index": 175, + "hittable": false, + "ref": "e176" + }, + { + "type": "Button", + "rect": { + "y": -1295, + "height": 32, + "width": 388, + "x": 7 + }, + "hittable": false, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "index": 176, + "depth": 36, + "parentIndex": 174, + "enabled": true, + "ref": "e177" + }, + { + "type": "Other", + "enabled": true, + "index": 177, + "depth": 35, + "rect": { + "y": -1263, + "height": 36, + "width": 378, + "x": 12 + }, + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "parentIndex": 73, + "ref": "e178" + }, + { + "enabled": true, + "parentIndex": 177, + "index": 178, + "identifier": "tool-call-badge", + "hittable": false, + "type": "Other", + "rect": { + "y": -1263, + "height": 32, + "width": 388, + "x": 7 + }, + "depth": 36, + "ref": "e179" + }, + { + "type": "Button", + "index": 179, + "enabled": true, + "depth": 36, + "parentIndex": 177, + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -1263, + "height": 32, + "width": 388, + "x": 7 + }, + "ref": "e180" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 73, + "index": 180, + "type": "Other", + "hittable": false, + "rect": { + "y": -1227, + "height": 570, + "width": 378, + "x": 12 + }, + "depth": 35, + "enabled": true, + "ref": "e181" + }, + { + "type": "Other", + "hittable": false, + "depth": 36, + "identifier": "assistant-message", + "parentIndex": 180, + "enabled": true, + "rect": { + "y": -1227, + "height": 566, + "width": 362, + "x": 20 + }, + "index": 181, + "ref": "e182" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 182, + "rect": { + "y": -1215, + "height": 242, + "width": 362, + "x": 20 + }, + "hittable": false, + "enabled": true, + "depth": 36, + "parentIndex": 180, + "type": "Other", + "ref": "e183" + }, + { + "rect": { + "y": -1215, + "height": 242, + "width": 362, + "x": 20 + }, + "index": 183, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 182, + "depth": 37, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e184" + }, + { + "rect": { + "y": -1215, + "height": 242, + "width": 362, + "x": 20 + }, + "type": "Other", + "enabled": true, + "index": 184, + "parentIndex": 183, + "hittable": false, + "depth": 38, + "ref": "e185" + }, + { + "parentIndex": 183, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "type": "TextView", + "index": 185, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e186" + }, + { + "enabled": true, + "type": "TextView", + "parentIndex": 185, + "depth": 39, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "index": 186, + "rect": { + "y": -1215, + "height": 242, + "width": 362, + "x": 20 + }, + "hittable": false, + "ref": "e187" + }, + { + "label": "Vertical scroll bar, 1 page", + "index": 187, + "depth": 39, + "parentIndex": 185, + "hittable": false, + "enabled": true, + "value": "0%", + "type": "Other", + "rect": { + "y": -1215, + "height": 242, + "width": 30, + "x": 349 + }, + "ref": "e188" + }, + { + "parentIndex": 187, + "enabled": true, + "rect": { + "y": -1254, + "height": 36, + "width": 3, + "x": 376 + }, + "index": 188, + "type": "Other", + "hittable": false, + "depth": 40, + "ref": "e189" + }, + { + "parentIndex": 185, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "index": 189, + "hittable": false, + "enabled": true, + "type": "Other", + "value": "0%", + "rect": { + "y": -1006, + "height": 30, + "width": 362, + "x": 20 + }, + "ref": "e190" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": -979, + "height": 3, + "width": 36, + "x": -19 + }, + "parentIndex": 189, + "index": 190, + "hittable": false, + "depth": 40, + "ref": "e191" + }, + { + "hittable": false, + "parentIndex": 180, + "index": 191, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "rect": { + "y": -949, + "height": 264, + "width": 362, + "x": 20 + }, + "depth": 36, + "type": "Other", + "ref": "e192" + }, + { + "index": 192, + "hittable": false, + "rect": { + "y": -949, + "height": 264, + "width": 362, + "x": 20 + }, + "enabled": true, + "depth": 37, + "parentIndex": 191, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "Other", + "ref": "e193" + }, + { + "rect": { + "y": -949, + "height": 264, + "width": 362, + "x": 20 + }, + "index": 193, + "enabled": true, + "parentIndex": 192, + "depth": 38, + "type": "Other", + "hittable": false, + "ref": "e194" + }, + { + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "TextView", + "enabled": true, + "depth": 38, + "parentIndex": 192, + "index": 194, + "ref": "e195" + }, + { + "index": 195, + "hittable": false, + "enabled": true, + "rect": { + "y": -949, + "height": 264, + "width": 362, + "x": 20 + }, + "type": "TextView", + "depth": 39, + "parentIndex": 194, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "ref": "e196" + }, + { + "hittable": false, + "type": "Other", + "index": 196, + "parentIndex": 194, + "value": "0%", + "rect": { + "y": -949, + "height": 264, + "width": 30, + "x": 349 + }, + "enabled": true, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "ref": "e197" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 196, + "type": "Other", + "index": 197, + "rect": { + "y": -988, + "height": 36, + "width": 3, + "x": 376 + }, + "depth": 40, + "ref": "e198" + }, + { + "value": "0%", + "hittable": false, + "parentIndex": 194, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "rect": { + "y": -718, + "height": 30, + "width": 362, + "x": 20 + }, + "index": 198, + "enabled": true, + "ref": "e199" + }, + { + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": -691, + "height": 3, + "width": 36, + "x": -19 + }, + "parentIndex": 198, + "index": 199, + "ref": "e200" + }, + { + "rect": { + "y": -657, + "height": 32, + "width": 378, + "x": 12 + }, + "index": 200, + "depth": 35, + "parentIndex": 73, + "enabled": true, + "label": "Thinking", + "hittable": false, + "type": "Other", + "ref": "e201" + }, + { + "parentIndex": 200, + "type": "Other", + "enabled": true, + "depth": 36, + "identifier": "tool-call-badge", + "rect": { + "y": -657, + "height": 32, + "width": 388, + "x": 7 + }, + "index": 201, + "hittable": false, + "ref": "e202" + }, + { + "label": "Thinking", + "index": 202, + "rect": { + "y": -657, + "height": 32, + "width": 388, + "x": 7 + }, + "enabled": true, + "depth": 36, + "parentIndex": 200, + "hittable": false, + "type": "Button", + "ref": "e203" + }, + { + "type": "Other", + "label": "Read, packages/app/src/components/conversation-list.tsx", + "depth": 35, + "hittable": false, + "index": 203, + "enabled": true, + "parentIndex": 73, + "rect": { + "y": -625, + "height": 32, + "width": 378, + "x": 12 + }, + "ref": "e204" + }, + { + "index": 204, + "hittable": false, + "identifier": "tool-call-badge", + "enabled": true, + "type": "Other", + "depth": 36, + "rect": { + "y": -625, + "height": 32, + "width": 388, + "x": 7 + }, + "parentIndex": 203, + "ref": "e205" + }, + { + "hittable": false, + "rect": { + "y": -625, + "height": 32, + "width": 388, + "x": 7 + }, + "parentIndex": 203, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "type": "Button", + "enabled": true, + "depth": 36, + "index": 205, + "ref": "e206" + }, + { + "index": 206, + "depth": 35, + "enabled": true, + "rect": { + "y": -593, + "height": 36, + "width": 378, + "x": 12 + }, + "label": "Search, scrollToEnd", + "parentIndex": 73, + "hittable": false, + "type": "Other", + "ref": "e207" + }, + { + "hittable": false, + "identifier": "tool-call-badge", + "type": "Other", + "enabled": true, + "parentIndex": 206, + "index": 207, + "rect": { + "y": -593, + "height": 32, + "width": 388, + "x": 7 + }, + "depth": 36, + "ref": "e208" + }, + { + "enabled": true, + "index": 208, + "label": "Search, scrollToEnd", + "parentIndex": 206, + "hittable": false, + "type": "Button", + "rect": { + "y": -593, + "height": 32, + "width": 388, + "x": 7 + }, + "depth": 36, + "ref": "e209" + }, + { + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "parentIndex": 73, + "index": 209, + "hittable": false, + "rect": { + "y": -557, + "height": 646, + "width": 378, + "x": 12 + }, + "depth": 35, + "ref": "e210" + }, + { + "rect": { + "y": -557, + "height": 642, + "width": 362, + "x": 20 + }, + "type": "Other", + "index": 210, + "depth": 36, + "parentIndex": 209, + "identifier": "assistant-message", + "hittable": false, + "enabled": true, + "ref": "e211" + }, + { + "hittable": false, + "depth": 36, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -545, + "height": 132, + "width": 362, + "x": 20 + }, + "index": 211, + "enabled": true, + "parentIndex": 209, + "type": "Other", + "ref": "e212" + }, + { + "index": 212, + "type": "Other", + "enabled": true, + "rect": { + "y": -545, + "height": 132, + "width": 362, + "x": 20 + }, + "hittable": false, + "depth": 37, + "parentIndex": 211, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e213" + }, + { + "enabled": true, + "depth": 38, + "rect": { + "y": -545, + "height": 132, + "width": 362, + "x": 20 + }, + "hittable": false, + "parentIndex": 212, + "index": 213, + "type": "Other", + "ref": "e214" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "depth": 38, + "parentIndex": 212, + "hittable": false, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "index": 214, + "ref": "e215" + }, + { + "depth": 39, + "parentIndex": 214, + "rect": { + "y": -545, + "height": 132, + "width": 362, + "x": 20 + }, + "index": 215, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "enabled": true, + "ref": "e216" + }, + { + "rect": { + "y": -545, + "height": 132, + "width": 30, + "x": 349 + }, + "value": "0%", + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "index": 216, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 214, + "ref": "e217" + }, + { + "enabled": true, + "hittable": false, + "index": 217, + "depth": 40, + "type": "Other", + "parentIndex": 216, + "rect": { + "y": -584, + "height": 36, + "width": 3, + "x": 376 + }, + "ref": "e218" + }, + { + "value": "0%", + "index": 218, + "type": "Other", + "enabled": true, + "rect": { + "y": -446, + "height": 30, + "width": 362, + "x": 20 + }, + "hittable": false, + "parentIndex": 214, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "ref": "e219" + }, + { + "index": 219, + "type": "Other", + "rect": { + "y": -419, + "height": 3, + "width": 36, + "x": -19 + }, + "enabled": true, + "hittable": false, + "parentIndex": 218, + "depth": 40, + "ref": "e220" + }, + { + "enabled": true, + "index": 220, + "rect": { + "y": -385, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "label": "•", + "hittable": false, + "type": "StaticText", + "parentIndex": 209, + "depth": 36, + "ref": "e221" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "rect": { + "y": -385, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "parentIndex": 220, + "index": 221, + "depth": 37, + "label": "•", + "ref": "e222" + }, + { + "rect": { + "y": -385, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "index": 222, + "type": "Other", + "depth": 36, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "parentIndex": 209, + "ref": "e223" + }, + { + "type": "Other", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "parentIndex": 222, + "index": 223, + "rect": { + "y": -385, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "depth": 37, + "ref": "e224" + }, + { + "enabled": true, + "rect": { + "y": -385, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "Other", + "depth": 38, + "hittable": false, + "parentIndex": 223, + "index": 224, + "ref": "e225" + }, + { + "enabled": true, + "index": 225, + "type": "TextView", + "parentIndex": 223, + "hittable": false, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 38, + "ref": "e226" + }, + { + "hittable": false, + "rect": { + "y": -385, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "index": 226, + "enabled": true, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 225, + "depth": 39, + "ref": "e227" + }, + { + "depth": 39, + "parentIndex": 225, + "rect": { + "y": -385, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "type": "Other", + "enabled": true, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "index": 227, + "ref": "e228" + }, + { + "type": "Other", + "depth": 40, + "rect": { + "y": -424, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "hittable": false, + "parentIndex": 227, + "enabled": true, + "index": 228, + "ref": "e229" + }, + { + "type": "Other", + "depth": 39, + "index": 229, + "parentIndex": 225, + "hittable": false, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -330, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "value": "0%", + "ref": "e230" + }, + { + "rect": { + "y": -303, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "parentIndex": 229, + "index": 230, + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e231" + }, + { + "hittable": false, + "enabled": true, + "index": 231, + "depth": 36, + "parentIndex": 209, + "label": "•", + "rect": { + "y": -293, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "type": "StaticText", + "ref": "e232" + }, + { + "hittable": false, + "index": 232, + "enabled": true, + "depth": 37, + "type": "StaticText", + "rect": { + "y": -293, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "label": "•", + "parentIndex": 231, + "ref": "e233" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 233, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 36, + "rect": { + "y": -293, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "parentIndex": 209, + "ref": "e234" + }, + { + "index": 234, + "rect": { + "y": -293, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "enabled": true, + "depth": 37, + "parentIndex": 233, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "ref": "e235" + }, + { + "enabled": true, + "rect": { + "y": -293, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "parentIndex": 234, + "depth": 38, + "type": "Other", + "index": 235, + "hittable": false, + "ref": "e236" + }, + { + "depth": 38, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 234, + "enabled": true, + "type": "TextView", + "hittable": false, + "index": 236, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e237" + }, + { + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": -293, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "parentIndex": 236, + "enabled": true, + "hittable": false, + "index": 237, + "depth": 39, + "ref": "e238" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 236, + "enabled": true, + "depth": 39, + "hittable": false, + "type": "Other", + "value": "0%", + "rect": { + "y": -293, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "index": 238, + "ref": "e239" + }, + { + "parentIndex": 238, + "type": "Other", + "depth": 40, + "hittable": false, + "enabled": true, + "index": 239, + "rect": { + "y": -332, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "ref": "e240" + }, + { + "index": 240, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "enabled": true, + "rect": { + "y": -238, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "Other", + "parentIndex": 236, + "hittable": false, + "ref": "e241" + }, + { + "parentIndex": 240, + "index": 241, + "rect": { + "y": -211, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e242" + }, + { + "hittable": false, + "type": "StaticText", + "parentIndex": 209, + "index": 242, + "enabled": true, + "depth": 36, + "label": "•", + "rect": { + "y": -201, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "ref": "e243" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 242, + "rect": { + "y": -201, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "type": "StaticText", + "depth": 37, + "index": 243, + "label": "•", + "ref": "e244" + }, + { + "parentIndex": 209, + "type": "Other", + "depth": 36, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": -201, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "index": 244, + "ref": "e245" + }, + { + "type": "Other", + "index": 245, + "rect": { + "y": -201, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "enabled": true, + "depth": 37, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 244, + "ref": "e246" + }, + { + "hittable": false, + "index": 246, + "rect": { + "y": -201, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "enabled": true, + "parentIndex": 245, + "depth": 38, + "type": "Other", + "ref": "e247" + }, + { + "enabled": true, + "index": 247, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "TextView", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "hittable": false, + "parentIndex": 245, + "depth": 38, + "ref": "e248" + }, + { + "index": 248, + "type": "TextView", + "rect": { + "y": -201, + "height": 88, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 247, + "enabled": true, + "depth": 39, + "hittable": false, + "ref": "e249" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": -201, + "height": 88, + "width": 30, + "x": 349.00000063578284 + }, + "index": 249, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 247, + "value": "0%", + "ref": "e250" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": -240, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "enabled": true, + "parentIndex": 249, + "depth": 40, + "index": 250, + "ref": "e251" + }, + { + "parentIndex": 247, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "index": 251, + "rect": { + "y": -146, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "ref": "e252" + }, + { + "enabled": true, + "type": "Other", + "index": 252, + "hittable": false, + "depth": 40, + "rect": { + "y": -119, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "parentIndex": 251, + "ref": "e253" + }, + { + "rect": { + "y": -109, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "hittable": false, + "parentIndex": 209, + "label": "•", + "depth": 36, + "enabled": true, + "type": "StaticText", + "index": 253, + "ref": "e254" + }, + { + "enabled": true, + "hittable": false, + "depth": 37, + "index": 254, + "label": "•", + "type": "StaticText", + "parentIndex": 253, + "rect": { + "y": -109, + "height": 22, + "width": 7.333332061767578, + "x": 30 + }, + "ref": "e255" + }, + { + "rect": { + "y": -109, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "Other", + "parentIndex": 209, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "enabled": true, + "depth": 36, + "index": 255, + "ref": "e256" + }, + { + "enabled": true, + "rect": { + "y": -109, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "depth": 37, + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 256, + "type": "Other", + "parentIndex": 255, + "ref": "e257" + }, + { + "enabled": true, + "hittable": false, + "index": 257, + "parentIndex": 256, + "depth": 38, + "rect": { + "y": -109, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "Other", + "ref": "e258" + }, + { + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "index": 258, + "enabled": true, + "rect": { + "y": 0, + "height": 0, + "width": 0, + "x": 0 + }, + "depth": 38, + "parentIndex": 256, + "ref": "e259" + }, + { + "depth": 39, + "parentIndex": 258, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 259, + "enabled": true, + "rect": { + "y": -109, + "height": 66, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "type": "TextView", + "hittable": false, + "ref": "e260" + }, + { + "value": "0%", + "type": "Other", + "rect": { + "y": -109, + "height": 66, + "width": 30, + "x": 349.00000063578284 + }, + "depth": 39, + "hittable": false, + "index": 260, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 258, + "enabled": true, + "ref": "e261" + }, + { + "enabled": true, + "index": 261, + "type": "Other", + "parentIndex": 260, + "rect": { + "y": -148, + "height": 36, + "width": 3, + "x": 376.00000063578284 + }, + "hittable": false, + "depth": 40, + "ref": "e262" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "index": 262, + "rect": { + "y": -76, + "height": 30, + "width": 340.6666564941406, + "x": 41.33333396911621 + }, + "depth": 39, + "parentIndex": 258, + "type": "Other", + "ref": "e263" + }, + { + "type": "Other", + "index": 263, + "rect": { + "y": -49, + "height": 3, + "width": 36, + "x": 2.333333969116211 + }, + "parentIndex": 262, + "depth": 40, + "hittable": false, + "enabled": true, + "ref": "e264" + }, + { + "type": "Other", + "depth": 36, + "index": 264, + "rect": { + "y": -27, + "height": 88, + "width": 362, + "x": 20 + }, + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "parentIndex": 209, + "ref": "e265" + }, + { + "index": 265, + "type": "Other", + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "depth": 37, + "parentIndex": 264, + "rect": { + "y": -27, + "height": 88, + "width": 362, + "x": 20 + }, + "ref": "e266" + }, + { + "parentIndex": 265, + "type": "Other", + "hittable": false, + "index": 266, + "depth": 38, + "enabled": true, + "rect": { + "y": -27, + "height": 88, + "width": 362, + "x": 20 + }, + "ref": "e267" + }, + { + "hittable": false, + "type": "TextView", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 38, + "rect": { + "y": 0, + "height": 61, + "width": 362, + "x": 20 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "index": 267, + "parentIndex": 265, + "ref": "e268" + }, + { + "type": "TextView", + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": -27, + "height": 88, + "width": 362, + "x": 20 + }, + "index": 268, + "hittable": false, + "depth": 39, + "parentIndex": 267, + "ref": "e269" + }, + { + "index": 269, + "depth": 39, + "hittable": false, + "rect": { + "y": -27, + "height": 88, + "width": 30, + "x": 349 + }, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "parentIndex": 267, + "type": "Other", + "ref": "e270" + }, + { + "hittable": false, + "rect": { + "y": -66, + "height": 36, + "width": 3, + "x": 376 + }, + "type": "Other", + "enabled": true, + "parentIndex": 269, + "depth": 40, + "index": 270, + "ref": "e271" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "rect": { + "y": 28, + "height": 30, + "width": 362, + "x": 20 + }, + "value": "0%", + "index": 271, + "parentIndex": 267, + "type": "Other", + "enabled": true, + "ref": "e272" + }, + { + "enabled": true, + "index": 272, + "rect": { + "y": 55, + "height": 3, + "width": 36, + "x": -19 + }, + "type": "Other", + "hittable": false, + "parentIndex": 271, + "depth": 40, + "ref": "e273" + }, + { + "rect": { + "y": 89, + "height": 32, + "width": 378, + "x": 12 + }, + "depth": 35, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 73, + "index": 273, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e274" + }, + { + "identifier": "tool-call-badge", + "parentIndex": 273, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 36, + "index": 274, + "rect": { + "y": 89, + "height": 32, + "width": 388, + "x": 7 + }, + "ref": "e275" + }, + { + "depth": 36, + "index": 275, + "rect": { + "y": 89, + "height": 32, + "width": 388, + "x": 7 + }, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "type": "Button", + "parentIndex": 273, + "hittable": false, + "ref": "e276" + }, + { + "type": "Other", + "rect": { + "y": 121, + "height": 36, + "width": 378, + "x": 12 + }, + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "index": 276, + "depth": 35, + "parentIndex": 73, + "hittable": false, + "ref": "e277" + }, + { + "rect": { + "y": 121, + "height": 32, + "width": 388, + "x": 7 + }, + "parentIndex": 276, + "hittable": false, + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "index": 277, + "depth": 36, + "ref": "e278" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "parentIndex": 276, + "hittable": false, + "type": "Button", + "enabled": true, + "depth": 36, + "rect": { + "y": 121, + "height": 32, + "width": 388, + "x": 7 + }, + "index": 278, + "ref": "e279" + }, + { + "rect": { + "y": 157, + "height": 512, + "width": 378, + "x": 12 + }, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "type": "Other", + "index": 279, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "ref": "e280" + }, + { + "index": 280, + "enabled": true, + "rect": { + "y": 157, + "height": 512, + "width": 362, + "x": 20 + }, + "parentIndex": 279, + "type": "Other", + "identifier": "assistant-message", + "hittable": false, + "depth": 36, + "ref": "e281" + }, + { + "depth": 36, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 169, + "height": 242, + "width": 362, + "x": 20 + }, + "hittable": false, + "enabled": true, + "parentIndex": 279, + "index": 281, + "ref": "e282" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": 169, + "height": 242, + "width": 362, + "x": 20 + }, + "depth": 37, + "index": 282, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "parentIndex": 281, + "ref": "e283" + }, + { + "type": "Other", + "parentIndex": 282, + "index": 283, + "depth": 38, + "hittable": false, + "rect": { + "y": 169, + "height": 242, + "width": 362, + "x": 20 + }, + "enabled": true, + "ref": "e284" + }, + { + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 282, + "enabled": true, + "type": "TextView", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 169, + "height": 242, + "width": 362, + "x": 20 + }, + "hittable": false, + "depth": 38, + "index": 284, + "ref": "e285" + }, + { + "index": 285, + "enabled": true, + "parentIndex": 284, + "hittable": false, + "rect": { + "y": 169, + "height": 242, + "width": 362, + "x": 20 + }, + "depth": 39, + "type": "TextView", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "ref": "e286" + }, + { + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "parentIndex": 284, + "index": 286, + "value": "0%", + "rect": { + "y": 169, + "height": 242, + "width": 30, + "x": 349 + }, + "depth": 39, + "hittable": false, + "ref": "e287" + }, + { + "type": "Other", + "depth": 40, + "parentIndex": 286, + "enabled": true, + "index": 287, + "hittable": false, + "rect": { + "y": 130, + "height": 36, + "width": 3, + "x": 376 + }, + "ref": "e288" + }, + { + "index": 288, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "rect": { + "y": 378, + "height": 30, + "width": 362, + "x": 20 + }, + "parentIndex": 284, + "hittable": false, + "type": "Other", + "depth": 39, + "ref": "e289" + }, + { + "type": "Other", + "rect": { + "y": 405, + "height": 3, + "width": 36, + "x": -19 + }, + "enabled": true, + "index": 289, + "hittable": false, + "parentIndex": 288, + "depth": 40, + "ref": "e290" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "rect": { + "y": 435, + "height": 176, + "width": 362, + "x": 20 + }, + "hittable": false, + "index": 290, + "enabled": true, + "parentIndex": 279, + "type": "Other", + "depth": 36, + "ref": "e291" + }, + { + "type": "Other", + "enabled": true, + "index": 291, + "rect": { + "y": 435, + "height": 176, + "width": 362, + "x": 20 + }, + "parentIndex": 290, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "depth": 37, + "hittable": false, + "ref": "e292" + }, + { + "index": 292, + "parentIndex": 291, + "depth": 38, + "rect": { + "y": 435, + "height": 176, + "width": 362, + "x": 20 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e293" + }, + { + "enabled": true, + "index": 293, + "rect": { + "y": 435, + "height": 176, + "width": 362, + "x": 20 + }, + "depth": 38, + "parentIndex": 291, + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "ref": "e294" + }, + { + "rect": { + "y": 435, + "height": 176, + "width": 362, + "x": 20 + }, + "enabled": true, + "index": 294, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 293, + "hittable": false, + "depth": 39, + "ref": "e295" + }, + { + "value": "0%", + "depth": 39, + "hittable": false, + "rect": { + "y": 435, + "height": 176, + "width": 30, + "x": 349 + }, + "parentIndex": 293, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "index": 295, + "ref": "e296" + }, + { + "rect": { + "y": 396, + "height": 36, + "width": 3, + "x": 376 + }, + "index": 296, + "type": "Other", + "hittable": false, + "parentIndex": 295, + "depth": 40, + "enabled": true, + "ref": "e297" + }, + { + "hittable": false, + "type": "Other", + "value": "0%", + "parentIndex": 293, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "rect": { + "y": 578, + "height": 30, + "width": 362, + "x": 20 + }, + "index": 297, + "ref": "e298" + }, + { + "index": 298, + "hittable": false, + "depth": 40, + "rect": { + "y": 605, + "height": 3, + "width": 36, + "x": -19 + }, + "type": "Other", + "enabled": true, + "parentIndex": 297, + "ref": "e299" + }, + { + "index": 299, + "rect": { + "y": 635, + "height": 22, + "width": 362, + "x": 20 + }, + "parentIndex": 279, + "label": "(end of synthetic stream)", + "type": "Other", + "depth": 36, + "enabled": true, + "hittable": false, + "ref": "e300" + }, + { + "hittable": false, + "type": "Other", + "label": "(end of synthetic stream)", + "enabled": true, + "depth": 37, + "rect": { + "y": 635, + "height": 22, + "width": 362, + "x": 20 + }, + "parentIndex": 299, + "index": 300, + "ref": "e301" + }, + { + "rect": { + "y": 635, + "height": 22, + "width": 362, + "x": 20 + }, + "index": 301, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 300, + "depth": 38, + "ref": "e302" + }, + { + "type": "TextView", + "hittable": false, + "enabled": true, + "parentIndex": 300, + "index": 302, + "depth": 38, + "label": "(end of synthetic stream)", + "rect": { + "y": 635, + "height": 22, + "width": 362, + "x": 20 + }, + "value": "(end of synthetic stream)", + "ref": "e303" + }, + { + "type": "TextView", + "label": "(end of synthetic stream)", + "rect": { + "y": 635, + "height": 22, + "width": 183.234375, + "x": 20 + }, + "index": 303, + "depth": 39, + "parentIndex": 302, + "hittable": false, + "enabled": true, + "ref": "e304" + }, + { + "enabled": true, + "hittable": false, + "index": 304, + "value": "0%", + "rect": { + "y": 635, + "height": 22, + "width": 30, + "x": 349 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 302, + "type": "Other", + "ref": "e305" + }, + { + "index": 305, + "type": "Other", + "hittable": false, + "depth": 40, + "enabled": true, + "parentIndex": 304, + "rect": { + "y": 596, + "height": 36, + "width": 3, + "x": 376 + }, + "ref": "e306" + }, + { + "type": "Other", + "index": 306, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "parentIndex": 302, + "rect": { + "y": 643, + "height": 11, + "width": 362, + "x": 20 + }, + "enabled": true, + "depth": 39, + "ref": "e307" + }, + { + "index": 307, + "type": "Other", + "hittable": false, + "parentIndex": 306, + "depth": 40, + "enabled": true, + "rect": { + "y": 651, + "height": 3, + "width": 36, + "x": -19 + }, + "ref": "e308" + }, + { + "label": "Copy turn", + "index": 308, + "type": "Other", + "rect": { + "y": 669, + "height": 67, + "width": 378, + "x": 12 + }, + "hittable": false, + "enabled": true, + "depth": 35, + "parentIndex": 73, + "ref": "e309" + }, + { + "type": "Button", + "depth": 36, + "rect": { + "y": 682, + "height": 22, + "width": 22, + "x": 16 + }, + "hittable": false, + "label": "Copy turn", + "enabled": true, + "parentIndex": 308, + "index": 309, + "ref": "e310" + }, + { + "hittable": false, + "rect": { + "y": 682, + "height": 22, + "width": 22, + "x": 46 + }, + "parentIndex": 308, + "index": 310, + "enabled": true, + "type": "Other", + "label": "Fork chat from here", + "depth": 36, + "ref": "e311" + }, + { + "rect": { + "y": 682, + "height": 22, + "width": 22, + "x": 46 + }, + "parentIndex": 310, + "type": "Button", + "enabled": true, + "identifier": "assistant-fork-menu-trigger", + "label": "Fork chat from here", + "hittable": false, + "index": 311, + "depth": 37, + "ref": "e312" + }, + { + "parentIndex": 308, + "label": "Worked for 9s, ended 8:44 PM", + "depth": 36, + "rect": { + "y": 685.3333332538605, + "height": 15.666671752929688, + "width": 85.33332824707031, + "x": 76 + }, + "type": "Button", + "hittable": false, + "index": 312, + "enabled": true, + "ref": "e313" + }, + { + "depth": 33, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 466, + "height": 30, + "width": 402, + "x": 0 + }, + "enabled": true, + "type": "Other", + "parentIndex": 71, + "hittable": false, + "index": 313, + "ref": "e314" + }, + { + "depth": 34, + "index": 314, + "parentIndex": 313, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "y": 466, + "height": 3, + "width": 393, + "x": 3 + }, + "ref": "e315" + }, + { + "rect": { + "y": 463, + "height": 273, + "width": 30, + "x": 369 + }, + "value": "0%", + "parentIndex": 71, + "enabled": true, + "index": 315, + "type": "Other", + "depth": 33, + "hittable": false, + "label": "Vertical scroll bar, 13 pages", + "ref": "e316" + }, + { + "type": "Other", + "parentIndex": 315, + "rect": { + "y": 734, + "height": 36, + "width": 3, + "x": 396 + }, + "hittable": false, + "depth": 34, + "enabled": true, + "index": 316, + "ref": "e317" + }, + { + "label": "Vertical scroll bar, 13 pages", + "type": "Other", + "value": "0%", + "rect": { + "y": 463, + "height": 273, + "width": 30, + "x": 369 + }, + "hittable": false, + "index": 317, + "depth": 33, + "parentIndex": 71, + "enabled": true, + "ref": "e318" + }, + { + "depth": 34, + "parentIndex": 317, + "enabled": true, + "index": 318, + "type": "Other", + "hittable": false, + "rect": { + "y": 734, + "height": 36, + "width": 3, + "x": 396 + }, + "ref": "e319" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "y": 466, + "height": 30, + "width": 402, + "x": 0 + }, + "depth": 33, + "index": 319, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 71, + "ref": "e320" + }, + { + "rect": { + "y": 466, + "height": 3, + "width": 393, + "x": 3 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 34, + "index": 320, + "parentIndex": 319, + "ref": "e321" + }, + { + "index": 321, + "identifier": "composer-viewport-content", + "rect": { + "y": 736, + "height": 138, + "width": 402, + "x": 0 + }, + "depth": 29, + "type": "Other", + "parentIndex": 65, + "hittable": false, + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "ref": "e322" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": 736, + "height": 88, + "width": 370, + "x": 16 + }, + "hittable": false, + "identifier": "message-input-root", + "depth": 30, + "index": 322, + "parentIndex": 321, + "ref": "e323" + }, + { + "type": "Other", + "parentIndex": 321, + "depth": 30, + "rect": { + "y": 736, + "height": 88, + "width": 370, + "x": 16 + }, + "enabled": true, + "hittable": false, + "index": 323, + "ref": "e324" + }, + { + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "parentIndex": 321, + "hittable": false, + "depth": 30, + "type": "Other", + "rect": { + "y": 745, + "height": 30, + "width": 344, + "x": 29 + }, + "index": 324, + "ref": "e325" + }, + { + "hittable": false, + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "type": "TextView", + "index": 325, + "depth": 31, + "parentIndex": 324, + "rect": { + "y": 745, + "height": 30, + "width": 344, + "x": 29 + }, + "ref": "e326" + }, + { + "rect": { + "y": 745, + "height": 30, + "width": 30, + "x": 340 + }, + "parentIndex": 325, + "index": 326, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "depth": 32, + "enabled": true, + "value": "0%", + "hittable": false, + "ref": "e327" + }, + { + "rect": { + "y": 766.3332926432291, + "height": 38.00002034505212, + "width": 3, + "x": 367 + }, + "index": 327, + "enabled": true, + "parentIndex": 326, + "hittable": false, + "depth": 33, + "type": "Other", + "ref": "e328" + }, + { + "hittable": false, + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "index": 328, + "parentIndex": 325, + "enabled": true, + "type": "Other", + "rect": { + "y": 757, + "height": 15, + "width": 344, + "x": 29 + }, + "ref": "e329" + }, + { + "index": 329, + "depth": 33, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": 769, + "height": 3, + "width": 338, + "x": 32 + }, + "parentIndex": 328, + "ref": "e330" + }, + { + "depth": 30, + "identifier": "message-input-attach-button", + "index": 330, + "label": "Add attachment", + "parentIndex": 321, + "type": "Button", + "rect": { + "y": 787, + "height": 28, + "width": 28, + "x": 23 + }, + "hittable": false, + "enabled": true, + "ref": "e331" + }, + { + "hittable": false, + "index": 331, + "rect": { + "y": 787, + "height": 28, + "width": 232, + "x": 51 + }, + "type": "Other", + "label": "Select model (Ten second stream)", + "depth": 30, + "enabled": true, + "parentIndex": 321, + "ref": "e332" + }, + { + "rect": { + "y": 787, + "height": 28, + "width": 202, + "x": 51 + }, + "identifier": "combined-model-selector", + "hittable": false, + "depth": 31, + "label": "Select model (Ten second stream)", + "parentIndex": 331, + "type": "Button", + "index": 332, + "enabled": true, + "ref": "e333" + }, + { + "rect": { + "y": 787, + "height": 28, + "width": 28, + "x": 283 + }, + "hittable": false, + "type": "Image", + "enabled": true, + "depth": 30, + "parentIndex": 321, + "index": 333, + "identifier": "context-window-meter", + "label": "Context window 3% used", + "ref": "e334" + }, + { + "depth": 30, + "parentIndex": 321, + "label": "Start dictation", + "rect": { + "y": 787, + "height": 28, + "width": 28, + "x": 315 + }, + "index": 334, + "type": "Button", + "hittable": false, + "enabled": true, + "ref": "e335" + }, + { + "rect": { + "y": 787, + "height": 28, + "width": 28, + "x": 351 + }, + "type": "Button", + "label": "Enable Voice mode", + "index": 335, + "enabled": true, + "depth": 30, + "parentIndex": 321, + "hittable": false, + "ref": "e336" + }, + { + "index": 336, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "parentIndex": 16, + "hittable": false, + "depth": 11, + "enabled": true, + "ref": "e337" + }, + { + "index": 337, + "parentIndex": 10, + "enabled": true, + "type": "Other", + "depth": 7, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "ref": "e338" + }, + { + "depth": 8, + "parentIndex": 337, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 338, + "ref": "e339" + }, + { + "parentIndex": 338, + "type": "Other", + "depth": 9, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "index": 339, + "ref": "e340" + }, + { + "hittable": false, + "enabled": true, + "depth": 1, + "type": "Window", + "index": 340, + "parentIndex": 0, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e341" + }, + { + "parentIndex": 340, + "index": 341, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "hittable": false, + "depth": 2, + "ref": "e342" + }, + { + "parentIndex": 341, + "index": 342, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "hittable": false, + "depth": 3, + "ref": "e343" + }, + { + "parentIndex": 341, + "enabled": true, + "rect": { + "y": 874, + "height": 336, + "width": 402, + "x": 0 + }, + "index": 343, + "depth": 3, + "type": "Other", + "hittable": false, + "ref": "e344" + }, + { + "depth": 4, + "rect": { + "y": 874, + "height": 278, + "width": 402, + "x": 0 + }, + "parentIndex": 343, + "hittable": false, + "type": "Other", + "index": 344, + "enabled": true, + "ref": "e345" + }, + { + "depth": 1, + "hittable": true, + "label": "Emoji", + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 0, + "index": 345, + "type": "Window", + "ref": "e346" + }, + { + "enabled": true, + "label": "Emoji", + "index": 346, + "parentIndex": 345, + "hittable": true, + "type": "Other", + "depth": 2, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "ref": "e347" + }, + { + "hittable": false, + "depth": 3, + "label": "Emoji", + "enabled": true, + "rect": { + "y": 874, + "height": 336, + "width": 402, + "x": 0 + }, + "index": 347, + "type": "Other", + "parentIndex": 346, + "ref": "e348" + }, + { + "type": "Other", + "depth": 4, + "enabled": true, + "index": 348, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "hittable": false, + "parentIndex": 347, + "ref": "e349" + }, + { + "hittable": false, + "depth": 5, + "enabled": true, + "index": 349, + "type": "Other", + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "parentIndex": 348, + "ref": "e350" + }, + { + "index": 350, + "enabled": true, + "type": "Other", + "parentIndex": 349, + "hittable": false, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "depth": 6, + "ref": "e351" + }, + { + "label": "Typing Predictions", + "enabled": true, + "identifier": "SystemInputAssistantView", + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "depth": 4, + "index": 351, + "hittable": false, + "type": "Other", + "parentIndex": 347, + "ref": "e352" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "index": 352, + "label": "Typing Predictions", + "depth": 5, + "parentIndex": 351, + "ref": "e353" + }, + { + "type": "Other", + "identifier": "CenterPageView", + "parentIndex": 352, + "hittable": false, + "index": 353, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "depth": 6, + "label": "Typing Predictions", + "enabled": true, + "ref": "e354" + }, + { + "parentIndex": 353, + "rect": { + "y": 274, + "height": 1245, + "width": 402, + "x": 0 + }, + "depth": 7, + "type": "Other", + "index": 354, + "enabled": true, + "hittable": false, + "ref": "e355" + }, + { + "depth": 8, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "enabled": true, + "hittable": false, + "parentIndex": 354, + "index": 355, + "type": "ScrollView", + "ref": "e356" + }, + { + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "depth": 7, + "enabled": true, + "hittable": false, + "parentIndex": 353, + "type": "Other", + "label": "Typing Predictions", + "index": 356, + "ref": "e357" + }, + { + "type": "Other", + "hittable": false, + "index": 357, + "label": "Typing Predictions", + "depth": 8, + "parentIndex": 356, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "enabled": true, + "ref": "e358" + }, + { + "type": "Other", + "depth": 9, + "enabled": true, + "hittable": false, + "index": 358, + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "parentIndex": 357, + "ref": "e359" + }, + { + "rect": { + "y": 874, + "height": 45, + "width": 402, + "x": 0 + }, + "parentIndex": 358, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 10, + "index": 359, + "ref": "e360" + }, + { + "depth": 11, + "index": 360, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": 874, + "height": 45, + "width": 134, + "x": 0 + }, + "parentIndex": 359, + "ref": "e361" + }, + { + "type": "Other", + "rect": { + "y": 874, + "height": 45, + "width": 134, + "x": 134 + }, + "hittable": false, + "parentIndex": 359, + "depth": 11, + "enabled": true, + "index": 361, + "ref": "e362" + }, + { + "index": 362, + "enabled": true, + "parentIndex": 359, + "depth": 11, + "type": "Other", + "hittable": false, + "rect": { + "y": 874, + "height": 45, + "width": 134, + "x": 268 + }, + "ref": "e363" + }, + { + "index": 363, + "type": "Other", + "hittable": false, + "rect": { + "y": 919, + "height": 233, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 347, + "depth": 4, + "ref": "e364" + }, + { + "hittable": false, + "depth": 5, + "index": 364, + "parentIndex": 363, + "enabled": true, + "type": "Other", + "rect": { + "y": 919, + "height": 291, + "width": 402, + "x": 0 + }, + "ref": "e365" + }, + { + "enabled": true, + "index": 365, + "hittable": false, + "type": "Other", + "parentIndex": 364, + "rect": { + "y": 919, + "height": 291, + "width": 402, + "x": 0 + }, + "depth": 6, + "ref": "e366" + }, + { + "depth": 7, + "parentIndex": 365, + "type": "Other", + "enabled": true, + "rect": { + "y": 919, + "height": 291, + "width": 402, + "x": 0 + }, + "hittable": false, + "index": 366, + "ref": "e367" + }, + { + "enabled": true, + "type": "Other", + "label": "q", + "rect": { + "y": 919, + "height": 233, + "width": 402, + "x": 0 + }, + "depth": 4, + "parentIndex": 347, + "hittable": false, + "index": 367, + "ref": "e368" + }, + { + "type": "Keyboard", + "enabled": true, + "depth": 5, + "hittable": false, + "label": "q", + "rect": { + "y": 919, + "height": 233, + "width": 402, + "x": 0 + }, + "parentIndex": 367, + "index": 368, + "ref": "e369" + }, + { + "enabled": true, + "rect": { + "y": 919, + "height": 233, + "width": 402, + "x": 0 + }, + "type": "Other", + "depth": 6, + "parentIndex": 368, + "hittable": false, + "index": 369, + "label": "q", + "ref": "e370" + }, + { + "parentIndex": 369, + "type": "Other", + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "index": 370, + "rect": { + "y": 919, + "height": 233, + "width": 402, + "x": 0 + }, + "hittable": false, + "enabled": true, + "label": "q", + "ref": "e371" + }, + { + "depth": 8, + "parentIndex": 370, + "enabled": true, + "type": "Key", + "hittable": false, + "label": "q", + "index": 371, + "rect": { + "y": 926, + "height": 46, + "width": 40.333333333333336, + "x": 0 + }, + "ref": "e372" + }, + { + "enabled": true, + "rect": { + "y": 926, + "height": 46, + "width": 40.00000000000001, + "x": 40.333333333333336 + }, + "depth": 8, + "type": "Key", + "label": "w", + "parentIndex": 370, + "index": 372, + "hittable": false, + "ref": "e373" + }, + { + "label": "e", + "index": 373, + "rect": { + "y": 926, + "height": 46, + "width": 40.33333333333334, + "x": 80.33333333333334 + }, + "type": "Key", + "enabled": true, + "depth": 8, + "parentIndex": 370, + "hittable": false, + "ref": "e374" + }, + { + "rect": { + "y": 926, + "height": 46, + "width": 40, + "x": 120.66666666666669 + }, + "parentIndex": 370, + "depth": 8, + "label": "r", + "hittable": false, + "enabled": true, + "type": "Key", + "index": 374, + "ref": "e375" + }, + { + "enabled": true, + "hittable": false, + "index": 375, + "rect": { + "y": 926, + "height": 46, + "width": 40.33333333333334, + "x": 160.66666666666669 + }, + "label": "t", + "type": "Key", + "parentIndex": 370, + "depth": 8, + "ref": "e376" + }, + { + "index": 376, + "type": "Key", + "depth": 8, + "hittable": false, + "label": "y", + "enabled": true, + "parentIndex": 370, + "rect": { + "y": 926, + "height": 46, + "width": 40.33333333333334, + "x": 201.00000000000003 + }, + "ref": "e377" + }, + { + "label": "u", + "rect": { + "y": 926, + "height": 46, + "width": 40, + "x": 241.33333333333337 + }, + "parentIndex": 370, + "hittable": false, + "type": "Key", + "index": 377, + "depth": 8, + "enabled": true, + "ref": "e378" + }, + { + "label": "i", + "index": 378, + "type": "Key", + "parentIndex": 370, + "depth": 8, + "rect": { + "y": 926, + "height": 46, + "width": 40.333333333333314, + "x": 281.33333333333337 + }, + "enabled": true, + "hittable": false, + "ref": "e379" + }, + { + "index": 379, + "label": "o", + "rect": { + "y": 926, + "height": 46, + "width": 40, + "x": 321.6666666666667 + }, + "parentIndex": 370, + "type": "Key", + "enabled": true, + "depth": 8, + "hittable": false, + "ref": "e380" + }, + { + "parentIndex": 370, + "depth": 8, + "hittable": false, + "index": 380, + "rect": { + "y": 926, + "height": 46, + "width": 40.333333333333314, + "x": 361.6666666666667 + }, + "enabled": true, + "label": "p", + "type": "Key", + "ref": "e381" + }, + { + "enabled": true, + "hittable": false, + "type": "Key", + "label": "a", + "index": 381, + "rect": { + "y": 980, + "height": 46, + "width": 40.33333333333333, + "x": 19.666666666666668 + }, + "depth": 8, + "parentIndex": 370, + "ref": "e382" + }, + { + "hittable": false, + "type": "Key", + "label": "s", + "index": 382, + "rect": { + "y": 980, + "height": 46, + "width": 40.33333333333334, + "x": 60 + }, + "depth": 8, + "parentIndex": 370, + "enabled": true, + "ref": "e383" + }, + { + "index": 383, + "enabled": true, + "label": "d", + "parentIndex": 370, + "rect": { + "y": 980, + "height": 46, + "width": 40, + "x": 100.33333333333334 + }, + "type": "Key", + "depth": 8, + "hittable": false, + "ref": "e384" + }, + { + "hittable": false, + "type": "Key", + "parentIndex": 370, + "enabled": true, + "label": "f", + "index": 384, + "depth": 8, + "rect": { + "y": 980, + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334 + }, + "ref": "e385" + }, + { + "hittable": false, + "rect": { + "y": 980, + "height": 46, + "width": 40, + "x": 181.2026666666667 + }, + "type": "Key", + "index": 385, + "enabled": true, + "depth": 8, + "parentIndex": 370, + "label": "g", + "ref": "e386" + }, + { + "label": "h", + "enabled": true, + "rect": { + "y": 980, + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667 + }, + "depth": 8, + "index": 386, + "type": "Key", + "hittable": false, + "parentIndex": 370, + "ref": "e387" + }, + { + "type": "Key", + "parentIndex": 370, + "label": "j", + "index": 387, + "hittable": false, + "rect": { + "y": 980, + "height": 46, + "width": 40, + "x": 261.536 + }, + "depth": 8, + "enabled": true, + "ref": "e388" + }, + { + "rect": { + "y": 980, + "height": 46, + "width": 40.333333333333314, + "x": 301.536 + }, + "label": "k", + "depth": 8, + "parentIndex": 370, + "index": 388, + "type": "Key", + "enabled": true, + "hittable": false, + "ref": "e389" + }, + { + "enabled": true, + "parentIndex": 370, + "depth": 8, + "label": "l", + "index": 389, + "rect": { + "y": 980, + "height": 46, + "width": 40.333333333333314, + "x": 341.8693333333333 + }, + "hittable": false, + "type": "Key", + "ref": "e390" + }, + { + "rect": { + "y": 1034, + "height": 46, + "width": 51.333333333333336, + "x": 0 + }, + "enabled": true, + "index": 390, + "type": "Button", + "identifier": "shift", + "label": "shift", + "hittable": false, + "depth": 8, + "parentIndex": 370, + "ref": "e391" + }, + { + "parentIndex": 370, + "index": 391, + "rect": { + "y": 1034, + "height": 46, + "width": 40.33333333333334, + "x": 60 + }, + "depth": 8, + "label": "z", + "enabled": true, + "hittable": false, + "type": "Key", + "ref": "e392" + }, + { + "index": 392, + "label": "x", + "hittable": false, + "enabled": true, + "depth": 8, + "type": "Key", + "rect": { + "y": 1034, + "height": 46, + "width": 40, + "x": 100.33333333333334 + }, + "parentIndex": 370, + "ref": "e393" + }, + { + "depth": 8, + "enabled": true, + "index": 393, + "rect": { + "y": 1034, + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334 + }, + "hittable": false, + "type": "Key", + "label": "c", + "parentIndex": 370, + "ref": "e394" + }, + { + "rect": { + "y": 1034, + "height": 46, + "width": 40, + "x": 181.2026666666667 + }, + "depth": 8, + "enabled": true, + "type": "Key", + "hittable": false, + "label": "v", + "parentIndex": 370, + "index": 394, + "ref": "e395" + }, + { + "parentIndex": 370, + "type": "Key", + "depth": 8, + "index": 395, + "rect": { + "y": 1034, + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667 + }, + "hittable": false, + "label": "b", + "enabled": true, + "ref": "e396" + }, + { + "label": "n", + "index": 396, + "depth": 8, + "hittable": false, + "rect": { + "y": 1034, + "height": 46, + "width": 40, + "x": 261.536 + }, + "type": "Key", + "enabled": true, + "parentIndex": 370, + "ref": "e397" + }, + { + "enabled": true, + "hittable": false, + "type": "Key", + "parentIndex": 370, + "label": "m", + "index": 397, + "rect": { + "y": 1034, + "height": 46, + "width": 40.333333333333314, + "x": 301.536 + }, + "depth": 8, + "ref": "e398" + }, + { + "depth": 8, + "type": "Key", + "index": 398, + "identifier": "delete", + "label": "delete", + "rect": { + "y": 1034, + "height": 46, + "width": 51.333333333333314, + "x": 350.42133333333334 + }, + "enabled": true, + "hittable": false, + "parentIndex": 370, + "ref": "e399" + }, + { + "hittable": false, + "label": "numbers", + "enabled": true, + "index": 399, + "type": "Key", + "identifier": "more", + "rect": { + "y": 1088, + "height": 46, + "width": 101, + "x": 0 + }, + "depth": 8, + "parentIndex": 370, + "ref": "e400" + }, + { + "enabled": true, + "rect": { + "y": 1088, + "height": 46, + "width": 201.33333333333334, + "x": 100.33333333333334 + }, + "parentIndex": 370, + "label": "space", + "depth": 8, + "type": "Key", + "index": 400, + "identifier": "space", + "hittable": false, + "ref": "e401" + }, + { + "identifier": "Return", + "depth": 8, + "parentIndex": 370, + "label": "return", + "enabled": true, + "rect": { + "y": 1088, + "height": 46, + "width": 100.33333333333331, + "x": 301.6666666666667 + }, + "hittable": false, + "index": 401, + "type": "Button", + "ref": "e402" + }, + { + "hittable": false, + "type": "Other", + "label": "Emoji", + "rect": { + "y": 919, + "height": 291, + "width": 402, + "x": 0 + }, + "depth": 4, + "parentIndex": 347, + "index": 402, + "enabled": true, + "ref": "e403" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 402, + "rect": { + "y": 1141.6989567998571, + "height": 68.73516393505088, + "width": 68.0852958475086, + "x": 8.47726568115926 + }, + "type": "Button", + "label": "Emoji", + "index": 403, + "depth": 5, + "ref": "e404" + }, + { + "index": 404, + "type": "StaticText", + "rect": { + "y": 1141.6989567998571, + "height": 0, + "width": 0, + "x": 8.47726568115926 + }, + "enabled": true, + "depth": 6, + "hittable": false, + "parentIndex": 403, + "ref": "e405" + }, + { + "enabled": true, + "label": "Dictate", + "identifier": "dictation", + "parentIndex": 402, + "rect": { + "y": 1141.3656234665239, + "height": 68.7351639350511, + "width": 68.08529584750863, + "x": 325.43743847133214 + }, + "hittable": false, + "depth": 5, + "index": 405, + "type": "Button", + "ref": "e406" + }, + { + "parentIndex": 405, + "hittable": false, + "enabled": true, + "depth": 6, + "rect": { + "y": 1141.3656234665239, + "height": 0, + "width": 0, + "x": 325.43743847133214 + }, + "type": "StaticText", + "index": 406, + "ref": "e407" + }, + { + "hittable": false, + "parentIndex": 402, + "enabled": true, + "type": "Button", + "label": "Dictate", + "identifier": "dictation", + "rect": { + "y": 1141.3656234665239, + "height": 68.7351639350511, + "width": 68.08529584750863, + "x": 325.43743847133214 + }, + "depth": 5, + "index": 407, + "ref": "e408" + }, + { + "rect": { + "y": 1141.3656234665239, + "height": 0, + "width": 0, + "x": 325.43743847133214 + }, + "hittable": false, + "parentIndex": 407, + "depth": 6, + "index": 408, + "enabled": true, + "type": "StaticText", + "ref": "e409" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 409, + "totalNodeCount": 409, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 35, + "p50Ms": 253, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 35 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 35 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776100 + } +} diff --git a/scroll-regression/ios/chat-slow-down.json b/scroll-regression/ios/chat-slow-down.json new file mode 100644 index 0000000000..9a95ce4c20 --- /dev/null +++ b/scroll-regression/ios/chat-slow-down.json @@ -0,0 +1,8318 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "index": 0, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "hittable": true, + "enabled": true, + "label": "Paseo Debug", + "depth": 0, + "ref": "e1" + }, + { + "type": "Window", + "depth": 1, + "parentIndex": 0, + "enabled": true, + "index": 1, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "ref": "e2" + }, + { + "depth": 2, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 1, + "index": 2, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e3" + }, + { + "type": "Other", + "parentIndex": 2, + "index": 3, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "depth": 3, + "hittable": false, + "ref": "e4" + }, + { + "index": 4, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 3, + "type": "Other", + "hittable": false, + "depth": 4, + "enabled": true, + "ref": "e5" + }, + { + "depth": 5, + "parentIndex": 4, + "index": 5, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e6" + }, + { + "depth": 6, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "enabled": true, + "parentIndex": 5, + "hittable": false, + "index": 6, + "ref": "e7" + }, + { + "depth": 7, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "enabled": true, + "parentIndex": 6, + "hittable": false, + "index": 7, + "ref": "e8" + }, + { + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "index": 8, + "depth": 8, + "parentIndex": 7, + "type": "Other", + "ref": "e9" + }, + { + "enabled": true, + "type": "Other", + "depth": 9, + "index": 9, + "parentIndex": 8, + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "ref": "e10" + }, + { + "index": 10, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 8, + "depth": 9, + "ref": "e11" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 10, + "index": 11, + "parentIndex": 10, + "ref": "e12" + }, + { + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 10, + "index": 12, + "type": "Other", + "hittable": false, + "parentIndex": 10, + "ref": "e13" + }, + { + "enabled": true, + "depth": 11, + "index": 13, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "parentIndex": 12, + "ref": "e14" + }, + { + "enabled": true, + "depth": 11, + "index": 14, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "parentIndex": 12, + "ref": "e15" + }, + { + "depth": 12, + "type": "Other", + "parentIndex": 14, + "enabled": true, + "hittable": false, + "index": 15, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "ref": "e16" + }, + { + "depth": 13, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 15, + "index": 16, + "enabled": true, + "hittable": false, + "ref": "e17" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 16, + "depth": 14, + "hittable": false, + "index": 17, + "enabled": true, + "type": "Other", + "ref": "e18" + }, + { + "depth": 15, + "parentIndex": 17, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "index": 18, + "ref": "e19" + }, + { + "parentIndex": 18, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 19, + "depth": 16, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e20" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 17, + "index": 20, + "enabled": true, + "parentIndex": 19, + "ref": "e21" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 20, + "enabled": true, + "index": 21, + "depth": 18, + "ref": "e22" + }, + { + "index": 22, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 19, + "hittable": false, + "enabled": true, + "parentIndex": 21, + "type": "Other", + "ref": "e23" + }, + { + "index": 23, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 20, + "hittable": false, + "enabled": true, + "parentIndex": 22, + "type": "Other", + "ref": "e24" + }, + { + "hittable": false, + "index": 24, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 21, + "label": "Switch tabs (2 open)", + "type": "Other", + "parentIndex": 23, + "ref": "e25" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 22, + "parentIndex": 24, + "type": "Other", + "enabled": true, + "label": "Open menu", + "index": 25, + "ref": "e26" + }, + { + "label": "Open menu", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 26, + "parentIndex": 25, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 23, + "ref": "e27" + }, + { + "index": 27, + "hittable": false, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "label": "Open menu", + "parentIndex": 26, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 24, + "ref": "e28" + }, + { + "hittable": false, + "depth": 25, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 126 + }, + "type": "Other", + "identifier": "composer-dock-header", + "label": "Open menu", + "parentIndex": 27, + "index": 28, + "ref": "e29" + }, + { + "index": 29, + "rect": { + "width": 402, + "x": 0, + "y": 70, + "height": 56 + }, + "depth": 26, + "enabled": true, + "type": "Other", + "parentIndex": 28, + "hittable": false, + "ref": "e30" + }, + { + "index": 30, + "label": "Open menu", + "identifier": "menu-button", + "depth": 26, + "enabled": true, + "type": "Button", + "parentIndex": 28, + "hittable": false, + "rect": { + "width": 32, + "x": 8, + "y": 81.6666669845581, + "height": 32 + }, + "ref": "e31" + }, + { + "enabled": true, + "index": 31, + "hittable": false, + "type": "Other", + "rect": { + "width": 16, + "x": 16, + "y": 91.6666669845581, + "height": 12 + }, + "depth": 27, + "parentIndex": 30, + "ref": "e32" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 16, + "x": 16, + "y": 91.6666669845581, + "height": 1.3333358764648438 + }, + "parentIndex": 31, + "hittable": false, + "index": 32, + "depth": 28, + "ref": "e33" + }, + { + "rect": { + "width": 16, + "x": 16, + "y": 97.00000047683716, + "height": 1.6666717529296875 + }, + "parentIndex": 31, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 28, + "index": 33, + "ref": "e34" + }, + { + "hittable": false, + "rect": { + "width": 8, + "x": 16, + "y": 102.33333396911621, + "height": 1.6666641235351562 + }, + "index": 34, + "enabled": true, + "parentIndex": 31, + "type": "Other", + "depth": 28, + "ref": "e35" + }, + { + "rect": { + "width": 314, + "x": 48, + "y": 80.6666669845581, + "height": 34 + }, + "index": 35, + "type": "Other", + "depth": 26, + "parentIndex": 28, + "enabled": true, + "hittable": false, + "label": "main", + "ref": "e36" + }, + { + "hittable": false, + "rect": { + "width": 278, + "x": 48, + "y": 80.6666669845581, + "height": 34 + }, + "enabled": true, + "type": "Other", + "index": 36, + "label": "main", + "parentIndex": 35, + "depth": 27, + "ref": "e37" + }, + { + "index": 37, + "rect": { + "width": 278, + "x": 48, + "y": 80.6666669845581, + "height": 18 + }, + "enabled": true, + "type": "StaticText", + "label": "main", + "parentIndex": 36, + "hittable": false, + "depth": 28, + "identifier": "workspace-header-title", + "ref": "e38" + }, + { + "label": "main", + "index": 38, + "hittable": false, + "depth": 29, + "enabled": true, + "type": "StaticText", + "rect": { + "width": 278, + "x": 48, + "y": 80.6666669845581, + "height": 18 + }, + "parentIndex": 37, + "ref": "e39" + }, + { + "enabled": true, + "index": 39, + "type": "StaticText", + "parentIndex": 36, + "identifier": "workspace-header-subtitle", + "label": "composer-dock-ios-fixture", + "hittable": false, + "rect": { + "width": 163.3333282470703, + "x": 48, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "depth": 28, + "ref": "e40" + }, + { + "hittable": false, + "label": "composer-dock-ios-fixture", + "rect": { + "width": 163.3333282470703, + "x": 48, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "index": 40, + "depth": 29, + "type": "StaticText", + "parentIndex": 39, + "enabled": true, + "ref": "e41" + }, + { + "rect": { + "width": 4, + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "enabled": true, + "index": 41, + "hittable": false, + "type": "StaticText", + "parentIndex": 36, + "label": "·", + "depth": 28, + "ref": "e42" + }, + { + "hittable": false, + "label": "·", + "depth": 29, + "enabled": true, + "rect": { + "width": 4, + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "type": "StaticText", + "parentIndex": 41, + "index": 42, + "ref": "e43" + }, + { + "label": "dev-new", + "hittable": false, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "enabled": true, + "rect": { + "width": 68.00001525878906, + "x": 227.3333282470703, + "y": 98.6666669845581, + "height": 16 + }, + "type": "Other", + "depth": 28, + "parentIndex": 36, + "index": 43, + "ref": "e44" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 36, + "rect": { + "width": 12, + "x": 227.3333282470703, + "y": 100.6666669845581, + "height": 12 + }, + "depth": 28, + "index": 44, + "type": "Other", + "ref": "e45" + }, + { + "enabled": true, + "index": 45, + "type": "Other", + "depth": 29, + "rect": { + "width": 11, + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 11 + }, + "hittable": false, + "parentIndex": 44, + "ref": "e46" + }, + { + "index": 46, + "depth": 30, + "parentIndex": 45, + "enabled": true, + "rect": { + "width": 11, + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 5 + }, + "hittable": false, + "type": "Other", + "ref": "e47" + }, + { + "rect": { + "width": 11, + "x": 227.8333282470703, + "y": 107.1666669845581, + "height": 5 + }, + "enabled": true, + "hittable": false, + "depth": 30, + "type": "Other", + "index": 47, + "parentIndex": 45, + "ref": "e48" + }, + { + "index": 48, + "hittable": false, + "type": "Other", + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "y": 103.1666669845581, + "height": 1 + }, + "enabled": true, + "parentIndex": 45, + "depth": 30, + "ref": "e49" + }, + { + "index": 49, + "enabled": true, + "parentIndex": 45, + "hittable": false, + "type": "Other", + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "y": 109.1666669845581, + "height": 1 + }, + "depth": 30, + "ref": "e50" + }, + { + "type": "StaticText", + "enabled": true, + "label": "dev-new", + "parentIndex": 36, + "depth": 28, + "hittable": false, + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16 + }, + "index": 50, + "ref": "e51" + }, + { + "parentIndex": 50, + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16 + }, + "enabled": true, + "label": "dev-new", + "depth": 29, + "type": "StaticText", + "hittable": false, + "index": 51, + "ref": "e52" + }, + { + "index": 52, + "identifier": "workspace-header-menu-trigger", + "hittable": false, + "rect": { + "width": 32, + "x": 330, + "y": 81.6666669845581, + "height": 32 + }, + "label": "Workspace actions", + "type": "Button", + "depth": 27, + "parentIndex": 35, + "enabled": true, + "ref": "e53" + }, + { + "hittable": false, + "label": "Open Explorer sidebar", + "type": "Button", + "identifier": "workspace-explorer-toggle", + "parentIndex": 28, + "index": 53, + "rect": { + "width": 32, + "x": 362, + "y": 81.6666669845581, + "height": 32 + }, + "enabled": true, + "depth": 26, + "ref": "e54" + }, + { + "hittable": false, + "parentIndex": 27, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 25, + "index": 54, + "ref": "e55" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "index": 55, + "parentIndex": 27, + "type": "Other", + "enabled": true, + "depth": 25, + "ref": "e56" + }, + { + "enabled": true, + "label": "Switch tabs (2 open)", + "identifier": "workspace-tab-switcher-trigger", + "type": "Button", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 126, + "height": 34 + }, + "depth": 25, + "parentIndex": 27, + "index": 56, + "ref": "e57" + }, + { + "identifier": "workspace-active-tab-icon", + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "width": 14, + "x": 20, + "y": 136, + "height": 14 + }, + "depth": 26, + "index": 57, + "parentIndex": 56, + "ref": "e58" + }, + { + "parentIndex": 27, + "index": 58, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 25, + "rect": { + "width": 402, + "x": 0, + "y": 126, + "height": 35 + }, + "identifier": "workspace-tabs-row", + "ref": "e59" + }, + { + "depth": 25, + "enabled": true, + "type": "Other", + "index": 59, + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "parentIndex": 27, + "hittable": false, + "ref": "e60" + }, + { + "type": "Other", + "parentIndex": 27, + "depth": 25, + "hittable": false, + "index": 60, + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "enabled": true, + "ref": "e61" + }, + { + "parentIndex": 60, + "enabled": true, + "label": "Add attachment", + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "hittable": false, + "depth": 26, + "index": 61, + "ref": "e62" + }, + { + "index": 62, + "type": "Other", + "parentIndex": 61, + "depth": 27, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "ref": "e63" + }, + { + "hittable": false, + "enabled": true, + "depth": 27, + "index": 63, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "parentIndex": 61, + "ref": "e64" + }, + { + "label": "Message agent... Message, @files, /commands", + "parentIndex": 61, + "index": 64, + "rect": { + "width": 402, + "x": 0, + "y": 161, + "height": 713 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 27, + "identifier": "composer-viewport", + "ref": "e65" + }, + { + "type": "Other", + "parentIndex": 64, + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 713 + }, + "depth": 28, + "index": 65, + "hittable": false, + "enabled": true, + "label": "Scroll to bottom", + "ref": "e66" + }, + { + "identifier": "composer-dock-content", + "depth": 29, + "hittable": false, + "index": 66, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 65, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "enabled": true, + "ref": "e67" + }, + { + "hittable": false, + "parentIndex": 66, + "depth": 30, + "index": 67, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "ref": "e68" + }, + { + "index": 68, + "hittable": false, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 30, + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "parentIndex": 66, + "ref": "e69" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 68, + "depth": 31, + "index": 69, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "ref": "e70" + }, + { + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 68, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "identifier": "agent-chat-scroll", + "depth": 31, + "index": 70, + "enabled": true, + "ref": "e71" + }, + { + "index": 71, + "type": "ScrollView", + "parentIndex": 70, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": -141, + "height": 575 + }, + "label": "Thinking", + "depth": 32, + "enabled": true, + "ref": "e72" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "index": 72, + "parentIndex": 71, + "rect": { + "width": 402, + "x": 0, + "y": -4598.666829427083, + "height": 6169.33349609375 + }, + "depth": 33, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "ref": "e73" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 72, + "rect": { + "width": 402, + "x": 0, + "y": -4598.666829427083, + "height": 6169.33349609375 + }, + "index": 73, + "hittable": false, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "depth": 34, + "ref": "e74" + }, + { + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": -4598.666829427083, + "height": 32 + }, + "index": 74, + "hittable": false, + "parentIndex": 73, + "enabled": true, + "depth": 35, + "ref": "e75" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": -4598.666829427083, + "height": 32 + }, + "depth": 36, + "parentIndex": 74, + "identifier": "older-history-slot", + "index": 75, + "hittable": false, + "ref": "e76" + }, + { + "index": 76, + "enabled": true, + "rect": { + "width": 378, + "x": 12, + "y": -4566.666829427083, + "height": 747 + }, + "depth": 35, + "type": "Other", + "parentIndex": 73, + "hittable": false, + "ref": "e77" + }, + { + "rect": { + "width": 378, + "x": 12, + "y": -3819.666829427083, + "height": 1725.33349609375 + }, + "parentIndex": 73, + "depth": 35, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 77, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "ref": "e78" + }, + { + "parentIndex": 77, + "type": "Other", + "enabled": true, + "identifier": "user-message", + "index": 78, + "hittable": false, + "rect": { + "width": 362, + "x": 20, + "y": -3819.666829427083, + "height": 1725.33349609375 + }, + "depth": 36, + "ref": "e79" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -3819.666829427083, + "height": 1725.33349609375 + }, + "enabled": true, + "depth": 36, + "type": "Other", + "index": 79, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "hittable": false, + "parentIndex": 77, + "ref": "e80" + }, + { + "depth": 37, + "rect": { + "width": 362, + "x": 20, + "y": -3819.666829427083, + "height": 1693.33349609375 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 79, + "index": 80, + "ref": "e81" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "parentIndex": 79, + "enabled": true, + "hittable": false, + "rect": { + "width": 330, + "x": 36, + "y": -3803.666829427083, + "height": 1661.66650390625 + }, + "index": 81, + "type": "StaticText", + "depth": 37, + "ref": "e82" + }, + { + "index": 82, + "parentIndex": 81, + "enabled": true, + "hittable": false, + "type": "StaticText", + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "depth": 38, + "rect": { + "width": 330, + "x": 36, + "y": -3803.666829427083, + "height": 1661.66650390625 + }, + "ref": "e83" + }, + { + "type": "Other", + "identifier": "user-message-trailing-row", + "index": 83, + "depth": 37, + "parentIndex": 79, + "rect": { + "width": 107.66665649414062, + "x": 274.3333282470703, + "y": -2118.3334554036455, + "height": 24 + }, + "enabled": true, + "hittable": false, + "ref": "e84" + }, + { + "type": "StaticText", + "index": 84, + "depth": 37, + "hittable": false, + "parentIndex": 79, + "enabled": true, + "label": "8:53 PM", + "rect": { + "width": 49.666656494140625, + "x": 274.3333282470703, + "y": -2114.3334554036455, + "height": 15.66650390625 + }, + "identifier": "user-message-timestamp", + "ref": "e85" + }, + { + "parentIndex": 84, + "rect": { + "width": 49.666656494140625, + "x": 274.3333282470703, + "y": -2114.3334554036455, + "height": 15.66650390625 + }, + "enabled": true, + "label": "8:53 PM", + "hittable": false, + "depth": 38, + "index": 85, + "type": "StaticText", + "ref": "e86" + }, + { + "label": "Rewind to this message", + "type": "Other", + "rect": { + "width": 24, + "x": 331.99999618530273, + "y": -2118.3334554036455, + "height": 24 + }, + "enabled": true, + "hittable": false, + "parentIndex": 79, + "depth": 37, + "index": 86, + "ref": "e87" + }, + { + "enabled": true, + "identifier": "rewind-menu-trigger", + "index": 87, + "label": "Rewind to this message", + "hittable": false, + "depth": 38, + "type": "Button", + "parentIndex": 86, + "rect": { + "width": 24, + "x": 331.99999618530273, + "y": -2118.3334554036455, + "height": 24 + }, + "ref": "e88" + }, + { + "depth": 37, + "type": "Button", + "parentIndex": 79, + "hittable": false, + "enabled": true, + "index": 88, + "rect": { + "width": 22, + "x": 363.99999237060547, + "y": -2117.3334554036455, + "height": 22 + }, + "label": "Copy message", + "ref": "e89" + }, + { + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "y": -2094.333333333333, + "height": 394 + }, + "label": "Cycle 1", + "depth": 35, + "index": 89, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "ref": "e90" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -2094.333333333333, + "height": 390 + }, + "hittable": false, + "depth": 36, + "enabled": true, + "index": 90, + "parentIndex": 89, + "identifier": "assistant-message", + "type": "Other", + "ref": "e91" + }, + { + "parentIndex": 89, + "enabled": true, + "index": 91, + "label": "Cycle 1", + "type": "Other", + "depth": 36, + "hittable": false, + "rect": { + "width": 84, + "x": 20, + "y": -2058.333333333333, + "height": 33 + }, + "ref": "e92" + }, + { + "depth": 37, + "type": "Other", + "index": 92, + "label": "Cycle 1", + "parentIndex": 91, + "rect": { + "width": 84, + "x": 20, + "y": -2058.333333333333, + "height": 33 + }, + "enabled": true, + "hittable": false, + "ref": "e93" + }, + { + "index": 93, + "rect": { + "width": 84, + "x": 20, + "y": -2058.333333333333, + "height": 33 + }, + "type": "Other", + "depth": 38, + "hittable": false, + "enabled": true, + "parentIndex": 92, + "ref": "e94" + }, + { + "label": "Cycle 1", + "hittable": false, + "depth": 38, + "value": "Cycle 1", + "type": "TextView", + "parentIndex": 92, + "enabled": true, + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "index": 94, + "ref": "e95" + }, + { + "label": "Cycle 1", + "depth": 39, + "rect": { + "width": 83.7953545153141, + "x": 20, + "y": -2058.333333333333, + "height": 33 + }, + "hittable": false, + "index": 95, + "enabled": true, + "type": "TextView", + "parentIndex": 94, + "ref": "e96" + }, + { + "rect": { + "width": 30, + "x": 71, + "y": -2058.333333333333, + "height": 33 + }, + "index": 96, + "value": "0%", + "hittable": false, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 94, + "type": "Other", + "enabled": true, + "ref": "e97" + }, + { + "hittable": false, + "enabled": true, + "index": 97, + "rect": { + "width": 3, + "x": 98, + "y": -2097.333333333333, + "height": 36 + }, + "parentIndex": 96, + "type": "Other", + "depth": 40, + "ref": "e98" + }, + { + "hittable": false, + "depth": 39, + "enabled": true, + "index": 98, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 94, + "value": "0%", + "rect": { + "width": 84, + "x": 20, + "y": -2044.833333333333, + "height": 16.5 + }, + "type": "Other", + "ref": "e99" + }, + { + "rect": { + "width": 36, + "x": -19, + "y": -2031.333333333333, + "height": 3 + }, + "enabled": true, + "hittable": false, + "index": 99, + "parentIndex": 98, + "type": "Other", + "depth": 40, + "ref": "e100" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -2058.333333333333, + "height": 42 + }, + "depth": 36, + "parentIndex": 89, + "hittable": false, + "index": 100, + "ref": "e101" + }, + { + "type": "Other", + "index": 101, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "width": 362, + "x": 20, + "y": -1992.333333333333, + "height": 264 + }, + "depth": 36, + "parentIndex": 89, + "hittable": false, + "enabled": true, + "ref": "e102" + }, + { + "hittable": false, + "enabled": true, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "width": 362, + "x": 20, + "y": -1992.333333333333, + "height": 264 + }, + "parentIndex": 101, + "type": "Other", + "depth": 37, + "index": 102, + "ref": "e103" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 362, + "x": 20, + "y": -1992.333333333333, + "height": 264 + }, + "index": 103, + "hittable": false, + "depth": 38, + "parentIndex": 102, + "ref": "e104" + }, + { + "type": "TextView", + "rect": { + "width": 0, + "x": 0, + "y": 0, + "height": 0 + }, + "hittable": false, + "depth": 38, + "enabled": true, + "parentIndex": 102, + "index": 104, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e105" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "depth": 39, + "rect": { + "width": 362, + "x": 20, + "y": -1992.333333333333, + "height": 264 + }, + "enabled": true, + "parentIndex": 104, + "hittable": false, + "index": 105, + "type": "TextView", + "ref": "e106" + }, + { + "index": 106, + "rect": { + "width": 30, + "x": 349, + "y": -1992.333333333333, + "height": 264 + }, + "value": "0%", + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 104, + "type": "Other", + "enabled": true, + "depth": 39, + "ref": "e107" + }, + { + "parentIndex": 106, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 107, + "rect": { + "width": 3, + "x": 376, + "y": -2031.333333333333, + "height": 36 + }, + "depth": 40, + "ref": "e108" + }, + { + "depth": 39, + "rect": { + "width": 362, + "x": 20, + "y": -1761.333333333333, + "height": 30 + }, + "type": "Other", + "parentIndex": 104, + "value": "0%", + "index": 108, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "ref": "e109" + }, + { + "enabled": true, + "depth": 40, + "rect": { + "width": 36, + "x": -19, + "y": -1734.333333333333, + "height": 3 + }, + "parentIndex": 108, + "hittable": false, + "index": 109, + "type": "Other", + "ref": "e110" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 73, + "index": 110, + "depth": 35, + "type": "Other", + "label": "Thinking", + "rect": { + "width": 378, + "x": 12, + "y": -1700.333333333333, + "height": 32 + }, + "ref": "e111" + }, + { + "type": "Other", + "index": 111, + "rect": { + "width": 388, + "x": 7, + "y": -1700.333333333333, + "height": 32 + }, + "depth": 36, + "enabled": true, + "parentIndex": 110, + "identifier": "tool-call-badge", + "hittable": false, + "ref": "e112" + }, + { + "type": "Button", + "enabled": true, + "rect": { + "width": 388, + "x": 7, + "y": -1700.333333333333, + "height": 32 + }, + "label": "Thinking", + "depth": 36, + "index": 112, + "parentIndex": 110, + "hittable": false, + "ref": "e113" + }, + { + "depth": 37, + "label": "Thinking", + "type": "Other", + "parentIndex": 112, + "hittable": false, + "rect": { + "width": 344, + "x": 42, + "y": -1693.333333333333, + "height": 18 + }, + "enabled": true, + "index": 113, + "ref": "e114" + }, + { + "depth": 38, + "index": 114, + "hittable": false, + "enabled": true, + "type": "StaticText", + "label": "Thinking", + "rect": { + "width": 58.666664123535156, + "x": 42, + "y": -1693.333333333333, + "height": 18 + }, + "parentIndex": 113, + "ref": "e115" + }, + { + "parentIndex": 114, + "type": "StaticText", + "index": 115, + "enabled": true, + "rect": { + "width": 58.666664123535156, + "x": 42, + "y": -1693.333333333333, + "height": 18 + }, + "depth": 39, + "label": "Thinking", + "hittable": false, + "ref": "e116" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "width": 378, + "x": 12, + "y": -1668.333333333333, + "height": 32 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 73, + "depth": 35, + "index": 116, + "ref": "e117" + }, + { + "index": 117, + "rect": { + "width": 388, + "x": 7, + "y": -1668.333333333333, + "height": 32 + }, + "depth": 36, + "parentIndex": 116, + "enabled": true, + "hittable": false, + "type": "Other", + "identifier": "tool-call-badge", + "ref": "e118" + }, + { + "parentIndex": 116, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "width": 388, + "x": 7, + "y": -1668.333333333333, + "height": 32 + }, + "index": 118, + "enabled": true, + "depth": 36, + "hittable": false, + "type": "Button", + "ref": "e119" + }, + { + "type": "Other", + "depth": 37, + "index": 119, + "enabled": true, + "parentIndex": 118, + "rect": { + "width": 344, + "x": 42, + "y": -1661.333333333333, + "height": 18 + }, + "label": "Read", + "hittable": false, + "ref": "e120" + }, + { + "parentIndex": 119, + "enabled": true, + "hittable": false, + "rect": { + "width": 35, + "x": 42, + "y": -1661.333333333333, + "height": 18 + }, + "label": "Read", + "depth": 38, + "index": 120, + "type": "StaticText", + "ref": "e121" + }, + { + "rect": { + "width": 35, + "x": 42, + "y": -1661.333333333333, + "height": 18 + }, + "depth": 39, + "parentIndex": 120, + "label": "Read", + "type": "StaticText", + "index": 121, + "enabled": true, + "hittable": false, + "ref": "e122" + }, + { + "hittable": false, + "index": 122, + "label": "packages/app/src/components/conversation-list.tsx", + "enabled": true, + "rect": { + "width": 301, + "x": 85, + "y": -1661.333333333333, + "height": 18 + }, + "type": "StaticText", + "parentIndex": 119, + "depth": 38, + "ref": "e123" + }, + { + "index": 123, + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "enabled": true, + "parentIndex": 122, + "rect": { + "width": 301, + "x": 85, + "y": -1661.333333333333, + "height": 18 + }, + "hittable": false, + "depth": 39, + "ref": "e124" + }, + { + "label": "Search, scrollToEnd", + "enabled": true, + "parentIndex": 73, + "index": 124, + "hittable": false, + "depth": 35, + "type": "Other", + "rect": { + "width": 378, + "x": 12, + "y": -1636.333333333333, + "height": 36 + }, + "ref": "e125" + }, + { + "index": 125, + "type": "Other", + "parentIndex": 124, + "hittable": false, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "width": 388, + "x": 7, + "y": -1636.333333333333, + "height": 32 + }, + "enabled": true, + "ref": "e126" + }, + { + "type": "Button", + "parentIndex": 124, + "hittable": false, + "index": 126, + "enabled": true, + "rect": { + "width": 388, + "x": 7, + "y": -1636.333333333333, + "height": 32 + }, + "label": "Search, scrollToEnd", + "depth": 36, + "ref": "e127" + }, + { + "parentIndex": 126, + "enabled": true, + "index": 127, + "depth": 37, + "hittable": false, + "rect": { + "width": 344, + "x": 42, + "y": -1629.333333333333, + "height": 18 + }, + "label": "Search", + "type": "Other", + "ref": "e128" + }, + { + "parentIndex": 127, + "enabled": true, + "type": "StaticText", + "index": 128, + "rect": { + "width": 48, + "x": 42, + "y": -1629.333333333333, + "height": 18 + }, + "label": "Search", + "hittable": false, + "depth": 38, + "ref": "e129" + }, + { + "depth": 39, + "index": 129, + "type": "StaticText", + "parentIndex": 128, + "rect": { + "width": 48, + "x": 42, + "y": -1629.333333333333, + "height": 18 + }, + "hittable": false, + "enabled": true, + "label": "Search", + "ref": "e130" + }, + { + "index": 130, + "label": "scrollToEnd", + "enabled": true, + "parentIndex": 127, + "hittable": false, + "rect": { + "width": 79.66667175292969, + "x": 98, + "y": -1629.333333333333, + "height": 18 + }, + "type": "StaticText", + "depth": 38, + "ref": "e131" + }, + { + "depth": 39, + "parentIndex": 130, + "type": "StaticText", + "label": "scrollToEnd", + "index": 131, + "enabled": true, + "hittable": false, + "rect": { + "width": 79.66667175292969, + "x": 98, + "y": -1629.333333333333, + "height": 18 + }, + "ref": "e132" + }, + { + "hittable": false, + "rect": { + "width": 378, + "x": 12, + "y": -1600.3333333333333, + "height": 646 + }, + "enabled": true, + "depth": 35, + "type": "Other", + "index": 132, + "parentIndex": 73, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e133" + }, + { + "rect": { + "width": 362, + "x": 20, + "y": -1600.3333333333333, + "height": 642 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "identifier": "assistant-message", + "depth": 36, + "index": 133, + "parentIndex": 132, + "ref": "e134" + }, + { + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -1588.3333333333333 + }, + "hittable": false, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "depth": 36, + "index": 134, + "parentIndex": 132, + "ref": "e135" + }, + { + "depth": 37, + "enabled": true, + "hittable": false, + "index": 135, + "parentIndex": 134, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -1588.3333333333333 + }, + "ref": "e136" + }, + { + "hittable": false, + "enabled": true, + "index": 136, + "parentIndex": 135, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -1588.3333333333333 + }, + "depth": 38, + "type": "Other", + "ref": "e137" + }, + { + "hittable": false, + "depth": 38, + "parentIndex": 135, + "index": 137, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "type": "TextView", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e138" + }, + { + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -1588.3333333333333 + }, + "hittable": false, + "type": "TextView", + "parentIndex": 137, + "depth": 39, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 138, + "enabled": true, + "ref": "e139" + }, + { + "hittable": false, + "rect": { + "width": 30, + "height": 132, + "x": 349, + "y": -1588.3333333333333 + }, + "enabled": true, + "parentIndex": 137, + "type": "Other", + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "index": 139, + "ref": "e140" + }, + { + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": -1627.3333333333333 + }, + "hittable": false, + "index": 140, + "type": "Other", + "depth": 40, + "enabled": true, + "parentIndex": 139, + "ref": "e141" + }, + { + "index": 141, + "depth": 39, + "hittable": false, + "type": "Other", + "value": "0%", + "parentIndex": 137, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": -1489.3333333333333 + }, + "enabled": true, + "ref": "e142" + }, + { + "parentIndex": 141, + "type": "Other", + "depth": 40, + "hittable": false, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": -1462.3333333333333 + }, + "index": 142, + "enabled": true, + "ref": "e143" + }, + { + "depth": 36, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1428.3333333333333 + }, + "hittable": false, + "enabled": true, + "index": 143, + "parentIndex": 132, + "label": "•", + "type": "StaticText", + "ref": "e144" + }, + { + "hittable": false, + "depth": 37, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1428.3333333333333 + }, + "label": "•", + "type": "StaticText", + "parentIndex": 143, + "enabled": true, + "index": 144, + "ref": "e145" + }, + { + "parentIndex": 132, + "index": 145, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1428.3333333333333 + }, + "depth": 36, + "type": "Other", + "ref": "e146" + }, + { + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 145, + "enabled": true, + "index": 146, + "hittable": false, + "depth": 37, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1428.3333333333333 + }, + "ref": "e147" + }, + { + "parentIndex": 146, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1428.3333333333333 + }, + "depth": 38, + "index": 147, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e148" + }, + { + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "hittable": false, + "depth": 38, + "type": "TextView", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 146, + "index": 148, + "ref": "e149" + }, + { + "depth": 39, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1428.3333333333333 + }, + "index": 149, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "TextView", + "parentIndex": 148, + "ref": "e150" + }, + { + "hittable": false, + "value": "0%", + "type": "Other", + "parentIndex": 148, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": -1428.3333333333333 + }, + "index": 150, + "enabled": true, + "ref": "e151" + }, + { + "enabled": true, + "type": "Other", + "index": 151, + "parentIndex": 150, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": -1467.3333333333333 + }, + "depth": 40, + "ref": "e152" + }, + { + "depth": 39, + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": -1373.3333333333333 + }, + "type": "Other", + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 152, + "value": "0%", + "parentIndex": 148, + "ref": "e153" + }, + { + "index": 153, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": -1346.3333333333333 + }, + "type": "Other", + "hittable": false, + "depth": 40, + "parentIndex": 152, + "enabled": true, + "ref": "e154" + }, + { + "index": 154, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1336.3333333333333 + }, + "enabled": true, + "label": "•", + "hittable": false, + "type": "StaticText", + "depth": 36, + "parentIndex": 132, + "ref": "e155" + }, + { + "index": 155, + "enabled": true, + "type": "StaticText", + "parentIndex": 154, + "depth": 37, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1336.3333333333333 + }, + "hittable": false, + "label": "•", + "ref": "e156" + }, + { + "type": "Other", + "hittable": false, + "index": 156, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 132, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1336.3333333333333 + }, + "depth": 36, + "ref": "e157" + }, + { + "depth": 37, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "Other", + "parentIndex": 156, + "hittable": false, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1336.3333333333333 + }, + "index": 157, + "ref": "e158" + }, + { + "parentIndex": 157, + "type": "Other", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1336.3333333333333 + }, + "depth": 38, + "enabled": true, + "index": 158, + "ref": "e159" + }, + { + "enabled": true, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 157, + "type": "TextView", + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "index": 159, + "depth": 38, + "ref": "e160" + }, + { + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1336.3333333333333 + }, + "parentIndex": 159, + "type": "TextView", + "enabled": true, + "depth": 39, + "index": 160, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e161" + }, + { + "enabled": true, + "depth": 39, + "parentIndex": 159, + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": -1336.3333333333333 + }, + "type": "Other", + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "index": 161, + "ref": "e162" + }, + { + "type": "Other", + "index": 162, + "enabled": true, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": -1375.3333333333333 + }, + "parentIndex": 161, + "depth": 40, + "ref": "e163" + }, + { + "value": "0%", + "type": "Other", + "depth": 39, + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": -1281.3333333333333 + }, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 159, + "index": 163, + "enabled": true, + "hittable": false, + "ref": "e164" + }, + { + "enabled": true, + "index": 164, + "hittable": false, + "depth": 40, + "type": "Other", + "parentIndex": 163, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": -1254.3333333333333 + }, + "ref": "e165" + }, + { + "depth": 36, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1244.3333333333333 + }, + "index": 165, + "parentIndex": 132, + "hittable": false, + "type": "StaticText", + "enabled": true, + "label": "•", + "ref": "e166" + }, + { + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1244.3333333333333 + }, + "hittable": false, + "depth": 37, + "index": 166, + "parentIndex": 165, + "label": "•", + "type": "StaticText", + "enabled": true, + "ref": "e167" + }, + { + "enabled": true, + "index": 167, + "depth": 36, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1244.3333333333333 + }, + "parentIndex": 132, + "type": "Other", + "hittable": false, + "ref": "e168" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1244.3333333333333 + }, + "hittable": false, + "type": "Other", + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 37, + "index": 168, + "parentIndex": 167, + "enabled": true, + "ref": "e169" + }, + { + "depth": 38, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1244.3333333333333 + }, + "type": "Other", + "parentIndex": 168, + "enabled": true, + "hittable": false, + "index": 169, + "ref": "e170" + }, + { + "depth": 38, + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "index": 170, + "type": "TextView", + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 168, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "ref": "e171" + }, + { + "depth": 39, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -1244.3333333333333 + }, + "parentIndex": 170, + "hittable": false, + "type": "TextView", + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 171, + "ref": "e172" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 170, + "value": "0%", + "enabled": true, + "depth": 39, + "type": "Other", + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": -1244.3333333333333 + }, + "hittable": false, + "index": 172, + "ref": "e173" + }, + { + "enabled": true, + "depth": 40, + "index": 173, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": -1283.3333333333333 + }, + "parentIndex": 172, + "type": "Other", + "ref": "e174" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": -1189.3333333333333 + }, + "index": 174, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 39, + "parentIndex": 170, + "value": "0%", + "ref": "e175" + }, + { + "type": "Other", + "enabled": true, + "index": 175, + "depth": 40, + "parentIndex": 174, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": -1162.3333333333333 + }, + "hittable": false, + "ref": "e176" + }, + { + "hittable": false, + "type": "StaticText", + "enabled": true, + "label": "•", + "index": 176, + "parentIndex": 132, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1152.3333333333333 + }, + "depth": 36, + "ref": "e177" + }, + { + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -1152.3333333333333 + }, + "type": "StaticText", + "parentIndex": 176, + "index": 177, + "enabled": true, + "hittable": false, + "depth": 37, + "label": "•", + "ref": "e178" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": -1152.3333333333333 + }, + "index": 178, + "depth": 36, + "hittable": false, + "enabled": true, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "Other", + "parentIndex": 132, + "ref": "e179" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": -1152.3333333333333 + }, + "hittable": false, + "index": 179, + "type": "Other", + "enabled": true, + "parentIndex": 178, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 37, + "ref": "e180" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 179, + "depth": 38, + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": -1152.3333333333333 + }, + "type": "Other", + "index": 180, + "ref": "e181" + }, + { + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "index": 181, + "hittable": false, + "depth": 38, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 179, + "type": "TextView", + "enabled": true, + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "ref": "e182" + }, + { + "parentIndex": 181, + "depth": 39, + "hittable": false, + "type": "TextView", + "enabled": true, + "index": 182, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": -1152.3333333333333 + }, + "ref": "e183" + }, + { + "index": 183, + "hittable": false, + "type": "Other", + "rect": { + "width": 30, + "height": 66, + "x": 349.00000063578284, + "y": -1152.3333333333333 + }, + "enabled": true, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "parentIndex": 181, + "ref": "e184" + }, + { + "parentIndex": 183, + "enabled": true, + "depth": 40, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": -1191.3333333333333 + }, + "type": "Other", + "index": 184, + "hittable": false, + "ref": "e185" + }, + { + "hittable": false, + "index": 185, + "value": "0%", + "depth": 39, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": -1119.3333333333333 + }, + "enabled": true, + "parentIndex": 181, + "label": "Horizontal scroll bar, 1 page", + "ref": "e186" + }, + { + "enabled": true, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": -1092.3333333333333 + }, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 185, + "index": 186, + "ref": "e187" + }, + { + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": -1070.3333333333333 + }, + "index": 187, + "enabled": true, + "depth": 36, + "parentIndex": 132, + "type": "Other", + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e188" + }, + { + "index": 188, + "hittable": false, + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": -1070.3333333333333 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 187, + "depth": 37, + "type": "Other", + "enabled": true, + "ref": "e189" + }, + { + "type": "Other", + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": -1070.3333333333333 + }, + "enabled": true, + "parentIndex": 188, + "hittable": false, + "index": 189, + "depth": 38, + "ref": "e190" + }, + { + "enabled": true, + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "depth": 38, + "type": "TextView", + "parentIndex": 188, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 190, + "hittable": false, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e191" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "type": "TextView", + "enabled": true, + "parentIndex": 190, + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": -1070.3333333333333 + }, + "hittable": false, + "index": 191, + "depth": 39, + "ref": "e192" + }, + { + "value": "0%", + "index": 192, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "height": 88, + "x": 349, + "y": -1070.3333333333333 + }, + "type": "Other", + "enabled": true, + "depth": 39, + "parentIndex": 190, + "ref": "e193" + }, + { + "parentIndex": 192, + "depth": 40, + "enabled": true, + "index": 193, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": -1109.3333333333333 + }, + "type": "Other", + "hittable": false, + "ref": "e194" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 190, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": -1015.3333333333333 + }, + "hittable": false, + "depth": 39, + "value": "0%", + "index": 194, + "type": "Other", + "ref": "e195" + }, + { + "index": 195, + "hittable": false, + "enabled": true, + "parentIndex": 194, + "type": "Other", + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": -988.3333333333333 + }, + "depth": 40, + "ref": "e196" + }, + { + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": -954.3333333333333 + }, + "hittable": false, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "index": 196, + "parentIndex": 73, + "depth": 35, + "ref": "e197" + }, + { + "type": "Other", + "depth": 36, + "index": 197, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -954.3333333333333 + }, + "enabled": true, + "identifier": "tool-call-badge", + "hittable": false, + "parentIndex": 196, + "ref": "e198" + }, + { + "depth": 36, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -954.3333333333333 + }, + "parentIndex": 196, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "type": "Button", + "index": 198, + "hittable": false, + "enabled": true, + "ref": "e199" + }, + { + "hittable": false, + "type": "Other", + "index": 199, + "label": "Edit", + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": -947.3333333333333 + }, + "depth": 37, + "parentIndex": 198, + "enabled": true, + "ref": "e200" + }, + { + "label": "Edit", + "type": "StaticText", + "index": 200, + "enabled": true, + "hittable": false, + "depth": 38, + "rect": { + "width": 26.666664123535156, + "height": 18, + "x": 42, + "y": -947.3333333333333 + }, + "parentIndex": 199, + "ref": "e201" + }, + { + "depth": 39, + "rect": { + "width": 26.666664123535156, + "height": 18, + "x": 42, + "y": -947.3333333333333 + }, + "hittable": false, + "label": "Edit", + "type": "StaticText", + "parentIndex": 200, + "enabled": true, + "index": 201, + "ref": "e202" + }, + { + "rect": { + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242, + "y": -947.3333333333333 + }, + "enabled": true, + "depth": 38, + "parentIndex": 199, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "index": 202, + "type": "StaticText", + "ref": "e203" + }, + { + "index": 203, + "rect": { + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242, + "y": -947.3333333333333 + }, + "parentIndex": 202, + "enabled": true, + "depth": 39, + "type": "StaticText", + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "ref": "e204" + }, + { + "parentIndex": 73, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Other", + "index": 204, + "rect": { + "width": 378, + "height": 36, + "x": 12, + "y": -922.3333333333333 + }, + "enabled": true, + "depth": 35, + "ref": "e205" + }, + { + "hittable": false, + "type": "Other", + "identifier": "tool-call-badge", + "depth": 36, + "enabled": true, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -922.3333333333333 + }, + "index": 205, + "parentIndex": 204, + "ref": "e206" + }, + { + "parentIndex": 204, + "enabled": true, + "index": 206, + "type": "Button", + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -922.3333333333333 + }, + "depth": 36, + "ref": "e207" + }, + { + "index": 207, + "type": "Other", + "label": "Shell", + "depth": 37, + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": -915.3333333333333 + }, + "hittable": false, + "enabled": true, + "parentIndex": 206, + "ref": "e208" + }, + { + "label": "Shell", + "enabled": true, + "type": "StaticText", + "index": 208, + "parentIndex": 207, + "depth": 38, + "hittable": false, + "rect": { + "width": 33.666664123535156, + "height": 18, + "x": 42, + "y": -915.3333333333333 + }, + "ref": "e209" + }, + { + "parentIndex": 208, + "index": 209, + "enabled": true, + "depth": 39, + "type": "StaticText", + "hittable": false, + "rect": { + "width": 33.666664123535156, + "height": 18, + "x": 42, + "y": -915.3333333333333 + }, + "label": "Shell", + "ref": "e210" + }, + { + "index": 210, + "label": "node scripts/simulate-stream-burst.mjs", + "depth": 38, + "parentIndex": 207, + "hittable": false, + "rect": { + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242, + "y": -915.3333333333333 + }, + "type": "StaticText", + "enabled": true, + "ref": "e211" + }, + { + "enabled": true, + "label": "node scripts/simulate-stream-burst.mjs", + "depth": 39, + "rect": { + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242, + "y": -915.3333333333333 + }, + "type": "StaticText", + "hittable": false, + "index": 211, + "parentIndex": 210, + "ref": "e212" + }, + { + "hittable": false, + "parentIndex": 73, + "type": "Other", + "index": 212, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 378, + "height": 570, + "x": 12, + "y": -886.3333333333333 + }, + "depth": 35, + "enabled": true, + "ref": "e213" + }, + { + "parentIndex": 212, + "rect": { + "width": 362, + "height": 566, + "x": 20, + "y": -886.3333333333333 + }, + "identifier": "assistant-message", + "hittable": false, + "depth": 36, + "index": 213, + "type": "Other", + "enabled": true, + "ref": "e214" + }, + { + "hittable": false, + "index": 214, + "enabled": true, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": -874.3333333333333 + }, + "parentIndex": 212, + "depth": 36, + "ref": "e215" + }, + { + "depth": 37, + "parentIndex": 214, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": -874.3333333333333 + }, + "index": 215, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e216" + }, + { + "enabled": true, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": -874.3333333333333 + }, + "parentIndex": 215, + "index": 216, + "depth": 38, + "hittable": false, + "type": "Other", + "ref": "e217" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 215, + "index": 217, + "hittable": false, + "depth": 38, + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "type": "TextView", + "enabled": true, + "ref": "e218" + }, + { + "enabled": true, + "parentIndex": 217, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": -874.3333333333333 + }, + "index": 218, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "type": "TextView", + "hittable": false, + "depth": 39, + "ref": "e219" + }, + { + "index": 219, + "value": "0%", + "rect": { + "width": 30, + "height": 242, + "x": 349, + "y": -874.3333333333333 + }, + "depth": 39, + "parentIndex": 217, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e220" + }, + { + "depth": 40, + "type": "Other", + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": -913.3333333333333 + }, + "enabled": true, + "index": 220, + "hittable": false, + "parentIndex": 219, + "ref": "e221" + }, + { + "enabled": true, + "index": 221, + "hittable": false, + "value": "0%", + "type": "Other", + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": -665.3333333333333 + }, + "depth": 39, + "parentIndex": 217, + "label": "Horizontal scroll bar, 1 page", + "ref": "e222" + }, + { + "enabled": true, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": -638.3333333333333 + }, + "parentIndex": 221, + "index": 222, + "depth": 40, + "type": "Other", + "hittable": false, + "ref": "e223" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "index": 223, + "depth": 36, + "parentIndex": 212, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": -608.3333333333333 + }, + "enabled": true, + "type": "Other", + "ref": "e224" + }, + { + "hittable": false, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": -608.3333333333333 + }, + "index": 224, + "enabled": true, + "parentIndex": 223, + "depth": 37, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e225" + }, + { + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": -608.3333333333333 + }, + "enabled": true, + "type": "Other", + "depth": 38, + "parentIndex": 224, + "hittable": false, + "index": 225, + "ref": "e226" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 224, + "enabled": true, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "TextView", + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "depth": 38, + "index": 226, + "ref": "e227" + }, + { + "type": "TextView", + "hittable": false, + "index": 227, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": -608.3333333333333 + }, + "enabled": true, + "parentIndex": 226, + "depth": 39, + "ref": "e228" + }, + { + "depth": 39, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 226, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "rect": { + "width": 30, + "height": 264, + "x": 349, + "y": -608.3333333333333 + }, + "index": 228, + "ref": "e229" + }, + { + "depth": 40, + "parentIndex": 228, + "enabled": true, + "index": 229, + "type": "Other", + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": -647.3333333333333 + }, + "ref": "e230" + }, + { + "enabled": true, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": -377.33333333333326 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 39, + "hittable": false, + "index": 230, + "parentIndex": 226, + "type": "Other", + "ref": "e231" + }, + { + "type": "Other", + "depth": 40, + "parentIndex": 230, + "index": 231, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": -350.33333333333326 + }, + "enabled": true, + "hittable": false, + "ref": "e232" + }, + { + "type": "Other", + "depth": 35, + "hittable": false, + "parentIndex": 73, + "enabled": true, + "label": "Thinking", + "index": 232, + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": -316.33333333333326 + }, + "ref": "e233" + }, + { + "identifier": "tool-call-badge", + "index": 233, + "parentIndex": 232, + "type": "Other", + "depth": 36, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -316.33333333333326 + }, + "enabled": true, + "hittable": false, + "ref": "e234" + }, + { + "enabled": true, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -316.33333333333326 + }, + "index": 234, + "parentIndex": 232, + "hittable": false, + "type": "Button", + "label": "Thinking", + "depth": 36, + "ref": "e235" + }, + { + "enabled": true, + "hittable": false, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 235, + "parentIndex": 73, + "type": "Other", + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": -284.33333333333326 + }, + "depth": 35, + "ref": "e236" + }, + { + "hittable": false, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -284.33333333333326 + }, + "depth": 36, + "parentIndex": 235, + "identifier": "tool-call-badge", + "index": 236, + "type": "Other", + "enabled": true, + "ref": "e237" + }, + { + "depth": 36, + "enabled": true, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 237, + "type": "Button", + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -284.33333333333326 + }, + "parentIndex": 235, + "hittable": false, + "ref": "e238" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": -277.33333333333326 + }, + "label": "Read", + "depth": 37, + "parentIndex": 237, + "index": 238, + "hittable": false, + "ref": "e239" + }, + { + "parentIndex": 238, + "depth": 38, + "index": 239, + "type": "StaticText", + "enabled": true, + "rect": { + "width": 35, + "height": 18, + "x": 42, + "y": -277.33333333333326 + }, + "label": "Read", + "hittable": false, + "ref": "e240" + }, + { + "rect": { + "width": 35, + "height": 18, + "x": 42, + "y": -277.33333333333326 + }, + "hittable": false, + "type": "StaticText", + "index": 240, + "label": "Read", + "enabled": true, + "depth": 39, + "parentIndex": 239, + "ref": "e241" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "depth": 38, + "enabled": true, + "type": "StaticText", + "parentIndex": 238, + "index": 241, + "rect": { + "width": 301, + "height": 18, + "x": 85, + "y": -277.33333333333326 + }, + "hittable": false, + "ref": "e242" + }, + { + "enabled": true, + "depth": 39, + "rect": { + "width": 301, + "height": 18, + "x": 85, + "y": -277.33333333333326 + }, + "index": 242, + "type": "StaticText", + "hittable": false, + "label": "packages/app/src/components/conversation-list.tsx", + "parentIndex": 241, + "ref": "e243" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "rect": { + "width": 378, + "height": 36, + "x": 12, + "y": -252.33333333333326 + }, + "label": "Search, scrollToEnd", + "index": 243, + "depth": 35, + "ref": "e244" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 243, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -252.33333333333326 + }, + "identifier": "tool-call-badge", + "enabled": true, + "depth": 36, + "index": 244, + "ref": "e245" + }, + { + "type": "Button", + "label": "Search, scrollToEnd", + "depth": 36, + "index": 245, + "hittable": false, + "enabled": true, + "parentIndex": 243, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": -252.33333333333326 + }, + "ref": "e246" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "index": 246, + "rect": { + "width": 378, + "height": 646, + "x": 12, + "y": -216.33333333333326 + }, + "type": "Other", + "enabled": true, + "parentIndex": 73, + "depth": 35, + "ref": "e247" + }, + { + "parentIndex": 246, + "hittable": false, + "index": 247, + "rect": { + "width": 362, + "height": 642, + "x": 20, + "y": -216.33333333333326 + }, + "type": "Other", + "identifier": "assistant-message", + "enabled": true, + "depth": 36, + "ref": "e248" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 36, + "index": 248, + "parentIndex": 246, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -204.33333333333326 + }, + "ref": "e249" + }, + { + "enabled": true, + "depth": 37, + "index": 249, + "type": "Other", + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -204.33333333333326 + }, + "parentIndex": 248, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "ref": "e250" + }, + { + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -204.33333333333326 + }, + "index": 250, + "enabled": true, + "depth": 38, + "hittable": false, + "type": "Other", + "parentIndex": 249, + "ref": "e251" + }, + { + "rect": { + "width": 0, + "height": 0, + "x": 0, + "y": 0 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "parentIndex": 249, + "enabled": true, + "depth": 38, + "index": 251, + "type": "TextView", + "ref": "e252" + }, + { + "depth": 39, + "index": 252, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": -204.33333333333326 + }, + "enabled": true, + "type": "TextView", + "hittable": false, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 251, + "ref": "e253" + }, + { + "depth": 39, + "rect": { + "width": 30, + "height": 132, + "x": 349, + "y": -204.33333333333326 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "enabled": true, + "index": 253, + "value": "0%", + "parentIndex": 251, + "ref": "e254" + }, + { + "depth": 40, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": -243.33333333333326 + }, + "parentIndex": 253, + "enabled": true, + "hittable": false, + "index": 254, + "type": "Other", + "ref": "e255" + }, + { + "value": "0%", + "index": 255, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": -105.33333333333326 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "hittable": false, + "parentIndex": 251, + "ref": "e256" + }, + { + "hittable": false, + "parentIndex": 255, + "type": "Other", + "index": 256, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": -78.33333333333326 + }, + "depth": 40, + "enabled": true, + "ref": "e257" + }, + { + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -44.33333333333326 + }, + "label": "•", + "parentIndex": 246, + "enabled": true, + "type": "StaticText", + "depth": 36, + "hittable": false, + "index": 257, + "ref": "e258" + }, + { + "depth": 37, + "parentIndex": 257, + "type": "StaticText", + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": -44.33333333333326 + }, + "hittable": false, + "index": 258, + "enabled": true, + "label": "•", + "ref": "e259" + }, + { + "index": 259, + "type": "Other", + "depth": 36, + "enabled": true, + "parentIndex": 246, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -44.33333333333326 + }, + "ref": "e260" + }, + { + "depth": 37, + "type": "Other", + "enabled": true, + "index": 260, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -44.33333333333326 + }, + "parentIndex": 259, + "hittable": false, + "ref": "e261" + }, + { + "depth": 38, + "hittable": false, + "parentIndex": 260, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -44.33333333333326 + }, + "enabled": true, + "index": 261, + "type": "Other", + "ref": "e262" + }, + { + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "width": 340.6666564941406, + "height": 43.66666666666674, + "x": 41.33333396911621, + "y": 0 + }, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "TextView", + "depth": 38, + "enabled": true, + "parentIndex": 260, + "hittable": false, + "index": 262, + "ref": "e263" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 39, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": -44.33333333333326 + }, + "index": 263, + "parentIndex": 262, + "type": "TextView", + "enabled": true, + "hittable": false, + "ref": "e264" + }, + { + "depth": 39, + "index": 264, + "label": "Vertical scroll bar, 1 page", + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": -44.33333333333326 + }, + "type": "Other", + "value": "0%", + "hittable": false, + "enabled": true, + "parentIndex": 262, + "ref": "e265" + }, + { + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": -83.33333333333326 + }, + "enabled": true, + "index": 265, + "parentIndex": 264, + "hittable": false, + "depth": 40, + "type": "Other", + "ref": "e266" + }, + { + "type": "Other", + "enabled": true, + "index": 266, + "hittable": false, + "depth": 39, + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": 10.666666666666742 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "parentIndex": 262, + "ref": "e267" + }, + { + "parentIndex": 266, + "index": 267, + "hittable": false, + "enabled": true, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 37.66666666666674 + }, + "type": "Other", + "depth": 40, + "ref": "e268" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 47.66666666666674 + }, + "type": "StaticText", + "label": "•", + "index": 268, + "parentIndex": 246, + "depth": 36, + "ref": "e269" + }, + { + "index": 269, + "depth": 37, + "hittable": false, + "type": "StaticText", + "parentIndex": 268, + "label": "•", + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 47.66666666666674 + }, + "enabled": true, + "ref": "e270" + }, + { + "depth": 36, + "type": "Other", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 47.66666666666674 + }, + "index": 270, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "hittable": false, + "parentIndex": 246, + "ref": "e271" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 47.66666666666674 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 271, + "depth": 37, + "parentIndex": 270, + "ref": "e272" + }, + { + "depth": 38, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 47.66666666666674 + }, + "index": 272, + "type": "Other", + "parentIndex": 271, + "enabled": true, + "hittable": false, + "ref": "e273" + }, + { + "parentIndex": 271, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "depth": 38, + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "index": 273, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 47.66666666666674 + }, + "type": "TextView", + "ref": "e274" + }, + { + "index": 274, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 47.66666666666674 + }, + "parentIndex": 273, + "type": "TextView", + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "depth": 39, + "enabled": true, + "ref": "e275" + }, + { + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": 47.66666666666674 + }, + "depth": 39, + "value": "0%", + "index": 275, + "enabled": true, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 273, + "hittable": false, + "ref": "e276" + }, + { + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": 8.666666666666742 + }, + "index": 276, + "type": "Other", + "depth": 40, + "enabled": true, + "hittable": false, + "parentIndex": 275, + "ref": "e277" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": 102.66666666666674 + }, + "enabled": true, + "value": "0%", + "index": 277, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "hittable": false, + "parentIndex": 273, + "type": "Other", + "ref": "e278" + }, + { + "type": "Other", + "depth": 40, + "parentIndex": 277, + "enabled": true, + "hittable": false, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 129.66666666666674 + }, + "index": 278, + "ref": "e279" + }, + { + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 139.66666666666674 + }, + "label": "•", + "enabled": true, + "hittable": false, + "depth": 36, + "type": "StaticText", + "parentIndex": 246, + "index": 279, + "ref": "e280" + }, + { + "type": "StaticText", + "depth": 37, + "parentIndex": 279, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 139.66666666666674 + }, + "index": 280, + "label": "•", + "enabled": true, + "hittable": false, + "ref": "e281" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "type": "Other", + "index": 281, + "parentIndex": 246, + "hittable": false, + "enabled": true, + "depth": 36, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 139.66666666666674 + }, + "ref": "e282" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 281, + "type": "Other", + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 139.66666666666674 + }, + "enabled": true, + "depth": 37, + "index": 282, + "ref": "e283" + }, + { + "depth": 38, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 139.66666666666674 + }, + "index": 283, + "type": "Other", + "enabled": true, + "parentIndex": 282, + "hittable": false, + "ref": "e284" + }, + { + "index": 284, + "enabled": true, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 38, + "hittable": false, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 139.66666666666674 + }, + "type": "TextView", + "parentIndex": 282, + "ref": "e285" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 139.66666666666674 + }, + "index": 285, + "enabled": true, + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 284, + "type": "TextView", + "depth": 39, + "ref": "e286" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": 139.66666666666674 + }, + "index": 286, + "type": "Other", + "depth": 39, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 284, + "ref": "e287" + }, + { + "depth": 40, + "enabled": true, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": 100.66666666666674 + }, + "hittable": false, + "index": 287, + "type": "Other", + "parentIndex": 286, + "ref": "e288" + }, + { + "enabled": true, + "parentIndex": 284, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": 194.66666666666674 + }, + "depth": 39, + "type": "Other", + "value": "0%", + "index": 288, + "label": "Horizontal scroll bar, 1 page", + "ref": "e289" + }, + { + "type": "Other", + "index": 289, + "enabled": true, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 221.66666666666674 + }, + "hittable": false, + "depth": 40, + "parentIndex": 288, + "ref": "e290" + }, + { + "hittable": false, + "depth": 36, + "type": "StaticText", + "enabled": true, + "index": 290, + "parentIndex": 246, + "label": "•", + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 231.66666666666674 + }, + "ref": "e291" + }, + { + "parentIndex": 290, + "index": 291, + "hittable": false, + "type": "StaticText", + "enabled": true, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 231.66666666666674 + }, + "depth": 37, + "label": "•", + "ref": "e292" + }, + { + "enabled": true, + "index": 292, + "hittable": false, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": 231.66666666666674 + }, + "depth": 36, + "parentIndex": 246, + "type": "Other", + "ref": "e293" + }, + { + "index": 293, + "enabled": true, + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": 231.66666666666674 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "parentIndex": 292, + "depth": 37, + "type": "Other", + "ref": "e294" + }, + { + "index": 294, + "parentIndex": 293, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 38, + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": 231.66666666666674 + }, + "ref": "e295" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": 231.66666666666674 + }, + "depth": 38, + "index": 295, + "hittable": false, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 293, + "enabled": true, + "ref": "e296" + }, + { + "enabled": true, + "type": "TextView", + "depth": 39, + "parentIndex": 295, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621, + "y": 231.66666666666674 + }, + "index": 296, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e297" + }, + { + "parentIndex": 295, + "type": "Other", + "enabled": true, + "index": 297, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "hittable": false, + "value": "0%", + "rect": { + "width": 30, + "height": 66, + "x": 349.00000063578284, + "y": 231.66666666666674 + }, + "ref": "e298" + }, + { + "enabled": true, + "index": 298, + "depth": 40, + "hittable": false, + "type": "Other", + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": 192.66666666666674 + }, + "parentIndex": 297, + "ref": "e299" + }, + { + "depth": 39, + "value": "0%", + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": 264.66666666666674 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "parentIndex": 295, + "index": 299, + "enabled": true, + "ref": "e300" + }, + { + "type": "Other", + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 291.66666666666674 + }, + "depth": 40, + "index": 300, + "hittable": false, + "parentIndex": 299, + "enabled": true, + "ref": "e301" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 246, + "depth": 36, + "index": 301, + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": 313.66666666666674 + }, + "ref": "e302" + }, + { + "depth": 37, + "parentIndex": 301, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": 313.66666666666674 + }, + "enabled": true, + "hittable": false, + "index": 302, + "ref": "e303" + }, + { + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": 313.66666666666674 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 303, + "parentIndex": 302, + "depth": 38, + "ref": "e304" + }, + { + "parentIndex": 302, + "type": "TextView", + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "index": 304, + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": 313.66666666666674 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "depth": 38, + "enabled": true, + "ref": "e305" + }, + { + "index": 305, + "type": "TextView", + "parentIndex": 304, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "depth": 39, + "enabled": true, + "hittable": false, + "rect": { + "width": 362, + "height": 88, + "x": 20, + "y": 313.66666666666674 + }, + "ref": "e306" + }, + { + "type": "Other", + "depth": 39, + "value": "0%", + "rect": { + "width": 30, + "height": 88, + "x": 349, + "y": 313.66666666666674 + }, + "index": 306, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 304, + "enabled": true, + "ref": "e307" + }, + { + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": 274.66666666666674 + }, + "index": 307, + "hittable": false, + "type": "Other", + "depth": 40, + "enabled": true, + "parentIndex": 306, + "ref": "e308" + }, + { + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": 368.66666666666674 + }, + "depth": 39, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "index": 308, + "value": "0%", + "enabled": true, + "parentIndex": 304, + "ref": "e309" + }, + { + "enabled": true, + "depth": 40, + "type": "Other", + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": 395.66666666666674 + }, + "parentIndex": 308, + "hittable": false, + "index": 309, + "ref": "e310" + }, + { + "type": "Other", + "enabled": true, + "depth": 35, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 73, + "hittable": false, + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": 429.66666666666674 + }, + "index": 310, + "ref": "e311" + }, + { + "type": "Other", + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 429.66666666666674 + }, + "index": 311, + "enabled": true, + "hittable": false, + "parentIndex": 310, + "ref": "e312" + }, + { + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 429.66666666666674 + }, + "parentIndex": 310, + "enabled": true, + "depth": 36, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "index": 312, + "type": "Button", + "ref": "e313" + }, + { + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": 436.66666666666674 + }, + "depth": 37, + "index": 313, + "hittable": false, + "parentIndex": 312, + "type": "Other", + "label": "Edit", + "enabled": true, + "ref": "e314" + }, + { + "parentIndex": 313, + "hittable": false, + "label": "Edit", + "rect": { + "width": 26.666664123535156, + "height": 18, + "x": 42, + "y": 436.66666666666674 + }, + "depth": 38, + "index": 314, + "enabled": true, + "type": "StaticText", + "ref": "e315" + }, + { + "label": "Edit", + "parentIndex": 314, + "rect": { + "width": 26.666664123535156, + "height": 18, + "x": 42, + "y": 436.66666666666674 + }, + "hittable": false, + "index": 315, + "type": "StaticText", + "enabled": true, + "depth": 39, + "ref": "e316" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "index": 316, + "type": "StaticText", + "enabled": true, + "parentIndex": 313, + "depth": 38, + "rect": { + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242, + "y": 436.66666666666674 + }, + "hittable": false, + "ref": "e317" + }, + { + "depth": 39, + "parentIndex": 316, + "type": "StaticText", + "enabled": true, + "hittable": false, + "rect": { + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242, + "y": 436.66666666666674 + }, + "index": 317, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e318" + }, + { + "type": "Other", + "rect": { + "width": 378, + "height": 36, + "x": 12, + "y": 461.66666666666674 + }, + "parentIndex": 73, + "enabled": true, + "index": 318, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "depth": 35, + "hittable": false, + "ref": "e319" + }, + { + "type": "Other", + "identifier": "tool-call-badge", + "index": 319, + "hittable": false, + "enabled": true, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 461.66666666666674 + }, + "parentIndex": 318, + "depth": 36, + "ref": "e320" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "enabled": true, + "depth": 36, + "parentIndex": 318, + "type": "Button", + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 461.66666666666674 + }, + "index": 320, + "ref": "e321" + }, + { + "depth": 35, + "rect": { + "width": 378, + "height": 570, + "x": 12, + "y": 497.66666666666674 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "parentIndex": 73, + "index": 321, + "enabled": true, + "ref": "e322" + }, + { + "type": "Other", + "index": 322, + "enabled": true, + "depth": 36, + "rect": { + "width": 362, + "height": 566, + "x": 20, + "y": 497.66666666666674 + }, + "identifier": "assistant-message", + "hittable": false, + "parentIndex": 321, + "ref": "e323" + }, + { + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": 509.66666666666674 + }, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 321, + "depth": 36, + "hittable": false, + "index": 323, + "type": "Other", + "ref": "e324" + }, + { + "enabled": true, + "parentIndex": 323, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "index": 324, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": 509.66666666666674 + }, + "type": "Other", + "depth": 37, + "ref": "e325" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 38, + "parentIndex": 324, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": 509.66666666666674 + }, + "index": 325, + "ref": "e326" + }, + { + "index": 326, + "parentIndex": 324, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": 509.66666666666674 + }, + "type": "TextView", + "hittable": false, + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e327" + }, + { + "index": 327, + "parentIndex": 326, + "depth": 39, + "type": "TextView", + "enabled": true, + "rect": { + "width": 362, + "height": 242, + "x": 20, + "y": 509.66666666666674 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "hittable": false, + "ref": "e328" + }, + { + "rect": { + "width": 30, + "height": 242, + "x": 349, + "y": 509.66666666666674 + }, + "hittable": false, + "type": "Other", + "parentIndex": 326, + "depth": 39, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "index": 328, + "enabled": true, + "ref": "e329" + }, + { + "enabled": true, + "depth": 40, + "parentIndex": 328, + "index": 329, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": 470.66666666666674 + }, + "type": "Other", + "ref": "e330" + }, + { + "parentIndex": 326, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": 718.6666666666667 + }, + "value": "0%", + "enabled": true, + "hittable": false, + "index": 330, + "ref": "e331" + }, + { + "enabled": true, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": 745.6666666666667 + }, + "type": "Other", + "parentIndex": 330, + "depth": 40, + "hittable": false, + "index": 331, + "ref": "e332" + }, + { + "enabled": true, + "depth": 36, + "parentIndex": 321, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": 775.6666666666667 + }, + "index": 332, + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "type": "Other", + "ref": "e333" + }, + { + "hittable": false, + "parentIndex": 332, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": 775.6666666666667 + }, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 333, + "depth": 37, + "enabled": true, + "ref": "e334" + }, + { + "index": 334, + "parentIndex": 333, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 38, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": 775.6666666666667 + }, + "ref": "e335" + }, + { + "parentIndex": 333, + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": 775.6666666666667 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "depth": 38, + "index": 335, + "enabled": true, + "type": "TextView", + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "ref": "e336" + }, + { + "rect": { + "width": 362, + "height": 264, + "x": 20, + "y": 775.6666666666667 + }, + "index": 336, + "enabled": true, + "parentIndex": 335, + "type": "TextView", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "hittable": false, + "depth": 39, + "ref": "e337" + }, + { + "enabled": true, + "index": 337, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 335, + "type": "Other", + "hittable": false, + "depth": 39, + "value": "0%", + "rect": { + "width": 30, + "height": 264, + "x": 349, + "y": 775.6666666666667 + }, + "ref": "e338" + }, + { + "enabled": true, + "type": "Other", + "index": 338, + "parentIndex": 337, + "hittable": false, + "depth": 40, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": 736.6666666666667 + }, + "ref": "e339" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "hittable": false, + "parentIndex": 335, + "enabled": true, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": 1006.6666666666667 + }, + "type": "Other", + "depth": 39, + "index": 339, + "ref": "e340" + }, + { + "type": "Other", + "parentIndex": 339, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": 1033.6666666666667 + }, + "depth": 40, + "index": 340, + "enabled": true, + "hittable": false, + "ref": "e341" + }, + { + "parentIndex": 73, + "type": "Other", + "depth": 35, + "hittable": false, + "label": "Thinking", + "enabled": true, + "index": 341, + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": 1067.6666666666667 + }, + "ref": "e342" + }, + { + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1067.6666666666667 + }, + "identifier": "tool-call-badge", + "enabled": true, + "parentIndex": 341, + "index": 342, + "depth": 36, + "type": "Other", + "hittable": false, + "ref": "e343" + }, + { + "label": "Thinking", + "type": "Button", + "parentIndex": 341, + "hittable": false, + "index": 343, + "depth": 36, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1067.6666666666667 + }, + "enabled": true, + "ref": "e344" + }, + { + "depth": 37, + "hittable": false, + "parentIndex": 343, + "label": "Thinking", + "type": "Other", + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": 1074.6666666666667 + }, + "index": 344, + "enabled": true, + "ref": "e345" + }, + { + "index": 345, + "hittable": false, + "rect": { + "width": 58.666664123535156, + "height": 18, + "x": 42, + "y": 1074.6666666666667 + }, + "label": "Thinking", + "parentIndex": 344, + "type": "StaticText", + "enabled": true, + "depth": 38, + "ref": "e346" + }, + { + "label": "Thinking", + "type": "StaticText", + "enabled": true, + "index": 346, + "parentIndex": 345, + "hittable": false, + "depth": 39, + "rect": { + "width": 58.666664123535156, + "height": 18, + "x": 42, + "y": 1074.6666666666667 + }, + "ref": "e347" + }, + { + "depth": 35, + "hittable": false, + "index": 347, + "rect": { + "width": 378, + "height": 32, + "x": 12, + "y": 1099.6666666666667 + }, + "parentIndex": 73, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "type": "Other", + "enabled": true, + "ref": "e348" + }, + { + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1099.6666666666667 + }, + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "depth": 36, + "hittable": false, + "parentIndex": 347, + "index": 348, + "ref": "e349" + }, + { + "type": "Button", + "hittable": false, + "enabled": true, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "index": 349, + "depth": 36, + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1099.6666666666667 + }, + "parentIndex": 347, + "ref": "e350" + }, + { + "enabled": true, + "parentIndex": 349, + "hittable": false, + "rect": { + "width": 344, + "height": 18, + "x": 42, + "y": 1106.6666666666667 + }, + "type": "Other", + "index": 350, + "depth": 37, + "label": "Read", + "ref": "e351" + }, + { + "enabled": true, + "index": 351, + "type": "StaticText", + "hittable": false, + "rect": { + "width": 35, + "height": 18, + "x": 42, + "y": 1106.6666666666667 + }, + "label": "Read", + "depth": 38, + "parentIndex": 350, + "ref": "e352" + }, + { + "hittable": false, + "label": "Read", + "index": 352, + "parentIndex": 351, + "enabled": true, + "type": "StaticText", + "depth": 39, + "rect": { + "width": 35, + "height": 18, + "x": 42, + "y": 1106.6666666666667 + }, + "ref": "e353" + }, + { + "type": "StaticText", + "index": 353, + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "width": 301, + "height": 18, + "x": 85, + "y": 1106.6666666666667 + }, + "depth": 38, + "parentIndex": 350, + "enabled": true, + "hittable": false, + "ref": "e354" + }, + { + "enabled": true, + "rect": { + "width": 301, + "height": 18, + "x": 85, + "y": 1106.6666666666667 + }, + "type": "StaticText", + "index": 354, + "label": "packages/app/src/components/conversation-list.tsx", + "hittable": false, + "depth": 39, + "parentIndex": 353, + "ref": "e355" + }, + { + "type": "Other", + "hittable": false, + "index": 355, + "enabled": true, + "depth": 35, + "label": "Search, scrollToEnd", + "rect": { + "width": 378, + "height": 36, + "x": 12, + "y": 1131.6666666666667 + }, + "parentIndex": 73, + "ref": "e356" + }, + { + "identifier": "tool-call-badge", + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1131.6666666666667 + }, + "depth": 36, + "index": 356, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 355, + "ref": "e357" + }, + { + "rect": { + "width": 388, + "height": 32, + "x": 7, + "y": 1131.6666666666667 + }, + "enabled": true, + "depth": 36, + "index": 357, + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Button", + "parentIndex": 355, + "ref": "e358" + }, + { + "enabled": true, + "index": 358, + "depth": 35, + "parentIndex": 73, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "hittable": false, + "rect": { + "width": 378, + "height": 336, + "x": 12, + "y": 1167.6666666666667 + }, + "ref": "e359" + }, + { + "parentIndex": 358, + "hittable": false, + "index": 359, + "rect": { + "width": 362, + "height": 336, + "x": 20, + "y": 1167.6666666666667 + }, + "enabled": true, + "depth": 36, + "identifier": "assistant-message", + "type": "Other", + "ref": "e360" + }, + { + "type": "Other", + "parentIndex": 358, + "depth": 36, + "hittable": false, + "index": 360, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": 1179.6666666666667 + }, + "ref": "e361" + }, + { + "index": 361, + "depth": 37, + "parentIndex": 360, + "hittable": false, + "enabled": true, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": 1179.6666666666667 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "Other", + "ref": "e362" + }, + { + "depth": 38, + "type": "Other", + "hittable": false, + "index": 362, + "parentIndex": 361, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": 1179.6666666666667 + }, + "enabled": true, + "ref": "e363" + }, + { + "index": 363, + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": 1179.6666666666667 + }, + "enabled": true, + "type": "TextView", + "depth": 38, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 361, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "ref": "e364" + }, + { + "hittable": false, + "index": 364, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "width": 362, + "height": 132, + "x": 20, + "y": 1179.6666666666667 + }, + "depth": 39, + "type": "TextView", + "parentIndex": 363, + "enabled": true, + "ref": "e365" + }, + { + "depth": 39, + "rect": { + "width": 30, + "height": 132, + "x": 349, + "y": 1179.6666666666667 + }, + "enabled": true, + "type": "Other", + "parentIndex": 363, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "index": 365, + "hittable": false, + "ref": "e366" + }, + { + "type": "Other", + "enabled": true, + "depth": 40, + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": 1140.6666666666667 + }, + "parentIndex": 365, + "hittable": false, + "index": 366, + "ref": "e367" + }, + { + "parentIndex": 363, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "index": 367, + "rect": { + "width": 362, + "height": 30, + "x": 20, + "y": 1278.6666666666667 + }, + "type": "Other", + "value": "0%", + "enabled": true, + "ref": "e368" + }, + { + "hittable": false, + "index": 368, + "type": "Other", + "parentIndex": 367, + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": 1305.6666666666667 + }, + "depth": 40, + "enabled": true, + "ref": "e369" + }, + { + "parentIndex": 358, + "index": 369, + "enabled": true, + "depth": 36, + "label": "•", + "type": "StaticText", + "hittable": false, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 1339.6666666666667 + }, + "ref": "e370" + }, + { + "enabled": true, + "hittable": false, + "label": "•", + "parentIndex": 369, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 1339.6666666666667 + }, + "depth": 37, + "index": 370, + "type": "StaticText", + "ref": "e371" + }, + { + "hittable": false, + "index": 371, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 1339.6666666666667 + }, + "parentIndex": 358, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 36, + "type": "Other", + "ref": "e372" + }, + { + "type": "Other", + "depth": 37, + "hittable": false, + "parentIndex": 371, + "index": 372, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 1339.6666666666667 + }, + "ref": "e373" + }, + { + "parentIndex": 372, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 1339.6666666666667 + }, + "type": "Other", + "depth": 38, + "hittable": false, + "index": 373, + "enabled": true, + "ref": "e374" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 1339.6666666666667 + }, + "hittable": false, + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "TextView", + "depth": 38, + "index": 374, + "parentIndex": 372, + "ref": "e375" + }, + { + "parentIndex": 374, + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "depth": 39, + "hittable": false, + "rect": { + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621, + "y": 1339.6666666666667 + }, + "index": 375, + "ref": "e376" + }, + { + "rect": { + "width": 30, + "height": 88, + "x": 349.00000063578284, + "y": 1339.6666666666667 + }, + "index": 376, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "hittable": false, + "depth": 39, + "parentIndex": 374, + "ref": "e377" + }, + { + "hittable": false, + "parentIndex": 376, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": 1300.6666666666667 + }, + "index": 377, + "enabled": true, + "type": "Other", + "depth": 40, + "ref": "e378" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621, + "y": 1394.6666666666667 + }, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "type": "Other", + "index": 378, + "parentIndex": 374, + "value": "0%", + "ref": "e379" + }, + { + "hittable": false, + "parentIndex": 378, + "enabled": true, + "depth": 40, + "type": "Other", + "index": 379, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 1421.6666666666667 + }, + "ref": "e380" + }, + { + "hittable": false, + "type": "StaticText", + "enabled": true, + "label": "•", + "index": 380, + "parentIndex": 358, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 1431.6666666666667 + }, + "depth": 36, + "ref": "e381" + }, + { + "depth": 37, + "hittable": false, + "rect": { + "width": 7.333332061767578, + "height": 22, + "x": 30, + "y": 1431.6666666666667 + }, + "parentIndex": 380, + "index": 381, + "type": "StaticText", + "label": "•", + "enabled": true, + "ref": "e382" + }, + { + "label": "We rely on onContentSizeChange to dete", + "depth": 36, + "rect": { + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621, + "y": 1431.6666666666667 + }, + "hittable": false, + "enabled": true, + "parentIndex": 358, + "index": 382, + "type": "Other", + "ref": "e383" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621, + "y": 1431.6666666666667 + }, + "enabled": true, + "type": "Other", + "label": "We rely on onContentSizeChange to dete", + "parentIndex": 382, + "depth": 37, + "hittable": false, + "index": 383, + "ref": "e384" + }, + { + "type": "Other", + "index": 384, + "rect": { + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621, + "y": 1431.6666666666667 + }, + "depth": 38, + "hittable": false, + "enabled": true, + "parentIndex": 383, + "ref": "e385" + }, + { + "rect": { + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621, + "y": 1431.6666666666667 + }, + "hittable": false, + "type": "TextView", + "depth": 38, + "index": 385, + "enabled": true, + "label": "We rely on onContentSizeChange to dete", + "parentIndex": 383, + "value": "We rely on onContentSizeChange to dete", + "ref": "e386" + }, + { + "rect": { + "width": 278.07421875, + "height": 22, + "x": 41.33333396911621, + "y": 1431.6666666666667 + }, + "index": 386, + "enabled": true, + "hittable": false, + "depth": 39, + "type": "TextView", + "label": "We rely on onContentSizeChange to dete", + "parentIndex": 385, + "ref": "e387" + }, + { + "rect": { + "width": 30, + "height": 22, + "x": 349.00000063578284, + "y": 1431.6666666666667 + }, + "type": "Other", + "hittable": false, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "index": 387, + "depth": 39, + "parentIndex": 385, + "enabled": true, + "ref": "e388" + }, + { + "type": "Other", + "parentIndex": 387, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 376.00000063578284, + "y": 1392.6666666666667 + }, + "index": 388, + "enabled": true, + "depth": 40, + "ref": "e389" + }, + { + "index": 389, + "depth": 39, + "parentIndex": 385, + "rect": { + "width": 340.6666564941406, + "height": 11, + "x": 41.33333396911621, + "y": 1439.6666666666667 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "ref": "e390" + }, + { + "index": 390, + "type": "Other", + "hittable": false, + "rect": { + "width": 36, + "height": 3, + "x": 2.333333969116211, + "y": 1447.6666666666667 + }, + "depth": 40, + "enabled": true, + "parentIndex": 389, + "ref": "e391" + }, + { + "type": "Other", + "enabled": true, + "depth": 36, + "parentIndex": 358, + "index": 391, + "rect": { + "width": 362, + "height": 22, + "x": 20, + "y": 1469.6666666666667 + }, + "hittable": false, + "label": "(end of synthetic stream)", + "ref": "e392" + }, + { + "type": "Other", + "enabled": true, + "label": "(end of synthetic stream)", + "index": 392, + "depth": 37, + "hittable": false, + "rect": { + "width": 362, + "height": 22, + "x": 20, + "y": 1469.6666666666667 + }, + "parentIndex": 391, + "ref": "e393" + }, + { + "enabled": true, + "depth": 38, + "rect": { + "width": 362, + "height": 22, + "x": 20, + "y": 1469.6666666666667 + }, + "hittable": false, + "type": "Other", + "index": 393, + "parentIndex": 392, + "ref": "e394" + }, + { + "value": "(end of synthetic stream)", + "label": "(end of synthetic stream)", + "hittable": false, + "rect": { + "width": 362, + "height": 22, + "x": 20, + "y": 1469.6666666666667 + }, + "index": 394, + "type": "TextView", + "depth": 38, + "enabled": true, + "parentIndex": 392, + "ref": "e395" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 183.234375, + "height": 22, + "x": 20, + "y": 1469.6666666666667 + }, + "type": "TextView", + "label": "(end of synthetic stream)", + "parentIndex": 394, + "index": 395, + "depth": 39, + "ref": "e396" + }, + { + "depth": 39, + "index": 396, + "value": "0%", + "rect": { + "width": 30, + "height": 22, + "x": 349, + "y": 1469.6666666666667 + }, + "hittable": false, + "parentIndex": 394, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "type": "Other", + "ref": "e397" + }, + { + "rect": { + "width": 3, + "height": 36, + "x": 376, + "y": 1430.6666666666667 + }, + "type": "Other", + "index": 397, + "depth": 40, + "parentIndex": 396, + "enabled": true, + "hittable": false, + "ref": "e398" + }, + { + "index": 398, + "parentIndex": 394, + "enabled": true, + "value": "0%", + "rect": { + "width": 362, + "height": 11, + "x": 20, + "y": 1477.6666666666667 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "type": "Other", + "ref": "e399" + }, + { + "depth": 40, + "parentIndex": 398, + "index": 399, + "type": "Other", + "rect": { + "width": 36, + "height": 3, + "x": -19, + "y": 1485.6666666666667 + }, + "enabled": true, + "hittable": false, + "ref": "e400" + }, + { + "hittable": false, + "index": 400, + "enabled": true, + "parentIndex": 73, + "label": "Copy turn", + "type": "Other", + "rect": { + "width": 378, + "height": 67, + "x": 12, + "y": 1503.6666666666667 + }, + "depth": 35, + "ref": "e401" + }, + { + "type": "Button", + "rect": { + "width": 22, + "height": 22, + "x": 16, + "y": 1516.6666666666667 + }, + "label": "Copy turn", + "depth": 36, + "hittable": false, + "index": 401, + "parentIndex": 400, + "enabled": true, + "ref": "e402" + }, + { + "enabled": true, + "hittable": false, + "index": 402, + "type": "Other", + "depth": 36, + "parentIndex": 400, + "rect": { + "width": 22, + "height": 22, + "x": 46, + "y": 1516.6666666666667 + }, + "label": "Fork chat from here", + "ref": "e403" + }, + { + "index": 403, + "label": "Fork chat from here", + "depth": 37, + "rect": { + "width": 22, + "height": 22, + "x": 46, + "y": 1516.6666666666667 + }, + "type": "Button", + "hittable": false, + "parentIndex": 402, + "identifier": "assistant-fork-menu-trigger", + "enabled": true, + "ref": "e404" + }, + { + "enabled": true, + "parentIndex": 400, + "depth": 36, + "type": "Button", + "label": "Worked for 10s, ended 8:53 PM", + "hittable": false, + "rect": { + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76, + "y": 1519.9999999205272 + }, + "index": 404, + "ref": "e405" + }, + { + "depth": 37, + "parentIndex": 404, + "rect": { + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76, + "y": 1519.9999999205272 + }, + "type": "StaticText", + "hittable": false, + "index": 405, + "enabled": true, + "label": "Worked for 10s", + "ref": "e406" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76, + "y": 1519.9999999205272 + }, + "index": 406, + "label": "Worked for 10s", + "depth": 38, + "parentIndex": 405, + "type": "StaticText", + "ref": "e407" + }, + { + "depth": 33, + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 71, + "enabled": true, + "value": "0%", + "rect": { + "width": 402, + "height": 30, + "x": 0, + "y": 164 + }, + "index": 407, + "ref": "e408" + }, + { + "enabled": true, + "rect": { + "width": 393, + "height": 3, + "x": 3, + "y": 164 + }, + "parentIndex": 407, + "index": 408, + "depth": 34, + "type": "Other", + "hittable": false, + "ref": "e409" + }, + { + "enabled": true, + "label": "Vertical scroll bar, 23 pages", + "depth": 33, + "value": "19%", + "rect": { + "width": 30, + "height": 273, + "x": 369, + "y": 161 + }, + "type": "Other", + "index": 409, + "hittable": false, + "parentIndex": 71, + "ref": "e410" + }, + { + "enabled": true, + "type": "Other", + "depth": 34, + "parentIndex": 409, + "rect": { + "width": 3, + "height": 36, + "x": 396, + "y": 350.3333333333335 + }, + "index": 410, + "hittable": false, + "ref": "e411" + }, + { + "type": "Other", + "depth": 33, + "enabled": true, + "label": "Vertical scroll bar, 23 pages", + "parentIndex": 71, + "value": "19%", + "index": 411, + "rect": { + "width": 30, + "height": 273, + "x": 369, + "y": 161 + }, + "hittable": false, + "ref": "e412" + }, + { + "parentIndex": 411, + "type": "Other", + "enabled": true, + "index": 412, + "hittable": false, + "rect": { + "width": 3, + "height": 36, + "x": 396, + "y": 350.3333333333335 + }, + "depth": 34, + "ref": "e413" + }, + { + "enabled": true, + "depth": 33, + "rect": { + "width": 402, + "height": 30, + "x": 0, + "y": 164 + }, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 71, + "hittable": false, + "value": "0%", + "index": 413, + "type": "Other", + "ref": "e414" + }, + { + "type": "Other", + "index": 414, + "parentIndex": 413, + "hittable": false, + "rect": { + "width": 393, + "height": 3, + "x": 3, + "y": 164 + }, + "enabled": true, + "depth": 34, + "ref": "e415" + }, + { + "enabled": true, + "type": "Other", + "depth": 31, + "parentIndex": 68, + "hittable": false, + "index": 415, + "label": "Scroll to bottom", + "rect": { + "width": 48, + "height": 48, + "x": 177, + "y": 370 + }, + "ref": "e416" + }, + { + "type": "Button", + "label": "Scroll to bottom", + "enabled": true, + "depth": 32, + "parentIndex": 415, + "rect": { + "width": 48, + "height": 48, + "x": 177, + "y": 370 + }, + "index": 416, + "identifier": "scroll-to-bottom-button", + "hittable": false, + "ref": "e417" + }, + { + "label": "Message agent... Message, @files, /commands", + "hittable": false, + "index": 417, + "type": "Other", + "enabled": true, + "parentIndex": 65, + "rect": { + "width": 402, + "height": 138, + "x": 0, + "y": 434 + }, + "identifier": "composer-viewport-content", + "depth": 29, + "ref": "e418" + }, + { + "index": 418, + "identifier": "message-input-root", + "hittable": false, + "parentIndex": 417, + "rect": { + "width": 370, + "height": 88, + "x": 16, + "y": 434 + }, + "type": "Other", + "depth": 30, + "enabled": true, + "ref": "e419" + }, + { + "index": 419, + "depth": 30, + "rect": { + "width": 370, + "height": 88, + "x": 16, + "y": 434 + }, + "parentIndex": 417, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e420" + }, + { + "depth": 30, + "hittable": false, + "enabled": true, + "parentIndex": 417, + "type": "Other", + "rect": { + "width": 344, + "height": 30, + "x": 29, + "y": 443 + }, + "label": "Message agent... Message, @files, /commands", + "index": 420, + "ref": "e421" + }, + { + "rect": { + "width": 344, + "height": 30, + "x": 29, + "y": 443 + }, + "index": 421, + "depth": 31, + "parentIndex": 420, + "hittable": false, + "type": "TextView", + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "ref": "e422" + }, + { + "rect": { + "width": 30, + "height": 30, + "x": 340, + "y": 443 + }, + "index": 422, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 32, + "parentIndex": 421, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "ref": "e423" + }, + { + "enabled": true, + "index": 423, + "parentIndex": 422, + "type": "Other", + "rect": { + "width": 3, + "height": 31, + "x": 367, + "y": 439 + }, + "hittable": false, + "depth": 33, + "ref": "e424" + }, + { + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "parentIndex": 421, + "rect": { + "width": 344, + "height": 15, + "x": 29, + "y": 455 + }, + "index": 424, + "type": "Other", + "depth": 32, + "hittable": false, + "ref": "e425" + }, + { + "rect": { + "width": 338, + "height": 3, + "x": 32, + "y": 467 + }, + "index": 425, + "enabled": true, + "parentIndex": 424, + "depth": 33, + "type": "Other", + "hittable": false, + "ref": "e426" + }, + { + "depth": 30, + "index": 426, + "identifier": "message-input-attach-button", + "type": "Button", + "enabled": true, + "label": "Add attachment", + "hittable": false, + "parentIndex": 417, + "rect": { + "width": 28, + "height": 28, + "x": 23, + "y": 485 + }, + "ref": "e427" + }, + { + "enabled": true, + "depth": 31, + "parentIndex": 426, + "type": "Other", + "index": 427, + "rect": { + "width": 28, + "height": 28, + "x": 23, + "y": 485 + }, + "hittable": false, + "ref": "e428" + }, + { + "type": "Other", + "rect": { + "width": 20, + "height": 20, + "x": 27, + "y": 489 + }, + "depth": 32, + "enabled": true, + "hittable": false, + "index": 428, + "parentIndex": 427, + "ref": "e429" + }, + { + "rect": { + "width": 13.333333333333332, + "height": 13.333333333333371, + "x": 30.333333333333332, + "y": 492.3333333333333 + }, + "index": 429, + "hittable": false, + "enabled": true, + "parentIndex": 428, + "depth": 33, + "type": "Other", + "ref": "e430" + }, + { + "index": 430, + "depth": 34, + "hittable": false, + "enabled": true, + "parentIndex": 429, + "type": "Other", + "rect": { + "width": 13.333333333333332, + "height": 1.6666666666666856, + "x": 30.333333333333332, + "y": 498.16666666666663 + }, + "ref": "e431" + }, + { + "parentIndex": 429, + "hittable": false, + "depth": 34, + "index": 431, + "enabled": true, + "rect": { + "width": 1.6666666666666643, + "height": 13.333333333333314, + "x": 36.16666666666667, + "y": 492.33333333333337 + }, + "type": "Other", + "ref": "e432" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 417, + "type": "Other", + "label": "Select model (Ten second stream)", + "index": 432, + "rect": { + "width": 232, + "height": 28, + "x": 51, + "y": 485 + }, + "depth": 30, + "ref": "e433" + }, + { + "depth": 31, + "identifier": "combined-model-selector", + "rect": { + "width": 202, + "height": 28, + "x": 51, + "y": 485 + }, + "label": "Select model (Ten second stream)", + "hittable": false, + "parentIndex": 432, + "type": "Button", + "enabled": true, + "index": 433, + "ref": "e434" + }, + { + "parentIndex": 433, + "rect": { + "width": 20, + "height": 20, + "x": 59, + "y": 489 + }, + "enabled": true, + "depth": 32, + "type": "Other", + "index": 434, + "hittable": false, + "ref": "e435" + }, + { + "enabled": true, + "type": "Other", + "depth": 33, + "parentIndex": 434, + "rect": { + "width": 20, + "height": 20, + "x": 59, + "y": 489 + }, + "index": 435, + "hittable": false, + "ref": "e436" + }, + { + "enabled": true, + "type": "Other", + "depth": 34, + "parentIndex": 435, + "rect": { + "width": 18.33333333333332, + "height": 15, + "x": 59.833333333333336, + "y": 491.5 + }, + "index": 436, + "hittable": false, + "ref": "e437" + }, + { + "enabled": true, + "depth": 35, + "parentIndex": 436, + "rect": { + "width": 15, + "height": 11.666666666666686, + "x": 61.5, + "y": 494.83333333333337 + }, + "hittable": false, + "index": 437, + "type": "Other", + "ref": "e438" + }, + { + "enabled": true, + "parentIndex": 436, + "index": 438, + "rect": { + "width": 5, + "height": 5, + "x": 64.83333333333333, + "y": 491.5 + }, + "depth": 35, + "hittable": false, + "type": "Other", + "ref": "e439" + }, + { + "parentIndex": 436, + "index": 439, + "depth": 35, + "type": "Other", + "hittable": false, + "rect": { + "width": 3.3333333333333357, + "height": 1.6666666666666856, + "x": 59.83333333333333, + "y": 499.83333333333337 + }, + "enabled": true, + "ref": "e440" + }, + { + "type": "Other", + "depth": 35, + "parentIndex": 436, + "index": 440, + "hittable": false, + "rect": { + "width": 1.6666666666666714, + "height": 3.3333333333333144, + "x": 65.66666666666666, + "y": 499 + }, + "enabled": true, + "ref": "e441" + }, + { + "depth": 35, + "rect": { + "width": 1.6666666666666714, + "height": 3.3333333333333144, + "x": 70.66666666666667, + "y": 499 + }, + "hittable": false, + "enabled": true, + "index": 441, + "type": "Other", + "parentIndex": 436, + "ref": "e442" + }, + { + "parentIndex": 436, + "hittable": false, + "rect": { + "width": 3.3333333333333286, + "height": 1.6666666666666856, + "x": 74.83333333333334, + "y": 499.83333333333337 + }, + "index": 442, + "type": "Other", + "depth": 35, + "enabled": true, + "ref": "e443" + }, + { + "label": "Ten second stream", + "rect": { + "width": 130.3333282470703, + "height": 18, + "x": 83, + "y": 490 + }, + "enabled": true, + "depth": 32, + "hittable": false, + "index": 443, + "type": "StaticText", + "parentIndex": 433, + "ref": "e444" + }, + { + "hittable": false, + "index": 444, + "parentIndex": 443, + "enabled": true, + "depth": 33, + "rect": { + "width": 130.3333282470703, + "height": 18, + "x": 83, + "y": 490 + }, + "label": "Ten second stream", + "type": "StaticText", + "ref": "e445" + }, + { + "label": "Context window 2% used", + "depth": 30, + "rect": { + "width": 28, + "height": 28, + "x": 283, + "y": 485 + }, + "enabled": true, + "hittable": false, + "index": 445, + "type": "Image", + "parentIndex": 417, + "identifier": "context-window-meter", + "ref": "e446" + }, + { + "rect": { + "width": 28, + "height": 28, + "x": 315, + "y": 485 + }, + "enabled": true, + "label": "Start dictation", + "hittable": false, + "index": 446, + "parentIndex": 417, + "type": "Button", + "depth": 30, + "ref": "e447" + }, + { + "depth": 30, + "label": "Enable Voice mode", + "hittable": false, + "type": "Button", + "rect": { + "width": 28, + "height": 28, + "x": 351, + "y": 485 + }, + "parentIndex": 417, + "enabled": true, + "index": 447, + "ref": "e448" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 448, + "type": "Other", + "parentIndex": 12, + "hittable": false, + "enabled": true, + "depth": 11, + "ref": "e449" + }, + { + "type": "Other", + "parentIndex": 6, + "hittable": false, + "index": 449, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "depth": 7, + "ref": "e450" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 449, + "depth": 8, + "enabled": true, + "index": 450, + "ref": "e451" + }, + { + "parentIndex": 450, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 451, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 9, + "ref": "e452" + }, + { + "hittable": false, + "index": 452, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Window", + "depth": 1, + "parentIndex": 0, + "enabled": true, + "ref": "e453" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 453, + "type": "Other", + "parentIndex": 452, + "depth": 2, + "ref": "e454" + }, + { + "depth": 3, + "parentIndex": 453, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 454, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e455" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 336, + "x": 0, + "y": 538 + }, + "parentIndex": 453, + "depth": 3, + "enabled": true, + "index": 455, + "type": "Other", + "ref": "e456" + }, + { + "type": "Other", + "depth": 4, + "enabled": true, + "rect": { + "width": 402, + "height": 278, + "x": 0, + "y": 538 + }, + "parentIndex": 455, + "index": 456, + "hittable": false, + "ref": "e457" + }, + { + "depth": 1, + "type": "Window", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 0, + "hittable": true, + "index": 457, + "label": "Emoji", + "ref": "e458" + }, + { + "parentIndex": 457, + "label": "Emoji", + "index": 458, + "hittable": true, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "depth": 2, + "ref": "e459" + }, + { + "type": "Other", + "enabled": true, + "label": "Emoji", + "hittable": true, + "depth": 3, + "index": 459, + "rect": { + "width": 402, + "height": 336, + "x": 0, + "y": 538 + }, + "parentIndex": 458, + "ref": "e460" + }, + { + "depth": 4, + "index": 460, + "enabled": true, + "hittable": false, + "parentIndex": 459, + "type": "Other", + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "ref": "e461" + }, + { + "index": 461, + "hittable": false, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "parentIndex": 460, + "depth": 5, + "type": "Other", + "enabled": true, + "ref": "e462" + }, + { + "index": 462, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "hittable": false, + "parentIndex": 461, + "depth": 6, + "ref": "e463" + }, + { + "index": 463, + "label": "Typing Predictions", + "hittable": true, + "parentIndex": 459, + "identifier": "SystemInputAssistantView", + "depth": 4, + "enabled": true, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "type": "Other", + "ref": "e464" + }, + { + "hittable": true, + "parentIndex": 463, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "index": 464, + "type": "Other", + "depth": 5, + "enabled": true, + "label": "Typing Predictions", + "ref": "e465" + }, + { + "parentIndex": 464, + "index": 465, + "type": "Other", + "enabled": true, + "label": "Typing Predictions", + "identifier": "CenterPageView", + "depth": 6, + "hittable": true, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "ref": "e466" + }, + { + "index": 466, + "depth": 7, + "parentIndex": 465, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "height": 1245, + "x": 0, + "y": -62 + }, + "ref": "e467" + }, + { + "depth": 8, + "hittable": false, + "enabled": true, + "type": "ScrollView", + "index": 467, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "parentIndex": 466, + "ref": "e468" + }, + { + "type": "Other", + "parentIndex": 465, + "hittable": true, + "enabled": true, + "label": "Typing Predictions", + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "index": 468, + "depth": 7, + "ref": "e469" + }, + { + "index": 469, + "label": "Typing Predictions", + "parentIndex": 468, + "depth": 8, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "hittable": true, + "enabled": true, + "type": "Other", + "ref": "e470" + }, + { + "type": "Other", + "enabled": true, + "hittable": true, + "parentIndex": 469, + "index": 470, + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "label": "I", + "depth": 9, + "ref": "e471" + }, + { + "index": 471, + "hittable": true, + "type": "Other", + "rect": { + "width": 402, + "height": 45, + "x": 0, + "y": 538 + }, + "label": "I", + "enabled": true, + "depth": 10, + "parentIndex": 470, + "ref": "e472" + }, + { + "rect": { + "width": 134, + "height": 45, + "x": 0, + "y": 538 + }, + "enabled": true, + "parentIndex": 471, + "index": 472, + "depth": 11, + "type": "Other", + "label": "I", + "hittable": true, + "ref": "e473" + }, + { + "label": "The", + "depth": 11, + "rect": { + "width": 134, + "height": 45, + "x": 134, + "y": 538 + }, + "hittable": true, + "enabled": true, + "index": 473, + "type": "Other", + "parentIndex": 471, + "ref": "e474" + }, + { + "type": "Other", + "hittable": true, + "enabled": true, + "depth": 11, + "label": "I’m", + "index": 474, + "parentIndex": 471, + "rect": { + "width": 134, + "height": 45, + "x": 268, + "y": 538 + }, + "ref": "e475" + }, + { + "depth": 4, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 233, + "x": 0, + "y": 583 + }, + "parentIndex": 459, + "hittable": false, + "index": 475, + "ref": "e476" + }, + { + "enabled": true, + "depth": 5, + "parentIndex": 475, + "type": "Other", + "rect": { + "width": 402, + "height": 291, + "x": 0, + "y": 583 + }, + "index": 476, + "hittable": false, + "ref": "e477" + }, + { + "parentIndex": 476, + "rect": { + "width": 402, + "height": 291, + "x": 0, + "y": 583 + }, + "index": 477, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 6, + "ref": "e478" + }, + { + "hittable": false, + "parentIndex": 477, + "type": "Other", + "enabled": true, + "index": 478, + "depth": 7, + "rect": { + "width": 402, + "height": 291, + "x": 0, + "y": 583 + }, + "ref": "e479" + }, + { + "rect": { + "width": 402, + "height": 233, + "x": 0, + "y": 583 + }, + "label": "Q", + "index": 479, + "type": "Other", + "depth": 4, + "parentIndex": 459, + "enabled": true, + "hittable": false, + "ref": "e480" + }, + { + "enabled": true, + "depth": 5, + "rect": { + "width": 402, + "height": 233, + "x": 0, + "y": 583 + }, + "label": "Q", + "index": 480, + "parentIndex": 479, + "type": "Keyboard", + "hittable": false, + "ref": "e481" + }, + { + "rect": { + "width": 402, + "height": 233, + "x": 0, + "y": 583 + }, + "enabled": true, + "parentIndex": 480, + "type": "Other", + "label": "Q", + "hittable": false, + "depth": 6, + "index": 481, + "ref": "e482" + }, + { + "depth": 7, + "type": "Other", + "index": 482, + "rect": { + "width": 402, + "height": 233, + "x": 0, + "y": 583 + }, + "enabled": true, + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "label": "Q", + "parentIndex": 481, + "ref": "e483" + }, + { + "hittable": false, + "index": 483, + "depth": 8, + "parentIndex": 482, + "type": "Key", + "label": "Q", + "enabled": true, + "rect": { + "width": 40.333333333333336, + "height": 46, + "x": 0, + "y": 590 + }, + "ref": "e484" + }, + { + "depth": 8, + "enabled": true, + "index": 484, + "parentIndex": 482, + "label": "W", + "type": "Key", + "rect": { + "width": 40.00000000000001, + "height": 46, + "x": 40.333333333333336, + "y": 590 + }, + "hittable": false, + "ref": "e485" + }, + { + "label": "E", + "index": 485, + "parentIndex": 482, + "hittable": false, + "type": "Key", + "enabled": true, + "depth": 8, + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 80.33333333333334, + "y": 590 + }, + "ref": "e486" + }, + { + "rect": { + "width": 40, + "height": 46, + "x": 120.66666666666669, + "y": 590 + }, + "type": "Key", + "enabled": true, + "depth": 8, + "parentIndex": 482, + "hittable": false, + "index": 486, + "label": "R", + "ref": "e487" + }, + { + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 160.66666666666669, + "y": 590 + }, + "enabled": true, + "depth": 8, + "label": "T", + "hittable": false, + "parentIndex": 482, + "type": "Key", + "index": 487, + "ref": "e488" + }, + { + "index": 488, + "hittable": false, + "type": "Key", + "label": "Y", + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 201.00000000000003, + "y": 590 + }, + "enabled": true, + "ref": "e489" + }, + { + "type": "Key", + "depth": 8, + "parentIndex": 482, + "hittable": false, + "index": 489, + "enabled": true, + "label": "U", + "rect": { + "width": 40, + "height": 46, + "x": 241.33333333333337, + "y": 590 + }, + "ref": "e490" + }, + { + "type": "Key", + "enabled": true, + "parentIndex": 482, + "hittable": false, + "label": "I", + "depth": 8, + "index": 490, + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 281.33333333333337, + "y": 590 + }, + "ref": "e491" + }, + { + "rect": { + "width": 40, + "height": 46, + "x": 321.6666666666667, + "y": 590 + }, + "depth": 8, + "index": 491, + "type": "Key", + "hittable": false, + "enabled": true, + "parentIndex": 482, + "label": "O", + "ref": "e492" + }, + { + "label": "P", + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 361.6666666666667, + "y": 590 + }, + "depth": 8, + "enabled": true, + "parentIndex": 482, + "type": "Key", + "hittable": false, + "index": 492, + "ref": "e493" + }, + { + "parentIndex": 482, + "enabled": true, + "rect": { + "width": 40.33333333333333, + "height": 46, + "x": 19.666666666666668, + "y": 644 + }, + "label": "A", + "type": "Key", + "hittable": false, + "index": 493, + "depth": 8, + "ref": "e494" + }, + { + "enabled": true, + "label": "S", + "parentIndex": 482, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 60, + "y": 644 + }, + "index": 494, + "hittable": false, + "depth": 8, + "ref": "e495" + }, + { + "type": "Key", + "label": "D", + "index": 495, + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40, + "height": 46, + "x": 100.33333333333334, + "y": 644 + }, + "enabled": true, + "hittable": false, + "ref": "e496" + }, + { + "label": "F", + "enabled": true, + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334, + "y": 644 + }, + "parentIndex": 482, + "depth": 8, + "index": 496, + "type": "Key", + "hittable": false, + "ref": "e497" + }, + { + "type": "Key", + "depth": 8, + "hittable": false, + "enabled": true, + "index": 497, + "rect": { + "width": 40, + "height": 46, + "x": 181.2026666666667, + "y": 644 + }, + "label": "G", + "parentIndex": 482, + "ref": "e498" + }, + { + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667, + "y": 644 + }, + "type": "Key", + "index": 498, + "label": "H", + "enabled": true, + "parentIndex": 482, + "hittable": false, + "depth": 8, + "ref": "e499" + }, + { + "label": "J", + "hittable": false, + "rect": { + "width": 40, + "height": 46, + "x": 261.536, + "y": 644 + }, + "enabled": true, + "type": "Key", + "index": 499, + "parentIndex": 482, + "depth": 8, + "ref": "e500" + }, + { + "type": "Key", + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 301.536, + "y": 644 + }, + "hittable": false, + "enabled": true, + "parentIndex": 482, + "depth": 8, + "label": "K", + "index": 500, + "ref": "e501" + }, + { + "hittable": false, + "label": "L", + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 341.8693333333333, + "y": 644 + }, + "depth": 8, + "enabled": true, + "parentIndex": 482, + "index": 501, + "type": "Key", + "ref": "e502" + }, + { + "enabled": true, + "identifier": "shift", + "rect": { + "width": 51.333333333333336, + "height": 46, + "x": 0, + "y": 698 + }, + "hittable": false, + "index": 502, + "type": "Button", + "label": "shift", + "depth": 8, + "selected": true, + "parentIndex": 482, + "ref": "e503" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "label": "Z", + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 60, + "y": 698 + }, + "index": 503, + "parentIndex": 482, + "type": "Key", + "ref": "e504" + }, + { + "rect": { + "width": 40, + "height": 46, + "x": 100.33333333333334, + "y": 698 + }, + "enabled": true, + "parentIndex": 482, + "label": "X", + "index": 504, + "depth": 8, + "hittable": false, + "type": "Key", + "ref": "e505" + }, + { + "type": "Key", + "enabled": true, + "depth": 8, + "hittable": false, + "parentIndex": 482, + "rect": { + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334, + "y": 698 + }, + "label": "C", + "index": 505, + "ref": "e506" + }, + { + "parentIndex": 482, + "rect": { + "width": 40, + "height": 46, + "x": 181.2026666666667, + "y": 698 + }, + "index": 506, + "hittable": false, + "enabled": true, + "depth": 8, + "type": "Key", + "label": "V", + "ref": "e507" + }, + { + "hittable": false, + "enabled": true, + "depth": 8, + "parentIndex": 482, + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667, + "y": 698 + }, + "type": "Key", + "label": "B", + "index": 507, + "ref": "e508" + }, + { + "label": "N", + "depth": 8, + "enabled": true, + "parentIndex": 482, + "index": 508, + "hittable": false, + "rect": { + "width": 40, + "height": 46, + "x": 261.536, + "y": 698 + }, + "type": "Key", + "ref": "e509" + }, + { + "type": "Key", + "index": 509, + "label": "M", + "hittable": false, + "parentIndex": 482, + "enabled": true, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "height": 46, + "x": 301.536, + "y": 698 + }, + "ref": "e510" + }, + { + "identifier": "delete", + "enabled": true, + "rect": { + "width": 51.333333333333314, + "height": 46, + "x": 350.42133333333334, + "y": 698 + }, + "hittable": false, + "index": 510, + "label": "delete", + "depth": 8, + "parentIndex": 482, + "type": "Key", + "ref": "e511" + }, + { + "identifier": "more", + "enabled": true, + "rect": { + "width": 101, + "height": 46, + "x": 0, + "y": 752 + }, + "hittable": false, + "index": 511, + "label": "numbers", + "depth": 8, + "parentIndex": 482, + "type": "Key", + "ref": "e512" + }, + { + "parentIndex": 482, + "depth": 8, + "hittable": false, + "rect": { + "width": 201.33333333333334, + "height": 46, + "x": 100.33333333333334, + "y": 752 + }, + "index": 512, + "identifier": "space", + "type": "Key", + "enabled": true, + "label": "space", + "ref": "e513" + }, + { + "identifier": "Return", + "index": 513, + "label": "return", + "parentIndex": 482, + "enabled": true, + "type": "Button", + "rect": { + "width": 100.33333333333331, + "height": 46, + "x": 301.6666666666667, + "y": 752 + }, + "depth": 8, + "hittable": false, + "ref": "e514" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "height": 291, + "x": 0, + "y": 583 + }, + "index": 514, + "parentIndex": 459, + "hittable": true, + "depth": 4, + "type": "Other", + "enabled": true, + "ref": "e515" + }, + { + "hittable": true, + "type": "Button", + "enabled": true, + "index": 515, + "label": "Emoji", + "rect": { + "width": 68.0852958475086, + "height": 68.73516393505099, + "x": 8.47726568115926, + "y": 805.6989567998571 + }, + "depth": 5, + "parentIndex": 514, + "ref": "e516" + }, + { + "parentIndex": 515, + "index": 516, + "hittable": false, + "rect": { + "width": 0, + "height": 0, + "x": 8.47726568115926, + "y": 805.6989567998571 + }, + "depth": 6, + "enabled": true, + "type": "StaticText", + "ref": "e517" + }, + { + "identifier": "dictation", + "index": 517, + "parentIndex": 514, + "rect": { + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "enabled": true, + "type": "Button", + "hittable": false, + "depth": 5, + "label": "Dictate", + "ref": "e518" + }, + { + "depth": 6, + "parentIndex": 517, + "type": "StaticText", + "enabled": true, + "index": 518, + "rect": { + "width": 0, + "height": 0, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "hittable": false, + "ref": "e519" + }, + { + "identifier": "dictation", + "label": "Dictate", + "rect": { + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "hittable": true, + "index": 519, + "type": "Button", + "enabled": true, + "depth": 5, + "parentIndex": 514, + "ref": "e520" + }, + { + "enabled": true, + "index": 520, + "parentIndex": 519, + "rect": { + "width": 0, + "height": 0, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "hittable": false, + "type": "StaticText", + "depth": 6, + "ref": "e521" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 521, + "totalNodeCount": 521, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 119, + "p50Ms": 143, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 119 + } + } + }, + "refsGeneration": 776183 + } +} diff --git a/scroll-regression/ios/chat-slow-down.png b/scroll-regression/ios/chat-slow-down.png new file mode 100644 index 0000000000..4219bf7f53 Binary files /dev/null and b/scroll-regression/ios/chat-slow-down.png differ diff --git a/scroll-regression/ios/chat-target.json b/scroll-regression/ios/chat-target.json new file mode 100644 index 0000000000..d140a34300 --- /dev/null +++ b/scroll-regression/ios/chat-target.json @@ -0,0 +1,6060 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": true, + "label": "Paseo Debug", + "type": "Application", + "index": 0, + "enabled": true, + "depth": 0, + "ref": "e1" + }, + { + "depth": 1, + "type": "Window", + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 0, + "index": 1, + "enabled": true, + "ref": "e2" + }, + { + "type": "Other", + "parentIndex": 1, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 2, + "enabled": true, + "hittable": false, + "index": 2, + "ref": "e3" + }, + { + "hittable": false, + "parentIndex": 2, + "depth": 3, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "index": 3, + "enabled": true, + "ref": "e4" + }, + { + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "enabled": true, + "depth": 4, + "index": 4, + "hittable": false, + "parentIndex": 3, + "type": "Other", + "ref": "e5" + }, + { + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "depth": 1, + "enabled": true, + "hittable": false, + "index": 5, + "parentIndex": 0, + "type": "Window", + "ref": "e6" + }, + { + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "enabled": true, + "index": 6, + "type": "Other", + "depth": 2, + "hittable": false, + "parentIndex": 5, + "ref": "e7" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "index": 7, + "depth": 3, + "parentIndex": 6, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "ref": "e8" + }, + { + "index": 8, + "enabled": true, + "depth": 4, + "parentIndex": 7, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "type": "Other", + "hittable": false, + "ref": "e9" + }, + { + "hittable": false, + "index": 9, + "parentIndex": 8, + "depth": 5, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "type": "Other", + "enabled": true, + "ref": "e10" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "index": 10, + "parentIndex": 9, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "depth": 6, + "ref": "e11" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 10, + "enabled": true, + "depth": 7, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 11, + "ref": "e12" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 8, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 11, + "index": 12, + "ref": "e13" + }, + { + "index": 13, + "parentIndex": 12, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "depth": 9, + "hittable": false, + "enabled": true, + "ref": "e14" + }, + { + "enabled": true, + "hittable": false, + "index": 14, + "depth": 9, + "parentIndex": 12, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "ref": "e15" + }, + { + "parentIndex": 14, + "depth": 10, + "type": "Other", + "index": 15, + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "ref": "e16" + }, + { + "index": 16, + "type": "Other", + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "depth": 10, + "parentIndex": 14, + "ref": "e17" + }, + { + "index": 17, + "type": "Other", + "hittable": false, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 16, + "depth": 11, + "ref": "e18" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "depth": 11, + "parentIndex": 16, + "hittable": false, + "index": 18, + "type": "Other", + "ref": "e19" + }, + { + "hittable": false, + "index": 19, + "type": "Other", + "parentIndex": 18, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 12, + "enabled": true, + "ref": "e20" + }, + { + "depth": 13, + "type": "Other", + "index": 20, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "parentIndex": 19, + "hittable": false, + "enabled": true, + "ref": "e21" + }, + { + "enabled": true, + "parentIndex": 20, + "type": "Other", + "index": 21, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 14, + "ref": "e22" + }, + { + "enabled": true, + "index": 22, + "type": "Other", + "depth": 15, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "hittable": false, + "parentIndex": 21, + "ref": "e23" + }, + { + "depth": 16, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 23, + "hittable": false, + "parentIndex": 22, + "enabled": true, + "ref": "e24" + }, + { + "hittable": false, + "index": 24, + "type": "Other", + "depth": 17, + "parentIndex": 23, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "enabled": true, + "ref": "e25" + }, + { + "depth": 18, + "enabled": true, + "parentIndex": 24, + "index": 25, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "ref": "e26" + }, + { + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "parentIndex": 25, + "depth": 19, + "index": 26, + "enabled": true, + "hittable": false, + "ref": "e27" + }, + { + "index": 27, + "depth": 20, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "parentIndex": 26, + "type": "Other", + "hittable": false, + "ref": "e28" + }, + { + "hittable": false, + "index": 28, + "enabled": true, + "depth": 21, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "parentIndex": 27, + "type": "Other", + "label": "Switch tabs (1 open)", + "ref": "e29" + }, + { + "parentIndex": 28, + "label": "Open menu", + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 29, + "hittable": false, + "depth": 22, + "ref": "e30" + }, + { + "type": "Other", + "depth": 23, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Open menu", + "parentIndex": 29, + "hittable": false, + "enabled": true, + "index": 30, + "ref": "e31" + }, + { + "parentIndex": 30, + "type": "Other", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "depth": 24, + "enabled": true, + "hittable": false, + "index": 31, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Open menu", + "ref": "e32" + }, + { + "label": "Open menu", + "identifier": "composer-dock-header", + "type": "Other", + "index": 32, + "rect": { + "x": 0, + "width": 402, + "height": 126, + "y": 0 + }, + "hittable": false, + "parentIndex": 31, + "enabled": true, + "depth": 25, + "ref": "e33" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 32, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "height": 56, + "y": 70 + }, + "index": 33, + "depth": 26, + "ref": "e34" + }, + { + "type": "Button", + "hittable": false, + "rect": { + "x": 8, + "width": 32, + "height": 32, + "y": 81.6666669845581 + }, + "parentIndex": 32, + "enabled": true, + "label": "Open menu", + "identifier": "menu-button", + "depth": 26, + "index": 34, + "ref": "e35" + }, + { + "type": "Other", + "rect": { + "x": 48, + "width": 314, + "height": 34, + "y": 80.6666669845581 + }, + "label": "main", + "enabled": true, + "depth": 26, + "hittable": false, + "index": 35, + "parentIndex": 32, + "ref": "e36" + }, + { + "enabled": true, + "index": 36, + "hittable": false, + "label": "main", + "type": "Other", + "rect": { + "x": 48, + "width": 278, + "height": 34, + "y": 80.6666669845581 + }, + "depth": 27, + "parentIndex": 35, + "ref": "e37" + }, + { + "type": "StaticText", + "depth": 28, + "parentIndex": 36, + "label": "main", + "identifier": "workspace-header-title", + "index": 37, + "rect": { + "x": 48, + "width": 278, + "height": 18, + "y": 80.6666669845581 + }, + "enabled": true, + "hittable": false, + "ref": "e38" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "x": 48, + "width": 278, + "height": 18, + "y": 80.6666669845581 + }, + "label": "main", + "index": 38, + "depth": 29, + "hittable": false, + "parentIndex": 37, + "ref": "e39" + }, + { + "identifier": "workspace-header-subtitle", + "depth": 28, + "enabled": true, + "type": "StaticText", + "rect": { + "x": 48, + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "index": 39, + "parentIndex": 36, + "label": "composer-dock-ios-fixture", + "hittable": false, + "ref": "e40" + }, + { + "label": "composer-dock-ios-fixture", + "hittable": false, + "type": "StaticText", + "index": 40, + "parentIndex": 39, + "depth": 29, + "rect": { + "x": 48, + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "enabled": true, + "ref": "e41" + }, + { + "label": "·", + "hittable": false, + "type": "StaticText", + "index": 41, + "parentIndex": 36, + "depth": 28, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4 + }, + "enabled": true, + "ref": "e42" + }, + { + "label": "·", + "hittable": false, + "type": "StaticText", + "index": 42, + "parentIndex": 41, + "depth": 29, + "rect": { + "x": 217.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688, + "width": 4 + }, + "enabled": true, + "ref": "e43" + }, + { + "label": "dev-new", + "hittable": false, + "type": "Other", + "index": 43, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "depth": 28, + "rect": { + "x": 227.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 68.00001525878906 + }, + "enabled": true, + "parentIndex": 36, + "ref": "e44" + }, + { + "hittable": false, + "type": "Other", + "index": 44, + "parentIndex": 36, + "depth": 28, + "rect": { + "x": 227.3333282470703, + "y": 100.6666669845581, + "height": 12, + "width": 12 + }, + "enabled": true, + "ref": "e45" + }, + { + "hittable": false, + "type": "Other", + "index": 45, + "parentIndex": 44, + "depth": 29, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 11, + "width": 11 + }, + "enabled": true, + "ref": "e46" + }, + { + "hittable": false, + "type": "Other", + "index": 46, + "parentIndex": 45, + "depth": 30, + "rect": { + "x": 227.8333282470703, + "y": 101.1666669845581, + "height": 5, + "width": 11 + }, + "enabled": true, + "ref": "e47" + }, + { + "hittable": false, + "type": "Other", + "index": 47, + "parentIndex": 45, + "depth": 30, + "rect": { + "x": 227.8333282470703, + "y": 107.1666669845581, + "height": 5, + "width": 11 + }, + "enabled": true, + "ref": "e48" + }, + { + "hittable": false, + "type": "Other", + "index": 48, + "parentIndex": 45, + "depth": 30, + "rect": { + "x": 229.8333282470703, + "y": 103.1666669845581, + "height": 1, + "width": 1.0049999999999955 + }, + "enabled": true, + "ref": "e49" + }, + { + "hittable": false, + "type": "Other", + "index": 49, + "parentIndex": 45, + "depth": 30, + "rect": { + "x": 229.8333282470703, + "y": 109.1666669845581, + "height": 1, + "width": 1.0049999999999955 + }, + "enabled": true, + "ref": "e50" + }, + { + "label": "dev-new", + "hittable": false, + "type": "StaticText", + "index": 50, + "parentIndex": 36, + "depth": 28, + "rect": { + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906 + }, + "enabled": true, + "ref": "e51" + }, + { + "label": "dev-new", + "hittable": false, + "type": "StaticText", + "index": 51, + "parentIndex": 50, + "depth": 29, + "rect": { + "x": 242.3333282470703, + "y": 98.6666669845581, + "height": 16, + "width": 53.00001525878906 + }, + "enabled": true, + "ref": "e52" + }, + { + "label": "Workspace actions", + "hittable": false, + "type": "Button", + "index": 52, + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "rect": { + "x": 330, + "y": 81.6666669845581, + "height": 32, + "width": 32 + }, + "enabled": true, + "parentIndex": 35, + "ref": "e53" + }, + { + "label": "Open Explorer sidebar", + "hittable": false, + "type": "Button", + "index": 53, + "identifier": "workspace-explorer-toggle", + "depth": 26, + "rect": { + "x": 362, + "y": 81.6666669845581, + "height": 32, + "width": 32 + }, + "enabled": true, + "parentIndex": 32, + "ref": "e54" + }, + { + "hittable": false, + "type": "Other", + "index": 54, + "parentIndex": 31, + "depth": 25, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e55" + }, + { + "hittable": false, + "type": "Other", + "index": 55, + "parentIndex": 31, + "depth": 25, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e56" + }, + { + "label": "Switch tabs (1 open)", + "hittable": false, + "type": "Button", + "index": 56, + "identifier": "workspace-tab-switcher-trigger", + "depth": 25, + "rect": { + "x": 0, + "y": 126, + "height": 34, + "width": 402 + }, + "enabled": true, + "parentIndex": 31, + "ref": "e57" + }, + { + "hittable": false, + "type": "Other", + "index": 57, + "identifier": "workspace-active-tab-icon", + "depth": 26, + "rect": { + "x": 20, + "y": 136, + "height": 14, + "width": 14 + }, + "enabled": true, + "parentIndex": 56, + "ref": "e58" + }, + { + "hittable": false, + "type": "Other", + "index": 58, + "identifier": "workspace-tabs-row", + "depth": 25, + "rect": { + "x": 0, + "y": 126, + "height": 35, + "width": 402 + }, + "enabled": true, + "parentIndex": 31, + "ref": "e59" + }, + { + "hittable": false, + "type": "Other", + "index": 59, + "parentIndex": 31, + "depth": 25, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e60" + }, + { + "hittable": false, + "type": "Other", + "index": 60, + "parentIndex": 31, + "depth": 25, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e61" + }, + { + "label": "Add attachment", + "hittable": false, + "type": "Other", + "index": 61, + "parentIndex": 60, + "depth": 26, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e62" + }, + { + "hittable": false, + "type": "Other", + "index": 62, + "parentIndex": 61, + "depth": 27, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e63" + }, + { + "hittable": false, + "type": "Other", + "index": 63, + "parentIndex": 61, + "depth": 27, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e64" + }, + { + "label": "Message agent...", + "hittable": false, + "type": "Other", + "index": 64, + "identifier": "composer-viewport", + "depth": 27, + "rect": { + "x": 0, + "y": 161, + "height": 713, + "width": 402 + }, + "enabled": true, + "parentIndex": 61, + "ref": "e65" + }, + { + "label": "Message agent...", + "hittable": false, + "type": "Other", + "index": 65, + "parentIndex": 64, + "depth": 28, + "rect": { + "x": 0, + "y": -141, + "height": 713, + "width": 402 + }, + "enabled": true, + "ref": "e66" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 66, + "identifier": "composer-dock-content", + "depth": 29, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "parentIndex": 65, + "ref": "e67" + }, + { + "hittable": false, + "type": "Other", + "index": 67, + "parentIndex": 66, + "depth": 30, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "ref": "e68" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 68, + "parentIndex": 66, + "depth": 30, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "ref": "e69" + }, + { + "hittable": false, + "type": "Other", + "index": 69, + "parentIndex": 68, + "depth": 31, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "ref": "e70" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 70, + "identifier": "agent-chat-scroll", + "depth": 31, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "parentIndex": 68, + "ref": "e71" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "ScrollView", + "index": 71, + "parentIndex": 70, + "depth": 32, + "rect": { + "x": 0, + "y": -141, + "height": 307, + "width": 402 + }, + "enabled": true, + "ref": "e72" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Other", + "index": 72, + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 0, + "y": -3213, + "height": 3379, + "width": 402 + }, + "enabled": true, + "ref": "e73" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Other", + "index": 73, + "parentIndex": 72, + "depth": 34, + "rect": { + "x": 0, + "y": -3213, + "height": 3379, + "width": 402 + }, + "enabled": true, + "ref": "e74" + }, + { + "hittable": false, + "type": "Other", + "index": 74, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -3213, + "height": 32, + "width": 378 + }, + "enabled": true, + "ref": "e75" + }, + { + "hittable": false, + "type": "Other", + "index": 75, + "identifier": "older-history-slot", + "depth": 36, + "rect": { + "x": 12, + "y": -3213, + "height": 32, + "width": 378 + }, + "enabled": true, + "parentIndex": 74, + "ref": "e76" + }, + { + "hittable": false, + "type": "Other", + "index": 76, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -3181, + "height": 634, + "width": 378 + }, + "enabled": true, + "ref": "e77" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Other", + "index": 77, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -2547, + "height": 36, + "width": 378 + }, + "enabled": true, + "ref": "e78" + }, + { + "hittable": false, + "type": "Other", + "index": 78, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -2547, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 77, + "ref": "e79" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Button", + "index": 79, + "parentIndex": 77, + "depth": 36, + "rect": { + "x": 7, + "y": -2547, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e80" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 80, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -2511, + "height": 646, + "width": 378 + }, + "enabled": true, + "ref": "e81" + }, + { + "hittable": false, + "type": "Other", + "index": 81, + "identifier": "assistant-message", + "depth": 36, + "rect": { + "x": 20, + "y": -2511, + "height": 642, + "width": 362 + }, + "enabled": true, + "parentIndex": 80, + "ref": "e82" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 82, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 20, + "y": -2499, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e83" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 83, + "parentIndex": 82, + "depth": 37, + "rect": { + "x": 20, + "y": -2499, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e84" + }, + { + "hittable": false, + "type": "Other", + "index": 84, + "parentIndex": 83, + "depth": 38, + "rect": { + "x": 20, + "y": -2499, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e85" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "index": 85, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 83, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e86" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "index": 86, + "parentIndex": 85, + "depth": 39, + "rect": { + "x": 20, + "y": -2499, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e87" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 87, + "value": "0%", + "parentIndex": 85, + "depth": 39, + "rect": { + "x": 349, + "y": -2499, + "height": 132, + "width": 30 + }, + "enabled": true, + "ref": "e88" + }, + { + "hittable": false, + "type": "Other", + "index": 88, + "parentIndex": 87, + "depth": 40, + "rect": { + "x": 376, + "y": -2538, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e89" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 89, + "value": "0%", + "parentIndex": 85, + "depth": 39, + "rect": { + "x": 20, + "y": -2400, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e90" + }, + { + "hittable": false, + "type": "Other", + "index": 90, + "parentIndex": 89, + "depth": 40, + "rect": { + "x": -19, + "y": -2373, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e91" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 91, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 30, + "y": -2339, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e92" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 92, + "parentIndex": 91, + "depth": 37, + "rect": { + "x": 30, + "y": -2339, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e93" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "Other", + "index": 93, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -2339, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e94" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "Other", + "index": 94, + "parentIndex": 93, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -2339, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e95" + }, + { + "hittable": false, + "type": "Other", + "index": 95, + "parentIndex": 94, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -2339, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e96" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "index": 96, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 94, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e97" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "index": 97, + "parentIndex": 96, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2339, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e98" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 98, + "value": "0%", + "parentIndex": 96, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -2339, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e99" + }, + { + "hittable": false, + "type": "Other", + "index": 99, + "parentIndex": 98, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -2378, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e100" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 100, + "value": "0%", + "parentIndex": 96, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2284, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e101" + }, + { + "hittable": false, + "type": "Other", + "index": 101, + "parentIndex": 100, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -2257, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e102" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 102, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 30, + "y": -2247, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e103" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 103, + "parentIndex": 102, + "depth": 37, + "rect": { + "x": 30, + "y": -2247, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e104" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "Other", + "index": 104, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -2247, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e105" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "Other", + "index": 105, + "parentIndex": 104, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -2247, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e106" + }, + { + "hittable": false, + "type": "Other", + "index": 106, + "parentIndex": 105, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -2247, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e107" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "TextView", + "index": 107, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 105, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e108" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "TextView", + "index": 108, + "parentIndex": 107, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2247, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e109" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 109, + "value": "0%", + "parentIndex": 107, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -2247, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e110" + }, + { + "hittable": false, + "type": "Other", + "index": 110, + "parentIndex": 109, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -2286, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e111" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 111, + "value": "0%", + "parentIndex": 107, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2192, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e112" + }, + { + "hittable": false, + "type": "Other", + "index": 112, + "parentIndex": 111, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -2165, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e113" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 113, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 30, + "y": -2155, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e114" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 114, + "parentIndex": 113, + "depth": 37, + "rect": { + "x": 30, + "y": -2155, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e115" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "Other", + "index": 115, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -2155, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e116" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "Other", + "index": 116, + "parentIndex": 115, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -2155, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e117" + }, + { + "hittable": false, + "type": "Other", + "index": 117, + "parentIndex": 116, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -2155, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e118" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "index": 118, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 116, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e119" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "index": 119, + "parentIndex": 118, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2155, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e120" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 120, + "value": "0%", + "parentIndex": 118, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -2155, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e121" + }, + { + "hittable": false, + "type": "Other", + "index": 121, + "parentIndex": 120, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -2194, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e122" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 122, + "value": "0%", + "parentIndex": 118, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2100, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e123" + }, + { + "hittable": false, + "type": "Other", + "index": 123, + "parentIndex": 122, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -2073, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e124" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 124, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 30, + "y": -2063, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e125" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 125, + "parentIndex": 124, + "depth": 37, + "rect": { + "x": 30, + "y": -2063, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e126" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "Other", + "index": 126, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -2063, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e127" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "Other", + "index": 127, + "parentIndex": 126, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -2063, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e128" + }, + { + "hittable": false, + "type": "Other", + "index": 128, + "parentIndex": 127, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -2063, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e129" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "TextView", + "index": 129, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 127, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e130" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "TextView", + "index": 130, + "parentIndex": 129, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2063, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e131" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 131, + "value": "0%", + "parentIndex": 129, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -2063, + "height": 66, + "width": 30 + }, + "enabled": true, + "ref": "e132" + }, + { + "hittable": false, + "type": "Other", + "index": 132, + "parentIndex": 131, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -2102, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e133" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 133, + "value": "0%", + "parentIndex": 129, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -2030, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e134" + }, + { + "hittable": false, + "type": "Other", + "index": 134, + "parentIndex": 133, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -2003, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e135" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "index": 135, + "parentIndex": 80, + "depth": 36, + "rect": { + "x": 20, + "y": -1981, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e136" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "index": 136, + "parentIndex": 135, + "depth": 37, + "rect": { + "x": 20, + "y": -1981, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e137" + }, + { + "hittable": false, + "type": "Other", + "index": 137, + "parentIndex": 136, + "depth": 38, + "rect": { + "x": 20, + "y": -1981, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e138" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "TextView", + "index": 138, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 136, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e139" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "TextView", + "index": 139, + "parentIndex": 138, + "depth": 39, + "rect": { + "x": 20, + "y": -1981, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e140" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 140, + "value": "0%", + "parentIndex": 138, + "depth": 39, + "rect": { + "x": 349, + "y": -1981, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e141" + }, + { + "hittable": false, + "type": "Other", + "index": 141, + "parentIndex": 140, + "depth": 40, + "rect": { + "x": 376, + "y": -2020, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e142" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 142, + "value": "0%", + "parentIndex": 138, + "depth": 39, + "rect": { + "x": 20, + "y": -1926, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e143" + }, + { + "hittable": false, + "type": "Other", + "index": 143, + "parentIndex": 142, + "depth": 40, + "rect": { + "x": -19, + "y": -1899, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e144" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "type": "Other", + "index": 144, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1865, + "height": 32, + "width": 378 + }, + "enabled": true, + "ref": "e145" + }, + { + "hittable": false, + "type": "Other", + "index": 145, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -1865, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 144, + "ref": "e146" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "type": "Button", + "index": 146, + "parentIndex": 144, + "depth": 36, + "rect": { + "x": 7, + "y": -1865, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e147" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Other", + "index": 147, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1833, + "height": 36, + "width": 378 + }, + "enabled": true, + "ref": "e148" + }, + { + "hittable": false, + "type": "Other", + "index": 148, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -1833, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 147, + "ref": "e149" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Button", + "index": 149, + "parentIndex": 147, + "depth": 36, + "rect": { + "x": 7, + "y": -1833, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e150" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 150, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1797, + "height": 570, + "width": 378 + }, + "enabled": true, + "ref": "e151" + }, + { + "hittable": false, + "type": "Other", + "index": 151, + "identifier": "assistant-message", + "depth": 36, + "rect": { + "x": 20, + "y": -1797, + "height": 566, + "width": 362 + }, + "enabled": true, + "parentIndex": 150, + "ref": "e152" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 152, + "parentIndex": 150, + "depth": 36, + "rect": { + "x": 20, + "y": -1785, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e153" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 153, + "parentIndex": 152, + "depth": 37, + "rect": { + "x": 20, + "y": -1785, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e154" + }, + { + "hittable": false, + "type": "Other", + "index": 154, + "parentIndex": 153, + "depth": 38, + "rect": { + "x": 20, + "y": -1785, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e155" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "TextView", + "index": 155, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 153, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e156" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "hittable": false, + "type": "TextView", + "index": 156, + "parentIndex": 155, + "depth": 39, + "rect": { + "x": 20, + "y": -1785, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e157" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 157, + "value": "0%", + "parentIndex": 155, + "depth": 39, + "rect": { + "x": 349, + "y": -1785, + "height": 242, + "width": 30 + }, + "enabled": true, + "ref": "e158" + }, + { + "hittable": false, + "type": "Other", + "index": 158, + "parentIndex": 157, + "depth": 40, + "rect": { + "x": 376, + "y": -1824, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e159" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 159, + "value": "0%", + "parentIndex": 155, + "depth": 39, + "rect": { + "x": 20, + "y": -1576, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e160" + }, + { + "hittable": false, + "type": "Other", + "index": 160, + "parentIndex": 159, + "depth": 40, + "rect": { + "x": -19, + "y": -1549, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e161" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "Other", + "index": 161, + "parentIndex": 150, + "depth": 36, + "rect": { + "x": 20, + "y": -1519, + "height": 264, + "width": 362 + }, + "enabled": true, + "ref": "e162" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "Other", + "index": 162, + "parentIndex": 161, + "depth": 37, + "rect": { + "x": 20, + "y": -1519, + "height": 264, + "width": 362 + }, + "enabled": true, + "ref": "e163" + }, + { + "hittable": false, + "type": "Other", + "index": 163, + "parentIndex": 162, + "depth": 38, + "rect": { + "x": 20, + "y": -1519, + "height": 264, + "width": 362 + }, + "enabled": true, + "ref": "e164" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "type": "TextView", + "index": 164, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 162, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e165" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "hittable": false, + "type": "TextView", + "index": 165, + "parentIndex": 164, + "depth": 39, + "rect": { + "x": 20, + "y": -1519, + "height": 264, + "width": 362 + }, + "enabled": true, + "ref": "e166" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 166, + "value": "0%", + "parentIndex": 164, + "depth": 39, + "rect": { + "x": 349, + "y": -1519, + "height": 264, + "width": 30 + }, + "enabled": true, + "ref": "e167" + }, + { + "hittable": false, + "type": "Other", + "index": 167, + "parentIndex": 166, + "depth": 40, + "rect": { + "x": 376, + "y": -1558, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e168" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 168, + "value": "0%", + "parentIndex": 164, + "depth": 39, + "rect": { + "x": 20, + "y": -1288, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e169" + }, + { + "hittable": false, + "type": "Other", + "index": 169, + "parentIndex": 168, + "depth": 40, + "rect": { + "x": -19, + "y": -1261, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e170" + }, + { + "label": "Thinking", + "hittable": false, + "type": "Other", + "index": 170, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1227, + "height": 32, + "width": 378 + }, + "enabled": true, + "ref": "e171" + }, + { + "hittable": false, + "type": "Other", + "index": 171, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -1227, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 170, + "ref": "e172" + }, + { + "label": "Thinking", + "hittable": false, + "type": "Button", + "index": 172, + "parentIndex": 170, + "depth": 36, + "rect": { + "x": 7, + "y": -1227, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e173" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "type": "Other", + "index": 173, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1195, + "height": 32, + "width": 378 + }, + "enabled": true, + "ref": "e174" + }, + { + "hittable": false, + "type": "Other", + "index": 174, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -1195, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 173, + "ref": "e175" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "type": "Button", + "index": 175, + "parentIndex": 173, + "depth": 36, + "rect": { + "x": 7, + "y": -1195, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e176" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Other", + "index": 176, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1163, + "height": 36, + "width": 378 + }, + "enabled": true, + "ref": "e177" + }, + { + "hittable": false, + "type": "Other", + "index": 177, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -1163, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 176, + "ref": "e178" + }, + { + "label": "Search, scrollToEnd", + "hittable": false, + "type": "Button", + "index": 178, + "parentIndex": 176, + "depth": 36, + "rect": { + "x": 7, + "y": -1163, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e179" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 179, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -1127, + "height": 646, + "width": 378 + }, + "enabled": true, + "ref": "e180" + }, + { + "hittable": false, + "type": "Other", + "index": 180, + "identifier": "assistant-message", + "depth": 36, + "rect": { + "x": 20, + "y": -1127, + "height": 642, + "width": 362 + }, + "enabled": true, + "parentIndex": 179, + "ref": "e181" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 181, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 20, + "y": -1115, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e182" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "Other", + "index": 182, + "parentIndex": 181, + "depth": 37, + "rect": { + "x": 20, + "y": -1115, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e183" + }, + { + "hittable": false, + "type": "Other", + "index": 183, + "parentIndex": 182, + "depth": 38, + "rect": { + "x": 20, + "y": -1115, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e184" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "index": 184, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 182, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e185" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "type": "TextView", + "index": 185, + "parentIndex": 184, + "depth": 39, + "rect": { + "x": 20, + "y": -1115, + "height": 132, + "width": 362 + }, + "enabled": true, + "ref": "e186" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 186, + "value": "0%", + "parentIndex": 184, + "depth": 39, + "rect": { + "x": 349, + "y": -1115, + "height": 132, + "width": 30 + }, + "enabled": true, + "ref": "e187" + }, + { + "hittable": false, + "type": "Other", + "index": 187, + "parentIndex": 186, + "depth": 40, + "rect": { + "x": 376, + "y": -1154, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e188" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 188, + "value": "0%", + "parentIndex": 184, + "depth": 39, + "rect": { + "x": 20, + "y": -1016, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e189" + }, + { + "hittable": false, + "type": "Other", + "index": 189, + "parentIndex": 188, + "depth": 40, + "rect": { + "x": -19, + "y": -989, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e190" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 190, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 30, + "y": -955, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e191" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 191, + "parentIndex": 190, + "depth": 37, + "rect": { + "x": 30, + "y": -955, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e192" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "Other", + "index": 192, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -955, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e193" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "Other", + "index": 193, + "parentIndex": 192, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -955, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e194" + }, + { + "hittable": false, + "type": "Other", + "index": 194, + "parentIndex": 193, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -955, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e195" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "index": 195, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "parentIndex": 193, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e196" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "type": "TextView", + "index": 196, + "parentIndex": 195, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -955, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e197" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 197, + "value": "0%", + "parentIndex": 195, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -955, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e198" + }, + { + "hittable": false, + "type": "Other", + "index": 198, + "parentIndex": 197, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -994, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e199" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 199, + "value": "0%", + "parentIndex": 195, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -900, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e200" + }, + { + "hittable": false, + "type": "Other", + "index": 200, + "parentIndex": 199, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -873, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e201" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 201, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 30, + "y": -863, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e202" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 202, + "parentIndex": 201, + "depth": 37, + "rect": { + "x": 30, + "y": -863, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e203" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "Other", + "index": 203, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -863, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e204" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "Other", + "index": 204, + "parentIndex": 203, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -863, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e205" + }, + { + "hittable": false, + "type": "Other", + "index": 205, + "parentIndex": 204, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -863, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e206" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "TextView", + "index": 206, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "parentIndex": 204, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e207" + }, + { + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "type": "TextView", + "index": 207, + "parentIndex": 206, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -863, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e208" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 208, + "value": "0%", + "parentIndex": 206, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -863, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e209" + }, + { + "hittable": false, + "type": "Other", + "index": 209, + "parentIndex": 208, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -902, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e210" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 210, + "value": "0%", + "parentIndex": 206, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -808, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e211" + }, + { + "hittable": false, + "type": "Other", + "index": 211, + "parentIndex": 210, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -781, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e212" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 212, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 30, + "y": -771, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e213" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 213, + "parentIndex": 212, + "depth": 37, + "rect": { + "x": 30, + "y": -771, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e214" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "Other", + "index": 214, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -771, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e215" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "Other", + "index": 215, + "parentIndex": 214, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -771, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e216" + }, + { + "hittable": false, + "type": "Other", + "index": 216, + "parentIndex": 215, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -771, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e217" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "index": 217, + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "parentIndex": 215, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e218" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "type": "TextView", + "index": 218, + "parentIndex": 217, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -771, + "height": 88, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e219" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 219, + "value": "0%", + "parentIndex": 217, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -771, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e220" + }, + { + "hittable": false, + "type": "Other", + "index": 220, + "parentIndex": 219, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -810, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e221" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 221, + "value": "0%", + "parentIndex": 217, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -716, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e222" + }, + { + "hittable": false, + "type": "Other", + "index": 222, + "parentIndex": 221, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -689, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e223" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 223, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 30, + "y": -679, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e224" + }, + { + "label": "•", + "hittable": false, + "type": "StaticText", + "index": 224, + "parentIndex": 223, + "depth": 37, + "rect": { + "x": 30, + "y": -679, + "height": 22, + "width": 7.333332061767578 + }, + "enabled": true, + "ref": "e225" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "Other", + "index": 225, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 41.33333396911621, + "y": -679, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e226" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "Other", + "index": 226, + "parentIndex": 225, + "depth": 37, + "rect": { + "x": 41.33333396911621, + "y": -679, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e227" + }, + { + "hittable": false, + "type": "Other", + "index": 227, + "parentIndex": 226, + "depth": 38, + "rect": { + "x": 41.33333396911621, + "y": -679, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e228" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "TextView", + "index": 228, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 226, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e229" + }, + { + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "type": "TextView", + "index": 229, + "parentIndex": 228, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -679, + "height": 66, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e230" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 230, + "value": "0%", + "parentIndex": 228, + "depth": 39, + "rect": { + "x": 349.00000063578284, + "y": -679, + "height": 66, + "width": 30 + }, + "enabled": true, + "ref": "e231" + }, + { + "hittable": false, + "type": "Other", + "index": 231, + "parentIndex": 230, + "depth": 40, + "rect": { + "x": 376.00000063578284, + "y": -718, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e232" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 232, + "value": "0%", + "parentIndex": 228, + "depth": 39, + "rect": { + "x": 41.33333396911621, + "y": -646, + "height": 30, + "width": 340.6666564941406 + }, + "enabled": true, + "ref": "e233" + }, + { + "hittable": false, + "type": "Other", + "index": 233, + "parentIndex": 232, + "depth": 40, + "rect": { + "x": 2.333333969116211, + "y": -619, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e234" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "index": 234, + "parentIndex": 179, + "depth": 36, + "rect": { + "x": 20, + "y": -597, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e235" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "Other", + "index": 235, + "parentIndex": 234, + "depth": 37, + "rect": { + "x": 20, + "y": -597, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e236" + }, + { + "hittable": false, + "type": "Other", + "index": 236, + "parentIndex": 235, + "depth": 38, + "rect": { + "x": 20, + "y": -597, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e237" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "TextView", + "index": 237, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 235, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e238" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "type": "TextView", + "index": 238, + "parentIndex": 237, + "depth": 39, + "rect": { + "x": 20, + "y": -597, + "height": 88, + "width": 362 + }, + "enabled": true, + "ref": "e239" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 239, + "value": "0%", + "parentIndex": 237, + "depth": 39, + "rect": { + "x": 349, + "y": -597, + "height": 88, + "width": 30 + }, + "enabled": true, + "ref": "e240" + }, + { + "hittable": false, + "type": "Other", + "index": 240, + "parentIndex": 239, + "depth": 40, + "rect": { + "x": 376, + "y": -636, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e241" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 241, + "value": "0%", + "parentIndex": 237, + "depth": 39, + "rect": { + "x": 20, + "y": -542, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e242" + }, + { + "hittable": false, + "type": "Other", + "index": 242, + "parentIndex": 241, + "depth": 40, + "rect": { + "x": -19, + "y": -515, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e243" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "type": "Other", + "index": 243, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -481, + "height": 32, + "width": 378 + }, + "enabled": true, + "ref": "e244" + }, + { + "hittable": false, + "type": "Other", + "index": 244, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -481, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 243, + "ref": "e245" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "type": "Button", + "index": 245, + "parentIndex": 243, + "depth": 36, + "rect": { + "x": 7, + "y": -481, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e246" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Other", + "index": 246, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -449, + "height": 36, + "width": 378 + }, + "enabled": true, + "ref": "e247" + }, + { + "hittable": false, + "type": "Other", + "index": 247, + "identifier": "tool-call-badge", + "depth": 36, + "rect": { + "x": 7, + "y": -449, + "height": 32, + "width": 388 + }, + "enabled": true, + "parentIndex": 246, + "ref": "e248" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "hittable": false, + "type": "Button", + "index": 248, + "parentIndex": 246, + "depth": 36, + "rect": { + "x": 7, + "y": -449, + "height": 32, + "width": 388 + }, + "enabled": true, + "ref": "e249" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 249, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": -413, + "height": 512, + "width": 378 + }, + "enabled": true, + "ref": "e250" + }, + { + "hittable": false, + "type": "Other", + "index": 250, + "identifier": "assistant-message", + "depth": 36, + "rect": { + "x": 20, + "y": -413, + "height": 512, + "width": 362 + }, + "enabled": true, + "parentIndex": 249, + "ref": "e251" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 251, + "parentIndex": 249, + "depth": 36, + "rect": { + "x": 20, + "y": -401, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e252" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "Other", + "index": 252, + "parentIndex": 251, + "depth": 37, + "rect": { + "x": 20, + "y": -401, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e253" + }, + { + "hittable": false, + "type": "Other", + "index": 253, + "parentIndex": 252, + "depth": 38, + "rect": { + "x": 20, + "y": -401, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e254" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "type": "TextView", + "index": 254, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 252, + "depth": 38, + "rect": { + "x": 0, + "y": 0, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e255" + }, + { + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 4", + "hittable": false, + "type": "TextView", + "index": 255, + "parentIndex": 254, + "depth": 39, + "rect": { + "x": 20, + "y": -401, + "height": 242, + "width": 362 + }, + "enabled": true, + "ref": "e256" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 256, + "value": "0%", + "parentIndex": 254, + "depth": 39, + "rect": { + "x": 349, + "y": -401, + "height": 242, + "width": 30 + }, + "enabled": true, + "ref": "e257" + }, + { + "hittable": false, + "type": "Other", + "index": 257, + "parentIndex": 256, + "depth": 40, + "rect": { + "x": 376, + "y": -440, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e258" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 258, + "value": "0%", + "parentIndex": 254, + "depth": 39, + "rect": { + "x": 20, + "y": -192, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e259" + }, + { + "hittable": false, + "type": "Other", + "index": 259, + "parentIndex": 258, + "depth": 40, + "rect": { + "x": -19, + "y": -165, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e260" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "Other", + "index": 260, + "parentIndex": 249, + "depth": 36, + "rect": { + "x": 20, + "y": -135, + "height": 176, + "width": 362 + }, + "enabled": true, + "ref": "e261" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "Other", + "index": 261, + "parentIndex": 260, + "depth": 37, + "rect": { + "x": 20, + "y": -135, + "height": 176, + "width": 362 + }, + "enabled": true, + "ref": "e262" + }, + { + "hittable": false, + "type": "Other", + "index": 262, + "parentIndex": 261, + "depth": 38, + "rect": { + "x": 20, + "y": -135, + "height": 176, + "width": 362 + }, + "enabled": true, + "ref": "e263" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "TextView", + "index": 263, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "parentIndex": 261, + "depth": 38, + "rect": { + "x": 20, + "y": 0, + "height": 41, + "width": 362 + }, + "enabled": true, + "ref": "e264" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rath", + "hittable": false, + "type": "TextView", + "index": 264, + "parentIndex": 263, + "depth": 39, + "rect": { + "x": 20, + "y": -135, + "height": 176, + "width": 362 + }, + "enabled": true, + "ref": "e265" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 265, + "value": "0%", + "parentIndex": 263, + "depth": 39, + "rect": { + "x": 349, + "y": -135, + "height": 176, + "width": 30 + }, + "enabled": true, + "ref": "e266" + }, + { + "hittable": false, + "type": "Other", + "index": 266, + "parentIndex": 265, + "depth": 40, + "rect": { + "x": 376, + "y": -174, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e267" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 267, + "value": "0%", + "parentIndex": 263, + "depth": 39, + "rect": { + "x": 20, + "y": 8, + "height": 30, + "width": 362 + }, + "enabled": true, + "ref": "e268" + }, + { + "hittable": false, + "type": "Other", + "index": 268, + "parentIndex": 267, + "depth": 40, + "rect": { + "x": -19, + "y": 35, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e269" + }, + { + "label": "(end of synthetic stream)", + "hittable": false, + "type": "Other", + "index": 269, + "parentIndex": 249, + "depth": 36, + "rect": { + "x": 20, + "y": 65, + "height": 22, + "width": 362 + }, + "enabled": true, + "ref": "e270" + }, + { + "label": "(end of synthetic stream)", + "hittable": false, + "type": "Other", + "index": 270, + "parentIndex": 269, + "depth": 37, + "rect": { + "x": 20, + "y": 65, + "height": 22, + "width": 362 + }, + "enabled": true, + "ref": "e271" + }, + { + "hittable": false, + "type": "Other", + "index": 271, + "parentIndex": 270, + "depth": 38, + "rect": { + "x": 20, + "y": 65, + "height": 22, + "width": 362 + }, + "enabled": true, + "ref": "e272" + }, + { + "label": "(end of synthetic stream)", + "hittable": false, + "type": "TextView", + "index": 272, + "value": "(end of synthetic stream)", + "parentIndex": 270, + "depth": 38, + "rect": { + "x": 20, + "y": 65, + "height": 22, + "width": 362 + }, + "enabled": true, + "ref": "e273" + }, + { + "label": "(end of synthetic stream)", + "hittable": false, + "type": "TextView", + "index": 273, + "parentIndex": 272, + "depth": 39, + "rect": { + "x": 20, + "y": 65, + "height": 22, + "width": 183.234375 + }, + "enabled": true, + "ref": "e274" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 274, + "value": "0%", + "parentIndex": 272, + "depth": 39, + "rect": { + "x": 349, + "y": 65, + "height": 22, + "width": 30 + }, + "enabled": true, + "ref": "e275" + }, + { + "hittable": false, + "type": "Other", + "index": 275, + "parentIndex": 274, + "depth": 40, + "rect": { + "x": 376, + "y": 26, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e276" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 276, + "value": "0%", + "parentIndex": 272, + "depth": 39, + "rect": { + "x": 20, + "y": 73, + "height": 11, + "width": 362 + }, + "enabled": true, + "ref": "e277" + }, + { + "hittable": false, + "type": "Other", + "index": 277, + "parentIndex": 276, + "depth": 40, + "rect": { + "x": -19, + "y": 81, + "height": 3, + "width": 36 + }, + "enabled": true, + "ref": "e278" + }, + { + "label": "Copy turn", + "hittable": false, + "type": "Other", + "index": 278, + "parentIndex": 73, + "depth": 35, + "rect": { + "x": 12, + "y": 99, + "height": 67, + "width": 378 + }, + "enabled": true, + "ref": "e279" + }, + { + "label": "Copy turn", + "hittable": false, + "type": "Button", + "index": 279, + "parentIndex": 278, + "depth": 36, + "rect": { + "x": 16, + "y": 112, + "height": 22, + "width": 22 + }, + "enabled": true, + "ref": "e280" + }, + { + "label": "Fork chat from here", + "hittable": false, + "type": "Other", + "index": 280, + "parentIndex": 278, + "depth": 36, + "rect": { + "x": 46, + "y": 112, + "height": 22, + "width": 22 + }, + "enabled": true, + "ref": "e281" + }, + { + "label": "Fork chat from here", + "hittable": false, + "type": "Button", + "index": 281, + "identifier": "assistant-fork-menu-trigger", + "depth": 37, + "rect": { + "x": 46, + "y": 112, + "height": 22, + "width": 22 + }, + "enabled": true, + "parentIndex": 280, + "ref": "e282" + }, + { + "label": "Worked for 9s, ended 8:44 PM", + "hittable": false, + "type": "Button", + "index": 282, + "parentIndex": 278, + "depth": 36, + "rect": { + "x": 76, + "y": 115.33333325386047, + "height": 15.666671752929688, + "width": 85.33332824707031 + }, + "enabled": true, + "ref": "e283" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 283, + "value": "0%", + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 0, + "y": 164, + "height": 30, + "width": 402 + }, + "enabled": true, + "ref": "e284" + }, + { + "hittable": false, + "type": "Other", + "index": 284, + "parentIndex": 283, + "depth": 34, + "rect": { + "x": 3, + "y": 164, + "height": 3, + "width": 393 + }, + "enabled": true, + "ref": "e285" + }, + { + "label": "Vertical scroll bar, 676 pages", + "hittable": false, + "type": "Other", + "index": 285, + "value": "0%", + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 369, + "y": 161, + "height": 5, + "width": 30 + }, + "enabled": true, + "ref": "e286" + }, + { + "hittable": false, + "type": "Other", + "index": 286, + "parentIndex": 285, + "depth": 34, + "rect": { + "x": 396, + "y": 164, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e287" + }, + { + "label": "Vertical scroll bar, 676 pages", + "hittable": false, + "type": "Other", + "index": 287, + "value": "0%", + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 369, + "y": 161, + "height": 5, + "width": 30 + }, + "enabled": true, + "ref": "e288" + }, + { + "hittable": false, + "type": "Other", + "index": 288, + "parentIndex": 287, + "depth": 34, + "rect": { + "x": 396, + "y": 164, + "height": 36, + "width": 3 + }, + "enabled": true, + "ref": "e289" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 289, + "value": "0%", + "parentIndex": 71, + "depth": 33, + "rect": { + "x": 0, + "y": 164, + "height": 30, + "width": 402 + }, + "enabled": true, + "ref": "e290" + }, + { + "hittable": false, + "type": "Other", + "index": 290, + "parentIndex": 289, + "depth": 34, + "rect": { + "x": 3, + "y": 164, + "height": 3, + "width": 393 + }, + "enabled": true, + "ref": "e291" + }, + { + "label": "Message agent...", + "hittable": false, + "type": "Other", + "index": 291, + "identifier": "composer-viewport-content", + "depth": 29, + "rect": { + "x": 0, + "y": 166, + "height": 406, + "width": 402 + }, + "enabled": true, + "parentIndex": 65, + "ref": "e292" + }, + { + "hittable": false, + "type": "Other", + "index": 292, + "identifier": "message-input-root", + "depth": 30, + "rect": { + "x": 16, + "y": 166, + "height": 356, + "width": 370 + }, + "enabled": true, + "parentIndex": 291, + "ref": "e293" + }, + { + "hittable": false, + "type": "Other", + "index": 293, + "parentIndex": 291, + "depth": 30, + "rect": { + "x": 16, + "y": 166, + "height": 356, + "width": 370 + }, + "enabled": true, + "ref": "e294" + }, + { + "label": "Message agent...", + "hittable": false, + "type": "Other", + "index": 294, + "parentIndex": 291, + "depth": 30, + "rect": { + "x": 29, + "y": 175, + "height": 298, + "width": 344 + }, + "enabled": true, + "ref": "e295" + }, + { + "label": "Message agent...", + "hittable": false, + "type": "TextView", + "index": 295, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "parentIndex": 294, + "depth": 31, + "rect": { + "x": 29, + "y": 175, + "height": 298, + "width": 344 + }, + "enabled": true, + "ref": "e296" + }, + { + "label": "Vertical scroll bar, 2 pages", + "hittable": false, + "type": "Other", + "index": 296, + "value": "100%", + "parentIndex": 295, + "depth": 32, + "rect": { + "x": 340, + "y": 175, + "height": 298, + "width": 30 + }, + "enabled": true, + "ref": "e297" + }, + { + "hittable": false, + "type": "Other", + "index": 297, + "parentIndex": 296, + "depth": 33, + "rect": { + "x": 367, + "y": 245, + "height": 225, + "width": 3 + }, + "enabled": true, + "ref": "e298" + }, + { + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 298, + "value": "0%", + "parentIndex": 295, + "depth": 32, + "rect": { + "x": 29, + "y": 440, + "height": 30, + "width": 344 + }, + "enabled": true, + "ref": "e299" + }, + { + "hittable": false, + "type": "Other", + "index": 299, + "parentIndex": 298, + "depth": 33, + "rect": { + "x": 32, + "y": 467, + "height": 3, + "width": 335 + }, + "enabled": true, + "ref": "e300" + }, + { + "label": "Add attachment", + "hittable": false, + "type": "Button", + "index": 300, + "identifier": "message-input-attach-button", + "depth": 30, + "rect": { + "x": 23, + "y": 485, + "height": 28, + "width": 28 + }, + "enabled": true, + "parentIndex": 291, + "ref": "e301" + }, + { + "label": "Select model (Ten second stream)", + "hittable": false, + "type": "Other", + "index": 301, + "parentIndex": 291, + "depth": 30, + "rect": { + "x": 51, + "y": 485, + "height": 28, + "width": 232 + }, + "enabled": true, + "ref": "e302" + }, + { + "label": "Select model (Ten second stream)", + "hittable": false, + "type": "Button", + "index": 302, + "identifier": "combined-model-selector", + "depth": 31, + "rect": { + "x": 51, + "y": 485, + "height": 28, + "width": 202 + }, + "enabled": true, + "parentIndex": 301, + "ref": "e303" + }, + { + "label": "Context window 3% used", + "hittable": false, + "type": "Image", + "index": 303, + "identifier": "context-window-meter", + "depth": 30, + "rect": { + "x": 283, + "y": 485, + "height": 28, + "width": 28 + }, + "enabled": true, + "parentIndex": 291, + "ref": "e304" + }, + { + "label": "Start dictation", + "hittable": false, + "type": "Button", + "index": 304, + "parentIndex": 291, + "depth": 30, + "rect": { + "x": 315, + "y": 485, + "height": 28, + "width": 28 + }, + "enabled": true, + "ref": "e305" + }, + { + "label": "Send message", + "hittable": false, + "type": "Button", + "index": 305, + "parentIndex": 291, + "depth": 30, + "rect": { + "x": 351, + "y": 485, + "height": 28, + "width": 28 + }, + "enabled": true, + "ref": "e306" + }, + { + "hittable": false, + "type": "Other", + "index": 306, + "parentIndex": 16, + "depth": 11, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e307" + }, + { + "hittable": false, + "type": "Other", + "index": 307, + "parentIndex": 10, + "depth": 7, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e308" + }, + { + "hittable": false, + "type": "Other", + "index": 308, + "parentIndex": 307, + "depth": 8, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e309" + }, + { + "hittable": false, + "type": "Other", + "index": 309, + "parentIndex": 308, + "depth": 9, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e310" + }, + { + "hittable": false, + "type": "Window", + "index": 310, + "parentIndex": 0, + "depth": 1, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e311" + }, + { + "hittable": false, + "type": "Other", + "index": 311, + "parentIndex": 310, + "depth": 2, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e312" + }, + { + "hittable": false, + "type": "Other", + "index": 312, + "parentIndex": 311, + "depth": 3, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e313" + }, + { + "hittable": false, + "type": "Other", + "index": 313, + "parentIndex": 311, + "depth": 3, + "rect": { + "x": 0, + "y": 538, + "height": 336, + "width": 402 + }, + "enabled": true, + "ref": "e314" + }, + { + "hittable": false, + "type": "Other", + "index": 314, + "parentIndex": 313, + "depth": 4, + "rect": { + "x": 0, + "y": 538, + "height": 278, + "width": 402 + }, + "enabled": true, + "ref": "e315" + }, + { + "label": "Emoji", + "hittable": true, + "type": "Window", + "index": 315, + "parentIndex": 0, + "depth": 1, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e316" + }, + { + "label": "Emoji", + "hittable": true, + "type": "Other", + "index": 316, + "parentIndex": 315, + "depth": 2, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "ref": "e317" + }, + { + "label": "Emoji", + "hittable": true, + "type": "Other", + "index": 317, + "parentIndex": 316, + "depth": 3, + "rect": { + "x": 0, + "y": 538, + "height": 336, + "width": 402 + }, + "enabled": true, + "ref": "e318" + }, + { + "hittable": false, + "type": "Other", + "index": 318, + "parentIndex": 317, + "depth": 4, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e319" + }, + { + "hittable": false, + "type": "Other", + "index": 319, + "parentIndex": 318, + "depth": 5, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e320" + }, + { + "hittable": false, + "type": "Other", + "index": 320, + "parentIndex": 319, + "depth": 6, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e321" + }, + { + "label": "Typing Predictions", + "hittable": true, + "type": "Other", + "index": 321, + "identifier": "SystemInputAssistantView", + "depth": 4, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "parentIndex": 317, + "ref": "e322" + }, + { + "label": "Typing Predictions", + "hittable": true, + "type": "Other", + "index": 322, + "parentIndex": 321, + "depth": 5, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e323" + }, + { + "label": "Typing Predictions", + "hittable": true, + "type": "Other", + "index": 323, + "identifier": "CenterPageView", + "depth": 6, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "parentIndex": 322, + "ref": "e324" + }, + { + "hittable": false, + "type": "Other", + "index": 324, + "parentIndex": 323, + "depth": 7, + "rect": { + "x": 0, + "y": -62, + "height": 1245, + "width": 402 + }, + "enabled": true, + "ref": "e325" + }, + { + "hittable": false, + "type": "ScrollView", + "index": 325, + "parentIndex": 324, + "depth": 8, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e326" + }, + { + "label": "Typing Predictions", + "hittable": true, + "type": "Other", + "index": 326, + "parentIndex": 323, + "depth": 7, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e327" + }, + { + "label": "Typing Predictions", + "hittable": true, + "type": "Other", + "index": 327, + "parentIndex": 326, + "depth": 8, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e328" + }, + { + "label": "“thirteen”", + "hittable": true, + "type": "Other", + "index": 328, + "parentIndex": 327, + "depth": 9, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e329" + }, + { + "label": "“thirteen”", + "hittable": true, + "type": "Other", + "index": 329, + "parentIndex": 328, + "depth": 10, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 402 + }, + "enabled": true, + "ref": "e330" + }, + { + "label": "“thirteen”", + "hittable": true, + "type": "Other", + "index": 330, + "parentIndex": 329, + "depth": 11, + "rect": { + "x": 0, + "y": 538, + "height": 45, + "width": 134 + }, + "enabled": true, + "ref": "e331" + }, + { + "label": "this", + "hittable": true, + "type": "Other", + "index": 331, + "parentIndex": 329, + "depth": 11, + "rect": { + "x": 134, + "y": 538, + "height": 45, + "width": 134 + }, + "enabled": true, + "ref": "e332" + }, + { + "label": "thinking", + "hittable": true, + "type": "Other", + "index": 332, + "parentIndex": 329, + "depth": 11, + "rect": { + "x": 268, + "y": 538, + "height": 45, + "width": 134 + }, + "enabled": true, + "ref": "e333" + }, + { + "hittable": false, + "type": "Other", + "index": 333, + "parentIndex": 317, + "depth": 4, + "rect": { + "x": 0, + "y": 583, + "height": 233, + "width": 402 + }, + "enabled": true, + "ref": "e334" + }, + { + "hittable": false, + "type": "Other", + "index": 334, + "parentIndex": 333, + "depth": 5, + "rect": { + "x": 0, + "y": 583, + "height": 291, + "width": 402 + }, + "enabled": true, + "ref": "e335" + }, + { + "hittable": false, + "type": "Other", + "index": 335, + "parentIndex": 334, + "depth": 6, + "rect": { + "x": 0, + "y": 583, + "height": 291, + "width": 402 + }, + "enabled": true, + "ref": "e336" + }, + { + "hittable": false, + "type": "Other", + "index": 336, + "parentIndex": 335, + "depth": 7, + "rect": { + "x": 0, + "y": 583, + "height": 291, + "width": 402 + }, + "enabled": true, + "ref": "e337" + }, + { + "label": "q", + "hittable": false, + "type": "Other", + "index": 337, + "parentIndex": 317, + "depth": 4, + "rect": { + "x": 0, + "y": 583, + "height": 233, + "width": 402 + }, + "enabled": true, + "ref": "e338" + }, + { + "label": "q", + "hittable": false, + "type": "Keyboard", + "index": 338, + "parentIndex": 337, + "depth": 5, + "rect": { + "x": 0, + "y": 583, + "height": 233, + "width": 402 + }, + "enabled": true, + "ref": "e339" + }, + { + "label": "q", + "hittable": false, + "type": "Other", + "index": 339, + "parentIndex": 338, + "depth": 6, + "rect": { + "x": 0, + "y": 583, + "height": 233, + "width": 402 + }, + "enabled": true, + "ref": "e340" + }, + { + "label": "q", + "hittable": false, + "type": "Other", + "index": 340, + "identifier": "UIKeyboardLayoutStar Preview", + "depth": 7, + "rect": { + "x": 0, + "y": 583, + "height": 233, + "width": 402 + }, + "enabled": true, + "parentIndex": 339, + "ref": "e341" + }, + { + "label": "q", + "hittable": false, + "type": "Key", + "index": 341, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 0, + "y": 590, + "height": 46, + "width": 40.333333333333336 + }, + "enabled": true, + "ref": "e342" + }, + { + "label": "w", + "hittable": false, + "type": "Key", + "index": 342, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 40.333333333333336, + "y": 590, + "height": 46, + "width": 40.00000000000001 + }, + "enabled": true, + "ref": "e343" + }, + { + "label": "e", + "hittable": false, + "type": "Key", + "index": 343, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 80.33333333333334, + "y": 590, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e344" + }, + { + "label": "r", + "hittable": false, + "type": "Key", + "index": 344, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 120.66666666666669, + "y": 590, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e345" + }, + { + "label": "t", + "hittable": false, + "type": "Key", + "index": 345, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 160.66666666666669, + "y": 590, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e346" + }, + { + "label": "y", + "hittable": false, + "type": "Key", + "index": 346, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 201.00000000000003, + "y": 590, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e347" + }, + { + "label": "u", + "hittable": false, + "type": "Key", + "index": 347, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 241.33333333333337, + "y": 590, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e348" + }, + { + "label": "i", + "hittable": false, + "type": "Key", + "index": 348, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 281.33333333333337, + "y": 590, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e349" + }, + { + "label": "o", + "hittable": false, + "type": "Key", + "index": 349, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 321.6666666666667, + "y": 590, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e350" + }, + { + "label": "p", + "hittable": false, + "type": "Key", + "index": 350, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 361.6666666666667, + "y": 590, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e351" + }, + { + "label": "a", + "hittable": false, + "type": "Key", + "index": 351, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 19.666666666666668, + "y": 644, + "height": 46, + "width": 40.33333333333333 + }, + "enabled": true, + "ref": "e352" + }, + { + "label": "s", + "hittable": false, + "type": "Key", + "index": 352, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 60, + "y": 644, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e353" + }, + { + "label": "d", + "hittable": false, + "type": "Key", + "index": 353, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 100.33333333333334, + "y": 644, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e354" + }, + { + "label": "f", + "hittable": false, + "type": "Key", + "index": 354, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 140.33333333333334, + "y": 644, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e355" + }, + { + "label": "g", + "hittable": false, + "type": "Key", + "index": 355, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 181.2026666666667, + "y": 644, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e356" + }, + { + "label": "h", + "hittable": false, + "type": "Key", + "index": 356, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 221.2026666666667, + "y": 644, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e357" + }, + { + "label": "j", + "hittable": false, + "type": "Key", + "index": 357, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 261.536, + "y": 644, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e358" + }, + { + "label": "k", + "hittable": false, + "type": "Key", + "index": 358, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 301.536, + "y": 644, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e359" + }, + { + "label": "l", + "hittable": false, + "type": "Key", + "index": 359, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 341.8693333333333, + "y": 644, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e360" + }, + { + "label": "shift", + "hittable": false, + "type": "Button", + "index": 360, + "identifier": "shift", + "depth": 8, + "rect": { + "x": 0, + "y": 698, + "height": 46, + "width": 51.333333333333336 + }, + "enabled": true, + "parentIndex": 340, + "ref": "e361" + }, + { + "label": "z", + "hittable": false, + "type": "Key", + "index": 361, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 60, + "y": 698, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e362" + }, + { + "label": "x", + "hittable": false, + "type": "Key", + "index": 362, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 100.33333333333334, + "y": 698, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e363" + }, + { + "label": "c", + "hittable": false, + "type": "Key", + "index": 363, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 140.33333333333334, + "y": 698, + "height": 46, + "width": 40.33333333333334 + }, + "enabled": true, + "ref": "e364" + }, + { + "label": "v", + "hittable": false, + "type": "Key", + "index": 364, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 181.2026666666667, + "y": 698, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e365" + }, + { + "label": "b", + "hittable": false, + "type": "Key", + "index": 365, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 221.2026666666667, + "y": 698, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e366" + }, + { + "label": "n", + "hittable": false, + "type": "Key", + "index": 366, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 261.536, + "y": 698, + "height": 46, + "width": 40 + }, + "enabled": true, + "ref": "e367" + }, + { + "label": "m", + "hittable": false, + "type": "Key", + "index": 367, + "parentIndex": 340, + "depth": 8, + "rect": { + "x": 301.536, + "y": 698, + "height": 46, + "width": 40.333333333333314 + }, + "enabled": true, + "ref": "e368" + }, + { + "label": "delete", + "hittable": false, + "type": "Key", + "index": 368, + "identifier": "delete", + "depth": 8, + "rect": { + "x": 350.42133333333334, + "y": 698, + "height": 46, + "width": 51.333333333333314 + }, + "enabled": true, + "parentIndex": 340, + "ref": "e369" + }, + { + "label": "numbers", + "hittable": false, + "type": "Key", + "index": 369, + "identifier": "more", + "depth": 8, + "rect": { + "x": 0, + "y": 752, + "height": 46, + "width": 101 + }, + "enabled": true, + "parentIndex": 340, + "ref": "e370" + }, + { + "label": "space", + "hittable": false, + "type": "Key", + "index": 370, + "identifier": "space", + "depth": 8, + "rect": { + "x": 100.33333333333334, + "y": 752, + "height": 46, + "width": 201.33333333333334 + }, + "enabled": true, + "parentIndex": 340, + "ref": "e371" + }, + { + "label": "return", + "hittable": false, + "type": "Button", + "index": 371, + "identifier": "Return", + "depth": 8, + "rect": { + "x": 301.6666666666667, + "y": 752, + "height": 46, + "width": 100.33333333333331 + }, + "enabled": true, + "parentIndex": 340, + "ref": "e372" + }, + { + "label": "Emoji", + "hittable": true, + "type": "Other", + "index": 372, + "parentIndex": 317, + "depth": 4, + "rect": { + "x": 0, + "y": 583, + "height": 291, + "width": 402 + }, + "enabled": true, + "ref": "e373" + }, + { + "label": "Emoji", + "hittable": true, + "type": "Button", + "index": 373, + "parentIndex": 372, + "depth": 5, + "rect": { + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 68.73516393505099, + "width": 68.0852958475086 + }, + "enabled": true, + "ref": "e374" + }, + { + "hittable": false, + "type": "StaticText", + "index": 374, + "parentIndex": 373, + "depth": 6, + "rect": { + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e375" + }, + { + "label": "Dictate", + "hittable": false, + "type": "Button", + "index": 375, + "identifier": "dictation", + "depth": 5, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099, + "width": 68.08529584750863 + }, + "enabled": true, + "parentIndex": 372, + "ref": "e376" + }, + { + "hittable": false, + "type": "StaticText", + "index": 376, + "parentIndex": 375, + "depth": 6, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e377" + }, + { + "label": "Dictate", + "hittable": true, + "type": "Button", + "index": 377, + "identifier": "dictation", + "depth": 5, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099, + "width": 68.08529584750863 + }, + "enabled": true, + "parentIndex": 372, + "ref": "e378" + }, + { + "hittable": false, + "type": "StaticText", + "index": 378, + "parentIndex": 377, + "depth": 6, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0, + "width": 0 + }, + "enabled": true, + "ref": "e379" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 379, + "totalNodeCount": 379, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 31, + "p50Ms": 252, + "p95Ms": 1740, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 31 + } + }, + "warning": "Warning: ios snapshots are slow in this run: p95 1740ms over 31 captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon." + }, + "refsGeneration": 776096 + } +} diff --git a/scroll-regression/ios/composer-scroll-ios-chat-scenario.log b/scroll-regression/ios/composer-scroll-ios-chat-scenario.log new file mode 100644 index 0000000000..646ec24e6f --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-chat-scenario.log @@ -0,0 +1,30 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +Filled 1 chars +Tapped (370, 465) +Long pressed (376, 720) +Tapped (4, 370) +Filled 131 chars +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-cap-open.png (402x874 @1x) +Tapped (398, 118) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-header-dismissed.png (402x874 @1x) +Tapped @e296 (201, 626) +Error (TEXT_ENTRY_MISMATCH): text entry verification failed: expected "x", observed "x +seventeen +eighteen +nineteen +twenty" +Hint: Retry with --debug and inspect diagnostics log for details. +Diagnostic ID: mu4krczz-76a58021 +Diagnostics Log: /Users/runner/.agent-device/sessions/composer-scroll-ios/runner.log +Tapped (370, 465.0000305175781) +Long pressed (376, 720) +PASS iOS host=chat: content/header dismissal, cap close/reopen 298pt, empty/reset 30pt, header/keyboard bounds + + + A new version of devbox is available: 0.0.187. + + Run `devbox update` to upgrade. + diff --git a/scroll-regression/ios/composer-scroll-ios-draft-scenario.log b/scroll-regression/ios/composer-scroll-ios-draft-scenario.log new file mode 100644 index 0000000000..7a5aebe3e1 --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-draft-scenario.log @@ -0,0 +1,29 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +Filled 1 chars +Tapped (370, 465) +Long pressed (376, 720) +Tapped (4, 370) +Filled 131 chars +/Volumes/devbox/workspace/composer-scroll-ios-evidence/workspace-draft-cap-open.png (402x874 @1x) +Tapped (398, 118) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/workspace-draft-header-dismissed.png (402x874 @1x) +Tapped @e83 (201, 650) +Error (TEXT_ENTRY_MISMATCH): text entry verification failed: expected "x", observed "x +eighteen +nineteen +twent" +Hint: Retry with --debug and inspect diagnostics log for details. +Diagnostic ID: mu4kyhro-28a33356 +Diagnostics Log: /Users/runner/.agent-device/sessions/composer-scroll-ios/runner.log +Tapped (370, 465.0000305175781) +Long pressed (376, 720) +PASS iOS host=workspace-draft: content/header dismissal, cap close/reopen 250pt, empty/reset 30pt, header/keyboard bounds + + + A new version of devbox is available: 0.0.187. + + Run `devbox update` to upgrade. + diff --git a/scroll-regression/ios/composer-scroll-ios-gestures.log b/scroll-regression/ios/composer-scroll-ios-gestures.log new file mode 100644 index 0000000000..b69174ef1b --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-gestures.log @@ -0,0 +1,354 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +Tapped (398, 118) +Opened: sh.paseo.debug +Session state: /Users/runner/.agent-device/sessions/composer-scroll-ios +Tapped @e422 (201, 760) +settled after 2363ms: +35 -344 (~112 unchanged) +- @e1 [application] "Paseo Debug" ++ @e1 [application] "Paseo Debug" +- @e25 [other] "Switch tabs (2 open)" +- @e26 [other] "Open menu" +- @e27 [other] "Open menu" +- @e28 [other] "Open menu" +- @e29 [other] "Open menu" +- @e31 [button] "Open menu" ++ @e29 [button] "Open menu" +- @e36 [other] "main" +- @e37 [other] "main" ++ @e31 [other] +- @e39 [text] "main" +- @e41 [text] "composer-dock-ios-fixture" +- @e43 [text] "·" +- @e52 [text] "dev-new" +- @e53 [button] "Workspace actions" +- @e54 [button] "Open Explorer sidebar" ++ @e43 [button] "Workspace actions" ++ @e44 [button] "Open Explorer sidebar" +- @e57 [button] "Switch tabs (2 open)" +- @e58 [other] "workspace-active-tab-icon" +- @e59 [other] "workspace-tabs-row" ++ @e47 [button] "Switch tabs (2 open)" +- @e62 [other] "Add attachment" +- @e65 [other] "Message agent... Message, @files, /commands" +- @e66 [other] "Scroll to bottom" +- @e67 [other] "Horizontal scroll bar, 1 page" +- @e69 [other] "Horizontal scroll bar, 1 page" +- @e71 [other] "Horizontal scroll bar, 1 page" +- @e72 [scroll-area] "Thinking" +- @e73 [other] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e74 [other] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e76 [other] "older-history-slot" +- @e78 [other] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e79 [other] "user-message" +- @e80 [other] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e82 [text] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e83 [text] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e84 [other] "user-message-trailing-row" +- @e85 [text] "8:53 PM" +- @e86 [text] "8:53 PM" +- @e87 [other] "Rewind to this message" +- @e88 [button] "Rewind to this message" +- @e89 [button] "Copy message" +- @e90 [other] "Cycle 1" +- @e91 [other] "assistant-message" +- @e92 [other] "Cycle 1" +- @e93 [other] "Cycle 1" ++ @e57 [scroll-area] +- @e95 [text-view] "Cycle 1" +- @e96 [text-view] "Cycle 1" ++ @e64 [text-view] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." ++ @e65 [text-view] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." ++ @e71 [text-view] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." ++ @e72 [text-view] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." ++ @e79 [text-view] "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout." ++ @e80 [text-view] "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout." ++ @e86 [text-view] "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast." ++ @e87 [text-view] "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast." ++ @e91 [button] "Edit, packages/app/src/hooks/use-scroll-anchor.ts" ++ @e93 [button] "Shell, node scripts/simulate-stream-burst.mjs" ++ @e98 [text-view] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle" ++ @e99 [text-view] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3" ++ @e105 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so" ++ @e106 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files." ++ @e113 [button] "Scroll to bottom" ++ @e116 [text-view] "Message agent... Message, @files, /commands" ++ @e119 [button] "Add attachment" ++ @e121 [button] "Select model (Ten second stream)" ++ @e122 [image] "Context window 2% used" ++ @e123 [button] "Start dictation" ++ @e124 [button] "Enable Voice mode" ++ @e129 [window] ++ @e142 [scroll-area] ++ @e144 [other] "Typing Predictions" ++ @e147 [other] "I" ++ @e148 [other] "The" ++ @e149 [other] "I’m" ++ @e155 [keyboard] +… changed lines truncated +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-gesture-open.png (402x874 @1x) +Panned (200, 210) by (0, 160) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-slow-down.png (402x874 @1x) +Flung down +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-flick.png (402x874 @1x) +Slow scroll retained keyboard; flick keyboard visible=true; input heights=30,30,30 diff --git a/scroll-regression/ios/composer-scroll-ios-gestures.sh b/scroll-regression/ios/composer-scroll-ios-gestures.sh new file mode 100644 index 0000000000..5c2a4e70c1 --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-gestures.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -euo pipefail +dir=/Volumes/devbox/workspace/composer-scroll-ios-evidence +ad(){ agent-device "$@" --session composer-scroll-ios; } +ad snapshot --raw --json > "$dir/gesture-target.json" +target=$(node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); console.log("@"+n.ref)' "$dir/gesture-target.json") +ad press "$target" --settle +ad snapshot --raw --json > "$dir/chat-gesture-open.json" +ad screenshot "$dir/chat-gesture-open.png" +ad gesture pan 200 210 0 160 1000 +sleep 1 +ad snapshot --raw --json > "$dir/chat-slow-down.json" +ad screenshot "$dir/chat-slow-down.png" +ad gesture fling down 200 180 230 +sleep 1 +ad snapshot --raw --json > "$dir/chat-flick.json" +ad screenshot "$dir/chat-flick.png" +node - "$dir" <<'JS' +const dir=process.argv[2]; +const ns=name=>require(`${dir}/${name}.json`).data.nodes; +const keyboard=name=>ns(name).some(n=>n.type==='Keyboard'&&n.rect.y<874); +for(const name of ['chat-gesture-open','chat-slow-down']) if(!keyboard(name)) throw Error(`${name}: keyboard dismissed`); +const h=name=>ns(name).find(n=>n.type==='TextView'&&n.label?.startsWith('Message agent')).rect.height; +console.log(`Slow scroll retained keyboard; flick keyboard visible=${keyboard('chat-flick')}; input heights=${h('chat-gesture-open')},${h('chat-slow-down')},${h('chat-flick')}`); +if(Math.abs(h('chat-gesture-open')-h('chat-flick'))>1/3)throw Error('Flick changed input height'); +JS diff --git a/scroll-regression/ios/composer-scroll-ios-native-existing.sh b/scroll-regression/ios/composer-scroll-ios-native-existing.sh new file mode 100644 index 0000000000..99e7c879b1 --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-native-existing.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail +host="$1" +dir=/Volumes/devbox/workspace/composer-scroll-ios-evidence +ad(){ agent-device "$@" --session composer-scroll-ios; } +snap(){ ad snapshot --raw --json > "$dir/$host-$1.json"; } +ad press 398 118 +sleep 5 +ad screenshot "$dir/$host-native-submitted.png" +ad gesture fling down 200 200 300 +sleep 2 +ad screenshot "$dir/$host-native-after-submit.png" +for i in 1 2 3 4 5 6; do ad gesture fling up 200 650 450; done +sleep 5 +ad screenshot "$dir/$host-native-bottom-idle.png" +ad gesture fling down 200 200 300 +sleep 2 +ad screenshot "$dir/$host-native-after-idle.png" +snap native-finished diff --git a/scroll-regression/ios/composer-scroll-ios-native-final.log b/scroll-regression/ios/composer-scroll-ios-native-final.log new file mode 100644 index 0000000000..d37dd01a05 --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-native-final.log @@ -0,0 +1,19 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +React Native overlay dismiss action sent and verified gone +Tapped label="Send message" (365, 801) +Tapped (398, 118) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-native-submitted.png (402x874 @1x) +Flung down +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-native-after-submit.png (402x874 @1x) +Flung up +Flung up +Flung up +Flung up +Flung up +Flung up +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-native-bottom-idle.png (402x874 @1x) +Flung down +/Volumes/devbox/workspace/composer-scroll-ios-evidence/chat-native-after-idle.png (402x874 @1x) diff --git a/scroll-regression/ios/composer-scroll-ios-scenario.sh b/scroll-regression/ios/composer-scroll-ios-scenario.sh new file mode 100644 index 0000000000..c378958183 --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-scenario.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -euo pipefail +host="$1" +dir=/Volumes/devbox/workspace/composer-scroll-ios-evidence +mkdir -p "$dir" +ad() { agent-device "$@" --session composer-scroll-ios; } +snap() { ad snapshot --raw --json > "$dir/$host-$1.json"; } +clear_editor() { + # XCTest's fill can leave the offscreen tail; use the actual delete key. + snap target + target=$(node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); console.log("@"+n.ref)' "$dir/$host-target.json") + ad fill "$target" x || true + snap clearing + read -r x y < <(node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); console.log(n.rect.x+n.rect.width-3,n.rect.y+n.rect.height-8)' "$dir/$host-clearing.json") + ad press "$x" "$y" + ad longpress 376 720 12000 + snap cleared + node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); if(n.value) throw Error("Draft not empty: "+n.value)' "$dir/$host-cleared.json" +} +clear_editor +snap empty-open +ad press 4 370 +snap content-dismissed +snap target +target=$(node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); console.log("@"+n.ref)' "$dir/$host-target.json") +ad fill "$target" $'one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty' +snap cap-open +ad screenshot "$dir/$host-cap-open.png" +ad press 398 118 +snap header-dismissed +ad screenshot "$dir/$host-header-dismissed.png" +snap target +target=$(node -e 'const n=require(process.argv[1]).data.nodes.find(n=>n.type==="TextView" && n.label?.startsWith("Message agent")); console.log("@"+n.ref)' "$dir/$host-target.json") +ad press "$target" +snap reopened +clear_editor +node /Volumes/devbox/workspace/composer-dock-ios-assert.cjs "$dir" "$host" diff --git a/scroll-regression/ios/composer-scroll-ios-workspace-final.log b/scroll-regression/ios/composer-scroll-ios-workspace-final.log new file mode 100644 index 0000000000..53d816606c --- /dev/null +++ b/scroll-regression/ios/composer-scroll-ios-workspace-final.log @@ -0,0 +1,234 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +Tapped (398, 118) +Tapped id="menu-button" (24, 98) +settled after 2154ms: +187 -7 (~123 unchanged) ++ @e2 [window] ++ @e4 [other] "Close menu" ++ @e5 [button] "Close menu" ++ @e127 [other] "Close sidebar" ++ @e128 [button] "Close sidebar" ++ @e129 [button] "New workspace" ++ @e130 [button] "History" ++ @e131 [button] "Search" ++ @e132 [button] "Schedules" ++ @e133 [scroll-area] "Pinned" ++ @e134 [other] "Pinned" ++ @e135 [button] "Pinned" ++ @e136 [scroll-area] ++ @e137 [cell] "skills, Skills" ++ @e138 [button] "skills, Skills" ++ @e139 [button] "Workspace actions" ++ @e140 [other] "hub, Hub" ++ @e141 [button] "hub, Hub" ++ @e142 [button] "Workspace actions" ++ @e143 [other] "assistant, Assistant" ++ @e144 [button] "assistant, Assistant" ++ @e145 [button] "Workspace actions" ++ @e146 [other] "paseo, Paseo" ++ @e147 [button] "paseo, Paseo" ++ @e148 [button] "Workspace actions" ++ @e149 [text] "Workspaces" ++ @e150 [button] "Display preferences" ++ @e151 [scroll-area] "Create a new workspace for assistant" ++ @e152 [other] "admiring-hamster, Create a new workspace for admiring-hamster, Project actions" ++ @e153 [button] "admiring-hamster, Create a new workspace for admiring-hamster, Project actions" ++ @e154 [button] "Create a new workspace for admiring-hamster" ++ @e155 [button] "Project actions" ++ @e156 [scroll-area] ++ @e157 [cell] "fix/terminal-keyboard-flicker, Pull request #4469" ++ @e158 [button] "fix/terminal-keyboard-flicker, Pull request #4469" ++ @e159 [button] "Workspace actions" ++ @e160 [link] "Pull request #4469" ++ @e161 [other] "Checks passed" ++ @e162 [cell] "A, assistant, Create a new workspace for assistant, Project actions" ++ @e163 [button] "A, assistant, Create a new workspace for assistant, Project actions" ++ @e164 [button] "Create a new workspace for assistant" ++ @e165 [button] "Project actions" ++ @e166 [button] "Create a new workspace for assistant" ++ @e167 [cell] "C, composer-dock-ios-fixture, Create a new workspace for composer-dock-ios-fixture, Project actions" ++ @e168 [button] "C, composer-dock-ios-fixture, Create a new workspace for composer-dock-ios-fixture, Project actions" ++ @e169 [button] "Create a new workspace for composer-dock-ios-fixture" ++ @e170 [button] "Project actions" ++ @e171 [scroll-area] ++ @e172 [other] "main" ++ @e173 [button] "main" ++ @e174 [button] "Workspace actions" ++ @e175 [cell] "editor, Create a new workspace for editor, Project actions" ++ @e176 [button] "editor, Create a new workspace for editor, Project actions" ++ @e177 [button] "Create a new workspace for editor" ++ @e178 [button] "Project actions" ++ @e179 [scroll-area] ++ @e180 [cell] "Find Blank Page PR pending review" ++ @e181 [button] "Find Blank Page PR pending review" ++ @e182 [button] "Workspace actions" ++ @e183 [cell] "Review #871 — sharing and handle flow, Pull request #871" ++ @e184 [button] "Review #871 — sharing and handle flow, Pull request #871" ++ @e185 [button] "Workspace actions" ++ @e186 [other] "Checks passed" ++ @e187 [cell] "G, greasy-yak, Create a new workspace for greasy-yak, Project actions" ++ @e188 [button] "G, greasy-yak, Create a new workspace for greasy-yak, Project actions" ++ @e189 [button] "Create a new workspace for greasy-yak" ++ @e190 [button] "Project actions" ++ @e191 [button] "Create a new workspace for greasy-yak" ++ @e192 [other] "H, hub, Create a new workspace for hub, Project actions" ++ @e193 [button] "H, hub, Create a new workspace for hub, Project actions" ++ @e194 [button] "Create a new workspace for hub" ++ @e195 [button] "Project actions" ++ @e196 [scroll-area] ++ @e197 [cell] "Fix hosted GitHub reply registration, Pull request #122" ++ @e198 [button] "Fix hosted GitHub reply registration, Pull request #122" ++ @e199 [button] "Workspace actions" ++ @e200 [link] "Pull request #122" ++ @e201 [other] "Checks passed" ++ @e202 [cell] "Steer existing agents by trigger context, Pull request #118" ++ @e203 [button] "Steer existing agents by trigger context, Pull request #118" +… changed lines truncated +Tapped id="sidebar-global-new-workspace" (201, 86) +settled after 834ms: +10 -304 (~6 unchanged) +- @e3 [other] "Switch tabs (2 open)" +- @e4 [other] "Close menu" +- @e5 [button] "Close menu" +- @e6 [other] "main" +- @e7 [text] "composer-dock-ios-fixture" +- @e8 [text] "·" +- @e9 [other] "dev-new" +- @e10 [text] "dev-new" +- @e11 [button] "Workspace actions" +- @e12 [button] "Open Explorer sidebar" +- @e13 [button] "Switch tabs (2 open)" +- @e14 [other] "Add attachment" ++ @e3 [other] "Open menu" ++ @e4 [button] "Open menu" ++ @e5 [other] "New workspace" ++ @e6 [button] "Workspace project" ++ @e7 [text] "C" ++ @e8 [button] "Workspace isolation" ++ @e9 [button] "Choose what to launch" +- @e16 [other] "Scroll to bottom" +- @e17 [scroll-area] "Thinking" +- @e18 [other] "Native scroll fixture 0: distinct history row after submitting from a dock host. +Native scroll fixture 1: distinct history row after submitting from a dock host. +Native scroll fixture 2: distinct history row after submitting from a dock host. +Native scroll fixture 3: distinct history row after submitting from a dock host. +Native scroll fixture 4: distinct history row after submitting from a dock host. +Native scroll fixture 5: distinct history row after submitting from a dock host. +Native scroll fixture 6: distinct history row after submitting from a dock host. +Native scroll fixture 7: distinct history row after submitting from a dock host. +Native scroll fixture 8: distinct history row after submitting from a dock host. +Native scroll fixture 9: distinct history row after submitting from a dock host. +Native scroll fixture 10: distinct history row after submitting from a dock host. +Native scroll fixture 11: distinct history row after submitting from a dock host. +Native scroll fixture 12: distinct history row after submitting from a dock host. +Native scroll fixture 13: distinct history row after submitting from a dock host. +Native scroll fixture 14: distinct history row after submitting from a dock host. +Native scroll fixture 15: distinct history row after submitting from a dock host. +Native scroll fixture 16: distinct history row after submitting from a dock host. +Native scroll fixture 17: distinct history row after submitting from a dock host. +Native scroll fixture 18: distinct history row after submitting from a dock host. +Native scroll fixture 19: distinct history row after submitting from a dock host. +Native scroll fixture 20: distinct history row after submitting from a dock host. +Native scroll fixture 21: distinct history row after submitting from a dock host. +Native scroll fixture 22: distinct history row after submitting from a dock host. +Native scroll fixture 23: distinct history row after submitting from a dock host. +Native scroll fixture 24: distinct history row after submitting from a dock host. +Native scroll fixture 25: distinct history row after submitting from a dock host. +Native scroll fixture 26: distinct history row after submitting from a dock host. +Native scroll fixture 27: distinct history row after submitting from a dock host. +Native scroll fixture 28: distinct history row after submitting from a dock host. +Native scroll fixture 29: distinct history row after submitting from a dock host. +Native scroll fixture 30: distinct history row after submitting from a dock host. +Native scroll fixture 31: distinct history row after submitting from a dock host. +Native scroll fixture 32: distinct history row after submitting from a dock host. +Native scroll fixture 33: distinct history row after submitting from a dock host. +Native scroll fixture 34: distinct history row after submitting from a dock host. +Native scroll fixture 35: distinct history row after submitting from a dock host. +Native scroll fixture 36: distinct history row after submitting from a dock host. +Native scroll fixture 37: distinct history row after submitting from a dock host. +Native scroll fixture 38: distinct history row after submitting from a dock host. +Native scroll fixture 39: distinct history row after submitting from a dock host. +Native scroll fixture 40: distinct history row after submitting from a dock host. +Native scroll fixture 41: distinct history row after submitting from a dock host. +Native scroll fixture 42: distinct history row after submitting from a dock host. +Native scroll fi" +- @e19 [text] "8:53 PM" +- @e20 [button] "Rewind to this message" +- @e21 [button] "Copy message" +- @e22 [other] "Cycle 1" +- @e23 [text-view] "Cycle 1" +- @e24 [text-view] "Cycle 1" +- @e25 [other] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so" +- @e26 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so" +- @e27 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files." +- @e28 [other] "Thinking" +- @e29 [button] "Thinking" +- @e30 [other] "Read, packages/app/src/components/conversation-list.tsx" +- @e31 [button] "Read, packages/app/src/components/conversation-list.tsx" +- @e32 [other] "Search, scrollToEnd" +- @e33 [button] "Search, scrollToEnd" +- @e34 [other] "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:" +- @e35 [text-view] "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:" +- @e36 [text-view] "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:" +- @e37 [text] "•" +- @e38 [cell] "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space." +- @e39 [text-view] "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space." +- @e40 [text-view] "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space." +- @e41 [text] "•" +- @e42 [cell] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." +- @e43 [text-view] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." +- @e44 [text-view] "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams." +- @e45 [text] "•" +- @e46 [cell] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." +- @e47 [text-view] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." +- @e48 [text-view] "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame." +- @e49 [text] "•" +- @e50 [cell] "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout." +- @e51 [text-view] "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout." +- @e52 [text-view] "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout." +- @e53 [cell] "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast." +- @e54 [text-view] "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast." +- @e55 [other] "Edit, packages/app/src/hooks/use-scroll-anchor.ts" +- @e56 [button] "Edit, packages/app/src/hooks/use-scroll-anchor.ts" +- @e57 [other] "Shell, node scripts/simulate-stream-burst.mjs" +- @e58 [button] "Shell, node scripts/simulate-stream-burst.mjs" +- @e59 [other] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle" +- @e60 [text-view] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle" +- @e61 [text-view] "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2" +- @e62 [other] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so" +- @e63 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so" +- @e64 [text-view] "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files." +- @e65 [other] "Thinking" +- @e66 [button] "Thinking" +- @e67 [other] "Read, packages/app/src/components/conversation-list.tsx" +- @e68 [button] "Read, packages/app/src/components/conversation-list.tsx" +- @e69 [other] "Search, scrollToEnd" +- @e70 [button] "Search, scrollToEnd" +- @e71 [other] "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:" +- @e72 [text-view] "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:" +- @e73 [text] "•" ++ @e13 [other] "Select model (Select model)" ++ @e14 [button] "Select model (Select model)" ++ @e16 [button] "Create" +… changed lines truncated +Filled 1 chars +Tapped (370, 465) +Long pressed (376, 720) +Tapped (4, 370) +Filled 131 chars +/Volumes/devbox/workspace/composer-scroll-ios-evidence/new-workspace-cap-open.png (402x874 @1x) +Tapped (398, 118) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/new-workspace-header-dismissed.png (402x874 @1x) +Tapped @e54 (201, 609) +Error (TEXT_ENTRY_MISMATCH): text entry verification failed: expected "x", observed "x +seventeen +eighteen +nineteen +twenty" +Hint: Retry with --debug and inspect diagnostics log for details. +Diagnostic ID: mu4l31h0-f92c6619 +Diagnostics Log: /Users/runner/.agent-device/sessions/composer-scroll-ios/runner.log +Tapped (370, 465) +Long pressed (376, 720) +PASS iOS host=new-workspace: content/header dismissal, cap close/reopen 333pt, empty/reset 30pt, header/keyboard bounds diff --git a/scroll-regression/ios/gesture-target.json b/scroll-regression/ios/gesture-target.json new file mode 100644 index 0000000000..6d59a47ea6 --- /dev/null +++ b/scroll-regression/ios/gesture-target.json @@ -0,0 +1,7280 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "index": 0, + "label": "Paseo Debug", + "depth": 0, + "type": "Application", + "ref": "e1" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 0, + "enabled": true, + "index": 1, + "depth": 1, + "type": "Window", + "ref": "e2" + }, + { + "index": 2, + "type": "Other", + "depth": 2, + "parentIndex": 1, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "hittable": false, + "ref": "e3" + }, + { + "index": 3, + "type": "Other", + "depth": 3, + "parentIndex": 2, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "hittable": false, + "ref": "e4" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "index": 4, + "hittable": false, + "enabled": true, + "depth": 4, + "parentIndex": 3, + "ref": "e5" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "index": 5, + "hittable": false, + "enabled": true, + "depth": 5, + "parentIndex": 4, + "ref": "e6" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "hittable": false, + "index": 6, + "depth": 6, + "parentIndex": 5, + "ref": "e7" + }, + { + "index": 7, + "depth": 7, + "parentIndex": 6, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "type": "Other", + "ref": "e8" + }, + { + "type": "Other", + "hittable": false, + "depth": 8, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 8, + "parentIndex": 7, + "enabled": true, + "ref": "e9" + }, + { + "type": "Other", + "hittable": false, + "depth": 9, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 9, + "parentIndex": 8, + "enabled": true, + "ref": "e10" + }, + { + "hittable": false, + "depth": 9, + "parentIndex": 8, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 10, + "ref": "e11" + }, + { + "index": 11, + "enabled": true, + "depth": 10, + "hittable": false, + "parentIndex": 10, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "ref": "e12" + }, + { + "hittable": false, + "parentIndex": 10, + "depth": 10, + "enabled": true, + "index": 12, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "ref": "e13" + }, + { + "type": "Other", + "hittable": false, + "parentIndex": 12, + "index": 13, + "depth": 11, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "ref": "e14" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 11, + "index": 14, + "parentIndex": 12, + "ref": "e15" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 12, + "index": 15, + "parentIndex": 14, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "ref": "e16" + }, + { + "index": 16, + "depth": 13, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 15, + "enabled": true, + "ref": "e17" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 17, + "enabled": true, + "type": "Other", + "depth": 14, + "parentIndex": 16, + "ref": "e18" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 17, + "index": 18, + "depth": 15, + "ref": "e19" + }, + { + "index": 19, + "hittable": false, + "depth": 16, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 18, + "ref": "e20" + }, + { + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 20, + "type": "Other", + "enabled": true, + "parentIndex": 19, + "hittable": false, + "depth": 17, + "ref": "e21" + }, + { + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "index": 21, + "type": "Other", + "enabled": true, + "parentIndex": 20, + "hittable": false, + "depth": 18, + "ref": "e22" + }, + { + "enabled": true, + "parentIndex": 21, + "hittable": false, + "depth": 19, + "index": 22, + "type": "Other", + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "ref": "e23" + }, + { + "hittable": false, + "enabled": true, + "index": 23, + "depth": 20, + "type": "Other", + "parentIndex": 22, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "ref": "e24" + }, + { + "type": "Other", + "enabled": true, + "index": 24, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "depth": 21, + "label": "Switch tabs (2 open)", + "parentIndex": 23, + "hittable": false, + "ref": "e25" + }, + { + "index": 25, + "label": "Open menu", + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 22, + "parentIndex": 24, + "ref": "e26" + }, + { + "index": 26, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "label": "Open menu", + "enabled": true, + "hittable": false, + "parentIndex": 25, + "type": "Other", + "depth": 23, + "ref": "e27" + }, + { + "parentIndex": 26, + "type": "Other", + "hittable": false, + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "depth": 24, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "index": 27, + "label": "Open menu", + "ref": "e28" + }, + { + "parentIndex": 27, + "identifier": "composer-dock-header", + "enabled": true, + "depth": 25, + "index": 28, + "label": "Open menu", + "type": "Other", + "hittable": false, + "rect": { + "height": 126, + "x": 0, + "width": 402, + "y": 0 + }, + "ref": "e29" + }, + { + "enabled": true, + "rect": { + "height": 56, + "x": 0, + "width": 402, + "y": 70 + }, + "hittable": false, + "depth": 26, + "type": "Other", + "index": 29, + "parentIndex": 28, + "ref": "e30" + }, + { + "parentIndex": 28, + "depth": 26, + "rect": { + "height": 32, + "x": 8, + "width": 32, + "y": 81.6666669845581 + }, + "index": 30, + "label": "Open menu", + "type": "Button", + "enabled": true, + "hittable": false, + "identifier": "menu-button", + "ref": "e31" + }, + { + "parentIndex": 30, + "type": "Other", + "hittable": false, + "rect": { + "height": 12, + "x": 16, + "width": 16, + "y": 91.6666669845581 + }, + "enabled": true, + "depth": 27, + "index": 31, + "ref": "e32" + }, + { + "rect": { + "height": 1.3333358764648438, + "x": 16, + "width": 16, + "y": 91.6666669845581 + }, + "enabled": true, + "type": "Other", + "depth": 28, + "index": 32, + "parentIndex": 31, + "hittable": false, + "ref": "e33" + }, + { + "enabled": true, + "rect": { + "height": 1.6666717529296875, + "x": 16, + "width": 16, + "y": 97.00000047683716 + }, + "hittable": false, + "type": "Other", + "depth": 28, + "parentIndex": 31, + "index": 33, + "ref": "e34" + }, + { + "index": 34, + "hittable": false, + "depth": 28, + "parentIndex": 31, + "enabled": true, + "type": "Other", + "rect": { + "height": 1.6666641235351562, + "x": 16, + "width": 8, + "y": 102.33333396911621 + }, + "ref": "e35" + }, + { + "type": "Other", + "hittable": false, + "depth": 26, + "parentIndex": 28, + "index": 35, + "enabled": true, + "rect": { + "height": 34, + "x": 48, + "width": 314, + "y": 80.6666669845581 + }, + "label": "main", + "ref": "e36" + }, + { + "rect": { + "height": 34, + "x": 48, + "width": 278, + "y": 80.6666669845581 + }, + "parentIndex": 35, + "index": 36, + "hittable": false, + "type": "Other", + "depth": 27, + "label": "main", + "enabled": true, + "ref": "e37" + }, + { + "index": 37, + "type": "StaticText", + "label": "main", + "enabled": true, + "depth": 28, + "parentIndex": 36, + "hittable": false, + "rect": { + "height": 18, + "x": 48, + "width": 278, + "y": 80.6666669845581 + }, + "identifier": "workspace-header-title", + "ref": "e38" + }, + { + "enabled": true, + "parentIndex": 37, + "index": 38, + "label": "main", + "depth": 29, + "type": "StaticText", + "rect": { + "height": 18, + "x": 48, + "width": 278, + "y": 80.6666669845581 + }, + "hittable": false, + "ref": "e39" + }, + { + "index": 39, + "hittable": false, + "rect": { + "height": 15.666671752929688, + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581 + }, + "enabled": true, + "type": "StaticText", + "label": "composer-dock-ios-fixture", + "identifier": "workspace-header-subtitle", + "parentIndex": 36, + "depth": 28, + "ref": "e40" + }, + { + "label": "composer-dock-ios-fixture", + "enabled": true, + "type": "StaticText", + "depth": 29, + "rect": { + "height": 15.666671752929688, + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581 + }, + "parentIndex": 39, + "index": 40, + "hittable": false, + "ref": "e41" + }, + { + "index": 41, + "enabled": true, + "parentIndex": 36, + "label": "·", + "hittable": false, + "type": "StaticText", + "depth": 28, + "rect": { + "height": 15.666671752929688, + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581 + }, + "ref": "e42" + }, + { + "type": "StaticText", + "depth": 29, + "parentIndex": 41, + "label": "·", + "hittable": false, + "enabled": true, + "rect": { + "height": 15.666671752929688, + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581 + }, + "index": 42, + "ref": "e43" + }, + { + "type": "Other", + "depth": 28, + "parentIndex": 36, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "rect": { + "height": 16, + "x": 227.3333282470703, + "width": 68.00001525878906, + "y": 98.6666669845581 + }, + "enabled": true, + "hittable": false, + "index": 43, + "ref": "e44" + }, + { + "hittable": false, + "rect": { + "height": 12, + "x": 227.3333282470703, + "width": 12, + "y": 100.6666669845581 + }, + "enabled": true, + "depth": 28, + "type": "Other", + "parentIndex": 36, + "index": 44, + "ref": "e45" + }, + { + "index": 45, + "rect": { + "height": 11, + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581 + }, + "type": "Other", + "depth": 29, + "parentIndex": 44, + "enabled": true, + "hittable": false, + "ref": "e46" + }, + { + "hittable": false, + "depth": 30, + "rect": { + "height": 5, + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581 + }, + "enabled": true, + "parentIndex": 45, + "type": "Other", + "index": 46, + "ref": "e47" + }, + { + "type": "Other", + "depth": 30, + "enabled": true, + "rect": { + "height": 5, + "x": 227.8333282470703, + "width": 11, + "y": 107.1666669845581 + }, + "parentIndex": 45, + "index": 47, + "hittable": false, + "ref": "e48" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "height": 1, + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 103.1666669845581 + }, + "index": 48, + "parentIndex": 45, + "depth": 30, + "ref": "e49" + }, + { + "depth": 30, + "rect": { + "height": 1, + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 109.1666669845581 + }, + "parentIndex": 45, + "enabled": true, + "index": 49, + "type": "Other", + "hittable": false, + "ref": "e50" + }, + { + "type": "StaticText", + "parentIndex": 36, + "hittable": false, + "label": "dev-new", + "index": 50, + "rect": { + "height": 16, + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581 + }, + "enabled": true, + "depth": 28, + "ref": "e51" + }, + { + "index": 51, + "label": "dev-new", + "enabled": true, + "type": "StaticText", + "hittable": false, + "rect": { + "height": 16, + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581 + }, + "parentIndex": 50, + "depth": 29, + "ref": "e52" + }, + { + "index": 52, + "type": "Button", + "parentIndex": 35, + "identifier": "workspace-header-menu-trigger", + "rect": { + "height": 32, + "x": 330, + "width": 32, + "y": 81.6666669845581 + }, + "depth": 27, + "enabled": true, + "hittable": false, + "label": "Workspace actions", + "ref": "e53" + }, + { + "type": "Button", + "label": "Open Explorer sidebar", + "identifier": "workspace-explorer-toggle", + "rect": { + "height": 32, + "x": 362, + "width": 32, + "y": 81.6666669845581 + }, + "depth": 26, + "hittable": false, + "index": 53, + "enabled": true, + "parentIndex": 28, + "ref": "e54" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "depth": 25, + "parentIndex": 27, + "hittable": false, + "index": 54, + "ref": "e55" + }, + { + "depth": 25, + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "parentIndex": 27, + "type": "Other", + "index": 55, + "hittable": false, + "ref": "e56" + }, + { + "parentIndex": 27, + "label": "Switch tabs (2 open)", + "depth": 25, + "index": 56, + "enabled": true, + "rect": { + "height": 34, + "x": 0, + "width": 402, + "y": 126 + }, + "hittable": false, + "type": "Button", + "identifier": "workspace-tab-switcher-trigger", + "ref": "e57" + }, + { + "hittable": false, + "type": "Other", + "depth": 26, + "rect": { + "height": 14, + "x": 20, + "width": 14, + "y": 136 + }, + "identifier": "workspace-active-tab-icon", + "parentIndex": 56, + "index": 57, + "enabled": true, + "ref": "e58" + }, + { + "index": 58, + "enabled": true, + "type": "Other", + "identifier": "workspace-tabs-row", + "hittable": false, + "rect": { + "height": 35, + "x": 0, + "width": 402, + "y": 126 + }, + "depth": 25, + "parentIndex": 27, + "ref": "e59" + }, + { + "index": 59, + "hittable": false, + "enabled": true, + "depth": 25, + "type": "Other", + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "parentIndex": 27, + "ref": "e60" + }, + { + "enabled": true, + "index": 60, + "depth": 25, + "parentIndex": 27, + "hittable": false, + "type": "Other", + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "ref": "e61" + }, + { + "enabled": true, + "label": "Add attachment", + "index": 61, + "type": "Other", + "depth": 26, + "parentIndex": 60, + "hittable": false, + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "ref": "e62" + }, + { + "parentIndex": 61, + "index": 62, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 27, + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "ref": "e63" + }, + { + "hittable": false, + "index": 63, + "parentIndex": 61, + "enabled": true, + "type": "Other", + "depth": 27, + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "ref": "e64" + }, + { + "type": "Other", + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "index": 64, + "enabled": true, + "hittable": false, + "depth": 27, + "identifier": "composer-viewport", + "label": "Message agent... Message, @files, /commands", + "parentIndex": 61, + "ref": "e65" + }, + { + "parentIndex": 64, + "type": "Other", + "index": 65, + "depth": 28, + "hittable": false, + "rect": { + "height": 713, + "x": 0, + "width": 402, + "y": 161 + }, + "label": "Scroll to bottom", + "enabled": true, + "ref": "e66" + }, + { + "hittable": false, + "depth": 29, + "index": 66, + "parentIndex": 65, + "enabled": true, + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "label": "Horizontal scroll bar, 1 page", + "identifier": "composer-dock-content", + "type": "Other", + "ref": "e67" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "enabled": true, + "parentIndex": 66, + "index": 67, + "depth": 30, + "ref": "e68" + }, + { + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "depth": 30, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 66, + "hittable": false, + "index": 68, + "type": "Other", + "enabled": true, + "ref": "e69" + }, + { + "parentIndex": 68, + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 69, + "depth": 31, + "ref": "e70" + }, + { + "depth": 31, + "hittable": false, + "enabled": true, + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "type": "Other", + "parentIndex": 68, + "index": 70, + "identifier": "agent-chat-scroll", + "label": "Horizontal scroll bar, 1 page", + "ref": "e71" + }, + { + "type": "ScrollView", + "label": "Thinking", + "rect": { + "height": 575, + "x": 0, + "width": 402, + "y": 161 + }, + "depth": 32, + "enabled": true, + "parentIndex": 70, + "index": 71, + "hittable": false, + "ref": "e72" + }, + { + "parentIndex": 71, + "type": "Other", + "index": 72, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "enabled": true, + "rect": { + "height": 6169.33349609375, + "x": 0, + "width": 402, + "y": -4428.33349609375 + }, + "hittable": false, + "depth": 33, + "ref": "e73" + }, + { + "hittable": false, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "height": 6169.33349609375, + "x": 0, + "width": 402, + "y": -4428.33349609375 + }, + "depth": 34, + "parentIndex": 72, + "enabled": true, + "index": 73, + "type": "Other", + "ref": "e74" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "height": 32, + "x": 12, + "width": 378, + "y": -4428.33349609375 + }, + "hittable": false, + "parentIndex": 73, + "depth": 35, + "index": 74, + "ref": "e75" + }, + { + "type": "Other", + "rect": { + "height": 32, + "x": 12, + "width": 378, + "y": -4428.33349609375 + }, + "depth": 36, + "parentIndex": 74, + "index": 75, + "enabled": true, + "identifier": "older-history-slot", + "hittable": false, + "ref": "e76" + }, + { + "type": "Other", + "hittable": false, + "depth": 35, + "index": 76, + "enabled": true, + "rect": { + "height": 747, + "x": 12, + "width": 378, + "y": -4396.33349609375 + }, + "parentIndex": 73, + "ref": "e77" + }, + { + "rect": { + "height": 1725.33349609375, + "x": 12, + "width": 378, + "y": -3649.33349609375 + }, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "depth": 35, + "index": 77, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 73, + "ref": "e78" + }, + { + "rect": { + "height": 1725.33349609375, + "x": 20, + "width": 362, + "y": -3649.33349609375 + }, + "index": 78, + "enabled": true, + "depth": 36, + "parentIndex": 77, + "identifier": "user-message", + "type": "Other", + "hittable": false, + "ref": "e79" + }, + { + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "type": "Other", + "depth": 36, + "rect": { + "height": 1725.33349609375, + "x": 20, + "width": 362, + "y": -3649.33349609375 + }, + "hittable": false, + "enabled": true, + "parentIndex": 77, + "index": 79, + "ref": "e80" + }, + { + "enabled": true, + "rect": { + "height": 1693.33349609375, + "x": 20, + "width": 362, + "y": -3649.33349609375 + }, + "parentIndex": 79, + "type": "Other", + "index": 80, + "hittable": false, + "depth": 37, + "ref": "e81" + }, + { + "depth": 37, + "parentIndex": 79, + "hittable": false, + "rect": { + "height": 1661.66650390625, + "x": 36, + "width": 330, + "y": -3633.33349609375 + }, + "type": "StaticText", + "index": 81, + "enabled": true, + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "ref": "e82" + }, + { + "hittable": false, + "depth": 38, + "index": 82, + "enabled": true, + "type": "StaticText", + "label": "Native scroll fixture 0: distinct history row after submitting from a dock host.\nNative scroll fixture 1: distinct history row after submitting from a dock host.\nNative scroll fixture 2: distinct history row after submitting from a dock host.\nNative scroll fixture 3: distinct history row after submitting from a dock host.\nNative scroll fixture 4: distinct history row after submitting from a dock host.\nNative scroll fixture 5: distinct history row after submitting from a dock host.\nNative scroll fixture 6: distinct history row after submitting from a dock host.\nNative scroll fixture 7: distinct history row after submitting from a dock host.\nNative scroll fixture 8: distinct history row after submitting from a dock host.\nNative scroll fixture 9: distinct history row after submitting from a dock host.\nNative scroll fixture 10: distinct history row after submitting from a dock host.\nNative scroll fixture 11: distinct history row after submitting from a dock host.\nNative scroll fixture 12: distinct history row after submitting from a dock host.\nNative scroll fixture 13: distinct history row after submitting from a dock host.\nNative scroll fixture 14: distinct history row after submitting from a dock host.\nNative scroll fixture 15: distinct history row after submitting from a dock host.\nNative scroll fixture 16: distinct history row after submitting from a dock host.\nNative scroll fixture 17: distinct history row after submitting from a dock host.\nNative scroll fixture 18: distinct history row after submitting from a dock host.\nNative scroll fixture 19: distinct history row after submitting from a dock host.\nNative scroll fixture 20: distinct history row after submitting from a dock host.\nNative scroll fixture 21: distinct history row after submitting from a dock host.\nNative scroll fixture 22: distinct history row after submitting from a dock host.\nNative scroll fixture 23: distinct history row after submitting from a dock host.\nNative scroll fixture 24: distinct history row after submitting from a dock host.\nNative scroll fixture 25: distinct history row after submitting from a dock host.\nNative scroll fixture 26: distinct history row after submitting from a dock host.\nNative scroll fixture 27: distinct history row after submitting from a dock host.\nNative scroll fixture 28: distinct history row after submitting from a dock host.\nNative scroll fixture 29: distinct history row after submitting from a dock host.\nNative scroll fixture 30: distinct history row after submitting from a dock host.\nNative scroll fixture 31: distinct history row after submitting from a dock host.\nNative scroll fixture 32: distinct history row after submitting from a dock host.\nNative scroll fixture 33: distinct history row after submitting from a dock host.\nNative scroll fixture 34: distinct history row after submitting from a dock host.\nNative scroll fixture 35: distinct history row after submitting from a dock host.\nNative scroll fixture 36: distinct history row after submitting from a dock host.\nNative scroll fixture 37: distinct history row after submitting from a dock host.\nNative scroll fixture 38: distinct history row after submitting from a dock host.\nNative scroll fixture 39: distinct history row after submitting from a dock host.\nNative scroll fixture 40: distinct history row after submitting from a dock host.\nNative scroll fixture 41: distinct history row after submitting from a dock host.\nNative scroll fixture 42: distinct history row after submitting from a dock host.\nNative scroll fi", + "rect": { + "height": 1661.66650390625, + "x": 36, + "width": 330, + "y": -3633.33349609375 + }, + "parentIndex": 81, + "ref": "e83" + }, + { + "enabled": true, + "rect": { + "height": 24, + "x": 274.3333282470703, + "width": 107.66665649414062, + "y": -1948.0001220703125 + }, + "identifier": "user-message-trailing-row", + "depth": 37, + "index": 83, + "type": "Other", + "hittable": false, + "parentIndex": 79, + "ref": "e84" + }, + { + "depth": 37, + "label": "8:53 PM", + "rect": { + "height": 15.66650390625, + "x": 274.3333282470703, + "width": 49.666656494140625, + "y": -1944.0001220703125 + }, + "parentIndex": 79, + "index": 84, + "enabled": true, + "identifier": "user-message-timestamp", + "type": "StaticText", + "hittable": false, + "ref": "e85" + }, + { + "label": "8:53 PM", + "hittable": false, + "depth": 38, + "enabled": true, + "index": 85, + "type": "StaticText", + "rect": { + "height": 15.66650390625, + "x": 274.3333282470703, + "width": 49.666656494140625, + "y": -1944.0001220703125 + }, + "parentIndex": 84, + "ref": "e86" + }, + { + "index": 86, + "hittable": false, + "label": "Rewind to this message", + "parentIndex": 79, + "enabled": true, + "type": "Other", + "rect": { + "height": 24, + "x": 331.99999618530273, + "width": 24, + "y": -1948.0001220703125 + }, + "depth": 37, + "ref": "e87" + }, + { + "type": "Button", + "depth": 38, + "rect": { + "height": 24, + "x": 331.99999618530273, + "width": 24, + "y": -1948.0001220703125 + }, + "enabled": true, + "parentIndex": 86, + "label": "Rewind to this message", + "identifier": "rewind-menu-trigger", + "index": 87, + "hittable": false, + "ref": "e88" + }, + { + "parentIndex": 79, + "rect": { + "height": 22, + "x": 363.99999237060547, + "width": 22, + "y": -1947.0001220703125 + }, + "type": "Button", + "enabled": true, + "index": 88, + "hittable": false, + "label": "Copy message", + "depth": 37, + "ref": "e89" + }, + { + "label": "Cycle 1", + "rect": { + "height": 394, + "x": 12, + "width": 378, + "y": -1924 + }, + "type": "Other", + "depth": 35, + "hittable": false, + "parentIndex": 73, + "enabled": true, + "index": 89, + "ref": "e90" + }, + { + "index": 90, + "identifier": "assistant-message", + "depth": 36, + "hittable": false, + "enabled": true, + "rect": { + "height": 390, + "x": 20, + "width": 362, + "y": -1924 + }, + "type": "Other", + "parentIndex": 89, + "ref": "e91" + }, + { + "depth": 36, + "parentIndex": 89, + "enabled": true, + "type": "Other", + "rect": { + "height": 33, + "x": 20, + "width": 84, + "y": -1888 + }, + "hittable": false, + "index": 91, + "label": "Cycle 1", + "ref": "e92" + }, + { + "parentIndex": 91, + "type": "Other", + "depth": 37, + "rect": { + "height": 33, + "x": 20, + "width": 84, + "y": -1888 + }, + "hittable": false, + "label": "Cycle 1", + "index": 92, + "enabled": true, + "ref": "e93" + }, + { + "parentIndex": 92, + "rect": { + "height": 33, + "x": 20, + "width": 84, + "y": -1888 + }, + "hittable": false, + "depth": 38, + "type": "Other", + "enabled": true, + "index": 93, + "ref": "e94" + }, + { + "rect": { + "height": 0, + "x": 0, + "width": 0, + "y": 0 + }, + "index": 94, + "label": "Cycle 1", + "value": "Cycle 1", + "parentIndex": 92, + "enabled": true, + "hittable": false, + "depth": 38, + "type": "TextView", + "ref": "e95" + }, + { + "type": "TextView", + "label": "Cycle 1", + "index": 95, + "parentIndex": 94, + "hittable": false, + "enabled": true, + "depth": 39, + "rect": { + "y": -1888, + "width": 83.7953545153141, + "height": 33, + "x": 20 + }, + "ref": "e96" + }, + { + "enabled": true, + "parentIndex": 94, + "value": "0%", + "type": "Other", + "hittable": false, + "depth": 39, + "index": 96, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -1888, + "width": 30, + "height": 33, + "x": 71 + }, + "ref": "e97" + }, + { + "depth": 40, + "rect": { + "y": -1927, + "width": 3, + "height": 36, + "x": 98 + }, + "type": "Other", + "parentIndex": 96, + "index": 97, + "hittable": false, + "enabled": true, + "ref": "e98" + }, + { + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "rect": { + "y": -1874.5, + "width": 84, + "height": 16.5, + "x": 20 + }, + "enabled": true, + "depth": 39, + "type": "Other", + "index": 98, + "parentIndex": 94, + "hittable": false, + "ref": "e99" + }, + { + "index": 99, + "enabled": true, + "depth": 40, + "parentIndex": 98, + "hittable": false, + "rect": { + "y": -1861, + "width": 36, + "height": 3, + "x": -19 + }, + "type": "Other", + "ref": "e100" + }, + { + "hittable": false, + "rect": { + "y": -1888, + "width": 362, + "height": 42, + "x": 20 + }, + "parentIndex": 89, + "type": "Other", + "depth": 36, + "index": 100, + "enabled": true, + "ref": "e101" + }, + { + "hittable": false, + "index": 101, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": -1822, + "width": 362, + "height": 264, + "x": 20 + }, + "enabled": true, + "type": "Other", + "parentIndex": 89, + "depth": 36, + "ref": "e102" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "depth": 37, + "type": "Other", + "index": 102, + "enabled": true, + "parentIndex": 101, + "rect": { + "y": -1822, + "width": 362, + "height": 264, + "x": 20 + }, + "ref": "e103" + }, + { + "index": 103, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": -1822, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 38, + "parentIndex": 102, + "ref": "e104" + }, + { + "parentIndex": 102, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "enabled": true, + "hittable": false, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "index": 104, + "depth": 38, + "type": "TextView", + "ref": "e105" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "index": 105, + "hittable": false, + "type": "TextView", + "enabled": true, + "parentIndex": 104, + "depth": 39, + "rect": { + "y": -1822, + "width": 362, + "height": 264, + "x": 20 + }, + "ref": "e106" + }, + { + "value": "0%", + "index": 106, + "depth": 39, + "enabled": true, + "rect": { + "y": -1822, + "width": 30, + "height": 264, + "x": 349 + }, + "parentIndex": 104, + "type": "Other", + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "ref": "e107" + }, + { + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 106, + "rect": { + "y": -1861, + "width": 3, + "height": 36, + "x": 376 + }, + "enabled": true, + "index": 107, + "ref": "e108" + }, + { + "parentIndex": 104, + "rect": { + "y": -1591, + "width": 362, + "height": 30, + "x": 20 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "hittable": false, + "enabled": true, + "index": 108, + "depth": 39, + "ref": "e109" + }, + { + "rect": { + "y": -1564, + "width": 36, + "height": 3, + "x": -19 + }, + "type": "Other", + "parentIndex": 108, + "index": 109, + "depth": 40, + "hittable": false, + "enabled": true, + "ref": "e110" + }, + { + "enabled": true, + "hittable": false, + "depth": 35, + "label": "Thinking", + "parentIndex": 73, + "type": "Other", + "index": 110, + "rect": { + "y": -1530, + "width": 378, + "height": 32, + "x": 12 + }, + "ref": "e111" + }, + { + "enabled": true, + "index": 111, + "identifier": "tool-call-badge", + "hittable": false, + "rect": { + "y": -1530, + "width": 388, + "height": 32, + "x": 7 + }, + "depth": 36, + "type": "Other", + "parentIndex": 110, + "ref": "e112" + }, + { + "rect": { + "y": -1530, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 110, + "index": 112, + "hittable": false, + "label": "Thinking", + "enabled": true, + "type": "Button", + "depth": 36, + "ref": "e113" + }, + { + "rect": { + "y": -1523, + "width": 344, + "height": 18, + "x": 42 + }, + "type": "Other", + "label": "Thinking", + "hittable": false, + "enabled": true, + "parentIndex": 112, + "depth": 37, + "index": 113, + "ref": "e114" + }, + { + "type": "StaticText", + "rect": { + "y": -1523, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "hittable": false, + "label": "Thinking", + "index": 114, + "parentIndex": 113, + "enabled": true, + "ref": "e115" + }, + { + "rect": { + "y": -1523, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "label": "Thinking", + "enabled": true, + "type": "StaticText", + "index": 115, + "parentIndex": 114, + "depth": 39, + "hittable": false, + "ref": "e116" + }, + { + "type": "Other", + "hittable": false, + "index": 116, + "depth": 35, + "rect": { + "y": -1498, + "width": 378, + "height": 32, + "x": 12 + }, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "enabled": true, + "parentIndex": 73, + "ref": "e117" + }, + { + "parentIndex": 116, + "identifier": "tool-call-badge", + "rect": { + "y": -1498, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 117, + "depth": 36, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e118" + }, + { + "hittable": false, + "rect": { + "y": -1498, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 118, + "depth": 36, + "enabled": true, + "parentIndex": 116, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "type": "Button", + "ref": "e119" + }, + { + "enabled": true, + "parentIndex": 118, + "index": 119, + "hittable": false, + "label": "Read", + "type": "Other", + "depth": 37, + "rect": { + "y": -1491, + "width": 344, + "height": 18, + "x": 42 + }, + "ref": "e120" + }, + { + "label": "Read", + "rect": { + "y": -1491, + "width": 35, + "height": 18, + "x": 42 + }, + "index": 120, + "depth": 38, + "hittable": false, + "type": "StaticText", + "enabled": true, + "parentIndex": 119, + "ref": "e121" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": -1491, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 39, + "label": "Read", + "type": "StaticText", + "index": 121, + "parentIndex": 120, + "ref": "e122" + }, + { + "type": "StaticText", + "label": "packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -1491, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 38, + "parentIndex": 119, + "hittable": false, + "enabled": true, + "index": 122, + "ref": "e123" + }, + { + "label": "packages/app/src/components/conversation-list.tsx", + "type": "StaticText", + "parentIndex": 122, + "enabled": true, + "hittable": false, + "index": 123, + "depth": 39, + "rect": { + "y": -1491, + "width": 301, + "height": 18, + "x": 85 + }, + "ref": "e124" + }, + { + "rect": { + "y": -1466, + "width": 378, + "height": 36, + "x": 12 + }, + "parentIndex": 73, + "index": 124, + "enabled": true, + "depth": 35, + "label": "Search, scrollToEnd", + "type": "Other", + "hittable": false, + "ref": "e125" + }, + { + "rect": { + "y": -1466, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 124, + "hittable": false, + "type": "Other", + "enabled": true, + "identifier": "tool-call-badge", + "index": 125, + "depth": 36, + "ref": "e126" + }, + { + "index": 126, + "rect": { + "y": -1466, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "type": "Button", + "depth": 36, + "parentIndex": 124, + "label": "Search, scrollToEnd", + "hittable": false, + "ref": "e127" + }, + { + "parentIndex": 126, + "rect": { + "y": -1459, + "width": 344, + "height": 18, + "x": 42 + }, + "hittable": false, + "label": "Search", + "type": "Other", + "index": 127, + "enabled": true, + "depth": 37, + "ref": "e128" + }, + { + "label": "Search", + "enabled": true, + "rect": { + "y": -1459, + "width": 48, + "height": 18, + "x": 42 + }, + "index": 128, + "parentIndex": 127, + "hittable": false, + "type": "StaticText", + "depth": 38, + "ref": "e129" + }, + { + "rect": { + "y": -1459, + "width": 48, + "height": 18, + "x": 42 + }, + "depth": 39, + "parentIndex": 128, + "hittable": false, + "enabled": true, + "label": "Search", + "type": "StaticText", + "index": 129, + "ref": "e130" + }, + { + "hittable": false, + "index": 130, + "enabled": true, + "label": "scrollToEnd", + "rect": { + "y": -1459, + "width": 79.66667175292969, + "height": 18, + "x": 98 + }, + "type": "StaticText", + "depth": 38, + "parentIndex": 127, + "ref": "e131" + }, + { + "enabled": true, + "index": 131, + "label": "scrollToEnd", + "rect": { + "y": -1459, + "width": 79.66667175292969, + "height": 18, + "x": 98 + }, + "type": "StaticText", + "parentIndex": 130, + "hittable": false, + "depth": 39, + "ref": "e132" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -1430, + "width": 378, + "height": 646, + "x": 12 + }, + "index": 132, + "parentIndex": 73, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 35, + "ref": "e133" + }, + { + "hittable": false, + "enabled": true, + "index": 133, + "depth": 36, + "parentIndex": 132, + "rect": { + "y": -1430, + "width": 362, + "height": 642, + "x": 20 + }, + "identifier": "assistant-message", + "type": "Other", + "ref": "e134" + }, + { + "depth": 36, + "index": 134, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -1418, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 132, + "ref": "e135" + }, + { + "enabled": true, + "rect": { + "y": -1418, + "width": 362, + "height": 132, + "x": 20 + }, + "hittable": false, + "index": 135, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "depth": 37, + "type": "Other", + "parentIndex": 134, + "ref": "e136" + }, + { + "rect": { + "y": -1418, + "width": 362, + "height": 132, + "x": 20 + }, + "enabled": true, + "index": 136, + "parentIndex": 135, + "depth": 38, + "type": "Other", + "hittable": false, + "ref": "e137" + }, + { + "hittable": false, + "depth": 38, + "parentIndex": 135, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "type": "TextView", + "index": 137, + "ref": "e138" + }, + { + "rect": { + "y": -1418, + "width": 362, + "height": 132, + "x": 20 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 138, + "enabled": true, + "parentIndex": 137, + "type": "TextView", + "hittable": false, + "depth": 39, + "ref": "e139" + }, + { + "enabled": true, + "rect": { + "y": -1418, + "width": 30, + "height": 132, + "x": 349 + }, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "index": 139, + "parentIndex": 137, + "hittable": false, + "value": "0%", + "ref": "e140" + }, + { + "rect": { + "y": -1457, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "index": 140, + "hittable": false, + "parentIndex": 139, + "enabled": true, + "type": "Other", + "ref": "e141" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 137, + "index": 141, + "hittable": false, + "enabled": true, + "rect": { + "y": -1319, + "width": 362, + "height": 30, + "x": 20 + }, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "ref": "e142" + }, + { + "parentIndex": 141, + "type": "Other", + "depth": 40, + "enabled": true, + "index": 142, + "rect": { + "y": -1292, + "width": 36, + "height": 3, + "x": -19 + }, + "hittable": false, + "ref": "e143" + }, + { + "label": "•", + "hittable": false, + "rect": { + "y": -1258, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "type": "StaticText", + "index": 143, + "parentIndex": 132, + "enabled": true, + "ref": "e144" + }, + { + "parentIndex": 143, + "type": "StaticText", + "rect": { + "y": -1258, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "hittable": false, + "label": "•", + "index": 144, + "enabled": true, + "ref": "e145" + }, + { + "type": "Other", + "depth": 36, + "rect": { + "y": -1258, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 132, + "index": 145, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "enabled": true, + "ref": "e146" + }, + { + "enabled": true, + "index": 146, + "hittable": false, + "rect": { + "y": -1258, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 37, + "parentIndex": 145, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "type": "Other", + "ref": "e147" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": -1258, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 146, + "type": "Other", + "index": 147, + "depth": 38, + "ref": "e148" + }, + { + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 38, + "index": 148, + "type": "TextView", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "hittable": false, + "parentIndex": 146, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "ref": "e149" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "enabled": true, + "hittable": false, + "parentIndex": 148, + "depth": 39, + "index": 149, + "rect": { + "y": -1258, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "TextView", + "ref": "e150" + }, + { + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "hittable": false, + "value": "0%", + "rect": { + "y": -1258, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "index": 150, + "depth": 39, + "parentIndex": 148, + "ref": "e151" + }, + { + "hittable": false, + "rect": { + "y": -1297, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "enabled": true, + "parentIndex": 150, + "index": 151, + "type": "Other", + "ref": "e152" + }, + { + "type": "Other", + "rect": { + "y": -1203, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "hittable": false, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 148, + "index": 152, + "enabled": true, + "ref": "e153" + }, + { + "hittable": false, + "depth": 40, + "type": "Other", + "rect": { + "y": -1176, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "index": 153, + "enabled": true, + "parentIndex": 152, + "ref": "e154" + }, + { + "parentIndex": 132, + "index": 154, + "rect": { + "y": -1166, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "enabled": true, + "hittable": false, + "type": "StaticText", + "label": "•", + "depth": 36, + "ref": "e155" + }, + { + "rect": { + "y": -1166, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 37, + "type": "StaticText", + "label": "•", + "parentIndex": 154, + "index": 155, + "hittable": false, + "enabled": true, + "ref": "e156" + }, + { + "hittable": false, + "rect": { + "y": -1166, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 132, + "type": "Other", + "index": 156, + "enabled": true, + "depth": 36, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e157" + }, + { + "index": 157, + "depth": 37, + "parentIndex": 156, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "rect": { + "y": -1166, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "Other", + "ref": "e158" + }, + { + "depth": 38, + "hittable": false, + "enabled": true, + "index": 158, + "type": "Other", + "rect": { + "y": -1166, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 157, + "ref": "e159" + }, + { + "type": "TextView", + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "index": 159, + "depth": 38, + "parentIndex": 157, + "hittable": false, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "ref": "e160" + }, + { + "depth": 39, + "rect": { + "y": -1166, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "type": "TextView", + "parentIndex": 159, + "enabled": true, + "index": 160, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "ref": "e161" + }, + { + "value": "0%", + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 159, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "rect": { + "y": -1166, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "index": 161, + "ref": "e162" + }, + { + "enabled": true, + "rect": { + "y": -1205, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "type": "Other", + "depth": 40, + "hittable": false, + "parentIndex": 161, + "index": 162, + "ref": "e163" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": -1111, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "index": 163, + "hittable": false, + "parentIndex": 159, + "type": "Other", + "enabled": true, + "depth": 39, + "ref": "e164" + }, + { + "type": "Other", + "index": 164, + "enabled": true, + "parentIndex": 163, + "rect": { + "y": -1084, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "hittable": false, + "depth": 40, + "ref": "e165" + }, + { + "label": "•", + "rect": { + "y": -1074, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 165, + "parentIndex": 132, + "depth": 36, + "type": "StaticText", + "hittable": false, + "enabled": true, + "ref": "e166" + }, + { + "label": "•", + "type": "StaticText", + "index": 166, + "hittable": false, + "depth": 37, + "enabled": true, + "rect": { + "y": -1074, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "parentIndex": 165, + "ref": "e167" + }, + { + "index": 167, + "depth": 36, + "type": "Other", + "rect": { + "y": -1074, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "parentIndex": 132, + "enabled": true, + "ref": "e168" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "type": "Other", + "index": 168, + "depth": 37, + "rect": { + "y": -1074, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "parentIndex": 167, + "ref": "e169" + }, + { + "hittable": false, + "type": "Other", + "index": 169, + "enabled": true, + "rect": { + "y": -1074, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 168, + "depth": 38, + "ref": "e170" + }, + { + "parentIndex": 168, + "index": 170, + "depth": 38, + "enabled": true, + "type": "TextView", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "ref": "e171" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "hittable": false, + "enabled": true, + "index": 171, + "rect": { + "y": -1074, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 170, + "depth": 39, + "type": "TextView", + "ref": "e172" + }, + { + "parentIndex": 170, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "rect": { + "y": -1074, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "type": "Other", + "index": 172, + "depth": 39, + "enabled": true, + "hittable": false, + "ref": "e173" + }, + { + "hittable": false, + "parentIndex": 172, + "type": "Other", + "enabled": true, + "index": 173, + "rect": { + "y": -1113, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "ref": "e174" + }, + { + "type": "Other", + "parentIndex": 170, + "rect": { + "y": -1019, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "label": "Horizontal scroll bar, 1 page", + "index": 174, + "depth": 39, + "hittable": false, + "enabled": true, + "value": "0%", + "ref": "e175" + }, + { + "type": "Other", + "depth": 40, + "index": 175, + "hittable": false, + "rect": { + "y": -992, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 174, + "enabled": true, + "ref": "e176" + }, + { + "parentIndex": 132, + "enabled": true, + "type": "StaticText", + "index": 176, + "depth": 36, + "hittable": false, + "rect": { + "y": -982, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "ref": "e177" + }, + { + "label": "•", + "index": 177, + "hittable": false, + "depth": 37, + "type": "StaticText", + "rect": { + "y": -982, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "enabled": true, + "parentIndex": 176, + "ref": "e178" + }, + { + "depth": 36, + "hittable": false, + "rect": { + "y": -982, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "type": "Other", + "parentIndex": 132, + "enabled": true, + "index": 178, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e179" + }, + { + "type": "Other", + "parentIndex": 178, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "enabled": true, + "index": 179, + "rect": { + "y": -982, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "ref": "e180" + }, + { + "depth": 38, + "index": 180, + "hittable": false, + "parentIndex": 179, + "rect": { + "y": -982, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "enabled": true, + "type": "Other", + "ref": "e181" + }, + { + "parentIndex": 179, + "enabled": true, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "hittable": false, + "index": 181, + "depth": 38, + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e182" + }, + { + "depth": 39, + "enabled": true, + "index": 182, + "parentIndex": 181, + "hittable": false, + "type": "TextView", + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "rect": { + "y": -982, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "ref": "e183" + }, + { + "rect": { + "y": -982, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "type": "Other", + "enabled": true, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 181, + "hittable": false, + "index": 183, + "depth": 39, + "ref": "e184" + }, + { + "hittable": false, + "parentIndex": 183, + "type": "Other", + "depth": 40, + "rect": { + "y": -1021, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "enabled": true, + "index": 184, + "ref": "e185" + }, + { + "enabled": true, + "depth": 39, + "value": "0%", + "rect": { + "y": -949, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "parentIndex": 181, + "type": "Other", + "hittable": false, + "index": 185, + "label": "Horizontal scroll bar, 1 page", + "ref": "e186" + }, + { + "enabled": true, + "rect": { + "y": -922, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 185, + "hittable": false, + "type": "Other", + "depth": 40, + "index": 186, + "ref": "e187" + }, + { + "depth": 36, + "type": "Other", + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 132, + "rect": { + "y": -900, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "index": 187, + "ref": "e188" + }, + { + "hittable": false, + "depth": 37, + "parentIndex": 187, + "rect": { + "y": -900, + "width": 362, + "height": 88, + "x": 20 + }, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "index": 188, + "type": "Other", + "ref": "e189" + }, + { + "enabled": true, + "parentIndex": 188, + "hittable": false, + "type": "Other", + "rect": { + "y": -900, + "width": 362, + "height": 88, + "x": 20 + }, + "index": 189, + "depth": 38, + "ref": "e190" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "parentIndex": 188, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "index": 190, + "enabled": true, + "depth": 38, + "type": "TextView", + "ref": "e191" + }, + { + "enabled": true, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "hittable": false, + "index": 191, + "type": "TextView", + "rect": { + "y": -900, + "width": 362, + "height": 88, + "x": 20 + }, + "depth": 39, + "parentIndex": 190, + "ref": "e192" + }, + { + "index": 192, + "type": "Other", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": -900, + "width": 30, + "height": 88, + "x": 349 + }, + "value": "0%", + "parentIndex": 190, + "hittable": false, + "depth": 39, + "ref": "e193" + }, + { + "depth": 40, + "rect": { + "y": -939, + "width": 3, + "height": 36, + "x": 376 + }, + "enabled": true, + "hittable": false, + "index": 193, + "parentIndex": 192, + "type": "Other", + "ref": "e194" + }, + { + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "index": 194, + "rect": { + "y": -845, + "width": 362, + "height": 30, + "x": 20 + }, + "type": "Other", + "hittable": false, + "parentIndex": 190, + "depth": 39, + "ref": "e195" + }, + { + "depth": 40, + "parentIndex": 194, + "type": "Other", + "rect": { + "y": -818, + "width": 36, + "height": 3, + "x": -19 + }, + "index": 195, + "hittable": false, + "enabled": true, + "ref": "e196" + }, + { + "hittable": false, + "index": 196, + "enabled": true, + "rect": { + "y": -784, + "width": 378, + "height": 32, + "x": 12 + }, + "type": "Other", + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 73, + "depth": 35, + "ref": "e197" + }, + { + "enabled": true, + "identifier": "tool-call-badge", + "index": 197, + "parentIndex": 196, + "type": "Other", + "hittable": false, + "depth": 36, + "rect": { + "y": -784, + "width": 388, + "height": 32, + "x": 7 + }, + "ref": "e198" + }, + { + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "type": "Button", + "hittable": false, + "enabled": true, + "index": 198, + "depth": 36, + "parentIndex": 196, + "rect": { + "y": -784, + "width": 388, + "height": 32, + "x": 7 + }, + "ref": "e199" + }, + { + "label": "Edit", + "type": "Other", + "hittable": false, + "enabled": true, + "index": 199, + "depth": 37, + "parentIndex": 198, + "rect": { + "y": -777, + "width": 344, + "height": 18, + "x": 42 + }, + "ref": "e200" + }, + { + "index": 200, + "type": "StaticText", + "parentIndex": 199, + "hittable": false, + "enabled": true, + "label": "Edit", + "rect": { + "y": -777, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "depth": 38, + "ref": "e201" + }, + { + "hittable": false, + "index": 201, + "depth": 39, + "enabled": true, + "type": "StaticText", + "label": "Edit", + "parentIndex": 200, + "rect": { + "y": -777, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "ref": "e202" + }, + { + "rect": { + "y": -777, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "index": 202, + "enabled": true, + "type": "StaticText", + "hittable": false, + "depth": 38, + "parentIndex": 199, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "ref": "e203" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "parentIndex": 202, + "type": "StaticText", + "depth": 39, + "rect": { + "y": -777, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "index": 203, + "enabled": true, + "ref": "e204" + }, + { + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -752, + "width": 378, + "height": 36, + "x": 12 + }, + "enabled": true, + "type": "Other", + "index": 204, + "hittable": false, + "depth": 35, + "parentIndex": 73, + "ref": "e205" + }, + { + "enabled": true, + "depth": 36, + "type": "Other", + "identifier": "tool-call-badge", + "parentIndex": 204, + "hittable": false, + "index": 205, + "rect": { + "y": -752, + "width": 388, + "height": 32, + "x": 7 + }, + "ref": "e206" + }, + { + "enabled": true, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": -752, + "width": 388, + "height": 32, + "x": 7 + }, + "hittable": false, + "parentIndex": 204, + "index": 206, + "type": "Button", + "depth": 36, + "ref": "e207" + }, + { + "enabled": true, + "label": "Shell", + "rect": { + "y": -745, + "width": 344, + "height": 18, + "x": 42 + }, + "hittable": false, + "parentIndex": 206, + "index": 207, + "type": "Other", + "depth": 37, + "ref": "e208" + }, + { + "type": "StaticText", + "parentIndex": 207, + "depth": 38, + "enabled": true, + "rect": { + "y": -745, + "width": 33.666664123535156, + "height": 18, + "x": 42 + }, + "index": 208, + "label": "Shell", + "hittable": false, + "ref": "e209" + }, + { + "index": 209, + "parentIndex": 208, + "enabled": true, + "label": "Shell", + "hittable": false, + "rect": { + "y": -745, + "width": 33.666664123535156, + "height": 18, + "x": 42 + }, + "type": "StaticText", + "depth": 39, + "ref": "e210" + }, + { + "depth": 38, + "index": 210, + "enabled": true, + "rect": { + "y": -745, + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242 + }, + "label": "node scripts/simulate-stream-burst.mjs", + "parentIndex": 207, + "hittable": false, + "type": "StaticText", + "ref": "e211" + }, + { + "label": "node scripts/simulate-stream-burst.mjs", + "enabled": true, + "hittable": false, + "depth": 39, + "type": "StaticText", + "parentIndex": 210, + "index": 211, + "rect": { + "y": -745, + "width": 271.3333435058594, + "height": 18, + "x": 83.66666793823242 + }, + "ref": "e212" + }, + { + "hittable": false, + "index": 212, + "depth": 35, + "enabled": true, + "type": "Other", + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": -716, + "width": 378, + "height": 570, + "x": 12 + }, + "parentIndex": 73, + "ref": "e213" + }, + { + "index": 213, + "type": "Other", + "enabled": true, + "rect": { + "y": -716, + "width": 362, + "height": 566, + "x": 20 + }, + "identifier": "assistant-message", + "parentIndex": 212, + "hittable": false, + "depth": 36, + "ref": "e214" + }, + { + "index": 214, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "enabled": true, + "rect": { + "y": -704, + "width": 362, + "height": 242, + "x": 20 + }, + "type": "Other", + "depth": 36, + "parentIndex": 212, + "ref": "e215" + }, + { + "rect": { + "y": -704, + "width": 362, + "height": 242, + "x": 20 + }, + "parentIndex": 214, + "index": 215, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 37, + "ref": "e216" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "y": -704, + "width": 362, + "height": 242, + "x": 20 + }, + "depth": 38, + "parentIndex": 215, + "index": 216, + "ref": "e217" + }, + { + "enabled": true, + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "index": 217, + "type": "TextView", + "hittable": false, + "depth": 38, + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 215, + "ref": "e218" + }, + { + "hittable": false, + "type": "TextView", + "rect": { + "y": -704, + "width": 362, + "height": 242, + "x": 20 + }, + "index": 218, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 2", + "parentIndex": 217, + "depth": 39, + "enabled": true, + "ref": "e219" + }, + { + "rect": { + "y": -704, + "width": 30, + "height": 242, + "x": 349 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "index": 219, + "value": "0%", + "parentIndex": 217, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e220" + }, + { + "index": 220, + "rect": { + "y": -743, + "width": 3, + "height": 36, + "x": 376 + }, + "hittable": false, + "parentIndex": 219, + "type": "Other", + "enabled": true, + "depth": 40, + "ref": "e221" + }, + { + "parentIndex": 217, + "type": "Other", + "index": 221, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "depth": 39, + "rect": { + "y": -495, + "width": 362, + "height": 30, + "x": 20 + }, + "hittable": false, + "value": "0%", + "ref": "e222" + }, + { + "parentIndex": 221, + "rect": { + "y": -468, + "width": 36, + "height": 3, + "x": -19 + }, + "enabled": true, + "type": "Other", + "depth": 40, + "hittable": false, + "index": 222, + "ref": "e223" + }, + { + "hittable": false, + "rect": { + "y": -438, + "width": 362, + "height": 264, + "x": 20 + }, + "parentIndex": 212, + "type": "Other", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "index": 223, + "depth": 36, + "ref": "e224" + }, + { + "type": "Other", + "index": 224, + "depth": 37, + "hittable": false, + "rect": { + "y": -438, + "width": 362, + "height": 264, + "x": 20 + }, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "parentIndex": 223, + "enabled": true, + "ref": "e225" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": -438, + "width": 362, + "height": 264, + "x": 20 + }, + "parentIndex": 224, + "index": 225, + "depth": 38, + "ref": "e226" + }, + { + "type": "TextView", + "index": 226, + "depth": 38, + "enabled": true, + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 0, + "width": 0, + "height": 0, + "x": 0 + }, + "hittable": false, + "parentIndex": 224, + "ref": "e227" + }, + { + "parentIndex": 226, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "depth": 39, + "hittable": false, + "index": 227, + "type": "TextView", + "rect": { + "y": -438, + "width": 362, + "height": 264, + "x": 20 + }, + "enabled": true, + "ref": "e228" + }, + { + "rect": { + "y": -438, + "width": 30, + "height": 264, + "x": 349 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 39, + "enabled": true, + "type": "Other", + "value": "0%", + "index": 228, + "parentIndex": 226, + "hittable": false, + "ref": "e229" + }, + { + "hittable": false, + "depth": 40, + "index": 229, + "enabled": true, + "type": "Other", + "rect": { + "y": -477, + "width": 3, + "height": 36, + "x": 376 + }, + "parentIndex": 228, + "ref": "e230" + }, + { + "type": "Other", + "rect": { + "y": -207, + "width": 362, + "height": 30, + "x": 20 + }, + "parentIndex": 226, + "enabled": true, + "index": 230, + "hittable": false, + "value": "0%", + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "ref": "e231" + }, + { + "parentIndex": 230, + "enabled": true, + "index": 231, + "hittable": false, + "depth": 40, + "rect": { + "y": -180, + "width": 36, + "height": 3, + "x": -19 + }, + "type": "Other", + "ref": "e232" + }, + { + "hittable": false, + "depth": 35, + "label": "Thinking", + "enabled": true, + "rect": { + "y": -146, + "width": 378, + "height": 32, + "x": 12 + }, + "index": 232, + "parentIndex": 73, + "type": "Other", + "ref": "e233" + }, + { + "index": 233, + "enabled": true, + "depth": 36, + "type": "Other", + "rect": { + "y": -146, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 232, + "hittable": false, + "identifier": "tool-call-badge", + "ref": "e234" + }, + { + "rect": { + "y": -146, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 232, + "label": "Thinking", + "depth": 36, + "hittable": false, + "enabled": true, + "type": "Button", + "index": 234, + "ref": "e235" + }, + { + "rect": { + "y": -114, + "width": 378, + "height": 32, + "x": 12 + }, + "type": "Other", + "hittable": false, + "parentIndex": 73, + "index": 235, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "enabled": true, + "depth": 35, + "ref": "e236" + }, + { + "depth": 36, + "hittable": false, + "index": 236, + "enabled": true, + "identifier": "tool-call-badge", + "type": "Other", + "rect": { + "y": -114, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 235, + "ref": "e237" + }, + { + "label": "Read, packages/app/src/components/conversation-list.tsx", + "rect": { + "y": -114, + "width": 388, + "height": 32, + "x": 7 + }, + "hittable": false, + "type": "Button", + "enabled": true, + "index": 237, + "depth": 36, + "parentIndex": 235, + "ref": "e238" + }, + { + "label": "Read", + "depth": 37, + "type": "Other", + "hittable": false, + "rect": { + "y": -107, + "width": 344, + "height": 18, + "x": 42 + }, + "index": 238, + "enabled": true, + "parentIndex": 237, + "ref": "e239" + }, + { + "parentIndex": 238, + "type": "StaticText", + "depth": 38, + "enabled": true, + "label": "Read", + "hittable": false, + "rect": { + "y": -107, + "width": 35, + "height": 18, + "x": 42 + }, + "index": 239, + "ref": "e240" + }, + { + "depth": 39, + "index": 240, + "hittable": false, + "label": "Read", + "parentIndex": 239, + "type": "StaticText", + "enabled": true, + "rect": { + "y": -107, + "width": 35, + "height": 18, + "x": 42 + }, + "ref": "e241" + }, + { + "hittable": false, + "index": 241, + "rect": { + "y": -107, + "width": 301, + "height": 18, + "x": 85 + }, + "label": "packages/app/src/components/conversation-list.tsx", + "type": "StaticText", + "enabled": true, + "depth": 38, + "parentIndex": 238, + "ref": "e242" + }, + { + "depth": 39, + "rect": { + "y": -107, + "width": 301, + "height": 18, + "x": 85 + }, + "hittable": false, + "type": "StaticText", + "index": 242, + "parentIndex": 241, + "label": "packages/app/src/components/conversation-list.tsx", + "enabled": true, + "ref": "e243" + }, + { + "rect": { + "y": -82, + "width": 378, + "height": 36, + "x": 12 + }, + "parentIndex": 73, + "label": "Search, scrollToEnd", + "hittable": false, + "depth": 35, + "type": "Other", + "index": 243, + "enabled": true, + "ref": "e244" + }, + { + "identifier": "tool-call-badge", + "rect": { + "y": -82, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 244, + "enabled": true, + "depth": 36, + "type": "Other", + "parentIndex": 243, + "hittable": false, + "ref": "e245" + }, + { + "type": "Button", + "label": "Search, scrollToEnd", + "index": 245, + "depth": 36, + "parentIndex": 243, + "hittable": false, + "rect": { + "y": -82, + "width": 388, + "height": 32, + "x": 7 + }, + "enabled": true, + "ref": "e246" + }, + { + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -46, + "width": 378, + "height": 646, + "x": 12 + }, + "type": "Other", + "index": 246, + "depth": 35, + "hittable": false, + "parentIndex": 73, + "ref": "e247" + }, + { + "parentIndex": 246, + "depth": 36, + "type": "Other", + "identifier": "assistant-message", + "enabled": true, + "rect": { + "y": -46, + "width": 362, + "height": 642, + "x": 20 + }, + "index": 247, + "hittable": false, + "ref": "e248" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -34, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 36, + "parentIndex": 246, + "hittable": false, + "type": "Other", + "index": 248, + "enabled": true, + "ref": "e249" + }, + { + "index": 249, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "parentIndex": 248, + "depth": 37, + "rect": { + "y": -34, + "width": 362, + "height": 132, + "x": 20 + }, + "type": "Other", + "hittable": false, + "ref": "e250" + }, + { + "hittable": false, + "parentIndex": 249, + "index": 250, + "rect": { + "y": -34, + "width": 362, + "height": 132, + "x": 20 + }, + "type": "Other", + "enabled": true, + "depth": 38, + "ref": "e251" + }, + { + "depth": 38, + "hittable": false, + "parentIndex": 249, + "rect": { + "y": 0, + "width": 362, + "height": 98, + "x": 20 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 251, + "enabled": true, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "ref": "e252" + }, + { + "depth": 39, + "index": 252, + "enabled": true, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "rect": { + "y": -34, + "width": 362, + "height": 132, + "x": 20 + }, + "parentIndex": 251, + "hittable": false, + "type": "TextView", + "ref": "e253" + }, + { + "hittable": false, + "value": "0%", + "index": 253, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 251, + "type": "Other", + "enabled": true, + "rect": { + "y": -34, + "width": 30, + "height": 132, + "x": 349 + }, + "depth": 39, + "ref": "e254" + }, + { + "hittable": false, + "enabled": true, + "index": 254, + "rect": { + "y": -73, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "type": "Other", + "parentIndex": 253, + "ref": "e255" + }, + { + "rect": { + "y": 65, + "width": 362, + "height": 30, + "x": 20 + }, + "hittable": false, + "parentIndex": 251, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "value": "0%", + "depth": 39, + "index": 255, + "type": "Other", + "ref": "e256" + }, + { + "index": 256, + "enabled": true, + "rect": { + "y": 92, + "width": 36, + "height": 3, + "x": -19 + }, + "hittable": false, + "type": "Other", + "depth": 40, + "parentIndex": 255, + "ref": "e257" + }, + { + "rect": { + "y": 126, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "label": "•", + "index": 257, + "hittable": false, + "parentIndex": 246, + "enabled": true, + "type": "StaticText", + "depth": 36, + "ref": "e258" + }, + { + "hittable": false, + "enabled": true, + "index": 258, + "label": "•", + "type": "StaticText", + "depth": 37, + "parentIndex": 257, + "rect": { + "y": 126, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "ref": "e259" + }, + { + "rect": { + "y": 126, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "Other", + "parentIndex": 246, + "index": 259, + "enabled": true, + "hittable": false, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "depth": 36, + "ref": "e260" + }, + { + "enabled": true, + "depth": 37, + "index": 260, + "hittable": false, + "type": "Other", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "rect": { + "y": 126, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 259, + "ref": "e261" + }, + { + "enabled": true, + "type": "Other", + "depth": 38, + "hittable": false, + "index": 261, + "rect": { + "y": 126, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 260, + "ref": "e262" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "depth": 38, + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 262, + "rect": { + "y": 126, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "enabled": true, + "type": "TextView", + "parentIndex": 260, + "ref": "e263" + }, + { + "type": "TextView", + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "rect": { + "y": 126, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "index": 263, + "depth": 39, + "parentIndex": 262, + "enabled": true, + "ref": "e264" + }, + { + "type": "Other", + "value": "0%", + "index": 264, + "hittable": false, + "depth": 39, + "parentIndex": 262, + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 126, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "enabled": true, + "ref": "e265" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 264, + "depth": 40, + "enabled": true, + "rect": { + "y": 87, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "index": 265, + "ref": "e266" + }, + { + "index": 266, + "value": "0%", + "depth": 39, + "type": "Other", + "parentIndex": 262, + "rect": { + "y": 181, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "hittable": false, + "ref": "e267" + }, + { + "hittable": false, + "rect": { + "y": 208, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "type": "Other", + "index": 267, + "enabled": true, + "parentIndex": 266, + "depth": 40, + "ref": "e268" + }, + { + "rect": { + "y": 218, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "parentIndex": 246, + "type": "StaticText", + "depth": 36, + "hittable": false, + "label": "•", + "enabled": true, + "index": 268, + "ref": "e269" + }, + { + "enabled": true, + "parentIndex": 268, + "depth": 37, + "label": "•", + "hittable": false, + "index": 269, + "type": "StaticText", + "rect": { + "y": 218, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "ref": "e270" + }, + { + "type": "Other", + "enabled": true, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "rect": { + "y": 218, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 36, + "parentIndex": 246, + "hittable": false, + "index": 270, + "ref": "e271" + }, + { + "parentIndex": 270, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "type": "Other", + "depth": 37, + "rect": { + "y": 218, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "index": 271, + "ref": "e272" + }, + { + "rect": { + "y": 218, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "type": "Other", + "depth": 38, + "parentIndex": 271, + "hittable": false, + "enabled": true, + "index": 272, + "ref": "e273" + }, + { + "depth": 38, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "enabled": true, + "value": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "type": "TextView", + "index": 273, + "hittable": false, + "rect": { + "y": 218, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 271, + "ref": "e274" + }, + { + "type": "TextView", + "index": 274, + "rect": { + "y": 218, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "enabled": true, + "depth": 39, + "parentIndex": 273, + "label": "We rely on onContentSizeChange to detect new content, but that fires after layout, not as the streaming delta arrives, so we end up scrolling one frame late on fast streams.", + "hittable": false, + "ref": "e275" + }, + { + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "hittable": false, + "value": "0%", + "rect": { + "y": 218, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "enabled": true, + "index": 275, + "depth": 39, + "parentIndex": 273, + "ref": "e276" + }, + { + "index": 276, + "hittable": false, + "parentIndex": 275, + "depth": 40, + "enabled": true, + "rect": { + "y": 179, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "type": "Other", + "ref": "e277" + }, + { + "rect": { + "y": 273, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 39, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "enabled": true, + "index": 277, + "parentIndex": 273, + "type": "Other", + "ref": "e278" + }, + { + "depth": 40, + "enabled": true, + "type": "Other", + "index": 278, + "hittable": false, + "rect": { + "y": 300, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 277, + "ref": "e279" + }, + { + "parentIndex": 246, + "hittable": false, + "enabled": true, + "type": "StaticText", + "index": 279, + "rect": { + "y": 310, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "label": "•", + "ref": "e280" + }, + { + "rect": { + "y": 310, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 280, + "parentIndex": 279, + "depth": 37, + "hittable": false, + "label": "•", + "enabled": true, + "type": "StaticText", + "ref": "e281" + }, + { + "index": 281, + "depth": 36, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 246, + "rect": { + "y": 310, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e282" + }, + { + "hittable": false, + "index": 282, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "rect": { + "y": 310, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "enabled": true, + "parentIndex": 281, + "type": "Other", + "depth": 37, + "ref": "e283" + }, + { + "depth": 38, + "rect": { + "y": 310, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "enabled": true, + "type": "Other", + "parentIndex": 282, + "hittable": false, + "index": 283, + "ref": "e284" + }, + { + "type": "TextView", + "hittable": false, + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "value": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "depth": 38, + "rect": { + "y": 310, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "parentIndex": 282, + "enabled": true, + "index": 284, + "ref": "e285" + }, + { + "label": "The gesture handler does not pause scroll-to-bottom while the user is actively dragging, which means a drag in progress can be visually overridden mid-frame.", + "index": 285, + "hittable": false, + "parentIndex": 284, + "type": "TextView", + "depth": 39, + "enabled": true, + "rect": { + "y": 310, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e286" + }, + { + "rect": { + "y": 310, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "value": "0%", + "enabled": true, + "index": 286, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 39, + "parentIndex": 284, + "ref": "e287" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 286, + "type": "Other", + "depth": 40, + "rect": { + "y": 271, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "index": 287, + "ref": "e288" + }, + { + "value": "0%", + "type": "Other", + "index": 288, + "rect": { + "y": 365, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "parentIndex": 284, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "depth": 39, + "ref": "e289" + }, + { + "type": "Other", + "hittable": false, + "depth": 40, + "rect": { + "y": 392, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "index": 289, + "parentIndex": 288, + "enabled": true, + "ref": "e290" + }, + { + "hittable": false, + "enabled": true, + "type": "StaticText", + "label": "•", + "index": 290, + "rect": { + "y": 402, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "parentIndex": 246, + "depth": 36, + "ref": "e291" + }, + { + "hittable": false, + "enabled": true, + "index": 291, + "depth": 37, + "label": "•", + "type": "StaticText", + "rect": { + "y": 402, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "parentIndex": 290, + "ref": "e292" + }, + { + "type": "Other", + "index": 292, + "enabled": true, + "parentIndex": 246, + "rect": { + "y": 402, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "depth": 36, + "hittable": false, + "ref": "e293" + }, + { + "rect": { + "y": 402, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "enabled": true, + "type": "Other", + "index": 293, + "parentIndex": 292, + "depth": 37, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "hittable": false, + "ref": "e294" + }, + { + "index": 294, + "parentIndex": 293, + "type": "Other", + "depth": 38, + "rect": { + "y": 402, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "hittable": false, + "enabled": true, + "ref": "e295" + }, + { + "enabled": true, + "type": "TextView", + "rect": { + "y": 402, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "hittable": false, + "value": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "parentIndex": 293, + "index": 295, + "depth": 38, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "ref": "e296" + }, + { + "hittable": false, + "depth": 39, + "parentIndex": 295, + "rect": { + "y": 402, + "width": 340.6666564941406, + "height": 66, + "x": 41.33333396911621 + }, + "index": 296, + "label": "Coalescing happens upstream, so the FlatList sees fewer updates than the wire — but each batch can still cause a relayout.", + "type": "TextView", + "enabled": true, + "ref": "e297" + }, + { + "value": "0%", + "rect": { + "y": 402, + "width": 30, + "height": 66, + "x": 349.00000063578284 + }, + "depth": 39, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "index": 297, + "hittable": false, + "parentIndex": 295, + "enabled": true, + "ref": "e298" + }, + { + "type": "Other", + "index": 298, + "hittable": false, + "enabled": true, + "parentIndex": 297, + "depth": 40, + "rect": { + "y": 363, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "ref": "e299" + }, + { + "depth": 39, + "parentIndex": 295, + "index": 299, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "y": 435, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "value": "0%", + "ref": "e300" + }, + { + "parentIndex": 299, + "depth": 40, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 462, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "index": 300, + "ref": "e301" + }, + { + "rect": { + "y": 484, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "depth": 36, + "index": 301, + "parentIndex": 246, + "hittable": false, + "type": "Other", + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e302" + }, + { + "index": 302, + "depth": 37, + "enabled": true, + "hittable": false, + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "parentIndex": 301, + "type": "Other", + "rect": { + "y": 484, + "width": 362, + "height": 88, + "x": 20 + }, + "ref": "e303" + }, + { + "depth": 38, + "rect": { + "y": 484, + "width": 362, + "height": 88, + "x": 20 + }, + "parentIndex": 302, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 303, + "ref": "e304" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "enabled": true, + "rect": { + "y": 484, + "width": 362, + "height": 88, + "x": 20 + }, + "index": 304, + "depth": 38, + "type": "TextView", + "hittable": false, + "parentIndex": 302, + "value": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "ref": "e305" + }, + { + "label": "Let me make a small adjustment to the threshold and add a flag for active gestures, then run a quick command to confirm the order of events when streaming is fast.", + "rect": { + "y": 484, + "width": 362, + "height": 88, + "x": 20 + }, + "enabled": true, + "hittable": false, + "index": 305, + "type": "TextView", + "parentIndex": 304, + "depth": 39, + "ref": "e306" + }, + { + "parentIndex": 304, + "rect": { + "y": 484, + "width": 30, + "height": 88, + "x": 349 + }, + "depth": 39, + "index": 306, + "hittable": false, + "enabled": true, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "ref": "e307" + }, + { + "hittable": false, + "index": 307, + "parentIndex": 306, + "enabled": true, + "rect": { + "y": 445, + "width": 3, + "height": 36, + "x": 376 + }, + "type": "Other", + "depth": 40, + "ref": "e308" + }, + { + "depth": 39, + "enabled": true, + "hittable": false, + "index": 308, + "rect": { + "y": 539, + "width": 362, + "height": 30, + "x": 20 + }, + "parentIndex": 304, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "ref": "e309" + }, + { + "rect": { + "y": 566, + "width": 36, + "height": 3, + "x": -19 + }, + "hittable": false, + "index": 309, + "enabled": true, + "depth": 40, + "parentIndex": 308, + "type": "Other", + "ref": "e310" + }, + { + "index": 310, + "enabled": true, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "type": "Other", + "hittable": false, + "rect": { + "y": 600, + "width": 378, + "height": 32, + "x": 12 + }, + "parentIndex": 73, + "depth": 35, + "ref": "e311" + }, + { + "rect": { + "y": 600, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 311, + "identifier": "tool-call-badge", + "hittable": false, + "type": "Other", + "depth": 36, + "enabled": true, + "parentIndex": 310, + "ref": "e312" + }, + { + "depth": 36, + "index": 312, + "label": "Edit, packages/app/src/hooks/use-scroll-anchor.ts", + "hittable": false, + "rect": { + "y": 600, + "width": 388, + "height": 32, + "x": 7 + }, + "type": "Button", + "enabled": true, + "parentIndex": 310, + "ref": "e313" + }, + { + "enabled": true, + "type": "Other", + "label": "Edit", + "depth": 37, + "parentIndex": 312, + "rect": { + "y": 607, + "width": 344, + "height": 18, + "x": 42 + }, + "hittable": false, + "index": 313, + "ref": "e314" + }, + { + "index": 314, + "enabled": true, + "label": "Edit", + "hittable": false, + "parentIndex": 313, + "depth": 38, + "type": "StaticText", + "rect": { + "y": 607, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "ref": "e315" + }, + { + "label": "Edit", + "rect": { + "y": 607, + "width": 26.666664123535156, + "height": 18, + "x": 42 + }, + "parentIndex": 314, + "index": 315, + "hittable": false, + "type": "StaticText", + "depth": 39, + "enabled": true, + "ref": "e316" + }, + { + "hittable": false, + "rect": { + "y": 607, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "depth": 38, + "parentIndex": 313, + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "enabled": true, + "type": "StaticText", + "index": 316, + "ref": "e317" + }, + { + "label": "packages/app/src/hooks/use-scroll-anchor.ts", + "parentIndex": 316, + "index": 317, + "hittable": false, + "enabled": true, + "type": "StaticText", + "depth": 39, + "rect": { + "y": 607, + "width": 309.3333435058594, + "height": 18, + "x": 76.66666793823242 + }, + "ref": "e318" + }, + { + "depth": 35, + "enabled": true, + "hittable": false, + "parentIndex": 73, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "rect": { + "y": 632, + "width": 378, + "height": 36, + "x": 12 + }, + "type": "Other", + "index": 318, + "ref": "e319" + }, + { + "enabled": true, + "depth": 36, + "identifier": "tool-call-badge", + "index": 319, + "type": "Other", + "rect": { + "y": 632, + "width": 388, + "height": 32, + "x": 7 + }, + "hittable": false, + "parentIndex": 318, + "ref": "e320" + }, + { + "enabled": true, + "rect": { + "y": 632, + "width": 388, + "height": 32, + "x": 7 + }, + "index": 320, + "parentIndex": 318, + "depth": 36, + "hittable": false, + "label": "Shell, node scripts/simulate-stream-burst.mjs", + "type": "Button", + "ref": "e321" + }, + { + "type": "Other", + "enabled": true, + "index": 321, + "depth": 35, + "rect": { + "y": 668, + "width": 378, + "height": 570, + "x": 12 + }, + "parentIndex": 73, + "hittable": false, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "ref": "e322" + }, + { + "hittable": false, + "enabled": true, + "depth": 36, + "identifier": "assistant-message", + "rect": { + "y": 668, + "width": 362, + "height": 566, + "x": 20 + }, + "type": "Other", + "parentIndex": 321, + "index": 322, + "ref": "e323" + }, + { + "index": 323, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 680, + "width": 362, + "height": 242, + "x": 20 + }, + "hittable": false, + "enabled": true, + "parentIndex": 321, + "depth": 36, + "type": "Other", + "ref": "e324" + }, + { + "type": "Other", + "depth": 37, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "parentIndex": 323, + "index": 324, + "rect": { + "y": 680, + "width": 362, + "height": 242, + "x": 20 + }, + "hittable": false, + "enabled": true, + "ref": "e325" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 38, + "index": 325, + "rect": { + "y": 680, + "width": 362, + "height": 242, + "x": 20 + }, + "parentIndex": 324, + "ref": "e326" + }, + { + "depth": 38, + "index": 326, + "parentIndex": 324, + "type": "TextView", + "value": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "hittable": false, + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle", + "rect": { + "y": 680, + "width": 362, + "height": 242, + "x": 20 + }, + "ref": "e327" + }, + { + "enabled": true, + "label": "The change should keep scroll-to-bottom working when the user is at the bottom while not yanking the viewport when they are reading earlier messages. The bash output confirms the userIsAtBottom flag flips correctly during a simulated streaming burst, and the gesture flag suppresses scroll while a drag is active. If you want, I can follow up with a regression test that drives the FlatList with synthetic deltas at high frequency to lock in the behavior. For now, I'll stop here so you can take a look.## Cycle 3", + "rect": { + "y": 680, + "width": 362, + "height": 242, + "x": 20 + }, + "index": 327, + "depth": 39, + "parentIndex": 326, + "hittable": false, + "type": "TextView", + "ref": "e328" + }, + { + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "depth": 39, + "rect": { + "y": 680, + "width": 30, + "height": 242, + "x": 349 + }, + "index": 328, + "hittable": false, + "parentIndex": 326, + "value": "0%", + "enabled": true, + "ref": "e329" + }, + { + "type": "Other", + "index": 329, + "rect": { + "y": 641, + "width": 3, + "height": 36, + "x": 376 + }, + "depth": 40, + "hittable": false, + "parentIndex": 328, + "enabled": true, + "ref": "e330" + }, + { + "parentIndex": 326, + "rect": { + "y": 889, + "width": 362, + "height": 30, + "x": 20 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "type": "Other", + "index": 330, + "value": "0%", + "depth": 39, + "enabled": true, + "ref": "e331" + }, + { + "parentIndex": 330, + "hittable": false, + "rect": { + "y": 916, + "width": 36, + "height": 3, + "x": -19 + }, + "enabled": true, + "index": 331, + "type": "Other", + "depth": 40, + "ref": "e332" + }, + { + "hittable": false, + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "enabled": true, + "rect": { + "y": 946, + "width": 362, + "height": 264, + "x": 20 + }, + "type": "Other", + "depth": 36, + "index": 332, + "parentIndex": 321, + "ref": "e333" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "hittable": false, + "rect": { + "y": 946, + "width": 362, + "height": 264, + "x": 20 + }, + "parentIndex": 332, + "type": "Other", + "index": 333, + "depth": 37, + "enabled": true, + "ref": "e334" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "y": 946, + "width": 362, + "height": 264, + "x": 20 + }, + "parentIndex": 333, + "index": 334, + "depth": 38, + "ref": "e335" + }, + { + "value": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so", + "rect": { + "y": 946, + "width": 362, + "height": 264, + "x": 20 + }, + "enabled": true, + "index": 335, + "depth": 38, + "type": "TextView", + "parentIndex": 333, + "hittable": false, + "ref": "e336" + }, + { + "label": "I'll take a look at the scroll anchor behavior you described. Let me start by walking through how the conversation list currently handles streaming updates and where the auto-scroll logic actually lives. My instinct is that the anchor is supposed to pin to the bottom only when the user is already there, but I want to confirm that against the code rather than guess. This kind of behavior is usually a thin layout effect over a ref, and the bugs tend to come from event ordering rather than the math itself, so the first useful step is to read the relevant files.", + "type": "TextView", + "index": 336, + "hittable": false, + "parentIndex": 335, + "enabled": true, + "rect": { + "y": 946, + "width": 362, + "height": 264, + "x": 20 + }, + "depth": 39, + "ref": "e337" + }, + { + "enabled": true, + "parentIndex": 335, + "type": "Other", + "index": 337, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "hittable": false, + "rect": { + "y": 946, + "width": 30, + "height": 264, + "x": 349 + }, + "depth": 39, + "ref": "e338" + }, + { + "enabled": true, + "index": 338, + "depth": 40, + "parentIndex": 337, + "hittable": false, + "type": "Other", + "rect": { + "y": 907, + "width": 3, + "height": 36, + "x": 376 + }, + "ref": "e339" + }, + { + "rect": { + "y": 1177, + "width": 362, + "height": 30, + "x": 20 + }, + "hittable": false, + "type": "Other", + "value": "0%", + "enabled": true, + "index": 339, + "label": "Horizontal scroll bar, 1 page", + "depth": 39, + "parentIndex": 335, + "ref": "e340" + }, + { + "parentIndex": 339, + "index": 340, + "type": "Other", + "rect": { + "y": 1204, + "width": 36, + "height": 3, + "x": -19 + }, + "hittable": false, + "enabled": true, + "depth": 40, + "ref": "e341" + }, + { + "rect": { + "y": 1238, + "width": 378, + "height": 32, + "x": 12 + }, + "index": 341, + "depth": 35, + "type": "Other", + "parentIndex": 73, + "enabled": true, + "label": "Thinking", + "hittable": false, + "ref": "e342" + }, + { + "enabled": true, + "index": 342, + "depth": 36, + "parentIndex": 341, + "hittable": false, + "type": "Other", + "rect": { + "y": 1238, + "width": 388, + "height": 32, + "x": 7 + }, + "identifier": "tool-call-badge", + "ref": "e343" + }, + { + "parentIndex": 341, + "type": "Button", + "rect": { + "y": 1238, + "width": 388, + "height": 32, + "x": 7 + }, + "hittable": false, + "index": 343, + "label": "Thinking", + "depth": 36, + "enabled": true, + "ref": "e344" + }, + { + "label": "Thinking", + "parentIndex": 343, + "hittable": false, + "rect": { + "y": 1245, + "width": 344, + "height": 18, + "x": 42 + }, + "depth": 37, + "type": "Other", + "enabled": true, + "index": 344, + "ref": "e345" + }, + { + "hittable": false, + "index": 345, + "enabled": true, + "type": "StaticText", + "depth": 38, + "rect": { + "y": 1245, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "parentIndex": 344, + "label": "Thinking", + "ref": "e346" + }, + { + "index": 346, + "parentIndex": 345, + "rect": { + "y": 1245, + "width": 58.666664123535156, + "height": 18, + "x": 42 + }, + "type": "StaticText", + "label": "Thinking", + "depth": 39, + "hittable": false, + "enabled": true, + "ref": "e347" + }, + { + "depth": 35, + "index": 347, + "rect": { + "y": 1270, + "width": 378, + "height": 32, + "x": 12 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "ref": "e348" + }, + { + "rect": { + "y": 1270, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 347, + "index": 348, + "enabled": true, + "hittable": false, + "identifier": "tool-call-badge", + "depth": 36, + "type": "Other", + "ref": "e349" + }, + { + "rect": { + "y": 1270, + "width": 388, + "height": 32, + "x": 7 + }, + "type": "Button", + "enabled": true, + "depth": 36, + "parentIndex": 347, + "index": 349, + "label": "Read, packages/app/src/components/conversation-list.tsx", + "hittable": false, + "ref": "e350" + }, + { + "type": "Other", + "rect": { + "y": 1277, + "width": 344, + "height": 18, + "x": 42 + }, + "parentIndex": 349, + "enabled": true, + "hittable": false, + "index": 350, + "depth": 37, + "label": "Read", + "ref": "e351" + }, + { + "depth": 38, + "parentIndex": 350, + "enabled": true, + "index": 351, + "label": "Read", + "rect": { + "y": 1277, + "width": 35, + "height": 18, + "x": 42 + }, + "hittable": false, + "type": "StaticText", + "ref": "e352" + }, + { + "type": "StaticText", + "label": "Read", + "enabled": true, + "hittable": false, + "rect": { + "y": 1277, + "width": 35, + "height": 18, + "x": 42 + }, + "depth": 39, + "index": 352, + "parentIndex": 351, + "ref": "e353" + }, + { + "hittable": false, + "enabled": true, + "label": "packages/app/src/components/conversation-list.tsx", + "type": "StaticText", + "index": 353, + "parentIndex": 350, + "rect": { + "y": 1277, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 38, + "ref": "e354" + }, + { + "type": "StaticText", + "enabled": true, + "rect": { + "y": 1277, + "width": 301, + "height": 18, + "x": 85 + }, + "depth": 39, + "hittable": false, + "index": 354, + "parentIndex": 353, + "label": "packages/app/src/components/conversation-list.tsx", + "ref": "e355" + }, + { + "type": "Other", + "enabled": true, + "label": "Search, scrollToEnd", + "depth": 35, + "index": 355, + "rect": { + "y": 1302, + "width": 378, + "height": 36, + "x": 12 + }, + "parentIndex": 73, + "hittable": false, + "ref": "e356" + }, + { + "enabled": true, + "depth": 36, + "identifier": "tool-call-badge", + "rect": { + "y": 1302, + "width": 388, + "height": 32, + "x": 7 + }, + "parentIndex": 355, + "index": 356, + "hittable": false, + "type": "Other", + "ref": "e357" + }, + { + "type": "Button", + "enabled": true, + "parentIndex": 355, + "hittable": false, + "index": 357, + "depth": 36, + "rect": { + "y": 1302, + "width": 388, + "height": 32, + "x": 7 + }, + "label": "Search, scrollToEnd", + "ref": "e358" + }, + { + "parentIndex": 73, + "index": 358, + "rect": { + "y": 1338, + "width": 378, + "height": 336, + "x": 12 + }, + "depth": 35, + "hittable": false, + "type": "Other", + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "enabled": true, + "ref": "e359" + }, + { + "type": "Other", + "index": 359, + "parentIndex": 358, + "enabled": true, + "identifier": "assistant-message", + "hittable": false, + "rect": { + "y": 1338, + "width": 362, + "height": 336, + "x": 20 + }, + "depth": 36, + "ref": "e360" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "parentIndex": 358, + "hittable": false, + "rect": { + "y": 1350, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 36, + "index": 360, + "type": "Other", + "enabled": true, + "ref": "e361" + }, + { + "rect": { + "y": 1350, + "width": 362, + "height": 132, + "x": 20 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 361, + "depth": 37, + "parentIndex": 360, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "ref": "e362" + }, + { + "depth": 38, + "index": 362, + "rect": { + "y": 1350, + "width": 362, + "height": 132, + "x": 20 + }, + "parentIndex": 361, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e363" + }, + { + "depth": 38, + "parentIndex": 361, + "enabled": true, + "value": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "type": "TextView", + "index": 363, + "rect": { + "y": 1350, + "width": 362, + "height": 132, + "x": 20 + }, + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "hittable": false, + "ref": "e364" + }, + { + "label": "Now I have a clearer picture. The auto-scroll uses a ref on the FlatList and tracks whether the user has scrolled away from the bottom by comparing the offset against the content size. There are a few subtle issues worth flagging before we change anything:", + "index": 364, + "hittable": false, + "rect": { + "y": 1350, + "width": 362, + "height": 132, + "x": 20 + }, + "depth": 39, + "enabled": true, + "type": "TextView", + "parentIndex": 363, + "ref": "e365" + }, + { + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "value": "0%", + "rect": { + "y": 1350, + "width": 30, + "height": 132, + "x": 349 + }, + "index": 365, + "parentIndex": 363, + "depth": 39, + "type": "Other", + "ref": "e366" + }, + { + "hittable": false, + "index": 366, + "parentIndex": 365, + "enabled": true, + "depth": 40, + "rect": { + "y": 1311, + "width": 3, + "height": 36, + "x": 376 + }, + "type": "Other", + "ref": "e367" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": 1449, + "width": 362, + "height": 30, + "x": 20 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "depth": 39, + "parentIndex": 363, + "index": 367, + "ref": "e368" + }, + { + "hittable": false, + "index": 368, + "type": "Other", + "depth": 40, + "parentIndex": 367, + "enabled": true, + "rect": { + "y": 1476, + "width": 36, + "height": 3, + "x": -19 + }, + "ref": "e369" + }, + { + "hittable": false, + "rect": { + "y": 1510, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "depth": 36, + "label": "•", + "enabled": true, + "index": 369, + "parentIndex": 358, + "type": "StaticText", + "ref": "e370" + }, + { + "type": "StaticText", + "hittable": false, + "rect": { + "y": 1510, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 370, + "enabled": true, + "depth": 37, + "label": "•", + "parentIndex": 369, + "ref": "e371" + }, + { + "depth": 36, + "type": "Other", + "parentIndex": 358, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "hittable": false, + "enabled": true, + "rect": { + "y": 1510, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "index": 371, + "ref": "e372" + }, + { + "parentIndex": 371, + "hittable": false, + "depth": 37, + "type": "Other", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 372, + "rect": { + "y": 1510, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "ref": "e373" + }, + { + "parentIndex": 372, + "hittable": false, + "enabled": true, + "rect": { + "y": 1510, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 38, + "index": 373, + "type": "Other", + "ref": "e374" + }, + { + "depth": 38, + "parentIndex": 372, + "type": "TextView", + "enabled": true, + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "value": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 374, + "rect": { + "y": 1510, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "hittable": false, + "ref": "e375" + }, + { + "label": "The threshold for 'near the bottom' is hardcoded at 80px, which feels too tight on dense content where headers and tool calls take up a lot of vertical space.", + "index": 375, + "parentIndex": 374, + "enabled": true, + "hittable": false, + "type": "TextView", + "rect": { + "y": 1510, + "width": 340.6666564941406, + "height": 88, + "x": 41.33333396911621 + }, + "depth": 39, + "ref": "e376" + }, + { + "label": "Vertical scroll bar, 1 page", + "rect": { + "y": 1510, + "width": 30, + "height": 88, + "x": 349.00000063578284 + }, + "enabled": true, + "value": "0%", + "index": 376, + "hittable": false, + "type": "Other", + "parentIndex": 374, + "depth": 39, + "ref": "e377" + }, + { + "rect": { + "y": 1471, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "depth": 40, + "hittable": false, + "index": 377, + "enabled": true, + "type": "Other", + "parentIndex": 376, + "ref": "e378" + }, + { + "value": "0%", + "type": "Other", + "rect": { + "y": 1565, + "width": 340.6666564941406, + "height": 30, + "x": 41.33333396911621 + }, + "depth": 39, + "parentIndex": 374, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "index": 378, + "enabled": true, + "ref": "e379" + }, + { + "type": "Other", + "rect": { + "y": 1592, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "parentIndex": 378, + "enabled": true, + "depth": 40, + "hittable": false, + "index": 379, + "ref": "e380" + }, + { + "hittable": false, + "label": "•", + "parentIndex": 358, + "enabled": true, + "rect": { + "y": 1602, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "index": 380, + "type": "StaticText", + "depth": 36, + "ref": "e381" + }, + { + "label": "•", + "hittable": false, + "rect": { + "y": 1602, + "width": 7.333332061767578, + "height": 22, + "x": 30 + }, + "parentIndex": 380, + "index": 381, + "depth": 37, + "enabled": true, + "type": "StaticText", + "ref": "e382" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 358, + "rect": { + "y": 1602, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "index": 382, + "depth": 36, + "label": "We rely on onContentSizeChange to dete", + "hittable": false, + "ref": "e383" + }, + { + "enabled": true, + "rect": { + "y": 1602, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "parentIndex": 382, + "label": "We rely on onContentSizeChange to dete", + "depth": 37, + "hittable": false, + "type": "Other", + "index": 383, + "ref": "e384" + }, + { + "rect": { + "y": 1602, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "hittable": false, + "depth": 38, + "type": "Other", + "index": 384, + "enabled": true, + "parentIndex": 383, + "ref": "e385" + }, + { + "hittable": false, + "parentIndex": 383, + "value": "We rely on onContentSizeChange to dete", + "rect": { + "y": 1602, + "width": 340.6666564941406, + "height": 22, + "x": 41.33333396911621 + }, + "depth": 38, + "label": "We rely on onContentSizeChange to dete", + "enabled": true, + "type": "TextView", + "index": 385, + "ref": "e386" + }, + { + "depth": 39, + "rect": { + "y": 1602, + "width": 278.07421875, + "height": 22, + "x": 41.33333396911621 + }, + "parentIndex": 385, + "label": "We rely on onContentSizeChange to dete", + "hittable": false, + "type": "TextView", + "enabled": true, + "index": 386, + "ref": "e387" + }, + { + "rect": { + "y": 1602, + "width": 30, + "height": 22, + "x": 349.00000063578284 + }, + "index": 387, + "hittable": false, + "depth": 39, + "parentIndex": 385, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "value": "0%", + "type": "Other", + "ref": "e388" + }, + { + "hittable": false, + "index": 388, + "enabled": true, + "rect": { + "y": 1563, + "width": 3, + "height": 36, + "x": 376.00000063578284 + }, + "type": "Other", + "depth": 40, + "parentIndex": 387, + "ref": "e389" + }, + { + "enabled": true, + "depth": 39, + "type": "Other", + "parentIndex": 385, + "value": "0%", + "index": 389, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 1610, + "width": 340.6666564941406, + "height": 11, + "x": 41.33333396911621 + }, + "hittable": false, + "ref": "e390" + }, + { + "rect": { + "y": 1618, + "width": 36, + "height": 3, + "x": 2.333333969116211 + }, + "hittable": false, + "type": "Other", + "index": 390, + "depth": 40, + "parentIndex": 389, + "enabled": true, + "ref": "e391" + }, + { + "depth": 36, + "type": "Other", + "parentIndex": 358, + "hittable": false, + "index": 391, + "rect": { + "y": 1640, + "width": 362, + "height": 22, + "x": 20 + }, + "label": "(end of synthetic stream)", + "enabled": true, + "ref": "e392" + }, + { + "rect": { + "y": 1640, + "width": 362, + "height": 22, + "x": 20 + }, + "index": 392, + "hittable": false, + "type": "Other", + "label": "(end of synthetic stream)", + "parentIndex": 391, + "depth": 37, + "enabled": true, + "ref": "e393" + }, + { + "type": "Other", + "depth": 38, + "hittable": false, + "index": 393, + "enabled": true, + "parentIndex": 392, + "rect": { + "y": 1640, + "width": 362, + "height": 22, + "x": 20 + }, + "ref": "e394" + }, + { + "hittable": false, + "depth": 38, + "rect": { + "y": 1640, + "width": 362, + "height": 22, + "x": 20 + }, + "label": "(end of synthetic stream)", + "index": 394, + "enabled": true, + "parentIndex": 392, + "type": "TextView", + "value": "(end of synthetic stream)", + "ref": "e395" + }, + { + "index": 395, + "label": "(end of synthetic stream)", + "enabled": true, + "type": "TextView", + "depth": 39, + "hittable": false, + "parentIndex": 394, + "rect": { + "y": 1640, + "width": 183.234375, + "height": 22, + "x": 20 + }, + "ref": "e396" + }, + { + "depth": 39, + "rect": { + "y": 1640, + "width": 30, + "height": 22, + "x": 349 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "index": 396, + "parentIndex": 394, + "type": "Other", + "ref": "e397" + }, + { + "hittable": false, + "index": 397, + "parentIndex": 396, + "depth": 40, + "enabled": true, + "type": "Other", + "rect": { + "y": 1601, + "width": 3, + "height": 36, + "x": 376 + }, + "ref": "e398" + }, + { + "depth": 39, + "index": 398, + "enabled": true, + "value": "0%", + "rect": { + "y": 1648, + "width": 362, + "height": 11, + "x": 20 + }, + "hittable": false, + "parentIndex": 394, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "ref": "e399" + }, + { + "parentIndex": 398, + "rect": { + "y": 1656, + "width": 36, + "height": 3, + "x": -19 + }, + "depth": 40, + "index": 399, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e400" + }, + { + "parentIndex": 73, + "rect": { + "y": 1674, + "width": 378, + "height": 67, + "x": 12 + }, + "enabled": true, + "label": "Copy turn", + "hittable": false, + "index": 400, + "type": "Other", + "depth": 35, + "ref": "e401" + }, + { + "rect": { + "y": 1687, + "width": 22, + "height": 22, + "x": 16 + }, + "depth": 36, + "enabled": true, + "type": "Button", + "index": 401, + "parentIndex": 400, + "label": "Copy turn", + "hittable": false, + "ref": "e402" + }, + { + "rect": { + "y": 1687, + "width": 22, + "height": 22, + "x": 46 + }, + "label": "Fork chat from here", + "hittable": false, + "index": 402, + "parentIndex": 400, + "type": "Other", + "depth": 36, + "enabled": true, + "ref": "e403" + }, + { + "identifier": "assistant-fork-menu-trigger", + "depth": 37, + "label": "Fork chat from here", + "type": "Button", + "rect": { + "y": 1687, + "width": 22, + "height": 22, + "x": 46 + }, + "hittable": false, + "parentIndex": 402, + "index": 403, + "enabled": true, + "ref": "e404" + }, + { + "index": 404, + "depth": 36, + "rect": { + "y": 1690.3333332538605, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "hittable": false, + "parentIndex": 400, + "label": "Worked for 10s, ended 8:53 PM", + "type": "Button", + "enabled": true, + "ref": "e405" + }, + { + "enabled": true, + "parentIndex": 404, + "index": 405, + "label": "Worked for 10s", + "type": "StaticText", + "rect": { + "y": 1690.3333332538605, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "hittable": false, + "depth": 37, + "ref": "e406" + }, + { + "type": "StaticText", + "label": "Worked for 10s", + "hittable": false, + "index": 406, + "parentIndex": 405, + "rect": { + "y": 1690.3333332538605, + "width": 91.33332824707031, + "height": 15.666671752929688, + "x": 76 + }, + "depth": 38, + "enabled": true, + "ref": "e407" + }, + { + "index": 407, + "value": "0%", + "rect": { + "y": 164, + "width": 402, + "height": 30, + "x": 0 + }, + "depth": 33, + "parentIndex": 71, + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "ref": "e408" + }, + { + "index": 408, + "hittable": false, + "enabled": true, + "rect": { + "y": 164, + "width": 396, + "height": 3, + "x": 3 + }, + "parentIndex": 407, + "type": "Other", + "depth": 34, + "ref": "e409" + }, + { + "label": "Vertical scroll bar, 11 pages", + "parentIndex": 71, + "value": "18%", + "type": "Other", + "depth": 33, + "rect": { + "y": 161, + "width": 30, + "height": 575, + "x": 369 + }, + "index": 409, + "enabled": true, + "hittable": false, + "ref": "e410" + }, + { + "parentIndex": 409, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "y": 212, + "width": 3, + "height": 7, + "x": 396 + }, + "depth": 34, + "index": 410, + "ref": "e411" + }, + { + "index": 411, + "hittable": false, + "rect": { + "y": 161, + "width": 30, + "height": 575, + "x": 369 + }, + "enabled": true, + "value": "18%", + "type": "Other", + "parentIndex": 71, + "label": "Vertical scroll bar, 11 pages", + "depth": 33, + "ref": "e412" + }, + { + "depth": 34, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 411, + "index": 412, + "rect": { + "y": 212, + "width": 3, + "height": 7, + "x": 396 + }, + "ref": "e413" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 164, + "width": 402, + "height": 30, + "x": 0 + }, + "value": "0%", + "type": "Other", + "depth": 33, + "parentIndex": 71, + "label": "Horizontal scroll bar, 1 page", + "index": 413, + "ref": "e414" + }, + { + "depth": 34, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 414, + "rect": { + "y": 164, + "width": 396, + "height": 3, + "x": 3 + }, + "parentIndex": 413, + "ref": "e415" + }, + { + "index": 415, + "hittable": false, + "rect": { + "y": 672, + "width": 48, + "height": 48, + "x": 177 + }, + "enabled": true, + "label": "Scroll to bottom", + "parentIndex": 68, + "type": "Other", + "depth": 31, + "ref": "e416" + }, + { + "identifier": "scroll-to-bottom-button", + "index": 416, + "hittable": false, + "enabled": true, + "parentIndex": 415, + "label": "Scroll to bottom", + "type": "Button", + "depth": 32, + "rect": { + "y": 672, + "width": 48, + "height": 48, + "x": 177 + }, + "ref": "e417" + }, + { + "hittable": false, + "parentIndex": 65, + "rect": { + "y": 736, + "width": 402, + "height": 138, + "x": 0 + }, + "depth": 29, + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "identifier": "composer-viewport-content", + "type": "Other", + "index": 417, + "ref": "e418" + }, + { + "index": 418, + "identifier": "message-input-root", + "rect": { + "y": 736, + "width": 370, + "height": 88, + "x": 16 + }, + "parentIndex": 417, + "enabled": true, + "depth": 30, + "hittable": false, + "type": "Other", + "ref": "e419" + }, + { + "parentIndex": 417, + "hittable": false, + "type": "Other", + "depth": 30, + "rect": { + "y": 736, + "width": 370, + "height": 88, + "x": 16 + }, + "enabled": true, + "index": 419, + "ref": "e420" + }, + { + "index": 420, + "depth": 30, + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "rect": { + "y": 745, + "width": 344, + "height": 30, + "x": 29 + }, + "enabled": true, + "hittable": false, + "parentIndex": 417, + "ref": "e421" + }, + { + "label": "Message agent... Message, @files, /commands", + "index": 421, + "hittable": false, + "enabled": true, + "rect": { + "y": 745, + "width": 344, + "height": 30, + "x": 29 + }, + "parentIndex": 420, + "type": "TextView", + "depth": 31, + "ref": "e422" + }, + { + "rect": { + "y": 745, + "width": 30, + "height": 30, + "x": 340 + }, + "value": "0%", + "depth": 32, + "type": "Other", + "enabled": true, + "parentIndex": 421, + "label": "Vertical scroll bar, 1 page", + "index": 422, + "hittable": false, + "ref": "e423" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "index": 423, + "depth": 33, + "rect": { + "y": 766.3332926432291, + "width": 3, + "height": 38.00002034505212, + "x": 367 + }, + "parentIndex": 422, + "ref": "e424" + }, + { + "index": 424, + "hittable": false, + "parentIndex": 421, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 757, + "width": 344, + "height": 15, + "x": 29 + }, + "depth": 32, + "enabled": true, + "type": "Other", + "value": "0%", + "ref": "e425" + }, + { + "enabled": true, + "depth": 33, + "hittable": false, + "parentIndex": 424, + "rect": { + "y": 769, + "width": 338, + "height": 3, + "x": 32 + }, + "index": 425, + "type": "Other", + "ref": "e426" + }, + { + "hittable": false, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 23 + }, + "parentIndex": 417, + "enabled": true, + "depth": 30, + "label": "Add attachment", + "identifier": "message-input-attach-button", + "type": "Button", + "index": 426, + "ref": "e427" + }, + { + "parentIndex": 426, + "depth": 31, + "hittable": false, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 23 + }, + "index": 427, + "type": "Other", + "enabled": true, + "ref": "e428" + }, + { + "type": "Other", + "index": 428, + "parentIndex": 427, + "depth": 32, + "rect": { + "y": 791, + "width": 20, + "height": 20, + "x": 27 + }, + "hittable": false, + "enabled": true, + "ref": "e429" + }, + { + "index": 429, + "type": "Other", + "depth": 33, + "parentIndex": 428, + "rect": { + "y": 794.3333333333334, + "width": 13.333333333333332, + "height": 13.333333333333258, + "x": 30.333333333333332 + }, + "hittable": false, + "enabled": true, + "ref": "e430" + }, + { + "depth": 34, + "enabled": true, + "index": 430, + "parentIndex": 429, + "hittable": false, + "type": "Other", + "rect": { + "y": 800.1666666666666, + "width": 13.333333333333332, + "height": 1.6666666666666288, + "x": 30.333333333333332 + }, + "ref": "e431" + }, + { + "enabled": true, + "index": 431, + "hittable": false, + "rect": { + "y": 794.3333333333334, + "width": 1.6666666666666643, + "height": 13.333333333333371, + "x": 36.16666666666667 + }, + "depth": 34, + "parentIndex": 429, + "type": "Other", + "ref": "e432" + }, + { + "rect": { + "y": 787, + "width": 232, + "height": 28, + "x": 51 + }, + "hittable": false, + "depth": 30, + "enabled": true, + "type": "Other", + "index": 432, + "label": "Select model (Ten second stream)", + "parentIndex": 417, + "ref": "e433" + }, + { + "index": 433, + "depth": 31, + "parentIndex": 432, + "hittable": false, + "type": "Button", + "label": "Select model (Ten second stream)", + "identifier": "combined-model-selector", + "enabled": true, + "rect": { + "y": 787, + "width": 202, + "height": 28, + "x": 51 + }, + "ref": "e434" + }, + { + "enabled": true, + "index": 434, + "depth": 32, + "hittable": false, + "rect": { + "y": 791, + "width": 20, + "height": 20, + "x": 59 + }, + "parentIndex": 433, + "type": "Other", + "ref": "e435" + }, + { + "enabled": true, + "index": 435, + "rect": { + "y": 791, + "width": 20, + "height": 20, + "x": 59 + }, + "type": "Other", + "hittable": false, + "parentIndex": 434, + "depth": 33, + "ref": "e436" + }, + { + "index": 436, + "type": "Other", + "depth": 34, + "parentIndex": 435, + "hittable": false, + "enabled": true, + "rect": { + "y": 793.5, + "width": 18.33333333333332, + "height": 15, + "x": 59.833333333333336 + }, + "ref": "e437" + }, + { + "enabled": true, + "hittable": false, + "depth": 35, + "parentIndex": 436, + "type": "Other", + "rect": { + "y": 796.8333333333334, + "width": 15, + "height": 11.666666666666629, + "x": 61.5 + }, + "index": 437, + "ref": "e438" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 35, + "parentIndex": 436, + "rect": { + "y": 793.5, + "width": 5, + "height": 5, + "x": 64.83333333333333 + }, + "index": 438, + "ref": "e439" + }, + { + "parentIndex": 436, + "index": 439, + "enabled": true, + "hittable": false, + "rect": { + "y": 801.8333333333334, + "width": 3.3333333333333357, + "height": 1.6666666666666288, + "x": 59.83333333333333 + }, + "type": "Other", + "depth": 35, + "ref": "e440" + }, + { + "enabled": true, + "index": 440, + "rect": { + "y": 801, + "width": 1.6666666666666714, + "height": 3.3333333333333712, + "x": 65.66666666666666 + }, + "depth": 35, + "type": "Other", + "parentIndex": 436, + "hittable": false, + "ref": "e441" + }, + { + "type": "Other", + "depth": 35, + "parentIndex": 436, + "rect": { + "y": 801, + "width": 1.6666666666666714, + "height": 3.3333333333333712, + "x": 70.66666666666667 + }, + "hittable": false, + "index": 441, + "enabled": true, + "ref": "e442" + }, + { + "hittable": false, + "rect": { + "y": 801.8333333333334, + "width": 3.3333333333333286, + "height": 1.6666666666666288, + "x": 74.83333333333334 + }, + "depth": 35, + "index": 442, + "parentIndex": 436, + "enabled": true, + "type": "Other", + "ref": "e443" + }, + { + "type": "StaticText", + "rect": { + "y": 792, + "width": 130.3333282470703, + "height": 18, + "x": 83 + }, + "label": "Ten second stream", + "hittable": false, + "enabled": true, + "index": 443, + "depth": 32, + "parentIndex": 433, + "ref": "e444" + }, + { + "label": "Ten second stream", + "hittable": false, + "type": "StaticText", + "parentIndex": 443, + "enabled": true, + "index": 444, + "depth": 33, + "rect": { + "y": 792, + "width": 130.3333282470703, + "height": 18, + "x": 83 + }, + "ref": "e445" + }, + { + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 283 + }, + "label": "Context window 2% used", + "identifier": "context-window-meter", + "hittable": false, + "type": "Image", + "enabled": true, + "index": 445, + "parentIndex": 417, + "depth": 30, + "ref": "e446" + }, + { + "hittable": false, + "enabled": true, + "index": 446, + "parentIndex": 417, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 315 + }, + "type": "Button", + "label": "Start dictation", + "depth": 30, + "ref": "e447" + }, + { + "index": 447, + "parentIndex": 417, + "label": "Enable Voice mode", + "depth": 30, + "type": "Button", + "enabled": true, + "hittable": false, + "rect": { + "y": 787, + "width": 28, + "height": 28, + "x": 351 + }, + "ref": "e448" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 11, + "index": 448, + "parentIndex": 12, + "enabled": true, + "ref": "e449" + }, + { + "index": 449, + "parentIndex": 6, + "depth": 7, + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "ref": "e450" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "depth": 8, + "parentIndex": 449, + "index": 450, + "type": "Other", + "ref": "e451" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "enabled": true, + "depth": 9, + "index": 451, + "parentIndex": 450, + "ref": "e452" + }, + { + "depth": 1, + "type": "Window", + "parentIndex": 0, + "index": 452, + "enabled": true, + "hittable": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e453" + }, + { + "parentIndex": 452, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "index": 453, + "hittable": true, + "depth": 2, + "ref": "e454" + }, + { + "depth": 3, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "index": 454, + "hittable": true, + "enabled": true, + "parentIndex": 453, + "ref": "e455" + }, + { + "hittable": false, + "parentIndex": 453, + "depth": 3, + "rect": { + "y": 874, + "width": 402, + "height": 233, + "x": 0 + }, + "type": "Other", + "enabled": true, + "index": 455, + "ref": "e456" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 456, + "totalNodeCount": 456, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 114, + "p50Ms": 141, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 114 + } + } + }, + "refsGeneration": 776178 + } +} diff --git a/scroll-regression/ios/native-scroll.log b/scroll-regression/ios/native-scroll.log new file mode 100644 index 0000000000..9479fa06e7 --- /dev/null +++ b/scroll-regression/ios/native-scroll.log @@ -0,0 +1,5 @@ +Native swipe moved stream content: 28.64% changed +Native swipe moved stream content: 29.79% changed +PASS iOS chat: content/header dismiss; empty 30pt; cap 298pt retained after dismissal/reopen; cleared 30pt +PASS iOS workspace-draft: content/header dismiss; empty 30pt; cap 250pt retained after dismissal/reopen; cleared 30pt +PASS iOS new-workspace: content/header dismiss; empty 30pt; cap 333pt retained after dismissal/reopen; cleared 30pt diff --git a/scroll-regression/ios/new-workspace-cap-open.json b/scroll-regression/ios/new-workspace-cap-open.json new file mode 100644 index 0000000000..084ad192c8 --- /dev/null +++ b/scroll-regression/ios/new-workspace-cap-open.json @@ -0,0 +1,2287 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "depth": 0, + "type": "Application", + "index": 0, + "label": "Paseo Debug", + "ref": "e1" + }, + { + "type": "Window", + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "hittable": false, + "depth": 1, + "index": 1, + "parentIndex": 0, + "ref": "e2" + }, + { + "index": 2, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 2, + "parentIndex": 1, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "ref": "e3" + }, + { + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "depth": 3, + "index": 3, + "parentIndex": 2, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e4" + }, + { + "depth": 4, + "index": 4, + "type": "Other", + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "hittable": false, + "parentIndex": 3, + "ref": "e5" + }, + { + "enabled": true, + "type": "Other", + "depth": 5, + "hittable": false, + "parentIndex": 4, + "index": 5, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "ref": "e6" + }, + { + "index": 6, + "parentIndex": 5, + "enabled": true, + "type": "Other", + "depth": 6, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "ref": "e7" + }, + { + "depth": 7, + "index": 7, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "parentIndex": 6, + "type": "Other", + "enabled": true, + "hittable": false, + "ref": "e8" + }, + { + "type": "Other", + "index": 8, + "parentIndex": 7, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "depth": 8, + "ref": "e9" + }, + { + "type": "Other", + "index": 9, + "enabled": true, + "depth": 9, + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "parentIndex": 8, + "ref": "e10" + }, + { + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "enabled": true, + "depth": 9, + "parentIndex": 8, + "index": 10, + "type": "Other", + "ref": "e11" + }, + { + "hittable": false, + "depth": 10, + "index": 11, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "type": "Other", + "parentIndex": 10, + "enabled": true, + "ref": "e12" + }, + { + "hittable": false, + "parentIndex": 10, + "enabled": true, + "type": "Other", + "index": 12, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 10, + "ref": "e13" + }, + { + "index": 13, + "parentIndex": 12, + "depth": 11, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "ref": "e14" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "index": 14, + "depth": 11, + "parentIndex": 12, + "type": "Other", + "ref": "e15" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 12, + "parentIndex": 14, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 15, + "ref": "e16" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "depth": 13, + "enabled": true, + "index": 16, + "parentIndex": 15, + "ref": "e17" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "index": 17, + "depth": 14, + "parentIndex": 16, + "type": "Other", + "ref": "e18" + }, + { + "enabled": true, + "type": "Other", + "depth": 15, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 17, + "label": "Open menu", + "hittable": false, + "index": 18, + "ref": "e19" + }, + { + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "index": 19, + "hittable": false, + "label": "Open menu", + "type": "Other", + "depth": 16, + "parentIndex": 18, + "ref": "e20" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 19, + "label": "Open menu", + "depth": 17, + "type": "Other", + "index": 20, + "ref": "e21" + }, + { + "index": 21, + "enabled": true, + "type": "Other", + "identifier": "composer-dock-header", + "hittable": false, + "depth": 18, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 126 + }, + "label": "Open menu", + "parentIndex": 20, + "ref": "e22" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 21, + "index": 22, + "depth": 19, + "type": "Other", + "rect": { + "y": 70, + "height": 56, + "x": 0, + "width": 402 + }, + "ref": "e23" + }, + { + "enabled": true, + "hittable": false, + "type": "Button", + "rect": { + "y": 81.6666669845581, + "height": 32, + "x": 8, + "width": 32 + }, + "depth": 19, + "index": 23, + "identifier": "menu-button", + "label": "Open menu", + "parentIndex": 21, + "ref": "e24" + }, + { + "depth": 20, + "index": 24, + "hittable": false, + "type": "Other", + "parentIndex": 23, + "rect": { + "y": 91.6666669845581, + "height": 12, + "x": 16, + "width": 16 + }, + "enabled": true, + "ref": "e25" + }, + { + "index": 25, + "parentIndex": 24, + "hittable": false, + "rect": { + "y": 91.6666669845581, + "height": 1.3333358764648438, + "x": 16, + "width": 16 + }, + "enabled": true, + "depth": 21, + "type": "Other", + "ref": "e26" + }, + { + "index": 26, + "enabled": true, + "depth": 21, + "hittable": false, + "type": "Other", + "parentIndex": 24, + "rect": { + "y": 97.00000047683716, + "height": 1.6666717529296875, + "x": 16, + "width": 16 + }, + "ref": "e27" + }, + { + "enabled": true, + "depth": 21, + "parentIndex": 24, + "hittable": false, + "index": 27, + "rect": { + "y": 102.33333396911621, + "height": 1.6666641235351562, + "x": 16, + "width": 8 + }, + "type": "Other", + "ref": "e28" + }, + { + "parentIndex": 20, + "type": "Other", + "index": 28, + "hittable": false, + "depth": 18, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e29" + }, + { + "parentIndex": 20, + "type": "Other", + "index": 29, + "identifier": "composer-viewport", + "hittable": false, + "label": "New workspace", + "depth": 18, + "enabled": true, + "rect": { + "y": 126, + "width": 402, + "height": 748, + "x": 0 + }, + "ref": "e30" + }, + { + "parentIndex": 29, + "type": "Other", + "index": 30, + "hittable": false, + "label": "New workspace", + "depth": 19, + "enabled": true, + "rect": { + "y": -176, + "width": 402, + "height": 748, + "x": 0 + }, + "ref": "e31" + }, + { + "parentIndex": 30, + "type": "Other", + "index": 31, + "identifier": "composer-dock-content", + "hittable": false, + "label": "New workspace", + "depth": 20, + "enabled": true, + "rect": { + "y": -176, + "width": 402, + "height": 307, + "x": 0 + }, + "ref": "e32" + }, + { + "parentIndex": 31, + "type": "Other", + "index": 32, + "hittable": false, + "depth": 21, + "enabled": true, + "rect": { + "y": -176, + "width": 402, + "height": 307, + "x": 0 + }, + "ref": "e33" + }, + { + "parentIndex": 31, + "type": "Other", + "index": 33, + "hittable": false, + "label": "New workspace", + "depth": 21, + "enabled": true, + "rect": { + "y": -94.33333587646484, + "width": 402, + "height": 25.333328247070312, + "x": 0 + }, + "ref": "e34" + }, + { + "parentIndex": 33, + "type": "StaticText", + "index": 34, + "hittable": false, + "label": "New workspace", + "depth": 22, + "enabled": true, + "rect": { + "y": -94.33333587646484, + "width": 362, + "height": 25.333343505859375, + "x": 24 + }, + "ref": "e35" + }, + { + "parentIndex": 34, + "type": "StaticText", + "index": 35, + "hittable": false, + "label": "New workspace", + "depth": 23, + "enabled": true, + "rect": { + "y": -94.33333587646484, + "width": 362, + "height": 25.333343505859375, + "x": 24 + }, + "ref": "e36" + }, + { + "parentIndex": 31, + "type": "Other", + "index": 36, + "identifier": "new-workspace-ref-picker-row", + "hittable": false, + "depth": 21, + "enabled": true, + "rect": { + "y": -37, + "width": 402, + "height": 136, + "x": 0 + }, + "ref": "e37" + }, + { + "parentIndex": 31, + "type": "Button", + "index": 37, + "identifier": "new-workspace-project-picker-trigger", + "hittable": false, + "label": "Workspace project", + "depth": 21, + "enabled": true, + "rect": { + "y": -37, + "width": 238.6666717529297, + "height": 28, + "x": 16 + }, + "ref": "e38" + }, + { + "parentIndex": 37, + "type": "Other", + "index": 38, + "hittable": false, + "depth": 22, + "enabled": true, + "rect": { + "y": -31, + "width": 16, + "height": 16, + "x": 24 + }, + "ref": "e39" + }, + { + "parentIndex": 37, + "type": "StaticText", + "index": 39, + "hittable": false, + "label": "C", + "depth": 22, + "enabled": true, + "rect": { + "y": -29, + "width": 7.666667938232422, + "height": 12, + "x": 28 + }, + "ref": "e40" + }, + { + "parentIndex": 39, + "type": "StaticText", + "index": 40, + "hittable": false, + "label": "C", + "depth": 23, + "enabled": true, + "rect": { + "y": -29, + "width": 7.666667938232422, + "height": 12, + "x": 28 + }, + "ref": "e41" + }, + { + "parentIndex": 31, + "type": "Button", + "index": 41, + "identifier": "workspace-create-isolation-trigger", + "hittable": false, + "label": "Workspace isolation", + "depth": 21, + "enabled": true, + "rect": { + "y": -1, + "width": 90.33333587646484, + "height": 28, + "x": 16 + }, + "ref": "e42" + }, + { + "parentIndex": 41, + "type": "Other", + "index": 42, + "hittable": false, + "depth": 22, + "enabled": true, + "rect": { + "y": 7, + "width": 14, + "height": 14, + "x": 84.33333206176758 + }, + "ref": "e43" + }, + { + "parentIndex": 42, + "type": "Other", + "index": 43, + "hittable": false, + "depth": 23, + "enabled": true, + "rect": { + "y": 7, + "width": 14, + "height": 14, + "x": 84.33333206176758 + }, + "ref": "e44" + }, + { + "parentIndex": 43, + "type": "Other", + "index": 44, + "hittable": false, + "depth": 24, + "enabled": true, + "rect": { + "y": 11.666666666666664, + "width": 8.166666666666657, + "height": 4.666666666666664, + "x": 87.24999872843425 + }, + "ref": "e45" + }, + { + "parentIndex": 44, + "type": "Other", + "index": 45, + "hittable": false, + "depth": 25, + "enabled": true, + "rect": { + "y": 11.666666666666657, + "width": 8.166666666666671, + "height": 4.666666666666664, + "x": 87.24999872843425 + }, + "ref": "e46" + }, + { + "parentIndex": 31, + "type": "Other", + "index": 46, + "hittable": false, + "label": "Choose what to launch", + "depth": 21, + "enabled": true, + "rect": { + "y": 35, + "width": 86.66666412353516, + "height": 28, + "x": 16 + }, + "ref": "e47" + }, + { + "parentIndex": 46, + "type": "Button", + "index": 47, + "identifier": "new-workspace-launch-trigger", + "hittable": false, + "label": "Choose what to launch", + "depth": 22, + "enabled": true, + "rect": { + "y": 35, + "width": 86.66666412353516, + "height": 28, + "x": 16 + }, + "ref": "e48" + }, + { + "parentIndex": 31, + "type": "Other", + "index": 48, + "hittable": false, + "depth": 21, + "enabled": true, + "rect": { + "y": 71, + "width": 402, + "height": 28, + "x": 0 + }, + "ref": "e49" + }, + { + "parentIndex": 30, + "type": "Other", + "index": 49, + "identifier": "composer-viewport-content", + "hittable": false, + "label": "Message agent...", + "depth": 20, + "enabled": true, + "rect": { + "y": 131, + "width": 402, + "height": 441, + "x": 0 + }, + "ref": "e50" + }, + { + "parentIndex": 49, + "type": "Other", + "index": 50, + "identifier": "message-input-root", + "hittable": false, + "depth": 21, + "enabled": true, + "rect": { + "y": 131, + "width": 370, + "height": 391, + "x": 16 + }, + "ref": "e51" + }, + { + "parentIndex": 49, + "type": "Other", + "index": 51, + "hittable": false, + "depth": 21, + "enabled": true, + "rect": { + "y": 131, + "width": 370, + "height": 391, + "x": 16 + }, + "ref": "e52" + }, + { + "parentIndex": 49, + "type": "Other", + "index": 52, + "hittable": false, + "label": "Message agent...", + "depth": 21, + "enabled": true, + "rect": { + "y": 140, + "width": 344, + "height": 333, + "x": 29 + }, + "ref": "e53" + }, + { + "parentIndex": 52, + "type": "TextView", + "index": 53, + "hittable": false, + "label": "Message agent...", + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "depth": 22, + "enabled": true, + "rect": { + "y": 140, + "width": 344, + "height": 333, + "x": 29 + }, + "ref": "e54" + }, + { + "parentIndex": 53, + "type": "Other", + "index": 54, + "hittable": false, + "label": "Vertical scroll bar, 2 pages", + "value": "100%", + "depth": 23, + "enabled": true, + "rect": { + "y": 140, + "width": 30, + "height": 333, + "x": 340 + }, + "ref": "e55" + }, + { + "parentIndex": 54, + "type": "Other", + "index": 55, + "hittable": false, + "depth": 24, + "enabled": true, + "rect": { + "y": 188.66666666666666, + "width": 3, + "height": 281.33333333333337, + "x": 367 + }, + "ref": "e56" + }, + { + "parentIndex": 53, + "type": "Other", + "index": 56, + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 23, + "enabled": true, + "rect": { + "y": 440, + "width": 344, + "height": 30, + "x": 29 + }, + "ref": "e57" + }, + { + "parentIndex": 56, + "type": "Other", + "index": 57, + "hittable": false, + "depth": 24, + "enabled": true, + "rect": { + "y": 467, + "width": 335, + "height": 3, + "x": 32 + }, + "ref": "e58" + }, + { + "parentIndex": 49, + "type": "Button", + "index": 58, + "identifier": "message-input-attach-button", + "hittable": false, + "label": "Add attachment", + "depth": 21, + "enabled": true, + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 23 + }, + "ref": "e59" + }, + { + "parentIndex": 58, + "type": "Other", + "index": 59, + "hittable": false, + "depth": 22, + "enabled": true, + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 23 + }, + "ref": "e60" + }, + { + "parentIndex": 59, + "type": "Other", + "index": 60, + "hittable": false, + "depth": 23, + "enabled": true, + "rect": { + "y": 489, + "width": 20, + "height": 20, + "x": 27 + }, + "ref": "e61" + }, + { + "parentIndex": 60, + "type": "Other", + "index": 61, + "hittable": false, + "depth": 24, + "enabled": true, + "rect": { + "y": 492.3333333333333, + "width": 13.333333333333332, + "height": 13.333333333333371, + "x": 30.333333333333332 + }, + "ref": "e62" + }, + { + "parentIndex": 61, + "type": "Other", + "index": 62, + "hittable": false, + "depth": 25, + "enabled": true, + "rect": { + "y": 498.16666666666674, + "width": 13.333333333333332, + "height": 1.6666666666666856, + "x": 30.333333333333332 + }, + "ref": "e63" + }, + { + "parentIndex": 61, + "type": "Other", + "index": 63, + "hittable": false, + "depth": 25, + "enabled": true, + "rect": { + "y": 492.33333333333326, + "width": 1.6666666666666643, + "height": 13.333333333333314, + "x": 36.16666666666667 + }, + "ref": "e64" + }, + { + "parentIndex": 49, + "type": "Other", + "index": 64, + "hittable": false, + "label": "Select model (Select model)", + "depth": 21, + "enabled": true, + "rect": { + "y": 485, + "width": 264, + "height": 28, + "x": 51 + }, + "ref": "e65" + }, + { + "parentIndex": 64, + "type": "Button", + "index": 65, + "identifier": "combined-model-selector", + "hittable": false, + "label": "Select model (Select model)", + "depth": 22, + "enabled": true, + "rect": { + "y": 485, + "width": 105.66667175292969, + "height": 28, + "x": 51 + }, + "ref": "e66" + }, + { + "parentIndex": 65, + "type": "StaticText", + "index": 66, + "hittable": false, + "label": "Select model", + "depth": 23, + "enabled": true, + "rect": { + "y": 490, + "width": 89.66667175292969, + "height": 18, + "x": 59 + }, + "ref": "e67" + }, + { + "parentIndex": 66, + "type": "StaticText", + "index": 67, + "hittable": false, + "label": "Select model", + "depth": 24, + "enabled": true, + "rect": { + "y": 490, + "width": 89.66667175292969, + "height": 18, + "x": 59 + }, + "ref": "e68" + }, + { + "parentIndex": 49, + "type": "Button", + "index": 68, + "hittable": false, + "label": "Start dictation", + "depth": 21, + "enabled": true, + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 315 + }, + "ref": "e69" + }, + { + "parentIndex": 49, + "type": "Button", + "index": 69, + "identifier": "workspace-create-submit", + "hittable": false, + "label": "Create", + "depth": 21, + "enabled": true, + "rect": { + "y": 485, + "width": 28, + "height": 28, + "x": 351 + }, + "ref": "e70" + }, + { + "parentIndex": 12, + "type": "Other", + "index": 70, + "hittable": false, + "depth": 11, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e71" + }, + { + "parentIndex": 6, + "type": "Other", + "index": 71, + "hittable": false, + "depth": 7, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e72" + }, + { + "parentIndex": 71, + "type": "Other", + "index": 72, + "hittable": false, + "depth": 8, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e73" + }, + { + "parentIndex": 72, + "type": "Other", + "index": 73, + "hittable": false, + "depth": 9, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e74" + }, + { + "parentIndex": 0, + "type": "Window", + "index": 74, + "hittable": false, + "depth": 1, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e75" + }, + { + "parentIndex": 74, + "type": "Other", + "index": 75, + "hittable": false, + "depth": 2, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e76" + }, + { + "parentIndex": 75, + "type": "Other", + "index": 76, + "hittable": false, + "depth": 3, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e77" + }, + { + "parentIndex": 75, + "type": "Other", + "index": 77, + "hittable": false, + "depth": 3, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 336, + "x": 0 + }, + "ref": "e78" + }, + { + "parentIndex": 77, + "type": "Other", + "index": 78, + "hittable": false, + "depth": 4, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 278, + "x": 0 + }, + "ref": "e79" + }, + { + "parentIndex": 0, + "type": "Window", + "index": 79, + "hittable": true, + "label": "Emoji", + "depth": 1, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e80" + }, + { + "parentIndex": 79, + "type": "Other", + "index": 80, + "hittable": true, + "label": "Emoji", + "depth": 2, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "ref": "e81" + }, + { + "parentIndex": 80, + "type": "Other", + "index": 81, + "hittable": true, + "label": "Emoji", + "depth": 3, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 336, + "x": 0 + }, + "ref": "e82" + }, + { + "parentIndex": 81, + "type": "Other", + "index": 82, + "hittable": false, + "depth": 4, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e83" + }, + { + "parentIndex": 82, + "type": "Other", + "index": 83, + "hittable": false, + "depth": 5, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e84" + }, + { + "parentIndex": 83, + "type": "Other", + "index": 84, + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e85" + }, + { + "parentIndex": 81, + "type": "Other", + "index": 85, + "identifier": "SystemInputAssistantView", + "hittable": true, + "label": "Typing Predictions", + "depth": 4, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e86" + }, + { + "parentIndex": 85, + "type": "Other", + "index": 86, + "hittable": true, + "label": "Typing Predictions", + "depth": 5, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e87" + }, + { + "parentIndex": 86, + "type": "Other", + "index": 87, + "identifier": "CenterPageView", + "hittable": true, + "label": "Typing Predictions", + "depth": 6, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e88" + }, + { + "parentIndex": 87, + "type": "Other", + "index": 88, + "hittable": false, + "depth": 7, + "enabled": true, + "rect": { + "y": -62, + "width": 402, + "height": 1245, + "x": 0 + }, + "ref": "e89" + }, + { + "parentIndex": 88, + "type": "ScrollView", + "index": 89, + "hittable": false, + "depth": 8, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e90" + }, + { + "parentIndex": 87, + "type": "Other", + "index": 90, + "hittable": true, + "label": "Typing Predictions", + "depth": 7, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e91" + }, + { + "parentIndex": 90, + "type": "Other", + "index": 91, + "hittable": true, + "label": "Typing Predictions", + "depth": 8, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e92" + }, + { + "parentIndex": 91, + "type": "Other", + "index": 92, + "hittable": true, + "label": "“o”", + "depth": 9, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e93" + }, + { + "parentIndex": 92, + "type": "Other", + "index": 93, + "hittable": true, + "label": "“o”", + "depth": 10, + "enabled": true, + "rect": { + "y": 538, + "width": 402, + "height": 45, + "x": 0 + }, + "ref": "e94" + }, + { + "parentIndex": 93, + "type": "Other", + "index": 94, + "hittable": true, + "label": "“o”", + "depth": 11, + "enabled": true, + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 0 + }, + "ref": "e95" + }, + { + "parentIndex": 93, + "type": "Other", + "index": 95, + "hittable": true, + "label": "oh", + "depth": 11, + "enabled": true, + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 134 + }, + "ref": "e96" + }, + { + "parentIndex": 93, + "type": "Other", + "index": 96, + "hittable": true, + "label": "one", + "depth": 11, + "enabled": true, + "rect": { + "y": 538, + "width": 134, + "height": 45, + "x": 268 + }, + "ref": "e97" + }, + { + "parentIndex": 81, + "type": "Other", + "index": 97, + "hittable": false, + "depth": 4, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e98" + }, + { + "parentIndex": 97, + "type": "Other", + "index": 98, + "hittable": false, + "depth": 5, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "ref": "e99" + }, + { + "parentIndex": 98, + "type": "Other", + "index": 99, + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "ref": "e100" + }, + { + "parentIndex": 99, + "type": "Other", + "index": 100, + "hittable": false, + "depth": 7, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "ref": "e101" + }, + { + "parentIndex": 81, + "type": "Other", + "index": 101, + "hittable": false, + "label": "Q", + "depth": 4, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e102" + }, + { + "parentIndex": 101, + "type": "Keyboard", + "index": 102, + "hittable": false, + "label": "Q", + "depth": 5, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e103" + }, + { + "parentIndex": 102, + "type": "Other", + "index": 103, + "hittable": false, + "label": "Q", + "depth": 6, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e104" + }, + { + "parentIndex": 103, + "type": "Other", + "index": 104, + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "label": "Q", + "depth": 7, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 233, + "x": 0 + }, + "ref": "e105" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 105, + "hittable": false, + "label": "Q", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.333333333333336, + "height": 46, + "x": 0 + }, + "ref": "e106" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 106, + "hittable": false, + "label": "W", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.00000000000001, + "height": 46, + "x": 40.333333333333336 + }, + "ref": "e107" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 107, + "hittable": false, + "label": "E", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 80.33333333333334 + }, + "ref": "e108" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 108, + "hittable": false, + "label": "R", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 120.66666666666669 + }, + "ref": "e109" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 109, + "hittable": false, + "label": "T", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 160.66666666666669 + }, + "ref": "e110" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 110, + "hittable": false, + "label": "Y", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.33333333333334, + "height": 46, + "x": 201.00000000000003 + }, + "ref": "e111" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 111, + "hittable": false, + "label": "U", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 241.33333333333337 + }, + "ref": "e112" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 112, + "hittable": false, + "label": "I", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.333333333333314, + "height": 46, + "x": 281.33333333333337 + }, + "ref": "e113" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 113, + "hittable": false, + "label": "O", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40, + "height": 46, + "x": 321.6666666666667 + }, + "ref": "e114" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 114, + "hittable": false, + "label": "P", + "depth": 8, + "enabled": true, + "rect": { + "y": 590, + "width": 40.333333333333314, + "height": 46, + "x": 361.6666666666667 + }, + "ref": "e115" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 115, + "hittable": false, + "label": "A", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.33333333333333, + "height": 46, + "x": 19.666666666666668 + }, + "ref": "e116" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 116, + "hittable": false, + "label": "S", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "ref": "e117" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 117, + "hittable": false, + "label": "D", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "ref": "e118" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 118, + "hittable": false, + "label": "F", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "ref": "e119" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 119, + "hittable": false, + "label": "G", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "ref": "e120" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 120, + "hittable": false, + "label": "H", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "ref": "e121" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 121, + "hittable": false, + "label": "J", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40, + "height": 46, + "x": 261.536 + }, + "ref": "e122" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 122, + "hittable": false, + "label": "K", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "ref": "e123" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 123, + "hittable": false, + "label": "L", + "depth": 8, + "enabled": true, + "rect": { + "y": 644, + "width": 40.333333333333314, + "height": 46, + "x": 341.8693333333333 + }, + "ref": "e124" + }, + { + "selected": true, + "type": "Button", + "parentIndex": 104, + "index": 124, + "identifier": "shift", + "hittable": false, + "label": "shift", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 51.333333333333336, + "height": 46, + "x": 0 + }, + "ref": "e125" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 125, + "hittable": false, + "label": "Z", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40.33333333333334, + "height": 46, + "x": 60 + }, + "ref": "e126" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 126, + "hittable": false, + "label": "X", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 100.33333333333334 + }, + "ref": "e127" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 127, + "hittable": false, + "label": "C", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40.33333333333334, + "height": 46, + "x": 140.33333333333334 + }, + "ref": "e128" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 128, + "hittable": false, + "label": "V", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 181.2026666666667 + }, + "ref": "e129" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 129, + "hittable": false, + "label": "B", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 221.2026666666667 + }, + "ref": "e130" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 130, + "hittable": false, + "label": "N", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40, + "height": 46, + "x": 261.536 + }, + "ref": "e131" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 131, + "hittable": false, + "label": "M", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 40.333333333333314, + "height": 46, + "x": 301.536 + }, + "ref": "e132" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 132, + "identifier": "delete", + "hittable": false, + "label": "delete", + "depth": 8, + "enabled": true, + "rect": { + "y": 698, + "width": 51.333333333333314, + "height": 46, + "x": 350.42133333333334 + }, + "ref": "e133" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 133, + "identifier": "more", + "hittable": false, + "label": "numbers", + "depth": 8, + "enabled": true, + "rect": { + "y": 752, + "width": 101, + "height": 46, + "x": 0 + }, + "ref": "e134" + }, + { + "parentIndex": 104, + "type": "Key", + "index": 134, + "identifier": "space", + "hittable": false, + "label": "space", + "depth": 8, + "enabled": true, + "rect": { + "y": 752, + "width": 201.33333333333334, + "height": 46, + "x": 100.33333333333334 + }, + "ref": "e135" + }, + { + "parentIndex": 104, + "type": "Button", + "index": 135, + "identifier": "Return", + "hittable": false, + "label": "return", + "depth": 8, + "enabled": true, + "rect": { + "y": 752, + "width": 100.33333333333331, + "height": 46, + "x": 301.6666666666667 + }, + "ref": "e136" + }, + { + "parentIndex": 81, + "type": "Other", + "index": 136, + "hittable": true, + "label": "Emoji", + "depth": 4, + "enabled": true, + "rect": { + "y": 583, + "width": 402, + "height": 291, + "x": 0 + }, + "ref": "e137" + }, + { + "parentIndex": 136, + "type": "Button", + "index": 137, + "hittable": true, + "label": "Emoji", + "depth": 5, + "enabled": true, + "rect": { + "y": 805.6989567998571, + "width": 68.0852958475086, + "height": 68.73516393505099, + "x": 8.47726568115926 + }, + "ref": "e138" + }, + { + "parentIndex": 137, + "type": "StaticText", + "index": 138, + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "y": 805.6989567998571, + "width": 0, + "height": 0, + "x": 8.47726568115926 + }, + "ref": "e139" + }, + { + "parentIndex": 136, + "type": "Button", + "index": 139, + "identifier": "dictation", + "hittable": false, + "label": "Dictate", + "depth": 5, + "enabled": true, + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "ref": "e140" + }, + { + "parentIndex": 139, + "type": "StaticText", + "index": 140, + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "ref": "e141" + }, + { + "parentIndex": 136, + "type": "Button", + "index": 141, + "identifier": "dictation", + "hittable": true, + "label": "Dictate", + "depth": 5, + "enabled": true, + "rect": { + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099, + "x": 325.43743847133214 + }, + "ref": "e142" + }, + { + "parentIndex": 141, + "type": "StaticText", + "index": 142, + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "y": 805.3656234665239, + "width": 0, + "height": 0, + "x": 325.43743847133214 + }, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 135, + "p50Ms": 142, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 135 + } + } + }, + "refsGeneration": 776199 + } +} diff --git a/scroll-regression/ios/new-workspace-cap-open.png b/scroll-regression/ios/new-workspace-cap-open.png new file mode 100644 index 0000000000..6f777f0393 Binary files /dev/null and b/scroll-regression/ios/new-workspace-cap-open.png differ diff --git a/scroll-regression/ios/new-workspace-cleared.json b/scroll-regression/ios/new-workspace-cleared.json new file mode 100644 index 0000000000..25b3c043f2 --- /dev/null +++ b/scroll-regression/ios/new-workspace-cleared.json @@ -0,0 +1,2286 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "label": "Paseo Debug", + "enabled": true, + "type": "Application", + "index": 0, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "depth": 0, + "hittable": true, + "ref": "e1" + }, + { + "index": 1, + "hittable": false, + "parentIndex": 0, + "type": "Window", + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 1, + "ref": "e2" + }, + { + "parentIndex": 1, + "enabled": true, + "index": 2, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "hittable": false, + "type": "Other", + "depth": 2, + "ref": "e3" + }, + { + "enabled": true, + "parentIndex": 2, + "hittable": false, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 3, + "index": 3, + "ref": "e4" + }, + { + "depth": 4, + "parentIndex": 3, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 4, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e5" + }, + { + "enabled": true, + "index": 5, + "depth": 5, + "type": "Other", + "parentIndex": 4, + "hittable": false, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e6" + }, + { + "parentIndex": 5, + "type": "Other", + "hittable": false, + "index": 6, + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 6, + "ref": "e7" + }, + { + "depth": 7, + "index": 7, + "parentIndex": 6, + "enabled": true, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "hittable": false, + "ref": "e8" + }, + { + "type": "Other", + "depth": 8, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 8, + "enabled": true, + "parentIndex": 7, + "hittable": false, + "ref": "e9" + }, + { + "type": "Other", + "index": 9, + "parentIndex": 8, + "enabled": true, + "depth": 9, + "hittable": false, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "ref": "e10" + }, + { + "depth": 9, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "parentIndex": 8, + "type": "Other", + "index": 10, + "enabled": true, + "hittable": false, + "ref": "e11" + }, + { + "index": 11, + "type": "Other", + "depth": 10, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "enabled": true, + "parentIndex": 10, + "ref": "e12" + }, + { + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 12, + "type": "Other", + "enabled": true, + "parentIndex": 10, + "depth": 10, + "ref": "e13" + }, + { + "index": 13, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 12, + "depth": 11, + "enabled": true, + "hittable": false, + "ref": "e14" + }, + { + "parentIndex": 12, + "index": 14, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "depth": 11, + "type": "Other", + "ref": "e15" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "type": "Other", + "index": 15, + "enabled": true, + "depth": 12, + "parentIndex": 14, + "ref": "e16" + }, + { + "hittable": false, + "index": 16, + "enabled": true, + "type": "Other", + "depth": 13, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 15, + "ref": "e17" + }, + { + "index": 17, + "parentIndex": 16, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 14, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e18" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 18, + "hittable": false, + "parentIndex": 17, + "depth": 15, + "type": "Other", + "label": "Open menu", + "enabled": true, + "ref": "e19" + }, + { + "hittable": false, + "label": "Open menu", + "type": "Other", + "index": 19, + "depth": 16, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 18, + "enabled": true, + "ref": "e20" + }, + { + "index": 20, + "label": "Open menu", + "type": "Other", + "depth": 17, + "parentIndex": 19, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "ref": "e21" + }, + { + "index": 21, + "label": "Open menu", + "type": "Other", + "depth": 18, + "identifier": "composer-dock-header", + "enabled": true, + "rect": { + "y": 0, + "height": 126, + "width": 402, + "x": 0 + }, + "parentIndex": 20, + "hittable": false, + "ref": "e22" + }, + { + "rect": { + "y": 70, + "height": 56, + "width": 402, + "x": 0 + }, + "parentIndex": 21, + "type": "Other", + "depth": 19, + "enabled": true, + "index": 22, + "hittable": false, + "ref": "e23" + }, + { + "type": "Button", + "depth": 19, + "rect": { + "y": 81.6666669845581, + "height": 32, + "width": 32, + "x": 8 + }, + "label": "Open menu", + "index": 23, + "parentIndex": 21, + "identifier": "menu-button", + "hittable": false, + "enabled": true, + "ref": "e24" + }, + { + "type": "Other", + "rect": { + "y": 91.6666669845581, + "height": 12, + "width": 16, + "x": 16 + }, + "enabled": true, + "index": 24, + "parentIndex": 23, + "depth": 20, + "hittable": false, + "ref": "e25" + }, + { + "depth": 21, + "index": 25, + "rect": { + "y": 91.6666669845581, + "height": 1.3333358764648438, + "width": 16, + "x": 16 + }, + "enabled": true, + "parentIndex": 24, + "type": "Other", + "hittable": false, + "ref": "e26" + }, + { + "enabled": true, + "rect": { + "y": 97.00000047683716, + "height": 1.6666717529296875, + "width": 16, + "x": 16 + }, + "depth": 21, + "index": 26, + "type": "Other", + "hittable": false, + "parentIndex": 24, + "ref": "e27" + }, + { + "enabled": true, + "index": 27, + "hittable": false, + "depth": 21, + "type": "Other", + "rect": { + "y": 102.33333396911621, + "height": 1.6666641235351562, + "width": 8, + "x": 16 + }, + "parentIndex": 24, + "ref": "e28" + }, + { + "depth": 18, + "index": 28, + "hittable": false, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 20, + "ref": "e29" + }, + { + "index": 29, + "enabled": true, + "type": "Other", + "hittable": false, + "label": "New workspace", + "depth": 18, + "identifier": "composer-viewport", + "parentIndex": 20, + "rect": { + "y": 126, + "height": 748, + "width": 402, + "x": 0 + }, + "ref": "e30" + }, + { + "parentIndex": 29, + "hittable": false, + "enabled": true, + "depth": 19, + "label": "New workspace", + "index": 30, + "type": "Other", + "rect": { + "y": -176, + "height": 748, + "width": 402, + "x": 0 + }, + "ref": "e31" + }, + { + "index": 31, + "enabled": true, + "hittable": false, + "depth": 20, + "label": "New workspace", + "parentIndex": 30, + "rect": { + "y": -176, + "height": 610, + "width": 402, + "x": 0 + }, + "identifier": "composer-dock-content", + "type": "Other", + "ref": "e32" + }, + { + "enabled": true, + "index": 32, + "rect": { + "y": -176, + "height": 610, + "width": 402, + "x": 0 + }, + "parentIndex": 31, + "type": "Other", + "hittable": false, + "depth": 21, + "ref": "e33" + }, + { + "type": "Other", + "depth": 21, + "parentIndex": 31, + "enabled": true, + "rect": { + "y": 208.66665649414062, + "height": 25.333343505859375, + "width": 402, + "x": 0 + }, + "hittable": false, + "label": "New workspace", + "index": 33, + "ref": "e34" + }, + { + "depth": 22, + "type": "StaticText", + "label": "New workspace", + "enabled": true, + "index": 34, + "parentIndex": 33, + "hittable": false, + "rect": { + "y": 208.66665649414062, + "height": 25.333343505859375, + "width": 362, + "x": 24 + }, + "ref": "e35" + }, + { + "parentIndex": 34, + "depth": 23, + "enabled": true, + "index": 35, + "rect": { + "y": 208.66665649414062, + "height": 25.333343505859375, + "width": 362, + "x": 24 + }, + "hittable": false, + "label": "New workspace", + "type": "StaticText", + "ref": "e36" + }, + { + "rect": { + "y": 266, + "height": 136, + "width": 402, + "x": 0 + }, + "parentIndex": 31, + "identifier": "new-workspace-ref-picker-row", + "enabled": true, + "hittable": false, + "index": 36, + "depth": 21, + "type": "Other", + "ref": "e37" + }, + { + "type": "Button", + "identifier": "new-workspace-project-picker-trigger", + "rect": { + "y": 266, + "height": 28, + "width": 238.6666717529297, + "x": 16 + }, + "depth": 21, + "parentIndex": 31, + "label": "Workspace project", + "index": 37, + "hittable": false, + "enabled": true, + "ref": "e38" + }, + { + "rect": { + "y": 272, + "height": 16, + "width": 16, + "x": 24 + }, + "enabled": true, + "depth": 22, + "type": "Other", + "index": 38, + "hittable": false, + "parentIndex": 37, + "ref": "e39" + }, + { + "label": "C", + "type": "StaticText", + "depth": 22, + "enabled": true, + "index": 39, + "rect": { + "y": 274, + "height": 12, + "width": 7.666667938232422, + "x": 28 + }, + "parentIndex": 37, + "hittable": false, + "ref": "e40" + }, + { + "depth": 23, + "rect": { + "y": 274, + "height": 12, + "width": 7.666667938232422, + "x": 28 + }, + "index": 40, + "enabled": true, + "hittable": false, + "parentIndex": 39, + "label": "C", + "type": "StaticText", + "ref": "e41" + }, + { + "label": "Workspace isolation", + "parentIndex": 31, + "hittable": false, + "enabled": true, + "identifier": "workspace-create-isolation-trigger", + "rect": { + "y": 302, + "height": 28, + "width": 90.33333587646484, + "x": 16 + }, + "index": 41, + "type": "Button", + "depth": 21, + "ref": "e42" + }, + { + "index": 42, + "depth": 22, + "rect": { + "y": 310, + "height": 14, + "width": 14, + "x": 84.33333206176758 + }, + "parentIndex": 41, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e43" + }, + { + "index": 43, + "depth": 23, + "rect": { + "y": 310, + "height": 14, + "width": 14, + "x": 84.33333206176758 + }, + "parentIndex": 42, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e44" + }, + { + "parentIndex": 43, + "hittable": false, + "index": 44, + "type": "Other", + "depth": 24, + "enabled": true, + "rect": { + "y": 314.6666666666667, + "height": 4.666666666666629, + "width": 8.166666666666657, + "x": 87.24999872843425 + }, + "ref": "e45" + }, + { + "rect": { + "y": 314.6666666666667, + "height": 4.666666666666686, + "width": 8.166666666666671, + "x": 87.24999872843425 + }, + "parentIndex": 44, + "type": "Other", + "depth": 25, + "hittable": false, + "index": 45, + "enabled": true, + "ref": "e46" + }, + { + "depth": 21, + "index": 46, + "enabled": true, + "parentIndex": 31, + "label": "Choose what to launch", + "type": "Other", + "rect": { + "y": 338, + "height": 28, + "width": 86.66666412353516, + "x": 16 + }, + "hittable": false, + "ref": "e47" + }, + { + "hittable": false, + "identifier": "new-workspace-launch-trigger", + "parentIndex": 46, + "depth": 22, + "type": "Button", + "label": "Choose what to launch", + "enabled": true, + "rect": { + "y": 338, + "height": 28, + "width": 86.66666412353516, + "x": 16 + }, + "index": 47, + "ref": "e48" + }, + { + "parentIndex": 31, + "index": 48, + "hittable": false, + "depth": 21, + "enabled": true, + "type": "Other", + "rect": { + "y": 374, + "height": 28, + "width": 402, + "x": 0 + }, + "ref": "e49" + }, + { + "identifier": "composer-viewport-content", + "rect": { + "y": 434, + "height": 138, + "width": 402, + "x": 0 + }, + "depth": 20, + "index": 49, + "enabled": true, + "type": "Other", + "hittable": false, + "label": "Message agent... Message, @files, /commands", + "parentIndex": 30, + "ref": "e50" + }, + { + "type": "Other", + "parentIndex": 49, + "enabled": true, + "index": 50, + "hittable": false, + "identifier": "message-input-root", + "depth": 21, + "rect": { + "y": 434, + "height": 88, + "width": 370, + "x": 16 + }, + "ref": "e51" + }, + { + "parentIndex": 49, + "index": 51, + "hittable": false, + "depth": 21, + "type": "Other", + "enabled": true, + "rect": { + "y": 434, + "height": 88, + "width": 370, + "x": 16 + }, + "ref": "e52" + }, + { + "parentIndex": 49, + "hittable": false, + "rect": { + "y": 443, + "height": 30, + "width": 344, + "x": 29 + }, + "index": 52, + "enabled": true, + "type": "Other", + "depth": 21, + "label": "Message agent... Message, @files, /commands", + "ref": "e53" + }, + { + "label": "Message agent... Message, @files, /commands", + "enabled": true, + "depth": 22, + "index": 53, + "type": "TextView", + "parentIndex": 52, + "rect": { + "y": 443, + "height": 30, + "width": 344, + "x": 29 + }, + "hittable": false, + "ref": "e54" + }, + { + "parentIndex": 53, + "label": "Vertical scroll bar, 1 page", + "index": 54, + "hittable": false, + "enabled": true, + "type": "Other", + "value": "0%", + "depth": 23, + "rect": { + "y": 443, + "height": 30, + "width": 30, + "x": 340 + }, + "ref": "e55" + }, + { + "hittable": false, + "index": 55, + "parentIndex": 54, + "rect": { + "y": 464.3332926432292, + "height": 38.000020345052064, + "width": 3, + "x": 367 + }, + "type": "Other", + "enabled": true, + "depth": 24, + "ref": "e56" + }, + { + "index": 56, + "type": "Other", + "depth": 23, + "enabled": true, + "hittable": false, + "rect": { + "y": 455, + "height": 15, + "width": 344, + "x": 29 + }, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "parentIndex": 53, + "ref": "e57" + }, + { + "depth": 24, + "parentIndex": 56, + "type": "Other", + "rect": { + "y": 467, + "height": 3, + "width": 338, + "x": 32 + }, + "index": 57, + "enabled": true, + "hittable": false, + "ref": "e58" + }, + { + "depth": 21, + "type": "Button", + "index": 58, + "parentIndex": 49, + "hittable": false, + "rect": { + "y": 485, + "height": 28, + "width": 28, + "x": 23 + }, + "label": "Add attachment", + "identifier": "message-input-attach-button", + "enabled": true, + "ref": "e59" + }, + { + "hittable": false, + "depth": 22, + "type": "Other", + "rect": { + "y": 485, + "height": 28, + "width": 28, + "x": 23 + }, + "parentIndex": 58, + "enabled": true, + "index": 59, + "ref": "e60" + }, + { + "depth": 23, + "rect": { + "y": 489, + "height": 20, + "width": 20, + "x": 27 + }, + "enabled": true, + "hittable": false, + "index": 60, + "type": "Other", + "parentIndex": 59, + "ref": "e61" + }, + { + "rect": { + "y": 492.3333333333333, + "height": 13.333333333333371, + "width": 13.333333333333332, + "x": 30.333333333333332 + }, + "parentIndex": 60, + "type": "Other", + "depth": 24, + "index": 61, + "enabled": true, + "hittable": false, + "ref": "e62" + }, + { + "hittable": false, + "depth": 25, + "index": 62, + "enabled": true, + "rect": { + "y": 498.16666666666663, + "height": 1.6666666666666856, + "width": 13.333333333333332, + "x": 30.333333333333332 + }, + "type": "Other", + "parentIndex": 61, + "ref": "e63" + }, + { + "hittable": false, + "rect": { + "y": 492.33333333333337, + "height": 13.333333333333314, + "width": 1.6666666666666643, + "x": 36.16666666666667 + }, + "type": "Other", + "index": 63, + "enabled": true, + "parentIndex": 61, + "depth": 25, + "ref": "e64" + }, + { + "parentIndex": 49, + "index": 64, + "label": "Select model (Select model)", + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": 485, + "height": 28, + "width": 264, + "x": 51 + }, + "depth": 21, + "ref": "e65" + }, + { + "parentIndex": 64, + "rect": { + "y": 485, + "height": 28, + "width": 105.66667175292969, + "x": 51 + }, + "type": "Button", + "enabled": true, + "hittable": false, + "depth": 22, + "index": 65, + "label": "Select model (Select model)", + "identifier": "combined-model-selector", + "ref": "e66" + }, + { + "label": "Select model", + "enabled": true, + "rect": { + "y": 490, + "height": 18, + "width": 89.66667175292969, + "x": 59 + }, + "hittable": false, + "type": "StaticText", + "index": 66, + "depth": 23, + "parentIndex": 65, + "ref": "e67" + }, + { + "parentIndex": 66, + "index": 67, + "rect": { + "y": 490, + "height": 18, + "width": 89.66667175292969, + "x": 59 + }, + "label": "Select model", + "enabled": true, + "type": "StaticText", + "hittable": false, + "depth": 24, + "ref": "e68" + }, + { + "hittable": false, + "index": 68, + "enabled": true, + "rect": { + "y": 485, + "height": 28, + "width": 28, + "x": 315 + }, + "label": "Start dictation", + "parentIndex": 49, + "depth": 21, + "type": "Button", + "ref": "e69" + }, + { + "index": 69, + "enabled": true, + "type": "Button", + "depth": 21, + "parentIndex": 49, + "identifier": "workspace-create-submit", + "hittable": false, + "rect": { + "y": 485, + "height": 28, + "width": 28, + "x": 351 + }, + "label": "Create", + "ref": "e70" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 12, + "index": 70, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 11, + "type": "Other", + "ref": "e71" + }, + { + "hittable": false, + "index": 71, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 7, + "type": "Other", + "parentIndex": 6, + "ref": "e72" + }, + { + "hittable": false, + "depth": 8, + "enabled": true, + "index": 72, + "type": "Other", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "parentIndex": 71, + "ref": "e73" + }, + { + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "parentIndex": 72, + "hittable": false, + "enabled": true, + "index": 73, + "depth": 9, + "ref": "e74" + }, + { + "type": "Window", + "parentIndex": 0, + "hittable": false, + "index": 74, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 1, + "enabled": true, + "ref": "e75" + }, + { + "hittable": false, + "parentIndex": 74, + "depth": 2, + "index": 75, + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "ref": "e76" + }, + { + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 3, + "enabled": true, + "type": "Other", + "index": 76, + "parentIndex": 75, + "ref": "e77" + }, + { + "parentIndex": 75, + "hittable": false, + "enabled": true, + "index": 77, + "type": "Other", + "rect": { + "y": 538, + "height": 336, + "width": 402, + "x": 0 + }, + "depth": 3, + "ref": "e78" + }, + { + "parentIndex": 77, + "enabled": true, + "index": 78, + "rect": { + "y": 538, + "height": 278, + "width": 402, + "x": 0 + }, + "hittable": false, + "type": "Other", + "depth": 4, + "ref": "e79" + }, + { + "type": "Window", + "parentIndex": 0, + "hittable": true, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 1, + "index": 79, + "enabled": true, + "label": "Emoji", + "ref": "e80" + }, + { + "enabled": true, + "depth": 2, + "parentIndex": 79, + "label": "Emoji", + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": true, + "type": "Other", + "index": 80, + "ref": "e81" + }, + { + "rect": { + "y": 538, + "height": 336, + "width": 402, + "x": 0 + }, + "label": "Emoji", + "type": "Other", + "depth": 3, + "parentIndex": 80, + "enabled": true, + "hittable": true, + "index": 81, + "ref": "e82" + }, + { + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "enabled": true, + "type": "Other", + "index": 82, + "parentIndex": 81, + "depth": 4, + "hittable": false, + "ref": "e83" + }, + { + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "parentIndex": 82, + "depth": 5, + "index": 83, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e84" + }, + { + "hittable": false, + "index": 84, + "parentIndex": 83, + "depth": 6, + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "type": "Other", + "enabled": true, + "ref": "e85" + }, + { + "type": "Other", + "depth": 4, + "index": 85, + "enabled": true, + "label": "Typing Predictions", + "hittable": true, + "parentIndex": 81, + "identifier": "SystemInputAssistantView", + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "ref": "e86" + }, + { + "type": "Other", + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "depth": 5, + "hittable": true, + "enabled": true, + "parentIndex": 85, + "label": "Typing Predictions", + "index": 86, + "ref": "e87" + }, + { + "enabled": true, + "index": 87, + "identifier": "CenterPageView", + "type": "Other", + "depth": 6, + "hittable": true, + "parentIndex": 86, + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "label": "Typing Predictions", + "ref": "e88" + }, + { + "type": "Other", + "depth": 7, + "enabled": true, + "hittable": false, + "rect": { + "y": -62, + "height": 1245, + "width": 402, + "x": 0 + }, + "parentIndex": 87, + "index": 88, + "ref": "e89" + }, + { + "enabled": true, + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "parentIndex": 88, + "depth": 8, + "type": "ScrollView", + "hittable": false, + "index": 89, + "ref": "e90" + }, + { + "parentIndex": 87, + "index": 90, + "rect": { + "y": 538, + "height": 45, + "width": 402, + "x": 0 + }, + "hittable": true, + "type": "Other", + "depth": 7, + "label": "Typing Predictions", + "enabled": true, + "ref": "e91" + }, + { + "parentIndex": 90, + "index": 91, + "rect": { + "x": 0, + "y": 538, + "width": 402, + "height": 45 + }, + "hittable": true, + "type": "Other", + "depth": 8, + "label": "Typing Predictions", + "enabled": true, + "ref": "e92" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 91, + "depth": 9, + "index": 92, + "rect": { + "x": 0, + "y": 538, + "width": 402, + "height": 45 + }, + "label": "I", + "hittable": true, + "ref": "e93" + }, + { + "index": 93, + "parentIndex": 92, + "hittable": true, + "enabled": true, + "depth": 10, + "rect": { + "x": 0, + "y": 538, + "width": 402, + "height": 45 + }, + "label": "I", + "type": "Other", + "ref": "e94" + }, + { + "label": "I", + "index": 94, + "type": "Other", + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "y": 538, + "width": 134, + "height": 45 + }, + "depth": 11, + "parentIndex": 93, + "ref": "e95" + }, + { + "rect": { + "x": 134, + "y": 538, + "width": 134, + "height": 45 + }, + "index": 95, + "enabled": true, + "type": "Other", + "label": "The", + "depth": 11, + "parentIndex": 93, + "hittable": true, + "ref": "e96" + }, + { + "hittable": true, + "type": "Other", + "enabled": true, + "depth": 11, + "parentIndex": 93, + "label": "I’m", + "index": 96, + "rect": { + "x": 268, + "y": 538, + "width": 134, + "height": 45 + }, + "ref": "e97" + }, + { + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 233 + }, + "type": "Other", + "enabled": true, + "index": 97, + "parentIndex": 81, + "hittable": false, + "depth": 4, + "ref": "e98" + }, + { + "index": 98, + "enabled": true, + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 291 + }, + "depth": 5, + "type": "Other", + "hittable": false, + "parentIndex": 97, + "ref": "e99" + }, + { + "hittable": false, + "depth": 6, + "enabled": true, + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 291 + }, + "index": 99, + "parentIndex": 98, + "type": "Other", + "ref": "e100" + }, + { + "index": 100, + "hittable": false, + "depth": 7, + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 291 + }, + "type": "Other", + "parentIndex": 99, + "enabled": true, + "ref": "e101" + }, + { + "type": "Other", + "depth": 4, + "hittable": false, + "enabled": true, + "label": "Q", + "index": 101, + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 233 + }, + "parentIndex": 81, + "ref": "e102" + }, + { + "index": 102, + "enabled": true, + "type": "Keyboard", + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 233 + }, + "label": "Q", + "parentIndex": 101, + "hittable": false, + "depth": 5, + "ref": "e103" + }, + { + "enabled": true, + "depth": 6, + "label": "Q", + "parentIndex": 102, + "type": "Other", + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 233 + }, + "index": 103, + "hittable": false, + "ref": "e104" + }, + { + "label": "Q", + "depth": 7, + "index": 104, + "enabled": true, + "type": "Other", + "parentIndex": 103, + "hittable": false, + "identifier": "UIKeyboardLayoutStar Preview", + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 233 + }, + "ref": "e105" + }, + { + "index": 105, + "hittable": false, + "rect": { + "x": 0, + "y": 590, + "width": 40.333333333333336, + "height": 46 + }, + "type": "Key", + "depth": 8, + "label": "Q", + "enabled": true, + "parentIndex": 104, + "ref": "e106" + }, + { + "parentIndex": 104, + "depth": 8, + "index": 106, + "hittable": false, + "enabled": true, + "label": "W", + "rect": { + "x": 40.333333333333336, + "y": 590, + "width": 40.00000000000001, + "height": 46 + }, + "type": "Key", + "ref": "e107" + }, + { + "index": 107, + "label": "E", + "enabled": true, + "hittable": false, + "type": "Key", + "rect": { + "x": 80.33333333333334, + "y": 590, + "width": 40.33333333333334, + "height": 46 + }, + "parentIndex": 104, + "depth": 8, + "ref": "e108" + }, + { + "hittable": false, + "index": 108, + "depth": 8, + "parentIndex": 104, + "type": "Key", + "label": "R", + "rect": { + "x": 120.66666666666669, + "y": 590, + "width": 40, + "height": 46 + }, + "enabled": true, + "ref": "e109" + }, + { + "label": "T", + "enabled": true, + "parentIndex": 104, + "hittable": false, + "rect": { + "x": 160.66666666666669, + "y": 590, + "width": 40.33333333333334, + "height": 46 + }, + "depth": 8, + "type": "Key", + "index": 109, + "ref": "e110" + }, + { + "index": 110, + "depth": 8, + "type": "Key", + "parentIndex": 104, + "hittable": false, + "label": "Y", + "enabled": true, + "rect": { + "x": 201.00000000000003, + "y": 590, + "width": 40.33333333333334, + "height": 46 + }, + "ref": "e111" + }, + { + "type": "Key", + "parentIndex": 104, + "rect": { + "x": 241.33333333333337, + "y": 590, + "width": 40, + "height": 46 + }, + "depth": 8, + "label": "U", + "hittable": false, + "enabled": true, + "index": 111, + "ref": "e112" + }, + { + "enabled": true, + "depth": 8, + "index": 112, + "label": "I", + "hittable": false, + "type": "Key", + "rect": { + "x": 281.33333333333337, + "y": 590, + "width": 40.333333333333314, + "height": 46 + }, + "parentIndex": 104, + "ref": "e113" + }, + { + "parentIndex": 104, + "depth": 8, + "type": "Key", + "enabled": true, + "hittable": false, + "label": "O", + "index": 113, + "rect": { + "x": 321.6666666666667, + "y": 590, + "width": 40, + "height": 46 + }, + "ref": "e114" + }, + { + "depth": 8, + "hittable": false, + "parentIndex": 104, + "rect": { + "x": 361.6666666666667, + "y": 590, + "width": 40.333333333333314, + "height": 46 + }, + "type": "Key", + "enabled": true, + "index": 114, + "label": "P", + "ref": "e115" + }, + { + "rect": { + "x": 19.666666666666668, + "y": 644, + "width": 40.33333333333333, + "height": 46 + }, + "depth": 8, + "parentIndex": 104, + "hittable": false, + "label": "A", + "enabled": true, + "index": 115, + "type": "Key", + "ref": "e116" + }, + { + "index": 116, + "parentIndex": 104, + "label": "S", + "depth": 8, + "enabled": true, + "type": "Key", + "rect": { + "x": 60, + "y": 644, + "width": 40.33333333333334, + "height": 46 + }, + "hittable": false, + "ref": "e117" + }, + { + "hittable": false, + "depth": 8, + "enabled": true, + "parentIndex": 104, + "index": 117, + "rect": { + "x": 100.33333333333334, + "y": 644, + "width": 40, + "height": 46 + }, + "label": "D", + "type": "Key", + "ref": "e118" + }, + { + "hittable": false, + "parentIndex": 104, + "depth": 8, + "rect": { + "x": 140.33333333333334, + "y": 644, + "width": 40.33333333333334, + "height": 46 + }, + "index": 118, + "enabled": true, + "type": "Key", + "label": "F", + "ref": "e119" + }, + { + "enabled": true, + "type": "Key", + "parentIndex": 104, + "rect": { + "x": 181.2026666666667, + "y": 644, + "width": 40, + "height": 46 + }, + "depth": 8, + "hittable": false, + "index": 119, + "label": "G", + "ref": "e120" + }, + { + "index": 120, + "rect": { + "x": 221.2026666666667, + "y": 644, + "width": 40.333333333333314, + "height": 46 + }, + "label": "H", + "parentIndex": 104, + "hittable": false, + "depth": 8, + "enabled": true, + "type": "Key", + "ref": "e121" + }, + { + "enabled": true, + "index": 121, + "type": "Key", + "parentIndex": 104, + "label": "J", + "hittable": false, + "rect": { + "x": 261.536, + "y": 644, + "width": 40, + "height": 46 + }, + "depth": 8, + "ref": "e122" + }, + { + "rect": { + "x": 301.536, + "y": 644, + "width": 40.333333333333314, + "height": 46 + }, + "type": "Key", + "label": "K", + "depth": 8, + "index": 122, + "enabled": true, + "parentIndex": 104, + "hittable": false, + "ref": "e123" + }, + { + "parentIndex": 104, + "hittable": false, + "index": 123, + "enabled": true, + "type": "Key", + "rect": { + "x": 341.8693333333333, + "y": 644, + "width": 40.333333333333314, + "height": 46 + }, + "depth": 8, + "label": "L", + "ref": "e124" + }, + { + "enabled": true, + "type": "Button", + "selected": true, + "label": "shift", + "hittable": false, + "parentIndex": 104, + "identifier": "shift", + "depth": 8, + "rect": { + "x": 0, + "y": 698, + "width": 51.333333333333336, + "height": 46 + }, + "index": 124, + "ref": "e125" + }, + { + "parentIndex": 104, + "label": "Z", + "enabled": true, + "rect": { + "x": 60, + "y": 698, + "width": 40.33333333333334, + "height": 46 + }, + "hittable": false, + "depth": 8, + "type": "Key", + "index": 125, + "ref": "e126" + }, + { + "hittable": false, + "type": "Key", + "enabled": true, + "depth": 8, + "rect": { + "x": 100.33333333333334, + "y": 698, + "width": 40, + "height": 46 + }, + "label": "X", + "index": 126, + "parentIndex": 104, + "ref": "e127" + }, + { + "rect": { + "x": 140.33333333333334, + "y": 698, + "width": 40.33333333333334, + "height": 46 + }, + "hittable": false, + "depth": 8, + "index": 127, + "enabled": true, + "label": "C", + "type": "Key", + "parentIndex": 104, + "ref": "e128" + }, + { + "index": 128, + "enabled": true, + "type": "Key", + "depth": 8, + "label": "V", + "hittable": false, + "rect": { + "x": 181.2026666666667, + "y": 698, + "width": 40, + "height": 46 + }, + "parentIndex": 104, + "ref": "e129" + }, + { + "type": "Key", + "depth": 8, + "enabled": true, + "parentIndex": 104, + "rect": { + "x": 221.2026666666667, + "y": 698, + "width": 40.333333333333314, + "height": 46 + }, + "index": 129, + "hittable": false, + "label": "B", + "ref": "e130" + }, + { + "parentIndex": 104, + "type": "Key", + "hittable": false, + "label": "N", + "rect": { + "x": 261.536, + "y": 698, + "width": 40, + "height": 46 + }, + "enabled": true, + "index": 130, + "depth": 8, + "ref": "e131" + }, + { + "parentIndex": 104, + "type": "Key", + "rect": { + "x": 301.536, + "y": 698, + "width": 40.333333333333314, + "height": 46 + }, + "hittable": false, + "index": 131, + "depth": 8, + "label": "M", + "enabled": true, + "ref": "e132" + }, + { + "enabled": true, + "type": "Key", + "index": 132, + "depth": 8, + "rect": { + "x": 350.42133333333334, + "y": 698, + "width": 51.333333333333314, + "height": 46 + }, + "parentIndex": 104, + "identifier": "delete", + "hittable": false, + "label": "delete", + "ref": "e133" + }, + { + "index": 133, + "identifier": "more", + "label": "numbers", + "rect": { + "x": 0, + "y": 752, + "width": 101, + "height": 46 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "ref": "e134" + }, + { + "hittable": false, + "label": "space", + "type": "Key", + "depth": 8, + "identifier": "space", + "parentIndex": 104, + "enabled": true, + "rect": { + "x": 100.33333333333334, + "y": 752, + "width": 201.33333333333334, + "height": 46 + }, + "index": 134, + "ref": "e135" + }, + { + "parentIndex": 104, + "enabled": true, + "index": 135, + "depth": 8, + "type": "Button", + "identifier": "Return", + "label": "return", + "rect": { + "x": 301.6666666666667, + "y": 752, + "width": 100.33333333333331, + "height": 46 + }, + "hittable": false, + "ref": "e136" + }, + { + "index": 136, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "y": 583, + "width": 402, + "height": 291 + }, + "depth": 4, + "type": "Other", + "label": "Emoji", + "parentIndex": 81, + "ref": "e137" + }, + { + "depth": 5, + "type": "Button", + "parentIndex": 136, + "hittable": true, + "label": "Emoji", + "rect": { + "x": 8.47726568115926, + "y": 805.6989567998571, + "width": 68.0852958475086, + "height": 68.73516393505099 + }, + "index": 137, + "enabled": true, + "ref": "e138" + }, + { + "hittable": false, + "rect": { + "x": 8.47726568115926, + "y": 805.6989567998571, + "width": 0, + "height": 0 + }, + "type": "StaticText", + "enabled": true, + "parentIndex": 137, + "depth": 6, + "index": 138, + "ref": "e139" + }, + { + "type": "Button", + "identifier": "dictation", + "parentIndex": 136, + "index": 139, + "enabled": true, + "hittable": false, + "label": "Dictate", + "depth": 5, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099 + }, + "ref": "e140" + }, + { + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 0, + "height": 0 + }, + "hittable": false, + "index": 140, + "type": "StaticText", + "enabled": true, + "parentIndex": 139, + "depth": 6, + "ref": "e141" + }, + { + "hittable": true, + "parentIndex": 136, + "depth": 5, + "identifier": "dictation", + "enabled": true, + "type": "Button", + "label": "Dictate", + "index": 141, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 68.08529584750863, + "height": 68.73516393505099 + }, + "ref": "e142" + }, + { + "depth": 6, + "hittable": false, + "parentIndex": 141, + "type": "StaticText", + "enabled": true, + "index": 142, + "rect": { + "x": 325.43743847133214, + "y": 805.3656234665239, + "width": 0, + "height": 0 + }, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 141, + "p50Ms": 140, + "p95Ms": 1111, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 141 + } + } + }, + "refsGeneration": 776205 + } +} diff --git a/scroll-regression/ios/new-workspace-clearing.json b/scroll-regression/ios/new-workspace-clearing.json new file mode 100644 index 0000000000..8bd9c56e94 --- /dev/null +++ b/scroll-regression/ios/new-workspace-clearing.json @@ -0,0 +1,2284 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Application", + "label": "Paseo Debug", + "hittable": true, + "depth": 0, + "index": 0, + "ref": "e1" + }, + { + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "type": "Window", + "parentIndex": 0, + "hittable": false, + "depth": 1, + "index": 1, + "ref": "e2" + }, + { + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "index": 2, + "parentIndex": 1, + "hittable": false, + "type": "Other", + "depth": 2, + "ref": "e3" + }, + { + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 3, + "parentIndex": 2, + "hittable": false, + "type": "Other", + "depth": 3, + "ref": "e4" + }, + { + "parentIndex": 3, + "enabled": true, + "depth": 4, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 4, + "ref": "e5" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 4, + "index": 5, + "depth": 5, + "type": "Other", + "hittable": false, + "ref": "e6" + }, + { + "parentIndex": 5, + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 6, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e7" + }, + { + "parentIndex": 6, + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 7, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e8" + }, + { + "index": 8, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 7, + "depth": 8, + "type": "Other", + "hittable": false, + "ref": "e9" + }, + { + "enabled": true, + "index": 9, + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "parentIndex": 8, + "ref": "e10" + }, + { + "enabled": true, + "index": 10, + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "parentIndex": 8, + "ref": "e11" + }, + { + "parentIndex": 10, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 10, + "type": "Other", + "index": 11, + "hittable": false, + "ref": "e12" + }, + { + "type": "Other", + "parentIndex": 10, + "index": 12, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 10, + "enabled": true, + "ref": "e13" + }, + { + "hittable": false, + "depth": 11, + "parentIndex": 12, + "enabled": true, + "index": 13, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e14" + }, + { + "parentIndex": 12, + "index": 14, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 11, + "ref": "e15" + }, + { + "enabled": true, + "hittable": false, + "depth": 12, + "parentIndex": 14, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 15, + "ref": "e16" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 15, + "index": 16, + "enabled": true, + "hittable": false, + "depth": 13, + "ref": "e17" + }, + { + "index": 17, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 14, + "hittable": false, + "parentIndex": 16, + "ref": "e18" + }, + { + "hittable": false, + "label": "Open menu", + "parentIndex": 17, + "enabled": true, + "depth": 15, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 18, + "type": "Other", + "ref": "e19" + }, + { + "label": "Open menu", + "depth": 16, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "index": 19, + "parentIndex": 18, + "hittable": false, + "ref": "e20" + }, + { + "type": "Other", + "hittable": false, + "index": 20, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "depth": 17, + "label": "Open menu", + "parentIndex": 19, + "ref": "e21" + }, + { + "type": "Other", + "hittable": false, + "index": 21, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 126 + }, + "identifier": "composer-dock-header", + "depth": 18, + "label": "Open menu", + "parentIndex": 20, + "ref": "e22" + }, + { + "type": "Other", + "enabled": true, + "depth": 19, + "parentIndex": 21, + "index": 22, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 70, + "height": 56 + }, + "ref": "e23" + }, + { + "rect": { + "width": 32, + "x": 8, + "y": 81.6666669845581, + "height": 32 + }, + "hittable": false, + "index": 23, + "parentIndex": 21, + "depth": 19, + "enabled": true, + "label": "Open menu", + "type": "Button", + "identifier": "menu-button", + "ref": "e24" + }, + { + "rect": { + "width": 16, + "x": 16, + "y": 91.6666669845581, + "height": 12 + }, + "hittable": false, + "index": 24, + "parentIndex": 23, + "enabled": true, + "type": "Other", + "depth": 20, + "ref": "e25" + }, + { + "parentIndex": 24, + "rect": { + "width": 16, + "x": 16, + "y": 91.6666669845581, + "height": 1.3333358764648438 + }, + "type": "Other", + "hittable": false, + "depth": 21, + "index": 25, + "enabled": true, + "ref": "e26" + }, + { + "rect": { + "width": 16, + "x": 16, + "y": 97.00000047683716, + "height": 1.6666717529296875 + }, + "type": "Other", + "hittable": false, + "index": 26, + "depth": 21, + "parentIndex": 24, + "enabled": true, + "ref": "e27" + }, + { + "type": "Other", + "hittable": false, + "depth": 21, + "rect": { + "width": 8, + "x": 16, + "y": 102.33333396911621, + "height": 1.6666641235351562 + }, + "index": 27, + "parentIndex": 24, + "enabled": true, + "ref": "e28" + }, + { + "depth": 18, + "parentIndex": 20, + "hittable": false, + "index": 28, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "ref": "e29" + }, + { + "parentIndex": 20, + "rect": { + "width": 402, + "x": 0, + "y": 126, + "height": 748 + }, + "enabled": true, + "index": 29, + "identifier": "composer-viewport", + "label": "New workspace", + "hittable": false, + "type": "Other", + "depth": 18, + "ref": "e30" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": -176, + "height": 748 + }, + "parentIndex": 29, + "hittable": false, + "type": "Other", + "index": 30, + "label": "New workspace", + "depth": 19, + "enabled": true, + "ref": "e31" + }, + { + "index": 31, + "rect": { + "width": 402, + "x": 0, + "y": -176, + "height": 539.3333129882812 + }, + "hittable": false, + "identifier": "composer-dock-content", + "parentIndex": 30, + "type": "Other", + "enabled": true, + "depth": 20, + "label": "New workspace", + "ref": "e32" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": -176, + "height": 539.3333129882812 + }, + "depth": 21, + "hittable": false, + "parentIndex": 31, + "enabled": true, + "index": 32, + "type": "Other", + "ref": "e33" + }, + { + "depth": 21, + "type": "Other", + "enabled": true, + "index": 33, + "parentIndex": 31, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 138, + "height": 25.333343505859375 + }, + "label": "New workspace", + "ref": "e34" + }, + { + "label": "New workspace", + "parentIndex": 33, + "hittable": false, + "type": "StaticText", + "enabled": true, + "depth": 22, + "rect": { + "width": 362, + "x": 24, + "y": 138, + "height": 25.333343505859375 + }, + "index": 34, + "ref": "e35" + }, + { + "enabled": true, + "rect": { + "width": 362, + "x": 24, + "y": 138, + "height": 25.333343505859375 + }, + "depth": 23, + "parentIndex": 34, + "type": "StaticText", + "index": 35, + "label": "New workspace", + "hittable": false, + "ref": "e36" + }, + { + "type": "Other", + "parentIndex": 31, + "index": 36, + "rect": { + "width": 402, + "x": 0, + "y": 195.33334350585938, + "height": 135.99996948242188 + }, + "hittable": false, + "depth": 21, + "enabled": true, + "identifier": "new-workspace-ref-picker-row", + "ref": "e37" + }, + { + "identifier": "new-workspace-project-picker-trigger", + "rect": { + "width": 238.6666717529297, + "x": 16, + "y": 195.33334350585938, + "height": 28 + }, + "enabled": true, + "label": "Workspace project", + "parentIndex": 31, + "index": 37, + "hittable": false, + "depth": 21, + "type": "Button", + "ref": "e38" + }, + { + "type": "Other", + "parentIndex": 37, + "enabled": true, + "index": 38, + "hittable": false, + "rect": { + "width": 16, + "x": 24, + "y": 201.33334350585938, + "height": 16 + }, + "depth": 22, + "ref": "e39" + }, + { + "label": "C", + "hittable": false, + "parentIndex": 37, + "enabled": true, + "type": "StaticText", + "depth": 22, + "rect": { + "width": 7.666667938232422, + "x": 28, + "y": 203.33334350585938, + "height": 12 + }, + "index": 39, + "ref": "e40" + }, + { + "label": "C", + "depth": 23, + "type": "StaticText", + "hittable": false, + "rect": { + "width": 7.666667938232422, + "x": 28, + "y": 203.33334350585938, + "height": 12 + }, + "enabled": true, + "index": 40, + "parentIndex": 39, + "ref": "e41" + }, + { + "identifier": "workspace-create-isolation-trigger", + "depth": 21, + "enabled": true, + "rect": { + "width": 90.33333587646484, + "x": 16, + "y": 231.33334350585938, + "height": 28 + }, + "index": 41, + "label": "Workspace isolation", + "type": "Button", + "hittable": false, + "parentIndex": 31, + "ref": "e42" + }, + { + "hittable": false, + "index": 42, + "depth": 22, + "parentIndex": 41, + "enabled": true, + "type": "Other", + "rect": { + "width": 14, + "x": 84.33333206176758, + "y": 239.33334350585938, + "height": 14 + }, + "ref": "e43" + }, + { + "hittable": false, + "index": 43, + "depth": 23, + "parentIndex": 42, + "enabled": true, + "type": "Other", + "rect": { + "width": 14, + "x": 84.33333206176758, + "y": 239.33334350585938, + "height": 14 + }, + "ref": "e44" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 43, + "rect": { + "width": 8.166666666666657, + "x": 87.24999872843425, + "y": 244.00001017252603, + "height": 4.666666666666686 + }, + "depth": 24, + "index": 44, + "type": "Other", + "ref": "e45" + }, + { + "enabled": true, + "depth": 25, + "hittable": false, + "type": "Other", + "index": 45, + "rect": { + "width": 8.166666666666671, + "x": 87.24999872843425, + "y": 244.00001017252606, + "height": 4.666666666666657 + }, + "parentIndex": 44, + "ref": "e46" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 86.66666412353516, + "x": 16, + "y": 267.3333435058594, + "height": 28 + }, + "enabled": true, + "index": 46, + "depth": 21, + "parentIndex": 31, + "label": "Choose what to launch", + "ref": "e47" + }, + { + "hittable": false, + "parentIndex": 46, + "depth": 22, + "type": "Button", + "index": 47, + "rect": { + "width": 86.66666412353516, + "x": 16, + "y": 267.3333435058594, + "height": 28 + }, + "enabled": true, + "label": "Choose what to launch", + "identifier": "new-workspace-launch-trigger", + "ref": "e48" + }, + { + "depth": 21, + "parentIndex": 31, + "index": 48, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 303.3333435058594, + "height": 28 + }, + "type": "Other", + "hittable": false, + "ref": "e49" + }, + { + "identifier": "composer-viewport-content", + "type": "Other", + "enabled": true, + "label": "Message agent...", + "hittable": false, + "depth": 20, + "rect": { + "width": 402, + "x": 0, + "y": 363.33331298828125, + "height": 208.66668701171875 + }, + "index": 49, + "parentIndex": 30, + "ref": "e50" + }, + { + "type": "Other", + "rect": { + "width": 370, + "x": 16, + "y": 363.33331298828125, + "height": 158.66668701171875 + }, + "identifier": "message-input-root", + "depth": 21, + "index": 50, + "enabled": true, + "hittable": false, + "parentIndex": 49, + "ref": "e51" + }, + { + "parentIndex": 49, + "type": "Other", + "enabled": true, + "depth": 21, + "rect": { + "width": 370, + "x": 16, + "y": 363.33331298828125, + "height": 158.66668701171875 + }, + "index": 51, + "hittable": false, + "ref": "e52" + }, + { + "enabled": true, + "rect": { + "width": 344, + "x": 29, + "y": 372.33331298828125, + "height": 100.66668701171875 + }, + "index": 52, + "hittable": false, + "parentIndex": 49, + "depth": 21, + "type": "Other", + "label": "Message agent...", + "ref": "e53" + }, + { + "parentIndex": 52, + "rect": { + "width": 344, + "x": 29, + "y": 372.33331298828125, + "height": 100.66668701171875 + }, + "label": "Message agent...", + "index": 53, + "type": "TextView", + "enabled": true, + "value": "x\nseventeen\neighteen\nnineteen\ntwenty", + "hittable": false, + "depth": 22, + "ref": "e54" + }, + { + "value": "0%", + "rect": { + "width": 30, + "x": 340, + "y": 372.33331298828125, + "height": 100.66668701171875 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "label": "Vertical scroll bar, 2 pages", + "depth": 23, + "parentIndex": 53, + "index": 54, + "ref": "e55" + }, + { + "rect": { + "width": 3, + "x": 367, + "y": 375.33331298828125, + "height": 171 + }, + "index": 55, + "hittable": false, + "parentIndex": 54, + "type": "Other", + "depth": 24, + "enabled": true, + "ref": "e56" + }, + { + "label": "Horizontal scroll bar, 1 page", + "index": 56, + "rect": { + "width": 344, + "x": 29, + "y": 439.9999796549479, + "height": 30 + }, + "enabled": true, + "type": "Other", + "depth": 23, + "value": "0%", + "hittable": false, + "parentIndex": 53, + "ref": "e57" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 56, + "index": 57, + "depth": 24, + "rect": { + "width": 338, + "x": 32, + "y": 466.9999796549479, + "height": 3 + }, + "ref": "e58" + }, + { + "type": "Button", + "depth": 21, + "index": 58, + "identifier": "message-input-attach-button", + "parentIndex": 49, + "label": "Add attachment", + "rect": { + "width": 28, + "x": 23, + "y": 484.9999771118164, + "height": 28 + }, + "enabled": true, + "hittable": false, + "ref": "e59" + }, + { + "type": "Other", + "index": 59, + "hittable": false, + "rect": { + "width": 28, + "x": 23, + "y": 484.9999771118164, + "height": 28 + }, + "parentIndex": 58, + "depth": 22, + "enabled": true, + "ref": "e60" + }, + { + "rect": { + "width": 20, + "x": 27, + "y": 488.9999771118164, + "height": 20 + }, + "enabled": true, + "index": 60, + "hittable": false, + "depth": 23, + "parentIndex": 59, + "type": "Other", + "ref": "e61" + }, + { + "hittable": false, + "type": "Other", + "depth": 24, + "index": 61, + "parentIndex": 60, + "enabled": true, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 492.3333104451497, + "height": 13.333333333333371 + }, + "ref": "e62" + }, + { + "parentIndex": 61, + "hittable": false, + "depth": 25, + "index": 62, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 498.16664377848304, + "height": 1.6666666666666856 + }, + "enabled": true, + "type": "Other", + "ref": "e63" + }, + { + "parentIndex": 61, + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "y": 492.3333104451498, + "height": 13.333333333333314 + }, + "type": "Other", + "depth": 25, + "hittable": false, + "enabled": true, + "index": 63, + "ref": "e64" + }, + { + "rect": { + "width": 264, + "x": 51, + "y": 484.9999771118164, + "height": 28 + }, + "hittable": false, + "parentIndex": 49, + "index": 64, + "label": "Select model (Select model)", + "depth": 21, + "type": "Other", + "enabled": true, + "ref": "e65" + }, + { + "index": 65, + "hittable": false, + "type": "Button", + "label": "Select model (Select model)", + "identifier": "combined-model-selector", + "rect": { + "width": 105.66667175292969, + "x": 51, + "y": 484.9999771118164, + "height": 28 + }, + "enabled": true, + "depth": 22, + "parentIndex": 64, + "ref": "e66" + }, + { + "type": "StaticText", + "parentIndex": 65, + "label": "Select model", + "index": 66, + "rect": { + "width": 89.66667175292969, + "x": 59, + "y": 489.9999771118164, + "height": 18 + }, + "hittable": false, + "enabled": true, + "depth": 23, + "ref": "e67" + }, + { + "hittable": false, + "depth": 24, + "rect": { + "width": 89.66667175292969, + "x": 59, + "y": 489.9999771118164, + "height": 18 + }, + "index": 67, + "parentIndex": 66, + "label": "Select model", + "type": "StaticText", + "enabled": true, + "ref": "e68" + }, + { + "depth": 21, + "parentIndex": 49, + "type": "Button", + "label": "Start dictation", + "enabled": true, + "index": 68, + "hittable": false, + "rect": { + "width": 28, + "x": 315, + "y": 484.9999771118164, + "height": 28 + }, + "ref": "e69" + }, + { + "index": 69, + "label": "Create", + "parentIndex": 49, + "depth": 21, + "identifier": "workspace-create-submit", + "hittable": false, + "rect": { + "width": 28, + "x": 351, + "y": 484.9999771118164, + "height": 28 + }, + "type": "Button", + "enabled": true, + "ref": "e70" + }, + { + "index": 70, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 12, + "hittable": false, + "enabled": true, + "depth": 11, + "ref": "e71" + }, + { + "index": 71, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 6, + "depth": 7, + "ref": "e72" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 71, + "type": "Other", + "depth": 8, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 72, + "ref": "e73" + }, + { + "hittable": false, + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 72, + "index": 73, + "enabled": true, + "ref": "e74" + }, + { + "depth": 1, + "index": 74, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Window", + "parentIndex": 0, + "ref": "e75" + }, + { + "depth": 2, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 74, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 75, + "ref": "e76" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 76, + "hittable": false, + "depth": 3, + "enabled": true, + "parentIndex": 75, + "type": "Other", + "ref": "e77" + }, + { + "parentIndex": 75, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "hittable": false, + "depth": 3, + "enabled": true, + "index": 77, + "ref": "e78" + }, + { + "type": "Other", + "parentIndex": 77, + "depth": 4, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 278 + }, + "enabled": true, + "index": 78, + "ref": "e79" + }, + { + "enabled": true, + "type": "Window", + "label": "Emoji", + "index": 79, + "parentIndex": 0, + "depth": 1, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": true, + "ref": "e80" + }, + { + "depth": 2, + "enabled": true, + "index": 80, + "type": "Other", + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "label": "Emoji", + "parentIndex": 79, + "ref": "e81" + }, + { + "parentIndex": 80, + "index": 81, + "label": "Emoji", + "enabled": true, + "depth": 3, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "hittable": true, + "ref": "e82" + }, + { + "hittable": false, + "index": 82, + "type": "Other", + "depth": 4, + "parentIndex": 81, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e83" + }, + { + "enabled": true, + "type": "Other", + "depth": 5, + "index": 83, + "hittable": false, + "parentIndex": 82, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e84" + }, + { + "parentIndex": 83, + "enabled": true, + "hittable": false, + "depth": 6, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 84, + "ref": "e85" + }, + { + "label": "Typing Predictions", + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "identifier": "SystemInputAssistantView", + "enabled": true, + "parentIndex": 81, + "type": "Other", + "index": 85, + "depth": 4, + "ref": "e86" + }, + { + "hittable": true, + "enabled": true, + "index": 86, + "depth": 5, + "parentIndex": 85, + "type": "Other", + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e87" + }, + { + "type": "Other", + "enabled": true, + "label": "Typing Predictions", + "depth": 6, + "hittable": true, + "identifier": "CenterPageView", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 87, + "parentIndex": 86, + "ref": "e88" + }, + { + "depth": 7, + "hittable": false, + "parentIndex": 87, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": -62, + "height": 1245 + }, + "type": "Other", + "index": 88, + "ref": "e89" + }, + { + "index": 89, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 8, + "type": "ScrollView", + "enabled": true, + "hittable": false, + "parentIndex": 88, + "ref": "e90" + }, + { + "depth": 7, + "type": "Other", + "index": 90, + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "parentIndex": 87, + "enabled": true, + "hittable": true, + "ref": "e91" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "index": 91, + "hittable": true, + "depth": 8, + "label": "Typing Predictions", + "type": "Other", + "parentIndex": 90, + "ref": "e92" + }, + { + "enabled": true, + "depth": 9, + "parentIndex": 91, + "label": "can", + "index": 92, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "hittable": true, + "ref": "e93" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 93, + "hittable": true, + "label": "can", + "parentIndex": 92, + "enabled": true, + "depth": 10, + "type": "Other", + "ref": "e94" + }, + { + "type": "Other", + "parentIndex": 93, + "rect": { + "width": 134, + "x": 0, + "y": 538, + "height": 45 + }, + "label": "can", + "index": 94, + "hittable": true, + "enabled": true, + "depth": 11, + "ref": "e95" + }, + { + "rect": { + "width": 134, + "x": 134, + "y": 538, + "height": 45 + }, + "index": 95, + "hittable": true, + "enabled": true, + "parentIndex": 93, + "type": "Other", + "depth": 11, + "ref": "e96" + }, + { + "rect": { + "width": 134, + "x": 268, + "y": 538, + "height": 45 + }, + "index": 96, + "hittable": true, + "enabled": true, + "parentIndex": 93, + "depth": 11, + "type": "Other", + "ref": "e97" + }, + { + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 97, + "hittable": false, + "depth": 4, + "enabled": true, + "parentIndex": 81, + "ref": "e98" + }, + { + "depth": 5, + "index": 98, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "enabled": true, + "parentIndex": 97, + "ref": "e99" + }, + { + "type": "Other", + "enabled": true, + "index": 99, + "parentIndex": 98, + "hittable": false, + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "ref": "e100" + }, + { + "index": 100, + "parentIndex": 99, + "depth": 7, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "hittable": false, + "ref": "e101" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "enabled": true, + "label": "q", + "depth": 4, + "type": "Other", + "index": 101, + "parentIndex": 81, + "hittable": false, + "ref": "e102" + }, + { + "label": "q", + "type": "Keyboard", + "hittable": false, + "index": 102, + "parentIndex": 101, + "enabled": true, + "depth": 5, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "ref": "e103" + }, + { + "enabled": true, + "label": "q", + "depth": 6, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "parentIndex": 102, + "type": "Other", + "index": 103, + "ref": "e104" + }, + { + "index": 104, + "identifier": "UIKeyboardLayoutStar Preview", + "label": "q", + "type": "Other", + "depth": 7, + "hittable": false, + "parentIndex": 103, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "enabled": true, + "ref": "e105" + }, + { + "index": 105, + "label": "q", + "type": "Key", + "rect": { + "width": 40.333333333333336, + "x": 0, + "y": 590, + "height": 46 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "hittable": false, + "ref": "e106" + }, + { + "index": 106, + "hittable": false, + "type": "Key", + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 590, + "height": 46 + }, + "enabled": true, + "label": "w", + "depth": 8, + "parentIndex": 104, + "ref": "e107" + }, + { + "index": 107, + "enabled": true, + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 590, + "height": 46 + }, + "hittable": false, + "depth": 8, + "type": "Key", + "label": "e", + "parentIndex": 104, + "ref": "e108" + }, + { + "label": "r", + "rect": { + "width": 40, + "x": 120.66666666666669, + "y": 590, + "height": 46 + }, + "type": "Key", + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 104, + "index": 108, + "ref": "e109" + }, + { + "parentIndex": 104, + "label": "t", + "hittable": false, + "depth": 8, + "index": 109, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 590, + "height": 46 + }, + "enabled": true, + "ref": "e110" + }, + { + "enabled": true, + "parentIndex": 104, + "depth": 8, + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 590, + "height": 46 + }, + "hittable": false, + "index": 110, + "label": "y", + "type": "Key", + "ref": "e111" + }, + { + "label": "u", + "parentIndex": 104, + "index": 111, + "rect": { + "width": 40, + "x": 241.33333333333337, + "y": 590, + "height": 46 + }, + "enabled": true, + "hittable": false, + "depth": 8, + "type": "Key", + "ref": "e112" + }, + { + "type": "Key", + "enabled": true, + "parentIndex": 104, + "label": "i", + "index": 112, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 590, + "height": 46 + }, + "hittable": false, + "ref": "e113" + }, + { + "rect": { + "width": 40, + "x": 321.6666666666667, + "y": 590, + "height": 46 + }, + "enabled": true, + "parentIndex": 104, + "type": "Key", + "label": "o", + "index": 113, + "hittable": false, + "depth": 8, + "ref": "e114" + }, + { + "hittable": false, + "depth": 8, + "label": "p", + "parentIndex": 104, + "index": 114, + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 590, + "height": 46 + }, + "enabled": true, + "type": "Key", + "ref": "e115" + }, + { + "parentIndex": 104, + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 644, + "height": 46 + }, + "hittable": false, + "index": 115, + "depth": 8, + "label": "a", + "ref": "e116" + }, + { + "depth": 8, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 644, + "height": 46 + }, + "hittable": false, + "parentIndex": 104, + "index": 116, + "enabled": true, + "label": "s", + "ref": "e117" + }, + { + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 644, + "height": 46 + }, + "label": "d", + "parentIndex": 104, + "depth": 8, + "type": "Key", + "enabled": true, + "hittable": false, + "index": 117, + "ref": "e118" + }, + { + "depth": 8, + "parentIndex": 104, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 644, + "height": 46 + }, + "hittable": false, + "label": "f", + "enabled": true, + "index": 118, + "ref": "e119" + }, + { + "enabled": true, + "type": "Key", + "index": 119, + "parentIndex": 104, + "label": "g", + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 644, + "height": 46 + }, + "hittable": false, + "depth": 8, + "ref": "e120" + }, + { + "depth": 8, + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 644, + "height": 46 + }, + "index": 120, + "label": "h", + "type": "Key", + "enabled": true, + "parentIndex": 104, + "ref": "e121" + }, + { + "enabled": true, + "index": 121, + "rect": { + "width": 40, + "x": 261.536, + "y": 644, + "height": 46 + }, + "hittable": false, + "label": "j", + "depth": 8, + "type": "Key", + "parentIndex": 104, + "ref": "e122" + }, + { + "index": 122, + "hittable": false, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 644, + "height": 46 + }, + "enabled": true, + "type": "Key", + "label": "k", + "parentIndex": 104, + "ref": "e123" + }, + { + "index": 123, + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 644, + "height": 46 + }, + "hittable": false, + "label": "l", + "parentIndex": 104, + "type": "Key", + "depth": 8, + "enabled": true, + "ref": "e124" + }, + { + "depth": 8, + "parentIndex": 104, + "identifier": "shift", + "label": "shift", + "rect": { + "width": 51.333333333333336, + "x": 0, + "y": 698, + "height": 46 + }, + "enabled": true, + "type": "Button", + "hittable": false, + "index": 124, + "ref": "e125" + }, + { + "label": "z", + "hittable": false, + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 698, + "height": 46 + }, + "parentIndex": 104, + "enabled": true, + "index": 125, + "type": "Key", + "depth": 8, + "ref": "e126" + }, + { + "index": 126, + "type": "Key", + "parentIndex": 104, + "depth": 8, + "label": "x", + "hittable": false, + "enabled": true, + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 698, + "height": 46 + }, + "ref": "e127" + }, + { + "parentIndex": 104, + "hittable": false, + "label": "c", + "depth": 8, + "index": 127, + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 698, + "height": 46 + }, + "enabled": true, + "type": "Key", + "ref": "e128" + }, + { + "type": "Key", + "enabled": true, + "index": 128, + "label": "v", + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 698, + "height": 46 + }, + "depth": 8, + "hittable": false, + "parentIndex": 104, + "ref": "e129" + }, + { + "label": "b", + "type": "Key", + "enabled": true, + "index": 129, + "depth": 8, + "parentIndex": 104, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 698, + "height": 46 + }, + "hittable": false, + "ref": "e130" + }, + { + "index": 130, + "label": "n", + "parentIndex": 104, + "rect": { + "width": 40, + "x": 261.536, + "y": 698, + "height": 46 + }, + "depth": 8, + "enabled": true, + "hittable": false, + "type": "Key", + "ref": "e131" + }, + { + "type": "Key", + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 698, + "height": 46 + }, + "label": "m", + "index": 131, + "parentIndex": 104, + "depth": 8, + "hittable": false, + "ref": "e132" + }, + { + "parentIndex": 104, + "depth": 8, + "identifier": "delete", + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 698, + "height": 46 + }, + "index": 132, + "type": "Key", + "label": "delete", + "hittable": false, + "enabled": true, + "ref": "e133" + }, + { + "type": "Key", + "depth": 8, + "enabled": true, + "label": "numbers", + "identifier": "more", + "rect": { + "width": 101, + "x": 0, + "y": 752, + "height": 46 + }, + "index": 133, + "parentIndex": 104, + "hittable": false, + "ref": "e134" + }, + { + "label": "space", + "enabled": true, + "type": "Key", + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 752, + "height": 46 + }, + "index": 134, + "hittable": false, + "identifier": "space", + "depth": 8, + "parentIndex": 104, + "ref": "e135" + }, + { + "parentIndex": 104, + "enabled": true, + "type": "Button", + "identifier": "Return", + "label": "return", + "index": 135, + "hittable": false, + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 752, + "height": 46 + }, + "depth": 8, + "ref": "e136" + }, + { + "label": "Emoji", + "type": "Other", + "hittable": true, + "parentIndex": 81, + "enabled": true, + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "index": 136, + "ref": "e137" + }, + { + "parentIndex": 136, + "depth": 5, + "index": 137, + "enabled": true, + "hittable": true, + "label": "Emoji", + "type": "Button", + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 68.73516393505099 + }, + "ref": "e138" + }, + { + "rect": { + "width": 0, + "x": 8.47726568115926, + "y": 805.6989567998571, + "height": 0 + }, + "type": "StaticText", + "hittable": false, + "depth": 6, + "parentIndex": 137, + "enabled": true, + "index": 138, + "ref": "e139" + }, + { + "identifier": "dictation", + "hittable": false, + "index": 139, + "type": "Button", + "parentIndex": 136, + "enabled": true, + "label": "Dictate", + "depth": 5, + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "ref": "e140" + }, + { + "index": 140, + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "hittable": false, + "enabled": true, + "depth": 6, + "parentIndex": 139, + "type": "StaticText", + "ref": "e141" + }, + { + "index": 141, + "parentIndex": 136, + "hittable": true, + "type": "Button", + "identifier": "dictation", + "label": "Dictate", + "enabled": true, + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "depth": 5, + "ref": "e142" + }, + { + "parentIndex": 141, + "rect": { + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239, + "height": 0 + }, + "index": 142, + "depth": 6, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 140, + "p50Ms": 140, + "p95Ms": 1111, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 140 + } + } + }, + "refsGeneration": 776204 + } +} diff --git a/scroll-regression/ios/new-workspace-content-dismissed.json b/scroll-regression/ios/new-workspace-content-dismissed.json new file mode 100644 index 0000000000..56f93b2b5f --- /dev/null +++ b/scroll-regression/ios/new-workspace-content-dismissed.json @@ -0,0 +1,2280 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "enabled": true, + "type": "Application", + "hittable": true, + "label": "Paseo Debug", + "index": 0, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 0, + "ref": "e1" + }, + { + "enabled": true, + "index": 1, + "depth": 1, + "parentIndex": 0, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Window", + "hittable": false, + "ref": "e2" + }, + { + "enabled": true, + "index": 2, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "hittable": false, + "depth": 2, + "parentIndex": 1, + "ref": "e3" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "hittable": false, + "depth": 3, + "index": 3, + "parentIndex": 2, + "ref": "e4" + }, + { + "hittable": false, + "parentIndex": 3, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "index": 4, + "depth": 4, + "type": "Other", + "ref": "e5" + }, + { + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "depth": 5, + "parentIndex": 4, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 5, + "ref": "e6" + }, + { + "hittable": false, + "type": "Other", + "depth": 6, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 5, + "index": 6, + "ref": "e7" + }, + { + "depth": 7, + "type": "Other", + "parentIndex": 6, + "hittable": false, + "index": 7, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "ref": "e8" + }, + { + "index": 8, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "parentIndex": 7, + "depth": 8, + "hittable": false, + "enabled": true, + "ref": "e9" + }, + { + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "depth": 9, + "type": "Other", + "hittable": false, + "index": 9, + "enabled": true, + "parentIndex": 8, + "ref": "e10" + }, + { + "depth": 9, + "enabled": true, + "index": 10, + "type": "Other", + "hittable": false, + "parentIndex": 8, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "ref": "e11" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 10, + "parentIndex": 10, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 11, + "ref": "e12" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "index": 12, + "hittable": false, + "parentIndex": 10, + "type": "Other", + "enabled": true, + "depth": 10, + "ref": "e13" + }, + { + "index": 13, + "hittable": false, + "type": "Other", + "parentIndex": 12, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 11, + "enabled": true, + "ref": "e14" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 12, + "depth": 11, + "index": 14, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "ref": "e15" + }, + { + "type": "Other", + "index": 15, + "depth": 12, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "parentIndex": 14, + "ref": "e16" + }, + { + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "hittable": false, + "index": 16, + "depth": 13, + "parentIndex": 15, + "type": "Other", + "enabled": true, + "ref": "e17" + }, + { + "parentIndex": 16, + "type": "Other", + "index": 17, + "hittable": false, + "depth": 14, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "ref": "e18" + }, + { + "hittable": false, + "parentIndex": 17, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 15, + "enabled": true, + "type": "Other", + "label": "Open menu", + "index": 18, + "ref": "e19" + }, + { + "label": "Open menu", + "type": "Other", + "index": 19, + "hittable": false, + "enabled": true, + "parentIndex": 18, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "depth": 16, + "ref": "e20" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "index": 20, + "depth": 17, + "label": "Open menu", + "enabled": true, + "parentIndex": 19, + "type": "Other", + "hittable": false, + "ref": "e21" + }, + { + "label": "Open menu", + "type": "Other", + "hittable": false, + "depth": 18, + "parentIndex": 20, + "index": 21, + "enabled": true, + "identifier": "composer-dock-header", + "rect": { + "x": 0, + "width": 402, + "height": 126, + "y": 0 + }, + "ref": "e22" + }, + { + "enabled": true, + "hittable": false, + "index": 22, + "type": "Other", + "depth": 19, + "parentIndex": 21, + "rect": { + "y": 70, + "width": 402, + "x": 0, + "height": 56 + }, + "ref": "e23" + }, + { + "depth": 19, + "index": 23, + "type": "Button", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 8, + "height": 32 + }, + "hittable": false, + "identifier": "menu-button", + "enabled": true, + "label": "Open menu", + "parentIndex": 21, + "ref": "e24" + }, + { + "type": "Other", + "depth": 20, + "hittable": false, + "enabled": true, + "index": 24, + "rect": { + "y": 91.6666669845581, + "width": 16, + "x": 16, + "height": 12 + }, + "parentIndex": 23, + "ref": "e25" + }, + { + "rect": { + "y": 91.6666669845581, + "width": 16, + "x": 16, + "height": 1.3333358764648438 + }, + "hittable": false, + "depth": 21, + "index": 25, + "type": "Other", + "parentIndex": 24, + "enabled": true, + "ref": "e26" + }, + { + "rect": { + "y": 97.00000047683716, + "width": 16, + "x": 16, + "height": 1.6666717529296875 + }, + "index": 26, + "type": "Other", + "hittable": false, + "depth": 21, + "enabled": true, + "parentIndex": 24, + "ref": "e27" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": 102.33333396911621, + "width": 8, + "x": 16, + "height": 1.6666641235351562 + }, + "index": 27, + "depth": 21, + "parentIndex": 24, + "type": "Other", + "ref": "e28" + }, + { + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 18, + "type": "Other", + "index": 28, + "parentIndex": 20, + "hittable": false, + "ref": "e29" + }, + { + "depth": 18, + "parentIndex": 20, + "identifier": "composer-viewport", + "label": "New workspace", + "index": 29, + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 748 + }, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e30" + }, + { + "depth": 19, + "hittable": false, + "type": "Other", + "index": 30, + "enabled": true, + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 748 + }, + "parentIndex": 29, + "label": "New workspace", + "ref": "e31" + }, + { + "hittable": false, + "identifier": "composer-dock-content", + "type": "Other", + "enabled": true, + "label": "New workspace", + "depth": 20, + "index": 31, + "parentIndex": 30, + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 610 + }, + "ref": "e32" + }, + { + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 610 + }, + "depth": 21, + "type": "Other", + "index": 32, + "enabled": true, + "parentIndex": 31, + "hittable": false, + "ref": "e33" + }, + { + "parentIndex": 31, + "rect": { + "y": 510.6666564941406, + "width": 402, + "x": 0, + "height": 25.333343505859375 + }, + "depth": 21, + "index": 33, + "label": "New workspace", + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e34" + }, + { + "index": 34, + "label": "New workspace", + "hittable": false, + "rect": { + "y": 510.6666564941406, + "width": 362, + "x": 24, + "height": 25.333343505859375 + }, + "type": "StaticText", + "enabled": true, + "depth": 22, + "parentIndex": 33, + "ref": "e35" + }, + { + "rect": { + "y": 510.6666564941406, + "width": 362, + "x": 24, + "height": 25.333343505859375 + }, + "parentIndex": 34, + "hittable": false, + "depth": 23, + "type": "StaticText", + "label": "New workspace", + "index": 35, + "enabled": true, + "ref": "e36" + }, + { + "parentIndex": 31, + "index": 36, + "enabled": true, + "depth": 21, + "rect": { + "y": 568, + "width": 402, + "x": 0, + "height": 136 + }, + "identifier": "new-workspace-ref-picker-row", + "hittable": false, + "type": "Other", + "ref": "e37" + }, + { + "enabled": true, + "rect": { + "y": 568, + "width": 238.6666717529297, + "x": 16, + "height": 28 + }, + "type": "Button", + "identifier": "new-workspace-project-picker-trigger", + "hittable": false, + "label": "Workspace project", + "depth": 21, + "index": 37, + "parentIndex": 31, + "ref": "e38" + }, + { + "depth": 22, + "type": "Other", + "rect": { + "y": 574, + "width": 16, + "x": 24, + "height": 16 + }, + "enabled": true, + "hittable": false, + "index": 38, + "parentIndex": 37, + "ref": "e39" + }, + { + "hittable": false, + "enabled": true, + "type": "StaticText", + "rect": { + "y": 576, + "width": 7.666667938232422, + "x": 28, + "height": 12 + }, + "label": "C", + "index": 39, + "depth": 22, + "parentIndex": 37, + "ref": "e40" + }, + { + "index": 40, + "rect": { + "y": 576, + "width": 7.666667938232422, + "x": 28, + "height": 12 + }, + "type": "StaticText", + "label": "C", + "depth": 23, + "parentIndex": 39, + "hittable": false, + "enabled": true, + "ref": "e41" + }, + { + "hittable": false, + "index": 41, + "rect": { + "width": 90.33333587646484, + "y": 604, + "height": 28, + "x": 16 + }, + "type": "Button", + "label": "Workspace isolation", + "depth": 21, + "parentIndex": 31, + "enabled": true, + "identifier": "workspace-create-isolation-trigger", + "ref": "e42" + }, + { + "index": 42, + "rect": { + "width": 14, + "y": 612, + "height": 14, + "x": 84.33333206176758 + }, + "type": "Other", + "depth": 22, + "parentIndex": 41, + "hittable": false, + "enabled": true, + "ref": "e43" + }, + { + "index": 43, + "rect": { + "width": 14, + "y": 612, + "height": 14, + "x": 84.33333206176758 + }, + "type": "Other", + "depth": 23, + "parentIndex": 42, + "hittable": false, + "enabled": true, + "ref": "e44" + }, + { + "index": 44, + "rect": { + "width": 8.166666666666657, + "y": 616.6666666666666, + "height": 4.6666666666667425, + "x": 87.24999872843425 + }, + "type": "Other", + "depth": 24, + "parentIndex": 43, + "hittable": false, + "enabled": true, + "ref": "e45" + }, + { + "index": 45, + "rect": { + "width": 8.166666666666671, + "y": 616.6666666666667, + "height": 4.666666666666629, + "x": 87.24999872843425 + }, + "type": "Other", + "depth": 25, + "parentIndex": 44, + "hittable": false, + "enabled": true, + "ref": "e46" + }, + { + "index": 46, + "rect": { + "width": 86.66666412353516, + "y": 640, + "height": 28, + "x": 16 + }, + "type": "Other", + "label": "Choose what to launch", + "depth": 21, + "parentIndex": 31, + "hittable": false, + "enabled": true, + "ref": "e47" + }, + { + "hittable": false, + "index": 47, + "rect": { + "width": 86.66666412353516, + "y": 640, + "height": 28, + "x": 16 + }, + "type": "Button", + "label": "Choose what to launch", + "depth": 22, + "parentIndex": 46, + "enabled": true, + "identifier": "new-workspace-launch-trigger", + "ref": "e48" + }, + { + "index": 48, + "rect": { + "width": 402, + "y": 676, + "height": 28, + "x": 0 + }, + "type": "Other", + "depth": 21, + "parentIndex": 31, + "hittable": false, + "enabled": true, + "ref": "e49" + }, + { + "hittable": false, + "index": 49, + "rect": { + "width": 402, + "y": 736, + "height": 138, + "x": 0 + }, + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "depth": 20, + "parentIndex": 30, + "enabled": true, + "identifier": "composer-viewport-content", + "ref": "e50" + }, + { + "enabled": true, + "index": 50, + "rect": { + "width": 370, + "y": 736, + "height": 88, + "x": 16 + }, + "type": "Other", + "depth": 21, + "parentIndex": 49, + "hittable": false, + "identifier": "message-input-root", + "ref": "e51" + }, + { + "index": 51, + "rect": { + "width": 370, + "y": 736, + "height": 88, + "x": 16 + }, + "type": "Other", + "depth": 21, + "parentIndex": 49, + "hittable": false, + "enabled": true, + "ref": "e52" + }, + { + "index": 52, + "rect": { + "width": 344, + "y": 745, + "height": 30, + "x": 29 + }, + "type": "Other", + "label": "Message agent... Message, @files, /commands", + "depth": 21, + "parentIndex": 49, + "hittable": false, + "enabled": true, + "ref": "e53" + }, + { + "index": 53, + "rect": { + "width": 344, + "y": 745, + "height": 30, + "x": 29 + }, + "type": "TextView", + "label": "Message agent... Message, @files, /commands", + "depth": 22, + "parentIndex": 52, + "hittable": false, + "enabled": true, + "ref": "e54" + }, + { + "index": 54, + "value": "0%", + "rect": { + "width": 30, + "y": 745, + "height": 30, + "x": 340 + }, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 23, + "parentIndex": 53, + "enabled": true, + "hittable": false, + "ref": "e55" + }, + { + "index": 55, + "rect": { + "width": 3, + "y": 741, + "height": 31, + "x": 367 + }, + "type": "Other", + "depth": 24, + "parentIndex": 54, + "hittable": false, + "enabled": true, + "ref": "e56" + }, + { + "index": 56, + "value": "0%", + "rect": { + "width": 344, + "y": 757, + "height": 15, + "x": 29 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 23, + "parentIndex": 53, + "enabled": true, + "hittable": false, + "ref": "e57" + }, + { + "index": 57, + "rect": { + "width": 338, + "y": 769, + "height": 3, + "x": 32 + }, + "type": "Other", + "depth": 24, + "parentIndex": 56, + "hittable": false, + "enabled": true, + "ref": "e58" + }, + { + "hittable": false, + "index": 58, + "rect": { + "width": 28, + "y": 787, + "height": 28, + "x": 23 + }, + "type": "Button", + "label": "Add attachment", + "depth": 21, + "parentIndex": 49, + "enabled": true, + "identifier": "message-input-attach-button", + "ref": "e59" + }, + { + "index": 59, + "rect": { + "width": 28, + "y": 787, + "height": 28, + "x": 23 + }, + "type": "Other", + "depth": 22, + "parentIndex": 58, + "hittable": false, + "enabled": true, + "ref": "e60" + }, + { + "index": 60, + "rect": { + "width": 20, + "y": 791, + "height": 20, + "x": 27 + }, + "type": "Other", + "depth": 23, + "parentIndex": 59, + "hittable": false, + "enabled": true, + "ref": "e61" + }, + { + "index": 61, + "rect": { + "width": 13.333333333333332, + "y": 794.3333333333334, + "height": 13.333333333333258, + "x": 30.333333333333332 + }, + "type": "Other", + "depth": 24, + "parentIndex": 60, + "hittable": false, + "enabled": true, + "ref": "e62" + }, + { + "index": 62, + "rect": { + "width": 13.333333333333332, + "y": 800.1666666666666, + "height": 1.6666666666666288, + "x": 30.333333333333332 + }, + "type": "Other", + "depth": 25, + "parentIndex": 61, + "hittable": false, + "enabled": true, + "ref": "e63" + }, + { + "index": 63, + "rect": { + "width": 1.6666666666666643, + "y": 794.3333333333334, + "height": 13.333333333333371, + "x": 36.16666666666667 + }, + "type": "Other", + "depth": 25, + "parentIndex": 61, + "hittable": false, + "enabled": true, + "ref": "e64" + }, + { + "index": 64, + "rect": { + "width": 264, + "y": 787, + "height": 28, + "x": 51 + }, + "type": "Other", + "label": "Select model (Select model)", + "depth": 21, + "parentIndex": 49, + "hittable": false, + "enabled": true, + "ref": "e65" + }, + { + "hittable": false, + "index": 65, + "rect": { + "width": 105.66667175292969, + "y": 787, + "height": 28, + "x": 51 + }, + "type": "Button", + "label": "Select model (Select model)", + "depth": 22, + "parentIndex": 64, + "enabled": true, + "identifier": "combined-model-selector", + "ref": "e66" + }, + { + "index": 66, + "rect": { + "width": 89.66667175292969, + "y": 792, + "height": 18, + "x": 59 + }, + "type": "StaticText", + "label": "Select model", + "depth": 23, + "parentIndex": 65, + "hittable": false, + "enabled": true, + "ref": "e67" + }, + { + "index": 67, + "rect": { + "width": 89.66667175292969, + "y": 792, + "height": 18, + "x": 59 + }, + "type": "StaticText", + "label": "Select model", + "depth": 24, + "parentIndex": 66, + "hittable": false, + "enabled": true, + "ref": "e68" + }, + { + "index": 68, + "rect": { + "width": 28, + "y": 787, + "height": 28, + "x": 315 + }, + "type": "Button", + "label": "Start dictation", + "depth": 21, + "parentIndex": 49, + "hittable": false, + "enabled": true, + "ref": "e69" + }, + { + "hittable": false, + "index": 69, + "rect": { + "width": 28, + "y": 787, + "height": 28, + "x": 351 + }, + "type": "Button", + "label": "Create", + "depth": 21, + "parentIndex": 49, + "enabled": true, + "identifier": "workspace-create-submit", + "ref": "e70" + }, + { + "index": 70, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 11, + "parentIndex": 12, + "hittable": false, + "enabled": true, + "ref": "e71" + }, + { + "index": 71, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 7, + "parentIndex": 6, + "hittable": false, + "enabled": true, + "ref": "e72" + }, + { + "index": 72, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 8, + "parentIndex": 71, + "hittable": false, + "enabled": true, + "ref": "e73" + }, + { + "index": 73, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 9, + "parentIndex": 72, + "hittable": false, + "enabled": true, + "ref": "e74" + }, + { + "index": 74, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Window", + "depth": 1, + "parentIndex": 0, + "hittable": false, + "enabled": true, + "ref": "e75" + }, + { + "index": 75, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 2, + "parentIndex": 74, + "hittable": false, + "enabled": true, + "ref": "e76" + }, + { + "index": 76, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 3, + "parentIndex": 75, + "hittable": false, + "enabled": true, + "ref": "e77" + }, + { + "index": 77, + "rect": { + "width": 402, + "y": 874, + "height": 336, + "x": 0 + }, + "type": "Other", + "depth": 3, + "parentIndex": 75, + "hittable": false, + "enabled": true, + "ref": "e78" + }, + { + "index": 78, + "rect": { + "width": 402, + "y": 874, + "height": 278, + "x": 0 + }, + "type": "Other", + "depth": 4, + "parentIndex": 77, + "hittable": false, + "enabled": true, + "ref": "e79" + }, + { + "index": 79, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Window", + "label": "Emoji", + "depth": 1, + "parentIndex": 0, + "hittable": true, + "enabled": true, + "ref": "e80" + }, + { + "index": 80, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "label": "Emoji", + "depth": 2, + "parentIndex": 79, + "hittable": true, + "enabled": true, + "ref": "e81" + }, + { + "index": 81, + "rect": { + "width": 402, + "y": 874, + "height": 336, + "x": 0 + }, + "type": "Other", + "label": "Emoji", + "depth": 3, + "parentIndex": 80, + "hittable": false, + "enabled": true, + "ref": "e82" + }, + { + "index": 82, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 4, + "parentIndex": 81, + "hittable": false, + "enabled": true, + "ref": "e83" + }, + { + "index": 83, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 5, + "parentIndex": 82, + "hittable": false, + "enabled": true, + "ref": "e84" + }, + { + "index": 84, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 6, + "parentIndex": 83, + "hittable": false, + "enabled": true, + "ref": "e85" + }, + { + "hittable": false, + "index": 85, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "label": "Typing Predictions", + "depth": 4, + "parentIndex": 81, + "enabled": true, + "identifier": "SystemInputAssistantView", + "ref": "e86" + }, + { + "index": 86, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "label": "Typing Predictions", + "depth": 5, + "parentIndex": 85, + "hittable": false, + "enabled": true, + "ref": "e87" + }, + { + "hittable": false, + "index": 87, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "label": "Typing Predictions", + "depth": 6, + "parentIndex": 86, + "enabled": true, + "identifier": "CenterPageView", + "ref": "e88" + }, + { + "index": 88, + "rect": { + "width": 402, + "y": 274, + "height": 1245, + "x": 0 + }, + "type": "Other", + "depth": 7, + "parentIndex": 87, + "hittable": false, + "enabled": true, + "ref": "e89" + }, + { + "index": 89, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "ScrollView", + "depth": 8, + "parentIndex": 88, + "hittable": false, + "enabled": true, + "ref": "e90" + }, + { + "index": 90, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "label": "Typing Predictions", + "depth": 7, + "parentIndex": 87, + "hittable": false, + "enabled": true, + "ref": "e91" + }, + { + "index": 91, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "label": "Typing Predictions", + "depth": 8, + "parentIndex": 90, + "hittable": false, + "enabled": true, + "ref": "e92" + }, + { + "index": 92, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 9, + "parentIndex": 91, + "hittable": false, + "enabled": true, + "ref": "e93" + }, + { + "index": 93, + "rect": { + "width": 402, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 10, + "parentIndex": 92, + "hittable": false, + "enabled": true, + "ref": "e94" + }, + { + "index": 94, + "rect": { + "width": 134, + "y": 874, + "height": 45, + "x": 0 + }, + "type": "Other", + "depth": 11, + "parentIndex": 93, + "hittable": false, + "enabled": true, + "ref": "e95" + }, + { + "index": 95, + "rect": { + "width": 134, + "y": 874, + "height": 45, + "x": 134 + }, + "type": "Other", + "depth": 11, + "parentIndex": 93, + "hittable": false, + "enabled": true, + "ref": "e96" + }, + { + "index": 96, + "rect": { + "width": 134, + "y": 874, + "height": 45, + "x": 268 + }, + "type": "Other", + "depth": 11, + "parentIndex": 93, + "hittable": false, + "enabled": true, + "ref": "e97" + }, + { + "index": 97, + "rect": { + "width": 402, + "y": 919, + "height": 233, + "x": 0 + }, + "type": "Other", + "depth": 4, + "parentIndex": 81, + "hittable": false, + "enabled": true, + "ref": "e98" + }, + { + "index": 98, + "rect": { + "width": 402, + "y": 919, + "height": 291, + "x": 0 + }, + "type": "Other", + "depth": 5, + "parentIndex": 97, + "hittable": false, + "enabled": true, + "ref": "e99" + }, + { + "index": 99, + "rect": { + "width": 402, + "y": 919, + "height": 291, + "x": 0 + }, + "type": "Other", + "depth": 6, + "parentIndex": 98, + "hittable": false, + "enabled": true, + "ref": "e100" + }, + { + "index": 100, + "rect": { + "width": 402, + "y": 919, + "height": 291, + "x": 0 + }, + "type": "Other", + "depth": 7, + "parentIndex": 99, + "hittable": false, + "enabled": true, + "ref": "e101" + }, + { + "index": 101, + "rect": { + "width": 402, + "y": 919, + "height": 233, + "x": 0 + }, + "type": "Other", + "label": "q", + "depth": 4, + "parentIndex": 81, + "hittable": false, + "enabled": true, + "ref": "e102" + }, + { + "index": 102, + "rect": { + "width": 402, + "y": 919, + "height": 233, + "x": 0 + }, + "type": "Keyboard", + "label": "q", + "depth": 5, + "parentIndex": 101, + "hittable": false, + "enabled": true, + "ref": "e103" + }, + { + "index": 103, + "rect": { + "width": 402, + "y": 919, + "height": 233, + "x": 0 + }, + "type": "Other", + "label": "q", + "depth": 6, + "parentIndex": 102, + "hittable": false, + "enabled": true, + "ref": "e104" + }, + { + "hittable": false, + "index": 104, + "rect": { + "width": 402, + "y": 919, + "height": 233, + "x": 0 + }, + "type": "Other", + "label": "q", + "depth": 7, + "parentIndex": 103, + "enabled": true, + "identifier": "UIKeyboardLayoutStar Preview", + "ref": "e105" + }, + { + "index": 105, + "rect": { + "width": 40.333333333333336, + "y": 926, + "height": 46, + "x": 0 + }, + "type": "Key", + "label": "q", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e106" + }, + { + "index": 106, + "rect": { + "width": 40.00000000000001, + "y": 926, + "height": 46, + "x": 40.333333333333336 + }, + "type": "Key", + "label": "w", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e107" + }, + { + "index": 107, + "rect": { + "width": 40.33333333333334, + "y": 926, + "height": 46, + "x": 80.33333333333334 + }, + "type": "Key", + "label": "e", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e108" + }, + { + "index": 108, + "rect": { + "width": 40, + "y": 926, + "height": 46, + "x": 120.66666666666669 + }, + "type": "Key", + "label": "r", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e109" + }, + { + "index": 109, + "rect": { + "width": 40.33333333333334, + "y": 926, + "height": 46, + "x": 160.66666666666669 + }, + "type": "Key", + "label": "t", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e110" + }, + { + "index": 110, + "rect": { + "width": 40.33333333333334, + "y": 926, + "height": 46, + "x": 201.00000000000003 + }, + "type": "Key", + "label": "y", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e111" + }, + { + "index": 111, + "rect": { + "width": 40, + "y": 926, + "height": 46, + "x": 241.33333333333337 + }, + "type": "Key", + "label": "u", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e112" + }, + { + "index": 112, + "rect": { + "width": 40.333333333333314, + "y": 926, + "height": 46, + "x": 281.33333333333337 + }, + "type": "Key", + "label": "i", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e113" + }, + { + "index": 113, + "rect": { + "width": 40, + "y": 926, + "height": 46, + "x": 321.6666666666667 + }, + "type": "Key", + "label": "o", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e114" + }, + { + "index": 114, + "rect": { + "width": 40.333333333333314, + "y": 926, + "height": 46, + "x": 361.6666666666667 + }, + "type": "Key", + "label": "p", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e115" + }, + { + "index": 115, + "rect": { + "width": 40.33333333333333, + "y": 980, + "height": 46, + "x": 19.666666666666668 + }, + "type": "Key", + "label": "a", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e116" + }, + { + "index": 116, + "rect": { + "width": 40.33333333333334, + "y": 980, + "height": 46, + "x": 60 + }, + "type": "Key", + "label": "s", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e117" + }, + { + "index": 117, + "rect": { + "width": 40, + "y": 980, + "height": 46, + "x": 100.33333333333334 + }, + "type": "Key", + "label": "d", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e118" + }, + { + "index": 118, + "rect": { + "width": 40.33333333333334, + "y": 980, + "height": 46, + "x": 140.33333333333334 + }, + "type": "Key", + "label": "f", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e119" + }, + { + "index": 119, + "rect": { + "width": 40, + "y": 980, + "height": 46, + "x": 181.2026666666667 + }, + "type": "Key", + "label": "g", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e120" + }, + { + "index": 120, + "rect": { + "width": 40.333333333333314, + "y": 980, + "height": 46, + "x": 221.2026666666667 + }, + "type": "Key", + "label": "h", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e121" + }, + { + "index": 121, + "rect": { + "width": 40, + "y": 980, + "height": 46, + "x": 261.536 + }, + "type": "Key", + "label": "j", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e122" + }, + { + "index": 122, + "rect": { + "width": 40.333333333333314, + "y": 980, + "height": 46, + "x": 301.536 + }, + "type": "Key", + "label": "k", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e123" + }, + { + "index": 123, + "rect": { + "width": 40.333333333333314, + "y": 980, + "height": 46, + "x": 341.8693333333333 + }, + "type": "Key", + "label": "l", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e124" + }, + { + "hittable": false, + "index": 124, + "rect": { + "width": 51.333333333333336, + "y": 1034, + "height": 46, + "x": 0 + }, + "type": "Button", + "label": "shift", + "depth": 8, + "parentIndex": 104, + "enabled": true, + "identifier": "shift", + "ref": "e125" + }, + { + "index": 125, + "rect": { + "width": 40.33333333333334, + "y": 1034, + "height": 46, + "x": 60 + }, + "type": "Key", + "label": "z", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e126" + }, + { + "index": 126, + "rect": { + "width": 40, + "y": 1034, + "height": 46, + "x": 100.33333333333334 + }, + "type": "Key", + "label": "x", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e127" + }, + { + "index": 127, + "rect": { + "width": 40.33333333333334, + "y": 1034, + "height": 46, + "x": 140.33333333333334 + }, + "type": "Key", + "label": "c", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e128" + }, + { + "index": 128, + "rect": { + "width": 40, + "y": 1034, + "height": 46, + "x": 181.2026666666667 + }, + "type": "Key", + "label": "v", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e129" + }, + { + "index": 129, + "rect": { + "width": 40.333333333333314, + "y": 1034, + "height": 46, + "x": 221.2026666666667 + }, + "type": "Key", + "label": "b", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e130" + }, + { + "index": 130, + "rect": { + "width": 40, + "y": 1034, + "height": 46, + "x": 261.536 + }, + "type": "Key", + "label": "n", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e131" + }, + { + "index": 131, + "rect": { + "width": 40.333333333333314, + "y": 1034, + "height": 46, + "x": 301.536 + }, + "type": "Key", + "label": "m", + "depth": 8, + "parentIndex": 104, + "hittable": false, + "enabled": true, + "ref": "e132" + }, + { + "hittable": false, + "index": 132, + "rect": { + "width": 51.333333333333314, + "y": 1034, + "height": 46, + "x": 350.42133333333334 + }, + "type": "Key", + "label": "delete", + "depth": 8, + "parentIndex": 104, + "enabled": true, + "identifier": "delete", + "ref": "e133" + }, + { + "hittable": false, + "index": 133, + "rect": { + "width": 101, + "y": 1088, + "height": 46, + "x": 0 + }, + "type": "Key", + "label": "numbers", + "depth": 8, + "parentIndex": 104, + "enabled": true, + "identifier": "more", + "ref": "e134" + }, + { + "hittable": false, + "index": 134, + "rect": { + "width": 201.33333333333334, + "y": 1088, + "height": 46, + "x": 100.33333333333334 + }, + "type": "Key", + "label": "space", + "depth": 8, + "parentIndex": 104, + "enabled": true, + "identifier": "space", + "ref": "e135" + }, + { + "hittable": false, + "index": 135, + "rect": { + "width": 100.33333333333331, + "y": 1088, + "height": 46, + "x": 301.6666666666667 + }, + "type": "Button", + "label": "return", + "depth": 8, + "parentIndex": 104, + "enabled": true, + "identifier": "Return", + "ref": "e136" + }, + { + "index": 136, + "rect": { + "width": 402, + "y": 919, + "height": 291, + "x": 0 + }, + "type": "Other", + "label": "Emoji", + "depth": 4, + "parentIndex": 81, + "hittable": false, + "enabled": true, + "ref": "e137" + }, + { + "index": 137, + "rect": { + "width": 68.0852958475086, + "y": 1141.6989567998571, + "height": 68.73516393505088, + "x": 8.47726568115926 + }, + "type": "Button", + "label": "Emoji", + "depth": 5, + "parentIndex": 136, + "hittable": false, + "enabled": true, + "ref": "e138" + }, + { + "index": 138, + "rect": { + "width": 0, + "y": 1141.6989567998571, + "height": 0, + "x": 8.47726568115926 + }, + "type": "StaticText", + "depth": 6, + "parentIndex": 137, + "hittable": false, + "enabled": true, + "ref": "e139" + }, + { + "hittable": false, + "index": 139, + "rect": { + "width": 68.08529584750863, + "y": 1141.3656234665239, + "height": 68.7351639350511, + "x": 325.43743847133214 + }, + "type": "Button", + "label": "Dictate", + "depth": 5, + "parentIndex": 136, + "enabled": true, + "identifier": "dictation", + "ref": "e140" + }, + { + "index": 140, + "rect": { + "width": 0, + "y": 1141.3656234665239, + "height": 0, + "x": 325.43743847133214 + }, + "type": "StaticText", + "depth": 6, + "parentIndex": 139, + "hittable": false, + "enabled": true, + "ref": "e141" + }, + { + "hittable": false, + "index": 141, + "rect": { + "width": 68.08529584750863, + "y": 1141.3656234665239, + "height": 68.7351639350511, + "x": 325.43743847133214 + }, + "type": "Button", + "label": "Dictate", + "depth": 5, + "parentIndex": 136, + "enabled": true, + "identifier": "dictation", + "ref": "e142" + }, + { + "index": 142, + "rect": { + "width": 0, + "y": 1141.3656234665239, + "height": 0, + "x": 325.43743847133214 + }, + "type": "StaticText", + "depth": 6, + "parentIndex": 141, + "hittable": false, + "enabled": true, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 133, + "p50Ms": 143, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 133 + } + } + }, + "refsGeneration": 776197 + } +} diff --git a/scroll-regression/ios/new-workspace-empty-open.json b/scroll-regression/ios/new-workspace-empty-open.json new file mode 100644 index 0000000000..a9ef3148d6 --- /dev/null +++ b/scroll-regression/ios/new-workspace-empty-open.json @@ -0,0 +1,2286 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "enabled": true, + "hittable": true, + "label": "Paseo Debug", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "index": 0, + "depth": 0, + "ref": "e1" + }, + { + "hittable": false, + "index": 1, + "type": "Window", + "depth": 1, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 0, + "ref": "e2" + }, + { + "parentIndex": 1, + "type": "Other", + "index": 2, + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "hittable": false, + "depth": 2, + "enabled": true, + "ref": "e3" + }, + { + "type": "Other", + "index": 3, + "parentIndex": 2, + "hittable": false, + "depth": 3, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "enabled": true, + "ref": "e4" + }, + { + "depth": 4, + "enabled": true, + "parentIndex": 3, + "index": 4, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "type": "Other", + "ref": "e5" + }, + { + "index": 5, + "parentIndex": 4, + "hittable": false, + "depth": 5, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "ref": "e6" + }, + { + "depth": 6, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "parentIndex": 5, + "index": 6, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e7" + }, + { + "depth": 7, + "index": 7, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 6, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "ref": "e8" + }, + { + "depth": 8, + "type": "Other", + "parentIndex": 7, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "index": 8, + "enabled": true, + "hittable": false, + "ref": "e9" + }, + { + "index": 9, + "type": "Other", + "depth": 9, + "enabled": true, + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "parentIndex": 8, + "ref": "e10" + }, + { + "type": "Other", + "parentIndex": 8, + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "depth": 9, + "index": 10, + "ref": "e11" + }, + { + "index": 11, + "type": "Other", + "hittable": false, + "depth": 10, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "parentIndex": 10, + "enabled": true, + "ref": "e12" + }, + { + "parentIndex": 10, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "index": 12, + "depth": 10, + "ref": "e13" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 13, + "enabled": true, + "depth": 11, + "parentIndex": 12, + "ref": "e14" + }, + { + "type": "Other", + "index": 14, + "parentIndex": 12, + "enabled": true, + "depth": 11, + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "ref": "e15" + }, + { + "index": 15, + "hittable": false, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 14, + "type": "Other", + "enabled": true, + "depth": 12, + "ref": "e16" + }, + { + "hittable": false, + "enabled": true, + "depth": 13, + "type": "Other", + "index": 16, + "parentIndex": 15, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e17" + }, + { + "index": 17, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "hittable": false, + "parentIndex": 16, + "enabled": true, + "depth": 14, + "type": "Other", + "ref": "e18" + }, + { + "index": 18, + "type": "Other", + "depth": 15, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "label": "Open menu", + "parentIndex": 17, + "enabled": true, + "hittable": false, + "ref": "e19" + }, + { + "hittable": false, + "enabled": true, + "label": "Open menu", + "parentIndex": 18, + "index": 19, + "depth": 16, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "ref": "e20" + }, + { + "parentIndex": 19, + "enabled": true, + "label": "Open menu", + "index": 20, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "type": "Other", + "depth": 17, + "ref": "e21" + }, + { + "enabled": true, + "type": "Other", + "index": 21, + "depth": 18, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 126, + "x": 0 + }, + "label": "Open menu", + "parentIndex": 20, + "identifier": "composer-dock-header", + "ref": "e22" + }, + { + "type": "Other", + "enabled": true, + "index": 22, + "hittable": false, + "depth": 19, + "rect": { + "y": 70, + "x": 0, + "width": 402, + "height": 56 + }, + "parentIndex": 21, + "ref": "e23" + }, + { + "hittable": false, + "rect": { + "y": 81.6666669845581, + "x": 8, + "width": 32, + "height": 32 + }, + "label": "Open menu", + "type": "Button", + "enabled": true, + "identifier": "menu-button", + "parentIndex": 21, + "depth": 19, + "index": 23, + "ref": "e24" + }, + { + "type": "Other", + "index": 24, + "enabled": true, + "rect": { + "y": 91.6666669845581, + "x": 16, + "width": 16, + "height": 12 + }, + "parentIndex": 23, + "depth": 20, + "hittable": false, + "ref": "e25" + }, + { + "depth": 21, + "type": "Other", + "hittable": false, + "rect": { + "y": 91.6666669845581, + "x": 16, + "width": 16, + "height": 1.3333358764648438 + }, + "enabled": true, + "index": 25, + "parentIndex": 24, + "ref": "e26" + }, + { + "index": 26, + "depth": 21, + "parentIndex": 24, + "enabled": true, + "type": "Other", + "rect": { + "y": 97.00000047683716, + "x": 16, + "width": 16, + "height": 1.6666717529296875 + }, + "hittable": false, + "ref": "e27" + }, + { + "rect": { + "y": 102.33333396911621, + "x": 16, + "width": 8, + "height": 1.6666641235351562 + }, + "parentIndex": 24, + "depth": 21, + "type": "Other", + "index": 27, + "hittable": false, + "enabled": true, + "ref": "e28" + }, + { + "type": "Other", + "index": 28, + "parentIndex": 20, + "hittable": false, + "enabled": true, + "depth": 18, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "ref": "e29" + }, + { + "type": "Other", + "identifier": "composer-viewport", + "label": "New workspace", + "index": 29, + "depth": 18, + "rect": { + "y": 126, + "x": 0, + "width": 402, + "height": 748 + }, + "hittable": false, + "parentIndex": 20, + "enabled": true, + "ref": "e30" + }, + { + "parentIndex": 29, + "label": "New workspace", + "rect": { + "y": -176, + "x": 0, + "width": 402, + "height": 748 + }, + "depth": 19, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 30, + "ref": "e31" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "y": -176, + "x": 0, + "width": 402, + "height": 610 + }, + "identifier": "composer-dock-content", + "index": 31, + "label": "New workspace", + "depth": 20, + "parentIndex": 30, + "hittable": false, + "ref": "e32" + }, + { + "enabled": true, + "rect": { + "y": -176, + "x": 0, + "width": 402, + "height": 610 + }, + "hittable": false, + "index": 32, + "type": "Other", + "depth": 21, + "parentIndex": 31, + "ref": "e33" + }, + { + "depth": 21, + "label": "New workspace", + "enabled": true, + "index": 33, + "rect": { + "y": 208.66665649414062, + "x": 0, + "width": 402, + "height": 25.333343505859375 + }, + "type": "Other", + "hittable": false, + "parentIndex": 31, + "ref": "e34" + }, + { + "type": "StaticText", + "hittable": false, + "rect": { + "y": 208.66665649414062, + "x": 24, + "width": 362, + "height": 25.333343505859375 + }, + "parentIndex": 33, + "index": 34, + "label": "New workspace", + "depth": 22, + "enabled": true, + "ref": "e35" + }, + { + "hittable": false, + "rect": { + "y": 208.66665649414062, + "x": 24, + "width": 362, + "height": 25.333343505859375 + }, + "label": "New workspace", + "index": 35, + "enabled": true, + "parentIndex": 34, + "type": "StaticText", + "depth": 23, + "ref": "e36" + }, + { + "hittable": false, + "rect": { + "y": 266, + "x": 0, + "width": 402, + "height": 136 + }, + "identifier": "new-workspace-ref-picker-row", + "depth": 21, + "index": 36, + "type": "Other", + "parentIndex": 31, + "enabled": true, + "ref": "e37" + }, + { + "type": "Button", + "index": 37, + "rect": { + "y": 266, + "x": 16, + "width": 238.6666717529297, + "height": 28 + }, + "enabled": true, + "hittable": false, + "parentIndex": 31, + "identifier": "new-workspace-project-picker-trigger", + "label": "Workspace project", + "depth": 21, + "ref": "e38" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 272, + "x": 24, + "width": 16, + "height": 16 + }, + "parentIndex": 37, + "type": "Other", + "depth": 22, + "index": 38, + "ref": "e39" + }, + { + "parentIndex": 37, + "depth": 22, + "rect": { + "y": 274, + "x": 28, + "width": 7.666667938232422, + "height": 12 + }, + "hittable": false, + "type": "StaticText", + "index": 39, + "label": "C", + "enabled": true, + "ref": "e40" + }, + { + "type": "StaticText", + "rect": { + "y": 274, + "x": 28, + "width": 7.666667938232422, + "height": 12 + }, + "index": 40, + "hittable": false, + "parentIndex": 39, + "enabled": true, + "label": "C", + "depth": 23, + "ref": "e41" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 90.33333587646484, + "x": 16, + "y": 302 + }, + "index": 41, + "hittable": false, + "parentIndex": 31, + "enabled": true, + "label": "Workspace isolation", + "depth": 21, + "identifier": "workspace-create-isolation-trigger", + "ref": "e42" + }, + { + "type": "Other", + "rect": { + "height": 14, + "width": 14, + "x": 84.33333206176758, + "y": 310 + }, + "index": 42, + "hittable": false, + "parentIndex": 41, + "enabled": true, + "depth": 22, + "ref": "e43" + }, + { + "type": "Other", + "rect": { + "height": 14, + "width": 14, + "x": 84.33333206176758, + "y": 310 + }, + "index": 43, + "hittable": false, + "parentIndex": 42, + "enabled": true, + "depth": 23, + "ref": "e44" + }, + { + "type": "Other", + "rect": { + "height": 4.666666666666629, + "width": 8.166666666666657, + "x": 87.24999872843425, + "y": 314.6666666666667 + }, + "index": 44, + "hittable": false, + "parentIndex": 43, + "enabled": true, + "depth": 24, + "ref": "e45" + }, + { + "type": "Other", + "rect": { + "height": 4.666666666666686, + "width": 8.166666666666671, + "x": 87.24999872843425, + "y": 314.6666666666667 + }, + "index": 45, + "hittable": false, + "parentIndex": 44, + "enabled": true, + "depth": 25, + "ref": "e46" + }, + { + "type": "Other", + "rect": { + "height": 28, + "width": 86.66666412353516, + "x": 16, + "y": 338 + }, + "index": 46, + "hittable": false, + "parentIndex": 31, + "enabled": true, + "label": "Choose what to launch", + "depth": 21, + "ref": "e47" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 86.66666412353516, + "x": 16, + "y": 338 + }, + "index": 47, + "hittable": false, + "parentIndex": 46, + "enabled": true, + "label": "Choose what to launch", + "depth": 22, + "identifier": "new-workspace-launch-trigger", + "ref": "e48" + }, + { + "type": "Other", + "rect": { + "height": 28, + "width": 402, + "x": 0, + "y": 374 + }, + "index": 48, + "hittable": false, + "parentIndex": 31, + "enabled": true, + "depth": 21, + "ref": "e49" + }, + { + "type": "Other", + "rect": { + "height": 138, + "width": 402, + "x": 0, + "y": 434 + }, + "index": 49, + "hittable": false, + "parentIndex": 30, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "depth": 20, + "identifier": "composer-viewport-content", + "ref": "e50" + }, + { + "type": "Other", + "rect": { + "height": 88, + "width": 370, + "x": 16, + "y": 434 + }, + "index": 50, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "depth": 21, + "identifier": "message-input-root", + "ref": "e51" + }, + { + "type": "Other", + "rect": { + "height": 88, + "width": 370, + "x": 16, + "y": 434 + }, + "index": 51, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "depth": 21, + "ref": "e52" + }, + { + "type": "Other", + "rect": { + "height": 30, + "width": 344, + "x": 29, + "y": 443 + }, + "index": 52, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "depth": 21, + "ref": "e53" + }, + { + "type": "TextView", + "rect": { + "height": 30, + "width": 344, + "x": 29, + "y": 443 + }, + "index": 53, + "hittable": false, + "parentIndex": 52, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "depth": 22, + "ref": "e54" + }, + { + "type": "Other", + "rect": { + "height": 30, + "width": 30, + "x": 340, + "y": 443 + }, + "index": 54, + "hittable": false, + "parentIndex": 53, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "depth": 23, + "ref": "e55" + }, + { + "type": "Other", + "rect": { + "height": 31, + "width": 3, + "x": 367, + "y": 439 + }, + "index": 55, + "hittable": false, + "parentIndex": 54, + "enabled": true, + "depth": 24, + "ref": "e56" + }, + { + "type": "Other", + "rect": { + "height": 15, + "width": 344, + "x": 29, + "y": 455 + }, + "index": 56, + "hittable": false, + "parentIndex": 53, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "depth": 23, + "ref": "e57" + }, + { + "type": "Other", + "rect": { + "height": 3, + "width": 338, + "x": 32, + "y": 467 + }, + "index": 57, + "hittable": false, + "parentIndex": 56, + "enabled": true, + "depth": 24, + "ref": "e58" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 28, + "x": 23, + "y": 485 + }, + "index": 58, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "label": "Add attachment", + "depth": 21, + "identifier": "message-input-attach-button", + "ref": "e59" + }, + { + "type": "Other", + "rect": { + "height": 28, + "width": 28, + "x": 23, + "y": 485 + }, + "index": 59, + "hittable": false, + "parentIndex": 58, + "enabled": true, + "depth": 22, + "ref": "e60" + }, + { + "type": "Other", + "rect": { + "height": 20, + "width": 20, + "x": 27, + "y": 489 + }, + "index": 60, + "hittable": false, + "parentIndex": 59, + "enabled": true, + "depth": 23, + "ref": "e61" + }, + { + "type": "Other", + "rect": { + "height": 13.333333333333371, + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 492.3333333333333 + }, + "index": 61, + "hittable": false, + "parentIndex": 60, + "enabled": true, + "depth": 24, + "ref": "e62" + }, + { + "type": "Other", + "rect": { + "height": 1.6666666666666856, + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 498.16666666666663 + }, + "index": 62, + "hittable": false, + "parentIndex": 61, + "enabled": true, + "depth": 25, + "ref": "e63" + }, + { + "type": "Other", + "rect": { + "height": 13.333333333333314, + "width": 1.6666666666666643, + "x": 36.16666666666667, + "y": 492.33333333333337 + }, + "index": 63, + "hittable": false, + "parentIndex": 61, + "enabled": true, + "depth": 25, + "ref": "e64" + }, + { + "type": "Other", + "rect": { + "height": 28, + "width": 264, + "x": 51, + "y": 485 + }, + "index": 64, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "label": "Select model (Select model)", + "depth": 21, + "ref": "e65" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 105.66667175292969, + "x": 51, + "y": 485 + }, + "index": 65, + "hittable": false, + "parentIndex": 64, + "enabled": true, + "label": "Select model (Select model)", + "depth": 22, + "identifier": "combined-model-selector", + "ref": "e66" + }, + { + "type": "StaticText", + "rect": { + "height": 18, + "width": 89.66667175292969, + "x": 59, + "y": 490 + }, + "index": 66, + "hittable": false, + "parentIndex": 65, + "enabled": true, + "label": "Select model", + "depth": 23, + "ref": "e67" + }, + { + "type": "StaticText", + "rect": { + "height": 18, + "width": 89.66667175292969, + "x": 59, + "y": 490 + }, + "index": 67, + "hittable": false, + "parentIndex": 66, + "enabled": true, + "label": "Select model", + "depth": 24, + "ref": "e68" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 28, + "x": 315, + "y": 485 + }, + "index": 68, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "label": "Start dictation", + "depth": 21, + "ref": "e69" + }, + { + "type": "Button", + "rect": { + "height": 28, + "width": 28, + "x": 351, + "y": 485 + }, + "index": 69, + "hittable": false, + "parentIndex": 49, + "enabled": true, + "label": "Create", + "depth": 21, + "identifier": "workspace-create-submit", + "ref": "e70" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 70, + "hittable": false, + "parentIndex": 12, + "enabled": true, + "depth": 11, + "ref": "e71" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 71, + "hittable": false, + "parentIndex": 6, + "enabled": true, + "depth": 7, + "ref": "e72" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 72, + "hittable": false, + "parentIndex": 71, + "enabled": true, + "depth": 8, + "ref": "e73" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 73, + "hittable": false, + "parentIndex": 72, + "enabled": true, + "depth": 9, + "ref": "e74" + }, + { + "type": "Window", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 74, + "hittable": false, + "parentIndex": 0, + "enabled": true, + "depth": 1, + "ref": "e75" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 75, + "hittable": false, + "parentIndex": 74, + "enabled": true, + "depth": 2, + "ref": "e76" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 76, + "hittable": false, + "parentIndex": 75, + "enabled": true, + "depth": 3, + "ref": "e77" + }, + { + "type": "Other", + "rect": { + "height": 336, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 77, + "hittable": false, + "parentIndex": 75, + "enabled": true, + "depth": 3, + "ref": "e78" + }, + { + "type": "Other", + "rect": { + "height": 278, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 78, + "hittable": false, + "parentIndex": 77, + "enabled": true, + "depth": 4, + "ref": "e79" + }, + { + "type": "Window", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 79, + "hittable": true, + "parentIndex": 0, + "enabled": true, + "label": "Emoji", + "depth": 1, + "ref": "e80" + }, + { + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 80, + "hittable": true, + "parentIndex": 79, + "enabled": true, + "label": "Emoji", + "depth": 2, + "ref": "e81" + }, + { + "type": "Other", + "rect": { + "height": 336, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 81, + "hittable": true, + "parentIndex": 80, + "enabled": true, + "label": "Emoji", + "depth": 3, + "ref": "e82" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 82, + "hittable": false, + "parentIndex": 81, + "enabled": true, + "depth": 4, + "ref": "e83" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 83, + "hittable": false, + "parentIndex": 82, + "enabled": true, + "depth": 5, + "ref": "e84" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 84, + "hittable": false, + "parentIndex": 83, + "enabled": true, + "depth": 6, + "ref": "e85" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 85, + "hittable": true, + "parentIndex": 81, + "enabled": true, + "label": "Typing Predictions", + "depth": 4, + "identifier": "SystemInputAssistantView", + "ref": "e86" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 86, + "hittable": true, + "parentIndex": 85, + "enabled": true, + "label": "Typing Predictions", + "depth": 5, + "ref": "e87" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 87, + "hittable": true, + "parentIndex": 86, + "enabled": true, + "label": "Typing Predictions", + "depth": 6, + "identifier": "CenterPageView", + "ref": "e88" + }, + { + "type": "Other", + "rect": { + "height": 1245, + "width": 402, + "x": 0, + "y": -62 + }, + "index": 88, + "hittable": false, + "parentIndex": 87, + "enabled": true, + "depth": 7, + "ref": "e89" + }, + { + "type": "ScrollView", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 89, + "hittable": false, + "parentIndex": 88, + "enabled": true, + "depth": 8, + "ref": "e90" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 90, + "hittable": true, + "parentIndex": 87, + "enabled": true, + "label": "Typing Predictions", + "depth": 7, + "ref": "e91" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 91, + "hittable": true, + "parentIndex": 90, + "enabled": true, + "label": "Typing Predictions", + "depth": 8, + "ref": "e92" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 92, + "hittable": true, + "parentIndex": 91, + "enabled": true, + "label": "I", + "depth": 9, + "ref": "e93" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 402, + "x": 0, + "y": 538 + }, + "index": 93, + "hittable": true, + "parentIndex": 92, + "enabled": true, + "label": "I", + "depth": 10, + "ref": "e94" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 134, + "x": 0, + "y": 538 + }, + "index": 94, + "hittable": true, + "parentIndex": 93, + "enabled": true, + "label": "I", + "depth": 11, + "ref": "e95" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 134, + "x": 134, + "y": 538 + }, + "index": 95, + "hittable": true, + "parentIndex": 93, + "enabled": true, + "label": "The", + "depth": 11, + "ref": "e96" + }, + { + "type": "Other", + "rect": { + "height": 45, + "width": 134, + "x": 268, + "y": 538 + }, + "index": 96, + "hittable": true, + "parentIndex": 93, + "enabled": true, + "label": "I’m", + "depth": 11, + "ref": "e97" + }, + { + "type": "Other", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 97, + "hittable": false, + "parentIndex": 81, + "enabled": true, + "depth": 4, + "ref": "e98" + }, + { + "type": "Other", + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 98, + "hittable": false, + "parentIndex": 97, + "enabled": true, + "depth": 5, + "ref": "e99" + }, + { + "type": "Other", + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 99, + "hittable": false, + "parentIndex": 98, + "enabled": true, + "depth": 6, + "ref": "e100" + }, + { + "type": "Other", + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 100, + "hittable": false, + "parentIndex": 99, + "enabled": true, + "depth": 7, + "ref": "e101" + }, + { + "type": "Other", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 101, + "hittable": false, + "parentIndex": 81, + "enabled": true, + "label": "Q", + "depth": 4, + "ref": "e102" + }, + { + "type": "Keyboard", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 102, + "hittable": false, + "parentIndex": 101, + "enabled": true, + "label": "Q", + "depth": 5, + "ref": "e103" + }, + { + "type": "Other", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 103, + "hittable": false, + "parentIndex": 102, + "enabled": true, + "label": "Q", + "depth": 6, + "ref": "e104" + }, + { + "type": "Other", + "rect": { + "height": 233, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 104, + "hittable": false, + "parentIndex": 103, + "enabled": true, + "label": "Q", + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "ref": "e105" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333336, + "x": 0, + "y": 590 + }, + "index": 105, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "Q", + "depth": 8, + "ref": "e106" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 590 + }, + "index": 106, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "W", + "depth": 8, + "ref": "e107" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 590 + }, + "index": 107, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "E", + "depth": 8, + "ref": "e108" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 120.66666666666669, + "y": 590 + }, + "index": 108, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "R", + "depth": 8, + "ref": "e109" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 590 + }, + "index": 109, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "T", + "depth": 8, + "ref": "e110" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 590 + }, + "index": 110, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "Y", + "depth": 8, + "ref": "e111" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 241.33333333333337, + "y": 590 + }, + "index": 111, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "U", + "depth": 8, + "ref": "e112" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 590 + }, + "index": 112, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "I", + "depth": 8, + "ref": "e113" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 321.6666666666667, + "y": 590 + }, + "index": 113, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "O", + "depth": 8, + "ref": "e114" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 590 + }, + "index": 114, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "P", + "depth": 8, + "ref": "e115" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 644 + }, + "index": 115, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "A", + "depth": 8, + "ref": "e116" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 60, + "y": 644 + }, + "index": 116, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "S", + "depth": 8, + "ref": "e117" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 100.33333333333334, + "y": 644 + }, + "index": 117, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "D", + "depth": 8, + "ref": "e118" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 644 + }, + "index": 118, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "F", + "depth": 8, + "ref": "e119" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 181.2026666666667, + "y": 644 + }, + "index": 119, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "G", + "depth": 8, + "ref": "e120" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 644 + }, + "index": 120, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "H", + "depth": 8, + "ref": "e121" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 261.536, + "y": 644 + }, + "index": 121, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "J", + "depth": 8, + "ref": "e122" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 301.536, + "y": 644 + }, + "index": 122, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "K", + "depth": 8, + "ref": "e123" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 644 + }, + "index": 123, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "L", + "depth": 8, + "ref": "e124" + }, + { + "type": "Button", + "rect": { + "height": 46, + "width": 51.333333333333336, + "x": 0, + "y": 698 + }, + "index": 124, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "shift", + "selected": true, + "identifier": "shift", + "depth": 8, + "ref": "e125" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 60, + "y": 698 + }, + "index": 125, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "Z", + "depth": 8, + "ref": "e126" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 100.33333333333334, + "y": 698 + }, + "index": 126, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "X", + "depth": 8, + "ref": "e127" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 698 + }, + "index": 127, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "C", + "depth": 8, + "ref": "e128" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 181.2026666666667, + "y": 698 + }, + "index": 128, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "V", + "depth": 8, + "ref": "e129" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 698 + }, + "index": 129, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "B", + "depth": 8, + "ref": "e130" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40, + "x": 261.536, + "y": 698 + }, + "index": 130, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "N", + "depth": 8, + "ref": "e131" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 40.333333333333314, + "x": 301.536, + "y": 698 + }, + "index": 131, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "M", + "depth": 8, + "ref": "e132" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 698 + }, + "index": 132, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "delete", + "depth": 8, + "identifier": "delete", + "ref": "e133" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 101, + "x": 0, + "y": 752 + }, + "index": 133, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "numbers", + "depth": 8, + "identifier": "more", + "ref": "e134" + }, + { + "type": "Key", + "rect": { + "height": 46, + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 752 + }, + "index": 134, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "space", + "depth": 8, + "identifier": "space", + "ref": "e135" + }, + { + "type": "Button", + "rect": { + "height": 46, + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 752 + }, + "index": 135, + "hittable": false, + "parentIndex": 104, + "enabled": true, + "label": "return", + "depth": 8, + "identifier": "Return", + "ref": "e136" + }, + { + "type": "Other", + "rect": { + "height": 291, + "width": 402, + "x": 0, + "y": 583 + }, + "index": 136, + "hittable": true, + "parentIndex": 81, + "enabled": true, + "label": "Emoji", + "depth": 4, + "ref": "e137" + }, + { + "type": "Button", + "rect": { + "height": 68.73516393505099, + "width": 68.0852958475086, + "x": 8.47726568115926, + "y": 805.6989567998571 + }, + "index": 137, + "hittable": true, + "parentIndex": 136, + "enabled": true, + "label": "Emoji", + "depth": 5, + "ref": "e138" + }, + { + "type": "StaticText", + "rect": { + "height": 0, + "width": 0, + "x": 8.47726568115926, + "y": 805.6989567998571 + }, + "index": 138, + "hittable": false, + "parentIndex": 137, + "enabled": true, + "depth": 6, + "ref": "e139" + }, + { + "type": "Button", + "rect": { + "height": 68.73516393505099, + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "index": 139, + "hittable": false, + "parentIndex": 136, + "enabled": true, + "label": "Dictate", + "depth": 5, + "identifier": "dictation", + "ref": "e140" + }, + { + "type": "StaticText", + "rect": { + "height": 0, + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "index": 140, + "hittable": false, + "parentIndex": 139, + "enabled": true, + "depth": 6, + "ref": "e141" + }, + { + "type": "Button", + "rect": { + "height": 68.73516393505099, + "width": 68.08529584750863, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "index": 141, + "hittable": true, + "parentIndex": 136, + "enabled": true, + "label": "Dictate", + "depth": 5, + "identifier": "dictation", + "ref": "e142" + }, + { + "type": "StaticText", + "rect": { + "height": 0, + "width": 0, + "x": 325.43743847133214, + "y": 805.3656234665239 + }, + "index": 142, + "hittable": false, + "parentIndex": 141, + "enabled": true, + "depth": 6, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 132, + "p50Ms": 143, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 132 + } + } + }, + "refsGeneration": 776196 + } +} diff --git a/scroll-regression/ios/new-workspace-header-dismissed.json b/scroll-regression/ios/new-workspace-header-dismissed.json new file mode 100644 index 0000000000..6ddcd929ea --- /dev/null +++ b/scroll-regression/ios/new-workspace-header-dismissed.json @@ -0,0 +1,2281 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "hittable": true, + "enabled": true, + "type": "Application", + "index": 0, + "depth": 0, + "label": "Paseo Debug", + "ref": "e1" + }, + { + "index": 1, + "hittable": false, + "depth": 1, + "type": "Window", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 0, + "ref": "e2" + }, + { + "index": 2, + "type": "Other", + "enabled": true, + "parentIndex": 1, + "hittable": false, + "depth": 2, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e3" + }, + { + "depth": 3, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "enabled": true, + "index": 3, + "parentIndex": 2, + "type": "Other", + "ref": "e4" + }, + { + "index": 4, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 4, + "enabled": true, + "type": "Other", + "parentIndex": 3, + "hittable": false, + "ref": "e5" + }, + { + "parentIndex": 4, + "depth": 5, + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "type": "Other", + "enabled": true, + "index": 5, + "ref": "e6" + }, + { + "index": 6, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "depth": 6, + "hittable": false, + "parentIndex": 5, + "ref": "e7" + }, + { + "index": 7, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 7, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 6, + "ref": "e8" + }, + { + "type": "Other", + "parentIndex": 7, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "enabled": true, + "hittable": false, + "depth": 8, + "index": 8, + "ref": "e9" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 9, + "depth": 9, + "type": "Other", + "enabled": true, + "parentIndex": 8, + "hittable": false, + "ref": "e10" + }, + { + "type": "Other", + "hittable": false, + "depth": 9, + "parentIndex": 8, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "enabled": true, + "index": 10, + "ref": "e11" + }, + { + "index": 11, + "depth": 10, + "hittable": false, + "parentIndex": 10, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "enabled": true, + "type": "Other", + "ref": "e12" + }, + { + "parentIndex": 10, + "depth": 10, + "type": "Other", + "hittable": false, + "index": 12, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "ref": "e13" + }, + { + "hittable": false, + "parentIndex": 12, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "index": 13, + "type": "Other", + "depth": 11, + "ref": "e14" + }, + { + "parentIndex": 12, + "index": 14, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 11, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e15" + }, + { + "enabled": true, + "depth": 12, + "index": 15, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "parentIndex": 14, + "ref": "e16" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "depth": 13, + "parentIndex": 15, + "type": "Other", + "index": 16, + "ref": "e17" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "index": 17, + "parentIndex": 16, + "depth": 14, + "ref": "e18" + }, + { + "label": "Open menu", + "type": "Other", + "hittable": false, + "depth": 15, + "parentIndex": 17, + "index": 18, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "ref": "e19" + }, + { + "hittable": false, + "index": 19, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "depth": 16, + "parentIndex": 18, + "label": "Open menu", + "ref": "e20" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "label": "Open menu", + "depth": 17, + "enabled": true, + "type": "Other", + "parentIndex": 19, + "hittable": false, + "index": 20, + "ref": "e21" + }, + { + "index": 21, + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "height": 126, + "width": 402 + }, + "type": "Other", + "label": "Open menu", + "depth": 18, + "identifier": "composer-dock-header", + "parentIndex": 20, + "enabled": true, + "ref": "e22" + }, + { + "hittable": false, + "index": 22, + "enabled": true, + "parentIndex": 21, + "rect": { + "width": 402, + "height": 56, + "y": 70, + "x": 0 + }, + "type": "Other", + "depth": 19, + "ref": "e23" + }, + { + "enabled": true, + "type": "Button", + "label": "Open menu", + "hittable": false, + "depth": 19, + "parentIndex": 21, + "identifier": "menu-button", + "index": 23, + "rect": { + "width": 32, + "height": 32, + "y": 81.6666669845581, + "x": 8 + }, + "ref": "e24" + }, + { + "index": 24, + "depth": 20, + "hittable": false, + "rect": { + "width": 16, + "height": 12, + "y": 91.6666669845581, + "x": 16 + }, + "type": "Other", + "parentIndex": 23, + "enabled": true, + "ref": "e25" + }, + { + "enabled": true, + "rect": { + "width": 16, + "height": 1.3333358764648438, + "y": 91.6666669845581, + "x": 16 + }, + "parentIndex": 24, + "hittable": false, + "depth": 21, + "type": "Other", + "index": 25, + "ref": "e26" + }, + { + "rect": { + "width": 16, + "height": 1.6666717529296875, + "y": 97.00000047683716, + "x": 16 + }, + "parentIndex": 24, + "index": 26, + "hittable": false, + "depth": 21, + "enabled": true, + "type": "Other", + "ref": "e27" + }, + { + "enabled": true, + "index": 27, + "type": "Other", + "rect": { + "width": 8, + "height": 1.6666641235351562, + "y": 102.33333396911621, + "x": 16 + }, + "depth": 21, + "hittable": false, + "parentIndex": 24, + "ref": "e28" + }, + { + "depth": 18, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "index": 28, + "parentIndex": 20, + "hittable": false, + "enabled": true, + "ref": "e29" + }, + { + "parentIndex": 20, + "enabled": true, + "type": "Other", + "identifier": "composer-viewport", + "hittable": false, + "rect": { + "width": 402, + "height": 748, + "y": 126, + "x": 0 + }, + "index": 29, + "label": "New workspace", + "depth": 18, + "ref": "e30" + }, + { + "type": "Other", + "parentIndex": 29, + "enabled": true, + "rect": { + "width": 402, + "height": 748, + "y": 126, + "x": 0 + }, + "hittable": false, + "label": "New workspace", + "depth": 19, + "index": 30, + "ref": "e31" + }, + { + "enabled": true, + "type": "Other", + "label": "New workspace", + "parentIndex": 30, + "identifier": "composer-dock-content", + "rect": { + "width": 402, + "height": 307, + "y": 126, + "x": 0 + }, + "depth": 20, + "hittable": false, + "index": 31, + "ref": "e32" + }, + { + "rect": { + "width": 402, + "height": 307, + "y": 126, + "x": 0 + }, + "hittable": false, + "depth": 21, + "index": 32, + "enabled": true, + "type": "Other", + "parentIndex": 31, + "ref": "e33" + }, + { + "parentIndex": 31, + "depth": 21, + "index": 33, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "height": 25.333328247070312, + "y": 207.66666412353516, + "x": 0 + }, + "type": "Other", + "label": "New workspace", + "ref": "e34" + }, + { + "hittable": false, + "enabled": true, + "index": 34, + "depth": 22, + "parentIndex": 33, + "label": "New workspace", + "rect": { + "width": 362, + "height": 25.333343505859375, + "y": 207.66666412353516, + "x": 24 + }, + "type": "StaticText", + "ref": "e35" + }, + { + "index": 35, + "parentIndex": 34, + "enabled": true, + "type": "StaticText", + "hittable": false, + "label": "New workspace", + "depth": 23, + "rect": { + "width": 362, + "height": 25.333343505859375, + "y": 207.66666412353516, + "x": 24 + }, + "ref": "e36" + }, + { + "depth": 21, + "type": "Other", + "rect": { + "width": 402, + "height": 136, + "y": 265, + "x": 0 + }, + "index": 36, + "enabled": true, + "identifier": "new-workspace-ref-picker-row", + "hittable": false, + "parentIndex": 31, + "ref": "e37" + }, + { + "identifier": "new-workspace-project-picker-trigger", + "index": 37, + "rect": { + "width": 238.6666717529297, + "height": 28, + "y": 265, + "x": 16 + }, + "hittable": false, + "label": "Workspace project", + "parentIndex": 31, + "type": "Button", + "depth": 21, + "enabled": true, + "ref": "e38" + }, + { + "depth": 22, + "enabled": true, + "parentIndex": 37, + "index": 38, + "rect": { + "width": 16, + "height": 16, + "y": 271, + "x": 24 + }, + "type": "Other", + "hittable": false, + "ref": "e39" + }, + { + "hittable": false, + "depth": 22, + "index": 39, + "label": "C", + "type": "StaticText", + "rect": { + "width": 7.666667938232422, + "height": 12, + "y": 273, + "x": 28 + }, + "enabled": true, + "parentIndex": 37, + "ref": "e40" + }, + { + "label": "C", + "rect": { + "width": 7.666667938232422, + "height": 12, + "y": 273, + "x": 28 + }, + "depth": 23, + "parentIndex": 39, + "hittable": false, + "index": 40, + "enabled": true, + "type": "StaticText", + "ref": "e41" + }, + { + "label": "Workspace isolation", + "rect": { + "width": 90.33333587646484, + "x": 16, + "height": 28, + "y": 301 + }, + "depth": 21, + "identifier": "workspace-create-isolation-trigger", + "index": 41, + "hittable": false, + "parentIndex": 31, + "type": "Button", + "enabled": true, + "ref": "e42" + }, + { + "depth": 22, + "rect": { + "width": 14, + "x": 84.33333206176758, + "height": 14, + "y": 309 + }, + "parentIndex": 41, + "index": 42, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e43" + }, + { + "depth": 23, + "rect": { + "width": 14, + "x": 84.33333206176758, + "height": 14, + "y": 309 + }, + "parentIndex": 42, + "index": 43, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e44" + }, + { + "depth": 24, + "rect": { + "width": 8.166666666666657, + "x": 87.24999872843425, + "height": 4.666666666666629, + "y": 313.6666666666667 + }, + "parentIndex": 43, + "index": 44, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e45" + }, + { + "depth": 25, + "rect": { + "width": 8.166666666666671, + "x": 87.24999872843425, + "height": 4.666666666666686, + "y": 313.66666666666663 + }, + "parentIndex": 44, + "index": 45, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e46" + }, + { + "label": "Choose what to launch", + "rect": { + "width": 86.66666412353516, + "x": 16, + "height": 28, + "y": 337 + }, + "depth": 21, + "parentIndex": 31, + "index": 46, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e47" + }, + { + "label": "Choose what to launch", + "rect": { + "width": 86.66666412353516, + "x": 16, + "height": 28, + "y": 337 + }, + "depth": 22, + "identifier": "new-workspace-launch-trigger", + "index": 47, + "hittable": false, + "parentIndex": 46, + "type": "Button", + "enabled": true, + "ref": "e48" + }, + { + "depth": 21, + "rect": { + "width": 402, + "x": 0, + "height": 28, + "y": 373 + }, + "parentIndex": 31, + "index": 48, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e49" + }, + { + "label": "Message agent...", + "rect": { + "width": 402, + "x": 0, + "height": 441, + "y": 433 + }, + "depth": 20, + "identifier": "composer-viewport-content", + "index": 49, + "hittable": false, + "parentIndex": 30, + "type": "Other", + "enabled": true, + "ref": "e50" + }, + { + "rect": { + "width": 370, + "x": 16, + "height": 391, + "y": 433 + }, + "depth": 21, + "identifier": "message-input-root", + "index": 50, + "hittable": false, + "parentIndex": 49, + "type": "Other", + "enabled": true, + "ref": "e51" + }, + { + "depth": 21, + "rect": { + "width": 370, + "x": 16, + "height": 391, + "y": 433 + }, + "parentIndex": 49, + "index": 51, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e52" + }, + { + "label": "Message agent...", + "rect": { + "width": 344, + "x": 29, + "height": 333, + "y": 442 + }, + "depth": 21, + "parentIndex": 49, + "index": 52, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e53" + }, + { + "label": "Message agent...", + "rect": { + "width": 344, + "x": 29, + "height": 333, + "y": 442 + }, + "depth": 22, + "parentIndex": 52, + "index": 53, + "hittable": false, + "type": "TextView", + "enabled": true, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "ref": "e54" + }, + { + "label": "Vertical scroll bar, 2 pages", + "rect": { + "width": 30, + "x": 340, + "height": 333, + "y": 442 + }, + "depth": 23, + "parentIndex": 53, + "index": 54, + "hittable": false, + "type": "Other", + "enabled": true, + "value": "100%", + "ref": "e55" + }, + { + "depth": 24, + "rect": { + "width": 3, + "x": 367, + "height": 281.33333333333337, + "y": 490.66666666666663 + }, + "parentIndex": 54, + "index": 55, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e56" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "width": 344, + "x": 29, + "height": 30, + "y": 742 + }, + "depth": 23, + "parentIndex": 53, + "index": 56, + "hittable": false, + "type": "Other", + "enabled": true, + "value": "0%", + "ref": "e57" + }, + { + "depth": 24, + "rect": { + "width": 335, + "x": 32, + "height": 3, + "y": 769 + }, + "parentIndex": 56, + "index": 57, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e58" + }, + { + "label": "Add attachment", + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 787 + }, + "depth": 21, + "identifier": "message-input-attach-button", + "index": 58, + "hittable": false, + "parentIndex": 49, + "type": "Button", + "enabled": true, + "ref": "e59" + }, + { + "depth": 22, + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 787 + }, + "parentIndex": 58, + "index": 59, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e60" + }, + { + "depth": 23, + "rect": { + "width": 20, + "x": 27, + "height": 20, + "y": 791 + }, + "parentIndex": 59, + "index": 60, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e61" + }, + { + "depth": 24, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 13.333333333333258, + "y": 794.3333333333334 + }, + "parentIndex": 60, + "index": 61, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e62" + }, + { + "depth": 25, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 1.6666666666666288, + "y": 800.1666666666667 + }, + "parentIndex": 61, + "index": 62, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e63" + }, + { + "depth": 25, + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "height": 13.333333333333371, + "y": 794.3333333333333 + }, + "parentIndex": 61, + "index": 63, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e64" + }, + { + "label": "Select model (Select model)", + "rect": { + "width": 264, + "x": 51, + "height": 28, + "y": 787 + }, + "depth": 21, + "parentIndex": 49, + "index": 64, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e65" + }, + { + "label": "Select model (Select model)", + "rect": { + "width": 105.66667175292969, + "x": 51, + "height": 28, + "y": 787 + }, + "depth": 22, + "identifier": "combined-model-selector", + "index": 65, + "hittable": false, + "parentIndex": 64, + "type": "Button", + "enabled": true, + "ref": "e66" + }, + { + "label": "Select model", + "rect": { + "width": 89.66667175292969, + "x": 59, + "height": 18, + "y": 792 + }, + "depth": 23, + "parentIndex": 65, + "index": 66, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e67" + }, + { + "label": "Select model", + "rect": { + "width": 89.66667175292969, + "x": 59, + "height": 18, + "y": 792 + }, + "depth": 24, + "parentIndex": 66, + "index": 67, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e68" + }, + { + "label": "Start dictation", + "rect": { + "width": 28, + "x": 315, + "height": 28, + "y": 787 + }, + "depth": 21, + "parentIndex": 49, + "index": 68, + "hittable": false, + "type": "Button", + "enabled": true, + "ref": "e69" + }, + { + "label": "Create", + "rect": { + "width": 28, + "x": 351, + "height": 28, + "y": 787 + }, + "depth": 21, + "identifier": "workspace-create-submit", + "index": 69, + "hittable": false, + "parentIndex": 49, + "type": "Button", + "enabled": true, + "ref": "e70" + }, + { + "depth": 11, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 12, + "index": 70, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e71" + }, + { + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 6, + "index": 71, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e72" + }, + { + "depth": 8, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 71, + "index": 72, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e73" + }, + { + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 72, + "index": 73, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e74" + }, + { + "depth": 1, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 0, + "index": 74, + "hittable": false, + "type": "Window", + "enabled": true, + "ref": "e75" + }, + { + "depth": 2, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 74, + "index": 75, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e76" + }, + { + "depth": 3, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 75, + "index": 76, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e77" + }, + { + "depth": 3, + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 874 + }, + "parentIndex": 75, + "index": 77, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e78" + }, + { + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "height": 278, + "y": 874 + }, + "parentIndex": 77, + "index": 78, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e79" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 1, + "parentIndex": 0, + "index": 79, + "hittable": true, + "type": "Window", + "enabled": true, + "ref": "e80" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 2, + "parentIndex": 79, + "index": 80, + "hittable": true, + "type": "Other", + "enabled": true, + "ref": "e81" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 874 + }, + "depth": 3, + "parentIndex": 80, + "index": 81, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e82" + }, + { + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 81, + "index": 82, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e83" + }, + { + "depth": 5, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 82, + "index": 83, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e84" + }, + { + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 83, + "index": 84, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e85" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 4, + "identifier": "SystemInputAssistantView", + "index": 85, + "hittable": false, + "parentIndex": 81, + "type": "Other", + "enabled": true, + "ref": "e86" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 5, + "parentIndex": 85, + "index": 86, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e87" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 6, + "identifier": "CenterPageView", + "index": 87, + "hittable": false, + "parentIndex": 86, + "type": "Other", + "enabled": true, + "ref": "e88" + }, + { + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "height": 1245, + "y": 274 + }, + "parentIndex": 87, + "index": 88, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e89" + }, + { + "depth": 8, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 88, + "index": 89, + "hittable": false, + "type": "ScrollView", + "enabled": true, + "ref": "e90" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 7, + "parentIndex": 87, + "index": 90, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e91" + }, + { + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 8, + "parentIndex": 90, + "index": 91, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e92" + }, + { + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 91, + "index": 92, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e93" + }, + { + "depth": 10, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 92, + "index": 93, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e94" + }, + { + "depth": 11, + "rect": { + "width": 134, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 93, + "index": 94, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e95" + }, + { + "depth": 11, + "rect": { + "width": 134, + "x": 134, + "height": 45, + "y": 874 + }, + "parentIndex": 93, + "index": 95, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e96" + }, + { + "depth": 11, + "rect": { + "width": 134, + "x": 268, + "height": 45, + "y": 874 + }, + "parentIndex": 93, + "index": 96, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e97" + }, + { + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "parentIndex": 81, + "index": 97, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e98" + }, + { + "depth": 5, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "parentIndex": 97, + "index": 98, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e99" + }, + { + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "parentIndex": 98, + "index": 99, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e100" + }, + { + "depth": 7, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "parentIndex": 99, + "index": 100, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e101" + }, + { + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "depth": 4, + "parentIndex": 81, + "index": 101, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e102" + }, + { + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "depth": 5, + "parentIndex": 101, + "index": 102, + "hittable": false, + "type": "Keyboard", + "enabled": true, + "ref": "e103" + }, + { + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "depth": 6, + "parentIndex": 102, + "index": 103, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e104" + }, + { + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "index": 104, + "hittable": false, + "parentIndex": 103, + "type": "Other", + "enabled": true, + "ref": "e105" + }, + { + "label": "q", + "rect": { + "width": 40.333333333333336, + "x": 0, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 105, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e106" + }, + { + "label": "w", + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 106, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e107" + }, + { + "label": "e", + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 107, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e108" + }, + { + "label": "r", + "rect": { + "width": 40, + "x": 120.66666666666669, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 108, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e109" + }, + { + "label": "t", + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 109, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e110" + }, + { + "label": "y", + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 110, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e111" + }, + { + "label": "u", + "rect": { + "width": 40, + "x": 241.33333333333337, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 111, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e112" + }, + { + "label": "i", + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 112, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e113" + }, + { + "label": "o", + "rect": { + "width": 40, + "x": 321.6666666666667, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 113, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e114" + }, + { + "label": "p", + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "height": 46, + "y": 926 + }, + "depth": 8, + "parentIndex": 104, + "index": 114, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e115" + }, + { + "label": "a", + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 115, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e116" + }, + { + "label": "s", + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 116, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e117" + }, + { + "label": "d", + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 117, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e118" + }, + { + "label": "f", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 118, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e119" + }, + { + "label": "g", + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 119, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e120" + }, + { + "label": "h", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 120, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e121" + }, + { + "label": "j", + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 121, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e122" + }, + { + "label": "k", + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 122, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e123" + }, + { + "label": "l", + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "height": 46, + "y": 980 + }, + "depth": 8, + "parentIndex": 104, + "index": 123, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e124" + }, + { + "label": "shift", + "rect": { + "width": 51.333333333333336, + "x": 0, + "height": 46, + "y": 1034 + }, + "depth": 8, + "identifier": "shift", + "index": 124, + "hittable": false, + "parentIndex": 104, + "type": "Button", + "enabled": true, + "ref": "e125" + }, + { + "label": "z", + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 125, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e126" + }, + { + "label": "x", + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 126, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e127" + }, + { + "label": "c", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 127, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e128" + }, + { + "label": "v", + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 128, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e129" + }, + { + "label": "b", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 129, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e130" + }, + { + "label": "n", + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 130, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e131" + }, + { + "label": "m", + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 1034 + }, + "depth": 8, + "parentIndex": 104, + "index": 131, + "hittable": false, + "type": "Key", + "enabled": true, + "ref": "e132" + }, + { + "label": "delete", + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "height": 46, + "y": 1034 + }, + "depth": 8, + "identifier": "delete", + "index": 132, + "hittable": false, + "parentIndex": 104, + "type": "Key", + "enabled": true, + "ref": "e133" + }, + { + "label": "numbers", + "rect": { + "width": 101, + "x": 0, + "height": 46, + "y": 1088 + }, + "depth": 8, + "identifier": "more", + "index": 133, + "hittable": false, + "parentIndex": 104, + "type": "Key", + "enabled": true, + "ref": "e134" + }, + { + "label": "space", + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "height": 46, + "y": 1088 + }, + "depth": 8, + "identifier": "space", + "index": 134, + "hittable": false, + "parentIndex": 104, + "type": "Key", + "enabled": true, + "ref": "e135" + }, + { + "label": "return", + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "height": 46, + "y": 1088 + }, + "depth": 8, + "identifier": "Return", + "index": 135, + "hittable": false, + "parentIndex": 104, + "type": "Button", + "enabled": true, + "ref": "e136" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "depth": 4, + "parentIndex": 81, + "index": 136, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e137" + }, + { + "label": "Emoji", + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "height": 68.73516393505088, + "y": 1141.6989567998571 + }, + "depth": 5, + "parentIndex": 136, + "index": 137, + "hittable": false, + "type": "Button", + "enabled": true, + "ref": "e138" + }, + { + "depth": 6, + "rect": { + "width": 0, + "x": 8.47726568115926, + "height": 0, + "y": 1141.6989567998571 + }, + "parentIndex": 137, + "index": 138, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e139" + }, + { + "label": "Dictate", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239 + }, + "depth": 5, + "identifier": "dictation", + "index": 139, + "hittable": false, + "parentIndex": 136, + "type": "Button", + "enabled": true, + "ref": "e140" + }, + { + "depth": 6, + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239 + }, + "parentIndex": 139, + "index": 140, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e141" + }, + { + "label": "Dictate", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239 + }, + "depth": 5, + "identifier": "dictation", + "index": 141, + "hittable": false, + "parentIndex": 136, + "type": "Button", + "enabled": true, + "ref": "e142" + }, + { + "depth": 6, + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239 + }, + "parentIndex": 141, + "index": 142, + "hittable": false, + "type": "StaticText", + "enabled": true, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 136, + "p50Ms": 141, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 136 + } + } + }, + "refsGeneration": 776200 + } +} diff --git a/scroll-regression/ios/new-workspace-header-dismissed.png b/scroll-regression/ios/new-workspace-header-dismissed.png new file mode 100644 index 0000000000..ee8464998b Binary files /dev/null and b/scroll-regression/ios/new-workspace-header-dismissed.png differ diff --git a/scroll-regression/ios/new-workspace-padding-red.log b/scroll-regression/ios/new-workspace-padding-red.log new file mode 100644 index 0000000000..c792fb6f6a --- /dev/null +++ b/scroll-regression/ios/new-workspace-padding-red.log @@ -0,0 +1,206 @@ + +Connecting to 3s0s50t248bag ... + +Warning: Permanently added 'paseo-ios.devbox.namespace' (RSA) to the list of known hosts. +Tapped (398, 118) +Tapped id="menu-button" (24, 98) +settled after 2066ms: +183 -7 (~19 unchanged) ++ @e2 [window] ++ @e4 [other] "Close menu" ++ @e5 [button] "Close menu" ++ @e23 [other] "Close sidebar" ++ @e24 [button] "Close sidebar" ++ @e25 [button] "New workspace" ++ @e26 [button] "History" ++ @e27 [button] "Search" ++ @e28 [button] "Schedules" ++ @e29 [scroll-area] "Pinned" ++ @e30 [other] "Pinned" ++ @e31 [button] "Pinned" ++ @e32 [scroll-area] ++ @e33 [cell] "skills, Skills" ++ @e34 [button] "skills, Skills" ++ @e35 [button] "Workspace actions" ++ @e36 [other] "hub, Hub, Ready to review" ++ @e37 [button] "hub, Hub, Ready to review" ++ @e38 [button] "Workspace actions" ++ @e39 [other] "assistant, Assistant" ++ @e40 [button] "assistant, Assistant" ++ @e41 [button] "Workspace actions" ++ @e42 [other] "paseo, Paseo" ++ @e43 [button] "paseo, Paseo" ++ @e44 [button] "Workspace actions" ++ @e45 [text] "Workspaces" ++ @e46 [button] "Display preferences" ++ @e47 [scroll-area] "Create a new workspace for assistant" ++ @e48 [other] "admiring-hamster, Create a new workspace for admiring-hamster, Project actions" ++ @e49 [button] "admiring-hamster, Create a new workspace for admiring-hamster, Project actions" ++ @e50 [button] "Create a new workspace for admiring-hamster" ++ @e51 [button] "Project actions" ++ @e52 [scroll-area] ++ @e53 [cell] "fix/terminal-keyboard-flicker, Pull request #4469" ++ @e54 [button] "fix/terminal-keyboard-flicker, Pull request #4469" ++ @e55 [button] "Workspace actions" ++ @e56 [other] "Checks passed" ++ @e57 [cell] "A, assistant, Create a new workspace for assistant, Project actions" ++ @e58 [button] "A, assistant, Create a new workspace for assistant, Project actions" ++ @e59 [button] "Create a new workspace for assistant" ++ @e60 [button] "Project actions" ++ @e61 [button] "Create a new workspace for assistant" ++ @e62 [cell] "C, composer-dock-ios-fixture, Create a new workspace for composer-dock-ios-fixture, Project actions" ++ @e63 [button] "C, composer-dock-ios-fixture, Create a new workspace for composer-dock-ios-fixture, Project actions" ++ @e64 [button] "Create a new workspace for composer-dock-ios-fixture" ++ @e65 [button] "Project actions" ++ @e66 [scroll-area] ++ @e67 [other] "main" ++ @e68 [button] "main" ++ @e69 [button] "Workspace actions" ++ @e70 [cell] "editor, Create a new workspace for editor, Project actions" ++ @e71 [button] "editor, Create a new workspace for editor, Project actions" ++ @e72 [button] "Create a new workspace for editor" ++ @e73 [button] "Project actions" ++ @e74 [scroll-area] ++ @e75 [cell] "Find Blank Page PR pending review" ++ @e76 [button] "Find Blank Page PR pending review" ++ @e77 [button] "Workspace actions" ++ @e78 [cell] "Review #871 — sharing and handle flow, Pull request #871" ++ @e79 [button] "Review #871 — sharing and handle flow, Pull request #871" ++ @e80 [button] "Workspace actions" ++ @e81 [text] "·" ++ @e82 [other] "Checks passed" ++ @e83 [cell] "G, greasy-yak, Create a new workspace for greasy-yak, Project actions" ++ @e84 [button] "G, greasy-yak, Create a new workspace for greasy-yak, Project actions" ++ @e85 [button] "Create a new workspace for greasy-yak" ++ @e86 [button] "Project actions" ++ @e87 [button] "Create a new workspace for greasy-yak" ++ @e88 [other] "H, hub, Create a new workspace for hub, Project actions" ++ @e89 [button] "H, hub, Create a new workspace for hub, Project actions" ++ @e90 [button] "Create a new workspace for hub" ++ @e91 [button] "Project actions" ++ @e92 [scroll-area] ++ @e93 [cell] "Fix hosted GitHub reply registration, Pull request #122" ++ @e94 [button] "Fix hosted GitHub reply registration, Pull request #122" ++ @e95 [button] "Workspace actions" ++ @e96 [other] "Checks passed" ++ @e97 [cell] "Steer existing agents by trigger context, Pull request #118" ++ @e98 [button] "Steer existing agents by trigger context, Pull request #118" ++ @e99 [button] "Workspace actions" +… changed lines truncated +Tapped id="sidebar-global-new-workspace" (201, 86) +settled after 2238ms: +49 -202 (~0 unchanged) +- @e1 [application] "Paseo Debug" +- @e2 [window] +- @e3 [other] "Switch tabs (2 open)" +- @e4 [other] "Close menu" +- @e5 [button] "Close menu" +- @e6 [other] "main" +- @e7 [text] "composer-dock-ios-fixture" +- @e8 [text] "·" +- @e9 [other] "dev-new" +- @e10 [text] "dev-new" +- @e11 [button] "Workspace actions" +- @e12 [button] "Open Explorer sidebar" +- @e13 [button] "Switch tabs (2 open)" +- @e14 [other] "Import session" +- @e15 [scroll-area] +- @e16 [button] "Import session" +- @e17 [other] "Message agent... Message, @files, /commands" +- @e18 [text-view] "Message agent... Message, @files, /commands" +- @e19 [button] "Add attachment" +- @e20 [other] "Select model (Select model)" +- @e21 [button] "Select model (Select model)" +- @e22 [button] "Start dictation" +- @e23 [other] "Close sidebar" +- @e24 [button] "Close sidebar" +- @e25 [button] "New workspace" +- @e26 [button] "History" +- @e27 [button] "Search" +- @e28 [button] "Schedules" +- @e29 [scroll-area] "Pinned" +- @e30 [other] "Pinned" +- @e31 [button] "Pinned" ++ @e1 [application] "Paseo Debug" ++ @e2 [window] ++ @e3 [other] ++ @e4 [other] ++ @e5 [other] ++ @e6 [other] ++ @e7 [other] ++ @e8 [other] ++ @e9 [other] ++ @e10 [other] ++ @e11 [other] ++ @e12 [other] ++ @e13 [other] ++ @e14 [other] ++ @e15 [other] ++ @e16 [other] ++ @e17 [other] ++ @e18 [other] ++ @e19 [other] ++ @e20 [other] ++ @e21 [other] ++ @e22 [other] ++ @e23 [button] "Open menu" ++ @e24 [other] ++ @e25 [other] ++ @e26 [other] ++ @e27 [text] "New workspace" ++ @e28 [button] "Workspace project" ++ @e29 [text] "C" ++ @e30 [button] "Workspace isolation" ++ @e31 [other] ++ @e32 [button] "Choose what to launch" ++ @e33 [other] ++ @e34 [other] ++ @e35 [text-view] "Message agent... Message, @files, /commands" ++ @e36 [other] ++ @e37 [other] ++ @e38 [button] "Add attachment" ++ @e39 [other] ++ @e40 [button] "Select model (Select model)" ++ @e41 [button] "Start dictation" ++ @e42 [button] "Create" ++ @e43 [other] ++ @e44 [other] ++ @e45 [other] ++ @e46 [other] ++ @e47 [window] ++ @e48 [other] ++ @e49 [other] +… changed lines truncated +Filled 1 chars +Tapped (370, 465) +Long pressed (376, 720) +Tapped (4, 370) +Filled 131 chars +/Volumes/devbox/workspace/composer-scroll-ios-evidence/new-workspace-cap-open.png (402x874 @1x) +Tapped (398, 118) +/Volumes/devbox/workspace/composer-scroll-ios-evidence/new-workspace-header-dismissed.png (402x874 @1x) +Tapped @e51 (201, 609) +Error (TEXT_ENTRY_MISMATCH): text entry verification failed: expected "x", observed "x +seventeen +eighteen +nineteen +twenty" +Hint: Retry with --debug and inspect diagnostics log for details. +Diagnostic ID: mu4kztek-1dc7138c +Diagnostics Log: /Users/runner/.agent-device/sessions/composer-scroll-ios/runner.log +Tapped (370, 465) +Long pressed (376, 720) +/Volumes/devbox/workspace/composer-dock-ios-assert.cjs:6 +for(const name of ['content-dismissed','header-dismissed']) if(keyboard(read(name))) throw Error(`${name}: keyboard still visible`); + ^ + +Error: content-dismissed: keyboard still visible + at Object. (/Volumes/devbox/workspace/composer-dock-ios-assert.cjs:6:92) + at Module._compile (node:internal/modules/cjs/loader:1706:14) + at Object..js (node:internal/modules/cjs/loader:1839:10) + at Module.load (node:internal/modules/cjs/loader:1441:32) + at Function._load (node:internal/modules/cjs/loader:1263:12) + at TracingChannel.traceSync (node:diagnostics_channel:322:14) + at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) + at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:171:5) + at node:internal/main/run_main_module:36:49 + +Node.js v22.20.0 diff --git a/scroll-regression/ios/new-workspace-reopened.json b/scroll-regression/ios/new-workspace-reopened.json new file mode 100644 index 0000000000..d74b2fb1dc --- /dev/null +++ b/scroll-regression/ios/new-workspace-reopened.json @@ -0,0 +1,2286 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "label": "Paseo Debug", + "index": 0, + "enabled": true, + "depth": 0, + "type": "Application", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e1" + }, + { + "index": 1, + "enabled": true, + "depth": 1, + "parentIndex": 0, + "type": "Window", + "hittable": false, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "ref": "e2" + }, + { + "type": "Other", + "hittable": false, + "index": 2, + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "parentIndex": 1, + "enabled": true, + "depth": 2, + "ref": "e3" + }, + { + "index": 3, + "depth": 3, + "enabled": true, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "hittable": false, + "type": "Other", + "parentIndex": 2, + "ref": "e4" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "depth": 4, + "index": 4, + "parentIndex": 3, + "ref": "e5" + }, + { + "enabled": true, + "depth": 5, + "type": "Other", + "parentIndex": 4, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 5, + "hittable": false, + "ref": "e6" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "parentIndex": 5, + "index": 6, + "enabled": true, + "depth": 6, + "ref": "e7" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 6, + "depth": 7, + "type": "Other", + "enabled": true, + "index": 7, + "hittable": false, + "ref": "e8" + }, + { + "index": 8, + "depth": 8, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 7, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e9" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "y": 0, + "x": 0, + "width": 402, + "height": 874 + }, + "depth": 9, + "parentIndex": 8, + "type": "Other", + "index": 9, + "ref": "e10" + }, + { + "type": "Other", + "depth": 9, + "enabled": true, + "hittable": false, + "parentIndex": 8, + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "index": 10, + "ref": "e11" + }, + { + "depth": 10, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "type": "Other", + "parentIndex": 10, + "index": 11, + "hittable": false, + "enabled": true, + "ref": "e12" + }, + { + "depth": 10, + "hittable": false, + "enabled": true, + "parentIndex": 10, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "type": "Other", + "index": 12, + "ref": "e13" + }, + { + "index": 13, + "depth": 11, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 12, + "hittable": false, + "type": "Other", + "ref": "e14" + }, + { + "parentIndex": 12, + "enabled": true, + "hittable": false, + "depth": 11, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "index": 14, + "ref": "e15" + }, + { + "type": "Other", + "parentIndex": 14, + "depth": 12, + "hittable": false, + "index": 15, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "ref": "e16" + }, + { + "index": 16, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "depth": 13, + "parentIndex": 15, + "hittable": false, + "ref": "e17" + }, + { + "index": 17, + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "depth": 14, + "enabled": true, + "parentIndex": 16, + "ref": "e18" + }, + { + "index": 18, + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "label": "Open menu", + "hittable": false, + "depth": 15, + "parentIndex": 17, + "ref": "e19" + }, + { + "enabled": true, + "hittable": false, + "depth": 16, + "index": 19, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "label": "Open menu", + "parentIndex": 18, + "ref": "e20" + }, + { + "label": "Open menu", + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "depth": 17, + "enabled": true, + "index": 20, + "type": "Other", + "parentIndex": 19, + "ref": "e21" + }, + { + "label": "Open menu", + "identifier": "composer-dock-header", + "hittable": false, + "type": "Other", + "depth": 18, + "rect": { + "width": 402, + "y": 0, + "height": 126, + "x": 0 + }, + "parentIndex": 20, + "index": 21, + "enabled": true, + "ref": "e22" + }, + { + "depth": 19, + "rect": { + "x": 0, + "width": 402, + "y": 70, + "height": 56 + }, + "enabled": true, + "index": 22, + "hittable": false, + "type": "Other", + "parentIndex": 21, + "ref": "e23" + }, + { + "enabled": true, + "type": "Button", + "depth": 19, + "parentIndex": 21, + "label": "Open menu", + "hittable": false, + "identifier": "menu-button", + "index": 23, + "rect": { + "x": 8, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "ref": "e24" + }, + { + "hittable": false, + "parentIndex": 23, + "rect": { + "x": 16, + "width": 16, + "y": 91.6666669845581, + "height": 12 + }, + "index": 24, + "type": "Other", + "enabled": true, + "depth": 20, + "ref": "e25" + }, + { + "enabled": true, + "depth": 21, + "parentIndex": 24, + "type": "Other", + "rect": { + "x": 16, + "width": 16, + "y": 91.6666669845581, + "height": 1.3333358764648438 + }, + "hittable": false, + "index": 25, + "ref": "e26" + }, + { + "parentIndex": 24, + "enabled": true, + "index": 26, + "rect": { + "x": 16, + "width": 16, + "y": 97.00000047683716, + "height": 1.6666717529296875 + }, + "type": "Other", + "hittable": false, + "depth": 21, + "ref": "e27" + }, + { + "index": 27, + "type": "Other", + "rect": { + "x": 16, + "width": 8, + "y": 102.33333396911621, + "height": 1.6666641235351562 + }, + "enabled": true, + "depth": 21, + "parentIndex": 24, + "hittable": false, + "ref": "e28" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "depth": 18, + "enabled": true, + "parentIndex": 20, + "index": 28, + "hittable": false, + "ref": "e29" + }, + { + "parentIndex": 20, + "enabled": true, + "type": "Other", + "index": 29, + "depth": 18, + "hittable": false, + "label": "New workspace", + "identifier": "composer-viewport", + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 748 + }, + "ref": "e30" + }, + { + "label": "New workspace", + "index": 30, + "type": "Other", + "parentIndex": 29, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": -176, + "height": 748 + }, + "hittable": false, + "depth": 19, + "ref": "e31" + }, + { + "hittable": false, + "index": 31, + "label": "New workspace", + "rect": { + "x": 0, + "width": 402, + "y": -176, + "height": 307 + }, + "enabled": true, + "depth": 20, + "parentIndex": 30, + "identifier": "composer-dock-content", + "type": "Other", + "ref": "e32" + }, + { + "hittable": false, + "depth": 21, + "index": 32, + "type": "Other", + "parentIndex": 31, + "rect": { + "x": 0, + "width": 402, + "y": -176, + "height": 307 + }, + "enabled": true, + "ref": "e33" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": -94.33333587646484, + "height": 25.333328247070312 + }, + "parentIndex": 31, + "depth": 21, + "index": 33, + "label": "New workspace", + "hittable": false, + "ref": "e34" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "x": 24, + "y": -94.33333587646484, + "width": 362, + "height": 25.333343505859375 + }, + "parentIndex": 33, + "depth": 22, + "index": 34, + "label": "New workspace", + "hittable": false, + "ref": "e35" + }, + { + "parentIndex": 34, + "rect": { + "x": 24, + "y": -94.33333587646484, + "width": 362, + "height": 25.333343505859375 + }, + "label": "New workspace", + "hittable": false, + "type": "StaticText", + "depth": 23, + "enabled": true, + "index": 35, + "ref": "e36" + }, + { + "depth": 21, + "index": 36, + "parentIndex": 31, + "hittable": false, + "rect": { + "x": 0, + "y": -37, + "width": 402, + "height": 136 + }, + "identifier": "new-workspace-ref-picker-row", + "type": "Other", + "enabled": true, + "ref": "e37" + }, + { + "index": 37, + "label": "Workspace project", + "rect": { + "x": 16, + "y": -37, + "width": 238.6666717529297, + "height": 28 + }, + "enabled": true, + "depth": 21, + "type": "Button", + "hittable": false, + "identifier": "new-workspace-project-picker-trigger", + "parentIndex": 31, + "ref": "e38" + }, + { + "parentIndex": 37, + "depth": 22, + "type": "Other", + "hittable": false, + "rect": { + "x": 24, + "y": -31, + "width": 16, + "height": 16 + }, + "enabled": true, + "index": 38, + "ref": "e39" + }, + { + "hittable": false, + "depth": 22, + "index": 39, + "parentIndex": 37, + "rect": { + "x": 28, + "y": -29, + "width": 7.666667938232422, + "height": 12 + }, + "enabled": true, + "type": "StaticText", + "label": "C", + "ref": "e40" + }, + { + "hittable": false, + "label": "C", + "index": 40, + "type": "StaticText", + "rect": { + "x": 28, + "y": -29, + "width": 7.666667938232422, + "height": 12 + }, + "enabled": true, + "depth": 23, + "parentIndex": 39, + "ref": "e41" + }, + { + "hittable": false, + "identifier": "workspace-create-isolation-trigger", + "label": "Workspace isolation", + "index": 41, + "type": "Button", + "rect": { + "height": 28, + "y": -1, + "x": 16, + "width": 90.33333587646484 + }, + "enabled": true, + "depth": 21, + "parentIndex": 31, + "ref": "e42" + }, + { + "hittable": false, + "index": 42, + "type": "Other", + "rect": { + "height": 14, + "y": 7, + "x": 84.33333206176758, + "width": 14 + }, + "enabled": true, + "depth": 22, + "parentIndex": 41, + "ref": "e43" + }, + { + "hittable": false, + "index": 43, + "type": "Other", + "rect": { + "height": 14, + "y": 7, + "x": 84.33333206176758, + "width": 14 + }, + "enabled": true, + "depth": 23, + "parentIndex": 42, + "ref": "e44" + }, + { + "hittable": false, + "index": 44, + "type": "Other", + "rect": { + "height": 4.666666666666664, + "y": 11.666666666666664, + "x": 87.24999872843425, + "width": 8.166666666666657 + }, + "enabled": true, + "depth": 24, + "parentIndex": 43, + "ref": "e45" + }, + { + "hittable": false, + "index": 45, + "type": "Other", + "rect": { + "height": 4.666666666666664, + "y": 11.666666666666657, + "x": 87.24999872843425, + "width": 8.166666666666671 + }, + "enabled": true, + "depth": 25, + "parentIndex": 44, + "ref": "e46" + }, + { + "hittable": false, + "label": "Choose what to launch", + "index": 46, + "type": "Other", + "rect": { + "height": 28, + "y": 35, + "x": 16, + "width": 86.66666412353516 + }, + "enabled": true, + "depth": 21, + "parentIndex": 31, + "ref": "e47" + }, + { + "hittable": false, + "identifier": "new-workspace-launch-trigger", + "label": "Choose what to launch", + "index": 47, + "type": "Button", + "rect": { + "height": 28, + "y": 35, + "x": 16, + "width": 86.66666412353516 + }, + "enabled": true, + "depth": 22, + "parentIndex": 46, + "ref": "e48" + }, + { + "hittable": false, + "index": 48, + "type": "Other", + "rect": { + "height": 28, + "y": 71, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 21, + "parentIndex": 31, + "ref": "e49" + }, + { + "hittable": false, + "identifier": "composer-viewport-content", + "label": "Message agent...", + "index": 49, + "type": "Other", + "rect": { + "height": 441, + "y": 131, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 20, + "parentIndex": 30, + "ref": "e50" + }, + { + "hittable": false, + "identifier": "message-input-root", + "index": 50, + "type": "Other", + "rect": { + "height": 391, + "y": 131, + "x": 16, + "width": 370 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e51" + }, + { + "hittable": false, + "index": 51, + "type": "Other", + "rect": { + "height": 391, + "y": 131, + "x": 16, + "width": 370 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e52" + }, + { + "hittable": false, + "label": "Message agent...", + "index": 52, + "type": "Other", + "rect": { + "height": 333, + "y": 140, + "x": 29, + "width": 344 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e53" + }, + { + "hittable": false, + "label": "Message agent...", + "index": 53, + "type": "TextView", + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "rect": { + "height": 333, + "y": 140, + "x": 29, + "width": 344 + }, + "enabled": true, + "depth": 22, + "parentIndex": 52, + "ref": "e54" + }, + { + "hittable": false, + "label": "Vertical scroll bar, 2 pages", + "index": 54, + "type": "Other", + "value": "100%", + "rect": { + "height": 333, + "y": 140, + "x": 340, + "width": 30 + }, + "enabled": true, + "depth": 23, + "parentIndex": 53, + "ref": "e55" + }, + { + "hittable": false, + "index": 55, + "type": "Other", + "rect": { + "height": 281.33333333333337, + "y": 188.66666666666666, + "x": 367, + "width": 3 + }, + "enabled": true, + "depth": 24, + "parentIndex": 54, + "ref": "e56" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "index": 56, + "type": "Other", + "value": "0%", + "rect": { + "height": 30, + "y": 440, + "x": 29, + "width": 344 + }, + "enabled": true, + "depth": 23, + "parentIndex": 53, + "ref": "e57" + }, + { + "hittable": false, + "index": 57, + "type": "Other", + "rect": { + "height": 3, + "y": 467, + "x": 32, + "width": 335 + }, + "enabled": true, + "depth": 24, + "parentIndex": 56, + "ref": "e58" + }, + { + "hittable": false, + "identifier": "message-input-attach-button", + "label": "Add attachment", + "index": 58, + "type": "Button", + "rect": { + "height": 28, + "y": 485, + "x": 23, + "width": 28 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e59" + }, + { + "hittable": false, + "index": 59, + "type": "Other", + "rect": { + "height": 28, + "y": 485, + "x": 23, + "width": 28 + }, + "enabled": true, + "depth": 22, + "parentIndex": 58, + "ref": "e60" + }, + { + "hittable": false, + "index": 60, + "type": "Other", + "rect": { + "height": 20, + "y": 489, + "x": 27, + "width": 20 + }, + "enabled": true, + "depth": 23, + "parentIndex": 59, + "ref": "e61" + }, + { + "hittable": false, + "index": 61, + "type": "Other", + "rect": { + "height": 13.333333333333371, + "y": 492.3333333333333, + "x": 30.333333333333332, + "width": 13.333333333333332 + }, + "enabled": true, + "depth": 24, + "parentIndex": 60, + "ref": "e62" + }, + { + "hittable": false, + "index": 62, + "type": "Other", + "rect": { + "height": 1.6666666666666856, + "y": 498.16666666666674, + "x": 30.333333333333332, + "width": 13.333333333333332 + }, + "enabled": true, + "depth": 25, + "parentIndex": 61, + "ref": "e63" + }, + { + "hittable": false, + "index": 63, + "type": "Other", + "rect": { + "height": 13.333333333333314, + "y": 492.33333333333326, + "x": 36.16666666666667, + "width": 1.6666666666666643 + }, + "enabled": true, + "depth": 25, + "parentIndex": 61, + "ref": "e64" + }, + { + "hittable": false, + "label": "Select model (Select model)", + "index": 64, + "type": "Other", + "rect": { + "height": 28, + "y": 485, + "x": 51, + "width": 264 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e65" + }, + { + "hittable": false, + "identifier": "combined-model-selector", + "label": "Select model (Select model)", + "index": 65, + "type": "Button", + "rect": { + "height": 28, + "y": 485, + "x": 51, + "width": 105.66667175292969 + }, + "enabled": true, + "depth": 22, + "parentIndex": 64, + "ref": "e66" + }, + { + "hittable": false, + "label": "Select model", + "index": 66, + "type": "StaticText", + "rect": { + "height": 18, + "y": 490, + "x": 59, + "width": 89.66667175292969 + }, + "enabled": true, + "depth": 23, + "parentIndex": 65, + "ref": "e67" + }, + { + "hittable": false, + "label": "Select model", + "index": 67, + "type": "StaticText", + "rect": { + "height": 18, + "y": 490, + "x": 59, + "width": 89.66667175292969 + }, + "enabled": true, + "depth": 24, + "parentIndex": 66, + "ref": "e68" + }, + { + "hittable": false, + "label": "Start dictation", + "index": 68, + "type": "Button", + "rect": { + "height": 28, + "y": 485, + "x": 315, + "width": 28 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e69" + }, + { + "hittable": false, + "identifier": "workspace-create-submit", + "label": "Create", + "index": 69, + "type": "Button", + "rect": { + "height": 28, + "y": 485, + "x": 351, + "width": 28 + }, + "enabled": true, + "depth": 21, + "parentIndex": 49, + "ref": "e70" + }, + { + "hittable": false, + "index": 70, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 11, + "parentIndex": 12, + "ref": "e71" + }, + { + "hittable": false, + "index": 71, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 6, + "ref": "e72" + }, + { + "hittable": false, + "index": 72, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 8, + "parentIndex": 71, + "ref": "e73" + }, + { + "hittable": false, + "index": 73, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 9, + "parentIndex": 72, + "ref": "e74" + }, + { + "hittable": false, + "index": 74, + "type": "Window", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 1, + "parentIndex": 0, + "ref": "e75" + }, + { + "hittable": false, + "index": 75, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 2, + "parentIndex": 74, + "ref": "e76" + }, + { + "hittable": false, + "index": 76, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 3, + "parentIndex": 75, + "ref": "e77" + }, + { + "hittable": false, + "index": 77, + "type": "Other", + "rect": { + "height": 336, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 3, + "parentIndex": 75, + "ref": "e78" + }, + { + "hittable": false, + "index": 78, + "type": "Other", + "rect": { + "height": 278, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 77, + "ref": "e79" + }, + { + "hittable": true, + "label": "Emoji", + "index": 79, + "type": "Window", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 1, + "parentIndex": 0, + "ref": "e80" + }, + { + "hittable": true, + "label": "Emoji", + "index": 80, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 2, + "parentIndex": 79, + "ref": "e81" + }, + { + "hittable": true, + "label": "Emoji", + "index": 81, + "type": "Other", + "rect": { + "height": 336, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 3, + "parentIndex": 80, + "ref": "e82" + }, + { + "hittable": false, + "index": 82, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 81, + "ref": "e83" + }, + { + "hittable": false, + "index": 83, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 5, + "parentIndex": 82, + "ref": "e84" + }, + { + "hittable": false, + "index": 84, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 6, + "parentIndex": 83, + "ref": "e85" + }, + { + "hittable": true, + "identifier": "SystemInputAssistantView", + "label": "Typing Predictions", + "index": 85, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 81, + "ref": "e86" + }, + { + "hittable": true, + "label": "Typing Predictions", + "index": 86, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 5, + "parentIndex": 85, + "ref": "e87" + }, + { + "hittable": true, + "identifier": "CenterPageView", + "label": "Typing Predictions", + "index": 87, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 6, + "parentIndex": 86, + "ref": "e88" + }, + { + "hittable": false, + "index": 88, + "type": "Other", + "rect": { + "height": 1245, + "y": -62, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 87, + "ref": "e89" + }, + { + "hittable": false, + "index": 89, + "type": "ScrollView", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 8, + "parentIndex": 88, + "ref": "e90" + }, + { + "hittable": true, + "label": "Typing Predictions", + "index": 90, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 87, + "ref": "e91" + }, + { + "hittable": true, + "label": "Typing Predictions", + "index": 91, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 8, + "parentIndex": 90, + "ref": "e92" + }, + { + "hittable": true, + "label": "“twelve”", + "index": 92, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 9, + "parentIndex": 91, + "ref": "e93" + }, + { + "hittable": true, + "label": "“twelve”", + "index": 93, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 10, + "parentIndex": 92, + "ref": "e94" + }, + { + "hittable": true, + "label": "“twelve”", + "index": 94, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 0, + "width": 134 + }, + "enabled": true, + "depth": 11, + "parentIndex": 93, + "ref": "e95" + }, + { + "hittable": true, + "label": "twenty", + "index": 95, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 134, + "width": 134 + }, + "enabled": true, + "depth": 11, + "parentIndex": 93, + "ref": "e96" + }, + { + "hittable": true, + "label": "tweeting", + "index": 96, + "type": "Other", + "rect": { + "height": 45, + "y": 538, + "x": 268, + "width": 134 + }, + "enabled": true, + "depth": 11, + "parentIndex": 93, + "ref": "e97" + }, + { + "hittable": false, + "index": 97, + "type": "Other", + "rect": { + "height": 233, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 81, + "ref": "e98" + }, + { + "hittable": false, + "index": 98, + "type": "Other", + "rect": { + "height": 291, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 5, + "parentIndex": 97, + "ref": "e99" + }, + { + "hittable": false, + "index": 99, + "type": "Other", + "rect": { + "height": 291, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 6, + "parentIndex": 98, + "ref": "e100" + }, + { + "hittable": false, + "index": 100, + "type": "Other", + "rect": { + "height": 291, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 99, + "ref": "e101" + }, + { + "hittable": false, + "label": "q", + "index": 101, + "type": "Other", + "rect": { + "height": 233, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 81, + "ref": "e102" + }, + { + "hittable": false, + "label": "q", + "index": 102, + "type": "Keyboard", + "rect": { + "height": 233, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 5, + "parentIndex": 101, + "ref": "e103" + }, + { + "hittable": false, + "label": "q", + "index": 103, + "type": "Other", + "rect": { + "height": 233, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 6, + "parentIndex": 102, + "ref": "e104" + }, + { + "hittable": false, + "identifier": "UIKeyboardLayoutStar Preview", + "label": "q", + "index": 104, + "type": "Other", + "rect": { + "height": 233, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 103, + "ref": "e105" + }, + { + "hittable": false, + "label": "q", + "index": 105, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 0, + "width": 40.333333333333336 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e106" + }, + { + "hittable": false, + "label": "w", + "index": 106, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 40.333333333333336, + "width": 40.00000000000001 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e107" + }, + { + "hittable": false, + "label": "e", + "index": 107, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 80.33333333333334, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e108" + }, + { + "hittable": false, + "label": "r", + "index": 108, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 120.66666666666669, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e109" + }, + { + "hittable": false, + "label": "t", + "index": 109, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 160.66666666666669, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e110" + }, + { + "hittable": false, + "label": "y", + "index": 110, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 201.00000000000003, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e111" + }, + { + "hittable": false, + "label": "u", + "index": 111, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 241.33333333333337, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e112" + }, + { + "hittable": false, + "label": "i", + "index": 112, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 281.33333333333337, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e113" + }, + { + "hittable": false, + "label": "o", + "index": 113, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 321.6666666666667, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e114" + }, + { + "hittable": false, + "label": "p", + "index": 114, + "type": "Key", + "rect": { + "height": 46, + "y": 590, + "x": 361.6666666666667, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e115" + }, + { + "hittable": false, + "label": "a", + "index": 115, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 19.666666666666668, + "width": 40.33333333333333 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e116" + }, + { + "hittable": false, + "label": "s", + "index": 116, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 60, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e117" + }, + { + "hittable": false, + "label": "d", + "index": 117, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 100.33333333333334, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e118" + }, + { + "hittable": false, + "label": "f", + "index": 118, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 140.33333333333334, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e119" + }, + { + "hittable": false, + "label": "g", + "index": 119, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 181.2026666666667, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e120" + }, + { + "hittable": false, + "label": "h", + "index": 120, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 221.2026666666667, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e121" + }, + { + "hittable": false, + "label": "j", + "index": 121, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 261.536, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e122" + }, + { + "hittable": false, + "label": "k", + "index": 122, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 301.536, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e123" + }, + { + "hittable": false, + "label": "l", + "index": 123, + "type": "Key", + "rect": { + "height": 46, + "y": 644, + "x": 341.8693333333333, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e124" + }, + { + "hittable": false, + "identifier": "shift", + "label": "shift", + "index": 124, + "type": "Button", + "rect": { + "height": 46, + "y": 698, + "x": 0, + "width": 51.333333333333336 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e125" + }, + { + "hittable": false, + "label": "z", + "index": 125, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 60, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e126" + }, + { + "hittable": false, + "label": "x", + "index": 126, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 100.33333333333334, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e127" + }, + { + "hittable": false, + "label": "c", + "index": 127, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 140.33333333333334, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e128" + }, + { + "hittable": false, + "label": "v", + "index": 128, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 181.2026666666667, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e129" + }, + { + "hittable": false, + "label": "b", + "index": 129, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 221.2026666666667, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e130" + }, + { + "hittable": false, + "label": "n", + "index": 130, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 261.536, + "width": 40 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e131" + }, + { + "hittable": false, + "label": "m", + "index": 131, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 301.536, + "width": 40.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e132" + }, + { + "hittable": false, + "identifier": "delete", + "label": "delete", + "index": 132, + "type": "Key", + "rect": { + "height": 46, + "y": 698, + "x": 350.42133333333334, + "width": 51.333333333333314 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e133" + }, + { + "hittable": false, + "identifier": "more", + "label": "numbers", + "index": 133, + "type": "Key", + "rect": { + "height": 46, + "y": 752, + "x": 0, + "width": 101 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e134" + }, + { + "hittable": false, + "identifier": "space", + "label": "space", + "index": 134, + "type": "Key", + "rect": { + "height": 46, + "y": 752, + "x": 100.33333333333334, + "width": 201.33333333333334 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e135" + }, + { + "hittable": false, + "identifier": "Return", + "label": "return", + "index": 135, + "type": "Button", + "rect": { + "height": 46, + "y": 752, + "x": 301.6666666666667, + "width": 100.33333333333331 + }, + "enabled": true, + "depth": 8, + "parentIndex": 104, + "ref": "e136" + }, + { + "hittable": true, + "label": "Emoji", + "index": 136, + "type": "Other", + "rect": { + "height": 291, + "y": 583, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 4, + "parentIndex": 81, + "ref": "e137" + }, + { + "hittable": true, + "label": "Emoji", + "index": 137, + "type": "Button", + "rect": { + "height": 68.73516393505099, + "y": 805.6989567998571, + "x": 8.47726568115926, + "width": 68.0852958475086 + }, + "enabled": true, + "depth": 5, + "parentIndex": 136, + "ref": "e138" + }, + { + "hittable": false, + "index": 138, + "type": "StaticText", + "rect": { + "height": 0, + "y": 805.6989567998571, + "x": 8.47726568115926, + "width": 0 + }, + "enabled": true, + "depth": 6, + "parentIndex": 137, + "ref": "e139" + }, + { + "hittable": false, + "identifier": "dictation", + "label": "Dictate", + "index": 139, + "type": "Button", + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 68.08529584750863 + }, + "enabled": true, + "depth": 5, + "parentIndex": 136, + "ref": "e140" + }, + { + "hittable": false, + "index": 140, + "type": "StaticText", + "rect": { + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 0 + }, + "enabled": true, + "depth": 6, + "parentIndex": 139, + "ref": "e141" + }, + { + "hittable": true, + "identifier": "dictation", + "label": "Dictate", + "index": 141, + "type": "Button", + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 68.08529584750863 + }, + "enabled": true, + "depth": 5, + "parentIndex": 136, + "ref": "e142" + }, + { + "hittable": false, + "index": 142, + "type": "StaticText", + "rect": { + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 0 + }, + "enabled": true, + "depth": 6, + "parentIndex": 141, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 138, + "p50Ms": 141, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 138 + } + } + }, + "refsGeneration": 776202 + } +} diff --git a/scroll-regression/ios/new-workspace-target.json b/scroll-regression/ios/new-workspace-target.json new file mode 100644 index 0000000000..4f9c972160 --- /dev/null +++ b/scroll-regression/ios/new-workspace-target.json @@ -0,0 +1,2286 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "enabled": true, + "index": 0, + "label": "Paseo Debug", + "depth": 0, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": true, + "ref": "e1" + }, + { + "hittable": false, + "parentIndex": 0, + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 1, + "enabled": true, + "index": 1, + "type": "Window", + "ref": "e2" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "height": 874, + "x": 0, + "width": 402, + "y": 0 + }, + "depth": 2, + "index": 2, + "parentIndex": 1, + "enabled": true, + "ref": "e3" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "index": 3, + "depth": 3, + "parentIndex": 2, + "ref": "e4" + }, + { + "parentIndex": 3, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "index": 4, + "hittable": false, + "depth": 4, + "enabled": true, + "ref": "e5" + }, + { + "index": 5, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "enabled": true, + "parentIndex": 4, + "hittable": false, + "type": "Other", + "depth": 5, + "ref": "e6" + }, + { + "depth": 6, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 6, + "parentIndex": 5, + "ref": "e7" + }, + { + "rect": { + "x": 0, + "y": 0, + "height": 874, + "width": 402 + }, + "enabled": true, + "depth": 7, + "parentIndex": 6, + "type": "Other", + "hittable": false, + "index": 7, + "ref": "e8" + }, + { + "depth": 8, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 7, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 8, + "ref": "e9" + }, + { + "index": 9, + "hittable": false, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "depth": 9, + "enabled": true, + "parentIndex": 8, + "type": "Other", + "ref": "e10" + }, + { + "index": 10, + "depth": 9, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "parentIndex": 8, + "hittable": false, + "ref": "e11" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 10, + "parentIndex": 10, + "index": 11, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "ref": "e12" + }, + { + "hittable": false, + "index": 12, + "depth": 10, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "parentIndex": 10, + "ref": "e13" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "depth": 11, + "parentIndex": 12, + "index": 13, + "ref": "e14" + }, + { + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "type": "Other", + "index": 14, + "enabled": true, + "depth": 11, + "hittable": false, + "ref": "e15" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "enabled": true, + "parentIndex": 14, + "index": 15, + "type": "Other", + "depth": 12, + "ref": "e16" + }, + { + "hittable": false, + "parentIndex": 15, + "depth": 13, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 16, + "type": "Other", + "ref": "e17" + }, + { + "parentIndex": 16, + "enabled": true, + "index": 17, + "depth": 14, + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "type": "Other", + "hittable": false, + "ref": "e18" + }, + { + "type": "Other", + "depth": 15, + "parentIndex": 17, + "index": 18, + "hittable": false, + "label": "Open menu", + "rect": { + "height": 874, + "y": 0, + "x": 0, + "width": 402 + }, + "enabled": true, + "ref": "e19" + }, + { + "index": 19, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "parentIndex": 18, + "type": "Other", + "depth": 16, + "label": "Open menu", + "enabled": true, + "hittable": false, + "ref": "e20" + }, + { + "label": "Open menu", + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "depth": 17, + "index": 20, + "parentIndex": 19, + "hittable": false, + "type": "Other", + "ref": "e21" + }, + { + "enabled": true, + "index": 21, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "height": 126, + "y": 0, + "width": 402 + }, + "depth": 18, + "label": "Open menu", + "identifier": "composer-dock-header", + "parentIndex": 20, + "ref": "e22" + }, + { + "parentIndex": 21, + "hittable": false, + "depth": 19, + "rect": { + "width": 402, + "height": 56, + "x": 0, + "y": 70 + }, + "index": 22, + "type": "Other", + "enabled": true, + "ref": "e23" + }, + { + "parentIndex": 21, + "index": 23, + "type": "Button", + "depth": 19, + "enabled": true, + "label": "Open menu", + "identifier": "menu-button", + "hittable": false, + "rect": { + "width": 32, + "height": 32, + "x": 8, + "y": 81.6666669845581 + }, + "ref": "e24" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 23, + "index": 24, + "rect": { + "width": 16, + "height": 12, + "x": 16, + "y": 91.6666669845581 + }, + "enabled": true, + "depth": 20, + "ref": "e25" + }, + { + "rect": { + "width": 16, + "height": 1.3333358764648438, + "x": 16, + "y": 91.6666669845581 + }, + "parentIndex": 24, + "hittable": false, + "type": "Other", + "index": 25, + "enabled": true, + "depth": 21, + "ref": "e26" + }, + { + "depth": 21, + "index": 26, + "enabled": true, + "parentIndex": 24, + "hittable": false, + "type": "Other", + "rect": { + "width": 16, + "height": 1.6666717529296875, + "x": 16, + "y": 97.00000047683716 + }, + "ref": "e27" + }, + { + "depth": 21, + "index": 27, + "rect": { + "width": 8, + "height": 1.6666641235351562, + "x": 16, + "y": 102.33333396911621 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 24, + "ref": "e28" + }, + { + "depth": 18, + "index": 28, + "parentIndex": 20, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "hittable": false, + "enabled": true, + "ref": "e29" + }, + { + "label": "New workspace", + "depth": 18, + "identifier": "composer-viewport", + "rect": { + "width": 402, + "height": 748, + "x": 0, + "y": 126 + }, + "index": 29, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 20, + "ref": "e30" + }, + { + "label": "New workspace", + "depth": 19, + "rect": { + "width": 402, + "height": 748, + "x": 0, + "y": -176 + }, + "index": 30, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 29, + "ref": "e31" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 307, + "x": 0, + "y": -176 + }, + "parentIndex": 30, + "identifier": "composer-dock-content", + "depth": 20, + "index": 31, + "label": "New workspace", + "hittable": false, + "ref": "e32" + }, + { + "rect": { + "width": 402, + "height": 307, + "x": 0, + "y": -176 + }, + "hittable": false, + "depth": 21, + "index": 32, + "type": "Other", + "parentIndex": 31, + "enabled": true, + "ref": "e33" + }, + { + "parentIndex": 31, + "label": "New workspace", + "enabled": true, + "depth": 21, + "type": "Other", + "index": 33, + "hittable": false, + "rect": { + "width": 402, + "height": 25.333328247070312, + "x": 0, + "y": -94.33333587646484 + }, + "ref": "e34" + }, + { + "hittable": false, + "enabled": true, + "index": 34, + "rect": { + "width": 362, + "height": 25.333343505859375, + "x": 24, + "y": -94.33333587646484 + }, + "label": "New workspace", + "parentIndex": 33, + "type": "StaticText", + "depth": 22, + "ref": "e35" + }, + { + "index": 35, + "rect": { + "width": 362, + "height": 25.333343505859375, + "x": 24, + "y": -94.33333587646484 + }, + "label": "New workspace", + "type": "StaticText", + "enabled": true, + "parentIndex": 34, + "depth": 23, + "hittable": false, + "ref": "e36" + }, + { + "hittable": false, + "identifier": "new-workspace-ref-picker-row", + "enabled": true, + "index": 36, + "parentIndex": 31, + "type": "Other", + "rect": { + "width": 402, + "height": 136, + "x": 0, + "y": -37 + }, + "depth": 21, + "ref": "e37" + }, + { + "identifier": "new-workspace-project-picker-trigger", + "depth": 21, + "enabled": true, + "label": "Workspace project", + "index": 37, + "hittable": false, + "parentIndex": 31, + "rect": { + "width": 238.6666717529297, + "height": 28, + "x": 16, + "y": -37 + }, + "type": "Button", + "ref": "e38" + }, + { + "rect": { + "width": 16, + "height": 16, + "x": 24, + "y": -31 + }, + "hittable": false, + "type": "Other", + "index": 38, + "enabled": true, + "depth": 22, + "parentIndex": 37, + "ref": "e39" + }, + { + "index": 39, + "enabled": true, + "parentIndex": 37, + "label": "C", + "depth": 22, + "type": "StaticText", + "rect": { + "width": 7.666667938232422, + "height": 12, + "x": 28, + "y": -29 + }, + "hittable": false, + "ref": "e40" + }, + { + "enabled": true, + "rect": { + "width": 7.666667938232422, + "height": 12, + "x": 28, + "y": -29 + }, + "parentIndex": 39, + "hittable": false, + "type": "StaticText", + "index": 40, + "label": "C", + "depth": 23, + "ref": "e41" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": -1, + "width": 90.33333587646484, + "x": 16 + }, + "parentIndex": 31, + "hittable": false, + "identifier": "workspace-create-isolation-trigger", + "type": "Button", + "index": 41, + "label": "Workspace isolation", + "depth": 21, + "ref": "e42" + }, + { + "enabled": true, + "rect": { + "height": 14, + "y": 7, + "width": 14, + "x": 84.33333206176758 + }, + "parentIndex": 41, + "hittable": false, + "type": "Other", + "index": 42, + "depth": 22, + "ref": "e43" + }, + { + "enabled": true, + "rect": { + "height": 14, + "y": 7, + "width": 14, + "x": 84.33333206176758 + }, + "parentIndex": 42, + "hittable": false, + "type": "Other", + "index": 43, + "depth": 23, + "ref": "e44" + }, + { + "enabled": true, + "rect": { + "height": 4.666666666666664, + "y": 11.666666666666664, + "width": 8.166666666666657, + "x": 87.24999872843425 + }, + "parentIndex": 43, + "hittable": false, + "type": "Other", + "index": 44, + "depth": 24, + "ref": "e45" + }, + { + "enabled": true, + "rect": { + "height": 4.666666666666664, + "y": 11.666666666666657, + "width": 8.166666666666671, + "x": 87.24999872843425 + }, + "parentIndex": 44, + "hittable": false, + "type": "Other", + "index": 45, + "depth": 25, + "ref": "e46" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 35, + "width": 86.66666412353516, + "x": 16 + }, + "parentIndex": 31, + "hittable": false, + "type": "Other", + "index": 46, + "label": "Choose what to launch", + "depth": 21, + "ref": "e47" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 35, + "width": 86.66666412353516, + "x": 16 + }, + "parentIndex": 46, + "hittable": false, + "identifier": "new-workspace-launch-trigger", + "type": "Button", + "index": 47, + "label": "Choose what to launch", + "depth": 22, + "ref": "e48" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 71, + "width": 402, + "x": 0 + }, + "parentIndex": 31, + "hittable": false, + "type": "Other", + "index": 48, + "depth": 21, + "ref": "e49" + }, + { + "enabled": true, + "rect": { + "height": 441, + "y": 131, + "width": 402, + "x": 0 + }, + "parentIndex": 30, + "hittable": false, + "identifier": "composer-viewport-content", + "type": "Other", + "index": 49, + "label": "Message agent...", + "depth": 20, + "ref": "e50" + }, + { + "enabled": true, + "rect": { + "height": 391, + "y": 131, + "width": 370, + "x": 16 + }, + "parentIndex": 49, + "hittable": false, + "identifier": "message-input-root", + "type": "Other", + "index": 50, + "depth": 21, + "ref": "e51" + }, + { + "enabled": true, + "rect": { + "height": 391, + "y": 131, + "width": 370, + "x": 16 + }, + "parentIndex": 49, + "hittable": false, + "type": "Other", + "index": 51, + "depth": 21, + "ref": "e52" + }, + { + "enabled": true, + "rect": { + "height": 333, + "y": 140, + "width": 344, + "x": 29 + }, + "parentIndex": 49, + "hittable": false, + "type": "Other", + "index": 52, + "label": "Message agent...", + "depth": 21, + "ref": "e53" + }, + { + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "enabled": true, + "rect": { + "height": 333, + "y": 140, + "width": 344, + "x": 29 + }, + "parentIndex": 52, + "hittable": false, + "type": "TextView", + "index": 53, + "label": "Message agent...", + "depth": 22, + "ref": "e54" + }, + { + "value": "100%", + "enabled": true, + "rect": { + "height": 333, + "y": 140, + "width": 30, + "x": 340 + }, + "parentIndex": 53, + "hittable": false, + "type": "Other", + "index": 54, + "label": "Vertical scroll bar, 2 pages", + "depth": 23, + "ref": "e55" + }, + { + "enabled": true, + "rect": { + "height": 281.33333333333337, + "y": 188.66666666666666, + "width": 3, + "x": 367 + }, + "parentIndex": 54, + "hittable": false, + "type": "Other", + "index": 55, + "depth": 24, + "ref": "e56" + }, + { + "value": "0%", + "enabled": true, + "rect": { + "height": 30, + "y": 440, + "width": 344, + "x": 29 + }, + "parentIndex": 53, + "hittable": false, + "type": "Other", + "index": 56, + "label": "Horizontal scroll bar, 1 page", + "depth": 23, + "ref": "e57" + }, + { + "enabled": true, + "rect": { + "height": 3, + "y": 467, + "width": 335, + "x": 32 + }, + "parentIndex": 56, + "hittable": false, + "type": "Other", + "index": 57, + "depth": 24, + "ref": "e58" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 28, + "x": 23 + }, + "parentIndex": 49, + "hittable": false, + "identifier": "message-input-attach-button", + "type": "Button", + "index": 58, + "label": "Add attachment", + "depth": 21, + "ref": "e59" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 28, + "x": 23 + }, + "parentIndex": 58, + "hittable": false, + "type": "Other", + "index": 59, + "depth": 22, + "ref": "e60" + }, + { + "enabled": true, + "rect": { + "height": 20, + "y": 489, + "width": 20, + "x": 27 + }, + "parentIndex": 59, + "hittable": false, + "type": "Other", + "index": 60, + "depth": 23, + "ref": "e61" + }, + { + "enabled": true, + "rect": { + "height": 13.333333333333371, + "y": 492.3333333333333, + "width": 13.333333333333332, + "x": 30.333333333333332 + }, + "parentIndex": 60, + "hittable": false, + "type": "Other", + "index": 61, + "depth": 24, + "ref": "e62" + }, + { + "enabled": true, + "rect": { + "height": 1.6666666666666856, + "y": 498.16666666666674, + "width": 13.333333333333332, + "x": 30.333333333333332 + }, + "parentIndex": 61, + "hittable": false, + "type": "Other", + "index": 62, + "depth": 25, + "ref": "e63" + }, + { + "enabled": true, + "rect": { + "height": 13.333333333333314, + "y": 492.33333333333326, + "width": 1.6666666666666643, + "x": 36.16666666666667 + }, + "parentIndex": 61, + "hittable": false, + "type": "Other", + "index": 63, + "depth": 25, + "ref": "e64" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 264, + "x": 51 + }, + "parentIndex": 49, + "hittable": false, + "type": "Other", + "index": 64, + "label": "Select model (Select model)", + "depth": 21, + "ref": "e65" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 105.66667175292969, + "x": 51 + }, + "parentIndex": 64, + "hittable": false, + "identifier": "combined-model-selector", + "type": "Button", + "index": 65, + "label": "Select model (Select model)", + "depth": 22, + "ref": "e66" + }, + { + "enabled": true, + "rect": { + "height": 18, + "y": 490, + "width": 89.66667175292969, + "x": 59 + }, + "parentIndex": 65, + "hittable": false, + "type": "StaticText", + "index": 66, + "label": "Select model", + "depth": 23, + "ref": "e67" + }, + { + "enabled": true, + "rect": { + "height": 18, + "y": 490, + "width": 89.66667175292969, + "x": 59 + }, + "parentIndex": 66, + "hittable": false, + "type": "StaticText", + "index": 67, + "label": "Select model", + "depth": 24, + "ref": "e68" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 28, + "x": 315 + }, + "parentIndex": 49, + "hittable": false, + "type": "Button", + "index": 68, + "label": "Start dictation", + "depth": 21, + "ref": "e69" + }, + { + "enabled": true, + "rect": { + "height": 28, + "y": 485, + "width": 28, + "x": 351 + }, + "parentIndex": 49, + "hittable": false, + "identifier": "workspace-create-submit", + "type": "Button", + "index": 69, + "label": "Create", + "depth": 21, + "ref": "e70" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 12, + "hittable": false, + "type": "Other", + "index": 70, + "depth": 11, + "ref": "e71" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 6, + "hittable": false, + "type": "Other", + "index": 71, + "depth": 7, + "ref": "e72" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 71, + "hittable": false, + "type": "Other", + "index": 72, + "depth": 8, + "ref": "e73" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 72, + "hittable": false, + "type": "Other", + "index": 73, + "depth": 9, + "ref": "e74" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 0, + "hittable": false, + "type": "Window", + "index": 74, + "depth": 1, + "ref": "e75" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 74, + "hittable": false, + "type": "Other", + "index": 75, + "depth": 2, + "ref": "e76" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 75, + "hittable": false, + "type": "Other", + "index": 76, + "depth": 3, + "ref": "e77" + }, + { + "enabled": true, + "rect": { + "height": 336, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 75, + "hittable": false, + "type": "Other", + "index": 77, + "depth": 3, + "ref": "e78" + }, + { + "enabled": true, + "rect": { + "height": 278, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 77, + "hittable": false, + "type": "Other", + "index": 78, + "depth": 4, + "ref": "e79" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 0, + "hittable": true, + "type": "Window", + "index": 79, + "label": "Emoji", + "depth": 1, + "ref": "e80" + }, + { + "enabled": true, + "rect": { + "height": 874, + "y": 0, + "width": 402, + "x": 0 + }, + "parentIndex": 79, + "hittable": true, + "type": "Other", + "index": 80, + "label": "Emoji", + "depth": 2, + "ref": "e81" + }, + { + "enabled": true, + "rect": { + "height": 336, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 80, + "hittable": true, + "type": "Other", + "index": 81, + "label": "Emoji", + "depth": 3, + "ref": "e82" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 81, + "hittable": false, + "type": "Other", + "index": 82, + "depth": 4, + "ref": "e83" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 82, + "hittable": false, + "type": "Other", + "index": 83, + "depth": 5, + "ref": "e84" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 83, + "hittable": false, + "type": "Other", + "index": 84, + "depth": 6, + "ref": "e85" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 81, + "hittable": true, + "identifier": "SystemInputAssistantView", + "type": "Other", + "index": 85, + "label": "Typing Predictions", + "depth": 4, + "ref": "e86" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 85, + "hittable": true, + "type": "Other", + "index": 86, + "label": "Typing Predictions", + "depth": 5, + "ref": "e87" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 86, + "hittable": true, + "identifier": "CenterPageView", + "type": "Other", + "index": 87, + "label": "Typing Predictions", + "depth": 6, + "ref": "e88" + }, + { + "enabled": true, + "rect": { + "height": 1245, + "y": -62, + "width": 402, + "x": 0 + }, + "parentIndex": 87, + "hittable": false, + "type": "Other", + "index": 88, + "depth": 7, + "ref": "e89" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 88, + "hittable": false, + "type": "ScrollView", + "index": 89, + "depth": 8, + "ref": "e90" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 87, + "hittable": true, + "type": "Other", + "index": 90, + "label": "Typing Predictions", + "depth": 7, + "ref": "e91" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 90, + "hittable": true, + "type": "Other", + "index": 91, + "label": "Typing Predictions", + "depth": 8, + "ref": "e92" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 91, + "hittable": true, + "type": "Other", + "index": 92, + "label": "“twelve”", + "depth": 9, + "ref": "e93" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 402, + "x": 0 + }, + "parentIndex": 92, + "hittable": true, + "type": "Other", + "index": 93, + "label": "“twelve”", + "depth": 10, + "ref": "e94" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 134, + "x": 0 + }, + "parentIndex": 93, + "hittable": true, + "type": "Other", + "index": 94, + "label": "“twelve”", + "depth": 11, + "ref": "e95" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 134, + "x": 134 + }, + "parentIndex": 93, + "hittable": true, + "type": "Other", + "index": 95, + "label": "twenty", + "depth": 11, + "ref": "e96" + }, + { + "enabled": true, + "rect": { + "height": 45, + "y": 538, + "width": 134, + "x": 268 + }, + "parentIndex": 93, + "hittable": true, + "type": "Other", + "index": 96, + "label": "tweeting", + "depth": 11, + "ref": "e97" + }, + { + "enabled": true, + "rect": { + "height": 233, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 81, + "hittable": false, + "type": "Other", + "index": 97, + "depth": 4, + "ref": "e98" + }, + { + "enabled": true, + "rect": { + "height": 291, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 97, + "hittable": false, + "type": "Other", + "index": 98, + "depth": 5, + "ref": "e99" + }, + { + "enabled": true, + "rect": { + "height": 291, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 98, + "hittable": false, + "type": "Other", + "index": 99, + "depth": 6, + "ref": "e100" + }, + { + "enabled": true, + "rect": { + "height": 291, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 99, + "hittable": false, + "type": "Other", + "index": 100, + "depth": 7, + "ref": "e101" + }, + { + "enabled": true, + "rect": { + "height": 233, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 81, + "hittable": false, + "type": "Other", + "index": 101, + "label": "q", + "depth": 4, + "ref": "e102" + }, + { + "enabled": true, + "rect": { + "height": 233, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 101, + "hittable": false, + "type": "Keyboard", + "index": 102, + "label": "q", + "depth": 5, + "ref": "e103" + }, + { + "enabled": true, + "rect": { + "height": 233, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 102, + "hittable": false, + "type": "Other", + "index": 103, + "label": "q", + "depth": 6, + "ref": "e104" + }, + { + "enabled": true, + "rect": { + "height": 233, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 103, + "hittable": false, + "identifier": "UIKeyboardLayoutStar Preview", + "type": "Other", + "index": 104, + "label": "q", + "depth": 7, + "ref": "e105" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.333333333333336, + "x": 0 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 105, + "label": "q", + "depth": 8, + "ref": "e106" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.00000000000001, + "x": 40.333333333333336 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 106, + "label": "w", + "depth": 8, + "ref": "e107" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.33333333333334, + "x": 80.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 107, + "label": "e", + "depth": 8, + "ref": "e108" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40, + "x": 120.66666666666669 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 108, + "label": "r", + "depth": 8, + "ref": "e109" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.33333333333334, + "x": 160.66666666666669 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 109, + "label": "t", + "depth": 8, + "ref": "e110" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.33333333333334, + "x": 201.00000000000003 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 110, + "label": "y", + "depth": 8, + "ref": "e111" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40, + "x": 241.33333333333337 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 111, + "label": "u", + "depth": 8, + "ref": "e112" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.333333333333314, + "x": 281.33333333333337 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 112, + "label": "i", + "depth": 8, + "ref": "e113" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40, + "x": 321.6666666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 113, + "label": "o", + "depth": 8, + "ref": "e114" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 590, + "width": 40.333333333333314, + "x": 361.6666666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 114, + "label": "p", + "depth": 8, + "ref": "e115" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.33333333333333, + "x": 19.666666666666668 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 115, + "label": "a", + "depth": 8, + "ref": "e116" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.33333333333334, + "x": 60 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 116, + "label": "s", + "depth": 8, + "ref": "e117" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40, + "x": 100.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 117, + "label": "d", + "depth": 8, + "ref": "e118" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.33333333333334, + "x": 140.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 118, + "label": "f", + "depth": 8, + "ref": "e119" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40, + "x": 181.2026666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 119, + "label": "g", + "depth": 8, + "ref": "e120" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.333333333333314, + "x": 221.2026666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 120, + "label": "h", + "depth": 8, + "ref": "e121" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40, + "x": 261.536 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 121, + "label": "j", + "depth": 8, + "ref": "e122" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.333333333333314, + "x": 301.536 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 122, + "label": "k", + "depth": 8, + "ref": "e123" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 644, + "width": 40.333333333333314, + "x": 341.8693333333333 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 123, + "label": "l", + "depth": 8, + "ref": "e124" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 51.333333333333336, + "x": 0 + }, + "parentIndex": 104, + "hittable": false, + "identifier": "shift", + "type": "Button", + "index": 124, + "label": "shift", + "depth": 8, + "ref": "e125" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40.33333333333334, + "x": 60 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 125, + "label": "z", + "depth": 8, + "ref": "e126" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40, + "x": 100.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 126, + "label": "x", + "depth": 8, + "ref": "e127" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40.33333333333334, + "x": 140.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 127, + "label": "c", + "depth": 8, + "ref": "e128" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40, + "x": 181.2026666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 128, + "label": "v", + "depth": 8, + "ref": "e129" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40.333333333333314, + "x": 221.2026666666667 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 129, + "label": "b", + "depth": 8, + "ref": "e130" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40, + "x": 261.536 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 130, + "label": "n", + "depth": 8, + "ref": "e131" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 40.333333333333314, + "x": 301.536 + }, + "parentIndex": 104, + "hittable": false, + "type": "Key", + "index": 131, + "label": "m", + "depth": 8, + "ref": "e132" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 698, + "width": 51.333333333333314, + "x": 350.42133333333334 + }, + "parentIndex": 104, + "hittable": false, + "identifier": "delete", + "type": "Key", + "index": 132, + "label": "delete", + "depth": 8, + "ref": "e133" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 752, + "width": 101, + "x": 0 + }, + "parentIndex": 104, + "hittable": false, + "identifier": "more", + "type": "Key", + "index": 133, + "label": "numbers", + "depth": 8, + "ref": "e134" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 752, + "width": 201.33333333333334, + "x": 100.33333333333334 + }, + "parentIndex": 104, + "hittable": false, + "identifier": "space", + "type": "Key", + "index": 134, + "label": "space", + "depth": 8, + "ref": "e135" + }, + { + "enabled": true, + "rect": { + "height": 46, + "y": 752, + "width": 100.33333333333331, + "x": 301.6666666666667 + }, + "parentIndex": 104, + "hittable": false, + "identifier": "Return", + "type": "Button", + "index": 135, + "label": "return", + "depth": 8, + "ref": "e136" + }, + { + "enabled": true, + "rect": { + "height": 291, + "y": 583, + "width": 402, + "x": 0 + }, + "parentIndex": 81, + "hittable": true, + "type": "Other", + "index": 136, + "label": "Emoji", + "depth": 4, + "ref": "e137" + }, + { + "enabled": true, + "rect": { + "height": 68.73516393505099, + "y": 805.6989567998571, + "width": 68.0852958475086, + "x": 8.47726568115926 + }, + "parentIndex": 136, + "hittable": true, + "type": "Button", + "index": 137, + "label": "Emoji", + "depth": 5, + "ref": "e138" + }, + { + "enabled": true, + "rect": { + "height": 0, + "y": 805.6989567998571, + "width": 0, + "x": 8.47726568115926 + }, + "parentIndex": 137, + "hittable": false, + "type": "StaticText", + "index": 138, + "depth": 6, + "ref": "e139" + }, + { + "enabled": true, + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "width": 68.08529584750863, + "x": 325.43743847133214 + }, + "parentIndex": 136, + "hittable": false, + "identifier": "dictation", + "type": "Button", + "index": 139, + "label": "Dictate", + "depth": 5, + "ref": "e140" + }, + { + "enabled": true, + "rect": { + "height": 0, + "y": 805.3656234665239, + "width": 0, + "x": 325.43743847133214 + }, + "parentIndex": 139, + "hittable": false, + "type": "StaticText", + "index": 140, + "depth": 6, + "ref": "e141" + }, + { + "enabled": true, + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "width": 68.08529584750863, + "x": 325.43743847133214 + }, + "parentIndex": 136, + "hittable": true, + "identifier": "dictation", + "type": "Button", + "index": 141, + "label": "Dictate", + "depth": 5, + "ref": "e142" + }, + { + "enabled": true, + "rect": { + "height": 0, + "y": 805.3656234665239, + "width": 0, + "x": 325.43743847133214 + }, + "parentIndex": 141, + "hittable": false, + "type": "StaticText", + "index": 142, + "depth": 6, + "ref": "e143" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 143, + "totalNodeCount": 143, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 139, + "p50Ms": 141, + "p95Ms": 1129, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 139 + } + } + }, + "refsGeneration": 776203 + } +} diff --git a/scroll-regression/ios/slow-scroll.log b/scroll-regression/ios/slow-scroll.log new file mode 100644 index 0000000000..0e24c8680f --- /dev/null +++ b/scroll-regression/ios/slow-scroll.log @@ -0,0 +1 @@ +Native swipe moved stream content: 27.82% changed diff --git a/scroll-regression/ios/workspace-draft-cap-open.json b/scroll-regression/ios/workspace-draft-cap-open.json new file mode 100644 index 0000000000..59012e8532 --- /dev/null +++ b/scroll-regression/ios/workspace-draft-cap-open.json @@ -0,0 +1,2715 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "index": 0, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Paseo Debug", + "depth": 0, + "ref": "e1" + }, + { + "type": "Window", + "parentIndex": 0, + "index": 1, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 1, + "ref": "e2" + }, + { + "type": "Other", + "parentIndex": 1, + "index": 2, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 2, + "ref": "e3" + }, + { + "type": "Other", + "parentIndex": 2, + "index": 3, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 3, + "ref": "e4" + }, + { + "type": "Other", + "parentIndex": 3, + "index": 4, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 4, + "ref": "e5" + }, + { + "type": "Other", + "parentIndex": 4, + "index": 5, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 5, + "ref": "e6" + }, + { + "type": "Other", + "parentIndex": 5, + "index": 6, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 6, + "ref": "e7" + }, + { + "type": "Other", + "parentIndex": 6, + "index": 7, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 7, + "ref": "e8" + }, + { + "type": "Other", + "parentIndex": 7, + "index": 8, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 8, + "ref": "e9" + }, + { + "type": "Other", + "parentIndex": 8, + "index": 9, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 9, + "ref": "e10" + }, + { + "type": "Other", + "parentIndex": 8, + "index": 10, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 9, + "ref": "e11" + }, + { + "type": "Other", + "parentIndex": 10, + "index": 11, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 10, + "ref": "e12" + }, + { + "type": "Other", + "parentIndex": 10, + "index": 12, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 10, + "ref": "e13" + }, + { + "type": "Other", + "parentIndex": 12, + "index": 13, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 11, + "ref": "e14" + }, + { + "type": "Other", + "parentIndex": 12, + "index": 14, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 11, + "ref": "e15" + }, + { + "type": "Other", + "parentIndex": 14, + "index": 15, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 12, + "ref": "e16" + }, + { + "type": "Other", + "parentIndex": 15, + "index": 16, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 13, + "ref": "e17" + }, + { + "type": "Other", + "parentIndex": 16, + "index": 17, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 14, + "ref": "e18" + }, + { + "type": "Other", + "parentIndex": 17, + "index": 18, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 15, + "ref": "e19" + }, + { + "type": "Other", + "parentIndex": 18, + "index": 19, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 16, + "ref": "e20" + }, + { + "type": "Other", + "parentIndex": 19, + "index": 20, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 17, + "ref": "e21" + }, + { + "type": "Other", + "parentIndex": 20, + "index": 21, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 18, + "ref": "e22" + }, + { + "type": "Other", + "parentIndex": 21, + "index": 22, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 19, + "ref": "e23" + }, + { + "type": "Other", + "parentIndex": 22, + "index": 23, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 20, + "ref": "e24" + }, + { + "type": "Other", + "parentIndex": 23, + "index": 24, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Switch tabs (2 open)", + "depth": 21, + "ref": "e25" + }, + { + "type": "Other", + "parentIndex": 24, + "index": 25, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Open menu", + "depth": 22, + "ref": "e26" + }, + { + "type": "Other", + "parentIndex": 25, + "index": 26, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Open menu", + "depth": 23, + "ref": "e27" + }, + { + "type": "Other", + "parentIndex": 26, + "index": 27, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Open menu", + "depth": 24, + "ref": "e28" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 28, + "identifier": "composer-dock-header", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 126, + "y": 0 + }, + "label": "Open menu", + "depth": 25, + "ref": "e29" + }, + { + "type": "Other", + "parentIndex": 28, + "index": 29, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 56, + "y": 70 + }, + "depth": 26, + "ref": "e30" + }, + { + "type": "Button", + "parentIndex": 28, + "index": 30, + "identifier": "menu-button", + "hittable": false, + "enabled": true, + "rect": { + "x": 8, + "width": 32, + "height": 32, + "y": 81.6666669845581 + }, + "label": "Open menu", + "depth": 26, + "ref": "e31" + }, + { + "type": "Other", + "parentIndex": 28, + "index": 31, + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 314, + "height": 34, + "y": 80.6666669845581 + }, + "label": "main", + "depth": 26, + "ref": "e32" + }, + { + "type": "Other", + "parentIndex": 31, + "index": 32, + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 278, + "height": 34, + "y": 80.6666669845581 + }, + "label": "main", + "depth": 27, + "ref": "e33" + }, + { + "type": "StaticText", + "parentIndex": 32, + "index": 33, + "identifier": "workspace-header-title", + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 278, + "height": 18, + "y": 80.6666669845581 + }, + "label": "main", + "depth": 28, + "ref": "e34" + }, + { + "type": "StaticText", + "parentIndex": 33, + "index": 34, + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 278, + "height": 18, + "y": 80.6666669845581 + }, + "label": "main", + "depth": 29, + "ref": "e35" + }, + { + "type": "StaticText", + "parentIndex": 32, + "index": 35, + "identifier": "workspace-header-subtitle", + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "label": "composer-dock-ios-fixture", + "depth": 28, + "ref": "e36" + }, + { + "type": "StaticText", + "parentIndex": 35, + "index": 36, + "hittable": false, + "enabled": true, + "rect": { + "x": 48, + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "label": "composer-dock-ios-fixture", + "depth": 29, + "ref": "e37" + }, + { + "type": "StaticText", + "parentIndex": 32, + "index": 37, + "hittable": false, + "enabled": true, + "rect": { + "x": 217.3333282470703, + "width": 4, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "label": "·", + "depth": 28, + "ref": "e38" + }, + { + "type": "StaticText", + "parentIndex": 37, + "index": 38, + "hittable": false, + "enabled": true, + "rect": { + "x": 217.3333282470703, + "width": 4, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "label": "·", + "depth": 29, + "ref": "e39" + }, + { + "type": "Other", + "parentIndex": 32, + "index": 39, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "hittable": false, + "enabled": true, + "rect": { + "x": 227.3333282470703, + "width": 68.00001525878906, + "height": 16, + "y": 98.6666669845581 + }, + "label": "dev-new", + "depth": 28, + "ref": "e40" + }, + { + "type": "Other", + "parentIndex": 32, + "index": 40, + "hittable": false, + "enabled": true, + "rect": { + "x": 227.3333282470703, + "width": 12, + "height": 12, + "y": 100.6666669845581 + }, + "depth": 28, + "ref": "e41" + }, + { + "type": "Other", + "parentIndex": 40, + "index": 41, + "hittable": false, + "enabled": true, + "rect": { + "x": 227.8333282470703, + "width": 11, + "height": 11, + "y": 101.1666669845581 + }, + "depth": 29, + "ref": "e42" + }, + { + "type": "Other", + "parentIndex": 41, + "index": 42, + "hittable": false, + "enabled": true, + "rect": { + "x": 227.8333282470703, + "width": 11, + "height": 5, + "y": 101.1666669845581 + }, + "depth": 30, + "ref": "e43" + }, + { + "type": "Other", + "parentIndex": 41, + "index": 43, + "hittable": false, + "enabled": true, + "rect": { + "x": 227.8333282470703, + "width": 11, + "height": 5, + "y": 107.1666669845581 + }, + "depth": 30, + "ref": "e44" + }, + { + "type": "Other", + "parentIndex": 41, + "index": 44, + "hittable": false, + "enabled": true, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "height": 1, + "y": 103.1666669845581 + }, + "depth": 30, + "ref": "e45" + }, + { + "type": "Other", + "parentIndex": 41, + "index": 45, + "hittable": false, + "enabled": true, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "height": 1, + "y": 109.1666669845581 + }, + "depth": 30, + "ref": "e46" + }, + { + "type": "StaticText", + "parentIndex": 32, + "index": 46, + "hittable": false, + "enabled": true, + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "height": 16, + "y": 98.6666669845581 + }, + "label": "dev-new", + "depth": 28, + "ref": "e47" + }, + { + "type": "StaticText", + "parentIndex": 46, + "index": 47, + "hittable": false, + "enabled": true, + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "height": 16, + "y": 98.6666669845581 + }, + "label": "dev-new", + "depth": 29, + "ref": "e48" + }, + { + "type": "Button", + "parentIndex": 31, + "index": 48, + "identifier": "workspace-header-menu-trigger", + "hittable": false, + "enabled": true, + "rect": { + "x": 330, + "width": 32, + "height": 32, + "y": 81.6666669845581 + }, + "label": "Workspace actions", + "depth": 27, + "ref": "e49" + }, + { + "type": "Button", + "parentIndex": 28, + "index": 49, + "identifier": "workspace-explorer-toggle", + "hittable": false, + "enabled": true, + "rect": { + "x": 362, + "width": 32, + "height": 32, + "y": 81.6666669845581 + }, + "label": "Open Explorer sidebar", + "depth": 26, + "ref": "e50" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 50, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 25, + "ref": "e51" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 51, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 25, + "ref": "e52" + }, + { + "type": "Button", + "parentIndex": 27, + "index": 52, + "identifier": "workspace-tab-switcher-trigger", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 34, + "y": 126 + }, + "label": "Switch tabs (2 open)", + "depth": 25, + "ref": "e53" + }, + { + "type": "Other", + "parentIndex": 52, + "index": 53, + "hittable": false, + "identifier": "workspace-active-tab-icon", + "enabled": true, + "rect": { + "x": 20, + "width": 14, + "height": 14, + "y": 136 + }, + "depth": 26, + "ref": "e54" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 54, + "hittable": false, + "identifier": "workspace-tabs-row", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 35, + "y": 126 + }, + "depth": 25, + "ref": "e55" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 55, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "depth": 25, + "ref": "e56" + }, + { + "type": "Other", + "parentIndex": 27, + "index": 56, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "depth": 25, + "ref": "e57" + }, + { + "type": "Other", + "parentIndex": 56, + "index": 57, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "label": "Import session", + "depth": 26, + "ref": "e58" + }, + { + "type": "Other", + "parentIndex": 57, + "index": 58, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "depth": 27, + "ref": "e59" + }, + { + "type": "Other", + "parentIndex": 57, + "index": 59, + "identifier": "composer-viewport", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": 161 + }, + "label": "Import session", + "depth": 27, + "ref": "e60" + }, + { + "type": "Other", + "parentIndex": 59, + "index": 60, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 713, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 28, + "ref": "e61" + }, + { + "type": "Other", + "parentIndex": 60, + "index": 61, + "identifier": "composer-dock-content", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 29, + "ref": "e62" + }, + { + "type": "Other", + "parentIndex": 61, + "index": 62, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 307, + "y": -141 + }, + "depth": 30, + "ref": "e63" + }, + { + "type": "Other", + "parentIndex": 61, + "index": 63, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 30, + "ref": "e64" + }, + { + "type": "ScrollView", + "parentIndex": 63, + "index": 64, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 31, + "ref": "e65" + }, + { + "type": "Other", + "parentIndex": 64, + "index": 65, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 40, + "y": -141 + }, + "depth": 32, + "ref": "e66" + }, + { + "type": "Other", + "parentIndex": 65, + "index": 66, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 40, + "y": -141 + }, + "depth": 33, + "ref": "e67" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 64, + "index": 67, + "hittable": false, + "enabled": true, + "rect": { + "x": 369, + "width": 30, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 32, + "ref": "e68" + }, + { + "type": "Other", + "parentIndex": 67, + "index": 68, + "hittable": false, + "enabled": true, + "rect": { + "x": 396, + "width": 3, + "height": 53, + "y": -138 + }, + "depth": 33, + "ref": "e69" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 64, + "index": 69, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 30, + "y": 133 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 32, + "ref": "e70" + }, + { + "type": "Other", + "parentIndex": 69, + "index": 70, + "hittable": false, + "enabled": true, + "rect": { + "x": 3, + "width": 393, + "height": 3, + "y": 160 + }, + "depth": 33, + "ref": "e71" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 64, + "index": 71, + "hittable": false, + "enabled": true, + "rect": { + "x": 369, + "width": 30, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "depth": 32, + "ref": "e72" + }, + { + "type": "Other", + "parentIndex": 71, + "index": 72, + "hittable": false, + "enabled": true, + "rect": { + "x": 396, + "width": 3, + "height": 53, + "y": -138 + }, + "depth": 33, + "ref": "e73" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 64, + "index": 73, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 30, + "y": 133 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 32, + "ref": "e74" + }, + { + "type": "Other", + "parentIndex": 73, + "index": 74, + "hittable": false, + "enabled": true, + "rect": { + "x": 3, + "width": 393, + "height": 3, + "y": 160 + }, + "depth": 33, + "ref": "e75" + }, + { + "type": "Other", + "parentIndex": 60, + "index": 75, + "identifier": "composer-viewport-content", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 406, + "y": 166 + }, + "label": "Import session", + "depth": 29, + "ref": "e76" + }, + { + "type": "Button", + "parentIndex": 75, + "index": 76, + "identifier": "composer-import-agent-pill", + "hittable": false, + "enabled": true, + "rect": { + "x": 16, + "width": 137, + "height": 32, + "y": 174 + }, + "label": "Import session", + "depth": 30, + "ref": "e77" + }, + { + "type": "StaticText", + "parentIndex": 76, + "index": 77, + "hittable": false, + "enabled": true, + "rect": { + "x": 51, + "width": 89, + "height": 15.66668701171875, + "y": 182 + }, + "label": "Import session", + "depth": 31, + "ref": "e78" + }, + { + "type": "StaticText", + "parentIndex": 77, + "index": 78, + "hittable": false, + "enabled": true, + "rect": { + "x": 51, + "width": 89, + "height": 15.66668701171875, + "y": 182 + }, + "label": "Import session", + "depth": 32, + "ref": "e79" + }, + { + "type": "Other", + "parentIndex": 75, + "index": 79, + "hittable": false, + "identifier": "message-input-root", + "enabled": true, + "rect": { + "x": 16, + "width": 370, + "height": 308, + "y": 214 + }, + "depth": 30, + "ref": "e80" + }, + { + "type": "Other", + "parentIndex": 75, + "index": 80, + "hittable": false, + "enabled": true, + "rect": { + "x": 16, + "width": 370, + "height": 308, + "y": 214 + }, + "depth": 30, + "ref": "e81" + }, + { + "type": "Other", + "parentIndex": 75, + "index": 81, + "hittable": false, + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "height": 250, + "y": 223 + }, + "label": "Message agent...", + "depth": 30, + "ref": "e82" + }, + { + "type": "TextView", + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "parentIndex": 81, + "index": 82, + "hittable": false, + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "height": 250, + "y": 223 + }, + "label": "Message agent...", + "depth": 31, + "ref": "e83" + }, + { + "type": "Other", + "value": "100%", + "parentIndex": 82, + "index": 83, + "hittable": false, + "enabled": true, + "rect": { + "x": 340, + "width": 30, + "height": 250, + "y": 223 + }, + "label": "Vertical scroll bar, 2 pages", + "depth": 32, + "ref": "e84" + }, + { + "type": "Other", + "parentIndex": 83, + "index": 84, + "hittable": false, + "enabled": true, + "rect": { + "x": 367, + "width": 3, + "height": 157.66666666666663, + "y": 312.33333333333337 + }, + "depth": 33, + "ref": "e85" + }, + { + "type": "Other", + "value": "0%", + "parentIndex": 82, + "index": 85, + "hittable": false, + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "height": 30, + "y": 440 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 32, + "ref": "e86" + }, + { + "type": "Other", + "parentIndex": 85, + "index": 86, + "hittable": false, + "enabled": true, + "rect": { + "x": 32, + "width": 335, + "height": 3, + "y": 467 + }, + "depth": 33, + "ref": "e87" + }, + { + "type": "Button", + "parentIndex": 75, + "index": 87, + "identifier": "message-input-attach-button", + "hittable": false, + "enabled": true, + "rect": { + "x": 23, + "width": 28, + "height": 28, + "y": 485 + }, + "label": "Add attachment", + "depth": 30, + "ref": "e88" + }, + { + "type": "Other", + "parentIndex": 87, + "index": 88, + "hittable": false, + "enabled": true, + "rect": { + "x": 23, + "width": 28, + "height": 28, + "y": 485 + }, + "depth": 31, + "ref": "e89" + }, + { + "type": "Other", + "parentIndex": 88, + "index": 89, + "hittable": false, + "enabled": true, + "rect": { + "x": 27, + "width": 20, + "height": 20, + "y": 489 + }, + "depth": 32, + "ref": "e90" + }, + { + "type": "Other", + "parentIndex": 89, + "index": 90, + "hittable": false, + "enabled": true, + "rect": { + "x": 30.333333333333332, + "width": 13.333333333333332, + "height": 13.333333333333371, + "y": 492.3333333333333 + }, + "depth": 33, + "ref": "e91" + }, + { + "type": "Other", + "parentIndex": 90, + "index": 91, + "hittable": false, + "enabled": true, + "rect": { + "x": 30.333333333333332, + "width": 13.333333333333332, + "height": 1.6666666666666856, + "y": 498.16666666666674 + }, + "depth": 34, + "ref": "e92" + }, + { + "type": "Other", + "parentIndex": 90, + "index": 92, + "hittable": false, + "enabled": true, + "rect": { + "x": 36.16666666666667, + "width": 1.6666666666666643, + "height": 13.333333333333314, + "y": 492.33333333333326 + }, + "depth": 34, + "ref": "e93" + }, + { + "type": "Other", + "parentIndex": 75, + "index": 93, + "hittable": false, + "enabled": true, + "rect": { + "x": 51, + "width": 264, + "height": 28, + "y": 485 + }, + "label": "Select model (Select model)", + "depth": 30, + "ref": "e94" + }, + { + "type": "Button", + "parentIndex": 93, + "index": 94, + "identifier": "combined-model-selector", + "hittable": false, + "enabled": true, + "rect": { + "x": 51, + "width": 105.66667175292969, + "height": 28, + "y": 485 + }, + "label": "Select model (Select model)", + "depth": 31, + "ref": "e95" + }, + { + "type": "Button", + "parentIndex": 75, + "index": 95, + "hittable": false, + "enabled": true, + "rect": { + "x": 315, + "width": 28, + "height": 28, + "y": 485 + }, + "label": "Start dictation", + "depth": 30, + "ref": "e96" + }, + { + "type": "Button", + "parentIndex": 75, + "index": 96, + "hittable": false, + "enabled": true, + "rect": { + "x": 351, + "width": 28, + "height": 28, + "y": 485 + }, + "label": "Send message", + "depth": 30, + "ref": "e97" + }, + { + "type": "Other", + "parentIndex": 12, + "index": 97, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 11, + "ref": "e98" + }, + { + "type": "Other", + "parentIndex": 6, + "index": 98, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 7, + "ref": "e99" + }, + { + "type": "Other", + "parentIndex": 98, + "index": 99, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 8, + "ref": "e100" + }, + { + "type": "Other", + "parentIndex": 99, + "index": 100, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 9, + "ref": "e101" + }, + { + "type": "Window", + "parentIndex": 0, + "index": 101, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 1, + "ref": "e102" + }, + { + "type": "Other", + "parentIndex": 101, + "index": 102, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 2, + "ref": "e103" + }, + { + "type": "Other", + "parentIndex": 102, + "index": 103, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 3, + "ref": "e104" + }, + { + "type": "Other", + "parentIndex": 102, + "index": 104, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 336, + "y": 538 + }, + "depth": 3, + "ref": "e105" + }, + { + "type": "Other", + "parentIndex": 104, + "index": 105, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 278, + "y": 538 + }, + "depth": 4, + "ref": "e106" + }, + { + "type": "Window", + "parentIndex": 0, + "index": 106, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Emoji", + "depth": 1, + "ref": "e107" + }, + { + "type": "Other", + "parentIndex": 106, + "index": 107, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "label": "Emoji", + "depth": 2, + "ref": "e108" + }, + { + "type": "Other", + "parentIndex": 107, + "index": 108, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 336, + "y": 538 + }, + "label": "Emoji", + "depth": 3, + "ref": "e109" + }, + { + "type": "Other", + "parentIndex": 108, + "index": 109, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "depth": 4, + "ref": "e110" + }, + { + "type": "Other", + "parentIndex": 109, + "index": 110, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "depth": 5, + "ref": "e111" + }, + { + "type": "Other", + "parentIndex": 110, + "index": 111, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "depth": 6, + "ref": "e112" + }, + { + "type": "Other", + "parentIndex": 108, + "index": 112, + "identifier": "SystemInputAssistantView", + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "depth": 4, + "ref": "e113" + }, + { + "type": "Other", + "parentIndex": 112, + "index": 113, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "depth": 5, + "ref": "e114" + }, + { + "type": "Other", + "parentIndex": 113, + "index": 114, + "identifier": "CenterPageView", + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "depth": 6, + "ref": "e115" + }, + { + "type": "Other", + "parentIndex": 114, + "index": 115, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 1245, + "y": -62 + }, + "depth": 7, + "ref": "e116" + }, + { + "type": "ScrollView", + "parentIndex": 115, + "index": 116, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "depth": 8, + "ref": "e117" + }, + { + "type": "Other", + "parentIndex": 114, + "index": 117, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "depth": 7, + "ref": "e118" + }, + { + "type": "Other", + "parentIndex": 117, + "index": 118, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "depth": 8, + "ref": "e119" + }, + { + "type": "Other", + "parentIndex": 118, + "index": 119, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "“o”", + "depth": 9, + "ref": "e120" + }, + { + "type": "Other", + "parentIndex": 119, + "index": 120, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 45, + "y": 538 + }, + "label": "“o”", + "depth": 10, + "ref": "e121" + }, + { + "type": "Other", + "parentIndex": 120, + "index": 121, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 134, + "height": 45, + "y": 538 + }, + "label": "“o”", + "depth": 11, + "ref": "e122" + }, + { + "type": "Other", + "parentIndex": 120, + "index": 122, + "hittable": true, + "enabled": true, + "rect": { + "x": 134, + "width": 134, + "height": 45, + "y": 538 + }, + "label": "oh", + "depth": 11, + "ref": "e123" + }, + { + "type": "Other", + "parentIndex": 120, + "index": 123, + "hittable": true, + "enabled": true, + "rect": { + "x": 268, + "width": 134, + "height": 45, + "y": 538 + }, + "label": "one", + "depth": 11, + "ref": "e124" + }, + { + "type": "Other", + "parentIndex": 108, + "index": 124, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 233, + "y": 583 + }, + "depth": 4, + "ref": "e125" + }, + { + "type": "Other", + "parentIndex": 124, + "index": 125, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 291, + "y": 583 + }, + "depth": 5, + "ref": "e126" + }, + { + "type": "Other", + "parentIndex": 125, + "index": 126, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 291, + "y": 583 + }, + "depth": 6, + "ref": "e127" + }, + { + "type": "Other", + "parentIndex": 126, + "index": 127, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 291, + "y": 583 + }, + "depth": 7, + "ref": "e128" + }, + { + "type": "Other", + "parentIndex": 108, + "index": 128, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 233, + "y": 583 + }, + "label": "Q", + "depth": 4, + "ref": "e129" + }, + { + "type": "Keyboard", + "parentIndex": 128, + "index": 129, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 233, + "y": 583 + }, + "label": "Q", + "depth": 5, + "ref": "e130" + }, + { + "type": "Other", + "parentIndex": 129, + "index": 130, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 233, + "y": 583 + }, + "label": "Q", + "depth": 6, + "ref": "e131" + }, + { + "type": "Other", + "parentIndex": 130, + "index": 131, + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 233, + "y": 583 + }, + "label": "Q", + "depth": 7, + "ref": "e132" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 132, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 40.333333333333336, + "height": 46, + "y": 590 + }, + "label": "Q", + "depth": 8, + "ref": "e133" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 133, + "hittable": false, + "enabled": true, + "rect": { + "x": 40.333333333333336, + "width": 40.00000000000001, + "height": 46, + "y": 590 + }, + "label": "W", + "depth": 8, + "ref": "e134" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 134, + "hittable": false, + "enabled": true, + "rect": { + "x": 80.33333333333334, + "width": 40.33333333333334, + "height": 46, + "y": 590 + }, + "label": "E", + "depth": 8, + "ref": "e135" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 135, + "hittable": false, + "enabled": true, + "rect": { + "x": 120.66666666666669, + "width": 40, + "height": 46, + "y": 590 + }, + "label": "R", + "depth": 8, + "ref": "e136" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 136, + "hittable": false, + "enabled": true, + "rect": { + "x": 160.66666666666669, + "width": 40.33333333333334, + "height": 46, + "y": 590 + }, + "label": "T", + "depth": 8, + "ref": "e137" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 137, + "hittable": false, + "enabled": true, + "rect": { + "x": 201.00000000000003, + "width": 40.33333333333334, + "height": 46, + "y": 590 + }, + "label": "Y", + "depth": 8, + "ref": "e138" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 138, + "hittable": false, + "enabled": true, + "rect": { + "x": 241.33333333333337, + "width": 40, + "height": 46, + "y": 590 + }, + "label": "U", + "depth": 8, + "ref": "e139" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 139, + "hittable": false, + "enabled": true, + "rect": { + "x": 281.33333333333337, + "width": 40.333333333333314, + "height": 46, + "y": 590 + }, + "label": "I", + "depth": 8, + "ref": "e140" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 140, + "hittable": false, + "enabled": true, + "rect": { + "x": 321.6666666666667, + "width": 40, + "height": 46, + "y": 590 + }, + "label": "O", + "depth": 8, + "ref": "e141" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 141, + "hittable": false, + "enabled": true, + "rect": { + "x": 361.6666666666667, + "width": 40.333333333333314, + "height": 46, + "y": 590 + }, + "label": "P", + "depth": 8, + "ref": "e142" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 142, + "hittable": false, + "enabled": true, + "rect": { + "x": 19.666666666666668, + "width": 40.33333333333333, + "height": 46, + "y": 644 + }, + "label": "A", + "depth": 8, + "ref": "e143" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 143, + "hittable": false, + "enabled": true, + "rect": { + "x": 60, + "width": 40.33333333333334, + "height": 46, + "y": 644 + }, + "label": "S", + "depth": 8, + "ref": "e144" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 144, + "hittable": false, + "enabled": true, + "rect": { + "x": 100.33333333333334, + "width": 40, + "height": 46, + "y": 644 + }, + "label": "D", + "depth": 8, + "ref": "e145" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 145, + "hittable": false, + "enabled": true, + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "height": 46, + "y": 644 + }, + "label": "F", + "depth": 8, + "ref": "e146" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 146, + "hittable": false, + "enabled": true, + "rect": { + "x": 181.2026666666667, + "width": 40, + "height": 46, + "y": 644 + }, + "label": "G", + "depth": 8, + "ref": "e147" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 147, + "hittable": false, + "enabled": true, + "rect": { + "x": 221.2026666666667, + "width": 40.333333333333314, + "height": 46, + "y": 644 + }, + "label": "H", + "depth": 8, + "ref": "e148" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 148, + "hittable": false, + "enabled": true, + "rect": { + "x": 261.536, + "width": 40, + "height": 46, + "y": 644 + }, + "label": "J", + "depth": 8, + "ref": "e149" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 149, + "hittable": false, + "enabled": true, + "rect": { + "x": 301.536, + "width": 40.333333333333314, + "height": 46, + "y": 644 + }, + "label": "K", + "depth": 8, + "ref": "e150" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 150, + "hittable": false, + "enabled": true, + "rect": { + "x": 341.8693333333333, + "width": 40.333333333333314, + "height": 46, + "y": 644 + }, + "label": "L", + "depth": 8, + "ref": "e151" + }, + { + "type": "Button", + "parentIndex": 131, + "index": 151, + "identifier": "shift", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 51.333333333333336, + "height": 46, + "y": 698 + }, + "label": "shift", + "selected": true, + "depth": 8, + "ref": "e152" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 152, + "hittable": false, + "enabled": true, + "rect": { + "x": 60, + "width": 40.33333333333334, + "height": 46, + "y": 698 + }, + "label": "Z", + "depth": 8, + "ref": "e153" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 153, + "hittable": false, + "enabled": true, + "rect": { + "x": 100.33333333333334, + "width": 40, + "height": 46, + "y": 698 + }, + "label": "X", + "depth": 8, + "ref": "e154" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 154, + "hittable": false, + "enabled": true, + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "height": 46, + "y": 698 + }, + "label": "C", + "depth": 8, + "ref": "e155" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 155, + "hittable": false, + "enabled": true, + "rect": { + "x": 181.2026666666667, + "width": 40, + "height": 46, + "y": 698 + }, + "label": "V", + "depth": 8, + "ref": "e156" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 156, + "hittable": false, + "enabled": true, + "rect": { + "x": 221.2026666666667, + "width": 40.333333333333314, + "height": 46, + "y": 698 + }, + "label": "B", + "depth": 8, + "ref": "e157" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 157, + "hittable": false, + "enabled": true, + "rect": { + "x": 261.536, + "width": 40, + "height": 46, + "y": 698 + }, + "label": "N", + "depth": 8, + "ref": "e158" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 158, + "hittable": false, + "enabled": true, + "rect": { + "x": 301.536, + "width": 40.333333333333314, + "height": 46, + "y": 698 + }, + "label": "M", + "depth": 8, + "ref": "e159" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 159, + "identifier": "delete", + "hittable": false, + "enabled": true, + "rect": { + "x": 350.42133333333334, + "width": 51.333333333333314, + "height": 46, + "y": 698 + }, + "label": "delete", + "depth": 8, + "ref": "e160" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 160, + "identifier": "more", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 101, + "height": 46, + "y": 752 + }, + "label": "numbers", + "depth": 8, + "ref": "e161" + }, + { + "type": "Key", + "parentIndex": 131, + "index": 161, + "identifier": "space", + "hittable": false, + "enabled": true, + "rect": { + "x": 100.33333333333334, + "width": 201.33333333333334, + "height": 46, + "y": 752 + }, + "label": "space", + "depth": 8, + "ref": "e162" + }, + { + "type": "Button", + "parentIndex": 131, + "index": 162, + "identifier": "Return", + "hittable": false, + "enabled": true, + "rect": { + "x": 301.6666666666667, + "width": 100.33333333333331, + "height": 46, + "y": 752 + }, + "label": "return", + "depth": 8, + "ref": "e163" + }, + { + "type": "Other", + "parentIndex": 108, + "index": 163, + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "height": 291, + "y": 583 + }, + "label": "Emoji", + "depth": 4, + "ref": "e164" + }, + { + "type": "Button", + "parentIndex": 163, + "index": 164, + "hittable": true, + "enabled": true, + "rect": { + "x": 8.47726568115926, + "width": 68.0852958475086, + "height": 68.73516393505099, + "y": 805.6989567998571 + }, + "label": "Emoji", + "depth": 5, + "ref": "e165" + }, + { + "type": "StaticText", + "parentIndex": 164, + "index": 165, + "hittable": false, + "enabled": true, + "rect": { + "x": 8.47726568115926, + "width": 0, + "height": 0, + "y": 805.6989567998571 + }, + "depth": 6, + "ref": "e166" + }, + { + "type": "Button", + "parentIndex": 163, + "index": 166, + "identifier": "dictation", + "hittable": false, + "enabled": true, + "rect": { + "x": 325.43743847133214, + "width": 68.08529584750863, + "height": 68.73516393505099, + "y": 805.3656234665239 + }, + "label": "Dictate", + "depth": 5, + "ref": "e167" + }, + { + "type": "StaticText", + "parentIndex": 166, + "index": 167, + "hittable": false, + "enabled": true, + "rect": { + "x": 325.43743847133214, + "width": 0, + "height": 0, + "y": 805.3656234665239 + }, + "depth": 6, + "ref": "e168" + }, + { + "type": "Button", + "parentIndex": 163, + "index": 168, + "identifier": "dictation", + "hittable": true, + "enabled": true, + "rect": { + "x": 325.43743847133214, + "width": 68.08529584750863, + "height": 68.73516393505099, + "y": 805.3656234665239 + }, + "label": "Dictate", + "depth": 5, + "ref": "e169" + }, + { + "type": "StaticText", + "parentIndex": 168, + "index": 169, + "hittable": false, + "enabled": true, + "rect": { + "x": 325.43743847133214, + "width": 0, + "height": 0, + "y": 805.3656234665239 + }, + "depth": 6, + "ref": "e170" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 170, + "totalNodeCount": 170, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 86, + "p50Ms": 142, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 86 + } + } + }, + "refsGeneration": 776150 + } +} diff --git a/scroll-regression/ios/workspace-draft-cap-open.png b/scroll-regression/ios/workspace-draft-cap-open.png new file mode 100644 index 0000000000..bacc3f63ba Binary files /dev/null and b/scroll-regression/ios/workspace-draft-cap-open.png differ diff --git a/scroll-regression/ios/workspace-draft-cleared.json b/scroll-regression/ios/workspace-draft-cleared.json new file mode 100644 index 0000000000..b89bda9592 --- /dev/null +++ b/scroll-regression/ios/workspace-draft-cleared.json @@ -0,0 +1,2698 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "index": 0, + "label": "Paseo Debug", + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "type": "Application", + "depth": 0, + "ref": "e1" + }, + { + "index": 1, + "enabled": true, + "type": "Window", + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "depth": 1, + "parentIndex": 0, + "hittable": false, + "ref": "e2" + }, + { + "hittable": false, + "parentIndex": 1, + "depth": 2, + "index": 2, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "ref": "e3" + }, + { + "depth": 3, + "index": 3, + "parentIndex": 2, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "ref": "e4" + }, + { + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "depth": 4, + "type": "Other", + "enabled": true, + "parentIndex": 3, + "hittable": false, + "index": 4, + "ref": "e5" + }, + { + "index": 5, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 5, + "parentIndex": 4, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e6" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 5, + "hittable": false, + "index": 6, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 6, + "ref": "e7" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 6, + "depth": 7, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 7, + "ref": "e8" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 7, + "depth": 8, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 8, + "ref": "e9" + }, + { + "type": "Other", + "parentIndex": 8, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 9, + "hittable": false, + "index": 9, + "enabled": true, + "ref": "e10" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 9, + "parentIndex": 8, + "index": 10, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e11" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "index": 11, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 10, + "parentIndex": 10, + "ref": "e12" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "index": 12, + "depth": 10, + "type": "Other", + "parentIndex": 10, + "enabled": true, + "ref": "e13" + }, + { + "depth": 11, + "enabled": true, + "parentIndex": 12, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 13, + "type": "Other", + "hittable": false, + "ref": "e14" + }, + { + "type": "Other", + "parentIndex": 12, + "hittable": false, + "index": 14, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 11, + "enabled": true, + "ref": "e15" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "depth": 12, + "hittable": false, + "index": 15, + "type": "Other", + "parentIndex": 14, + "ref": "e16" + }, + { + "index": 16, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 13, + "type": "Other", + "parentIndex": 15, + "hittable": false, + "ref": "e17" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 14, + "type": "Other", + "index": 17, + "parentIndex": 16, + "hittable": false, + "ref": "e18" + }, + { + "depth": 15, + "parentIndex": 17, + "index": 18, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "hittable": false, + "ref": "e19" + }, + { + "index": 19, + "hittable": false, + "enabled": true, + "depth": 16, + "parentIndex": 18, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "ref": "e20" + }, + { + "depth": 17, + "parentIndex": 19, + "type": "Other", + "index": 20, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "ref": "e21" + }, + { + "depth": 18, + "parentIndex": 20, + "type": "Other", + "index": 21, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "ref": "e22" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 22, + "hittable": false, + "parentIndex": 21, + "type": "Other", + "depth": 19, + "enabled": true, + "ref": "e23" + }, + { + "hittable": false, + "enabled": true, + "index": 23, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 22, + "type": "Other", + "depth": 20, + "ref": "e24" + }, + { + "index": 24, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "depth": 21, + "type": "Other", + "label": "Switch tabs (2 open)", + "parentIndex": 23, + "ref": "e25" + }, + { + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 22, + "index": 25, + "label": "Open menu", + "enabled": true, + "hittable": false, + "parentIndex": 24, + "ref": "e26" + }, + { + "type": "Other", + "index": 26, + "depth": 23, + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "label": "Open menu", + "enabled": true, + "parentIndex": 25, + "ref": "e27" + }, + { + "label": "Open menu", + "index": 27, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "enabled": true, + "parentIndex": 26, + "hittable": false, + "type": "Other", + "depth": 24, + "ref": "e28" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "label": "Open menu", + "depth": 25, + "identifier": "composer-dock-header", + "index": 28, + "rect": { + "x": 0, + "height": 126, + "y": 0, + "width": 402 + }, + "parentIndex": 27, + "ref": "e29" + }, + { + "parentIndex": 28, + "type": "Other", + "hittable": false, + "index": 29, + "rect": { + "x": 0, + "height": 56, + "y": 70, + "width": 402 + }, + "depth": 26, + "enabled": true, + "ref": "e30" + }, + { + "index": 30, + "rect": { + "x": 8, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "enabled": true, + "depth": 26, + "label": "Open menu", + "hittable": false, + "type": "Button", + "identifier": "menu-button", + "parentIndex": 28, + "ref": "e31" + }, + { + "rect": { + "x": 48, + "height": 34, + "y": 80.6666669845581, + "width": 314 + }, + "enabled": true, + "depth": 26, + "label": "main", + "index": 31, + "parentIndex": 28, + "hittable": false, + "type": "Other", + "ref": "e32" + }, + { + "rect": { + "x": 48, + "height": 34, + "y": 80.6666669845581, + "width": 278 + }, + "enabled": true, + "parentIndex": 31, + "type": "Other", + "index": 32, + "depth": 27, + "hittable": false, + "label": "main", + "ref": "e33" + }, + { + "type": "StaticText", + "index": 33, + "identifier": "workspace-header-title", + "hittable": false, + "depth": 28, + "rect": { + "x": 48, + "height": 18, + "y": 80.6666669845581, + "width": 278 + }, + "enabled": true, + "label": "main", + "parentIndex": 32, + "ref": "e34" + }, + { + "hittable": false, + "parentIndex": 33, + "enabled": true, + "rect": { + "x": 48, + "height": 18, + "y": 80.6666669845581, + "width": 278 + }, + "label": "main", + "type": "StaticText", + "index": 34, + "depth": 29, + "ref": "e35" + }, + { + "hittable": false, + "label": "composer-dock-ios-fixture", + "identifier": "workspace-header-subtitle", + "depth": 28, + "parentIndex": 32, + "index": 35, + "enabled": true, + "type": "StaticText", + "rect": { + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703 + }, + "ref": "e36" + }, + { + "parentIndex": 35, + "hittable": false, + "label": "composer-dock-ios-fixture", + "rect": { + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703 + }, + "index": 36, + "enabled": true, + "type": "StaticText", + "depth": 29, + "ref": "e37" + }, + { + "enabled": true, + "type": "StaticText", + "label": "·", + "rect": { + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 4 + }, + "depth": 28, + "index": 37, + "hittable": false, + "parentIndex": 32, + "ref": "e38" + }, + { + "rect": { + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 4 + }, + "parentIndex": 37, + "enabled": true, + "hittable": false, + "type": "StaticText", + "label": "·", + "index": 38, + "depth": 29, + "ref": "e39" + }, + { + "enabled": true, + "index": 39, + "hittable": false, + "parentIndex": 32, + "type": "Other", + "label": "dev-new", + "rect": { + "x": 227.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 68.00001525878906 + }, + "depth": 28, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "ref": "e40" + }, + { + "type": "Other", + "rect": { + "x": 227.3333282470703, + "height": 12, + "y": 100.6666669845581, + "width": 12 + }, + "parentIndex": 32, + "index": 40, + "hittable": false, + "enabled": true, + "depth": 28, + "ref": "e41" + }, + { + "index": 41, + "hittable": false, + "rect": { + "x": 227.8333282470703, + "height": 11, + "y": 101.1666669845581, + "width": 11 + }, + "parentIndex": 40, + "depth": 29, + "type": "Other", + "enabled": true, + "ref": "e42" + }, + { + "index": 42, + "type": "Other", + "depth": 30, + "hittable": false, + "rect": { + "x": 227.8333282470703, + "height": 5, + "y": 101.1666669845581, + "width": 11 + }, + "enabled": true, + "parentIndex": 41, + "ref": "e43" + }, + { + "index": 43, + "type": "Other", + "depth": 30, + "hittable": false, + "rect": { + "x": 227.8333282470703, + "height": 5, + "y": 107.1666669845581, + "width": 11 + }, + "enabled": true, + "parentIndex": 41, + "ref": "e44" + }, + { + "rect": { + "x": 229.8333282470703, + "height": 1, + "y": 103.1666669845581, + "width": 1.0049999999999955 + }, + "enabled": true, + "parentIndex": 41, + "index": 44, + "depth": 30, + "hittable": false, + "type": "Other", + "ref": "e45" + }, + { + "index": 45, + "type": "Other", + "rect": { + "x": 229.8333282470703, + "height": 1, + "y": 109.1666669845581, + "width": 1.0049999999999955 + }, + "depth": 30, + "parentIndex": 41, + "hittable": false, + "enabled": true, + "ref": "e46" + }, + { + "enabled": true, + "label": "dev-new", + "hittable": false, + "depth": 28, + "index": 46, + "parentIndex": 32, + "type": "StaticText", + "rect": { + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 53.00001525878906 + }, + "ref": "e47" + }, + { + "label": "dev-new", + "parentIndex": 46, + "enabled": true, + "index": 47, + "rect": { + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 53.00001525878906 + }, + "type": "StaticText", + "hittable": false, + "depth": 29, + "ref": "e48" + }, + { + "type": "Button", + "rect": { + "x": 330, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "label": "Workspace actions", + "enabled": true, + "identifier": "workspace-header-menu-trigger", + "depth": 27, + "index": 48, + "parentIndex": 31, + "hittable": false, + "ref": "e49" + }, + { + "index": 49, + "type": "Button", + "depth": 26, + "label": "Open Explorer sidebar", + "identifier": "workspace-explorer-toggle", + "hittable": false, + "rect": { + "x": 362, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "parentIndex": 28, + "enabled": true, + "ref": "e50" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "parentIndex": 27, + "hittable": false, + "depth": 25, + "index": 50, + "enabled": true, + "ref": "e51" + }, + { + "parentIndex": 27, + "hittable": false, + "depth": 25, + "index": 51, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "enabled": true, + "ref": "e52" + }, + { + "rect": { + "x": 0, + "height": 34, + "y": 126, + "width": 402 + }, + "identifier": "workspace-tab-switcher-trigger", + "depth": 25, + "parentIndex": 27, + "index": 52, + "type": "Button", + "hittable": false, + "label": "Switch tabs (2 open)", + "enabled": true, + "ref": "e53" + }, + { + "parentIndex": 52, + "depth": 26, + "identifier": "workspace-active-tab-icon", + "enabled": true, + "index": 53, + "type": "Other", + "hittable": false, + "rect": { + "x": 20, + "height": 14, + "y": 136, + "width": 14 + }, + "ref": "e54" + }, + { + "parentIndex": 27, + "depth": 25, + "identifier": "workspace-tabs-row", + "hittable": false, + "index": 54, + "rect": { + "x": 0, + "height": 35, + "y": 126, + "width": 402 + }, + "enabled": true, + "type": "Other", + "ref": "e55" + }, + { + "depth": 25, + "index": 55, + "enabled": true, + "parentIndex": 27, + "type": "Other", + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "hittable": false, + "ref": "e56" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "parentIndex": 27, + "type": "Other", + "depth": 25, + "index": 56, + "ref": "e57" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "parentIndex": 56, + "depth": 26, + "index": 57, + "label": "Import session", + "type": "Other", + "ref": "e58" + }, + { + "hittable": false, + "index": 58, + "type": "Other", + "parentIndex": 57, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "enabled": true, + "depth": 27, + "ref": "e59" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "parentIndex": 57, + "hittable": false, + "label": "Import session", + "index": 59, + "identifier": "composer-viewport", + "depth": 27, + "ref": "e60" + }, + { + "type": "Other", + "enabled": true, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 59, + "rect": { + "x": 0, + "height": 713, + "y": -141, + "width": 402 + }, + "depth": 28, + "index": 60, + "ref": "e61" + }, + { + "index": 61, + "identifier": "composer-dock-content", + "hittable": false, + "rect": { + "x": 0, + "height": 527, + "y": -141, + "width": 402 + }, + "parentIndex": 60, + "enabled": true, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 29, + "ref": "e62" + }, + { + "index": 62, + "rect": { + "x": 0, + "height": 527, + "y": -141, + "width": 402 + }, + "enabled": true, + "type": "Other", + "depth": 30, + "hittable": false, + "parentIndex": 61, + "ref": "e63" + }, + { + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 30, + "parentIndex": 61, + "rect": { + "x": 0, + "height": 527, + "y": -141, + "width": 402 + }, + "enabled": true, + "hittable": false, + "index": 63, + "ref": "e64" + }, + { + "type": "ScrollView", + "hittable": false, + "index": 64, + "depth": 31, + "enabled": true, + "parentIndex": 63, + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 0, + "height": 527, + "y": -141, + "width": 402 + }, + "ref": "e65" + }, + { + "enabled": true, + "hittable": false, + "parentIndex": 64, + "type": "Other", + "rect": { + "x": 0, + "height": 40, + "y": -141, + "width": 402 + }, + "index": 65, + "depth": 32, + "ref": "e66" + }, + { + "index": 66, + "hittable": false, + "depth": 33, + "type": "Other", + "parentIndex": 65, + "rect": { + "x": 0, + "height": 40, + "y": -141, + "width": 402 + }, + "enabled": true, + "ref": "e67" + }, + { + "rect": { + "x": 369, + "height": 527, + "y": -141, + "width": 30 + }, + "enabled": true, + "value": "0%", + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 64, + "depth": 32, + "index": 67, + "ref": "e68" + }, + { + "hittable": false, + "parentIndex": 67, + "type": "Other", + "depth": 33, + "index": 68, + "enabled": true, + "rect": { + "x": 396, + "height": 53, + "y": -138, + "width": 3 + }, + "ref": "e69" + }, + { + "rect": { + "x": 0, + "height": 30, + "y": 353, + "width": 402 + }, + "index": 69, + "enabled": true, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "depth": 32, + "parentIndex": 64, + "value": "0%", + "hittable": false, + "ref": "e70" + }, + { + "enabled": true, + "rect": { + "x": 3, + "height": 3, + "y": 380, + "width": 393 + }, + "depth": 33, + "parentIndex": 69, + "hittable": false, + "index": 70, + "type": "Other", + "ref": "e71" + }, + { + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "hittable": false, + "depth": 32, + "type": "Other", + "rect": { + "x": 369, + "height": 527, + "y": -141, + "width": 30 + }, + "index": 71, + "parentIndex": 64, + "ref": "e72" + }, + { + "enabled": true, + "type": "Other", + "index": 72, + "rect": { + "x": 396, + "height": 53, + "y": -138, + "width": 3 + }, + "depth": 33, + "hittable": false, + "parentIndex": 71, + "ref": "e73" + }, + { + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "depth": 32, + "rect": { + "x": 0, + "height": 30, + "y": 353, + "width": 402 + }, + "enabled": true, + "index": 73, + "hittable": false, + "parentIndex": 64, + "ref": "e74" + }, + { + "enabled": true, + "parentIndex": 73, + "index": 74, + "type": "Other", + "depth": 33, + "hittable": false, + "rect": { + "x": 3, + "height": 3, + "y": 380, + "width": 393 + }, + "ref": "e75" + }, + { + "type": "Other", + "identifier": "composer-viewport-content", + "index": 75, + "enabled": true, + "label": "Import session", + "hittable": false, + "depth": 29, + "rect": { + "x": 0, + "height": 186, + "y": 386, + "width": 402 + }, + "parentIndex": 60, + "ref": "e76" + }, + { + "label": "Import session", + "rect": { + "x": 16, + "height": 32, + "y": 394, + "width": 137 + }, + "index": 76, + "parentIndex": 75, + "enabled": true, + "identifier": "composer-import-agent-pill", + "depth": 30, + "type": "Button", + "hittable": false, + "ref": "e77" + }, + { + "rect": { + "x": 51, + "height": 15.66668701171875, + "y": 402, + "width": 89 + }, + "parentIndex": 76, + "type": "StaticText", + "depth": 31, + "label": "Import session", + "index": 77, + "enabled": true, + "hittable": false, + "ref": "e78" + }, + { + "enabled": true, + "type": "StaticText", + "label": "Import session", + "parentIndex": 77, + "index": 78, + "hittable": false, + "depth": 32, + "rect": { + "x": 51, + "height": 15.66668701171875, + "y": 402, + "width": 89 + }, + "ref": "e79" + }, + { + "rect": { + "x": 16, + "height": 88, + "y": 434, + "width": 370 + }, + "enabled": true, + "hittable": false, + "parentIndex": 75, + "identifier": "message-input-root", + "index": 79, + "depth": 30, + "type": "Other", + "ref": "e80" + }, + { + "type": "Other", + "parentIndex": 75, + "enabled": true, + "rect": { + "x": 16, + "height": 88, + "y": 434, + "width": 370 + }, + "hittable": false, + "index": 80, + "depth": 30, + "ref": "e81" + }, + { + "parentIndex": 75, + "enabled": true, + "label": "Message agent... Message, @files, /commands", + "type": "Other", + "depth": 30, + "index": 81, + "rect": { + "x": 29, + "height": 30, + "y": 443, + "width": 344 + }, + "hittable": false, + "ref": "e82" + }, + { + "hittable": false, + "index": 82, + "enabled": true, + "type": "TextView", + "rect": { + "x": 29, + "height": 30, + "y": 443, + "width": 344 + }, + "label": "Message agent... Message, @files, /commands", + "depth": 31, + "parentIndex": 81, + "ref": "e83" + }, + { + "index": 83, + "rect": { + "x": 340, + "height": 30, + "y": 443, + "width": 30 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "value": "0%", + "enabled": true, + "hittable": false, + "parentIndex": 82, + "depth": 32, + "ref": "e84" + }, + { + "type": "Other", + "depth": 33, + "index": 84, + "hittable": false, + "parentIndex": 83, + "rect": { + "x": 367, + "height": 19.000020345052064, + "y": 464.3332926432292, + "width": 3 + }, + "enabled": true, + "ref": "e85" + }, + { + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "value": "0%", + "type": "Other", + "rect": { + "x": 29, + "height": 15, + "y": 455, + "width": 344 + }, + "enabled": true, + "parentIndex": 82, + "depth": 32, + "index": 85, + "ref": "e86" + }, + { + "rect": { + "x": 32, + "height": 3, + "y": 467, + "width": 338 + }, + "enabled": true, + "type": "Other", + "parentIndex": 85, + "hittable": false, + "depth": 33, + "index": 86, + "ref": "e87" + }, + { + "rect": { + "x": 23, + "height": 28, + "y": 485, + "width": 28 + }, + "enabled": true, + "label": "Add attachment", + "depth": 30, + "index": 87, + "type": "Button", + "identifier": "message-input-attach-button", + "hittable": false, + "parentIndex": 75, + "ref": "e88" + }, + { + "rect": { + "x": 23, + "height": 28, + "y": 485, + "width": 28 + }, + "hittable": false, + "depth": 31, + "index": 88, + "parentIndex": 87, + "enabled": true, + "type": "Other", + "ref": "e89" + }, + { + "rect": { + "x": 27, + "height": 20, + "y": 489, + "width": 20 + }, + "hittable": false, + "type": "Other", + "index": 89, + "parentIndex": 88, + "enabled": true, + "depth": 32, + "ref": "e90" + }, + { + "parentIndex": 89, + "index": 90, + "rect": { + "x": 30.333333333333332, + "height": 13.333333333333371, + "y": 492.3333333333333, + "width": 13.333333333333332 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 33, + "ref": "e91" + }, + { + "rect": { + "x": 30.333333333333332, + "height": 1.6666666666666856, + "y": 498.16666666666663, + "width": 13.333333333333332 + }, + "parentIndex": 90, + "hittable": false, + "index": 91, + "enabled": true, + "depth": 34, + "type": "Other", + "ref": "e92" + }, + { + "enabled": true, + "depth": 34, + "index": 92, + "hittable": false, + "rect": { + "x": 36.16666666666667, + "height": 13.333333333333314, + "y": 492.33333333333337, + "width": 1.6666666666666643 + }, + "type": "Other", + "parentIndex": 90, + "ref": "e93" + }, + { + "hittable": false, + "index": 93, + "enabled": true, + "type": "Other", + "depth": 30, + "parentIndex": 75, + "label": "Select model (Select model)", + "rect": { + "x": 51, + "height": 28, + "y": 485, + "width": 300 + }, + "ref": "e94" + }, + { + "rect": { + "x": 51, + "height": 28, + "y": 485, + "width": 105.66667175292969 + }, + "hittable": false, + "identifier": "combined-model-selector", + "index": 94, + "depth": 31, + "parentIndex": 93, + "type": "Button", + "label": "Select model (Select model)", + "enabled": true, + "ref": "e95" + }, + { + "hittable": false, + "depth": 30, + "type": "Button", + "enabled": true, + "rect": { + "x": 351, + "height": 28, + "y": 485, + "width": 28 + }, + "label": "Start dictation", + "index": 95, + "parentIndex": 75, + "ref": "e96" + }, + { + "enabled": true, + "parentIndex": 12, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 96, + "hittable": false, + "type": "Other", + "depth": 11, + "ref": "e97" + }, + { + "enabled": true, + "parentIndex": 6, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 7, + "hittable": false, + "type": "Other", + "index": 97, + "ref": "e98" + }, + { + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "parentIndex": 97, + "index": 98, + "hittable": false, + "depth": 8, + "ref": "e99" + }, + { + "hittable": false, + "depth": 9, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "index": 99, + "enabled": true, + "parentIndex": 98, + "ref": "e100" + }, + { + "hittable": false, + "parentIndex": 0, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Window", + "depth": 1, + "enabled": true, + "index": 100, + "ref": "e101" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "index": 101, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 2, + "parentIndex": 100, + "ref": "e102" + }, + { + "enabled": true, + "parentIndex": 101, + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 3, + "index": 102, + "type": "Other", + "ref": "e103" + }, + { + "depth": 3, + "type": "Other", + "parentIndex": 101, + "rect": { + "x": 0, + "height": 336, + "y": 538, + "width": 402 + }, + "hittable": false, + "enabled": true, + "index": 103, + "ref": "e104" + }, + { + "parentIndex": 103, + "type": "Other", + "depth": 4, + "hittable": false, + "rect": { + "x": 0, + "height": 278, + "y": 538, + "width": 402 + }, + "index": 104, + "enabled": true, + "ref": "e105" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 105, + "hittable": true, + "enabled": true, + "parentIndex": 0, + "label": "Emoji", + "depth": 1, + "type": "Window", + "ref": "e106" + }, + { + "label": "Emoji", + "type": "Other", + "index": 106, + "enabled": true, + "hittable": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 2, + "parentIndex": 105, + "ref": "e107" + }, + { + "rect": { + "x": 0, + "height": 336, + "y": 538, + "width": 402 + }, + "depth": 3, + "enabled": true, + "label": "Emoji", + "index": 107, + "hittable": true, + "parentIndex": 106, + "type": "Other", + "ref": "e108" + }, + { + "depth": 4, + "hittable": false, + "index": 108, + "type": "Other", + "enabled": true, + "parentIndex": 107, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "ref": "e109" + }, + { + "index": 109, + "hittable": false, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "type": "Other", + "depth": 5, + "enabled": true, + "parentIndex": 108, + "ref": "e110" + }, + { + "depth": 6, + "hittable": false, + "parentIndex": 109, + "index": 110, + "type": "Other", + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "enabled": true, + "ref": "e111" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "enabled": true, + "index": 111, + "identifier": "SystemInputAssistantView", + "hittable": true, + "label": "Typing Predictions", + "parentIndex": 107, + "type": "Other", + "depth": 4, + "ref": "e112" + }, + { + "label": "Typing Predictions", + "enabled": true, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "index": 112, + "depth": 5, + "hittable": true, + "parentIndex": 111, + "type": "Other", + "ref": "e113" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "index": 113, + "depth": 6, + "enabled": true, + "parentIndex": 112, + "type": "Other", + "identifier": "CenterPageView", + "hittable": true, + "label": "Typing Predictions", + "ref": "e114" + }, + { + "hittable": false, + "parentIndex": 113, + "type": "Other", + "depth": 7, + "enabled": true, + "rect": { + "x": 0, + "height": 1245, + "y": -62, + "width": 402 + }, + "index": 114, + "ref": "e115" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "parentIndex": 114, + "hittable": false, + "depth": 8, + "type": "ScrollView", + "enabled": true, + "index": 115, + "ref": "e116" + }, + { + "type": "Other", + "hittable": true, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "index": 116, + "label": "Typing Predictions", + "depth": 7, + "enabled": true, + "parentIndex": 113, + "ref": "e117" + }, + { + "parentIndex": 116, + "type": "Other", + "depth": 8, + "enabled": true, + "hittable": true, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "label": "Typing Predictions", + "index": 117, + "ref": "e118" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "type": "Other", + "index": 118, + "enabled": true, + "parentIndex": 117, + "depth": 9, + "label": "I", + "hittable": true, + "ref": "e119" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 402 + }, + "enabled": true, + "depth": 10, + "parentIndex": 118, + "label": "I", + "type": "Other", + "index": 119, + "hittable": true, + "ref": "e120" + }, + { + "depth": 11, + "type": "Other", + "hittable": true, + "rect": { + "x": 0, + "height": 45, + "y": 538, + "width": 134 + }, + "enabled": true, + "index": 120, + "label": "I", + "parentIndex": 119, + "ref": "e121" + }, + { + "type": "Other", + "depth": 11, + "hittable": true, + "enabled": true, + "label": "The", + "index": 121, + "rect": { + "x": 134, + "height": 45, + "y": 538, + "width": 134 + }, + "parentIndex": 119, + "ref": "e122" + }, + { + "type": "Other", + "depth": 11, + "enabled": true, + "parentIndex": 119, + "label": "I’m", + "hittable": true, + "index": 122, + "rect": { + "x": 268, + "height": 45, + "y": 538, + "width": 134 + }, + "ref": "e123" + }, + { + "enabled": true, + "index": 123, + "type": "Other", + "depth": 4, + "hittable": false, + "parentIndex": 107, + "rect": { + "x": 0, + "height": 233, + "y": 583, + "width": 402 + }, + "ref": "e124" + }, + { + "rect": { + "x": 0, + "height": 291, + "y": 583, + "width": 402 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 123, + "depth": 5, + "index": 124, + "ref": "e125" + }, + { + "depth": 6, + "rect": { + "x": 0, + "height": 291, + "y": 583, + "width": 402 + }, + "parentIndex": 124, + "hittable": false, + "type": "Other", + "index": 125, + "enabled": true, + "ref": "e126" + }, + { + "parentIndex": 125, + "rect": { + "x": 0, + "height": 291, + "y": 583, + "width": 402 + }, + "depth": 7, + "index": 126, + "enabled": true, + "hittable": false, + "type": "Other", + "ref": "e127" + }, + { + "rect": { + "x": 0, + "height": 233, + "y": 583, + "width": 402 + }, + "hittable": false, + "label": "Q", + "parentIndex": 107, + "enabled": true, + "type": "Other", + "index": 127, + "depth": 4, + "ref": "e128" + }, + { + "hittable": false, + "rect": { + "x": 0, + "height": 233, + "y": 583, + "width": 402 + }, + "parentIndex": 127, + "label": "Q", + "index": 128, + "type": "Keyboard", + "enabled": true, + "depth": 5, + "ref": "e129" + }, + { + "rect": { + "x": 0, + "height": 233, + "y": 583, + "width": 402 + }, + "index": 129, + "hittable": false, + "depth": 6, + "parentIndex": 128, + "enabled": true, + "type": "Other", + "label": "Q", + "ref": "e130" + }, + { + "label": "Q", + "index": 130, + "rect": { + "x": 0, + "height": 233, + "y": 583, + "width": 402 + }, + "hittable": false, + "type": "Other", + "identifier": "UIKeyboardLayoutStar Preview", + "parentIndex": 129, + "enabled": true, + "depth": 7, + "ref": "e131" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 130, + "rect": { + "x": 0, + "height": 46, + "y": 590, + "width": 40.333333333333336 + }, + "index": 131, + "type": "Key", + "label": "Q", + "depth": 8, + "ref": "e132" + }, + { + "depth": 8, + "index": 132, + "enabled": true, + "label": "W", + "hittable": false, + "type": "Key", + "rect": { + "x": 40.333333333333336, + "height": 46, + "y": 590, + "width": 40.00000000000001 + }, + "parentIndex": 130, + "ref": "e133" + }, + { + "rect": { + "x": 80.33333333333334, + "height": 46, + "y": 590, + "width": 40.33333333333334 + }, + "index": 133, + "parentIndex": 130, + "hittable": false, + "type": "Key", + "label": "E", + "enabled": true, + "depth": 8, + "ref": "e134" + }, + { + "rect": { + "x": 120.66666666666669, + "height": 46, + "y": 590, + "width": 40 + }, + "type": "Key", + "depth": 8, + "label": "R", + "hittable": false, + "index": 134, + "enabled": true, + "parentIndex": 130, + "ref": "e135" + }, + { + "type": "Key", + "rect": { + "x": 160.66666666666669, + "height": 46, + "y": 590, + "width": 40.33333333333334 + }, + "label": "T", + "enabled": true, + "parentIndex": 130, + "index": 135, + "hittable": false, + "depth": 8, + "ref": "e136" + }, + { + "hittable": false, + "rect": { + "x": 201.00000000000003, + "height": 46, + "y": 590, + "width": 40.33333333333334 + }, + "enabled": true, + "depth": 8, + "type": "Key", + "label": "Y", + "index": 136, + "parentIndex": 130, + "ref": "e137" + }, + { + "depth": 8, + "index": 137, + "enabled": true, + "type": "Key", + "label": "U", + "rect": { + "x": 241.33333333333337, + "height": 46, + "y": 590, + "width": 40 + }, + "hittable": false, + "parentIndex": 130, + "ref": "e138" + }, + { + "index": 138, + "label": "I", + "parentIndex": 130, + "hittable": false, + "type": "Key", + "depth": 8, + "enabled": true, + "rect": { + "x": 281.33333333333337, + "height": 46, + "y": 590, + "width": 40.333333333333314 + }, + "ref": "e139" + }, + { + "type": "Key", + "depth": 8, + "parentIndex": 130, + "rect": { + "x": 321.6666666666667, + "height": 46, + "y": 590, + "width": 40 + }, + "label": "O", + "hittable": false, + "index": 139, + "enabled": true, + "ref": "e140" + }, + { + "label": "P", + "rect": { + "x": 361.6666666666667, + "height": 46, + "y": 590, + "width": 40.333333333333314 + }, + "hittable": false, + "type": "Key", + "enabled": true, + "depth": 8, + "parentIndex": 130, + "index": 140, + "ref": "e141" + }, + { + "depth": 8, + "index": 141, + "rect": { + "x": 19.666666666666668, + "height": 46, + "y": 644, + "width": 40.33333333333333 + }, + "enabled": true, + "hittable": false, + "type": "Key", + "label": "A", + "parentIndex": 130, + "ref": "e142" + }, + { + "parentIndex": 130, + "hittable": false, + "type": "Key", + "enabled": true, + "depth": 8, + "rect": { + "x": 60, + "height": 46, + "y": 644, + "width": 40.33333333333334 + }, + "index": 142, + "label": "S", + "ref": "e143" + }, + { + "parentIndex": 130, + "enabled": true, + "depth": 8, + "index": 143, + "hittable": false, + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 644, + "width": 40 + }, + "label": "D", + "type": "Key", + "ref": "e144" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 140.33333333333334, + "height": 46, + "y": 644, + "width": 40.33333333333334 + }, + "depth": 8, + "label": "F", + "parentIndex": 130, + "index": 144, + "type": "Key", + "ref": "e145" + }, + { + "type": "Key", + "label": "G", + "depth": 8, + "parentIndex": 130, + "enabled": true, + "rect": { + "x": 181.2026666666667, + "height": 46, + "y": 644, + "width": 40 + }, + "hittable": false, + "index": 145, + "ref": "e146" + }, + { + "type": "Key", + "index": 146, + "hittable": false, + "depth": 8, + "label": "H", + "enabled": true, + "parentIndex": 130, + "rect": { + "x": 221.2026666666667, + "height": 46, + "y": 644, + "width": 40.333333333333314 + }, + "ref": "e147" + }, + { + "hittable": false, + "type": "Key", + "rect": { + "x": 261.536, + "height": 46, + "y": 644, + "width": 40 + }, + "parentIndex": 130, + "index": 147, + "depth": 8, + "label": "J", + "enabled": true, + "ref": "e148" + }, + { + "index": 148, + "rect": { + "x": 301.536, + "height": 46, + "y": 644, + "width": 40.333333333333314 + }, + "hittable": false, + "type": "Key", + "label": "K", + "depth": 8, + "parentIndex": 130, + "enabled": true, + "ref": "e149" + }, + { + "enabled": true, + "parentIndex": 130, + "label": "L", + "hittable": false, + "rect": { + "x": 341.8693333333333, + "height": 46, + "y": 644, + "width": 40.333333333333314 + }, + "index": 149, + "type": "Key", + "depth": 8, + "ref": "e150" + }, + { + "label": "shift", + "index": 150, + "enabled": true, + "type": "Button", + "depth": 8, + "selected": true, + "identifier": "shift", + "hittable": false, + "parentIndex": 130, + "rect": { + "x": 0, + "height": 46, + "y": 698, + "width": 51.333333333333336 + }, + "ref": "e151" + }, + { + "type": "Key", + "parentIndex": 130, + "index": 151, + "hittable": false, + "enabled": true, + "rect": { + "x": 60, + "height": 46, + "y": 698, + "width": 40.33333333333334 + }, + "depth": 8, + "label": "Z", + "ref": "e152" + }, + { + "type": "Key", + "index": 152, + "label": "X", + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 698, + "width": 40 + }, + "enabled": true, + "depth": 8, + "hittable": false, + "parentIndex": 130, + "ref": "e153" + }, + { + "parentIndex": 130, + "hittable": false, + "depth": 8, + "type": "Key", + "rect": { + "x": 140.33333333333334, + "height": 46, + "y": 698, + "width": 40.33333333333334 + }, + "index": 153, + "enabled": true, + "label": "C", + "ref": "e154" + }, + { + "enabled": true, + "hittable": false, + "depth": 8, + "index": 154, + "rect": { + "x": 181.2026666666667, + "height": 46, + "y": 698, + "width": 40 + }, + "label": "V", + "type": "Key", + "parentIndex": 130, + "ref": "e155" + }, + { + "depth": 8, + "rect": { + "x": 221.2026666666667, + "height": 46, + "y": 698, + "width": 40.333333333333314 + }, + "hittable": false, + "index": 155, + "parentIndex": 130, + "label": "B", + "type": "Key", + "enabled": true, + "ref": "e156" + }, + { + "index": 156, + "rect": { + "x": 261.536, + "height": 46, + "y": 698, + "width": 40 + }, + "enabled": true, + "depth": 8, + "type": "Key", + "hittable": false, + "label": "N", + "parentIndex": 130, + "ref": "e157" + }, + { + "type": "Key", + "enabled": true, + "rect": { + "x": 301.536, + "height": 46, + "y": 698, + "width": 40.333333333333314 + }, + "parentIndex": 130, + "label": "M", + "hittable": false, + "index": 157, + "depth": 8, + "ref": "e158" + }, + { + "rect": { + "x": 350.42133333333334, + "height": 46, + "y": 698, + "width": 51.333333333333314 + }, + "enabled": true, + "index": 158, + "type": "Key", + "label": "delete", + "identifier": "delete", + "hittable": false, + "depth": 8, + "parentIndex": 130, + "ref": "e159" + }, + { + "type": "Key", + "index": 159, + "rect": { + "x": 0, + "height": 46, + "y": 752, + "width": 101 + }, + "label": "numbers", + "enabled": true, + "identifier": "more", + "parentIndex": 130, + "hittable": false, + "depth": 8, + "ref": "e160" + }, + { + "label": "space", + "index": 160, + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 752, + "width": 201.33333333333334 + }, + "enabled": true, + "identifier": "space", + "hittable": false, + "depth": 8, + "type": "Key", + "parentIndex": 130, + "ref": "e161" + }, + { + "hittable": false, + "depth": 8, + "label": "return", + "type": "Button", + "index": 161, + "enabled": true, + "rect": { + "x": 301.6666666666667, + "height": 46, + "y": 752, + "width": 100.33333333333331 + }, + "identifier": "Return", + "parentIndex": 130, + "ref": "e162" + }, + { + "depth": 4, + "type": "Other", + "enabled": true, + "parentIndex": 107, + "index": 162, + "rect": { + "x": 0, + "height": 291, + "y": 583, + "width": 402 + }, + "hittable": true, + "label": "Emoji", + "ref": "e163" + }, + { + "index": 163, + "enabled": true, + "rect": { + "x": 8.47726568115926, + "height": 68.73516393505099, + "y": 805.6989567998571, + "width": 68.0852958475086 + }, + "type": "Button", + "parentIndex": 162, + "depth": 5, + "label": "Emoji", + "hittable": true, + "ref": "e164" + }, + { + "index": 164, + "rect": { + "x": 8.47726568115926, + "height": 0, + "y": 805.6989567998571, + "width": 0 + }, + "hittable": false, + "type": "StaticText", + "depth": 6, + "parentIndex": 163, + "enabled": true, + "ref": "e165" + }, + { + "identifier": "dictation", + "type": "Button", + "enabled": true, + "label": "Dictate", + "parentIndex": 162, + "depth": 5, + "rect": { + "x": 325.43743847133214, + "height": 68.73516393505099, + "y": 805.3656234665239, + "width": 68.08529584750863 + }, + "index": 165, + "hittable": false, + "ref": "e166" + }, + { + "type": "StaticText", + "rect": { + "x": 325.43743847133214, + "height": 0, + "y": 805.3656234665239, + "width": 0 + }, + "index": 166, + "hittable": false, + "depth": 6, + "enabled": true, + "parentIndex": 165, + "ref": "e167" + }, + { + "label": "Dictate", + "type": "Button", + "index": 167, + "depth": 5, + "parentIndex": 162, + "rect": { + "x": 325.43743847133214, + "height": 68.73516393505099, + "y": 805.3656234665239, + "width": 68.08529584750863 + }, + "enabled": true, + "hittable": true, + "identifier": "dictation", + "ref": "e168" + }, + { + "depth": 6, + "enabled": true, + "parentIndex": 167, + "type": "StaticText", + "index": 168, + "rect": { + "x": 325.43743847133214, + "height": 0, + "y": 805.3656234665239, + "width": 0 + }, + "hittable": false, + "ref": "e169" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 169, + "totalNodeCount": 169, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 92, + "p50Ms": 143, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 92 + } + } + }, + "refsGeneration": 776156 + } +} diff --git a/scroll-regression/ios/workspace-draft-clearing.json b/scroll-regression/ios/workspace-draft-clearing.json new file mode 100644 index 0000000000..1d503b8f36 --- /dev/null +++ b/scroll-regression/ios/workspace-draft-clearing.json @@ -0,0 +1,2712 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "type": "Application", + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "depth": 0, + "label": "Paseo Debug", + "hittable": true, + "enabled": true, + "index": 0, + "ref": "e1" + }, + { + "parentIndex": 0, + "index": 1, + "depth": 1, + "type": "Window", + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "ref": "e2" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 2, + "depth": 2, + "parentIndex": 1, + "ref": "e3" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 3, + "depth": 3, + "parentIndex": 2, + "ref": "e4" + }, + { + "depth": 4, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "index": 4, + "enabled": true, + "hittable": false, + "parentIndex": 3, + "type": "Other", + "ref": "e5" + }, + { + "depth": 5, + "index": 5, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 4, + "ref": "e6" + }, + { + "depth": 6, + "index": 6, + "hittable": false, + "type": "Other", + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 5, + "ref": "e7" + }, + { + "hittable": false, + "depth": 7, + "parentIndex": 6, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "index": 7, + "ref": "e8" + }, + { + "hittable": false, + "parentIndex": 7, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 8, + "index": 8, + "type": "Other", + "enabled": true, + "ref": "e9" + }, + { + "type": "Other", + "depth": 9, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 8, + "index": 9, + "hittable": false, + "ref": "e10" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 8, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 9, + "hittable": false, + "index": 10, + "ref": "e11" + }, + { + "enabled": true, + "depth": 10, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "parentIndex": 10, + "index": 11, + "ref": "e12" + }, + { + "depth": 10, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "parentIndex": 10, + "type": "Other", + "index": 12, + "ref": "e13" + }, + { + "parentIndex": 12, + "hittable": false, + "index": 13, + "enabled": true, + "type": "Other", + "depth": 11, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e14" + }, + { + "depth": 11, + "hittable": false, + "parentIndex": 12, + "type": "Other", + "enabled": true, + "index": 14, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e15" + }, + { + "type": "Other", + "depth": 12, + "hittable": false, + "enabled": true, + "index": 15, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 14, + "ref": "e16" + }, + { + "hittable": false, + "enabled": true, + "depth": 13, + "parentIndex": 15, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "index": 16, + "ref": "e17" + }, + { + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 16, + "depth": 14, + "enabled": true, + "index": 17, + "type": "Other", + "ref": "e18" + }, + { + "type": "Other", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 15, + "parentIndex": 17, + "enabled": true, + "index": 18, + "hittable": false, + "ref": "e19" + }, + { + "depth": 16, + "type": "Other", + "parentIndex": 18, + "index": 19, + "enabled": true, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e20" + }, + { + "index": 20, + "enabled": true, + "type": "Other", + "parentIndex": 19, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 17, + "ref": "e21" + }, + { + "index": 21, + "enabled": true, + "type": "Other", + "parentIndex": 20, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "depth": 18, + "ref": "e22" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "depth": 19, + "parentIndex": 21, + "type": "Other", + "enabled": true, + "index": 22, + "ref": "e23" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "parentIndex": 22, + "index": 23, + "depth": 20, + "type": "Other", + "enabled": true, + "ref": "e24" + }, + { + "hittable": false, + "enabled": true, + "type": "Other", + "index": 24, + "label": "Switch tabs (2 open)", + "depth": 21, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "parentIndex": 23, + "ref": "e25" + }, + { + "hittable": false, + "parentIndex": 24, + "index": 25, + "depth": 22, + "type": "Other", + "enabled": true, + "label": "Open menu", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e26" + }, + { + "hittable": false, + "index": 26, + "label": "Open menu", + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "depth": 23, + "parentIndex": 25, + "ref": "e27" + }, + { + "label": "Open menu", + "type": "Other", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "hittable": false, + "depth": 24, + "index": 27, + "parentIndex": 26, + "enabled": true, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e28" + }, + { + "identifier": "composer-dock-header", + "label": "Open menu", + "enabled": true, + "type": "Other", + "index": 28, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 126 + }, + "hittable": false, + "parentIndex": 27, + "depth": 25, + "ref": "e29" + }, + { + "enabled": true, + "rect": { + "y": 70, + "width": 402, + "x": 0, + "height": 56 + }, + "index": 29, + "depth": 26, + "parentIndex": 28, + "type": "Other", + "hittable": false, + "ref": "e30" + }, + { + "identifier": "menu-button", + "label": "Open menu", + "hittable": false, + "parentIndex": 28, + "enabled": true, + "index": 30, + "depth": 26, + "type": "Button", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 8, + "height": 32 + }, + "ref": "e31" + }, + { + "enabled": true, + "rect": { + "y": 80.6666669845581, + "width": 314, + "x": 48, + "height": 34 + }, + "depth": 26, + "parentIndex": 28, + "label": "main", + "type": "Other", + "index": 31, + "hittable": false, + "ref": "e32" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 34 + }, + "label": "main", + "depth": 27, + "parentIndex": 31, + "enabled": true, + "index": 32, + "ref": "e33" + }, + { + "label": "main", + "identifier": "workspace-header-title", + "index": 33, + "enabled": true, + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 18 + }, + "hittable": false, + "depth": 28, + "parentIndex": 32, + "type": "StaticText", + "ref": "e34" + }, + { + "rect": { + "y": 80.6666669845581, + "width": 278, + "x": 48, + "height": 18 + }, + "index": 34, + "label": "main", + "parentIndex": 33, + "hittable": false, + "depth": 29, + "enabled": true, + "type": "StaticText", + "ref": "e35" + }, + { + "index": 35, + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688 + }, + "depth": 28, + "identifier": "workspace-header-subtitle", + "enabled": true, + "type": "StaticText", + "parentIndex": 32, + "label": "composer-dock-ios-fixture", + "hittable": false, + "ref": "e36" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688 + }, + "type": "StaticText", + "label": "composer-dock-ios-fixture", + "enabled": true, + "depth": 29, + "index": 36, + "hittable": false, + "parentIndex": 35, + "ref": "e37" + }, + { + "rect": { + "y": 98.6666669845581, + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688 + }, + "depth": 28, + "label": "·", + "hittable": false, + "enabled": true, + "index": 37, + "type": "StaticText", + "parentIndex": 32, + "ref": "e38" + }, + { + "depth": 29, + "enabled": true, + "hittable": false, + "type": "StaticText", + "index": 38, + "rect": { + "y": 98.6666669845581, + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688 + }, + "parentIndex": 37, + "label": "·", + "ref": "e39" + }, + { + "enabled": true, + "label": "dev-new", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "depth": 28, + "index": 39, + "rect": { + "y": 98.6666669845581, + "width": 68.00001525878906, + "x": 227.3333282470703, + "height": 16 + }, + "parentIndex": 32, + "type": "Other", + "hittable": false, + "ref": "e40" + }, + { + "depth": 28, + "index": 40, + "rect": { + "y": 100.6666669845581, + "width": 12, + "x": 227.3333282470703, + "height": 12 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "parentIndex": 32, + "ref": "e41" + }, + { + "enabled": true, + "type": "Other", + "index": 41, + "rect": { + "y": 101.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 11 + }, + "hittable": false, + "parentIndex": 40, + "depth": 29, + "ref": "e42" + }, + { + "parentIndex": 41, + "rect": { + "y": 101.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 5 + }, + "hittable": false, + "enabled": true, + "index": 42, + "type": "Other", + "depth": 30, + "ref": "e43" + }, + { + "parentIndex": 41, + "rect": { + "y": 107.1666669845581, + "width": 11, + "x": 227.8333282470703, + "height": 5 + }, + "hittable": false, + "enabled": true, + "index": 43, + "type": "Other", + "depth": 30, + "ref": "e44" + }, + { + "type": "Other", + "index": 44, + "enabled": true, + "rect": { + "y": 103.1666669845581, + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1 + }, + "depth": 30, + "parentIndex": 41, + "hittable": false, + "ref": "e45" + }, + { + "enabled": true, + "rect": { + "y": 109.1666669845581, + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1 + }, + "depth": 30, + "type": "Other", + "hittable": false, + "index": 45, + "parentIndex": 41, + "ref": "e46" + }, + { + "index": 46, + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16 + }, + "enabled": true, + "parentIndex": 32, + "hittable": false, + "depth": 28, + "type": "StaticText", + "label": "dev-new", + "ref": "e47" + }, + { + "type": "StaticText", + "rect": { + "y": 98.6666669845581, + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16 + }, + "label": "dev-new", + "enabled": true, + "depth": 29, + "index": 47, + "hittable": false, + "parentIndex": 46, + "ref": "e48" + }, + { + "depth": 27, + "enabled": true, + "index": 48, + "identifier": "workspace-header-menu-trigger", + "parentIndex": 31, + "label": "Workspace actions", + "type": "Button", + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 330, + "height": 32 + }, + "hittable": false, + "ref": "e49" + }, + { + "identifier": "workspace-explorer-toggle", + "enabled": true, + "rect": { + "y": 81.6666669845581, + "width": 32, + "x": 362, + "height": 32 + }, + "parentIndex": 28, + "label": "Open Explorer sidebar", + "index": 49, + "type": "Button", + "hittable": false, + "depth": 26, + "ref": "e50" + }, + { + "type": "Other", + "index": 50, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "hittable": false, + "enabled": true, + "depth": 25, + "parentIndex": 27, + "ref": "e51" + }, + { + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "type": "Other", + "depth": 25, + "parentIndex": 27, + "hittable": false, + "enabled": true, + "index": 51, + "ref": "e52" + }, + { + "identifier": "workspace-tab-switcher-trigger", + "depth": 25, + "label": "Switch tabs (2 open)", + "type": "Button", + "index": 52, + "hittable": false, + "enabled": true, + "parentIndex": 27, + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 34 + }, + "ref": "e53" + }, + { + "index": 53, + "parentIndex": 52, + "identifier": "workspace-active-tab-icon", + "type": "Other", + "hittable": false, + "rect": { + "y": 136, + "width": 14, + "x": 20, + "height": 14 + }, + "depth": 26, + "enabled": true, + "ref": "e54" + }, + { + "index": 54, + "identifier": "workspace-tabs-row", + "rect": { + "y": 126, + "width": 402, + "x": 0, + "height": 35 + }, + "hittable": false, + "type": "Other", + "depth": 25, + "enabled": true, + "parentIndex": 27, + "ref": "e55" + }, + { + "enabled": true, + "hittable": false, + "depth": 25, + "index": 55, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "parentIndex": 27, + "type": "Other", + "ref": "e56" + }, + { + "hittable": false, + "type": "Other", + "index": 56, + "enabled": true, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "depth": 25, + "parentIndex": 27, + "ref": "e57" + }, + { + "depth": 26, + "enabled": true, + "label": "Import session", + "index": 57, + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "parentIndex": 56, + "type": "Other", + "hittable": false, + "ref": "e58" + }, + { + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "index": 58, + "depth": 27, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 57, + "ref": "e59" + }, + { + "label": "Import session", + "identifier": "composer-viewport", + "rect": { + "y": 161, + "width": 402, + "x": 0, + "height": 713 + }, + "depth": 27, + "index": 59, + "parentIndex": 57, + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e60" + }, + { + "index": 60, + "enabled": true, + "type": "Other", + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 713 + }, + "hittable": false, + "depth": 28, + "parentIndex": 59, + "label": "Vertical scroll bar, 1 page", + "ref": "e61" + }, + { + "type": "Other", + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 60, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 475.33331298828125 + }, + "depth": 29, + "index": 61, + "identifier": "composer-dock-content", + "enabled": true, + "ref": "e62" + }, + { + "index": 62, + "hittable": false, + "depth": 30, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 475.33331298828125 + }, + "parentIndex": 61, + "enabled": true, + "type": "Other", + "ref": "e63" + }, + { + "hittable": false, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 475.33331298828125 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "depth": 30, + "index": 63, + "parentIndex": 61, + "enabled": true, + "ref": "e64" + }, + { + "depth": 31, + "parentIndex": 63, + "type": "ScrollView", + "enabled": true, + "index": 64, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 475.3333333333333 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "ref": "e65" + }, + { + "index": 65, + "hittable": false, + "depth": 32, + "enabled": true, + "parentIndex": 64, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 40 + }, + "type": "Other", + "ref": "e66" + }, + { + "parentIndex": 65, + "type": "Other", + "hittable": false, + "depth": 33, + "index": 66, + "enabled": true, + "rect": { + "y": -141, + "width": 402, + "x": 0, + "height": 40 + }, + "ref": "e67" + }, + { + "label": "Vertical scroll bar, 1 page", + "index": 67, + "parentIndex": 64, + "type": "Other", + "enabled": true, + "rect": { + "y": -141, + "width": 30, + "x": 369, + "height": 475.3333333333333 + }, + "hittable": false, + "depth": 32, + "value": "0%", + "ref": "e68" + }, + { + "enabled": true, + "type": "Other", + "depth": 33, + "index": 68, + "parentIndex": 67, + "rect": { + "y": -138, + "width": 3, + "x": 396, + "height": 53 + }, + "hittable": false, + "ref": "e69" + }, + { + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "y": 301.3333333333333, + "width": 402, + "x": 0, + "height": 30 + }, + "type": "Other", + "enabled": true, + "index": 69, + "parentIndex": 64, + "value": "0%", + "hittable": false, + "ref": "e70" + }, + { + "index": 70, + "type": "Other", + "rect": { + "y": 328.3333333333333, + "width": 393, + "x": 3, + "height": 3 + }, + "parentIndex": 69, + "depth": 33, + "hittable": false, + "enabled": true, + "ref": "e71" + }, + { + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 32, + "rect": { + "y": -141, + "width": 30, + "x": 369, + "height": 475.3333333333333 + }, + "parentIndex": 64, + "index": 71, + "ref": "e72" + }, + { + "parentIndex": 71, + "depth": 33, + "rect": { + "y": -138, + "width": 3, + "x": 396, + "height": 53 + }, + "type": "Other", + "index": 72, + "enabled": true, + "hittable": false, + "ref": "e73" + }, + { + "hittable": false, + "depth": 32, + "parentIndex": 64, + "enabled": true, + "value": "0%", + "index": 73, + "rect": { + "y": 301.3333333333333, + "width": 402, + "x": 0, + "height": 30 + }, + "type": "Other", + "label": "Horizontal scroll bar, 1 page", + "ref": "e74" + }, + { + "depth": 33, + "parentIndex": 73, + "rect": { + "y": 328.3333333333333, + "width": 393, + "x": 3, + "height": 3 + }, + "hittable": false, + "type": "Other", + "index": 74, + "enabled": true, + "ref": "e75" + }, + { + "depth": 29, + "type": "Other", + "parentIndex": 60, + "label": "Import session", + "rect": { + "y": 334.3333435058594, + "width": 402, + "x": 0, + "height": 237.66668701171875 + }, + "identifier": "composer-viewport-content", + "index": 75, + "enabled": true, + "hittable": false, + "ref": "e76" + }, + { + "rect": { + "y": 342.3333435058594, + "width": 137, + "x": 16, + "height": 32 + }, + "enabled": true, + "type": "Button", + "index": 76, + "hittable": false, + "parentIndex": 75, + "depth": 30, + "label": "Import session", + "identifier": "composer-import-agent-pill", + "ref": "e77" + }, + { + "parentIndex": 76, + "type": "StaticText", + "hittable": false, + "rect": { + "y": 350.3333435058594, + "width": 89, + "x": 51, + "height": 15.66668701171875 + }, + "depth": 31, + "label": "Import session", + "enabled": true, + "index": 77, + "ref": "e78" + }, + { + "rect": { + "y": 350.3333435058594, + "width": 89, + "x": 51, + "height": 15.66668701171875 + }, + "hittable": false, + "enabled": true, + "depth": 32, + "parentIndex": 77, + "type": "StaticText", + "label": "Import session", + "index": 78, + "ref": "e79" + }, + { + "rect": { + "y": 382.3333435058594, + "width": 370, + "x": 16, + "height": 139.66668701171875 + }, + "depth": 30, + "parentIndex": 75, + "identifier": "message-input-root", + "enabled": true, + "type": "Other", + "index": 79, + "hittable": false, + "ref": "e80" + }, + { + "rect": { + "y": 382.3333435058594, + "width": 370, + "x": 16, + "height": 139.66668701171875 + }, + "type": "Other", + "depth": 30, + "index": 80, + "parentIndex": 75, + "hittable": false, + "enabled": true, + "ref": "e81" + }, + { + "index": 81, + "enabled": true, + "hittable": false, + "parentIndex": 75, + "label": "Message agent...", + "rect": { + "y": 391.3333435058594, + "width": 344, + "x": 29, + "height": 81.66668701171875 + }, + "depth": 30, + "type": "Other", + "ref": "e82" + }, + { + "index": 82, + "label": "Message agent...", + "type": "TextView", + "hittable": false, + "parentIndex": 81, + "value": "x\neighteen\nnineteen\ntwent", + "enabled": true, + "depth": 31, + "rect": { + "y": 391.3333435058594, + "width": 344, + "x": 29, + "height": 81.66668701171875 + }, + "ref": "e83" + }, + { + "hittable": false, + "enabled": true, + "depth": 32, + "parentIndex": 82, + "rect": { + "y": 391.3333435058594, + "width": 30, + "x": 340, + "height": 81.66668701171875 + }, + "value": "0%", + "type": "Other", + "label": "Vertical scroll bar, 2 pages", + "index": 83, + "ref": "e84" + }, + { + "depth": 33, + "parentIndex": 83, + "enabled": true, + "hittable": false, + "index": 84, + "rect": { + "y": 394.3333435058594, + "width": 3, + "x": 367, + "height": 132.33333333333337 + }, + "type": "Other", + "ref": "e85" + }, + { + "type": "Other", + "rect": { + "width": 344, + "x": 29, + "y": 440.000010172526, + "height": 30 + }, + "hittable": false, + "depth": 32, + "parentIndex": 82, + "index": 85, + "value": "0%", + "label": "Horizontal scroll bar, 1 page", + "enabled": true, + "ref": "e86" + }, + { + "type": "Other", + "rect": { + "width": 338, + "x": 32, + "y": 467.000010172526, + "height": 3 + }, + "depth": 33, + "enabled": true, + "index": 86, + "parentIndex": 85, + "hittable": false, + "ref": "e87" + }, + { + "identifier": "message-input-attach-button", + "label": "Add attachment", + "depth": 30, + "parentIndex": 75, + "index": 87, + "enabled": true, + "rect": { + "width": 28, + "x": 23, + "y": 485.00000762939453, + "height": 28 + }, + "type": "Button", + "hittable": false, + "ref": "e88" + }, + { + "index": 88, + "type": "Other", + "parentIndex": 87, + "rect": { + "width": 28, + "x": 23, + "y": 485.00000762939453, + "height": 28 + }, + "enabled": true, + "hittable": false, + "depth": 31, + "ref": "e89" + }, + { + "depth": 32, + "enabled": true, + "parentIndex": 88, + "type": "Other", + "rect": { + "width": 20, + "x": 27, + "y": 489.00000762939453, + "height": 20 + }, + "hittable": false, + "index": 89, + "ref": "e90" + }, + { + "index": 90, + "type": "Other", + "hittable": false, + "depth": 33, + "enabled": true, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 492.33334096272785, + "height": 13.333333333333371 + }, + "parentIndex": 89, + "ref": "e91" + }, + { + "type": "Other", + "index": 91, + "depth": 34, + "enabled": true, + "parentIndex": 90, + "hittable": false, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "y": 498.16667429606116, + "height": 1.6666666666666856 + }, + "ref": "e92" + }, + { + "enabled": true, + "index": 92, + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "y": 492.3333409627279, + "height": 13.333333333333314 + }, + "parentIndex": 90, + "type": "Other", + "depth": 34, + "hittable": false, + "ref": "e93" + }, + { + "parentIndex": 75, + "type": "Other", + "depth": 30, + "label": "Select model (Select model)", + "enabled": true, + "hittable": false, + "rect": { + "width": 264, + "x": 51, + "y": 485.00000762939453, + "height": 28 + }, + "index": 93, + "ref": "e94" + }, + { + "rect": { + "width": 105.66667175292969, + "x": 51, + "y": 485.00000762939453, + "height": 28 + }, + "label": "Select model (Select model)", + "hittable": false, + "identifier": "combined-model-selector", + "index": 94, + "enabled": true, + "type": "Button", + "depth": 31, + "parentIndex": 93, + "ref": "e95" + }, + { + "type": "Button", + "enabled": true, + "hittable": false, + "depth": 30, + "label": "Start dictation", + "parentIndex": 75, + "rect": { + "width": 28, + "x": 315, + "y": 485.00000762939453, + "height": 28 + }, + "index": 95, + "ref": "e96" + }, + { + "label": "Send message", + "rect": { + "width": 28, + "x": 351, + "y": 485.00000762939453, + "height": 28 + }, + "enabled": true, + "index": 96, + "type": "Button", + "depth": 30, + "hittable": false, + "parentIndex": 75, + "ref": "e97" + }, + { + "enabled": true, + "index": 97, + "parentIndex": 12, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "depth": 11, + "ref": "e98" + }, + { + "index": 98, + "enabled": true, + "depth": 7, + "parentIndex": 6, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "hittable": false, + "ref": "e99" + }, + { + "type": "Other", + "depth": 8, + "index": 99, + "parentIndex": 98, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "hittable": false, + "enabled": true, + "ref": "e100" + }, + { + "depth": 9, + "parentIndex": 99, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 100, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "ref": "e101" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "index": 101, + "type": "Window", + "hittable": false, + "parentIndex": 0, + "depth": 1, + "ref": "e102" + }, + { + "hittable": false, + "depth": 2, + "type": "Other", + "parentIndex": 101, + "index": 102, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "ref": "e103" + }, + { + "index": 103, + "depth": 3, + "parentIndex": 102, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "enabled": true, + "ref": "e104" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "enabled": true, + "index": 104, + "hittable": false, + "depth": 3, + "type": "Other", + "parentIndex": 102, + "ref": "e105" + }, + { + "parentIndex": 104, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 278 + }, + "hittable": false, + "type": "Other", + "index": 105, + "depth": 4, + "ref": "e106" + }, + { + "label": "Emoji", + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "index": 106, + "depth": 1, + "type": "Window", + "parentIndex": 0, + "ref": "e107" + }, + { + "enabled": true, + "index": 107, + "label": "Emoji", + "type": "Other", + "depth": 2, + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "parentIndex": 106, + "ref": "e108" + }, + { + "parentIndex": 107, + "enabled": true, + "label": "Emoji", + "hittable": true, + "type": "Other", + "index": 108, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 336 + }, + "depth": 3, + "ref": "e109" + }, + { + "parentIndex": 108, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 109, + "depth": 4, + "type": "Other", + "ref": "e110" + }, + { + "parentIndex": 109, + "enabled": true, + "type": "Other", + "depth": 5, + "hittable": false, + "index": 110, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e111" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "hittable": false, + "type": "Other", + "index": 111, + "parentIndex": 110, + "enabled": true, + "depth": 6, + "ref": "e112" + }, + { + "identifier": "SystemInputAssistantView", + "hittable": true, + "type": "Other", + "enabled": true, + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "label": "Typing Predictions", + "parentIndex": 108, + "index": 112, + "ref": "e113" + }, + { + "label": "Typing Predictions", + "hittable": true, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "type": "Other", + "index": 113, + "depth": 5, + "parentIndex": 112, + "ref": "e114" + }, + { + "parentIndex": 113, + "hittable": true, + "identifier": "CenterPageView", + "label": "Typing Predictions", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "depth": 6, + "type": "Other", + "index": 114, + "ref": "e115" + }, + { + "index": 115, + "rect": { + "width": 402, + "x": 0, + "y": -62, + "height": 1245 + }, + "hittable": false, + "type": "Other", + "depth": 7, + "parentIndex": 114, + "enabled": true, + "ref": "e116" + }, + { + "hittable": false, + "type": "ScrollView", + "parentIndex": 115, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "index": 116, + "depth": 8, + "ref": "e117" + }, + { + "parentIndex": 114, + "index": 117, + "hittable": true, + "depth": 7, + "label": "Typing Predictions", + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "ref": "e118" + }, + { + "enabled": true, + "type": "Other", + "index": 118, + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 8, + "label": "Typing Predictions", + "parentIndex": 117, + "ref": "e119" + }, + { + "hittable": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "enabled": true, + "depth": 9, + "type": "Other", + "parentIndex": 118, + "label": "can", + "index": 119, + "ref": "e120" + }, + { + "hittable": true, + "index": 120, + "parentIndex": 119, + "label": "can", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "y": 538, + "height": 45 + }, + "depth": 10, + "type": "Other", + "ref": "e121" + }, + { + "enabled": true, + "depth": 11, + "index": 121, + "hittable": true, + "type": "Other", + "label": "can", + "parentIndex": 120, + "rect": { + "width": 134, + "x": 0, + "y": 538, + "height": 45 + }, + "ref": "e122" + }, + { + "depth": 11, + "hittable": true, + "rect": { + "width": 134, + "x": 134, + "y": 538, + "height": 45 + }, + "index": 122, + "enabled": true, + "type": "Other", + "parentIndex": 120, + "ref": "e123" + }, + { + "parentIndex": 120, + "enabled": true, + "rect": { + "width": 134, + "x": 268, + "y": 538, + "height": 45 + }, + "type": "Other", + "index": 123, + "depth": 11, + "hittable": true, + "ref": "e124" + }, + { + "type": "Other", + "depth": 4, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "hittable": false, + "index": 124, + "enabled": true, + "parentIndex": 108, + "ref": "e125" + }, + { + "depth": 5, + "index": 125, + "hittable": false, + "enabled": true, + "parentIndex": 124, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "ref": "e126" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "type": "Other", + "enabled": true, + "depth": 6, + "index": 126, + "parentIndex": 125, + "hittable": false, + "ref": "e127" + }, + { + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "depth": 7, + "parentIndex": 126, + "index": 127, + "type": "Other", + "hittable": false, + "enabled": true, + "ref": "e128" + }, + { + "depth": 4, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "enabled": true, + "parentIndex": 108, + "hittable": false, + "index": 128, + "label": "q", + "ref": "e129" + }, + { + "label": "q", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "depth": 5, + "enabled": true, + "index": 129, + "type": "Keyboard", + "hittable": false, + "parentIndex": 128, + "ref": "e130" + }, + { + "hittable": false, + "parentIndex": 129, + "type": "Other", + "label": "q", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 130, + "depth": 6, + "enabled": true, + "ref": "e131" + }, + { + "type": "Other", + "label": "q", + "hittable": false, + "depth": 7, + "enabled": true, + "parentIndex": 130, + "identifier": "UIKeyboardLayoutStar Preview", + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 233 + }, + "index": 131, + "ref": "e132" + }, + { + "enabled": true, + "hittable": false, + "label": "q", + "type": "Key", + "index": 132, + "depth": 8, + "parentIndex": 131, + "rect": { + "width": 40.333333333333336, + "x": 0, + "y": 590, + "height": 46 + }, + "ref": "e133" + }, + { + "label": "w", + "type": "Key", + "enabled": true, + "depth": 8, + "hittable": false, + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "y": 590, + "height": 46 + }, + "index": 133, + "parentIndex": 131, + "ref": "e134" + }, + { + "depth": 8, + "hittable": false, + "enabled": true, + "parentIndex": 131, + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "y": 590, + "height": 46 + }, + "label": "e", + "index": 134, + "type": "Key", + "ref": "e135" + }, + { + "hittable": false, + "type": "Key", + "index": 135, + "parentIndex": 131, + "label": "r", + "enabled": true, + "depth": 8, + "rect": { + "width": 40, + "x": 120.66666666666669, + "y": 590, + "height": 46 + }, + "ref": "e136" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "y": 590, + "height": 46 + }, + "depth": 8, + "enabled": true, + "label": "t", + "type": "Key", + "hittable": false, + "parentIndex": 131, + "index": 136, + "ref": "e137" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "y": 590, + "height": 46 + }, + "depth": 8, + "parentIndex": 131, + "index": 137, + "enabled": true, + "label": "y", + "hittable": false, + "type": "Key", + "ref": "e138" + }, + { + "depth": 8, + "hittable": false, + "parentIndex": 131, + "enabled": true, + "index": 138, + "type": "Key", + "rect": { + "width": 40, + "x": 241.33333333333337, + "y": 590, + "height": 46 + }, + "label": "u", + "ref": "e139" + }, + { + "index": 139, + "label": "i", + "type": "Key", + "hittable": false, + "enabled": true, + "depth": 8, + "parentIndex": 131, + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "y": 590, + "height": 46 + }, + "ref": "e140" + }, + { + "parentIndex": 131, + "hittable": false, + "enabled": true, + "depth": 8, + "index": 140, + "label": "o", + "type": "Key", + "rect": { + "width": 40, + "x": 321.6666666666667, + "y": 590, + "height": 46 + }, + "ref": "e141" + }, + { + "label": "p", + "enabled": true, + "parentIndex": 131, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "y": 590, + "height": 46 + }, + "hittable": false, + "index": 141, + "depth": 8, + "ref": "e142" + }, + { + "depth": 8, + "parentIndex": 131, + "enabled": true, + "index": 142, + "hittable": false, + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "y": 644, + "height": 46 + }, + "type": "Key", + "label": "a", + "ref": "e143" + }, + { + "depth": 8, + "label": "s", + "enabled": true, + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 644, + "height": 46 + }, + "index": 143, + "parentIndex": 131, + "hittable": false, + "type": "Key", + "ref": "e144" + }, + { + "type": "Key", + "index": 144, + "depth": 8, + "parentIndex": 131, + "hittable": false, + "label": "d", + "enabled": true, + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 644, + "height": 46 + }, + "ref": "e145" + }, + { + "hittable": false, + "index": 145, + "type": "Key", + "depth": 8, + "parentIndex": 131, + "enabled": true, + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 644, + "height": 46 + }, + "label": "f", + "ref": "e146" + }, + { + "parentIndex": 131, + "enabled": true, + "type": "Key", + "label": "g", + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 644, + "height": 46 + }, + "index": 146, + "depth": 8, + "hittable": false, + "ref": "e147" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 644, + "height": 46 + }, + "parentIndex": 131, + "index": 147, + "type": "Key", + "label": "h", + "ref": "e148" + }, + { + "depth": 8, + "rect": { + "width": 40, + "x": 261.536, + "y": 644, + "height": 46 + }, + "index": 148, + "label": "j", + "hittable": false, + "parentIndex": 131, + "enabled": true, + "type": "Key", + "ref": "e149" + }, + { + "type": "Key", + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 644, + "height": 46 + }, + "index": 149, + "label": "k", + "enabled": true, + "depth": 8, + "parentIndex": 131, + "ref": "e150" + }, + { + "index": 150, + "parentIndex": 131, + "type": "Key", + "depth": 8, + "enabled": true, + "label": "l", + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "y": 644, + "height": 46 + }, + "ref": "e151" + }, + { + "hittable": false, + "rect": { + "width": 51.333333333333336, + "x": 0, + "y": 698, + "height": 46 + }, + "label": "shift", + "depth": 8, + "index": 151, + "parentIndex": 131, + "identifier": "shift", + "type": "Button", + "enabled": true, + "ref": "e152" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "y": 698, + "height": 46 + }, + "type": "Key", + "label": "z", + "hittable": false, + "depth": 8, + "index": 152, + "parentIndex": 131, + "enabled": true, + "ref": "e153" + }, + { + "rect": { + "width": 40, + "x": 100.33333333333334, + "y": 698, + "height": 46 + }, + "hittable": false, + "parentIndex": 131, + "label": "x", + "enabled": true, + "type": "Key", + "depth": 8, + "index": 153, + "ref": "e154" + }, + { + "enabled": true, + "index": 154, + "hittable": false, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "y": 698, + "height": 46 + }, + "label": "c", + "depth": 8, + "parentIndex": 131, + "ref": "e155" + }, + { + "type": "Key", + "index": 155, + "parentIndex": 131, + "rect": { + "width": 40, + "x": 181.2026666666667, + "y": 698, + "height": 46 + }, + "label": "v", + "enabled": true, + "hittable": false, + "depth": 8, + "ref": "e156" + }, + { + "depth": 8, + "label": "b", + "index": 156, + "type": "Key", + "parentIndex": 131, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "y": 698, + "height": 46 + }, + "enabled": true, + "hittable": false, + "ref": "e157" + }, + { + "parentIndex": 131, + "enabled": true, + "label": "n", + "hittable": false, + "type": "Key", + "depth": 8, + "rect": { + "width": 40, + "x": 261.536, + "y": 698, + "height": 46 + }, + "index": 157, + "ref": "e158" + }, + { + "index": 158, + "hittable": false, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "y": 698, + "height": 46 + }, + "label": "m", + "parentIndex": 131, + "type": "Key", + "depth": 8, + "enabled": true, + "ref": "e159" + }, + { + "enabled": true, + "hittable": false, + "index": 159, + "identifier": "delete", + "label": "delete", + "depth": 8, + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "y": 698, + "height": 46 + }, + "parentIndex": 131, + "type": "Key", + "ref": "e160" + }, + { + "type": "Key", + "hittable": false, + "index": 160, + "label": "numbers", + "rect": { + "width": 101, + "x": 0, + "y": 752, + "height": 46 + }, + "enabled": true, + "depth": 8, + "parentIndex": 131, + "identifier": "more", + "ref": "e161" + }, + { + "type": "Key", + "label": "space", + "enabled": true, + "hittable": false, + "depth": 8, + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "y": 752, + "height": 46 + }, + "parentIndex": 131, + "identifier": "space", + "index": 161, + "ref": "e162" + }, + { + "parentIndex": 131, + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "y": 752, + "height": 46 + }, + "hittable": false, + "index": 162, + "identifier": "Return", + "label": "return", + "depth": 8, + "type": "Button", + "enabled": true, + "ref": "e163" + }, + { + "parentIndex": 108, + "label": "Emoji", + "type": "Other", + "enabled": true, + "hittable": true, + "index": 163, + "rect": { + "width": 402, + "x": 0, + "y": 583, + "height": 291 + }, + "depth": 4, + "ref": "e164" + }, + { + "parentIndex": 163, + "label": "Emoji", + "type": "Button", + "enabled": true, + "hittable": true, + "index": 164, + "rect": { + "height": 68.73516393505099, + "y": 805.6989567998571, + "x": 8.47726568115926, + "width": 68.0852958475086 + }, + "depth": 5, + "ref": "e165" + }, + { + "parentIndex": 164, + "depth": 6, + "enabled": true, + "hittable": false, + "rect": { + "height": 0, + "y": 805.6989567998571, + "x": 8.47726568115926, + "width": 0 + }, + "index": 165, + "type": "StaticText", + "ref": "e166" + }, + { + "label": "Dictate", + "index": 166, + "hittable": false, + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 68.08529584750863 + }, + "enabled": true, + "identifier": "dictation", + "parentIndex": 163, + "type": "Button", + "depth": 5, + "ref": "e167" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 0 + }, + "depth": 6, + "index": 167, + "parentIndex": 166, + "type": "StaticText", + "ref": "e168" + }, + { + "type": "Button", + "index": 168, + "hittable": true, + "enabled": true, + "label": "Dictate", + "identifier": "dictation", + "depth": 5, + "parentIndex": 163, + "rect": { + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 68.08529584750863 + }, + "ref": "e169" + }, + { + "hittable": false, + "rect": { + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214, + "width": 0 + }, + "index": 169, + "type": "StaticText", + "depth": 6, + "enabled": true, + "parentIndex": 168, + "ref": "e170" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 170, + "totalNodeCount": 170, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 91, + "p50Ms": 143, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 91 + } + } + }, + "refsGeneration": 776155 + } +} diff --git a/scroll-regression/ios/workspace-draft-content-dismissed.json b/scroll-regression/ios/workspace-draft-content-dismissed.json new file mode 100644 index 0000000000..731bfc80fc --- /dev/null +++ b/scroll-regression/ios/workspace-draft-content-dismissed.json @@ -0,0 +1,2692 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "enabled": true, + "type": "Application", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "hittable": true, + "index": 0, + "label": "Paseo Debug", + "depth": 0, + "ref": "e1" + }, + { + "enabled": true, + "rect": { + "height": 874, + "width": 402, + "y": 0, + "x": 0 + }, + "hittable": false, + "parentIndex": 0, + "index": 1, + "type": "Window", + "depth": 1, + "ref": "e2" + }, + { + "enabled": true, + "type": "Other", + "depth": 2, + "parentIndex": 1, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "index": 2, + "hittable": false, + "ref": "e3" + }, + { + "depth": 3, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 3, + "parentIndex": 2, + "ref": "e4" + }, + { + "enabled": true, + "parentIndex": 3, + "depth": 4, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "index": 4, + "type": "Other", + "ref": "e5" + }, + { + "index": 5, + "parentIndex": 4, + "hittable": false, + "type": "Other", + "depth": 5, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "enabled": true, + "ref": "e6" + }, + { + "hittable": false, + "parentIndex": 5, + "depth": 6, + "enabled": true, + "index": 6, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e7" + }, + { + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Other", + "depth": 7, + "enabled": true, + "index": 7, + "parentIndex": 6, + "hittable": false, + "ref": "e8" + }, + { + "depth": 8, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 8, + "parentIndex": 7, + "type": "Other", + "ref": "e9" + }, + { + "parentIndex": 8, + "hittable": false, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 9, + "depth": 9, + "enabled": true, + "ref": "e10" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 9, + "parentIndex": 8, + "index": 10, + "hittable": false, + "ref": "e11" + }, + { + "parentIndex": 10, + "enabled": true, + "type": "Other", + "depth": 10, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 11, + "hittable": false, + "ref": "e12" + }, + { + "parentIndex": 10, + "enabled": true, + "type": "Other", + "depth": 10, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 12, + "hittable": false, + "ref": "e13" + }, + { + "depth": 11, + "index": 13, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 12, + "hittable": false, + "ref": "e14" + }, + { + "parentIndex": 12, + "hittable": false, + "type": "Other", + "depth": 11, + "enabled": true, + "index": 14, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "ref": "e15" + }, + { + "index": 15, + "depth": 12, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 14, + "ref": "e16" + }, + { + "depth": 13, + "type": "Other", + "parentIndex": 15, + "index": 16, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "ref": "e17" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 17, + "type": "Other", + "depth": 14, + "enabled": true, + "parentIndex": 16, + "ref": "e18" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "hittable": false, + "parentIndex": 17, + "type": "Other", + "index": 18, + "depth": 15, + "ref": "e19" + }, + { + "parentIndex": 18, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "type": "Other", + "index": 19, + "depth": 16, + "ref": "e20" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "parentIndex": 19, + "enabled": true, + "index": 20, + "type": "Other", + "depth": 17, + "ref": "e21" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "parentIndex": 20, + "enabled": true, + "index": 21, + "type": "Other", + "depth": 18, + "ref": "e22" + }, + { + "type": "Other", + "depth": 19, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 21, + "enabled": true, + "index": 22, + "ref": "e23" + }, + { + "depth": 20, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 22, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 23, + "ref": "e24" + }, + { + "enabled": true, + "type": "Other", + "index": 24, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 21, + "hittable": false, + "label": "Switch tabs (2 open)", + "parentIndex": 23, + "ref": "e25" + }, + { + "parentIndex": 24, + "enabled": true, + "type": "Other", + "depth": 22, + "index": 25, + "hittable": false, + "label": "Open menu", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "ref": "e26" + }, + { + "index": 26, + "enabled": true, + "depth": 23, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 25, + "label": "Open menu", + "hittable": false, + "type": "Other", + "ref": "e27" + }, + { + "depth": 24, + "index": 27, + "label": "Open menu", + "enabled": true, + "type": "Other", + "hittable": false, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 26, + "ref": "e28" + }, + { + "label": "Open menu", + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 126, + "y": 0 + }, + "depth": 25, + "parentIndex": 27, + "index": 28, + "type": "Other", + "identifier": "composer-dock-header", + "ref": "e29" + }, + { + "index": 29, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 56, + "y": 70 + }, + "type": "Other", + "depth": 26, + "parentIndex": 28, + "enabled": true, + "ref": "e30" + }, + { + "parentIndex": 28, + "label": "Open menu", + "depth": 26, + "index": 30, + "enabled": true, + "type": "Button", + "identifier": "menu-button", + "rect": { + "width": 32, + "x": 8, + "height": 32, + "y": 81.6666669845581 + }, + "hittable": false, + "ref": "e31" + }, + { + "label": "main", + "rect": { + "width": 314, + "x": 48, + "height": 34, + "y": 80.6666669845581 + }, + "parentIndex": 28, + "type": "Other", + "depth": 26, + "enabled": true, + "hittable": false, + "index": 31, + "ref": "e32" + }, + { + "index": 32, + "parentIndex": 31, + "rect": { + "width": 278, + "x": 48, + "height": 34, + "y": 80.6666669845581 + }, + "enabled": true, + "hittable": false, + "label": "main", + "type": "Other", + "depth": 27, + "ref": "e33" + }, + { + "type": "StaticText", + "identifier": "workspace-header-title", + "rect": { + "width": 278, + "x": 48, + "height": 18, + "y": 80.6666669845581 + }, + "enabled": true, + "hittable": false, + "index": 33, + "depth": 28, + "parentIndex": 32, + "label": "main", + "ref": "e34" + }, + { + "index": 34, + "label": "main", + "type": "StaticText", + "depth": 29, + "parentIndex": 33, + "rect": { + "width": 278, + "x": 48, + "height": 18, + "y": 80.6666669845581 + }, + "enabled": true, + "hittable": false, + "ref": "e35" + }, + { + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "enabled": true, + "hittable": false, + "identifier": "workspace-header-subtitle", + "index": 35, + "type": "StaticText", + "label": "composer-dock-ios-fixture", + "parentIndex": 32, + "depth": 28, + "ref": "e36" + }, + { + "enabled": true, + "hittable": false, + "depth": 29, + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "type": "StaticText", + "parentIndex": 35, + "index": 36, + "label": "composer-dock-ios-fixture", + "ref": "e37" + }, + { + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "hittable": false, + "index": 37, + "type": "StaticText", + "label": "·", + "depth": 28, + "enabled": true, + "parentIndex": 32, + "ref": "e38" + }, + { + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "parentIndex": 37, + "enabled": true, + "index": 38, + "label": "·", + "type": "StaticText", + "depth": 29, + "hittable": false, + "ref": "e39" + }, + { + "type": "Other", + "enabled": true, + "label": "dev-new", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "hittable": false, + "index": 39, + "parentIndex": 32, + "rect": { + "width": 68.00001525878906, + "x": 227.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "depth": 28, + "ref": "e40" + }, + { + "index": 40, + "rect": { + "width": 12, + "x": 227.3333282470703, + "height": 12, + "y": 100.6666669845581 + }, + "depth": 28, + "enabled": true, + "hittable": false, + "parentIndex": 32, + "type": "Other", + "ref": "e41" + }, + { + "enabled": true, + "depth": 29, + "type": "Other", + "parentIndex": 40, + "index": 41, + "hittable": false, + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 11, + "y": 101.1666669845581 + }, + "ref": "e42" + }, + { + "type": "Other", + "depth": 30, + "index": 42, + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 101.1666669845581 + }, + "parentIndex": 41, + "hittable": false, + "enabled": true, + "ref": "e43" + }, + { + "type": "Other", + "depth": 30, + "index": 43, + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 107.1666669845581 + }, + "parentIndex": 41, + "hittable": false, + "enabled": true, + "ref": "e44" + }, + { + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 103.1666669845581 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 30, + "index": 44, + "parentIndex": 41, + "ref": "e45" + }, + { + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 109.1666669845581 + }, + "hittable": false, + "index": 45, + "enabled": true, + "type": "Other", + "depth": 30, + "parentIndex": 41, + "ref": "e46" + }, + { + "hittable": false, + "depth": 28, + "label": "dev-new", + "enabled": true, + "index": 46, + "parentIndex": 32, + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "type": "StaticText", + "ref": "e47" + }, + { + "enabled": true, + "label": "dev-new", + "index": 47, + "type": "StaticText", + "depth": 29, + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "hittable": false, + "parentIndex": 46, + "ref": "e48" + }, + { + "identifier": "workspace-header-menu-trigger", + "rect": { + "width": 32, + "x": 330, + "height": 32, + "y": 81.6666669845581 + }, + "hittable": false, + "parentIndex": 31, + "label": "Workspace actions", + "enabled": true, + "type": "Button", + "depth": 27, + "index": 48, + "ref": "e49" + }, + { + "type": "Button", + "enabled": true, + "hittable": false, + "parentIndex": 28, + "identifier": "workspace-explorer-toggle", + "depth": 26, + "rect": { + "width": 32, + "x": 362, + "height": 32, + "y": 81.6666669845581 + }, + "index": 49, + "label": "Open Explorer sidebar", + "ref": "e50" + }, + { + "parentIndex": 27, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 50, + "depth": 25, + "type": "Other", + "enabled": true, + "ref": "e51" + }, + { + "type": "Other", + "enabled": true, + "index": 51, + "hittable": false, + "parentIndex": 27, + "depth": 25, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "ref": "e52" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 34, + "y": 126 + }, + "type": "Button", + "label": "Switch tabs (2 open)", + "enabled": true, + "parentIndex": 27, + "identifier": "workspace-tab-switcher-trigger", + "hittable": false, + "depth": 25, + "index": 52, + "ref": "e53" + }, + { + "rect": { + "width": 14, + "x": 20, + "height": 14, + "y": 136 + }, + "index": 53, + "type": "Other", + "parentIndex": 52, + "identifier": "workspace-active-tab-icon", + "hittable": false, + "depth": 26, + "enabled": true, + "ref": "e54" + }, + { + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 27, + "identifier": "workspace-tabs-row", + "depth": 25, + "rect": { + "width": 402, + "x": 0, + "height": 35, + "y": 126 + }, + "index": 54, + "ref": "e55" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "type": "Other", + "enabled": true, + "index": 55, + "depth": 25, + "parentIndex": 27, + "ref": "e56" + }, + { + "parentIndex": 27, + "index": 56, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 25, + "ref": "e57" + }, + { + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "index": 57, + "parentIndex": 56, + "label": "Import session", + "type": "Other", + "depth": 26, + "hittable": false, + "ref": "e58" + }, + { + "parentIndex": 57, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 27, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "index": 58, + "ref": "e59" + }, + { + "depth": 27, + "type": "Other", + "index": 59, + "label": "Import session", + "identifier": "composer-viewport", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "enabled": true, + "hittable": false, + "parentIndex": 57, + "ref": "e60" + }, + { + "parentIndex": 59, + "index": 60, + "enabled": true, + "hittable": false, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "depth": 28, + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "ref": "e61" + }, + { + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "parentIndex": 60, + "index": 61, + "rect": { + "width": 402, + "x": 0, + "height": 527, + "y": 161 + }, + "depth": 29, + "enabled": true, + "type": "Other", + "identifier": "composer-dock-content", + "ref": "e62" + }, + { + "parentIndex": 61, + "type": "Other", + "index": 62, + "hittable": false, + "depth": 30, + "rect": { + "width": 402, + "x": 0, + "height": 527, + "y": 161 + }, + "enabled": true, + "ref": "e63" + }, + { + "hittable": false, + "depth": 30, + "type": "Other", + "parentIndex": 61, + "rect": { + "width": 402, + "x": 0, + "height": 527, + "y": 161 + }, + "index": 63, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "ref": "e64" + }, + { + "label": "Vertical scroll bar, 1 page", + "parentIndex": 63, + "index": 64, + "depth": 31, + "enabled": true, + "type": "ScrollView", + "rect": { + "width": 402, + "x": 0, + "height": 527, + "y": 161 + }, + "hittable": false, + "ref": "e65" + }, + { + "depth": 32, + "parentIndex": 64, + "rect": { + "width": 402, + "x": 0, + "height": 40, + "y": 161 + }, + "hittable": false, + "index": 65, + "type": "Other", + "enabled": true, + "ref": "e66" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 40, + "y": 161 + }, + "hittable": false, + "enabled": true, + "depth": 33, + "index": 66, + "parentIndex": 65, + "type": "Other", + "ref": "e67" + }, + { + "type": "Other", + "parentIndex": 64, + "index": 67, + "depth": 32, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "rect": { + "width": 30, + "x": 369, + "height": 527, + "y": 161 + }, + "value": "0%", + "ref": "e68" + }, + { + "hittable": false, + "index": 68, + "depth": 33, + "parentIndex": 67, + "type": "Other", + "rect": { + "width": 3, + "x": 396, + "height": 53, + "y": 164 + }, + "enabled": true, + "ref": "e69" + }, + { + "parentIndex": 64, + "enabled": true, + "type": "Other", + "index": 69, + "value": "0%", + "rect": { + "width": 402, + "x": 0, + "height": 30, + "y": 655 + }, + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "ref": "e70" + }, + { + "rect": { + "width": 393, + "x": 3, + "height": 3, + "y": 682 + }, + "enabled": true, + "hittable": false, + "parentIndex": 69, + "type": "Other", + "depth": 33, + "index": 70, + "ref": "e71" + }, + { + "index": 71, + "parentIndex": 64, + "rect": { + "width": 30, + "x": 369, + "height": 527, + "y": 161 + }, + "hittable": false, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "depth": 32, + "ref": "e72" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "width": 3, + "x": 396, + "height": 53, + "y": 164 + }, + "depth": 33, + "enabled": true, + "parentIndex": 71, + "index": 72, + "ref": "e73" + }, + { + "hittable": false, + "value": "0%", + "type": "Other", + "enabled": true, + "parentIndex": 64, + "depth": 32, + "index": 73, + "rect": { + "width": 402, + "x": 0, + "height": 30, + "y": 655 + }, + "label": "Horizontal scroll bar, 1 page", + "ref": "e74" + }, + { + "rect": { + "width": 393, + "x": 3, + "height": 3, + "y": 682 + }, + "depth": 33, + "type": "Other", + "parentIndex": 73, + "index": 74, + "enabled": true, + "hittable": false, + "ref": "e75" + }, + { + "parentIndex": 60, + "index": 75, + "label": "Import session", + "hittable": false, + "depth": 29, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 186, + "y": 688 + }, + "enabled": true, + "identifier": "composer-viewport-content", + "ref": "e76" + }, + { + "label": "Import session", + "rect": { + "width": 137, + "x": 16, + "height": 32, + "y": 696 + }, + "type": "Button", + "parentIndex": 75, + "hittable": false, + "enabled": true, + "identifier": "composer-import-agent-pill", + "depth": 30, + "index": 76, + "ref": "e77" + }, + { + "parentIndex": 76, + "label": "Import session", + "type": "StaticText", + "rect": { + "width": 89, + "x": 51, + "height": 15.66668701171875, + "y": 704 + }, + "index": 77, + "enabled": true, + "depth": 31, + "hittable": false, + "ref": "e78" + }, + { + "enabled": true, + "depth": 32, + "index": 78, + "type": "StaticText", + "rect": { + "width": 89, + "x": 51, + "height": 15.66668701171875, + "y": 704 + }, + "parentIndex": 77, + "hittable": false, + "label": "Import session", + "ref": "e79" + }, + { + "enabled": true, + "index": 79, + "depth": 30, + "identifier": "message-input-root", + "rect": { + "width": 370, + "x": 16, + "height": 88, + "y": 736 + }, + "parentIndex": 75, + "hittable": false, + "type": "Other", + "ref": "e80" + }, + { + "index": 80, + "enabled": true, + "parentIndex": 75, + "rect": { + "width": 370, + "x": 16, + "height": 88, + "y": 736 + }, + "type": "Other", + "depth": 30, + "hittable": false, + "ref": "e81" + }, + { + "label": "Message agent... Message, @files, /commands", + "rect": { + "width": 344, + "x": 29, + "height": 30, + "y": 745 + }, + "enabled": true, + "hittable": false, + "depth": 30, + "parentIndex": 75, + "index": 81, + "type": "Other", + "ref": "e82" + }, + { + "index": 82, + "hittable": false, + "parentIndex": 81, + "depth": 31, + "label": "Message agent... Message, @files, /commands", + "type": "TextView", + "enabled": true, + "rect": { + "width": 344, + "x": 29, + "height": 30, + "y": 745 + }, + "ref": "e83" + }, + { + "index": 83, + "value": "0%", + "hittable": false, + "depth": 32, + "rect": { + "width": 30, + "x": 340, + "height": 30, + "y": 745 + }, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "parentIndex": 82, + "type": "Other", + "ref": "e84" + }, + { + "type": "Other", + "rect": { + "width": 3, + "x": 367, + "height": 31, + "y": 741 + }, + "index": 84, + "hittable": false, + "depth": 33, + "enabled": true, + "parentIndex": 83, + "ref": "e85" + }, + { + "rect": { + "width": 344, + "x": 29, + "height": 15, + "y": 757 + }, + "index": 85, + "parentIndex": 82, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "hittable": false, + "depth": 32, + "enabled": true, + "value": "0%", + "ref": "e86" + }, + { + "rect": { + "width": 338, + "x": 32, + "height": 3, + "y": 769 + }, + "index": 86, + "hittable": false, + "enabled": true, + "depth": 33, + "parentIndex": 85, + "type": "Other", + "ref": "e87" + }, + { + "hittable": false, + "depth": 30, + "identifier": "message-input-attach-button", + "label": "Add attachment", + "index": 87, + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 787 + }, + "enabled": true, + "parentIndex": 75, + "type": "Button", + "ref": "e88" + }, + { + "parentIndex": 87, + "enabled": true, + "hittable": false, + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 787 + }, + "index": 88, + "type": "Other", + "depth": 31, + "ref": "e89" + }, + { + "enabled": true, + "parentIndex": 88, + "index": 89, + "rect": { + "width": 20, + "x": 27, + "height": 20, + "y": 791 + }, + "hittable": false, + "depth": 32, + "type": "Other", + "ref": "e90" + }, + { + "enabled": true, + "index": 90, + "hittable": false, + "parentIndex": 89, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 13.333333333333258, + "y": 794.3333333333334 + }, + "type": "Other", + "depth": 33, + "ref": "e91" + }, + { + "hittable": false, + "depth": 34, + "type": "Other", + "parentIndex": 90, + "index": 91, + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 1.6666666666666288, + "y": 800.1666666666666 + }, + "enabled": true, + "ref": "e92" + }, + { + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "height": 13.333333333333371, + "y": 794.3333333333334 + }, + "hittable": false, + "index": 92, + "parentIndex": 90, + "type": "Other", + "depth": 34, + "enabled": true, + "ref": "e93" + }, + { + "depth": 30, + "label": "Select model (Select model)", + "hittable": false, + "index": 93, + "type": "Other", + "rect": { + "width": 300, + "x": 51, + "height": 28, + "y": 787 + }, + "parentIndex": 75, + "enabled": true, + "ref": "e94" + }, + { + "identifier": "combined-model-selector", + "enabled": true, + "hittable": false, + "label": "Select model (Select model)", + "depth": 31, + "index": 94, + "type": "Button", + "parentIndex": 93, + "rect": { + "width": 105.66667175292969, + "x": 51, + "height": 28, + "y": 787 + }, + "ref": "e95" + }, + { + "rect": { + "width": 28, + "x": 351, + "height": 28, + "y": 787 + }, + "label": "Start dictation", + "enabled": true, + "hittable": false, + "type": "Button", + "depth": 30, + "parentIndex": 75, + "index": 95, + "ref": "e96" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 11, + "parentIndex": 12, + "index": 96, + "ref": "e97" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 6, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 7, + "index": 97, + "ref": "e98" + }, + { + "depth": 8, + "type": "Other", + "parentIndex": 97, + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "index": 98, + "ref": "e99" + }, + { + "type": "Other", + "index": 99, + "hittable": false, + "parentIndex": 98, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "enabled": true, + "depth": 9, + "ref": "e100" + }, + { + "parentIndex": 0, + "enabled": true, + "depth": 1, + "index": 100, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "type": "Window", + "ref": "e101" + }, + { + "index": 101, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 100, + "hittable": false, + "type": "Other", + "depth": 2, + "ref": "e102" + }, + { + "index": 102, + "hittable": false, + "enabled": true, + "parentIndex": 101, + "depth": 3, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "ref": "e103" + }, + { + "depth": 3, + "type": "Other", + "index": 103, + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 874 + }, + "hittable": false, + "enabled": true, + "parentIndex": 101, + "ref": "e104" + }, + { + "index": 104, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 278, + "y": 874 + }, + "depth": 4, + "parentIndex": 103, + "ref": "e105" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "parentIndex": 0, + "index": 105, + "label": "Emoji", + "type": "Window", + "enabled": true, + "depth": 1, + "hittable": true, + "ref": "e106" + }, + { + "label": "Emoji", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "depth": 2, + "index": 106, + "type": "Other", + "enabled": true, + "parentIndex": 105, + "hittable": true, + "ref": "e107" + }, + { + "parentIndex": 106, + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 874 + }, + "depth": 3, + "type": "Other", + "index": 107, + "label": "Emoji", + "enabled": true, + "hittable": false, + "ref": "e108" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "index": 108, + "depth": 4, + "type": "Other", + "parentIndex": 107, + "ref": "e109" + }, + { + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 108, + "index": 109, + "type": "Other", + "enabled": true, + "depth": 5, + "ref": "e110" + }, + { + "parentIndex": 109, + "depth": 6, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 110, + "ref": "e111" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "parentIndex": 107, + "depth": 4, + "type": "Other", + "enabled": true, + "identifier": "SystemInputAssistantView", + "hittable": false, + "index": 111, + "label": "Typing Predictions", + "ref": "e112" + }, + { + "type": "Other", + "enabled": true, + "depth": 5, + "parentIndex": 111, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "label": "Typing Predictions", + "index": 112, + "hittable": false, + "ref": "e113" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "identifier": "CenterPageView", + "index": 113, + "hittable": false, + "depth": 6, + "type": "Other", + "parentIndex": 112, + "label": "Typing Predictions", + "enabled": true, + "ref": "e114" + }, + { + "type": "Other", + "index": 114, + "enabled": true, + "parentIndex": 113, + "rect": { + "width": 402, + "x": 0, + "height": 1245, + "y": 274 + }, + "hittable": false, + "depth": 7, + "ref": "e115" + }, + { + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "depth": 8, + "enabled": true, + "type": "ScrollView", + "index": 115, + "parentIndex": 114, + "hittable": false, + "ref": "e116" + }, + { + "index": 116, + "label": "Typing Predictions", + "parentIndex": 113, + "depth": 7, + "hittable": false, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "ref": "e117" + }, + { + "enabled": true, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "type": "Other", + "depth": 8, + "parentIndex": 116, + "index": 117, + "label": "Typing Predictions", + "hittable": false, + "ref": "e118" + }, + { + "enabled": true, + "parentIndex": 117, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "hittable": false, + "depth": 9, + "type": "Other", + "index": 118, + "ref": "e119" + }, + { + "parentIndex": 118, + "depth": 10, + "index": 119, + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 874 + }, + "type": "Other", + "enabled": true, + "ref": "e120" + }, + { + "rect": { + "width": 134, + "x": 0, + "height": 45, + "y": 874 + }, + "type": "Other", + "parentIndex": 119, + "index": 120, + "depth": 11, + "enabled": true, + "hittable": false, + "ref": "e121" + }, + { + "parentIndex": 119, + "type": "Other", + "hittable": false, + "index": 121, + "depth": 11, + "rect": { + "width": 134, + "x": 134, + "height": 45, + "y": 874 + }, + "enabled": true, + "ref": "e122" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 119, + "depth": 11, + "rect": { + "width": 134, + "x": 268, + "height": 45, + "y": 874 + }, + "index": 122, + "hittable": false, + "ref": "e123" + }, + { + "hittable": false, + "depth": 4, + "enabled": true, + "type": "Other", + "index": 123, + "parentIndex": 107, + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "ref": "e124" + }, + { + "parentIndex": 123, + "index": 124, + "hittable": false, + "depth": 5, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "type": "Other", + "enabled": true, + "ref": "e125" + }, + { + "depth": 6, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 125, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "parentIndex": 124, + "ref": "e126" + }, + { + "index": 126, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "enabled": true, + "parentIndex": 125, + "hittable": false, + "depth": 7, + "ref": "e127" + }, + { + "label": "q", + "depth": 4, + "parentIndex": 107, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "index": 127, + "ref": "e128" + }, + { + "enabled": true, + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "parentIndex": 127, + "depth": 5, + "index": 128, + "type": "Keyboard", + "hittable": false, + "ref": "e129" + }, + { + "enabled": true, + "hittable": false, + "depth": 6, + "parentIndex": 128, + "label": "q", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "index": 129, + "type": "Other", + "ref": "e130" + }, + { + "hittable": false, + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "enabled": true, + "label": "q", + "index": 130, + "type": "Other", + "parentIndex": 129, + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 919 + }, + "ref": "e131" + }, + { + "type": "Key", + "parentIndex": 130, + "hittable": false, + "rect": { + "width": 40.333333333333336, + "x": 0, + "height": 46, + "y": 926 + }, + "depth": 8, + "label": "q", + "enabled": true, + "index": 131, + "ref": "e132" + }, + { + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "height": 46, + "y": 926 + }, + "parentIndex": 130, + "hittable": false, + "depth": 8, + "enabled": true, + "index": 132, + "type": "Key", + "label": "w", + "ref": "e133" + }, + { + "label": "e", + "hittable": false, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "height": 46, + "y": 926 + }, + "index": 133, + "depth": 8, + "parentIndex": 130, + "enabled": true, + "ref": "e134" + }, + { + "index": 134, + "hittable": false, + "rect": { + "width": 40, + "x": 120.66666666666669, + "height": 46, + "y": 926 + }, + "depth": 8, + "type": "Key", + "enabled": true, + "label": "r", + "parentIndex": 130, + "ref": "e135" + }, + { + "type": "Key", + "hittable": false, + "label": "t", + "index": 135, + "enabled": true, + "depth": 8, + "parentIndex": 130, + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "height": 46, + "y": 926 + }, + "ref": "e136" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "height": 46, + "y": 926 + }, + "index": 136, + "type": "Key", + "label": "y", + "parentIndex": 130, + "enabled": true, + "depth": 8, + "hittable": false, + "ref": "e137" + }, + { + "parentIndex": 130, + "index": 137, + "depth": 8, + "hittable": false, + "label": "u", + "rect": { + "width": 40, + "x": 241.33333333333337, + "height": 46, + "y": 926 + }, + "enabled": true, + "type": "Key", + "ref": "e138" + }, + { + "depth": 8, + "label": "i", + "type": "Key", + "enabled": true, + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "height": 46, + "y": 926 + }, + "parentIndex": 130, + "index": 138, + "hittable": false, + "ref": "e139" + }, + { + "hittable": false, + "enabled": true, + "depth": 8, + "index": 139, + "label": "o", + "parentIndex": 130, + "rect": { + "width": 40, + "x": 321.6666666666667, + "height": 46, + "y": 926 + }, + "type": "Key", + "ref": "e140" + }, + { + "index": 140, + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 130, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "height": 46, + "y": 926 + }, + "label": "p", + "ref": "e141" + }, + { + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "height": 46, + "y": 980 + }, + "hittable": false, + "label": "a", + "parentIndex": 130, + "enabled": true, + "type": "Key", + "depth": 8, + "index": 141, + "ref": "e142" + }, + { + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 980 + }, + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 130, + "index": 142, + "label": "s", + "type": "Key", + "ref": "e143" + }, + { + "type": "Key", + "index": 143, + "label": "d", + "depth": 8, + "parentIndex": 130, + "hittable": false, + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 980 + }, + "enabled": true, + "ref": "e144" + }, + { + "label": "f", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 980 + }, + "parentIndex": 130, + "hittable": false, + "enabled": true, + "type": "Key", + "index": 144, + "depth": 8, + "ref": "e145" + }, + { + "type": "Key", + "parentIndex": 130, + "depth": 8, + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 980 + }, + "index": 145, + "label": "g", + "hittable": false, + "enabled": true, + "ref": "e146" + }, + { + "type": "Key", + "label": "h", + "depth": 8, + "parentIndex": 130, + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 980 + }, + "index": 146, + "enabled": true, + "hittable": false, + "ref": "e147" + }, + { + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 980 + }, + "index": 147, + "enabled": true, + "hittable": false, + "parentIndex": 130, + "depth": 8, + "type": "Key", + "label": "j", + "ref": "e148" + }, + { + "type": "Key", + "parentIndex": 130, + "enabled": true, + "hittable": false, + "label": "k", + "index": 148, + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 980 + }, + "depth": 8, + "ref": "e149" + }, + { + "parentIndex": 130, + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "height": 46, + "y": 980 + }, + "index": 149, + "label": "l", + "type": "Key", + "depth": 8, + "enabled": true, + "hittable": false, + "ref": "e150" + }, + { + "parentIndex": 130, + "hittable": false, + "rect": { + "width": 51.333333333333336, + "x": 0, + "height": 46, + "y": 1034 + }, + "type": "Button", + "identifier": "shift", + "index": 150, + "label": "shift", + "enabled": true, + "depth": 8, + "ref": "e151" + }, + { + "depth": 8, + "index": 151, + "parentIndex": 130, + "enabled": true, + "label": "z", + "hittable": false, + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 1034 + }, + "type": "Key", + "ref": "e152" + }, + { + "type": "Key", + "parentIndex": 130, + "index": 152, + "label": "x", + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 1034 + }, + "enabled": true, + "hittable": false, + "depth": 8, + "ref": "e153" + }, + { + "enabled": true, + "depth": 8, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 1034 + }, + "label": "c", + "hittable": false, + "index": 153, + "parentIndex": 130, + "ref": "e154" + }, + { + "label": "v", + "hittable": false, + "index": 154, + "type": "Key", + "enabled": true, + "parentIndex": 130, + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 1034 + }, + "depth": 8, + "ref": "e155" + }, + { + "parentIndex": 130, + "index": 155, + "label": "b", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 1034 + }, + "type": "Key", + "enabled": true, + "depth": 8, + "hittable": false, + "ref": "e156" + }, + { + "enabled": true, + "label": "n", + "depth": 8, + "type": "Key", + "parentIndex": 130, + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 1034 + }, + "hittable": false, + "index": 156, + "ref": "e157" + }, + { + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 1034 + }, + "hittable": false, + "index": 157, + "label": "m", + "parentIndex": 130, + "depth": 8, + "enabled": true, + "type": "Key", + "ref": "e158" + }, + { + "enabled": true, + "hittable": false, + "depth": 8, + "parentIndex": 130, + "index": 158, + "label": "delete", + "identifier": "delete", + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "height": 46, + "y": 1034 + }, + "type": "Key", + "ref": "e159" + }, + { + "enabled": true, + "hittable": false, + "type": "Key", + "index": 159, + "identifier": "more", + "rect": { + "width": 101, + "x": 0, + "height": 46, + "y": 1088 + }, + "depth": 8, + "parentIndex": 130, + "label": "numbers", + "ref": "e160" + }, + { + "hittable": false, + "type": "Key", + "identifier": "space", + "depth": 8, + "label": "space", + "enabled": true, + "parentIndex": 130, + "index": 160, + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "height": 46, + "y": 1088 + }, + "ref": "e161" + }, + { + "label": "return", + "depth": 8, + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "height": 46, + "y": 1088 + }, + "parentIndex": 130, + "index": 161, + "identifier": "Return", + "hittable": false, + "enabled": true, + "type": "Button", + "ref": "e162" + }, + { + "parentIndex": 107, + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 919 + }, + "depth": 4, + "index": 162, + "label": "Emoji", + "hittable": false, + "type": "Other", + "enabled": true, + "ref": "e163" + }, + { + "label": "Emoji", + "depth": 5, + "parentIndex": 162, + "enabled": true, + "index": 163, + "type": "Button", + "hittable": false, + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "height": 68.73516393505088, + "y": 1141.6989567998571 + }, + "ref": "e164" + }, + { + "type": "StaticText", + "enabled": true, + "rect": { + "width": 0, + "x": 8.47726568115926, + "height": 0, + "y": 1141.6989567998571 + }, + "index": 164, + "hittable": false, + "depth": 6, + "parentIndex": 163, + "ref": "e165" + }, + { + "label": "Dictate", + "identifier": "dictation", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239 + }, + "type": "Button", + "depth": 5, + "enabled": true, + "parentIndex": 162, + "hittable": false, + "index": 165, + "ref": "e166" + }, + { + "parentIndex": 165, + "type": "StaticText", + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239 + }, + "enabled": true, + "index": 166, + "depth": 6, + "hittable": false, + "ref": "e167" + }, + { + "hittable": false, + "parentIndex": 162, + "index": 167, + "type": "Button", + "depth": 5, + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239 + }, + "identifier": "dictation", + "enabled": true, + "label": "Dictate", + "ref": "e168" + }, + { + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239 + }, + "type": "StaticText", + "index": 168, + "parentIndex": 167, + "depth": 6, + "hittable": false, + "enabled": true, + "ref": "e169" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 169, + "totalNodeCount": 169, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 84, + "p50Ms": 148, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 84 + } + } + }, + "refsGeneration": 776148 + } +} diff --git a/scroll-regression/ios/workspace-draft-empty-open.json b/scroll-regression/ios/workspace-draft-empty-open.json new file mode 100644 index 0000000000..2d686462a5 --- /dev/null +++ b/scroll-regression/ios/workspace-draft-empty-open.json @@ -0,0 +1,2698 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "depth": 0, + "label": "Paseo Debug", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "index": 0, + "hittable": true, + "enabled": true, + "type": "Application", + "ref": "e1" + }, + { + "rect": { + "y": 0, + "width": 402, + "height": 874, + "x": 0 + }, + "hittable": false, + "type": "Window", + "enabled": true, + "depth": 1, + "index": 1, + "parentIndex": 0, + "ref": "e2" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 1, + "enabled": true, + "depth": 2, + "index": 2, + "type": "Other", + "hittable": false, + "ref": "e3" + }, + { + "hittable": false, + "parentIndex": 2, + "index": 3, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 3, + "type": "Other", + "ref": "e4" + }, + { + "enabled": true, + "depth": 4, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "index": 4, + "parentIndex": 3, + "ref": "e5" + }, + { + "index": 5, + "enabled": true, + "depth": 5, + "type": "Other", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 4, + "ref": "e6" + }, + { + "parentIndex": 5, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 6, + "enabled": true, + "index": 6, + "type": "Other", + "ref": "e7" + }, + { + "type": "Other", + "enabled": true, + "index": 7, + "parentIndex": 6, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "depth": 7, + "ref": "e8" + }, + { + "depth": 8, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 8, + "hittable": false, + "enabled": true, + "parentIndex": 7, + "type": "Other", + "ref": "e9" + }, + { + "depth": 9, + "enabled": true, + "type": "Other", + "parentIndex": 8, + "index": 9, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "ref": "e10" + }, + { + "enabled": true, + "depth": 9, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 10, + "hittable": false, + "parentIndex": 8, + "type": "Other", + "ref": "e11" + }, + { + "enabled": true, + "depth": 10, + "index": 11, + "hittable": false, + "parentIndex": 10, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "ref": "e12" + }, + { + "depth": 10, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "index": 12, + "type": "Other", + "enabled": true, + "parentIndex": 10, + "ref": "e13" + }, + { + "index": 13, + "type": "Other", + "hittable": false, + "parentIndex": 12, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "depth": 11, + "ref": "e14" + }, + { + "depth": 11, + "enabled": true, + "index": 14, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 12, + "hittable": false, + "ref": "e15" + }, + { + "index": 15, + "depth": 12, + "enabled": true, + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 14, + "ref": "e16" + }, + { + "parentIndex": 15, + "depth": 13, + "index": 16, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "ref": "e17" + }, + { + "enabled": true, + "parentIndex": 16, + "depth": 14, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "type": "Other", + "index": 17, + "ref": "e18" + }, + { + "index": 18, + "enabled": true, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 17, + "depth": 15, + "hittable": false, + "ref": "e19" + }, + { + "index": 19, + "hittable": false, + "parentIndex": 18, + "enabled": true, + "depth": 16, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e20" + }, + { + "enabled": true, + "parentIndex": 19, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 20, + "hittable": false, + "type": "Other", + "depth": 17, + "ref": "e21" + }, + { + "enabled": true, + "parentIndex": 20, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 21, + "hittable": false, + "type": "Other", + "depth": 18, + "ref": "e22" + }, + { + "index": 22, + "depth": 19, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 21, + "type": "Other", + "ref": "e23" + }, + { + "hittable": false, + "enabled": true, + "depth": 20, + "parentIndex": 22, + "index": 23, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e24" + }, + { + "depth": 21, + "index": 24, + "type": "Other", + "label": "Switch tabs (2 open)", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 23, + "enabled": true, + "ref": "e25" + }, + { + "depth": 22, + "index": 25, + "label": "Open menu", + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 24, + "hittable": false, + "ref": "e26" + }, + { + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "label": "Open menu", + "index": 26, + "type": "Other", + "parentIndex": 25, + "depth": 23, + "enabled": true, + "ref": "e27" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "type": "Other", + "label": "Open menu", + "depth": 24, + "parentIndex": 26, + "index": 27, + "hittable": false, + "ref": "e28" + }, + { + "type": "Other", + "label": "Open menu", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 126 + }, + "enabled": true, + "hittable": false, + "index": 28, + "identifier": "composer-dock-header", + "depth": 25, + "parentIndex": 27, + "ref": "e29" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 70, + "height": 56 + }, + "parentIndex": 28, + "enabled": true, + "index": 29, + "depth": 26, + "type": "Other", + "hittable": false, + "ref": "e30" + }, + { + "rect": { + "x": 8, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "type": "Button", + "enabled": true, + "label": "Open menu", + "identifier": "menu-button", + "hittable": false, + "parentIndex": 28, + "depth": 26, + "index": 30, + "ref": "e31" + }, + { + "type": "Other", + "enabled": true, + "index": 31, + "parentIndex": 28, + "hittable": false, + "depth": 26, + "label": "main", + "rect": { + "x": 48, + "width": 314, + "y": 80.6666669845581, + "height": 34 + }, + "ref": "e32" + }, + { + "index": 32, + "depth": 27, + "enabled": true, + "parentIndex": 31, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 34 + }, + "label": "main", + "hittable": false, + "type": "Other", + "ref": "e33" + }, + { + "index": 33, + "hittable": false, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "type": "StaticText", + "label": "main", + "depth": 28, + "enabled": true, + "parentIndex": 32, + "identifier": "workspace-header-title", + "ref": "e34" + }, + { + "parentIndex": 33, + "index": 34, + "hittable": false, + "depth": 29, + "label": "main", + "type": "StaticText", + "enabled": true, + "rect": { + "x": 48, + "width": 278, + "y": 80.6666669845581, + "height": 18 + }, + "ref": "e35" + }, + { + "identifier": "workspace-header-subtitle", + "index": 35, + "hittable": false, + "depth": 28, + "parentIndex": 32, + "label": "composer-dock-ios-fixture", + "type": "StaticText", + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "enabled": true, + "ref": "e36" + }, + { + "type": "StaticText", + "enabled": true, + "index": 36, + "hittable": false, + "label": "composer-dock-ios-fixture", + "parentIndex": 35, + "rect": { + "x": 48, + "width": 163.3333282470703, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "depth": 29, + "ref": "e37" + }, + { + "enabled": true, + "hittable": false, + "label": "·", + "index": 37, + "type": "StaticText", + "depth": 28, + "parentIndex": 32, + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "ref": "e38" + }, + { + "index": 38, + "type": "StaticText", + "label": "·", + "enabled": true, + "rect": { + "x": 217.3333282470703, + "width": 4, + "y": 98.6666669845581, + "height": 15.666671752929688 + }, + "depth": 29, + "parentIndex": 37, + "hittable": false, + "ref": "e39" + }, + { + "parentIndex": 32, + "hittable": false, + "depth": 28, + "type": "Other", + "enabled": true, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "index": 39, + "rect": { + "x": 227.3333282470703, + "width": 68.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "ref": "e40" + }, + { + "hittable": false, + "depth": 28, + "type": "Other", + "enabled": true, + "parentIndex": 32, + "index": 40, + "rect": { + "x": 227.3333282470703, + "width": 12, + "y": 100.6666669845581, + "height": 12 + }, + "ref": "e41" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 11 + }, + "depth": 29, + "parentIndex": 40, + "index": 41, + "hittable": false, + "ref": "e42" + }, + { + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 101.1666669845581, + "height": 5 + }, + "index": 42, + "enabled": true, + "type": "Other", + "depth": 30, + "hittable": false, + "parentIndex": 41, + "ref": "e43" + }, + { + "rect": { + "x": 227.8333282470703, + "width": 11, + "y": 107.1666669845581, + "height": 5 + }, + "index": 43, + "enabled": true, + "type": "Other", + "depth": 30, + "hittable": false, + "parentIndex": 41, + "ref": "e44" + }, + { + "index": 44, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 30, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 103.1666669845581, + "height": 1 + }, + "parentIndex": 41, + "ref": "e45" + }, + { + "hittable": false, + "rect": { + "x": 229.8333282470703, + "width": 1.0049999999999955, + "y": 109.1666669845581, + "height": 1 + }, + "depth": 30, + "parentIndex": 41, + "enabled": true, + "index": 45, + "type": "Other", + "ref": "e46" + }, + { + "depth": 28, + "parentIndex": 32, + "index": 46, + "type": "StaticText", + "enabled": true, + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "hittable": false, + "label": "dev-new", + "ref": "e47" + }, + { + "parentIndex": 46, + "type": "StaticText", + "index": 47, + "depth": 29, + "hittable": false, + "enabled": true, + "label": "dev-new", + "rect": { + "x": 242.3333282470703, + "width": 53.00001525878906, + "y": 98.6666669845581, + "height": 16 + }, + "ref": "e48" + }, + { + "parentIndex": 31, + "rect": { + "x": 330, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "index": 48, + "label": "Workspace actions", + "identifier": "workspace-header-menu-trigger", + "hittable": false, + "type": "Button", + "enabled": true, + "depth": 27, + "ref": "e49" + }, + { + "label": "Open Explorer sidebar", + "rect": { + "x": 362, + "width": 32, + "y": 81.6666669845581, + "height": 32 + }, + "enabled": true, + "parentIndex": 28, + "index": 49, + "type": "Button", + "identifier": "workspace-explorer-toggle", + "hittable": false, + "depth": 26, + "ref": "e50" + }, + { + "index": 50, + "hittable": false, + "parentIndex": 27, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "type": "Other", + "depth": 25, + "ref": "e51" + }, + { + "depth": 25, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 27, + "hittable": false, + "index": 51, + "type": "Other", + "ref": "e52" + }, + { + "parentIndex": 27, + "depth": 25, + "type": "Button", + "index": 52, + "identifier": "workspace-tab-switcher-trigger", + "enabled": true, + "label": "Switch tabs (2 open)", + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 34 + }, + "hittable": false, + "ref": "e53" + }, + { + "hittable": false, + "index": 53, + "type": "Other", + "identifier": "workspace-active-tab-icon", + "depth": 26, + "parentIndex": 52, + "enabled": true, + "rect": { + "x": 20, + "width": 14, + "y": 136, + "height": 14 + }, + "ref": "e54" + }, + { + "enabled": true, + "type": "Other", + "identifier": "workspace-tabs-row", + "rect": { + "x": 0, + "width": 402, + "y": 126, + "height": 35 + }, + "index": 54, + "hittable": false, + "depth": 25, + "parentIndex": 27, + "ref": "e55" + }, + { + "depth": 25, + "parentIndex": 27, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 55, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "ref": "e56" + }, + { + "type": "Other", + "enabled": true, + "index": 56, + "hittable": false, + "depth": 25, + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "parentIndex": 27, + "ref": "e57" + }, + { + "hittable": false, + "enabled": true, + "label": "Import session", + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "parentIndex": 56, + "type": "Other", + "depth": 26, + "index": 57, + "ref": "e58" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "parentIndex": 57, + "enabled": true, + "index": 58, + "hittable": false, + "type": "Other", + "depth": 27, + "ref": "e59" + }, + { + "type": "Other", + "index": 59, + "depth": 27, + "enabled": true, + "identifier": "composer-viewport", + "rect": { + "x": 0, + "width": 402, + "y": 161, + "height": 713 + }, + "label": "Import session", + "hittable": false, + "parentIndex": 57, + "ref": "e60" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 713 + }, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "depth": 28, + "index": 60, + "parentIndex": 59, + "hittable": false, + "ref": "e61" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 527 + }, + "depth": 29, + "identifier": "composer-dock-content", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 60, + "hittable": false, + "type": "Other", + "index": 61, + "enabled": true, + "ref": "e62" + }, + { + "hittable": false, + "index": 62, + "enabled": true, + "parentIndex": 61, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 527 + }, + "depth": 30, + "ref": "e63" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 527 + }, + "index": 63, + "parentIndex": 61, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 30, + "label": "Vertical scroll bar, 1 page", + "ref": "e64" + }, + { + "type": "ScrollView", + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 527 + }, + "hittable": false, + "index": 64, + "depth": 31, + "parentIndex": 63, + "ref": "e65" + }, + { + "enabled": true, + "index": 65, + "depth": 32, + "hittable": false, + "type": "Other", + "parentIndex": 64, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 40 + }, + "ref": "e66" + }, + { + "index": 66, + "type": "Other", + "parentIndex": 65, + "rect": { + "x": 0, + "width": 402, + "y": -141, + "height": 40 + }, + "hittable": false, + "enabled": true, + "depth": 33, + "ref": "e67" + }, + { + "parentIndex": 64, + "enabled": true, + "rect": { + "x": 369, + "width": 30, + "y": -141, + "height": 527 + }, + "depth": 32, + "index": 67, + "value": "0%", + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "type": "Other", + "ref": "e68" + }, + { + "index": 68, + "type": "Other", + "enabled": true, + "hittable": false, + "depth": 33, + "rect": { + "x": 396, + "width": 3, + "y": -138, + "height": 53 + }, + "parentIndex": 67, + "ref": "e69" + }, + { + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 353, + "height": 30 + }, + "label": "Horizontal scroll bar, 1 page", + "depth": 32, + "index": 69, + "value": "0%", + "enabled": true, + "parentIndex": 64, + "hittable": false, + "ref": "e70" + }, + { + "type": "Other", + "hittable": false, + "enabled": true, + "index": 70, + "rect": { + "x": 3, + "width": 393, + "y": 380, + "height": 3 + }, + "parentIndex": 69, + "depth": 33, + "ref": "e71" + }, + { + "label": "Vertical scroll bar, 1 page", + "index": 71, + "value": "0%", + "depth": 32, + "parentIndex": 64, + "enabled": true, + "hittable": false, + "rect": { + "x": 369, + "width": 30, + "y": -141, + "height": 527 + }, + "type": "Other", + "ref": "e72" + }, + { + "hittable": false, + "type": "Other", + "depth": 33, + "parentIndex": 71, + "rect": { + "x": 396, + "width": 3, + "y": -138, + "height": 53 + }, + "index": 72, + "enabled": true, + "ref": "e73" + }, + { + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 0, + "width": 402, + "y": 353, + "height": 30 + }, + "value": "0%", + "depth": 32, + "index": 73, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 64, + "ref": "e74" + }, + { + "enabled": true, + "index": 74, + "depth": 33, + "hittable": false, + "rect": { + "x": 3, + "width": 393, + "y": 380, + "height": 3 + }, + "parentIndex": 73, + "type": "Other", + "ref": "e75" + }, + { + "depth": 29, + "type": "Other", + "parentIndex": 60, + "index": 75, + "identifier": "composer-viewport-content", + "rect": { + "x": 0, + "width": 402, + "y": 386, + "height": 186 + }, + "label": "Import session", + "enabled": true, + "hittable": false, + "ref": "e76" + }, + { + "rect": { + "x": 16, + "width": 137, + "y": 394, + "height": 32 + }, + "hittable": false, + "identifier": "composer-import-agent-pill", + "enabled": true, + "depth": 30, + "index": 76, + "parentIndex": 75, + "type": "Button", + "label": "Import session", + "ref": "e77" + }, + { + "label": "Import session", + "rect": { + "x": 51, + "width": 89, + "y": 402, + "height": 15.66668701171875 + }, + "depth": 31, + "type": "StaticText", + "parentIndex": 76, + "index": 77, + "hittable": false, + "enabled": true, + "ref": "e78" + }, + { + "index": 78, + "enabled": true, + "depth": 32, + "parentIndex": 77, + "rect": { + "x": 51, + "width": 89, + "y": 402, + "height": 15.66668701171875 + }, + "label": "Import session", + "type": "StaticText", + "hittable": false, + "ref": "e79" + }, + { + "enabled": true, + "index": 79, + "hittable": false, + "type": "Other", + "rect": { + "x": 16, + "width": 370, + "y": 434, + "height": 88 + }, + "identifier": "message-input-root", + "depth": 30, + "parentIndex": 75, + "ref": "e80" + }, + { + "type": "Other", + "rect": { + "x": 16, + "width": 370, + "y": 434, + "height": 88 + }, + "hittable": false, + "enabled": true, + "parentIndex": 75, + "depth": 30, + "index": 80, + "ref": "e81" + }, + { + "label": "Message agent... Message, @files, /commands", + "parentIndex": 75, + "rect": { + "x": 29, + "width": 344, + "y": 443, + "height": 30 + }, + "index": 81, + "depth": 30, + "enabled": true, + "type": "Other", + "hittable": false, + "ref": "e82" + }, + { + "type": "TextView", + "enabled": true, + "rect": { + "x": 29, + "width": 344, + "y": 443, + "height": 30 + }, + "depth": 31, + "index": 82, + "hittable": false, + "parentIndex": 81, + "label": "Message agent... Message, @files, /commands", + "ref": "e83" + }, + { + "depth": 32, + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 82, + "rect": { + "x": 340, + "width": 30, + "y": 443, + "height": 30 + }, + "index": 83, + "ref": "e84" + }, + { + "index": 84, + "type": "Other", + "enabled": true, + "depth": 33, + "hittable": false, + "parentIndex": 83, + "rect": { + "x": 367, + "width": 3, + "y": 439, + "height": 31 + }, + "ref": "e85" + }, + { + "enabled": true, + "parentIndex": 82, + "value": "0%", + "index": 85, + "type": "Other", + "hittable": false, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 29, + "width": 344, + "y": 455, + "height": 15 + }, + "depth": 32, + "ref": "e86" + }, + { + "parentIndex": 85, + "depth": 33, + "enabled": true, + "hittable": false, + "rect": { + "x": 32, + "width": 338, + "y": 467, + "height": 3 + }, + "index": 86, + "type": "Other", + "ref": "e87" + }, + { + "identifier": "message-input-attach-button", + "rect": { + "x": 23, + "width": 28, + "y": 485, + "height": 28 + }, + "label": "Add attachment", + "index": 87, + "enabled": true, + "type": "Button", + "depth": 30, + "parentIndex": 75, + "hittable": false, + "ref": "e88" + }, + { + "hittable": false, + "rect": { + "x": 23, + "width": 28, + "y": 485, + "height": 28 + }, + "enabled": true, + "depth": 31, + "parentIndex": 87, + "index": 88, + "type": "Other", + "ref": "e89" + }, + { + "hittable": false, + "depth": 32, + "index": 89, + "enabled": true, + "type": "Other", + "rect": { + "x": 27, + "width": 20, + "y": 489, + "height": 20 + }, + "parentIndex": 88, + "ref": "e90" + }, + { + "parentIndex": 89, + "hittable": false, + "type": "Other", + "index": 90, + "depth": 33, + "enabled": true, + "rect": { + "x": 30.333333333333332, + "width": 13.333333333333332, + "y": 492.3333333333333, + "height": 13.333333333333371 + }, + "ref": "e91" + }, + { + "index": 91, + "type": "Other", + "depth": 34, + "hittable": false, + "rect": { + "x": 30.333333333333332, + "width": 13.333333333333332, + "y": 498.16666666666663, + "height": 1.6666666666666856 + }, + "parentIndex": 90, + "enabled": true, + "ref": "e92" + }, + { + "rect": { + "x": 36.16666666666667, + "width": 1.6666666666666643, + "y": 492.33333333333337, + "height": 13.333333333333314 + }, + "parentIndex": 90, + "depth": 34, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 92, + "ref": "e93" + }, + { + "type": "Other", + "depth": 30, + "hittable": false, + "enabled": true, + "index": 93, + "label": "Select model (Select model)", + "parentIndex": 75, + "rect": { + "x": 51, + "width": 300, + "y": 485, + "height": 28 + }, + "ref": "e94" + }, + { + "rect": { + "x": 51, + "width": 105.66667175292969, + "y": 485, + "height": 28 + }, + "type": "Button", + "parentIndex": 93, + "hittable": false, + "label": "Select model (Select model)", + "identifier": "combined-model-selector", + "enabled": true, + "depth": 31, + "index": 94, + "ref": "e95" + }, + { + "label": "Start dictation", + "rect": { + "x": 351, + "width": 28, + "y": 485, + "height": 28 + }, + "index": 95, + "depth": 30, + "parentIndex": 75, + "type": "Button", + "hittable": false, + "enabled": true, + "ref": "e96" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 11, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 12, + "index": 96, + "ref": "e97" + }, + { + "enabled": true, + "parentIndex": 6, + "depth": 7, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 97, + "type": "Other", + "ref": "e98" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "parentIndex": 97, + "index": 98, + "type": "Other", + "hittable": false, + "depth": 8, + "ref": "e99" + }, + { + "index": 99, + "parentIndex": 98, + "enabled": true, + "hittable": false, + "type": "Other", + "depth": 9, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "ref": "e100" + }, + { + "type": "Window", + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 100, + "hittable": false, + "enabled": true, + "parentIndex": 0, + "depth": 1, + "ref": "e101" + }, + { + "index": 101, + "parentIndex": 100, + "enabled": true, + "type": "Other", + "depth": 2, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "hittable": false, + "ref": "e102" + }, + { + "hittable": false, + "type": "Other", + "depth": 3, + "index": 102, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "parentIndex": 101, + "ref": "e103" + }, + { + "index": 103, + "depth": 3, + "parentIndex": 101, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 336 + }, + "enabled": true, + "type": "Other", + "ref": "e104" + }, + { + "enabled": true, + "index": 104, + "type": "Other", + "depth": 4, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 278 + }, + "parentIndex": 103, + "ref": "e105" + }, + { + "type": "Window", + "index": 105, + "parentIndex": 0, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "depth": 1, + "hittable": true, + "enabled": true, + "label": "Emoji", + "ref": "e106" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "index": 106, + "type": "Other", + "enabled": true, + "label": "Emoji", + "depth": 2, + "parentIndex": 105, + "hittable": true, + "ref": "e107" + }, + { + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 336 + }, + "type": "Other", + "label": "Emoji", + "hittable": true, + "parentIndex": 106, + "depth": 3, + "index": 107, + "enabled": true, + "ref": "e108" + }, + { + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "parentIndex": 107, + "enabled": true, + "index": 108, + "type": "Other", + "depth": 4, + "ref": "e109" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "parentIndex": 108, + "depth": 5, + "index": 109, + "hittable": false, + "ref": "e110" + }, + { + "index": 110, + "parentIndex": 109, + "type": "Other", + "depth": 6, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "enabled": true, + "ref": "e111" + }, + { + "hittable": true, + "depth": 4, + "label": "Typing Predictions", + "type": "Other", + "parentIndex": 107, + "index": 111, + "enabled": true, + "identifier": "SystemInputAssistantView", + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "ref": "e112" + }, + { + "parentIndex": 111, + "type": "Other", + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "depth": 5, + "enabled": true, + "label": "Typing Predictions", + "index": 112, + "ref": "e113" + }, + { + "enabled": true, + "label": "Typing Predictions", + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "identifier": "CenterPageView", + "depth": 6, + "hittable": true, + "parentIndex": 112, + "index": 113, + "type": "Other", + "ref": "e114" + }, + { + "type": "Other", + "enabled": true, + "index": 114, + "parentIndex": 113, + "hittable": false, + "depth": 7, + "rect": { + "x": 0, + "width": 402, + "y": -62, + "height": 1245 + }, + "ref": "e115" + }, + { + "type": "ScrollView", + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "depth": 8, + "enabled": true, + "index": 115, + "parentIndex": 114, + "ref": "e116" + }, + { + "enabled": true, + "type": "Other", + "index": 116, + "depth": 7, + "label": "Typing Predictions", + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "parentIndex": 113, + "ref": "e117" + }, + { + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "enabled": true, + "label": "Typing Predictions", + "index": 117, + "depth": 8, + "type": "Other", + "parentIndex": 116, + "ref": "e118" + }, + { + "hittable": true, + "label": "I", + "depth": 9, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "parentIndex": 117, + "type": "Other", + "index": 118, + "ref": "e119" + }, + { + "depth": 10, + "parentIndex": 118, + "label": "I", + "index": 119, + "type": "Other", + "hittable": true, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 538, + "height": 45 + }, + "ref": "e120" + }, + { + "label": "I", + "rect": { + "x": 0, + "width": 134, + "y": 538, + "height": 45 + }, + "index": 120, + "depth": 11, + "enabled": true, + "type": "Other", + "hittable": true, + "parentIndex": 119, + "ref": "e121" + }, + { + "type": "Other", + "depth": 11, + "index": 121, + "enabled": true, + "rect": { + "x": 134, + "width": 134, + "y": 538, + "height": 45 + }, + "hittable": true, + "label": "The", + "parentIndex": 119, + "ref": "e122" + }, + { + "parentIndex": 119, + "index": 122, + "label": "I’m", + "hittable": true, + "type": "Other", + "enabled": true, + "rect": { + "x": 268, + "width": 134, + "y": 538, + "height": 45 + }, + "depth": 11, + "ref": "e123" + }, + { + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 107, + "depth": 4, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "index": 123, + "ref": "e124" + }, + { + "type": "Other", + "depth": 5, + "index": 124, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "hittable": false, + "parentIndex": 123, + "enabled": true, + "ref": "e125" + }, + { + "index": 125, + "type": "Other", + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "hittable": false, + "enabled": true, + "depth": 6, + "parentIndex": 124, + "ref": "e126" + }, + { + "type": "Other", + "depth": 7, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "parentIndex": 125, + "index": 126, + "ref": "e127" + }, + { + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "type": "Other", + "parentIndex": 107, + "enabled": true, + "label": "Q", + "depth": 4, + "index": 127, + "ref": "e128" + }, + { + "type": "Keyboard", + "depth": 5, + "label": "Q", + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "parentIndex": 127, + "enabled": true, + "index": 128, + "hittable": false, + "ref": "e129" + }, + { + "label": "Q", + "parentIndex": 128, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "index": 129, + "depth": 6, + "ref": "e130" + }, + { + "parentIndex": 129, + "index": 130, + "identifier": "UIKeyboardLayoutStar Preview", + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 233 + }, + "depth": 7, + "label": "Q", + "hittable": false, + "ref": "e131" + }, + { + "enabled": true, + "rect": { + "x": 0, + "width": 40.333333333333336, + "y": 590, + "height": 46 + }, + "hittable": false, + "label": "Q", + "parentIndex": 130, + "depth": 8, + "index": 131, + "type": "Key", + "ref": "e132" + }, + { + "index": 132, + "enabled": true, + "rect": { + "x": 40.333333333333336, + "width": 40.00000000000001, + "y": 590, + "height": 46 + }, + "depth": 8, + "type": "Key", + "hittable": false, + "parentIndex": 130, + "label": "W", + "ref": "e133" + }, + { + "enabled": true, + "rect": { + "x": 80.33333333333334, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "hittable": false, + "depth": 8, + "label": "E", + "type": "Key", + "parentIndex": 130, + "index": 133, + "ref": "e134" + }, + { + "hittable": false, + "parentIndex": 130, + "rect": { + "x": 120.66666666666669, + "width": 40, + "y": 590, + "height": 46 + }, + "depth": 8, + "index": 134, + "label": "R", + "enabled": true, + "type": "Key", + "ref": "e135" + }, + { + "parentIndex": 130, + "depth": 8, + "type": "Key", + "index": 135, + "label": "T", + "enabled": true, + "hittable": false, + "rect": { + "x": 160.66666666666669, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "ref": "e136" + }, + { + "hittable": false, + "rect": { + "x": 201.00000000000003, + "width": 40.33333333333334, + "y": 590, + "height": 46 + }, + "type": "Key", + "parentIndex": 130, + "index": 136, + "enabled": true, + "depth": 8, + "label": "Y", + "ref": "e137" + }, + { + "rect": { + "x": 241.33333333333337, + "width": 40, + "y": 590, + "height": 46 + }, + "type": "Key", + "label": "U", + "parentIndex": 130, + "index": 137, + "hittable": false, + "depth": 8, + "enabled": true, + "ref": "e138" + }, + { + "depth": 8, + "enabled": true, + "index": 138, + "parentIndex": 130, + "rect": { + "x": 281.33333333333337, + "width": 40.333333333333314, + "y": 590, + "height": 46 + }, + "hittable": false, + "type": "Key", + "label": "I", + "ref": "e139" + }, + { + "index": 139, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "O", + "parentIndex": 130, + "hittable": false, + "rect": { + "x": 321.6666666666667, + "width": 40, + "y": 590, + "height": 46 + }, + "ref": "e140" + }, + { + "index": 140, + "type": "Key", + "label": "P", + "hittable": false, + "enabled": true, + "depth": 8, + "rect": { + "x": 361.6666666666667, + "width": 40.333333333333314, + "y": 590, + "height": 46 + }, + "parentIndex": 130, + "ref": "e141" + }, + { + "label": "A", + "hittable": false, + "type": "Key", + "rect": { + "x": 19.666666666666668, + "width": 40.33333333333333, + "y": 644, + "height": 46 + }, + "enabled": true, + "parentIndex": 130, + "index": 141, + "depth": 8, + "ref": "e142" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "x": 60, + "width": 40.33333333333334, + "y": 644, + "height": 46 + }, + "hittable": false, + "parentIndex": 130, + "depth": 8, + "index": 142, + "label": "S", + "ref": "e143" + }, + { + "rect": { + "x": 100.33333333333334, + "width": 40, + "y": 644, + "height": 46 + }, + "hittable": false, + "depth": 8, + "index": 143, + "label": "D", + "type": "Key", + "enabled": true, + "parentIndex": 130, + "ref": "e144" + }, + { + "depth": 8, + "hittable": false, + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "y": 644, + "height": 46 + }, + "index": 144, + "enabled": true, + "parentIndex": 130, + "type": "Key", + "label": "F", + "ref": "e145" + }, + { + "hittable": false, + "parentIndex": 130, + "type": "Key", + "enabled": true, + "label": "G", + "rect": { + "x": 181.2026666666667, + "width": 40, + "y": 644, + "height": 46 + }, + "depth": 8, + "index": 145, + "ref": "e146" + }, + { + "enabled": true, + "parentIndex": 130, + "rect": { + "x": 221.2026666666667, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "hittable": false, + "label": "H", + "type": "Key", + "depth": 8, + "index": 146, + "ref": "e147" + }, + { + "depth": 8, + "hittable": false, + "index": 147, + "type": "Key", + "rect": { + "x": 261.536, + "width": 40, + "y": 644, + "height": 46 + }, + "label": "J", + "parentIndex": 130, + "enabled": true, + "ref": "e148" + }, + { + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 130, + "index": 148, + "rect": { + "x": 301.536, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "label": "K", + "type": "Key", + "ref": "e149" + }, + { + "label": "L", + "depth": 8, + "index": 149, + "enabled": true, + "hittable": false, + "parentIndex": 130, + "type": "Key", + "rect": { + "x": 341.8693333333333, + "width": 40.333333333333314, + "y": 644, + "height": 46 + }, + "ref": "e150" + }, + { + "index": 150, + "identifier": "shift", + "parentIndex": 130, + "enabled": true, + "type": "Button", + "hittable": false, + "rect": { + "x": 0, + "width": 51.333333333333336, + "y": 698, + "height": 46 + }, + "label": "shift", + "selected": true, + "depth": 8, + "ref": "e151" + }, + { + "index": 151, + "hittable": false, + "depth": 8, + "type": "Key", + "label": "Z", + "rect": { + "x": 60, + "width": 40.33333333333334, + "y": 698, + "height": 46 + }, + "enabled": true, + "parentIndex": 130, + "ref": "e152" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 130, + "type": "Key", + "depth": 8, + "index": 152, + "rect": { + "x": 100.33333333333334, + "width": 40, + "y": 698, + "height": 46 + }, + "label": "X", + "ref": "e153" + }, + { + "type": "Key", + "enabled": true, + "depth": 8, + "label": "C", + "parentIndex": 130, + "index": 153, + "rect": { + "x": 140.33333333333334, + "width": 40.33333333333334, + "y": 698, + "height": 46 + }, + "hittable": false, + "ref": "e154" + }, + { + "type": "Key", + "index": 154, + "rect": { + "x": 181.2026666666667, + "width": 40, + "y": 698, + "height": 46 + }, + "enabled": true, + "label": "V", + "hittable": false, + "depth": 8, + "parentIndex": 130, + "ref": "e155" + }, + { + "parentIndex": 130, + "index": 155, + "hittable": false, + "label": "B", + "type": "Key", + "depth": 8, + "rect": { + "x": 221.2026666666667, + "width": 40.333333333333314, + "y": 698, + "height": 46 + }, + "enabled": true, + "ref": "e156" + }, + { + "enabled": true, + "index": 156, + "type": "Key", + "depth": 8, + "parentIndex": 130, + "rect": { + "x": 261.536, + "width": 40, + "y": 698, + "height": 46 + }, + "label": "N", + "hittable": false, + "ref": "e157" + }, + { + "index": 157, + "rect": { + "x": 301.536, + "width": 40.333333333333314, + "y": 698, + "height": 46 + }, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "M", + "hittable": false, + "parentIndex": 130, + "ref": "e158" + }, + { + "hittable": false, + "index": 158, + "enabled": true, + "depth": 8, + "rect": { + "x": 350.42133333333334, + "width": 51.333333333333314, + "y": 698, + "height": 46 + }, + "parentIndex": 130, + "type": "Key", + "label": "delete", + "identifier": "delete", + "ref": "e159" + }, + { + "hittable": false, + "parentIndex": 130, + "index": 159, + "type": "Key", + "enabled": true, + "label": "numbers", + "depth": 8, + "rect": { + "x": 0, + "width": 101, + "y": 752, + "height": 46 + }, + "identifier": "more", + "ref": "e160" + }, + { + "enabled": true, + "identifier": "space", + "index": 160, + "hittable": false, + "type": "Key", + "rect": { + "x": 100.33333333333334, + "width": 201.33333333333334, + "y": 752, + "height": 46 + }, + "label": "space", + "parentIndex": 130, + "depth": 8, + "ref": "e161" + }, + { + "identifier": "Return", + "enabled": true, + "rect": { + "x": 301.6666666666667, + "width": 100.33333333333331, + "y": 752, + "height": 46 + }, + "hittable": false, + "depth": 8, + "type": "Button", + "parentIndex": 130, + "index": 161, + "label": "return", + "ref": "e162" + }, + { + "label": "Emoji", + "type": "Other", + "index": 162, + "depth": 4, + "hittable": true, + "rect": { + "x": 0, + "width": 402, + "y": 583, + "height": 291 + }, + "parentIndex": 107, + "enabled": true, + "ref": "e163" + }, + { + "enabled": true, + "rect": { + "x": 8.47726568115926, + "width": 68.0852958475086, + "y": 805.6989567998571, + "height": 68.73516393505099 + }, + "index": 163, + "parentIndex": 162, + "label": "Emoji", + "type": "Button", + "hittable": true, + "depth": 5, + "ref": "e164" + }, + { + "parentIndex": 163, + "enabled": true, + "type": "StaticText", + "hittable": false, + "depth": 6, + "rect": { + "x": 8.47726568115926, + "width": 0, + "y": 805.6989567998571, + "height": 0 + }, + "index": 164, + "ref": "e165" + }, + { + "hittable": false, + "type": "Button", + "parentIndex": 162, + "depth": 5, + "enabled": true, + "index": 165, + "identifier": "dictation", + "rect": { + "x": 325.43743847133214, + "width": 68.08529584750863, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "label": "Dictate", + "ref": "e166" + }, + { + "type": "StaticText", + "enabled": true, + "index": 166, + "rect": { + "x": 325.43743847133214, + "width": 0, + "y": 805.3656234665239, + "height": 0 + }, + "depth": 6, + "parentIndex": 165, + "hittable": false, + "ref": "e167" + }, + { + "hittable": true, + "label": "Dictate", + "parentIndex": 162, + "type": "Button", + "depth": 5, + "rect": { + "x": 325.43743847133214, + "width": 68.08529584750863, + "y": 805.3656234665239, + "height": 68.73516393505099 + }, + "index": 167, + "enabled": true, + "identifier": "dictation", + "ref": "e168" + }, + { + "index": 168, + "rect": { + "x": 325.43743847133214, + "width": 0, + "y": 805.3656234665239, + "height": 0 + }, + "type": "StaticText", + "enabled": true, + "parentIndex": 167, + "depth": 6, + "hittable": false, + "ref": "e169" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 169, + "totalNodeCount": 169, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 83, + "p50Ms": 157, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 83 + } + } + }, + "refsGeneration": 776147 + } +} diff --git a/scroll-regression/ios/workspace-draft-header-dismissed.json b/scroll-regression/ios/workspace-draft-header-dismissed.json new file mode 100644 index 0000000000..f1df87316a --- /dev/null +++ b/scroll-regression/ios/workspace-draft-header-dismissed.json @@ -0,0 +1,2709 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "hittable": true, + "depth": 0, + "label": "Paseo Debug", + "enabled": true, + "index": 0, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Application", + "ref": "e1" + }, + { + "parentIndex": 0, + "index": 1, + "hittable": false, + "type": "Window", + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "enabled": true, + "depth": 1, + "ref": "e2" + }, + { + "hittable": false, + "parentIndex": 1, + "depth": 2, + "index": 2, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "ref": "e3" + }, + { + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "index": 3, + "depth": 3, + "parentIndex": 2, + "type": "Other", + "ref": "e4" + }, + { + "hittable": false, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "index": 4, + "depth": 4, + "parentIndex": 3, + "type": "Other", + "ref": "e5" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 5, + "type": "Other", + "enabled": true, + "parentIndex": 4, + "hittable": false, + "index": 5, + "ref": "e6" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 6, + "type": "Other", + "enabled": true, + "parentIndex": 5, + "hittable": false, + "index": 6, + "ref": "e7" + }, + { + "index": 7, + "hittable": false, + "type": "Other", + "enabled": true, + "depth": 7, + "parentIndex": 6, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "ref": "e8" + }, + { + "type": "Other", + "enabled": true, + "depth": 8, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 7, + "index": 8, + "ref": "e9" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 9, + "type": "Other", + "depth": 9, + "enabled": true, + "hittable": false, + "parentIndex": 8, + "ref": "e10" + }, + { + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 8, + "index": 10, + "enabled": true, + "depth": 9, + "ref": "e11" + }, + { + "hittable": false, + "enabled": true, + "parentIndex": 10, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 11, + "depth": 10, + "type": "Other", + "ref": "e12" + }, + { + "parentIndex": 10, + "hittable": false, + "enabled": true, + "depth": 10, + "index": 12, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "ref": "e13" + }, + { + "parentIndex": 12, + "type": "Other", + "enabled": true, + "index": 13, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "depth": 11, + "ref": "e14" + }, + { + "index": 14, + "parentIndex": 12, + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "depth": 11, + "ref": "e15" + }, + { + "hittable": false, + "index": 15, + "parentIndex": 14, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "depth": 12, + "enabled": true, + "ref": "e16" + }, + { + "type": "Other", + "index": 16, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "parentIndex": 15, + "hittable": false, + "depth": 13, + "ref": "e17" + }, + { + "hittable": false, + "type": "Other", + "parentIndex": 16, + "index": 17, + "depth": 14, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "ref": "e18" + }, + { + "depth": 15, + "type": "Other", + "hittable": false, + "index": 18, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 17, + "ref": "e19" + }, + { + "enabled": true, + "index": 19, + "hittable": false, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 16, + "parentIndex": 18, + "ref": "e20" + }, + { + "hittable": false, + "depth": 17, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 20, + "type": "Other", + "parentIndex": 19, + "enabled": true, + "ref": "e21" + }, + { + "hittable": false, + "depth": 18, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 21, + "type": "Other", + "parentIndex": 20, + "enabled": true, + "ref": "e22" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 19, + "enabled": true, + "parentIndex": 21, + "type": "Other", + "hittable": false, + "index": 22, + "ref": "e23" + }, + { + "type": "Other", + "hittable": false, + "index": 23, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "depth": 20, + "parentIndex": 22, + "ref": "e24" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "parentIndex": 23, + "depth": 21, + "index": 24, + "hittable": false, + "label": "Switch tabs (2 open)", + "type": "Other", + "ref": "e25" + }, + { + "index": 25, + "parentIndex": 24, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "depth": 22, + "label": "Open menu", + "hittable": false, + "enabled": true, + "ref": "e26" + }, + { + "hittable": false, + "index": 26, + "parentIndex": 25, + "depth": 23, + "label": "Open menu", + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "enabled": true, + "ref": "e27" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "label": "Open menu", + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "type": "Other", + "parentIndex": 26, + "index": 27, + "depth": 24, + "ref": "e28" + }, + { + "type": "Other", + "label": "Open menu", + "hittable": false, + "identifier": "composer-dock-header", + "parentIndex": 27, + "enabled": true, + "depth": 25, + "rect": { + "x": 0, + "height": 126, + "y": 0, + "width": 402 + }, + "index": 28, + "ref": "e29" + }, + { + "hittable": false, + "parentIndex": 28, + "enabled": true, + "rect": { + "x": 0, + "height": 56, + "y": 70, + "width": 402 + }, + "depth": 26, + "index": 29, + "type": "Other", + "ref": "e30" + }, + { + "enabled": true, + "label": "Open menu", + "hittable": false, + "type": "Button", + "identifier": "menu-button", + "depth": 26, + "index": 30, + "parentIndex": 28, + "rect": { + "x": 8, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "ref": "e31" + }, + { + "parentIndex": 28, + "index": 31, + "hittable": false, + "enabled": true, + "depth": 26, + "rect": { + "x": 48, + "height": 34, + "y": 80.6666669845581, + "width": 314 + }, + "label": "main", + "type": "Other", + "ref": "e32" + }, + { + "label": "main", + "parentIndex": 31, + "enabled": true, + "type": "Other", + "hittable": false, + "index": 32, + "rect": { + "x": 48, + "height": 34, + "y": 80.6666669845581, + "width": 278 + }, + "depth": 27, + "ref": "e33" + }, + { + "index": 33, + "identifier": "workspace-header-title", + "label": "main", + "depth": 28, + "hittable": false, + "rect": { + "x": 48, + "height": 18, + "y": 80.6666669845581, + "width": 278 + }, + "parentIndex": 32, + "type": "StaticText", + "enabled": true, + "ref": "e34" + }, + { + "enabled": true, + "parentIndex": 33, + "index": 34, + "label": "main", + "hittable": false, + "rect": { + "x": 48, + "height": 18, + "y": 80.6666669845581, + "width": 278 + }, + "type": "StaticText", + "depth": 29, + "ref": "e35" + }, + { + "index": 35, + "hittable": false, + "identifier": "workspace-header-subtitle", + "label": "composer-dock-ios-fixture", + "rect": { + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703 + }, + "depth": 28, + "parentIndex": 32, + "enabled": true, + "type": "StaticText", + "ref": "e36" + }, + { + "rect": { + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 163.3333282470703 + }, + "label": "composer-dock-ios-fixture", + "type": "StaticText", + "depth": 29, + "hittable": false, + "enabled": true, + "parentIndex": 35, + "index": 36, + "ref": "e37" + }, + { + "parentIndex": 32, + "enabled": true, + "index": 37, + "hittable": false, + "type": "StaticText", + "depth": 28, + "label": "·", + "rect": { + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 4 + }, + "ref": "e38" + }, + { + "label": "·", + "enabled": true, + "rect": { + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "width": 4 + }, + "depth": 29, + "hittable": false, + "parentIndex": 37, + "index": 38, + "type": "StaticText", + "ref": "e39" + }, + { + "index": 39, + "rect": { + "x": 227.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 68.00001525878906 + }, + "enabled": true, + "label": "dev-new", + "hittable": false, + "depth": 28, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "type": "Other", + "parentIndex": 32, + "ref": "e40" + }, + { + "parentIndex": 32, + "rect": { + "x": 227.3333282470703, + "height": 12, + "y": 100.6666669845581, + "width": 12 + }, + "hittable": false, + "depth": 28, + "type": "Other", + "index": 40, + "enabled": true, + "ref": "e41" + }, + { + "depth": 29, + "enabled": true, + "hittable": false, + "index": 41, + "parentIndex": 40, + "rect": { + "x": 227.8333282470703, + "height": 11, + "y": 101.1666669845581, + "width": 11 + }, + "type": "Other", + "ref": "e42" + }, + { + "parentIndex": 41, + "index": 42, + "rect": { + "x": 227.8333282470703, + "height": 5, + "y": 101.1666669845581, + "width": 11 + }, + "hittable": false, + "depth": 30, + "enabled": true, + "type": "Other", + "ref": "e43" + }, + { + "parentIndex": 41, + "index": 43, + "rect": { + "x": 227.8333282470703, + "height": 5, + "y": 107.1666669845581, + "width": 11 + }, + "hittable": false, + "depth": 30, + "enabled": true, + "type": "Other", + "ref": "e44" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 229.8333282470703, + "height": 1, + "y": 103.1666669845581, + "width": 1.0049999999999955 + }, + "depth": 30, + "index": 44, + "parentIndex": 41, + "type": "Other", + "ref": "e45" + }, + { + "parentIndex": 41, + "hittable": false, + "type": "Other", + "index": 45, + "enabled": true, + "depth": 30, + "rect": { + "x": 229.8333282470703, + "height": 1, + "y": 109.1666669845581, + "width": 1.0049999999999955 + }, + "ref": "e46" + }, + { + "type": "StaticText", + "rect": { + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 53.00001525878906 + }, + "parentIndex": 32, + "hittable": false, + "depth": 28, + "index": 46, + "label": "dev-new", + "enabled": true, + "ref": "e47" + }, + { + "enabled": true, + "hittable": false, + "index": 47, + "rect": { + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581, + "width": 53.00001525878906 + }, + "label": "dev-new", + "parentIndex": 46, + "depth": 29, + "type": "StaticText", + "ref": "e48" + }, + { + "label": "Workspace actions", + "parentIndex": 31, + "identifier": "workspace-header-menu-trigger", + "type": "Button", + "hittable": false, + "enabled": true, + "depth": 27, + "index": 48, + "rect": { + "x": 330, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "ref": "e49" + }, + { + "parentIndex": 28, + "type": "Button", + "rect": { + "x": 362, + "height": 32, + "y": 81.6666669845581, + "width": 32 + }, + "identifier": "workspace-explorer-toggle", + "label": "Open Explorer sidebar", + "hittable": false, + "index": 49, + "enabled": true, + "depth": 26, + "ref": "e50" + }, + { + "depth": 25, + "parentIndex": 27, + "index": 50, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "enabled": true, + "ref": "e51" + }, + { + "index": 51, + "depth": 25, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "parentIndex": 27, + "hittable": false, + "enabled": true, + "ref": "e52" + }, + { + "index": 52, + "depth": 25, + "enabled": true, + "parentIndex": 27, + "rect": { + "x": 0, + "height": 34, + "y": 126, + "width": 402 + }, + "label": "Switch tabs (2 open)", + "identifier": "workspace-tab-switcher-trigger", + "type": "Button", + "hittable": false, + "ref": "e53" + }, + { + "rect": { + "x": 20, + "height": 14, + "y": 136, + "width": 14 + }, + "enabled": true, + "identifier": "workspace-active-tab-icon", + "type": "Other", + "index": 53, + "hittable": false, + "depth": 26, + "parentIndex": 52, + "ref": "e54" + }, + { + "identifier": "workspace-tabs-row", + "parentIndex": 27, + "enabled": true, + "rect": { + "x": 0, + "height": 35, + "y": 126, + "width": 402 + }, + "type": "Other", + "depth": 25, + "index": 54, + "hittable": false, + "ref": "e55" + }, + { + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "type": "Other", + "enabled": true, + "parentIndex": 27, + "index": 55, + "hittable": false, + "depth": 25, + "ref": "e56" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "index": 56, + "parentIndex": 27, + "depth": 25, + "type": "Other", + "ref": "e57" + }, + { + "type": "Other", + "parentIndex": 56, + "index": 57, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "hittable": false, + "enabled": true, + "depth": 26, + "label": "Import session", + "ref": "e58" + }, + { + "type": "Other", + "parentIndex": 57, + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "depth": 27, + "enabled": true, + "hittable": false, + "index": 58, + "ref": "e59" + }, + { + "type": "Other", + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "index": 59, + "enabled": true, + "parentIndex": 57, + "identifier": "composer-viewport", + "label": "Import session", + "hittable": false, + "depth": 27, + "ref": "e60" + }, + { + "rect": { + "x": 0, + "height": 713, + "y": 161, + "width": 402 + }, + "type": "Other", + "label": "Vertical scroll bar, 1 page", + "parentIndex": 59, + "enabled": true, + "depth": 28, + "hittable": false, + "index": 60, + "ref": "e61" + }, + { + "rect": { + "x": 0, + "height": 307, + "y": 161, + "width": 402 + }, + "enabled": true, + "identifier": "composer-dock-content", + "type": "Other", + "depth": 29, + "hittable": false, + "index": 61, + "label": "Vertical scroll bar, 1 page", + "parentIndex": 60, + "ref": "e62" + }, + { + "hittable": false, + "rect": { + "x": 0, + "height": 307, + "y": 161, + "width": 402 + }, + "enabled": true, + "depth": 30, + "index": 62, + "type": "Other", + "parentIndex": 61, + "ref": "e63" + }, + { + "hittable": false, + "depth": 30, + "parentIndex": 61, + "rect": { + "x": 0, + "height": 307, + "y": 161, + "width": 402 + }, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "index": 63, + "type": "Other", + "ref": "e64" + }, + { + "depth": 31, + "hittable": false, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "rect": { + "x": 0, + "height": 307, + "y": 161, + "width": 402 + }, + "type": "ScrollView", + "parentIndex": 63, + "index": 64, + "ref": "e65" + }, + { + "rect": { + "x": 0, + "height": 40, + "y": 161, + "width": 402 + }, + "index": 65, + "parentIndex": 64, + "hittable": false, + "enabled": true, + "type": "Other", + "depth": 32, + "ref": "e66" + }, + { + "index": 66, + "type": "Other", + "rect": { + "x": 0, + "height": 40, + "y": 161, + "width": 402 + }, + "hittable": false, + "depth": 33, + "parentIndex": 65, + "enabled": true, + "ref": "e67" + }, + { + "label": "Vertical scroll bar, 1 page", + "value": "0%", + "type": "Other", + "parentIndex": 64, + "enabled": true, + "index": 67, + "depth": 32, + "hittable": false, + "rect": { + "x": 369, + "height": 307, + "y": 161, + "width": 30 + }, + "ref": "e68" + }, + { + "enabled": true, + "depth": 33, + "index": 68, + "type": "Other", + "rect": { + "x": 396, + "height": 53, + "y": 164, + "width": 3 + }, + "hittable": false, + "parentIndex": 67, + "ref": "e69" + }, + { + "depth": 32, + "parentIndex": 64, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "x": 0, + "height": 30, + "y": 435, + "width": 402 + }, + "hittable": false, + "value": "0%", + "enabled": true, + "index": 69, + "ref": "e70" + }, + { + "enabled": true, + "type": "Other", + "index": 70, + "rect": { + "x": 3, + "height": 3, + "y": 462, + "width": 393 + }, + "depth": 33, + "parentIndex": 69, + "hittable": false, + "ref": "e71" + }, + { + "enabled": true, + "rect": { + "x": 369, + "height": 307, + "y": 161, + "width": 30 + }, + "index": 71, + "hittable": false, + "value": "0%", + "depth": 32, + "type": "Other", + "parentIndex": 64, + "label": "Vertical scroll bar, 1 page", + "ref": "e72" + }, + { + "depth": 33, + "parentIndex": 71, + "index": 72, + "hittable": false, + "rect": { + "x": 396, + "height": 53, + "y": 164, + "width": 3 + }, + "enabled": true, + "type": "Other", + "ref": "e73" + }, + { + "depth": 32, + "type": "Other", + "parentIndex": 64, + "index": 73, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "enabled": true, + "rect": { + "x": 0, + "height": 30, + "y": 435, + "width": 402 + }, + "ref": "e74" + }, + { + "index": 74, + "rect": { + "x": 3, + "height": 3, + "y": 462, + "width": 393 + }, + "depth": 33, + "hittable": false, + "enabled": true, + "type": "Other", + "parentIndex": 73, + "ref": "e75" + }, + { + "enabled": true, + "type": "Other", + "label": "Import session", + "parentIndex": 60, + "rect": { + "x": 0, + "height": 406, + "y": 468, + "width": 402 + }, + "depth": 29, + "index": 75, + "identifier": "composer-viewport-content", + "hittable": false, + "ref": "e76" + }, + { + "hittable": false, + "identifier": "composer-import-agent-pill", + "type": "Button", + "enabled": true, + "label": "Import session", + "index": 76, + "rect": { + "x": 16, + "height": 32, + "y": 476, + "width": 137 + }, + "depth": 30, + "parentIndex": 75, + "ref": "e77" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "parentIndex": 76, + "rect": { + "x": 51, + "height": 15.66668701171875, + "y": 484, + "width": 89 + }, + "depth": 31, + "label": "Import session", + "index": 77, + "ref": "e78" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "x": 51, + "height": 15.66668701171875, + "y": 484, + "width": 89 + }, + "index": 78, + "type": "StaticText", + "label": "Import session", + "parentIndex": 77, + "depth": 32, + "ref": "e79" + }, + { + "rect": { + "x": 16, + "height": 308, + "y": 516, + "width": 370 + }, + "enabled": true, + "type": "Other", + "identifier": "message-input-root", + "parentIndex": 75, + "index": 79, + "hittable": false, + "depth": 30, + "ref": "e80" + }, + { + "rect": { + "x": 16, + "height": 308, + "y": 516, + "width": 370 + }, + "hittable": false, + "depth": 30, + "parentIndex": 75, + "enabled": true, + "type": "Other", + "index": 80, + "ref": "e81" + }, + { + "type": "Other", + "depth": 30, + "enabled": true, + "parentIndex": 75, + "index": 81, + "hittable": false, + "rect": { + "x": 29, + "height": 250, + "y": 525, + "width": 344 + }, + "label": "Message agent...", + "ref": "e82" + }, + { + "enabled": true, + "label": "Message agent...", + "index": 82, + "type": "TextView", + "parentIndex": 81, + "rect": { + "x": 29, + "height": 250, + "y": 525, + "width": 344 + }, + "hittable": false, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "depth": 31, + "ref": "e83" + }, + { + "parentIndex": 82, + "index": 83, + "enabled": true, + "type": "Other", + "depth": 32, + "label": "Vertical scroll bar, 2 pages", + "hittable": false, + "value": "100%", + "rect": { + "x": 340, + "height": 250, + "y": 525, + "width": 30 + }, + "ref": "e84" + }, + { + "hittable": false, + "index": 84, + "enabled": true, + "type": "Other", + "rect": { + "x": 367, + "height": 157.66666666666663, + "y": 614.3333333333334, + "width": 3 + }, + "depth": 33, + "parentIndex": 83, + "ref": "e85" + }, + { + "value": "0%", + "index": 85, + "hittable": false, + "depth": 32, + "type": "Other", + "parentIndex": 82, + "label": "Horizontal scroll bar, 1 page", + "rect": { + "x": 29, + "height": 30, + "y": 742, + "width": 344 + }, + "enabled": true, + "ref": "e86" + }, + { + "enabled": true, + "index": 86, + "depth": 33, + "rect": { + "x": 32, + "height": 3, + "y": 769, + "width": 335 + }, + "type": "Other", + "hittable": false, + "parentIndex": 85, + "ref": "e87" + }, + { + "type": "Button", + "index": 87, + "enabled": true, + "identifier": "message-input-attach-button", + "hittable": false, + "depth": 30, + "rect": { + "x": 23, + "height": 28, + "y": 787, + "width": 28 + }, + "label": "Add attachment", + "parentIndex": 75, + "ref": "e88" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "x": 23, + "height": 28, + "y": 787, + "width": 28 + }, + "hittable": false, + "depth": 31, + "index": 88, + "parentIndex": 87, + "ref": "e89" + }, + { + "enabled": true, + "type": "Other", + "depth": 32, + "hittable": false, + "index": 89, + "parentIndex": 88, + "rect": { + "x": 27, + "height": 20, + "y": 791, + "width": 20 + }, + "ref": "e90" + }, + { + "rect": { + "x": 30.333333333333332, + "height": 13.333333333333258, + "y": 794.3333333333334, + "width": 13.333333333333332 + }, + "depth": 33, + "enabled": true, + "index": 90, + "parentIndex": 89, + "type": "Other", + "hittable": false, + "ref": "e91" + }, + { + "parentIndex": 90, + "rect": { + "x": 30.333333333333332, + "height": 1.6666666666666288, + "y": 800.1666666666667, + "width": 13.333333333333332 + }, + "depth": 34, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 91, + "ref": "e92" + }, + { + "rect": { + "x": 36.16666666666667, + "height": 13.333333333333371, + "y": 794.3333333333333, + "width": 1.6666666666666643 + }, + "type": "Other", + "parentIndex": 90, + "index": 92, + "hittable": false, + "depth": 34, + "enabled": true, + "ref": "e93" + }, + { + "parentIndex": 75, + "type": "Other", + "index": 93, + "depth": 30, + "enabled": true, + "hittable": false, + "rect": { + "x": 51, + "height": 28, + "y": 787, + "width": 264 + }, + "label": "Select model (Select model)", + "ref": "e94" + }, + { + "rect": { + "x": 51, + "height": 28, + "y": 787, + "width": 105.66667175292969 + }, + "hittable": false, + "enabled": true, + "identifier": "combined-model-selector", + "depth": 31, + "label": "Select model (Select model)", + "index": 94, + "type": "Button", + "parentIndex": 93, + "ref": "e95" + }, + { + "label": "Start dictation", + "hittable": false, + "enabled": true, + "index": 95, + "type": "Button", + "depth": 30, + "parentIndex": 75, + "rect": { + "x": 315, + "height": 28, + "y": 787, + "width": 28 + }, + "ref": "e96" + }, + { + "rect": { + "x": 351, + "height": 28, + "y": 787, + "width": 28 + }, + "depth": 30, + "parentIndex": 75, + "enabled": true, + "type": "Button", + "label": "Send message", + "index": 96, + "hittable": false, + "ref": "e97" + }, + { + "hittable": false, + "index": 97, + "type": "Other", + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "depth": 11, + "ref": "e98" + }, + { + "depth": 7, + "type": "Other", + "hittable": false, + "index": 98, + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "parentIndex": 6, + "ref": "e99" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "depth": 8, + "enabled": true, + "type": "Other", + "parentIndex": 98, + "index": 99, + "ref": "e100" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "type": "Other", + "depth": 9, + "parentIndex": 99, + "index": 100, + "ref": "e101" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Window", + "depth": 1, + "hittable": false, + "index": 101, + "parentIndex": 0, + "enabled": true, + "ref": "e102" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 101, + "index": 102, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "depth": 2, + "ref": "e103" + }, + { + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "index": 103, + "depth": 3, + "hittable": false, + "parentIndex": 102, + "enabled": true, + "ref": "e104" + }, + { + "depth": 3, + "type": "Other", + "enabled": true, + "index": 104, + "hittable": false, + "rect": { + "x": 0, + "height": 336, + "y": 874, + "width": 402 + }, + "parentIndex": 102, + "ref": "e105" + }, + { + "index": 105, + "type": "Other", + "rect": { + "x": 0, + "height": 278, + "y": 874, + "width": 402 + }, + "enabled": true, + "depth": 4, + "hittable": false, + "parentIndex": 104, + "ref": "e106" + }, + { + "hittable": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "label": "Emoji", + "enabled": true, + "parentIndex": 0, + "index": 106, + "depth": 1, + "type": "Window", + "ref": "e107" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "type": "Other", + "label": "Emoji", + "index": 107, + "depth": 2, + "parentIndex": 106, + "hittable": true, + "ref": "e108" + }, + { + "enabled": true, + "hittable": false, + "depth": 3, + "rect": { + "x": 0, + "height": 336, + "y": 874, + "width": 402 + }, + "type": "Other", + "label": "Emoji", + "index": 108, + "parentIndex": 107, + "ref": "e109" + }, + { + "type": "Other", + "enabled": true, + "parentIndex": 108, + "depth": 4, + "index": 109, + "hittable": false, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "ref": "e110" + }, + { + "parentIndex": 109, + "type": "Other", + "depth": 5, + "enabled": true, + "hittable": false, + "index": 110, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "ref": "e111" + }, + { + "depth": 6, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "parentIndex": 110, + "index": 111, + "hittable": false, + "enabled": true, + "type": "Other", + "ref": "e112" + }, + { + "hittable": false, + "depth": 4, + "parentIndex": 108, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "index": 112, + "identifier": "SystemInputAssistantView", + "enabled": true, + "label": "Typing Predictions", + "type": "Other", + "ref": "e113" + }, + { + "depth": 5, + "hittable": false, + "parentIndex": 112, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "label": "Typing Predictions", + "enabled": true, + "index": 113, + "type": "Other", + "ref": "e114" + }, + { + "identifier": "CenterPageView", + "hittable": false, + "enabled": true, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "depth": 6, + "index": 114, + "parentIndex": 113, + "type": "Other", + "label": "Typing Predictions", + "ref": "e115" + }, + { + "rect": { + "x": 0, + "height": 1245, + "y": 274, + "width": 402 + }, + "depth": 7, + "type": "Other", + "index": 115, + "parentIndex": 114, + "enabled": true, + "hittable": false, + "ref": "e116" + }, + { + "depth": 8, + "type": "ScrollView", + "index": 116, + "enabled": true, + "hittable": false, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "parentIndex": 115, + "ref": "e117" + }, + { + "enabled": true, + "label": "Typing Predictions", + "type": "Other", + "hittable": false, + "index": 117, + "depth": 7, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "parentIndex": 114, + "ref": "e118" + }, + { + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "enabled": true, + "parentIndex": 117, + "index": 118, + "type": "Other", + "depth": 8, + "label": "Typing Predictions", + "hittable": false, + "ref": "e119" + }, + { + "parentIndex": 118, + "depth": 9, + "hittable": false, + "enabled": true, + "index": 119, + "type": "Other", + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "ref": "e120" + }, + { + "enabled": true, + "index": 120, + "parentIndex": 119, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 402 + }, + "depth": 10, + "hittable": false, + "type": "Other", + "ref": "e121" + }, + { + "index": 121, + "parentIndex": 120, + "type": "Other", + "hittable": false, + "depth": 11, + "rect": { + "x": 0, + "height": 45, + "y": 874, + "width": 134 + }, + "enabled": true, + "ref": "e122" + }, + { + "hittable": false, + "depth": 11, + "index": 122, + "enabled": true, + "rect": { + "x": 134, + "height": 45, + "y": 874, + "width": 134 + }, + "parentIndex": 120, + "type": "Other", + "ref": "e123" + }, + { + "depth": 11, + "index": 123, + "enabled": true, + "type": "Other", + "parentIndex": 120, + "rect": { + "x": 268, + "height": 45, + "y": 874, + "width": 134 + }, + "hittable": false, + "ref": "e124" + }, + { + "rect": { + "x": 0, + "height": 233, + "y": 919, + "width": 402 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 108, + "depth": 4, + "index": 124, + "ref": "e125" + }, + { + "parentIndex": 124, + "rect": { + "x": 0, + "height": 291, + "y": 919, + "width": 402 + }, + "enabled": true, + "index": 125, + "hittable": false, + "depth": 5, + "type": "Other", + "ref": "e126" + }, + { + "rect": { + "x": 0, + "height": 291, + "y": 919, + "width": 402 + }, + "hittable": false, + "index": 126, + "type": "Other", + "depth": 6, + "parentIndex": 125, + "enabled": true, + "ref": "e127" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 291, + "y": 919, + "width": 402 + }, + "index": 127, + "type": "Other", + "parentIndex": 126, + "hittable": false, + "depth": 7, + "ref": "e128" + }, + { + "rect": { + "x": 0, + "height": 233, + "y": 919, + "width": 402 + }, + "index": 128, + "hittable": false, + "depth": 4, + "parentIndex": 108, + "enabled": true, + "label": "q", + "type": "Other", + "ref": "e129" + }, + { + "index": 129, + "rect": { + "x": 0, + "height": 233, + "y": 919, + "width": 402 + }, + "depth": 5, + "parentIndex": 128, + "hittable": false, + "enabled": true, + "type": "Keyboard", + "label": "q", + "ref": "e130" + }, + { + "enabled": true, + "hittable": false, + "depth": 6, + "parentIndex": 129, + "type": "Other", + "index": 130, + "label": "q", + "rect": { + "x": 0, + "height": 233, + "y": 919, + "width": 402 + }, + "ref": "e131" + }, + { + "enabled": true, + "rect": { + "x": 0, + "height": 233, + "y": 919, + "width": 402 + }, + "label": "q", + "parentIndex": 130, + "index": 131, + "type": "Other", + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "hittable": false, + "ref": "e132" + }, + { + "index": 132, + "enabled": true, + "rect": { + "x": 0, + "height": 46, + "y": 926, + "width": 40.333333333333336 + }, + "type": "Key", + "depth": 8, + "hittable": false, + "label": "q", + "parentIndex": 131, + "ref": "e133" + }, + { + "parentIndex": 131, + "depth": 8, + "enabled": true, + "type": "Key", + "hittable": false, + "rect": { + "x": 40.333333333333336, + "height": 46, + "y": 926, + "width": 40.00000000000001 + }, + "index": 133, + "label": "w", + "ref": "e134" + }, + { + "type": "Key", + "label": "e", + "rect": { + "x": 80.33333333333334, + "height": 46, + "y": 926, + "width": 40.33333333333334 + }, + "depth": 8, + "enabled": true, + "index": 134, + "hittable": false, + "parentIndex": 131, + "ref": "e135" + }, + { + "type": "Key", + "parentIndex": 131, + "depth": 8, + "rect": { + "x": 120.66666666666669, + "height": 46, + "y": 926, + "width": 40 + }, + "index": 135, + "hittable": false, + "enabled": true, + "label": "r", + "ref": "e136" + }, + { + "enabled": true, + "rect": { + "x": 160.66666666666669, + "height": 46, + "y": 926, + "width": 40.33333333333334 + }, + "index": 136, + "hittable": false, + "parentIndex": 131, + "type": "Key", + "depth": 8, + "label": "t", + "ref": "e137" + }, + { + "hittable": false, + "label": "y", + "index": 137, + "depth": 8, + "enabled": true, + "type": "Key", + "rect": { + "x": 201.00000000000003, + "height": 46, + "y": 926, + "width": 40.33333333333334 + }, + "parentIndex": 131, + "ref": "e138" + }, + { + "rect": { + "x": 241.33333333333337, + "height": 46, + "y": 926, + "width": 40 + }, + "type": "Key", + "index": 138, + "label": "u", + "hittable": false, + "parentIndex": 131, + "enabled": true, + "depth": 8, + "ref": "e139" + }, + { + "enabled": true, + "label": "i", + "depth": 8, + "index": 139, + "hittable": false, + "rect": { + "x": 281.33333333333337, + "height": 46, + "y": 926, + "width": 40.333333333333314 + }, + "type": "Key", + "parentIndex": 131, + "ref": "e140" + }, + { + "label": "o", + "parentIndex": 131, + "depth": 8, + "enabled": true, + "hittable": false, + "index": 140, + "type": "Key", + "rect": { + "x": 321.6666666666667, + "height": 46, + "y": 926, + "width": 40 + }, + "ref": "e141" + }, + { + "enabled": true, + "rect": { + "x": 361.6666666666667, + "height": 46, + "y": 926, + "width": 40.333333333333314 + }, + "depth": 8, + "label": "p", + "parentIndex": 131, + "type": "Key", + "hittable": false, + "index": 141, + "ref": "e142" + }, + { + "rect": { + "x": 19.666666666666668, + "height": 46, + "y": 980, + "width": 40.33333333333333 + }, + "index": 142, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "a", + "parentIndex": 131, + "hittable": false, + "ref": "e143" + }, + { + "parentIndex": 131, + "hittable": false, + "label": "s", + "rect": { + "x": 60, + "height": 46, + "y": 980, + "width": 40.33333333333334 + }, + "index": 143, + "enabled": true, + "depth": 8, + "type": "Key", + "ref": "e144" + }, + { + "parentIndex": 131, + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 980, + "width": 40 + }, + "index": 144, + "enabled": true, + "label": "d", + "type": "Key", + "depth": 8, + "hittable": false, + "ref": "e145" + }, + { + "hittable": false, + "rect": { + "x": 140.33333333333334, + "height": 46, + "y": 980, + "width": 40.33333333333334 + }, + "label": "f", + "type": "Key", + "parentIndex": 131, + "index": 145, + "depth": 8, + "enabled": true, + "ref": "e146" + }, + { + "label": "g", + "enabled": true, + "index": 146, + "hittable": false, + "parentIndex": 131, + "type": "Key", + "rect": { + "x": 181.2026666666667, + "height": 46, + "y": 980, + "width": 40 + }, + "depth": 8, + "ref": "e147" + }, + { + "rect": { + "x": 221.2026666666667, + "height": 46, + "y": 980, + "width": 40.333333333333314 + }, + "enabled": true, + "type": "Key", + "label": "h", + "parentIndex": 131, + "depth": 8, + "hittable": false, + "index": 147, + "ref": "e148" + }, + { + "index": 148, + "rect": { + "x": 261.536, + "height": 46, + "y": 980, + "width": 40 + }, + "type": "Key", + "hittable": false, + "depth": 8, + "parentIndex": 131, + "label": "j", + "enabled": true, + "ref": "e149" + }, + { + "enabled": true, + "hittable": false, + "index": 149, + "label": "k", + "type": "Key", + "parentIndex": 131, + "depth": 8, + "rect": { + "x": 301.536, + "height": 46, + "y": 980, + "width": 40.333333333333314 + }, + "ref": "e150" + }, + { + "label": "l", + "rect": { + "x": 341.8693333333333, + "height": 46, + "y": 980, + "width": 40.333333333333314 + }, + "type": "Key", + "parentIndex": 131, + "hittable": false, + "enabled": true, + "depth": 8, + "index": 150, + "ref": "e151" + }, + { + "depth": 8, + "rect": { + "x": 0, + "height": 46, + "y": 1034, + "width": 51.333333333333336 + }, + "type": "Button", + "hittable": false, + "index": 151, + "identifier": "shift", + "parentIndex": 131, + "enabled": true, + "label": "shift", + "ref": "e152" + }, + { + "index": 152, + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 131, + "rect": { + "x": 60, + "height": 46, + "y": 1034, + "width": 40.33333333333334 + }, + "type": "Key", + "label": "z", + "ref": "e153" + }, + { + "parentIndex": 131, + "index": 153, + "enabled": true, + "depth": 8, + "hittable": false, + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 1034, + "width": 40 + }, + "type": "Key", + "label": "x", + "ref": "e154" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "type": "Key", + "rect": { + "x": 140.33333333333334, + "height": 46, + "y": 1034, + "width": 40.33333333333334 + }, + "parentIndex": 131, + "label": "c", + "index": 154, + "ref": "e155" + }, + { + "label": "v", + "index": 155, + "depth": 8, + "parentIndex": 131, + "rect": { + "x": 181.2026666666667, + "height": 46, + "y": 1034, + "width": 40 + }, + "hittable": false, + "enabled": true, + "type": "Key", + "ref": "e156" + }, + { + "parentIndex": 131, + "type": "Key", + "hittable": false, + "rect": { + "x": 221.2026666666667, + "height": 46, + "y": 1034, + "width": 40.333333333333314 + }, + "index": 156, + "enabled": true, + "depth": 8, + "label": "b", + "ref": "e157" + }, + { + "type": "Key", + "label": "n", + "index": 157, + "enabled": true, + "hittable": false, + "rect": { + "x": 261.536, + "height": 46, + "y": 1034, + "width": 40 + }, + "depth": 8, + "parentIndex": 131, + "ref": "e158" + }, + { + "hittable": false, + "index": 158, + "parentIndex": 131, + "label": "m", + "enabled": true, + "rect": { + "x": 301.536, + "height": 46, + "y": 1034, + "width": 40.333333333333314 + }, + "type": "Key", + "depth": 8, + "ref": "e159" + }, + { + "rect": { + "x": 350.42133333333334, + "height": 46, + "y": 1034, + "width": 51.333333333333314 + }, + "identifier": "delete", + "parentIndex": 131, + "index": 159, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "delete", + "hittable": false, + "ref": "e160" + }, + { + "enabled": true, + "depth": 8, + "type": "Key", + "hittable": false, + "index": 160, + "label": "numbers", + "rect": { + "x": 0, + "height": 46, + "y": 1088, + "width": 101 + }, + "identifier": "more", + "parentIndex": 131, + "ref": "e161" + }, + { + "rect": { + "x": 100.33333333333334, + "height": 46, + "y": 1088, + "width": 201.33333333333334 + }, + "enabled": true, + "type": "Key", + "index": 161, + "hittable": false, + "parentIndex": 131, + "identifier": "space", + "label": "space", + "depth": 8, + "ref": "e162" + }, + { + "index": 162, + "rect": { + "x": 301.6666666666667, + "height": 46, + "y": 1088, + "width": 100.33333333333331 + }, + "parentIndex": 131, + "identifier": "Return", + "label": "return", + "type": "Button", + "enabled": true, + "hittable": false, + "depth": 8, + "ref": "e163" + }, + { + "label": "Emoji", + "depth": 4, + "index": 163, + "enabled": true, + "rect": { + "x": 0, + "height": 291, + "y": 919, + "width": 402 + }, + "type": "Other", + "hittable": false, + "parentIndex": 108, + "ref": "e164" + }, + { + "type": "Button", + "label": "Emoji", + "hittable": false, + "enabled": true, + "depth": 5, + "parentIndex": 163, + "rect": { + "x": 8.47726568115926, + "height": 68.73516393505088, + "y": 1141.6989567998571, + "width": 68.0852958475086 + }, + "index": 164, + "ref": "e165" + }, + { + "depth": 6, + "parentIndex": 164, + "hittable": false, + "index": 165, + "enabled": true, + "rect": { + "x": 8.47726568115926, + "height": 0, + "y": 1141.6989567998571, + "width": 0 + }, + "type": "StaticText", + "ref": "e166" + }, + { + "index": 166, + "type": "Button", + "identifier": "dictation", + "label": "Dictate", + "enabled": true, + "rect": { + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239, + "width": 68.08529584750863 + }, + "hittable": false, + "depth": 5, + "parentIndex": 163, + "ref": "e167" + }, + { + "parentIndex": 166, + "index": 167, + "enabled": true, + "depth": 6, + "rect": { + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239, + "width": 0 + }, + "hittable": false, + "type": "StaticText", + "ref": "e168" + }, + { + "depth": 5, + "parentIndex": 163, + "index": 168, + "enabled": true, + "type": "Button", + "label": "Dictate", + "hittable": false, + "identifier": "dictation", + "rect": { + "x": 325.43743847133214, + "height": 68.7351639350511, + "y": 1141.3656234665239, + "width": 68.08529584750863 + }, + "ref": "e169" + }, + { + "parentIndex": 168, + "index": 169, + "hittable": false, + "enabled": true, + "type": "StaticText", + "depth": 6, + "rect": { + "x": 325.43743847133214, + "height": 0, + "y": 1141.3656234665239, + "width": 0 + }, + "ref": "e170" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 170, + "totalNodeCount": 170, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 87, + "p50Ms": 148, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 87 + } + } + }, + "refsGeneration": 776151 + } +} diff --git a/scroll-regression/ios/workspace-draft-header-dismissed.png b/scroll-regression/ios/workspace-draft-header-dismissed.png new file mode 100644 index 0000000000..892c617696 Binary files /dev/null and b/scroll-regression/ios/workspace-draft-header-dismissed.png differ diff --git a/scroll-regression/ios/workspace-draft-reopened.json b/scroll-regression/ios/workspace-draft-reopened.json new file mode 100644 index 0000000000..d4f90eccd0 --- /dev/null +++ b/scroll-regression/ios/workspace-draft-reopened.json @@ -0,0 +1,2714 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "label": "Paseo Debug", + "enabled": true, + "index": 0, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Application", + "depth": 0, + "hittable": true, + "ref": "e1" + }, + { + "parentIndex": 0, + "hittable": false, + "rect": { + "x": 0, + "y": 0, + "width": 402, + "height": 874 + }, + "type": "Window", + "enabled": true, + "index": 1, + "depth": 1, + "ref": "e2" + }, + { + "depth": 2, + "type": "Other", + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "parentIndex": 1, + "enabled": true, + "hittable": false, + "index": 2, + "ref": "e3" + }, + { + "depth": 3, + "rect": { + "y": 0, + "height": 874, + "width": 402, + "x": 0 + }, + "index": 3, + "enabled": true, + "type": "Other", + "parentIndex": 2, + "hittable": false, + "ref": "e4" + }, + { + "index": 4, + "depth": 4, + "enabled": true, + "parentIndex": 3, + "type": "Other", + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "hittable": false, + "ref": "e5" + }, + { + "enabled": true, + "parentIndex": 4, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "index": 5, + "depth": 5, + "hittable": false, + "type": "Other", + "ref": "e6" + }, + { + "depth": 6, + "enabled": true, + "parentIndex": 5, + "hittable": false, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "type": "Other", + "index": 6, + "ref": "e7" + }, + { + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "type": "Other", + "depth": 7, + "enabled": true, + "parentIndex": 6, + "index": 7, + "ref": "e8" + }, + { + "index": 8, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 7, + "type": "Other", + "depth": 8, + "enabled": true, + "ref": "e9" + }, + { + "index": 9, + "enabled": true, + "parentIndex": 8, + "type": "Other", + "depth": 9, + "hittable": false, + "rect": { + "y": 0, + "width": 402, + "x": 0, + "height": 874 + }, + "ref": "e10" + }, + { + "depth": 9, + "rect": { + "width": 402, + "x": 0, + "y": 0, + "height": 874 + }, + "enabled": true, + "type": "Other", + "hittable": false, + "parentIndex": 8, + "index": 10, + "ref": "e11" + }, + { + "parentIndex": 10, + "rect": { + "x": 0, + "width": 402, + "y": 0, + "height": 874 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "index": 11, + "depth": 10, + "ref": "e12" + }, + { + "parentIndex": 10, + "enabled": true, + "hittable": false, + "depth": 10, + "type": "Other", + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "index": 12, + "ref": "e13" + }, + { + "rect": { + "height": 874, + "width": 402, + "x": 0, + "y": 0 + }, + "depth": 11, + "index": 13, + "enabled": true, + "parentIndex": 12, + "type": "Other", + "hittable": false, + "ref": "e14" + }, + { + "enabled": true, + "hittable": false, + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "parentIndex": 12, + "depth": 11, + "type": "Other", + "index": 14, + "ref": "e15" + }, + { + "index": 15, + "rect": { + "x": 0, + "height": 874, + "width": 402, + "y": 0 + }, + "enabled": true, + "depth": 12, + "type": "Other", + "parentIndex": 14, + "hittable": false, + "ref": "e16" + }, + { + "parentIndex": 15, + "rect": { + "y": 0, + "height": 874, + "x": 0, + "width": 402 + }, + "index": 16, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 13, + "ref": "e17" + }, + { + "index": 17, + "hittable": false, + "depth": 14, + "rect": { + "y": 0, + "x": 0, + "height": 874, + "width": 402 + }, + "type": "Other", + "parentIndex": 16, + "enabled": true, + "ref": "e18" + }, + { + "index": 18, + "rect": { + "x": 0, + "height": 874, + "y": 0, + "width": 402 + }, + "hittable": false, + "parentIndex": 17, + "type": "Other", + "enabled": true, + "depth": 15, + "ref": "e19" + }, + { + "parentIndex": 18, + "rect": { + "x": 0, + "width": 402, + "height": 874, + "y": 0 + }, + "hittable": false, + "depth": 16, + "type": "Other", + "index": 19, + "enabled": true, + "ref": "e20" + }, + { + "index": 20, + "hittable": false, + "depth": 17, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "type": "Other", + "enabled": true, + "parentIndex": 19, + "ref": "e21" + }, + { + "rect": { + "width": 402, + "y": 0, + "height": 874, + "x": 0 + }, + "type": "Other", + "hittable": false, + "enabled": true, + "depth": 18, + "index": 21, + "parentIndex": 20, + "ref": "e22" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 21, + "enabled": true, + "depth": 19, + "index": 22, + "hittable": false, + "ref": "e23" + }, + { + "depth": 20, + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 23, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 22, + "ref": "e24" + }, + { + "index": 24, + "label": "Switch tabs (2 open)", + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 23, + "hittable": false, + "depth": 21, + "enabled": true, + "ref": "e25" + }, + { + "index": 25, + "depth": 22, + "type": "Other", + "hittable": false, + "label": "Open menu", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "enabled": true, + "parentIndex": 24, + "ref": "e26" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "parentIndex": 25, + "label": "Open menu", + "depth": 23, + "hittable": false, + "enabled": true, + "index": 26, + "ref": "e27" + }, + { + "type": "Other", + "hittable": false, + "depth": 24, + "parentIndex": 26, + "label": "Open menu", + "rect": { + "width": 402, + "height": 874, + "x": 0, + "y": 0 + }, + "index": 27, + "enabled": true, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "ref": "e28" + }, + { + "rect": { + "width": 402, + "height": 126, + "x": 0, + "y": 0 + }, + "enabled": true, + "identifier": "composer-dock-header", + "label": "Open menu", + "parentIndex": 27, + "depth": 25, + "type": "Other", + "hittable": false, + "index": 28, + "ref": "e29" + }, + { + "depth": 26, + "rect": { + "width": 402, + "height": 56, + "x": 0, + "y": 70 + }, + "parentIndex": 28, + "enabled": true, + "type": "Other", + "index": 29, + "hittable": false, + "ref": "e30" + }, + { + "index": 30, + "type": "Button", + "enabled": true, + "label": "Open menu", + "hittable": false, + "depth": 26, + "parentIndex": 28, + "identifier": "menu-button", + "rect": { + "width": 32, + "height": 32, + "x": 8, + "y": 81.6666669845581 + }, + "ref": "e31" + }, + { + "enabled": true, + "type": "Other", + "depth": 26, + "parentIndex": 28, + "label": "main", + "index": 31, + "hittable": false, + "rect": { + "width": 314, + "height": 34, + "x": 48, + "y": 80.6666669845581 + }, + "ref": "e32" + }, + { + "parentIndex": 31, + "depth": 27, + "enabled": true, + "hittable": false, + "index": 32, + "rect": { + "width": 278, + "height": 34, + "x": 48, + "y": 80.6666669845581 + }, + "label": "main", + "type": "Other", + "ref": "e33" + }, + { + "enabled": true, + "type": "StaticText", + "identifier": "workspace-header-title", + "rect": { + "x": 48, + "y": 80.6666669845581, + "width": 278, + "height": 18 + }, + "label": "main", + "hittable": false, + "index": 33, + "depth": 28, + "parentIndex": 32, + "ref": "e34" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 278, + "x": 48, + "height": 18, + "y": 80.6666669845581 + }, + "hittable": false, + "label": "main", + "index": 34, + "depth": 29, + "parentIndex": 33, + "ref": "e35" + }, + { + "enabled": true, + "type": "StaticText", + "identifier": "workspace-header-subtitle", + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "label": "composer-dock-ios-fixture", + "hittable": false, + "index": 35, + "depth": 28, + "parentIndex": 32, + "ref": "e36" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 163.3333282470703, + "x": 48, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "hittable": false, + "label": "composer-dock-ios-fixture", + "index": 36, + "depth": 29, + "parentIndex": 35, + "ref": "e37" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "hittable": false, + "label": "·", + "index": 37, + "depth": 28, + "parentIndex": 32, + "ref": "e38" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 4, + "x": 217.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581 + }, + "hittable": false, + "label": "·", + "index": 38, + "depth": 29, + "parentIndex": 37, + "ref": "e39" + }, + { + "enabled": true, + "type": "Other", + "identifier": "host-badge-srv_tk5MNmAhneJU", + "rect": { + "width": 68.00001525878906, + "x": 227.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "label": "dev-new", + "hittable": false, + "index": 39, + "depth": 28, + "parentIndex": 32, + "ref": "e40" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 12, + "x": 227.3333282470703, + "height": 12, + "y": 100.6666669845581 + }, + "hittable": false, + "index": 40, + "depth": 28, + "parentIndex": 32, + "ref": "e41" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 11, + "y": 101.1666669845581 + }, + "hittable": false, + "index": 41, + "depth": 29, + "parentIndex": 40, + "ref": "e42" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 101.1666669845581 + }, + "hittable": false, + "index": 42, + "depth": 30, + "parentIndex": 41, + "ref": "e43" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 11, + "x": 227.8333282470703, + "height": 5, + "y": 107.1666669845581 + }, + "hittable": false, + "index": 43, + "depth": 30, + "parentIndex": 41, + "ref": "e44" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 103.1666669845581 + }, + "hittable": false, + "index": 44, + "depth": 30, + "parentIndex": 41, + "ref": "e45" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 1.0049999999999955, + "x": 229.8333282470703, + "height": 1, + "y": 109.1666669845581 + }, + "hittable": false, + "index": 45, + "depth": 30, + "parentIndex": 41, + "ref": "e46" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "hittable": false, + "label": "dev-new", + "index": 46, + "depth": 28, + "parentIndex": 32, + "ref": "e47" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 53.00001525878906, + "x": 242.3333282470703, + "height": 16, + "y": 98.6666669845581 + }, + "hittable": false, + "label": "dev-new", + "index": 47, + "depth": 29, + "parentIndex": 46, + "ref": "e48" + }, + { + "enabled": true, + "type": "Button", + "identifier": "workspace-header-menu-trigger", + "rect": { + "width": 32, + "x": 330, + "height": 32, + "y": 81.6666669845581 + }, + "label": "Workspace actions", + "hittable": false, + "index": 48, + "depth": 27, + "parentIndex": 31, + "ref": "e49" + }, + { + "enabled": true, + "type": "Button", + "identifier": "workspace-explorer-toggle", + "rect": { + "width": 32, + "x": 362, + "height": 32, + "y": 81.6666669845581 + }, + "label": "Open Explorer sidebar", + "hittable": false, + "index": 49, + "depth": 26, + "parentIndex": 28, + "ref": "e50" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 50, + "depth": 25, + "parentIndex": 27, + "ref": "e51" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 51, + "depth": 25, + "parentIndex": 27, + "ref": "e52" + }, + { + "enabled": true, + "type": "Button", + "identifier": "workspace-tab-switcher-trigger", + "rect": { + "width": 402, + "x": 0, + "height": 34, + "y": 126 + }, + "label": "Switch tabs (2 open)", + "hittable": false, + "index": 52, + "depth": 25, + "parentIndex": 27, + "ref": "e53" + }, + { + "enabled": true, + "type": "Other", + "identifier": "workspace-active-tab-icon", + "rect": { + "width": 14, + "x": 20, + "height": 14, + "y": 136 + }, + "hittable": false, + "index": 53, + "depth": 26, + "parentIndex": 52, + "ref": "e54" + }, + { + "enabled": true, + "type": "Other", + "identifier": "workspace-tabs-row", + "rect": { + "width": 402, + "x": 0, + "height": 35, + "y": 126 + }, + "hittable": false, + "index": 54, + "depth": 25, + "parentIndex": 27, + "ref": "e55" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "index": 55, + "depth": 25, + "parentIndex": 27, + "ref": "e56" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "index": 56, + "depth": 25, + "parentIndex": 27, + "ref": "e57" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "label": "Import session", + "index": 57, + "depth": 26, + "parentIndex": 56, + "ref": "e58" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "hittable": false, + "index": 58, + "depth": 27, + "parentIndex": 57, + "ref": "e59" + }, + { + "enabled": true, + "type": "Other", + "identifier": "composer-viewport", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": 161 + }, + "label": "Import session", + "hittable": false, + "index": 59, + "depth": 27, + "parentIndex": 57, + "ref": "e60" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 713, + "y": -141 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 60, + "depth": 28, + "parentIndex": 59, + "ref": "e61" + }, + { + "enabled": true, + "type": "Other", + "identifier": "composer-dock-content", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "index": 61, + "depth": 29, + "parentIndex": 60, + "ref": "e62" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": -141 + }, + "hittable": false, + "index": 62, + "depth": 30, + "parentIndex": 61, + "ref": "e63" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": -141 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 63, + "depth": 30, + "parentIndex": 61, + "ref": "e64" + }, + { + "enabled": true, + "type": "ScrollView", + "rect": { + "width": 402, + "x": 0, + "height": 307, + "y": -141 + }, + "hittable": false, + "label": "Vertical scroll bar, 1 page", + "index": 64, + "depth": 31, + "parentIndex": 63, + "ref": "e65" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 40, + "y": -141 + }, + "hittable": false, + "index": 65, + "depth": 32, + "parentIndex": 64, + "ref": "e66" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 40, + "y": -141 + }, + "hittable": false, + "index": 66, + "depth": 33, + "parentIndex": 65, + "ref": "e67" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 30, + "x": 369, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 67, + "depth": 32, + "parentIndex": 64, + "ref": "e68" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 3, + "x": 396, + "height": 53, + "y": -138 + }, + "hittable": false, + "index": 68, + "depth": 33, + "parentIndex": 67, + "ref": "e69" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 30, + "y": 133 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 69, + "depth": 32, + "parentIndex": 64, + "ref": "e70" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 393, + "x": 3, + "height": 3, + "y": 160 + }, + "hittable": false, + "index": 70, + "depth": 33, + "parentIndex": 69, + "ref": "e71" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 30, + "x": 369, + "height": 307, + "y": -141 + }, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 71, + "depth": 32, + "parentIndex": 64, + "ref": "e72" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 3, + "x": 396, + "height": 53, + "y": -138 + }, + "hittable": false, + "index": 72, + "depth": 33, + "parentIndex": 71, + "ref": "e73" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 30, + "y": 133 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 73, + "depth": 32, + "parentIndex": 64, + "ref": "e74" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 393, + "x": 3, + "height": 3, + "y": 160 + }, + "hittable": false, + "index": 74, + "depth": 33, + "parentIndex": 73, + "ref": "e75" + }, + { + "enabled": true, + "type": "Other", + "identifier": "composer-viewport-content", + "rect": { + "width": 402, + "x": 0, + "height": 406, + "y": 166 + }, + "label": "Import session", + "hittable": false, + "index": 75, + "depth": 29, + "parentIndex": 60, + "ref": "e76" + }, + { + "enabled": true, + "type": "Button", + "identifier": "composer-import-agent-pill", + "rect": { + "width": 137, + "x": 16, + "height": 32, + "y": 174 + }, + "label": "Import session", + "hittable": false, + "index": 76, + "depth": 30, + "parentIndex": 75, + "ref": "e77" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 89, + "x": 51, + "height": 15.66668701171875, + "y": 182 + }, + "hittable": false, + "label": "Import session", + "index": 77, + "depth": 31, + "parentIndex": 76, + "ref": "e78" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 89, + "x": 51, + "height": 15.66668701171875, + "y": 182 + }, + "hittable": false, + "label": "Import session", + "index": 78, + "depth": 32, + "parentIndex": 77, + "ref": "e79" + }, + { + "enabled": true, + "type": "Other", + "identifier": "message-input-root", + "rect": { + "width": 370, + "x": 16, + "height": 308, + "y": 214 + }, + "hittable": false, + "index": 79, + "depth": 30, + "parentIndex": 75, + "ref": "e80" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 370, + "x": 16, + "height": 308, + "y": 214 + }, + "hittable": false, + "index": 80, + "depth": 30, + "parentIndex": 75, + "ref": "e81" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 344, + "x": 29, + "height": 250, + "y": 223 + }, + "hittable": false, + "label": "Message agent...", + "index": 81, + "depth": 30, + "parentIndex": 75, + "ref": "e82" + }, + { + "enabled": true, + "type": "TextView", + "rect": { + "width": 344, + "x": 29, + "height": 250, + "y": 223 + }, + "label": "Message agent...", + "hittable": false, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "index": 82, + "depth": 31, + "parentIndex": 81, + "ref": "e83" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 30, + "x": 340, + "height": 250, + "y": 223 + }, + "label": "Vertical scroll bar, 2 pages", + "hittable": false, + "value": "100%", + "index": 83, + "depth": 32, + "parentIndex": 82, + "ref": "e84" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 3, + "x": 367, + "height": 157.66666666666663, + "y": 312.33333333333337 + }, + "hittable": false, + "index": 84, + "depth": 33, + "parentIndex": 83, + "ref": "e85" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 344, + "x": 29, + "height": 30, + "y": 440 + }, + "label": "Horizontal scroll bar, 1 page", + "hittable": false, + "value": "0%", + "index": 85, + "depth": 32, + "parentIndex": 82, + "ref": "e86" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 335, + "x": 32, + "height": 3, + "y": 467 + }, + "hittable": false, + "index": 86, + "depth": 33, + "parentIndex": 85, + "ref": "e87" + }, + { + "enabled": true, + "type": "Button", + "identifier": "message-input-attach-button", + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 485 + }, + "label": "Add attachment", + "hittable": false, + "index": 87, + "depth": 30, + "parentIndex": 75, + "ref": "e88" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 28, + "x": 23, + "height": 28, + "y": 485 + }, + "hittable": false, + "index": 88, + "depth": 31, + "parentIndex": 87, + "ref": "e89" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 20, + "x": 27, + "height": 20, + "y": 489 + }, + "hittable": false, + "index": 89, + "depth": 32, + "parentIndex": 88, + "ref": "e90" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 13.333333333333371, + "y": 492.3333333333333 + }, + "hittable": false, + "index": 90, + "depth": 33, + "parentIndex": 89, + "ref": "e91" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 13.333333333333332, + "x": 30.333333333333332, + "height": 1.6666666666666856, + "y": 498.16666666666674 + }, + "hittable": false, + "index": 91, + "depth": 34, + "parentIndex": 90, + "ref": "e92" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 1.6666666666666643, + "x": 36.16666666666667, + "height": 13.333333333333314, + "y": 492.33333333333326 + }, + "hittable": false, + "index": 92, + "depth": 34, + "parentIndex": 90, + "ref": "e93" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 264, + "x": 51, + "height": 28, + "y": 485 + }, + "hittable": false, + "label": "Select model (Select model)", + "index": 93, + "depth": 30, + "parentIndex": 75, + "ref": "e94" + }, + { + "enabled": true, + "type": "Button", + "identifier": "combined-model-selector", + "rect": { + "width": 105.66667175292969, + "x": 51, + "height": 28, + "y": 485 + }, + "label": "Select model (Select model)", + "hittable": false, + "index": 94, + "depth": 31, + "parentIndex": 93, + "ref": "e95" + }, + { + "enabled": true, + "type": "Button", + "rect": { + "width": 28, + "x": 315, + "height": 28, + "y": 485 + }, + "hittable": false, + "label": "Start dictation", + "index": 95, + "depth": 30, + "parentIndex": 75, + "ref": "e96" + }, + { + "enabled": true, + "type": "Button", + "rect": { + "width": 28, + "x": 351, + "height": 28, + "y": 485 + }, + "hittable": false, + "label": "Send message", + "index": 96, + "depth": 30, + "parentIndex": 75, + "ref": "e97" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 97, + "depth": 11, + "parentIndex": 12, + "ref": "e98" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 98, + "depth": 7, + "parentIndex": 6, + "ref": "e99" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 99, + "depth": 8, + "parentIndex": 98, + "ref": "e100" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 100, + "depth": 9, + "parentIndex": 99, + "ref": "e101" + }, + { + "enabled": true, + "type": "Window", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 101, + "depth": 1, + "parentIndex": 0, + "ref": "e102" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 102, + "depth": 2, + "parentIndex": 101, + "ref": "e103" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": false, + "index": 103, + "depth": 3, + "parentIndex": 102, + "ref": "e104" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 538 + }, + "hittable": false, + "index": 104, + "depth": 3, + "parentIndex": 102, + "ref": "e105" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 278, + "y": 538 + }, + "hittable": false, + "index": 105, + "depth": 4, + "parentIndex": 104, + "ref": "e106" + }, + { + "enabled": true, + "type": "Window", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": true, + "label": "Emoji", + "index": 106, + "depth": 1, + "parentIndex": 0, + "ref": "e107" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 874, + "y": 0 + }, + "hittable": true, + "label": "Emoji", + "index": 107, + "depth": 2, + "parentIndex": 106, + "ref": "e108" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 336, + "y": 538 + }, + "hittable": true, + "label": "Emoji", + "index": 108, + "depth": 3, + "parentIndex": 107, + "ref": "e109" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": false, + "index": 109, + "depth": 4, + "parentIndex": 108, + "ref": "e110" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": false, + "index": 110, + "depth": 5, + "parentIndex": 109, + "ref": "e111" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": false, + "index": 111, + "depth": 6, + "parentIndex": 110, + "ref": "e112" + }, + { + "enabled": true, + "type": "Other", + "identifier": "SystemInputAssistantView", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "hittable": true, + "index": 112, + "depth": 4, + "parentIndex": 108, + "ref": "e113" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "Typing Predictions", + "index": 113, + "depth": 5, + "parentIndex": 112, + "ref": "e114" + }, + { + "enabled": true, + "type": "Other", + "identifier": "CenterPageView", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "label": "Typing Predictions", + "hittable": true, + "index": 114, + "depth": 6, + "parentIndex": 113, + "ref": "e115" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 1245, + "y": -62 + }, + "hittable": false, + "index": 115, + "depth": 7, + "parentIndex": 114, + "ref": "e116" + }, + { + "enabled": true, + "type": "ScrollView", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": false, + "index": 116, + "depth": 8, + "parentIndex": 115, + "ref": "e117" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "Typing Predictions", + "index": 117, + "depth": 7, + "parentIndex": 114, + "ref": "e118" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "Typing Predictions", + "index": 118, + "depth": 8, + "parentIndex": 117, + "ref": "e119" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "“fourteen”", + "index": 119, + "depth": 9, + "parentIndex": 118, + "ref": "e120" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "“fourteen”", + "index": 120, + "depth": 10, + "parentIndex": 119, + "ref": "e121" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 134, + "x": 0, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "“fourteen”", + "index": 121, + "depth": 11, + "parentIndex": 120, + "ref": "e122" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 134, + "x": 134, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "fourteenth", + "index": 122, + "depth": 11, + "parentIndex": 120, + "ref": "e123" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 134, + "x": 268, + "height": 45, + "y": 538 + }, + "hittable": true, + "label": "fourteens", + "index": 123, + "depth": 11, + "parentIndex": 120, + "ref": "e124" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 583 + }, + "hittable": false, + "index": 124, + "depth": 4, + "parentIndex": 108, + "ref": "e125" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 583 + }, + "hittable": false, + "index": 125, + "depth": 5, + "parentIndex": 124, + "ref": "e126" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 583 + }, + "hittable": false, + "index": 126, + "depth": 6, + "parentIndex": 125, + "ref": "e127" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 583 + }, + "hittable": false, + "index": 127, + "depth": 7, + "parentIndex": 126, + "ref": "e128" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 583 + }, + "hittable": false, + "label": "q", + "index": 128, + "depth": 4, + "parentIndex": 108, + "ref": "e129" + }, + { + "enabled": true, + "type": "Keyboard", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 583 + }, + "hittable": false, + "label": "q", + "index": 129, + "depth": 5, + "parentIndex": 128, + "ref": "e130" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 583 + }, + "hittable": false, + "label": "q", + "index": 130, + "depth": 6, + "parentIndex": 129, + "ref": "e131" + }, + { + "enabled": true, + "type": "Other", + "identifier": "UIKeyboardLayoutStar Preview", + "rect": { + "width": 402, + "x": 0, + "height": 233, + "y": 583 + }, + "label": "q", + "hittable": false, + "index": 131, + "depth": 7, + "parentIndex": 130, + "ref": "e132" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333336, + "x": 0, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "q", + "index": 132, + "depth": 8, + "parentIndex": 131, + "ref": "e133" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.00000000000001, + "x": 40.333333333333336, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "w", + "index": 133, + "depth": 8, + "parentIndex": 131, + "ref": "e134" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 80.33333333333334, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "e", + "index": 134, + "depth": 8, + "parentIndex": 131, + "ref": "e135" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 120.66666666666669, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "r", + "index": 135, + "depth": 8, + "parentIndex": 131, + "ref": "e136" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 160.66666666666669, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "t", + "index": 136, + "depth": 8, + "parentIndex": 131, + "ref": "e137" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 201.00000000000003, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "y", + "index": 137, + "depth": 8, + "parentIndex": 131, + "ref": "e138" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 241.33333333333337, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "u", + "index": 138, + "depth": 8, + "parentIndex": 131, + "ref": "e139" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 281.33333333333337, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "i", + "index": 139, + "depth": 8, + "parentIndex": 131, + "ref": "e140" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 321.6666666666667, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "o", + "index": 140, + "depth": 8, + "parentIndex": 131, + "ref": "e141" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 361.6666666666667, + "height": 46, + "y": 590 + }, + "hittable": false, + "label": "p", + "index": 141, + "depth": 8, + "parentIndex": 131, + "ref": "e142" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333333, + "x": 19.666666666666668, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "a", + "index": 142, + "depth": 8, + "parentIndex": 131, + "ref": "e143" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "s", + "index": 143, + "depth": 8, + "parentIndex": 131, + "ref": "e144" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "d", + "index": 144, + "depth": 8, + "parentIndex": 131, + "ref": "e145" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "f", + "index": 145, + "depth": 8, + "parentIndex": 131, + "ref": "e146" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "g", + "index": 146, + "depth": 8, + "parentIndex": 131, + "ref": "e147" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "h", + "index": 147, + "depth": 8, + "parentIndex": 131, + "ref": "e148" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "j", + "index": 148, + "depth": 8, + "parentIndex": 131, + "ref": "e149" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "k", + "index": 149, + "depth": 8, + "parentIndex": 131, + "ref": "e150" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 341.8693333333333, + "height": 46, + "y": 644 + }, + "hittable": false, + "label": "l", + "index": 150, + "depth": 8, + "parentIndex": 131, + "ref": "e151" + }, + { + "enabled": true, + "type": "Button", + "identifier": "shift", + "rect": { + "width": 51.333333333333336, + "x": 0, + "height": 46, + "y": 698 + }, + "label": "shift", + "hittable": false, + "index": 151, + "depth": 8, + "parentIndex": 131, + "ref": "e152" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 60, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "z", + "index": 152, + "depth": 8, + "parentIndex": 131, + "ref": "e153" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 100.33333333333334, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "x", + "index": 153, + "depth": 8, + "parentIndex": 131, + "ref": "e154" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "x": 140.33333333333334, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "c", + "index": 154, + "depth": 8, + "parentIndex": 131, + "ref": "e155" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 181.2026666666667, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "v", + "index": 155, + "depth": 8, + "parentIndex": 131, + "ref": "e156" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 221.2026666666667, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "b", + "index": 156, + "depth": 8, + "parentIndex": 131, + "ref": "e157" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "x": 261.536, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "n", + "index": 157, + "depth": 8, + "parentIndex": 131, + "ref": "e158" + }, + { + "enabled": true, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "x": 301.536, + "height": 46, + "y": 698 + }, + "hittable": false, + "label": "m", + "index": 158, + "depth": 8, + "parentIndex": 131, + "ref": "e159" + }, + { + "enabled": true, + "type": "Key", + "identifier": "delete", + "rect": { + "width": 51.333333333333314, + "x": 350.42133333333334, + "height": 46, + "y": 698 + }, + "label": "delete", + "hittable": false, + "index": 159, + "depth": 8, + "parentIndex": 131, + "ref": "e160" + }, + { + "enabled": true, + "type": "Key", + "identifier": "more", + "rect": { + "width": 101, + "x": 0, + "height": 46, + "y": 752 + }, + "label": "numbers", + "hittable": false, + "index": 160, + "depth": 8, + "parentIndex": 131, + "ref": "e161" + }, + { + "enabled": true, + "type": "Key", + "identifier": "space", + "rect": { + "width": 201.33333333333334, + "x": 100.33333333333334, + "height": 46, + "y": 752 + }, + "label": "space", + "hittable": false, + "index": 161, + "depth": 8, + "parentIndex": 131, + "ref": "e162" + }, + { + "enabled": true, + "type": "Button", + "identifier": "Return", + "rect": { + "width": 100.33333333333331, + "x": 301.6666666666667, + "height": 46, + "y": 752 + }, + "label": "return", + "hittable": false, + "index": 162, + "depth": 8, + "parentIndex": 131, + "ref": "e163" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "x": 0, + "height": 291, + "y": 583 + }, + "hittable": true, + "label": "Emoji", + "index": 163, + "depth": 4, + "parentIndex": 108, + "ref": "e164" + }, + { + "enabled": true, + "type": "Button", + "rect": { + "width": 68.0852958475086, + "x": 8.47726568115926, + "height": 68.73516393505099, + "y": 805.6989567998571 + }, + "hittable": true, + "label": "Emoji", + "index": 164, + "depth": 5, + "parentIndex": 163, + "ref": "e165" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 0, + "x": 8.47726568115926, + "height": 0, + "y": 805.6989567998571 + }, + "hittable": false, + "index": 165, + "depth": 6, + "parentIndex": 164, + "ref": "e166" + }, + { + "enabled": true, + "type": "Button", + "identifier": "dictation", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.73516393505099, + "y": 805.3656234665239 + }, + "label": "Dictate", + "hittable": false, + "index": 166, + "depth": 5, + "parentIndex": 163, + "ref": "e167" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 805.3656234665239 + }, + "hittable": false, + "index": 167, + "depth": 6, + "parentIndex": 166, + "ref": "e168" + }, + { + "enabled": true, + "type": "Button", + "identifier": "dictation", + "rect": { + "width": 68.08529584750863, + "x": 325.43743847133214, + "height": 68.73516393505099, + "y": 805.3656234665239 + }, + "label": "Dictate", + "hittable": true, + "index": 168, + "depth": 5, + "parentIndex": 163, + "ref": "e169" + }, + { + "enabled": true, + "type": "StaticText", + "rect": { + "width": 0, + "x": 325.43743847133214, + "height": 0, + "y": 805.3656234665239 + }, + "hittable": false, + "index": 169, + "depth": 6, + "parentIndex": 168, + "ref": "e170" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 170, + "totalNodeCount": 170, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 89, + "p50Ms": 143, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 89 + } + } + }, + "refsGeneration": 776153 + } +} diff --git a/scroll-regression/ios/workspace-draft-target.json b/scroll-regression/ios/workspace-draft-target.json new file mode 100644 index 0000000000..1506a242da --- /dev/null +++ b/scroll-regression/ios/workspace-draft-target.json @@ -0,0 +1,2714 @@ +{ + "success": true, + "data": { + "nodes": [ + { + "index": 0, + "enabled": true, + "label": "Paseo Debug", + "rect": { + "height": 874, + "x": 0, + "y": 0, + "width": 402 + }, + "hittable": true, + "type": "Application", + "depth": 0, + "ref": "e1" + }, + { + "rect": { + "width": 402, + "y": 0, + "x": 0, + "height": 874 + }, + "hittable": false, + "enabled": true, + "index": 1, + "depth": 1, + "type": "Window", + "parentIndex": 0, + "ref": "e2" + }, + { + "index": 2, + "parentIndex": 1, + "hittable": false, + "depth": 2, + "enabled": true, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e3" + }, + { + "parentIndex": 2, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "depth": 3, + "index": 3, + "type": "Other", + "hittable": false, + "ref": "e4" + }, + { + "type": "Other", + "hittable": false, + "depth": 4, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "index": 4, + "parentIndex": 3, + "ref": "e5" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 5, + "enabled": true, + "hittable": false, + "index": 5, + "parentIndex": 4, + "type": "Other", + "ref": "e6" + }, + { + "parentIndex": 5, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "depth": 6, + "index": 6, + "hittable": false, + "ref": "e7" + }, + { + "enabled": true, + "index": 7, + "type": "Other", + "parentIndex": 6, + "hittable": false, + "depth": 7, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e8" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 8, + "parentIndex": 7, + "type": "Other", + "index": 8, + "hittable": false, + "enabled": true, + "ref": "e9" + }, + { + "depth": 9, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "index": 9, + "type": "Other", + "hittable": false, + "enabled": true, + "parentIndex": 8, + "ref": "e10" + }, + { + "parentIndex": 8, + "index": 10, + "depth": 9, + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "hittable": false, + "ref": "e11" + }, + { + "depth": 10, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "hittable": false, + "parentIndex": 10, + "enabled": true, + "index": 11, + "ref": "e12" + }, + { + "enabled": true, + "hittable": false, + "type": "Other", + "index": 12, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 10, + "depth": 10, + "ref": "e13" + }, + { + "index": 13, + "parentIndex": 12, + "depth": 11, + "type": "Other", + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e14" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 11, + "index": 14, + "type": "Other", + "parentIndex": 12, + "enabled": true, + "hittable": false, + "ref": "e15" + }, + { + "index": 15, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 12, + "hittable": false, + "type": "Other", + "enabled": true, + "parentIndex": 14, + "ref": "e16" + }, + { + "parentIndex": 15, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 16, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 13, + "ref": "e17" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 16, + "depth": 14, + "hittable": false, + "enabled": true, + "type": "Other", + "index": 17, + "ref": "e18" + }, + { + "depth": 15, + "enabled": true, + "hittable": false, + "index": 18, + "type": "Other", + "parentIndex": 17, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e19" + }, + { + "depth": 16, + "parentIndex": 18, + "index": 19, + "enabled": true, + "type": "Other", + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e20" + }, + { + "depth": 17, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "hittable": false, + "index": 20, + "type": "Other", + "parentIndex": 19, + "ref": "e21" + }, + { + "depth": 18, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "hittable": false, + "index": 21, + "type": "Other", + "parentIndex": 20, + "ref": "e22" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 19, + "enabled": true, + "index": 22, + "hittable": false, + "parentIndex": 21, + "ref": "e23" + }, + { + "enabled": true, + "depth": 20, + "hittable": false, + "type": "Other", + "parentIndex": 22, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "index": 23, + "ref": "e24" + }, + { + "type": "Other", + "label": "Switch tabs (2 open)", + "parentIndex": 23, + "index": 24, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "depth": 21, + "ref": "e25" + }, + { + "label": "Open menu", + "enabled": true, + "type": "Other", + "index": 25, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 24, + "hittable": false, + "depth": 22, + "ref": "e26" + }, + { + "index": 26, + "enabled": true, + "label": "Open menu", + "hittable": false, + "type": "Other", + "depth": 23, + "parentIndex": 25, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "ref": "e27" + }, + { + "index": 27, + "enabled": true, + "hittable": false, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "depth": 24, + "identifier": "workspace-deck-entry-srv_tk5MNmAhneJU:wks_3c1e2389120b500a", + "type": "Other", + "parentIndex": 26, + "label": "Open menu", + "ref": "e28" + }, + { + "identifier": "composer-dock-header", + "enabled": true, + "index": 28, + "parentIndex": 27, + "rect": { + "width": 402, + "height": 126, + "y": 0, + "x": 0 + }, + "hittable": false, + "depth": 25, + "label": "Open menu", + "type": "Other", + "ref": "e29" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 56, + "y": 70, + "x": 0 + }, + "type": "Other", + "depth": 26, + "index": 29, + "parentIndex": 28, + "enabled": true, + "ref": "e30" + }, + { + "enabled": true, + "index": 30, + "rect": { + "width": 32, + "height": 32, + "y": 81.6666669845581, + "x": 8 + }, + "hittable": false, + "type": "Button", + "identifier": "menu-button", + "depth": 26, + "label": "Open menu", + "parentIndex": 28, + "ref": "e31" + }, + { + "rect": { + "width": 314, + "height": 34, + "y": 80.6666669845581, + "x": 48 + }, + "parentIndex": 28, + "type": "Other", + "depth": 26, + "enabled": true, + "label": "main", + "hittable": false, + "index": 31, + "ref": "e32" + }, + { + "parentIndex": 31, + "type": "Other", + "label": "main", + "rect": { + "width": 278, + "height": 34, + "y": 80.6666669845581, + "x": 48 + }, + "hittable": false, + "depth": 27, + "enabled": true, + "index": 32, + "ref": "e33" + }, + { + "identifier": "workspace-header-title", + "type": "StaticText", + "hittable": false, + "parentIndex": 32, + "label": "main", + "depth": 28, + "enabled": true, + "index": 33, + "rect": { + "width": 278, + "height": 18, + "y": 80.6666669845581, + "x": 48 + }, + "ref": "e34" + }, + { + "parentIndex": 33, + "enabled": true, + "index": 34, + "depth": 29, + "label": "main", + "hittable": false, + "type": "StaticText", + "rect": { + "width": 278, + "height": 18, + "y": 80.6666669845581, + "x": 48 + }, + "ref": "e35" + }, + { + "type": "StaticText", + "depth": 28, + "enabled": true, + "parentIndex": 32, + "identifier": "workspace-header-subtitle", + "hittable": false, + "label": "composer-dock-ios-fixture", + "index": 35, + "rect": { + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "x": 48 + }, + "ref": "e36" + }, + { + "depth": 29, + "enabled": true, + "rect": { + "width": 163.3333282470703, + "height": 15.666671752929688, + "y": 98.6666669845581, + "x": 48 + }, + "parentIndex": 35, + "hittable": false, + "type": "StaticText", + "label": "composer-dock-ios-fixture", + "index": 36, + "ref": "e37" + }, + { + "label": "·", + "rect": { + "width": 4, + "height": 15.666671752929688, + "y": 98.6666669845581, + "x": 217.3333282470703 + }, + "parentIndex": 32, + "type": "StaticText", + "enabled": true, + "index": 37, + "depth": 28, + "hittable": false, + "ref": "e38" + }, + { + "label": "·", + "rect": { + "width": 4, + "height": 15.666671752929688, + "y": 98.6666669845581, + "x": 217.3333282470703 + }, + "parentIndex": 37, + "type": "StaticText", + "enabled": true, + "index": 38, + "depth": 29, + "hittable": false, + "ref": "e39" + }, + { + "index": 39, + "rect": { + "width": 68.00001525878906, + "height": 16, + "y": 98.6666669845581, + "x": 227.3333282470703 + }, + "hittable": false, + "depth": 28, + "type": "Other", + "enabled": true, + "parentIndex": 32, + "identifier": "host-badge-srv_tk5MNmAhneJU", + "label": "dev-new", + "ref": "e40" + }, + { + "enabled": true, + "type": "Other", + "depth": 28, + "index": 40, + "parentIndex": 32, + "hittable": false, + "rect": { + "width": 12, + "height": 12, + "y": 100.6666669845581, + "x": 227.3333282470703 + }, + "ref": "e41" + }, + { + "depth": 29, + "parentIndex": 40, + "hittable": false, + "index": 41, + "type": "Other", + "enabled": true, + "rect": { + "width": 11, + "height": 11, + "y": 101.1666669845581, + "x": 227.8333282470703 + }, + "ref": "e42" + }, + { + "depth": 30, + "type": "Other", + "rect": { + "width": 11, + "height": 5, + "y": 101.1666669845581, + "x": 227.8333282470703 + }, + "parentIndex": 41, + "enabled": true, + "index": 42, + "hittable": false, + "ref": "e43" + }, + { + "depth": 30, + "type": "Other", + "rect": { + "width": 11, + "height": 5, + "y": 107.1666669845581, + "x": 227.8333282470703 + }, + "parentIndex": 41, + "enabled": true, + "index": 43, + "hittable": false, + "ref": "e44" + }, + { + "hittable": false, + "index": 44, + "type": "Other", + "depth": 30, + "rect": { + "width": 1.0049999999999955, + "height": 1, + "y": 103.1666669845581, + "x": 229.8333282470703 + }, + "parentIndex": 41, + "enabled": true, + "ref": "e45" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 1.0049999999999955, + "height": 1, + "y": 109.1666669845581, + "x": 229.8333282470703 + }, + "depth": 30, + "index": 45, + "parentIndex": 41, + "type": "Other", + "ref": "e46" + }, + { + "depth": 28, + "parentIndex": 32, + "hittable": false, + "type": "StaticText", + "index": 46, + "enabled": true, + "label": "dev-new", + "rect": { + "width": 53.00001525878906, + "height": 16, + "y": 98.6666669845581, + "x": 242.3333282470703 + }, + "ref": "e47" + }, + { + "type": "StaticText", + "rect": { + "width": 53.00001525878906, + "height": 16, + "y": 98.6666669845581, + "x": 242.3333282470703 + }, + "parentIndex": 46, + "hittable": false, + "depth": 29, + "index": 47, + "label": "dev-new", + "enabled": true, + "ref": "e48" + }, + { + "enabled": true, + "hittable": false, + "identifier": "workspace-header-menu-trigger", + "index": 48, + "label": "Workspace actions", + "rect": { + "width": 32, + "height": 32, + "y": 81.6666669845581, + "x": 330 + }, + "depth": 27, + "parentIndex": 31, + "type": "Button", + "ref": "e49" + }, + { + "label": "Open Explorer sidebar", + "parentIndex": 28, + "identifier": "workspace-explorer-toggle", + "type": "Button", + "hittable": false, + "enabled": true, + "depth": 26, + "index": 49, + "rect": { + "width": 32, + "height": 32, + "y": 81.6666669845581, + "x": 362 + }, + "ref": "e50" + }, + { + "parentIndex": 27, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "hittable": false, + "depth": 25, + "index": 50, + "enabled": true, + "ref": "e51" + }, + { + "depth": 25, + "parentIndex": 27, + "index": 51, + "type": "Other", + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "hittable": false, + "ref": "e52" + }, + { + "identifier": "workspace-tab-switcher-trigger", + "index": 52, + "depth": 25, + "label": "Switch tabs (2 open)", + "type": "Button", + "rect": { + "width": 402, + "height": 34, + "y": 126, + "x": 0 + }, + "parentIndex": 27, + "enabled": true, + "hittable": false, + "ref": "e53" + }, + { + "index": 53, + "depth": 26, + "enabled": true, + "parentIndex": 52, + "rect": { + "width": 14, + "height": 14, + "y": 136, + "x": 20 + }, + "identifier": "workspace-active-tab-icon", + "hittable": false, + "type": "Other", + "ref": "e54" + }, + { + "rect": { + "width": 402, + "height": 35, + "y": 126, + "x": 0 + }, + "enabled": true, + "identifier": "workspace-tabs-row", + "type": "Other", + "index": 54, + "hittable": false, + "depth": 25, + "parentIndex": 27, + "ref": "e55" + }, + { + "parentIndex": 27, + "enabled": true, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "depth": 25, + "type": "Other", + "index": 55, + "hittable": false, + "ref": "e56" + }, + { + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "type": "Other", + "enabled": true, + "parentIndex": 27, + "depth": 25, + "hittable": false, + "index": 56, + "ref": "e57" + }, + { + "label": "Import session", + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "index": 57, + "parentIndex": 56, + "depth": 26, + "type": "Other", + "ref": "e58" + }, + { + "type": "Other", + "parentIndex": 57, + "index": 58, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "hittable": false, + "enabled": true, + "depth": 27, + "ref": "e59" + }, + { + "type": "Other", + "identifier": "composer-viewport", + "parentIndex": 57, + "rect": { + "width": 402, + "height": 713, + "y": 161, + "x": 0 + }, + "depth": 27, + "enabled": true, + "label": "Import session", + "hittable": false, + "index": 59, + "ref": "e60" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 713, + "y": -141, + "x": 0 + }, + "enabled": true, + "index": 60, + "parentIndex": 59, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "depth": 28, + "ref": "e61" + }, + { + "rect": { + "width": 402, + "height": 307, + "y": -141, + "x": 0 + }, + "label": "Vertical scroll bar, 1 page", + "type": "Other", + "parentIndex": 60, + "enabled": true, + "identifier": "composer-dock-content", + "depth": 29, + "hittable": false, + "index": 61, + "ref": "e62" + }, + { + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "height": 307, + "y": -141, + "x": 0 + }, + "depth": 30, + "hittable": false, + "index": 62, + "parentIndex": 61, + "ref": "e63" + }, + { + "hittable": false, + "rect": { + "width": 402, + "height": 307, + "y": -141, + "x": 0 + }, + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "depth": 30, + "index": 63, + "type": "Other", + "parentIndex": 61, + "ref": "e64" + }, + { + "hittable": false, + "depth": 31, + "parentIndex": 63, + "label": "Vertical scroll bar, 1 page", + "enabled": true, + "rect": { + "width": 402, + "height": 307, + "y": -141, + "x": 0 + }, + "index": 64, + "type": "ScrollView", + "ref": "e65" + }, + { + "depth": 32, + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 40, + "y": -141, + "x": 0 + }, + "type": "Other", + "parentIndex": 64, + "index": 65, + "ref": "e66" + }, + { + "rect": { + "width": 402, + "height": 40, + "y": -141, + "x": 0 + }, + "index": 66, + "parentIndex": 65, + "enabled": true, + "hittable": false, + "depth": 33, + "type": "Other", + "ref": "e67" + }, + { + "type": "Other", + "index": 67, + "rect": { + "width": 30, + "height": 307, + "y": -141, + "x": 369 + }, + "hittable": false, + "depth": 32, + "parentIndex": 64, + "value": "0%", + "enabled": true, + "label": "Vertical scroll bar, 1 page", + "ref": "e68" + }, + { + "type": "Other", + "parentIndex": 67, + "enabled": true, + "depth": 33, + "index": 68, + "hittable": false, + "rect": { + "width": 3, + "height": 53, + "y": -138, + "x": 396 + }, + "ref": "e69" + }, + { + "enabled": true, + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "index": 69, + "value": "0%", + "type": "Other", + "rect": { + "width": 402, + "height": 30, + "y": 133, + "x": 0 + }, + "hittable": false, + "parentIndex": 64, + "ref": "e70" + }, + { + "parentIndex": 69, + "type": "Other", + "rect": { + "width": 393, + "height": 3, + "y": 160, + "x": 3 + }, + "hittable": false, + "enabled": true, + "depth": 33, + "index": 70, + "ref": "e71" + }, + { + "enabled": true, + "value": "0%", + "type": "Other", + "index": 71, + "rect": { + "width": 30, + "height": 307, + "y": -141, + "x": 369 + }, + "depth": 32, + "parentIndex": 64, + "label": "Vertical scroll bar, 1 page", + "hittable": false, + "ref": "e72" + }, + { + "enabled": true, + "rect": { + "width": 3, + "height": 53, + "y": -138, + "x": 396 + }, + "index": 72, + "hittable": false, + "depth": 33, + "type": "Other", + "parentIndex": 71, + "ref": "e73" + }, + { + "depth": 32, + "label": "Horizontal scroll bar, 1 page", + "parentIndex": 64, + "index": 73, + "value": "0%", + "hittable": false, + "rect": { + "width": 402, + "height": 30, + "y": 133, + "x": 0 + }, + "enabled": true, + "type": "Other", + "ref": "e74" + }, + { + "depth": 33, + "type": "Other", + "parentIndex": 73, + "index": 74, + "hittable": false, + "enabled": true, + "rect": { + "width": 393, + "height": 3, + "y": 160, + "x": 3 + }, + "ref": "e75" + }, + { + "index": 75, + "rect": { + "width": 402, + "height": 406, + "y": 166, + "x": 0 + }, + "label": "Import session", + "depth": 29, + "hittable": false, + "identifier": "composer-viewport-content", + "enabled": true, + "type": "Other", + "parentIndex": 60, + "ref": "e76" + }, + { + "enabled": true, + "type": "Button", + "label": "Import session", + "parentIndex": 75, + "rect": { + "width": 137, + "height": 32, + "y": 174, + "x": 16 + }, + "depth": 30, + "index": 76, + "identifier": "composer-import-agent-pill", + "hittable": false, + "ref": "e77" + }, + { + "hittable": false, + "type": "StaticText", + "enabled": true, + "label": "Import session", + "index": 77, + "rect": { + "width": 89, + "height": 15.66668701171875, + "y": 182, + "x": 51 + }, + "depth": 31, + "parentIndex": 76, + "ref": "e78" + }, + { + "enabled": true, + "hittable": false, + "type": "StaticText", + "parentIndex": 77, + "rect": { + "width": 89, + "height": 15.66668701171875, + "y": 182, + "x": 51 + }, + "depth": 32, + "label": "Import session", + "index": 78, + "ref": "e79" + }, + { + "enabled": true, + "identifier": "message-input-root", + "hittable": false, + "rect": { + "width": 370, + "height": 308, + "y": 214, + "x": 16 + }, + "type": "Other", + "index": 79, + "parentIndex": 75, + "depth": 30, + "ref": "e80" + }, + { + "rect": { + "width": 370, + "height": 308, + "y": 214, + "x": 16 + }, + "enabled": true, + "type": "Other", + "parentIndex": 75, + "index": 80, + "hittable": false, + "depth": 30, + "ref": "e81" + }, + { + "rect": { + "width": 344, + "height": 250, + "y": 223, + "x": 29 + }, + "hittable": false, + "depth": 30, + "parentIndex": 75, + "enabled": true, + "type": "Other", + "index": 81, + "label": "Message agent...", + "ref": "e82" + }, + { + "type": "TextView", + "depth": 31, + "enabled": true, + "parentIndex": 81, + "value": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty", + "label": "Message agent...", + "index": 82, + "rect": { + "width": 344, + "height": 250, + "y": 223, + "x": 29 + }, + "hittable": false, + "ref": "e83" + }, + { + "enabled": true, + "label": "Vertical scroll bar, 2 pages", + "index": 83, + "type": "Other", + "parentIndex": 82, + "rect": { + "width": 30, + "height": 250, + "y": 223, + "x": 340 + }, + "hittable": false, + "value": "100%", + "depth": 32, + "ref": "e84" + }, + { + "parentIndex": 83, + "enabled": true, + "depth": 33, + "type": "Other", + "index": 84, + "hittable": false, + "rect": { + "width": 3, + "height": 157.66666666666663, + "y": 312.33333333333337, + "x": 367 + }, + "ref": "e85" + }, + { + "value": "0%", + "index": 85, + "hittable": false, + "enabled": true, + "label": "Horizontal scroll bar, 1 page", + "type": "Other", + "rect": { + "width": 344, + "height": 30, + "y": 440, + "x": 29 + }, + "depth": 32, + "parentIndex": 82, + "ref": "e86" + }, + { + "hittable": false, + "index": 86, + "depth": 33, + "type": "Other", + "parentIndex": 85, + "rect": { + "width": 335, + "height": 3, + "y": 467, + "x": 32 + }, + "enabled": true, + "ref": "e87" + }, + { + "enabled": true, + "index": 87, + "depth": 30, + "rect": { + "width": 28, + "height": 28, + "y": 485, + "x": 23 + }, + "type": "Button", + "hittable": false, + "identifier": "message-input-attach-button", + "parentIndex": 75, + "label": "Add attachment", + "ref": "e88" + }, + { + "type": "Other", + "index": 88, + "enabled": true, + "depth": 31, + "hittable": false, + "rect": { + "width": 28, + "height": 28, + "y": 485, + "x": 23 + }, + "parentIndex": 87, + "ref": "e89" + }, + { + "enabled": true, + "type": "Other", + "rect": { + "width": 20, + "height": 20, + "y": 489, + "x": 27 + }, + "hittable": false, + "depth": 32, + "index": 89, + "parentIndex": 88, + "ref": "e90" + }, + { + "enabled": true, + "type": "Other", + "depth": 33, + "hittable": false, + "index": 90, + "parentIndex": 89, + "rect": { + "width": 13.333333333333332, + "height": 13.333333333333371, + "y": 492.3333333333333, + "x": 30.333333333333332 + }, + "ref": "e91" + }, + { + "rect": { + "width": 13.333333333333332, + "height": 1.6666666666666856, + "y": 498.16666666666674, + "x": 30.333333333333332 + }, + "depth": 34, + "enabled": true, + "index": 91, + "parentIndex": 90, + "type": "Other", + "hittable": false, + "ref": "e92" + }, + { + "parentIndex": 90, + "rect": { + "width": 1.6666666666666643, + "height": 13.333333333333314, + "y": 492.33333333333326, + "x": 36.16666666666667 + }, + "depth": 34, + "hittable": false, + "type": "Other", + "enabled": true, + "index": 92, + "ref": "e93" + }, + { + "rect": { + "width": 264, + "height": 28, + "y": 485, + "x": 51 + }, + "type": "Other", + "label": "Select model (Select model)", + "parentIndex": 75, + "index": 93, + "hittable": false, + "depth": 30, + "enabled": true, + "ref": "e94" + }, + { + "parentIndex": 93, + "type": "Button", + "index": 94, + "depth": 31, + "enabled": true, + "hittable": false, + "label": "Select model (Select model)", + "rect": { + "width": 105.66667175292969, + "height": 28, + "y": 485, + "x": 51 + }, + "identifier": "combined-model-selector", + "ref": "e95" + }, + { + "rect": { + "width": 28, + "height": 28, + "y": 485, + "x": 315 + }, + "hittable": false, + "enabled": true, + "depth": 30, + "label": "Start dictation", + "index": 95, + "type": "Button", + "parentIndex": 75, + "ref": "e96" + }, + { + "rect": { + "width": 28, + "height": 28, + "y": 485, + "x": 351 + }, + "hittable": false, + "enabled": true, + "index": 96, + "type": "Button", + "depth": 30, + "parentIndex": 75, + "label": "Send message", + "ref": "e97" + }, + { + "depth": 11, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 12, + "enabled": true, + "type": "Other", + "index": 97, + "hittable": false, + "ref": "e98" + }, + { + "hittable": false, + "index": 98, + "type": "Other", + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 6, + "depth": 7, + "ref": "e99" + }, + { + "depth": 8, + "type": "Other", + "hittable": false, + "enabled": true, + "index": 99, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "parentIndex": 98, + "ref": "e100" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "hittable": false, + "depth": 9, + "enabled": true, + "type": "Other", + "parentIndex": 99, + "index": 100, + "ref": "e101" + }, + { + "enabled": true, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "hittable": false, + "type": "Window", + "depth": 1, + "parentIndex": 0, + "index": 101, + "ref": "e102" + }, + { + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "type": "Other", + "depth": 2, + "hittable": false, + "index": 102, + "parentIndex": 101, + "enabled": true, + "ref": "e103" + }, + { + "enabled": true, + "type": "Other", + "parentIndex": 102, + "index": 103, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "hittable": false, + "depth": 3, + "ref": "e104" + }, + { + "type": "Other", + "rect": { + "width": 402, + "height": 336, + "y": 538, + "x": 0 + }, + "index": 104, + "depth": 3, + "hittable": false, + "parentIndex": 102, + "enabled": true, + "ref": "e105" + }, + { + "depth": 4, + "type": "Other", + "enabled": true, + "index": 105, + "hittable": false, + "rect": { + "width": 402, + "height": 278, + "y": 538, + "x": 0 + }, + "parentIndex": 104, + "ref": "e106" + }, + { + "label": "Emoji", + "type": "Window", + "index": 106, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "enabled": true, + "depth": 1, + "hittable": true, + "parentIndex": 0, + "ref": "e107" + }, + { + "hittable": true, + "rect": { + "width": 402, + "height": 874, + "y": 0, + "x": 0 + }, + "label": "Emoji", + "enabled": true, + "parentIndex": 106, + "index": 107, + "depth": 2, + "type": "Other", + "ref": "e108" + }, + { + "enabled": true, + "label": "Emoji", + "type": "Other", + "rect": { + "width": 402, + "height": 336, + "y": 538, + "x": 0 + }, + "index": 108, + "depth": 3, + "parentIndex": 107, + "hittable": true, + "ref": "e109" + }, + { + "enabled": true, + "hittable": false, + "depth": 4, + "type": "Other", + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "index": 109, + "parentIndex": 108, + "ref": "e110" + }, + { + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "enabled": true, + "parentIndex": 109, + "depth": 5, + "index": 110, + "hittable": false, + "type": "Other", + "ref": "e111" + }, + { + "parentIndex": 110, + "depth": 6, + "type": "Other", + "enabled": true, + "hittable": false, + "index": 111, + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "ref": "e112" + }, + { + "depth": 4, + "identifier": "SystemInputAssistantView", + "label": "Typing Predictions", + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "parentIndex": 108, + "index": 112, + "hittable": true, + "enabled": true, + "type": "Other", + "ref": "e113" + }, + { + "hittable": true, + "depth": 5, + "parentIndex": 112, + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "index": 113, + "enabled": true, + "label": "Typing Predictions", + "type": "Other", + "ref": "e114" + }, + { + "depth": 6, + "identifier": "CenterPageView", + "hittable": true, + "parentIndex": 113, + "label": "Typing Predictions", + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "enabled": true, + "index": 114, + "type": "Other", + "ref": "e115" + }, + { + "hittable": false, + "enabled": true, + "rect": { + "width": 402, + "height": 1245, + "y": -62, + "x": 0 + }, + "depth": 7, + "index": 115, + "parentIndex": 114, + "type": "Other", + "ref": "e116" + }, + { + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "depth": 8, + "type": "ScrollView", + "index": 116, + "parentIndex": 115, + "enabled": true, + "hittable": false, + "ref": "e117" + }, + { + "depth": 7, + "type": "Other", + "index": 117, + "enabled": true, + "hittable": true, + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "parentIndex": 114, + "label": "Typing Predictions", + "ref": "e118" + }, + { + "enabled": true, + "label": "Typing Predictions", + "type": "Other", + "hittable": true, + "index": 118, + "depth": 8, + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "parentIndex": 117, + "ref": "e119" + }, + { + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "enabled": true, + "parentIndex": 118, + "type": "Other", + "index": 119, + "depth": 9, + "label": "“fourteen”", + "hittable": true, + "ref": "e120" + }, + { + "parentIndex": 119, + "depth": 10, + "label": "“fourteen”", + "enabled": true, + "hittable": true, + "index": 120, + "type": "Other", + "rect": { + "width": 402, + "height": 45, + "y": 538, + "x": 0 + }, + "ref": "e121" + }, + { + "enabled": true, + "index": 121, + "parentIndex": 120, + "rect": { + "width": 134, + "height": 45, + "y": 538, + "x": 0 + }, + "depth": 11, + "label": "“fourteen”", + "hittable": true, + "type": "Other", + "ref": "e122" + }, + { + "index": 122, + "label": "fourteenth", + "parentIndex": 120, + "type": "Other", + "hittable": true, + "depth": 11, + "rect": { + "width": 134, + "height": 45, + "y": 538, + "x": 134 + }, + "enabled": true, + "ref": "e123" + }, + { + "hittable": true, + "depth": 11, + "label": "fourteens", + "enabled": true, + "index": 123, + "rect": { + "width": 134, + "height": 45, + "y": 538, + "x": 268 + }, + "parentIndex": 120, + "type": "Other", + "ref": "e124" + }, + { + "depth": 4, + "index": 124, + "enabled": true, + "type": "Other", + "parentIndex": 108, + "rect": { + "width": 402, + "height": 233, + "y": 583, + "x": 0 + }, + "hittable": false, + "ref": "e125" + }, + { + "rect": { + "width": 402, + "height": 291, + "y": 583, + "x": 0 + }, + "enabled": true, + "hittable": false, + "type": "Other", + "parentIndex": 124, + "depth": 5, + "index": 125, + "ref": "e126" + }, + { + "parentIndex": 125, + "rect": { + "width": 402, + "height": 291, + "y": 583, + "x": 0 + }, + "enabled": true, + "index": 126, + "hittable": false, + "depth": 6, + "type": "Other", + "ref": "e127" + }, + { + "type": "Other", + "hittable": false, + "index": 127, + "depth": 7, + "rect": { + "width": 402, + "height": 291, + "y": 583, + "x": 0 + }, + "parentIndex": 126, + "enabled": true, + "ref": "e128" + }, + { + "enabled": true, + "rect": { + "width": 402, + "height": 233, + "y": 583, + "x": 0 + }, + "label": "q", + "type": "Other", + "index": 128, + "parentIndex": 108, + "hittable": false, + "depth": 4, + "ref": "e129" + }, + { + "rect": { + "width": 402, + "height": 233, + "y": 583, + "x": 0 + }, + "index": 129, + "hittable": false, + "depth": 5, + "parentIndex": 128, + "enabled": true, + "label": "q", + "type": "Keyboard", + "ref": "e130" + }, + { + "index": 130, + "rect": { + "width": 402, + "height": 233, + "y": 583, + "x": 0 + }, + "depth": 6, + "parentIndex": 129, + "hittable": false, + "enabled": true, + "label": "q", + "type": "Other", + "ref": "e131" + }, + { + "enabled": true, + "hittable": false, + "depth": 7, + "identifier": "UIKeyboardLayoutStar Preview", + "parentIndex": 130, + "label": "q", + "type": "Other", + "index": 131, + "rect": { + "width": 402, + "height": 233, + "y": 583, + "x": 0 + }, + "ref": "e132" + }, + { + "enabled": true, + "rect": { + "width": 40.333333333333336, + "height": 46, + "y": 590, + "x": 0 + }, + "label": "q", + "parentIndex": 131, + "type": "Key", + "index": 132, + "depth": 8, + "hittable": false, + "ref": "e133" + }, + { + "enabled": true, + "index": 133, + "rect": { + "width": 40.00000000000001, + "height": 46, + "y": 590, + "x": 40.333333333333336 + }, + "type": "Key", + "depth": 8, + "label": "w", + "hittable": false, + "parentIndex": 131, + "ref": "e134" + }, + { + "parentIndex": 131, + "depth": 8, + "enabled": true, + "type": "Key", + "hittable": false, + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 590, + "x": 80.33333333333334 + }, + "index": 134, + "label": "e", + "ref": "e135" + }, + { + "type": "Key", + "label": "r", + "rect": { + "width": 40, + "height": 46, + "y": 590, + "x": 120.66666666666669 + }, + "depth": 8, + "enabled": true, + "index": 135, + "hittable": false, + "parentIndex": 131, + "ref": "e136" + }, + { + "type": "Key", + "parentIndex": 131, + "depth": 8, + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 590, + "x": 160.66666666666669 + }, + "index": 136, + "enabled": true, + "hittable": false, + "label": "t", + "ref": "e137" + }, + { + "enabled": true, + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 590, + "x": 201.00000000000003 + }, + "index": 137, + "hittable": false, + "parentIndex": 131, + "type": "Key", + "depth": 8, + "label": "y", + "ref": "e138" + }, + { + "hittable": false, + "label": "u", + "index": 138, + "depth": 8, + "enabled": true, + "type": "Key", + "rect": { + "width": 40, + "height": 46, + "y": 590, + "x": 241.33333333333337 + }, + "parentIndex": 131, + "ref": "e139" + }, + { + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 590, + "x": 281.33333333333337 + }, + "type": "Key", + "index": 139, + "label": "i", + "hittable": false, + "parentIndex": 131, + "enabled": true, + "depth": 8, + "ref": "e140" + }, + { + "enabled": true, + "label": "o", + "depth": 8, + "index": 140, + "hittable": false, + "rect": { + "width": 40, + "height": 46, + "y": 590, + "x": 321.6666666666667 + }, + "type": "Key", + "parentIndex": 131, + "ref": "e141" + }, + { + "label": "p", + "parentIndex": 131, + "depth": 8, + "enabled": true, + "hittable": false, + "index": 141, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 590, + "x": 361.6666666666667 + }, + "ref": "e142" + }, + { + "enabled": true, + "rect": { + "width": 40.33333333333333, + "height": 46, + "y": 644, + "x": 19.666666666666668 + }, + "depth": 8, + "label": "a", + "parentIndex": 131, + "type": "Key", + "hittable": false, + "index": 142, + "ref": "e143" + }, + { + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 644, + "x": 60 + }, + "index": 143, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "s", + "parentIndex": 131, + "hittable": false, + "ref": "e144" + }, + { + "parentIndex": 131, + "hittable": false, + "label": "d", + "rect": { + "width": 40, + "height": 46, + "y": 644, + "x": 100.33333333333334 + }, + "enabled": true, + "index": 144, + "depth": 8, + "type": "Key", + "ref": "e145" + }, + { + "parentIndex": 131, + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 644, + "x": 140.33333333333334 + }, + "index": 145, + "enabled": true, + "label": "f", + "type": "Key", + "depth": 8, + "hittable": false, + "ref": "e146" + }, + { + "hittable": false, + "rect": { + "width": 40, + "height": 46, + "y": 644, + "x": 181.2026666666667 + }, + "label": "g", + "type": "Key", + "parentIndex": 131, + "index": 146, + "depth": 8, + "enabled": true, + "ref": "e147" + }, + { + "label": "h", + "enabled": true, + "index": 147, + "hittable": false, + "parentIndex": 131, + "type": "Key", + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 644, + "x": 221.2026666666667 + }, + "depth": 8, + "ref": "e148" + }, + { + "label": "j", + "enabled": true, + "index": 148, + "rect": { + "width": 40, + "height": 46, + "y": 644, + "x": 261.536 + }, + "parentIndex": 131, + "depth": 8, + "hittable": false, + "type": "Key", + "ref": "e149" + }, + { + "index": 149, + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 644, + "x": 301.536 + }, + "type": "Key", + "hittable": false, + "depth": 8, + "parentIndex": 131, + "label": "k", + "enabled": true, + "ref": "e150" + }, + { + "enabled": true, + "hittable": false, + "index": 150, + "label": "l", + "type": "Key", + "parentIndex": 131, + "depth": 8, + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 644, + "x": 341.8693333333333 + }, + "ref": "e151" + }, + { + "label": "shift", + "type": "Button", + "rect": { + "width": 51.333333333333336, + "height": 46, + "y": 698, + "x": 0 + }, + "parentIndex": 131, + "identifier": "shift", + "enabled": true, + "hittable": false, + "depth": 8, + "index": 151, + "ref": "e152" + }, + { + "depth": 8, + "hittable": false, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 698, + "x": 60 + }, + "index": 152, + "parentIndex": 131, + "enabled": true, + "label": "z", + "ref": "e153" + }, + { + "index": 153, + "depth": 8, + "enabled": true, + "hittable": false, + "parentIndex": 131, + "type": "Key", + "rect": { + "width": 40, + "height": 46, + "y": 698, + "x": 100.33333333333334 + }, + "label": "x", + "ref": "e154" + }, + { + "parentIndex": 131, + "index": 154, + "enabled": true, + "depth": 8, + "hittable": false, + "type": "Key", + "rect": { + "width": 40.33333333333334, + "height": 46, + "y": 698, + "x": 140.33333333333334 + }, + "label": "c", + "ref": "e155" + }, + { + "enabled": true, + "depth": 8, + "hittable": false, + "type": "Key", + "rect": { + "width": 40, + "height": 46, + "y": 698, + "x": 181.2026666666667 + }, + "parentIndex": 131, + "label": "v", + "index": 155, + "ref": "e156" + }, + { + "type": "Key", + "index": 156, + "depth": 8, + "parentIndex": 131, + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 698, + "x": 221.2026666666667 + }, + "enabled": true, + "label": "b", + "hittable": false, + "ref": "e157" + }, + { + "parentIndex": 131, + "type": "Key", + "hittable": false, + "rect": { + "width": 40, + "height": 46, + "y": 698, + "x": 261.536 + }, + "enabled": true, + "index": 157, + "depth": 8, + "label": "n", + "ref": "e158" + }, + { + "label": "m", + "type": "Key", + "index": 158, + "enabled": true, + "hittable": false, + "rect": { + "width": 40.333333333333314, + "height": 46, + "y": 698, + "x": 301.536 + }, + "depth": 8, + "parentIndex": 131, + "ref": "e159" + }, + { + "hittable": false, + "index": 159, + "parentIndex": 131, + "label": "delete", + "enabled": true, + "rect": { + "width": 51.333333333333314, + "height": 46, + "y": 698, + "x": 350.42133333333334 + }, + "identifier": "delete", + "type": "Key", + "depth": 8, + "ref": "e160" + }, + { + "rect": { + "width": 101, + "height": 46, + "y": 752, + "x": 0 + }, + "identifier": "more", + "parentIndex": 131, + "index": 160, + "depth": 8, + "enabled": true, + "type": "Key", + "label": "numbers", + "hittable": false, + "ref": "e161" + }, + { + "enabled": true, + "depth": 8, + "type": "Key", + "hittable": false, + "label": "space", + "index": 161, + "rect": { + "width": 201.33333333333334, + "height": 46, + "y": 752, + "x": 100.33333333333334 + }, + "identifier": "space", + "parentIndex": 131, + "ref": "e162" + }, + { + "enabled": true, + "rect": { + "width": 100.33333333333331, + "height": 46, + "y": 752, + "x": 301.6666666666667 + }, + "type": "Button", + "index": 162, + "hittable": false, + "parentIndex": 131, + "identifier": "Return", + "label": "return", + "depth": 8, + "ref": "e163" + }, + { + "index": 163, + "rect": { + "width": 402, + "height": 291, + "y": 583, + "x": 0 + }, + "parentIndex": 108, + "label": "Emoji", + "type": "Other", + "enabled": true, + "hittable": true, + "depth": 4, + "ref": "e164" + }, + { + "label": "Emoji", + "depth": 5, + "index": 164, + "enabled": true, + "type": "Button", + "rect": { + "width": 68.0852958475086, + "height": 68.73516393505099, + "y": 805.6989567998571, + "x": 8.47726568115926 + }, + "hittable": true, + "parentIndex": 163, + "ref": "e165" + }, + { + "index": 165, + "hittable": false, + "enabled": true, + "depth": 6, + "parentIndex": 164, + "rect": { + "width": 0, + "height": 0, + "y": 805.6989567998571, + "x": 8.47726568115926 + }, + "type": "StaticText", + "ref": "e166" + }, + { + "depth": 5, + "identifier": "dictation", + "label": "Dictate", + "parentIndex": 163, + "index": 166, + "type": "Button", + "enabled": true, + "rect": { + "width": 68.08529584750863, + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214 + }, + "hittable": false, + "ref": "e167" + }, + { + "index": 167, + "type": "StaticText", + "hittable": false, + "enabled": true, + "depth": 6, + "rect": { + "width": 0, + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214 + }, + "parentIndex": 166, + "ref": "e168" + }, + { + "identifier": "dictation", + "parentIndex": 163, + "label": "Dictate", + "index": 168, + "enabled": true, + "depth": 5, + "type": "Button", + "rect": { + "width": 68.08529584750863, + "height": 68.73516393505099, + "y": 805.3656234665239, + "x": 325.43743847133214 + }, + "hittable": true, + "ref": "e169" + }, + { + "rect": { + "width": 0, + "height": 0, + "y": 805.3656234665239, + "x": 325.43743847133214 + }, + "parentIndex": 168, + "index": 169, + "enabled": true, + "hittable": false, + "type": "StaticText", + "depth": 6, + "ref": "e170" + } + ], + "truncated": false, + "appName": "sh.paseo.debug", + "appBundleId": "sh.paseo.debug", + "visibility": { + "partial": false, + "visibleNodeCount": 170, + "totalNodeCount": 170, + "reasons": [] + }, + "snapshotQuality": { + "state": "healthy", + "backend": "tree" + }, + "snapshotDiagnostics": { + "stats": { + "count": 90, + "p50Ms": 143, + "p95Ms": 1317, + "maxMs": 3250, + "slowThresholdMs": 1500, + "platform": "ios", + "backends": { + "xctest": 90 + } + } + }, + "refsGeneration": 776154 + } +} diff --git a/scroll-regression/red-assertion.log b/scroll-regression/red-assertion.log new file mode 100644 index 0000000000..6aeaa9790c --- /dev/null +++ b/scroll-regression/red-assertion.log @@ -0,0 +1,8 @@ +file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:38 + if (fraction < 0.01) throw new Error(`Native swipe did not move stream content: ${(fraction * 100).toFixed(2)}% changed`); + ^ + +Error: Native swipe did not move stream content: 0.00% changed + at file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:38:30 + +Node.js v22.20.0 diff --git a/scroll-regression/red-green.log b/scroll-regression/red-green.log new file mode 100644 index 0000000000..ace672bb6e --- /dev/null +++ b/scroll-regression/red-green.log @@ -0,0 +1,26 @@ +before: 0-bottom -> 1-after-scroll-up; exit 1 +file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:49 + throw new Error( + ^ + +Error: Native swipe did not move stream content: 0.00% changed + at file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:49:11 + +Node.js v22.20.0 + +before: 2-back-at-bottom-idle -> 3-after-scroll-up-2; exit 1 +file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:49 + throw new Error( + ^ + +Error: Native swipe did not move stream content: 0.00% changed + at file:///home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/e2e/mobile/composer-keyboard/assert-composer-keyboard.mjs:49:11 + +Node.js v22.20.0 + +after: 0-bottom -> 1-after-scroll-up; exit 0 +Native swipe moved stream content: 23.89% changed + +after: 2-back-at-bottom-idle -> 3-after-scroll-up-2; exit 0 +Native swipe moved stream content: 26.44% changed + diff --git a/scroll-regression/release-build.log b/scroll-regression/release-build.log new file mode 100644 index 0000000000..12cac1511b --- /dev/null +++ b/scroll-regression/release-build.log @@ -0,0 +1,207 @@ +$ cd packages/app +$ npm --prefix ../.. run build:client && CI=1 APP_VARIANT=production npx expo prebuild --platform android --clean --non-interactive && cd android && ./gradlew assembleRelease --no-daemon -q + +> paseo@0.8.0 build:client +> npm run build --workspace=@getpaseo/client + +> @getpaseo/client@0.8.0 build +> npm run build --workspace=@getpaseo/protocol && tsc -p tsconfig.json --incremental false + +> @getpaseo/protocol@0.8.0 prebuild +> npm run generate:validators + +> @getpaseo/protocol@0.8.0 generate:validators +> node scripts/generate-validation-aot.mjs + +generated src/generated/validation/ws-outbound.aot.ts from codegen/ws-outbound.compile.ts (WSOutboundMessageSchema) + +> @getpaseo/protocol@0.8.0 build +> tsc -p tsconfig.json --incremental false +(node:3418652) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) + --non-interactive is not supported, use $CI=1 instead +(node:3418664) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +- Clearing android +✔ Cleared android code +- Creating native directory (./android) +✔ Created native directory +- Updating package.json +✔ Updated package.json | no changes +- Running prebuild +✔ Finished prebuild +[ExpoRootProject] Using the following versions: + - buildTools: 36.0.0 + - minSdk: 29 + - compileSdk: 36 + - targetSdk: 36 + - ndk: 27.1.12297006 + - kotlin: 2.1.20 + - ksp: 2.1.20-2.0.1 + ℹ️ Applying gradle plugin 'expo-dev-launcher-gradle-plugin' + +Using expo modules + - getpaseo-expo-two-way-audio (0.1.0) + - expo-constants (18.0.13) + - expo-dev-client (6.0.20) + - expo-dev-launcher (6.0.20) + - expo-dev-menu (7.0.18) + - expo-dev-menu-interface (2.0.0) + - expo-json-utils (0.15.0) + - expo-manifests (1.0.10) + - expo-modules-core (3.0.29) + - expo-updates-interface (2.0.0) + - paseo-diff-prototype (0.1.0) + - paseo-native-trace (0.1.0) + - paseo-word-stream (0.1.0) + - [📦] expo-application (7.0.8) + - [📦] expo-asset (12.0.12) + - [📦] expo-audio (1.0.16) + - [📦] expo-camera (17.0.10) + - [📦] expo-clipboard (8.0.7) + - [📦] expo-crypto (15.0.8) + - [📦] expo-document-picker (14.0.8) + - [📦] expo-file-system (19.0.21) + - [📦] expo-font (14.0.11) + - [📦] expo-haptics (15.0.8) + - [📦] expo-image (3.0.11) + - [📦] expo-image-loader (6.0.0) + - [📦] expo-image-manipulator (14.0.8) + - [📦] expo-image-picker (17.0.10) + - [📦] expo-keep-awake (15.0.8) + - [📦] expo-linking (8.0.11) + - [📦] expo-localization (17.0.9) + - [📦] expo-notifications (0.32.16) + - [📦] expo-sharing (14.0.8) + - [📦] expo-splash-screen (31.0.13) + - [📦] expo-sqlite (16.0.10) + - [📦] expo-system-ui (6.0.9) + +The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set. Using only .env.local and .env +(node:3419787) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(node:3419823) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419809) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419798) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419833) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419905) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419842) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419882) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419895) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419867) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419935) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419963) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419965) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419853) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419916) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419954) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419962) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419970) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419999) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419998) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420014) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420013) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419992) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420020) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3419768) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420026) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420042) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420050) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:3420044) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Note: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/node_modules/@react-native-masked-view/masked-view/android/src/main/java/org/reactnative/maskedview/RNCMaskedViewPackage.java uses or overrides a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/node_modules/@react-native-async-storage/async-storage/android/src/javaPackage/java/com/reactnativecommunity/asyncstorage/AsyncStoragePackage.java uses unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +Note: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/node_modules/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java uses unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use or override a deprecated API. +Note: Recompile with -Xlint:deprecation for details. +Note: Some input files use unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +(node:3433990) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +Using src/app as the root directory for Expo Router. +Experimental Expo Autolinking module resolver is enabled. +React Compiler enabled +Starting Metro Bundler +warning: Bundler cache is empty, rebuilding (this may take a minute) +| (node:3434081) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +Android packages/app/index.ts ▓░░░░░░░░░░░░░░░ 9.5% ( 8/26) +| (node:3434107) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434095) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434109) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434088) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434082) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434130) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434137) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434122) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +| (node:3434116) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +| (Use `node --trace-warnings ...` to show where the warning was created) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓░░░░░░ 63.4% ( 855/1124) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓░░░░░░ 63.4% (1341/3563) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓░░░░░░ 63.4% (1784/4020) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓▓▓░░░░ 79.0% (3955/4511) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░ 92.3% (4715/4907) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ 99.9% (5933/5937) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ 99.9% (5938/5939) +Android packages/app/index.ts ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ 99.9% (5939/5939) +Android Bundled 50142ms packages/app/index.ts (5940 modules) +Writing bundle output to: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle +Writing sourcemap output to: /home/moboudra/dev/paseo/.dev/paseo-home/worktrees/04qpit1r/filthy-dragon/packages/app/android/app/build/intermediates/sourcemaps/react/release/index.android.bundle.packager.map +Copying 33 asset files +Done writing bundle output +Done writing sourcemap output + +Exit code: 0 + diff --git a/scroll-regression/release/0-bottom.png b/scroll-regression/release/0-bottom.png new file mode 100644 index 0000000000..fa7ce55c00 Binary files /dev/null and b/scroll-regression/release/0-bottom.png differ diff --git a/scroll-regression/release/1-after-scroll-up.png b/scroll-regression/release/1-after-scroll-up.png new file mode 100644 index 0000000000..872963cf96 Binary files /dev/null and b/scroll-regression/release/1-after-scroll-up.png differ diff --git a/scroll-regression/release/2-back-at-bottom-idle.png b/scroll-regression/release/2-back-at-bottom-idle.png new file mode 100644 index 0000000000..a2d8188a7d Binary files /dev/null and b/scroll-regression/release/2-back-at-bottom-idle.png differ diff --git a/scroll-regression/release/3-after-scroll-up-2.png b/scroll-regression/release/3-after-scroll-up-2.png new file mode 100644 index 0000000000..5cdd6ea8fa Binary files /dev/null and b/scroll-regression/release/3-after-scroll-up-2.png differ diff --git a/scroll-regression/release/4-after-scroll-up-3.png b/scroll-regression/release/4-after-scroll-up-3.png new file mode 100644 index 0000000000..22b1104fcc Binary files /dev/null and b/scroll-regression/release/4-after-scroll-up-3.png differ diff --git a/scroll-regression/release/assertions.log b/scroll-regression/release/assertions.log new file mode 100644 index 0000000000..15816a1763 --- /dev/null +++ b/scroll-regression/release/assertions.log @@ -0,0 +1,2 @@ +Native swipe moved stream content: 27.74% changed +Native swipe moved stream content: 25.07% changed diff --git a/scroll-regression/release/install.log b/scroll-regression/release/install.log new file mode 100644 index 0000000000..a14462dd51 --- /dev/null +++ b/scroll-regression/release/install.log @@ -0,0 +1,2 @@ +Performing Streamed Install +Success diff --git a/scroll-regression/release/reproduction.log b/scroll-regression/release/reproduction.log new file mode 100644 index 0000000000..00c46d502f --- /dev/null +++ b/scroll-regression/release/reproduction.log @@ -0,0 +1,9 @@ +(node:3438004) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +scroll up from fresh bottom: changed=0.269 +(node:3438121) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +scroll up after idle at bottom: changed=0.243 +(node:3438177) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +second attempt: changed=0.210