merge: sync upstream through 083fa4ab2 (15 commits) - #396
Merged
Conversation
…shift+click and show shortcut in tooltip (pingdotgg#5994) Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
…ontext menu (pingdotgg#5574) Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Thuong Tin <thuongtin@gmail.com> Co-authored-by: Kapish14 <kapishnarang01@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
pingdotgg#6189) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…gdotgg#6187) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…the sidebar footer (pingdotgg#6031) Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 15 upstream commits that landed after 9c7622d, headlined by OKLCH theme palettes (pingdotgg#6036), Copy Thread ID in the thread menus (pingdotgg#5574), shift+click to create in the current project (pingdotgg#5994), sidebar back buttons for the pull requests and usage pages (pingdotgg#6031), an hourly past-24-hour usage view (pingdotgg#6170) and mobile composer stabilization (pingdotgg#5986). Fourteen conflicts. What needed judgement: Copy Thread ID arrived upstream as pingdotgg#5574, which the fork had already built. The fork's own menu test caught the result: two "Copy thread ID" entries in the thread action menu. One entry survives, in upstream's position, and the duplicated state and handlers collapse onto upstream's naming, which is also better typed (ThreadId rather than string, no String() coercion). pingdotgg#6123 replaces the fork's thread-error dismissal with session-scoped banner masking. That supersedes rather than duplicates: it fixes the same bug the fork's version had — a dismissal that did not survive reconnects. The fork's dismissal map is removed along with the now-dead arm of resolveServerThreadError, and its dismissal tests are retargeted at upstream's helpers, which upstream ships untested. pingdotgg#5986 rewrites the mobile composer overlay. Upstream's structure is adopted whole, with the fork's queued-message chips moved inside it, and the fork's sticky empty-to-filled mount key kept over upstream's plain toggle: remounting a feed that briefly empties mid-sync reads as the conversation reloading. The fork's copy of use-thread-composer-state predates upstream's queue count and busy flag, so both are computed there and threaded through, which also brings upstream's honest "Queue" send label to the fork. The mobile home screen keeps its single title: upstream re-adds a native-stack title that would render the connection status twice against the fork's header. Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
The sticky empty-to-filled latch tracked the bare thread id while the mount key it drives is environment-scoped. Two environments can hold the same thread id, so switching between them carried "already filled" across the switch: the new feed skipped the remount it needs, and its list computed the initial scroll-to-end against a zero composer inset — the positioning bug upstream's key exists to avoid. Both now key on feedThreadKey. This is the fork's usual shape of bug: single-environment reasoning applied to a client that is deliberately multi-environment. Nothing typechecks differently and no test covers two environments sharing a thread id, so it would have shipped green. Found by the gpt-5.6-sol adversarial review. Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
pingdotgg#5986 removed the feed-local "Scroll to latest" chip and put a pill on the composer overlay. The fork had built its own chip with an unread-activity signal, and the merge kept both: two chevrons in the same band, two controls for VoiceOver, and only one of them re-arming follow on press. The fork's chip was also positioned against an estimated overlay height that does not include the queued-message chips, so with a queue it could sit underneath the overlay while the other stayed correct. Upstream's pill wins — it is the one the rest of pingdotgg#5986's geometry is built around. What the fork's chip had and upstream's does not is the distinction between "you scrolled up" and "you are missing something", so the feed now reports unread activity upward the same way it reports follow state, and the pill carries the dot and says "New activity. Scroll to end". The chip's helpers went with it rather than lingering as dead code. Found by the grok-4.5 adversarial review. Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adopts upstream through
083fa4ab2— the 15 commits after9c7622dac. Fourteen conflictedfiles, the largest batch this fork has taken.
Important
Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.
Upstream commits entering the product
083fa4ab235172010b57b1052671e355a2a344621c345220e573b16befe42ebb30a9bc41ac4780f453da7f9c5cc842c6f5b6676f9c8365b005f1e752acbf65f5fce7416The four that needed judgement
Copy Thread ID (pingdotgg#5574) — upstream shipped a feature the fork already had. The merge produced
two "Copy thread ID" entries in the thread action menu, and the fork's own menu test caught
it rather than it reaching a user. One entry survives, in upstream's position, with the state and
handlers collapsed onto upstream's naming — which is also better typed (
ThreadIdrather thanstring, noString()coercion).Thread error dismissal (pingdotgg#6123) — supersession, not duplication. The fork had its own dismissal
(a
dismissedServerErrorsByThreadKeymap feedingresolveServerThreadError). Upstream'ssession-scoped masking fixes the same bug the fork's version had: a dismissal that did not survive
a reconnect. So upstream's is adopted, the fork's map and the now-dead arm of the resolver are
removed, and the fork's dismissal tests are retargeted at upstream's helpers rather than deleted
— upstream ships those helpers untested, so deleting would have quietly dropped the coverage.
Mobile composer (pingdotgg#5986) — upstream's overlay rewrite, with the fork's chips inside it. Upstream
restructures
KeyboardStickyView, adds the scroll-to-end pill and keyboard-visibility gating; thefork's overlay carried
ComposerQueuedMessages(steering-queue chips). Upstream's structure is takenwhole and the chips moved inside it. Two follow-on repairs: the fork's copy of
use-thread-composer-statepredates upstream'sactiveThreadBusy/selectedThreadQueueCount, soboth are computed there and threaded through — which also brings the fork upstream's honest "Queue"
vs "Send" label, where the fork had hard-coded
"Send".ThreadFeed keeps the fork's sticky empty→filled mount key over upstream's plain toggle:
remounting a feed that briefly empties mid-sync reads as the conversation reloading. The fork's
unread-activity latch is woven into upstream's rebuilt
setEndFollow.Smaller:
app.config.tstakes upstream's 1.0.3 bump with the fork'sMOBILE_RUNTIME_VERSION_OVERRIDE;the mobile home screen keeps its single title, since upstream's native-stack title would render the
connection status twice against the fork's header; the release workflow stays fork-owned.
Checks I ran rather than assumed
closing braces went back by hand — the exact shape that can bury a
describeinside another andstop it running.
Sidebar.logic.test.tsgoes 129 fork + 3 upstream = 132it(blocks, allexecuting;
threadActivity.test.tsruns 22.copy-thread-identry remains, verified against the menu test.vp buildpasses.Adversarial review
Both reviewers went through all seven resolutions. Neither found a HIGH in the conflict
resolutions themselves, but between them they found two real defects I introduced — both fixed.
e5b838f94. This is the failure class exactly — two implementations, both live, fighting. Upstream's pill wins since the rest of pingdotgg#5986's geometry is built around it. What the fork's chip had that upstream's lacks is the difference between "you scrolled up" and "you are missing something", so the feed now reports unread activity upward the same way it reports follow state, and the pill carries the dot and reads "New activity. Scroll to end". The chip's helpers went with it rather than lingering17adee9de. The fork's recurring shape: single-environment reasoning in a deliberately multi-environment client. Nothing typechecks differently and no test covers two environments sharing a thread id, so it would have shipped greenChatView.tsx:1592and:6745Confirmed sound by both: exactly one
copy-thread-identry in upstream's position, dispatchedthrough the typed handler from both call sites;
resolveServerThreadErrorkeeps local-over-serverprecedence with no dismissal path left behind; the three
useStatedeclarations my removal regex ateare restored correctly with all consumers intact; the queue chips sit inside the measured
composerOverlayRefso their height still feeds the list inset, with the fork's steering, editingand start-new-thread plumbing whole;
activeThreadBusy/ queue count / the Queue-vs-Send label matchupstream; keeping the mobile route title out is right because
HomeHeaderalready owns it on bothplatforms; and the hand-restored braces close the intended blocks — no test is accidentally nested
or skipped.
Verification
CodexTextGenerationlaunch-args one,which reproduces on unmerged
fork/dev.pnpm-lock.yamlregenerated rather than hand-merged.Note
One full-suite run surfaced the pre-existing
browserHistoryStore.test.tsflake (~1 run in 3).It is not from this branch — I reproduced it earlier on clean
fork/devand atf067b34a1,before any of this work. It passes in isolation.
Co-authored by @patroza
opened by Patrick Roza in chat thread Discord · Discord · T3