feat(app): Mobile Touch Optimization#18767
Open
noahbentusi wants to merge 80 commits intoanomalyco:betafrom
Open
feat(app): Mobile Touch Optimization#18767noahbentusi wants to merge 80 commits intoanomalyco:betafrom
noahbentusi wants to merge 80 commits intoanomalyco:betafrom
Conversation
…t and message rendering When the client clock is ahead of the server, user message IDs (generated client-side) sort after assistant message IDs (generated server-side). This broke the prompt loop exit check and the UI message pairing logic. - Extract shouldExitLoop() into a pure function that uses parentID matching instead of relying on ID ordering - Extract findAssistantMessages() with forward+backward scan to handle messages sorted out of expected order due to clock skew - Remove debug console.log statements added during investigation - Add tests for both extracted functions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…t-loop-exit # Conflicts: # packages/ui/src/components/session-turn.tsx
…t-loop-exit # Conflicts: # packages/ui/src/components/session-turn.tsx
…lers Use Node's createServer for MCP OAuth callback and Codex plugin OAuth servers instead of Bun.serve, making them work under Node.js.
Use npm-install:${pkg} instead of a global npm-install lock so
concurrent installs of different packages can run in parallel.
When the lockfile exists but .bin is empty or absent, add() would read the lockfile via loadVirtual() and return early without calling reify(). Delete the lockfile before calling add() so it proceeds with a full install.
Replace tsx dependency with explicit 'node' invocation for the compiled ESLint server. Remove all BUN_BE_BUN env var references which are no longer needed after the Bun-to-Node migration.
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Npm.which now returns undefined instead of throwing when binary not found. Update all callers to check for undefined and return early. Avoid explicit union types by using a resolved variable pattern.
This restores the SIGHUP handler that was previously reverted. The handler ensures the process exits on terminal hangup (eg. closing the terminal tab), preventing long-running commands like `serve` from becoming orphaned processes.
- Replace manual subscription Map with PubSub.unbounded per instance - Per-type PubSubs + wildcard PubSub, cleaned up via addFinalizer - InstanceDisposed published before PubSub shutdown so subscribers see it - Add makeRuntime to run-service.ts (single runtime with runPromise + runFork) - Legacy facade preserved: publish/subscribe/subscribeAll same signatures - subscribe/subscribeAll fork stream consumer fibers, return interrupt function - Extract Format.file() for explicit formatting, remove event-driven subscription - Inline Format.file() calls in write/edit/apply_patch tools - Drop Bus.once (zero callers) - Keep makeRunPromise as deprecated wrapper for existing services
- Replace manual subscription Map with PubSub.unbounded per instance - Per-type PubSubs + wildcard PubSub, cleaned up via addFinalizer - InstanceDisposed published before PubSub shutdown so subscribers see it - Replace makeRunPromise with makeRuntime (single runtime with runPromise + runFork) - Update all 19 services to use makeRuntime destructuring - Legacy facade preserved: publish/subscribe/subscribeAll same signatures - subscribe/subscribeAll fork stream consumer fibers, return interrupt function - Extract Format.file() for explicit formatting, remove event-driven subscription - Inline Format.file() calls in write/edit/apply_patch tools - Drop Bus.once (zero callers)
- Add runCallback to makeRuntime (returns interrupt function directly) - Simplify forkStream to use runCallback instead of runFork + Fiber.interrupt - Add 6 bus tests covering publish/subscribe, unsubscribe, subscribeAll, and InstanceDisposed delivery on instance disposal
- Plugin: use bus.subscribeAll() Stream + forkScoped instead of callback facade - Vcs: use bus.subscribe() Stream + forkScoped instead of acquireRelease callback - Status: use bus.publish() Effect directly instead of Effect.promise wrapper - Rewrite Vcs test to use facade functions (shared memoMap ensures singleton Bus) - Add Bus integration tests for subscribe cleanup and instance disposal
66c43da to
dd0ae7f
Compare
7a46b9a to
c551d41
Compare
This was referenced Mar 27, 2026
This was referenced Apr 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue for this PR
Closes #
Type of change
What does this PR do?
This PR optimizes the OpenCode App for mobile/touch devices while preserving the existing desktop experience. It addresses 5 key pain points for mobile users:
The changes include:
These improvements enhance mobile usability by making touch interactions more intuitive and preserving the desktop experience for larger screens.
How did you verify your code works?
All features tested on mobile viewport (720×1920):
Screenshots / recordings
Mobile toolbar with overflow menu and back button visible. File tree in fullscreen mode with file content displayed.
Checklist