sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

sync(upstream): merge upstream/main 239ef1c54 into fork/dev - #378

Merged
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 239ef1c54 into fork/dev#378
omegent-app[bot] merged 8 commits into
fork/devfrom
sync/upstream-239ef1c54

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 239ef1c54 — the seven commits after #377, bringing fork/devlevel with
upstream/main
(HEAD..upstream/main is empty).

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

Commit
239ef1c54fix(web): show the correctly matching shortcut in new thread button's tooltip (pingdotgg#5594)
61b51ae0efeat(web): click the pin icon to unpin a thread (pingdotgg#5578)
bfc69e4b4Bump mobile app version to 1.0.2 (pingdotgg#5588)
af281c9fcfix(mobile): repair Clerk auth navigation headers (pingdotgg#5140)
bd422fd8dfix(mobile): keep Android chat text from showing through the composer (pingdotgg#5582)
33a03c8a7fix(mobile): pad scroll views above Android nav bar (pingdotgg#5415)
a17459e8afix(mobile): avoid iOS terminal reset on clear (pingdotgg#5440)

All seven verified as ancestors of the merge commit individually, not just by range.

Resolutions

Three conflicts, each a real judgement call:

WhereSituationResolution
ThreadComposer.tsxpingdotgg#5582 moves the backdrop gradient offAnimated.View onto a plain View + StyleSheet.absoluteFill, because Reanimated silently drops experimental_backgroundImage there on Android — which is the bug it fixes. The fork's gradient sat on exactly that Animated.Viewremoved from the animated node; the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98 light at 42%) moved onto upstream's backdrop, so the fork's tuning survives on the node that actually paints
app.config.tsupstream bumps version to 1.0.2; the fork wraps runtimeVersion in a MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch for OTA-to-installed-binary casesversion bumped inside the fork's IIFE; its default policy is the same fingerprint upstream documents
SidebarV2.tsxpingdotgg#5594 argues the tooltip must name chat.new, not chat.newLocaladopted — checked against handleNewThreadClick: the fork's button routes multi-project setups through the palette picker and creates immediately otherwise, i.e. exactly chat.new semantics. The fork's board and command-palette labels stay

Plus one integration fix the merge owns, found by this PR's own CI going red:

WhereSituationResolution
apps/web/vite.config.tsupstream pingdotgg#4479 adds two tests that vi.mock("react") and drive components through reactHookHarness. Upstream runs tests fully isolated; the fork's unit project sets isolate: false to reuse each worker's module graph. Under a shared registry the component graph can already be bound to the real react/compiler-runtime by an earlier file, the mock never applies, and the compiled component reports a memo-cache hit — skipping the very hooks the test asserts onboth files added to the fork's existing isolatedUnitTestFiles, where two other react-mocking tests already live

That is the whole story behind the AddProviderInstanceDialog.environment "flake": not timing (the test is synchronous) but worker scheduling deciding whether the mock lands. It failed this PR's first CI run and had flaked on earlier syncs. Three consecutive full-workspace runs are now identical (1 failed / 2,278 passed — the pre-existing Codex one).

Adversarial review

grok-4.5 and gpt-5.6-sol over the git show --cc surface with worktree access — no defects
from either.
Both independently confirmed: the gradient paints once, on the plain View only; the
override still feeds Expo's runtimeVersion; the shortcut label matches the command the button
actually invokes; and no fixture is still pinned to 1.0.1 (both checked the packages/contracts
latestVersion: "1.0.1" and identified it as unrelated Codex advisory fixture data).

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,278 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • The AddProviderInstanceDialog.environment flake is root-caused and fixed (see above), not
    retried away: three consecutive full-workspace runs now give identical results.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

justynleungand others added 8 commits August 7, 2026 10:20
Co-authored-by: codex <codex@users.noreply.github.com>
Adopts the seven upstream commits after #377: iOS terminal clear no longer
resets the session (pingdotgg#5440), Android scroll padding above the nav bar (pingdotgg#5415),
Android composer opacity (pingdotgg#5582), Clerk auth navigation headers (pingdotgg#5140), the
mobile app version bump to 1.0.2 (pingdotgg#5588), click-to-unpin (pingdotgg#5578), and the
correct new-thread shortcut in the sidebar tooltip (pingdotgg#5594).
Three resolutions:
- ThreadComposer: pingdotgg#5582 moves the backdrop gradient off Animated.View, where
Reanimated silently drops experimental_backgroundImage on Android — the very
bug it fixes. The fork's gradient was on that Animated.View, so it is removed
there and the fork's stronger lower-band stops (0.82/0.96 dark, 0.88/0.98
light) ride on upstream's plain-View backdrop instead.
- app.config: upstream's 1.0.2 version bump with the fork's
MOBILE_RUNTIME_VERSION_OVERRIDE escape hatch kept; its default policy is the
same fingerprint upstream documents.
- SidebarV2: upstream's pingdotgg#5594 label ordering (chat.new before chat.newLocal)
adopted — the fork's button has exactly the semantics upstream describes,
routing multi-project setups through the palette picker and creating
immediately otherwise. The fork's board and command-palette labels stay.
Upstream's two new react-mocking harness tests (pingdotgg#4479) are added to the fork's
isolatedUnitTestFiles. The fork's unit project runs isolate: false to reuse each
worker's module graph; upstream has no such config, so those tests assume full
isolation. Under a shared registry the component graph can already be bound to
the real react/compiler-runtime by an earlier file, the vi.mock("react") never
applies, and the compiled component reports a memo-cache hit and skips the hooks
the test asserts on. That is what made AddProviderInstanceDialog.environment
fail this PR's CI while passing in isolation. Two other react-mocking tests were
already in that list.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-239ef1c54 branch from 93c21f6 to 4fdb933CompareAugust 7, 2026 11:40
@omegent-app
omegent-appBot merged commit 25af886 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.
pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.
Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
label derivation and environmentLabelById (BoardScreen consumes it) instead
of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
solid header, and board-gated search bar, with upstream's connection-aware
brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
than also restoring upstream's native-stack title, which would surface the
connection status twice.
Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.
A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@justynleung@StoneCotton@PollyGlot@gabrielelpidio@juliusmarminge@UtkarshUsername