iOS: custom sort for the All Computers workspace list - #9828
Conversation
Workspaces from different computers have no deterministic cross-Mac order of their own, so make the aggregate order a device-local choice with three modes: Automatic (foreground Mac first, then name — the old behavior), Computer Order (user drags computers into a priority order; each computer keeps its own sidebar order), and Recent Activity (one flat list across every computer, latest lastActivityAt first). Computer Order runs in the aggregation (through the macIDsInDisplayOrder seam) so group sections and workspaces reorder together. Recent Activity runs at the presentation layer only, because time interleaving cannot keep group members contiguous; it presents flat and disables drag reorder (a derived order has no spatial move to send). The preference persists in MobileWorkspaceSortStore (injected UserDefaults, mirroring the group-collapse store) and is exposed through a Sort By picker in the workspace list filter menu, All Computers scope only, plus a drag-to-reorder Computer Order sheet. First-time picks of Computer Order auto-open the editor. Strings localized en+ja. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughWorkspace sorting now supports automatic, computer-priority, and recent-activity modes. Preferences persist locally. Workspace aggregation and iOS controls apply the selected mode, including computer-order editing and recency-specific behavior. ChangesWorkspace sorting
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant WorkspaceListView
participant MobileShellComposite
participant MobileWorkspaceSortStore
participant MobileWorkspaceAggregation
User->>WorkspaceListView: choose sorting mode or computer order
WorkspaceListView->>MobileShellComposite: submit sorting change
MobileShellComposite->>MobileWorkspaceSortStore: save preference
MobileShellComposite->>MobileWorkspaceAggregation: recompute workspace state
MobileWorkspaceAggregation-->>WorkspaceListView: provide ordered workspace state
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (2 errors, 2 warnings)
✅ Passed checks (21 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift`:
- Around line 129-130: Mark the showingComputerOrderSheet `@State` property as
private, keeping it local to the view while preserving its existing default
value and behavior.
In
`@Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListSortTests.swift`:
- Around line 202-215: Update the shellStore helper’s UserDefaults
initialization to require the suite-specific instance instead of falling back to
UserDefaults.standard. Make suite creation failure fail the test immediately,
while preserving use of the resulting suite-scoped defaults for all repositories
and stores.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 5ee3ec93-8dba-47b4-889d-d2ea81ca8eb3
📒 Files selected for processing (19)
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+WorkspaceActions.swiftPackages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swiftPackages/iOS/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceAggregation.swiftPackages/iOS/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceRecencyOrder.swiftPackages/iOS/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceSortMode.swiftPackages/iOS/CmuxMobileShellModel/Sources/CmuxMobileShellModel/MobileWorkspaceSortStore.swiftPackages/iOS/CmuxMobileShellModel/Tests/CmuxMobileShellModelTests/MobileWorkspaceAggregationTests.swiftPackages/iOS/CmuxMobileShellModel/Tests/CmuxMobileShellModelTests/MobileWorkspaceRecencyOrderTests.swiftPackages/iOS/CmuxMobileShellModel/Tests/CmuxMobileShellModelTests/MobileWorkspaceSortStoreTests.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceComputerOrderSheet.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListFilterControls.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListFilterMenuActions.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView+DragDrop.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView+Toolbar.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swiftPackages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListSortTests.swiftios/cmux/Resources/Localizable.xcstrings
| private func shellStore(pairedMacs: [MobilePairedMac]) async -> CMUXMobileShellStore { | ||
| let suiteName = "WorkspaceListSortTests-\(UUID().uuidString)" | ||
| let defaults = UserDefaults(suiteName: suiteName) ?? .standard | ||
| let store = MobileShellComposite( | ||
| isSignedIn: true, | ||
| connectionState: .disconnected, | ||
| pairedMacStore: WorkspaceMacSelectionPairedMacStore(pairedMacs), | ||
| clientIDRepository: MobileClientIDRepository(defaults: defaults), | ||
| identityProvider: WorkspaceMacSelectionIdentityProvider(userID: "user-1"), | ||
| teamIDProvider: { "team-a" }, | ||
| pairingHintDefaults: defaults, | ||
| multiMacAggregationDefaults: defaults, | ||
| groupCollapseStore: MobileWorkspaceGroupCollapseStore(defaults: defaults), | ||
| workspaceSortStore: MobileWorkspaceSortStore(defaults: defaults) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Remove the UserDefaults.standard fallback.
If suite creation fails, this test uses shared persistent defaults. The test can then read or modify state from another test or the host process. Require the suite-scoped defaults and fail the test when creation fails.
Proposed fix
- let defaults = UserDefaults(suiteName: suiteName) ?? .standard
+ let defaults = try `#require`(UserDefaults(suiteName: suiteName))🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListSortTests.swift`
around lines 202 - 215, Update the shellStore helper’s UserDefaults
initialization to require the suite-specific instance instead of falling back to
UserDefaults.standard. Make suite creation failure fail the test immediately,
while preserving use of the resulting suite-scoped defaults for all repositories
and stores.
Source: Coding guidelines
…erification Simulator windows on another Space cannot be tap-driven without stealing the user's display, so the fixture accepts CMUX_UITEST_WORKSPACE_LIST_PREVIEW_SORT and ..._SORT_PRIORITY to render each All Computers sort mode for simctl screenshot verification, matching the existing COUNT/GROUPS seeding knobs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift (1)
397-418: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftUse the shared computer-order contract for preview workspaces.
fixtureSortedWorkspacesfalls back tomodel.workspacesfor automatic mode or an empty priority list, whileMobileWorkspaceAggregation.orderedMacIDsapplies automatic fallback ordering in those cases. For partial priority lists, it falls back to original row offset; production uses foreground status, display name, device ID, and instance tag. Route preview workspaces through the shared derivation, or implement the same fallback order while preserving Mac-local workspace order.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift` around lines 397 - 418, The fixtureSortedWorkspaces implementation must match MobileWorkspaceAggregation.orderedMacIDs for automatic and empty-priority modes instead of returning model.workspaces directly, and for partial priority lists must use the production fallback ordering (foreground status, display name, device ID, then instance tag) while preserving order among workspaces on the same Mac. Route the preview data through the shared derivation where possible; otherwise replicate that contract in fixtureSortedWorkspaces.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift`:
- Around line 397-418: The fixtureSortedWorkspaces implementation must match
MobileWorkspaceAggregation.orderedMacIDs for automatic and empty-priority modes
instead of returning model.workspaces directly, and for partial priority lists
must use the production fallback ordering (foreground status, display name,
device ID, then instance tag) while preserving order among workspaces on the
same Mac. Route the preview data through the shared derivation where possible;
otherwise replicate that contract in fixtureSortedWorkspaces.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 29a3c4f8-6ab9-4db5-b0c6-46a0f7933606
📒 Files selected for processing (1)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift
The sort section hid whenever fewer than two computers had workspace rows on screen, so a paired-but-offline (or connection-wedged) secondary Mac made the control undiscoverable exactly when cross-computer order matters. Gate on distinct known computers instead: machines with visible rows plus every paired Mac. The computer-order editor now also lists paired-but- offline computers so they keep their slot while disconnected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift`:
- Around line 260-273: Update computerOrderSheetMachines to deduplicate the
initial filterMachines collection by physical macDeviceID before sorting or
merging paired Macs. Retain one representative ID per macDeviceID, while
preserving separate entries only when distinct build-label instances are
required, so workspaceComputerPriority receives no duplicate physical-Mac IDs.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 7c31d707-bd04-4aca-a6ea-3e9a7464dea3
📒 Files selected for processing (3)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListFilterControls.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swiftPackages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListSortTests.swift
The preference is worth setting before a second computer pairs, and any count gate hides the control behind connection state (a wedged secondary Mac already did once). All Computers scope alone decides visibility now. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sort hidden inside a filter-icon menu was undiscoverable, and a text-only 'Computer Order' label communicates nothing. Replace the filter Menu with a menu-styled popover whose top row is three drawn schematic tiles, each a miniature of what the mode does to the list (computer sections; ranked sections with drag grips; a flat time-stamped run), with Mail-style radio checks. Selection re-sorts the list live behind the card. The computer- order editor presents from the card itself, and the filter rows (read state, machines) share it, keeping one entry point. UIMenu rows only render text plus icon-sized images, hence a popover rather than a Menu. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift`:
- Around line 129-130: Resolve the private_swiftui_state warning for
showingViewOptionsPopover in WorkspaceListView without breaking its access from
viewOptionsButton in WorkspaceListView+Toolbar.swift: either move
viewOptionsButton into the same file and make the state private, or retain
internal access and add a targeted next-line SwiftLint suppression documenting
the cross-file usage.
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView`+Toolbar.swift:
- Around line 28-38: The DEBUG onAppear branch checks
CMUX_UITEST_WORKSPACE_LIST_PREVIEW_VIEW_OPTIONS, but the preview fixture uses
CMUX_UITEST_WORKSPACE_LIST_PREVIEW. Update the layout-preview fixture/config
path to assign the checked variable when the popover preview is intended, or
remove the onAppear branch if it is not needed.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 360c7292-6abc-4238-ac25-9446ca90ad73
📒 Files selected for processing (5)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListFilterControls.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListFilterMenuActions.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView+Toolbar.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListViewOptionsPopover.swift
| /// Presents the view-options card (sort tiles + filter rows). | ||
| @State var showingViewOptionsPopover = false |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Resolve the private_swiftui_state warning without breaking access.
SwiftLint reports private_swiftui_state on line 130. showingViewOptionsPopover is written from viewOptionsButton in WorkspaceListView+Toolbar.swift, so adding private or fileprivate will not compile. Choose one of these:
- Move
viewOptionsButtoninto this file and mark the propertyprivate. - Keep the property internal and add a targeted
// swiftlint:disable:next private_swiftui_statewith the cross-file reason.
The same rule was raised earlier for the removed showingComputerOrderSheet property.
🧰 Tools
🪛 SwiftLint (0.65.0)
[Warning] 130-130: SwiftUI state properties should be private
(private_swiftui_state)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift`
around lines 129 - 130, Resolve the private_swiftui_state warning for
showingViewOptionsPopover in WorkspaceListView without breaking its access from
viewOptionsButton in WorkspaceListView+Toolbar.swift: either move
viewOptionsButton into the same file and make the state private, or retain
internal access and add a targeted next-line SwiftLint suppression documenting
the cross-file usage.
Source: Linters/SAST tools
|
Design update after dogfood feedback: sort moved out of the plain filter menu into a Mail-style view-options card (menu-styled popover) whose top row is three illustrated tiles, each a miniature rendering of what the mode does to the list (computer sections / rank-badged sections with drag grips / flat time-stamped rows) with radio checks. Selection re-sorts the list live behind the card; the computer-order editor presents from the card; read-state and machine filter rows share it. A UIMenu can only render text plus icon-sized images, hence a popover rather than a Menu. Also: the sort control now shows regardless of computer count (a wedged secondary-Mac connection previously hid it), and the order editor lists paired-but-offline computers so they keep their slot. |
Drop the machines filter section (the title picker already owns computer selection), make selecting Computer Order inert (the editor opens only from the explicit Edit Computer Order row), inset the schematic rank badges off the tile border, and use regular-weight selection checkmarks. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The popover inherits the presenting toolbar button's font environment, so rows rendered with toolbar weight; set body + regular at the card root. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
'Automatic' says nothing; 'Connected First' states the rule: the connected computer leads, the rest follow by name. Raw value and persistence keep the automatic spelling. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
'Automatic'/'Connected First' mislabeled the rule and the alphabetical tail matched no user model. The mode is now Last Opened: the connected computer counts as opened now, the rest order by when this device last used them (pairing lastSeenAt as the device-local record), never-opened computers alphabetical last. Raw value and persistence keep 'automatic'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…seed Cursor: the Last Opened order read pairedMacs.lastSeenAt but a pairing refresh never rebuilt the derived list, so the aggregate order went stale until the next workspace event; recompute on pairedMacs change (the derivation already depended on pairedMacs for customization stamping). Also seed the computer-order editor from the aggregated rows instead of the filter-menu machine list, which empties below its two-machine floor and would drop a singleton computer or mismatch the tail order. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 89c0545. Configure here.
| id: representativeID, | ||
| macDeviceID: representativeID, | ||
| instanceTag: nil, | ||
| name: names[representativeID] ?? mac.resolvedName, |
There was a problem hiding this comment.
Order sheet stores pairing IDs
Medium Severity
computerOrderSheetMachines now assigns deviceRepresentativeID (a pairing id that can include an instance tag) to WorkspaceFilterMachine.macDeviceID. The order sheet persists that field as computer priority, which is documented and ranked as a physical Mac device id. Tagged builds therefore save unstable ids; after the preferred instance changes, alias expansion can miss and Computer Order stops applying for that Mac. The previous filterMachines path used the convenience initializer that strips the tag via pairingIdentity.
Reviewed by Cursor Bugbot for commit 89c0545. Configure here.


Workspaces from different computers have no deterministic cross-Mac ordering of their own (each Mac only owns its sidebar order), so this makes the aggregate order a device-local, user-controlled choice. A new Sort By section in the workspace-list filter menu (All Computers scope only, 2+ computers) offers three modes:
lastActivityAtfirst, pinned rows first, stable ties.Mechanism: Computer Order runs inside
MobileWorkspaceAggregationthrough themacIDsInDisplayOrderseam #9509 added, so group sections and their member rows reorder together and aggregate→Mac-local RPC translation is untouched. Recent Activity runs at the presentation layer only (MobileWorkspaceRecencyOrder), because time interleaving across Macs cannot keep one Mac's group members contiguous; it presents flat (like search/filter already do) and disables drag reorder, since a timestamp-derived order has no spatial move to send. The preference persists device-locally inMobileWorkspaceSortStore(injectedUserDefaults, mirroring the group-collapse store) and never syncs to a Mac. A single-machine scope is unaffected: its order stays the Mac's own sidebar order.Localization audit: new strings
mobile.workspaces.sort(.automatic/.computerOrder/.recentActivity/.editOrder/.order.title/.order.footer) added en+ja; the sheet's Done button reusesmobile.common.done.Tests: aggregation priority ordering (override-foreground, unknown/empty ids, sibling-build adjacency, group-follows-workspace), sort-store persistence (corrupt payload, unknown future mode preserved), recency order (pinned-first, nil-timestamp-last, stable ties) in
CmuxMobileShellModelTests; scope gating, grouped-section flattening, reorder disable, and sheet ordering inCmuxMobileShellUITests.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Note
Low Risk
Presentation-layer and device-local UserDefaults preferences with broad test coverage; no Mac RPC or auth changes. Main risk is list-order edge cases (offline Macs, alias IDs, grouped vs flat modes).
Overview
Adds device-local sorting for the aggregated All Computers workspace list, with preferences stored in
MobileWorkspaceSortStoreand never synced to Macs.Three modes: Last Opened (default
automatic—connected Mac first, thenlastSeenAtrecency), Computer Order (user-ranked Macs via drag sheet; aggregation honors priority ahead of foreground), and Recent Activity (flat cross-Mac list bylastActivityAt, pinned first).UI: The workspace filter toolbar control opens a view-options popover with illustrated sort tiles plus read-state filters; Computer Order exposes Edit Computer Order… for the reorder sheet. Sort controls appear in All Computers scope only; single-Mac views keep the Mac sidebar order. Recent Activity flattens groups and disables drag reorder.
Shell wiring:
MobileShellCompositepersists mode/priority, expands alias IDs for priority, and rebuilds derived workspace state when pairing or sort prefs change. Tests cover aggregation, store persistence, recency ordering, and list gating.Reviewed by Cursor Bugbot for commit 89c0545. Bugbot is set up for automated code reviews on this repo. Configure here.
Summary by cubic
Adds device‑local sorting to the All Computers workspace list with three modes: Last Opened (default), Computer Order, and Recent Activity. On iOS, a Mail‑style view‑options popover with illustrated tiles replaces the filter button; changes apply live.
New Features
lastSeenAt); never‑opened Macs alphabetical last. UI label is “Last Opened” (raw value remainsautomatic).lastActivityAt; pinned first; stable ties; drag‑reorder disabled. Single‑Mac scopes keep that Mac’s sidebar order.MobileWorkspaceSortStore(UserDefaults).MobileShellCompositemirrors mode/priority and expands alias IDs. Aggregation orders viaorderedMacIDs(..., computerPriority:, lastOpenedAt:);.recentActivityruns in the view viaMobileWorkspaceRecencyOrder. Previews can seed mode/priority and auto‑open the popover. en/ja strings updated.Bug Fixes
Written for commit 89c0545. Summary will update on new commits.
Summary by CodeRabbit
New Features
Bug Fixes