Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@juliusmarminge@PollyGlot@MichaelCharles@chrisdeeming
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@juliusmarminge@PollyGlot@MichaelCharles@chrisdeeming
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Merge upstream/main into fork/dev (8 commits) - #404

Merged
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14
Aug 14, 2026
Merged

Merge upstream/main into fork/dev (8 commits)#404
omegent-app[bot] merged 10 commits into
fork/devfrom
sync/upstream-2026-08-14

Conversation

@omegent-app

Copy link
Copy Markdown

8 upstream commits, nine conflicts — all mobile, concentrated in the composer and outbox files this fork rewrote for its queue feature.

The notable one

pingdotgg#6543 "steer active turns by default" removes upstream's freshThreadBusy guard from the outbox drain, converging on what this fork has done all along: hand ownership to the server, which queues follow-ups during an active turn. The fork's own comment predicted exactly that ("unlike upstream, which waits on threadBusy"), so the fork's version is kept — it is now the same behaviour, plus a "deferred" drain outcome upstream lacks. Reporting an editor hold as success used to clear retry state and spin beginDispatch → finish → effect forever, and upstream's boolean would not typecheck against the DrainOutcome the rest of that function returns.

Other resolutions

  • composerImages — the fork's iOS guard (requestMediaLibraryPermissionsAsync hard-crashes without a usage string) and upstream's Android foreground handoff (fix(mobile): prevent OTA update restart crashes pingdotgg/t3code#6324) are independent, so both are kept: catchandfinally, so a picker failure still reaches the caller and the handoff still ends.
  • SettingsRouteScreen — took upstream's runAppUpdateCheck and its new "ready" state, kept the fork's bundleLabel fallback (upstream has no bundle label and falls through to null, blanking that row here).
  • ThreadComposer — dropped upstream's re-added queueCount prop; the fork already declares it from the previous sync.
  • ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state / thread-outbox-model — fork-only queue props, state and a comment; kept.

What review caught — and what it says about the verification

Two adversarial reviews found the merge left mobile with eight typecheck errors. Worse, the workspace typecheck I had run reported clean: the vpr shim was not on PATH, so grepping its output for error TS counted an empty stream. vitest never typechecks, so the full suite stayed green the whole time. pnpm typecheck surfaces all eight.

  • T3ComposerEditor — the merge took upstream's wrapped native view (fix(mobile): preserve keyboard suggestions while typing pingdotgg/t3code#6323) but none of what it calls: the expo-paste-input wrapper import, the useNativePaste import, and the handlePaste binding. Paste-to-attach on Android would have been dead on arrival.
  • SettingsRouteScreen — upstream's helper emits an "Update ready" state the fork's local UpdateCheckState union lacks, so the setter did not match the callback and the new === "ready" branch compared non-overlapping types. Now uses the AppUpdateCheckState that was already imported; reportUpdateFailure went with the local helper it served.
  • thread-outbox-model — upstream keeps threadBusy in the contract even though fix(mobile): steer active turns by default pingdotgg/t3code#6543 stopped gating on it, and its new tests still pass it. Accepted again as an explicitly unused field rather than editing upstream's tests, so their assertions keep compiling across future syncs.
  • activeThreadBusyfix(mobile): steer active turns by default pingdotgg/t3code#6543 removed it upstream; the fork's copy was required by ThreadComposer, never read there or in ThreadDetailScreen, and superseded by sendEntersQueue. Removed end to end rather than passing a value nothing uses.

Verification

All 8 upstream commits verified present by comparing each commit's added lines against the merged tree — 100% for every one.

pnpm typecheck0 errors · pnpm test — 273 files, 0 failures · vp build in apps/web · vp check --fix.

Merge this with gh pr merge 404 --merge, not the button — the squash default is what cost us the lineage on #401. #403 adds a CI guard for exactly this.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

juliusmarmingeand others added 10 commits August 14, 2026 10:00
…gg#6325)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…the app bar (pingdotgg#6587)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
8 upstream commits, nine conflicts, all mobile — concentrated in the composer
and outbox files this fork rewrote for its queue feature.
The notable one is pingdotgg#6543 "steer active turns by default": it removes upstream's
freshThreadBusy guard from the outbox drain, converging on what this fork has
been doing all along — hand ownership to the server, which queues follow-ups
during an active turn. The fork's comment predicted exactly that, so its version
is kept: it is now the same behaviour, plus a "deferred" drain outcome that
upstream lacks. Reporting an editor hold as success used to clear retry state
and spin beginDispatch → finish → effect forever, and upstream's boolean would
not typecheck against the DrainOutcome the rest of that function returns.
Other resolutions:
- composerImages: the fork's iOS guard (requestMediaLibraryPermissionsAsync
hard-crashes without a usage string) and upstream's Android foreground handoff
(pingdotgg#6324) are independent, so both are kept — including catch *and* finally, so
a picker failure is still reported to the caller and the handoff still ends.
- T3ComposerEditor: took upstream's wrapped native view and Android
selection-change fix (pingdotgg#6323); the fork's older block referenced a setter that
upstream renamed, so it would not have compiled.
- SettingsRouteScreen: took upstream's runAppUpdateCheck and its new "ready"
state, but kept the fork's bundleLabel fallback — upstream has no bundle label
and falls through to null, which would blank that row here. Upstream replaced
its local runUpdateCheck with the shared helper, so the fork's now-unreachable
copy is removed rather than left to rot.
- ThreadComposer: dropped upstream's re-added queueCount prop; the fork already
declares it from the previous sync and it would have been a duplicate.
- ThreadDetailScreen / ThreadRouteScreen / use-thread-composer-state: fork-only
queue props and state upstream has no equivalent for; kept.
- thread-outbox-model: kept the fork's comment, which still documents the
decision now that upstream's logic matches it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…changes
Two adversarial reviews found the merge left mobile with eight typecheck
errors, and the workspace typecheck I trusted had not actually run — the
`vpr` shim was not on PATH, so grepping its output for "error TS" counted an
empty stream and reported clean. `pnpm typecheck` reports them; vitest never
typechecks, so the suite stayed green throughout.
- T3ComposerEditor: the merge took upstream's wrapped native view (pingdotgg#6323) but
none of what it calls — the `expo-paste-input` wrapper import, the
`useNativePaste` import, and the `handlePaste` binding.
- SettingsRouteScreen: upstream's `runAppUpdateCheck` reports an "Update ready"
state the fork's local `UpdateCheckState` union does not have, so the setter
did not match the callback and the new `=== "ready"` branch compared
non-overlapping types. It now uses the `AppUpdateCheckState` already imported.
`reportUpdateFailure` went with the local helper it served.
- thread-outbox-model: upstream keeps `threadBusy` in the contract even though
pingdotgg#6543 stopped gating on it, and its new tests still pass it. Accepted again as
an explicitly unused field, rather than editing upstream's tests — their
assertions then keep compiling across future syncs.
- activeThreadBusy: pingdotgg#6543 removed it upstream; the fork's copy was required by
ThreadComposer, never read there or in ThreadDetailScreen, and superseded by
`sendEntersQueue`. Removed end to end instead of passing a value nothing uses.
The drain comment predicted upstream would keep waiting on threadBusy; pingdotgg#6543
matched us, so it now says so.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Aug 14, 2026
@omegent-app
omegent-appBot merged commit 7df6506 into fork/devAug 14, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-14 branch August 14, 2026 13:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@juliusmarminge@PollyGlot@MichaelCharles@chrisdeeming