Repository navigation
Use native workspace-only bottom search on iOS - #8645
Conversation
|
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 and notification search state is shared through iOS shells and tab scaffolds. iOS 26 adds a dedicated search tab, notification feeds filter searchable content with localized empty states, previews and navigation are updated, and regression tests cover persistence and filtering. ChangesWorkspace and notification search experience
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Sequence Diagram(s)sequenceDiagram
participant User
participant WorkspaceShellView
participant MobilePrimaryTabScaffold
participant NotificationFeedView
participant NotificationFeedProjection
User->>WorkspaceShellView: Open primary tabs
WorkspaceShellView->>MobilePrimaryTabScaffold: Bind workspace and notification search text
User->>MobilePrimaryTabScaffold: Select Search tab
MobilePrimaryTabScaffold->>NotificationFeedView: Apply notification searchable query
NotificationFeedView->>NotificationFeedProjection: Update searchText
NotificationFeedProjection->>NotificationFeedView: Return filtered notification sections
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (3 errors, 1 warning, 1 inconclusive)
✅ Passed checks (20 passed)
✨ Finishing Touches🧪 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 |
Greptile SummaryThis PR adds native workspace-only search on iOS 26 and expands the mobile notification feed. The main changes are:
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (52): Last reviewed commit: "fix(ios): use native task composer toolb..." | Re-trigger Greptile |
| .onChange(of: isVisible) { _, visible in | ||
| guard !visible else { return } | ||
| searchText = "" | ||
| isPresented = false | ||
| } |
There was a problem hiding this comment.
Hidden Control Erases Shared Query
When navigation, a tab switch, or a compact-to-split layout change hides this root-only control, this observer clears the shell-owned query. The native split search then receives an empty binding, and returning to Workspaces loses the user's filter even though only the presentation changed.
Rule Used: Flag Swift fixes that patch symptoms while leaving... (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
| .overlay(alignment: .bottomTrailing) { | ||
| if isVisible { | ||
| WorkspaceListBottomSearchControl( | ||
| searchText: $searchText, | ||
| isPresented: $isPresented, | ||
| taskComposerAction: taskComposerAction | ||
| ) | ||
| .padding(.bottom, 8) |
There was a problem hiding this comment.
Overlay Can Cover Tab Controls
On the iOS 26 compact root, this modifier overlays a 52-point control only eight points above the bottom of the entire TabView, where the floating tab bar also renders. If the tab bar occupies that trailing area, the search control can overlap its buttons and intercept primary tab navigation; the placement should use the tab-bar accessory or safe-area layout supplied by the platform instead of an unrestricted overlay.
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/WorkspaceListSearchHost.swift`:
- Around line 97-107: Update the isPresented change handling in
WorkspaceListSearchHost to avoid relying on Task.yield scheduling before setting
searchIsFocused. Keep the TextField mounted while toggling its visibility, or
trigger focus from a presentation-completion signal so focus occurs reliably
after presentation.
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift`:
- Around line 696-715: Refactor taskComposerButtonOverlay so the iOS
availability and usesCompactStack conditions produce a single boolean
determining whether the button is shown, then render one TaskComposerButton with
its existing action and padding modifiers. Preserve the current behavior: show
it when taskComposerEnabled and workspaceSearchIsPresented is false, except on
iOS 26+ when usesCompactStack is true.
🪄 Autofix (Beta)
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
Run ID: 89b83adb-e8a8-4ed2-b1b4-c25163a8a44e
📒 Files selected for processing (6)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/TaskComposer/TaskComposerButton.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swiftios/cmux/Resources/Localizable.xcstringsios/cmuxUITests/cmuxUITests.swift
| .onChange(of: isPresented, initial: true) { _, presented in | ||
| guard presented else { | ||
| searchIsFocused = false | ||
| return | ||
| } | ||
| Task { @MainActor in | ||
| await Task.yield() | ||
| guard isPresented else { return } | ||
| searchIsFocused = true | ||
| } | ||
| } |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🌐 Web query:
Does SwiftUI FocusState require the focused view to already be mounted, or is a Task.yield after presenting it a common workaround?
💡 Result:
Yes, SwiftUI FocusState effectively requires the target view to be mounted and rendered within the view hierarchy before it can successfully accept focus [1]. When you attempt to set focus programmatically (e.g., in onAppear) before the view has fully finished its layout or navigation transition, the operation is often ignored because the view's focus node has not yet been established [1][2]. Using a delay, such as Task.yield or Task.sleep, is a widely recognized and common workaround for this behavior [3][4][5][6]. Because SwiftUI's focus system manages focus nodes during the rendering pass, waiting until the next turn of the run loop or allowing the view hierarchy to stabilize ensures that the target view is ready to become the first responder [1][4][2]. Common implementations include: 1. Using the.task modifier: This is often preferred over onAppear as it is designed for asynchronous operations [3][4]. 2. Introducing an asynchronous delay: Wrapping the focus assignment in Task { await Task.yield; focus =... } or a short Task.sleep allows the view hierarchy sufficient time to complete its setup [3][1][5][6]. While sometimes effective, relying on these delays is often necessary due to the way SwiftUI synchronizes focus state with the underlying platform's responder chain, particularly during initial view loading or navigation transitions [1][2][7].
Citations:
- 1: https://dev.to/sebastienlato/swiftui-focus-system-keyboard-internals-25i5
- 2: https://stackoverflow.com/questions/68073919/swiftui-focusstate-how-to-give-it-initial-value
- 3: https://stackoverflow.com/questions/79825395/swiftui-focusstate-doesn-t-focus-a-desired-textfield
- 4: https://developer.apple.com/forums/thread/681962
- 5: Setting a Text Field's Focus on Launch diegolavalle/website#4
- 6: https://soarias.com/swiftui/how-to-implement-keyboard-handling/
- 7: https://stackoverflow.com/questions/74150297/why-doesnt-value-of-swiftuis-focusstate-property-change-immediately-after-bei
🏁 Script executed:
sed -n '1,180p' Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swiftRepository: manaflow-ai/cmux
Length of output: 6344
🏁 Script executed:
sed -n '180,320p' Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swiftRepository: manaflow-ai/cmux
Length of output: 1632
Avoid yielding before focusing the search field
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swift:97-107
TextField is only inserted when isPresented becomes true, so Task { await Task.yield(); searchIsFocused = true } still depends on scheduling to win the mount race. Keep the field mounted and toggle visibility, or drive focus from a presentation-completion signal instead.
🤖 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/WorkspaceListSearchHost.swift`
around lines 97 - 107, Update the isPresented change handling in
WorkspaceListSearchHost to avoid relying on Task.yield scheduling before setting
searchIsFocused. Keep the TextField mounted while toggling its visibility, or
trigger focus from a presentation-completion signal so focus occurs reliably
after presentation.
Source: Coding guidelines
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/WorkspaceListSearchHost.swift`:
- Around line 39-46: Add the three mobile localization
keys—mobile.workspaces.search.placeholder,
mobile.taskComposer.button.accessibilityLabel, and
mobile.taskComposer.button.accessibilityHint—to every supported locale in the
project’s referenced string catalog(s), preserving the existing English and
Japanese entries and providing valid localized values for all remaining locales.
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift`:
- Around line 356-358: Consolidate the repeated task-composer presentation
closure into a single shared openTaskComposer method or computed closure in
WorkspaceShellView. Replace the taskComposerAction in stackLayout and both
actions in taskComposerButtonOverlay with this shared action, preserving the
existing isTaskComposerPresented = true behavior.
🪄 Autofix (Beta)
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
Run ID: 496f295d-2daf-42e9-9982-054a3de0c518
📒 Files selected for processing (5)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swiftios/cmux/Resources/Localizable.xcstringsios/cmuxUITests/cmuxUITests.swift
💤 Files with no reviewable changes (1)
- ios/cmux/Resources/Localizable.xcstrings
| .searchable( | ||
| text: $searchText, | ||
| prompt: L10n.string( | ||
| "mobile.workspaces.search.placeholder", | ||
| defaultValue: "Search workspaces" | ||
| ) | ||
| ) | ||
| .searchToolbarBehavior(.minimize) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
fd -a Localizable.xcstrings
python3 - <<'PY'
import json
path = "ios/cmux/Resources/Localizable.xcstrings"
try:
data = json.load(open(path))
except FileNotFoundError:
print("xcstrings file not found at expected path")
raise SystemExit(0)
keys = [
"mobile.workspaces.search.placeholder",
"mobile.taskComposer.button.accessibilityLabel",
"mobile.taskComposer.button.accessibilityHint",
]
for k in keys:
entry = data.get("strings", {}).get(k)
if entry is None:
print(f"MISSING KEY: {k}")
continue
locs = entry.get("localizations", {})
print(f"{k}: locales={sorted(locs.keys())}")
PYRepository: manaflow-ai/cmux
Length of output: 1502
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== L10n/localization code around WorkspaceListSearchHost =="
fd -a WorkspaceListSearchHost.swift . | sed 's#^\./##' | while read -r f; do
echo "--- $f"
wc -l "$f"
nl -ba "$f" | sed -n '1,120p'
done
echo "== referenced xcstrings size/tops =="
wc -l ios/cmux/Resources/Localizable.xcstrings Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/Localizable.xcstrings
echo "== targeted key occurrences =="
rg -n "mobile\.workspaces\.search\.placeholder|mobile\.taskComposer\.button\.accessibility" -S .
echo "== xcstrings key entries =="
python3 - <<'PY'
import json, pathlib
for path in ["ios/cmux/Resources/Localizable.xcstrings", "Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/Localizable.xcstrings"]:
p=pathlib.Path(path)
print(f"--- {path}")
if not p.exists():
print("missing")
continue
data=json.loads(p.read_text())
for k in ["mobile.workspaces.search.placeholder","mobile.taskComposer.button.accessibilityLabel","mobile.taskComposer.button.accessibilityHint"]:
entry=data.get("strings",{}).get(k)
if entry:
locs=entry.get("localizations",{})
print(k)
for loc,(translated,unit) in locs.items():
s=unit.get("stringUnit",{})
print(f" {loc}: value={s.get('value')!r}")
else:
print(f"MISSING {k}")
PYRepository: manaflow-ai/cmux
Length of output: 473
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== WorkspaceListSearchHost.swift locations and key occurrences =="
fd -a WorkspaceListSearchHost.swift .
echo
for f in $(fd WorkspaceListSearchHost.swift .); do
echo "--- $f"
cat -n "$f" | sed -n '1,120p'
done
echo "== localized key search across all tracked Swift files =="
rg -n "mobile\.workspaces\.search\.placeholder|mobile\.taskComposer\.button\.accessibility" -S --glob '*.swift' . || true
echo "== supported locale entries in referenced xcstrings =="
python3 - <<'PY'
import json, pathlib
for path in ["ios/cmux/Resources/Localizable.xcstrings", "Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/Resources/Localizable.xcstrings"]:
p=pathlib.Path(path)
print(f"--- {path}")
if not p.exists():
print("missing")
continue
try:
data=json.loads(p.read_text())
except Exception as e:
print(f"json error: {e}")
continue
metas=data.get("metalizations",{}) or data.get("manifest",{}).get("localizations",{}) or data.get("localizations",{})
print("top meta keys:", sorted(data.keys()))
print("localizations:", sorted(metas.keys()) if isinstance(metas, dict) else type(metas).__name__)
for k in ["mobile.workspaces.search.placeholder","mobile.taskComposer.button.accessibilityLabel","mobile.taskComposer.button.accessibilityHint"]:
entry=data.get("strings",{}).get(k)
if entry:
print(k, "localizations=", sorted(entry.get("localizations",{}).keys()))
for loc,unit in sorted(entry.get("localizations",{}).items()):
print(f" {loc}:", repr(unit.get("stringUnit",{}).get("value")))
else:
print("MISSING", k)
PYRepository: manaflow-ai/cmux
Length of output: 5905
Add the new mobile localization key entries to every supported locale.
L10n.string now uses these keys, but the catalog only contains en and ja entries. Extend mobile.workspaces.search.placeholder, mobile.taskComposer.button.accessibilityLabel, and mobile.taskComposer.button.accessibilityHint to all supported locales in the referenced string catalog(s) to avoid broken fallback for unsupported locales.
🤖 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/WorkspaceListSearchHost.swift`
around lines 39 - 46, Add the three mobile localization
keys—mobile.workspaces.search.placeholder,
mobile.taskComposer.button.accessibilityLabel, and
mobile.taskComposer.button.accessibilityHint—to every supported locale in the
project’s referenced string catalog(s), preserving the existing English and
Japanese entries and providing valid localized values for all remaining locales.
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)
ios/cmuxUITests/cmuxUITests.swift (1)
5044-5047: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winReplacing "Return" with "Search" in the default keyboard-dismiss fallback list risks breaking dismissal for other fields.
dismissKeyboard(in:)'s default fallback list drops"Return"in favor of"Search". This list is shared bytap(_:in:),typeText, andreplaceText, which back dozens of pre-existing tests against plain single-line fields (prompts, folder search's non-add-device paths, template names, etc.) that typically show a"Return"-labeled key, not"Done"/"Search"/"Next". Narrowing the list (instead of adding"Search"alongside"Return") can silently leave the keyboard up for those fields going forward.🐛 Proposed fix
let fallbackLabels = preferAddDeviceAccessoryDoneButton ? ["Done", "Return", "Next"] - : ["Done", "Search", "Next"] + : ["Done", "Return", "Search", "Next"]🤖 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 `@ios/cmuxUITests/cmuxUITests.swift` around lines 5044 - 5047, Update the default fallback labels in dismissKeyboard(in:) to retain "Return" and add "Search" alongside the existing labels, while preserving the preferAddDeviceAccessoryDoneButton-specific behavior. Ensure shared callers such as tap(_:in:), typeText, and replaceText continue dismissing keyboards for fields exposing a "Return" key.
🤖 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 `@ios/cmuxUITests/cmuxUITests.swift`:
- Around line 5044-5047: Update the default fallback labels in
dismissKeyboard(in:) to retain "Return" and add "Search" alongside the existing
labels, while preserving the preferAddDeviceAccessoryDoneButton-specific
behavior. Ensure shared callers such as tap(_:in:), typeText, and replaceText
continue dismissing keyboards for fields exposing a "Return" key.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 6e47c04a-a8fd-46f4-83ac-806512f108fb
📒 Files selected for processing (6)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobilePrimaryTabScaffold.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListSearchHost.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swiftios/cmuxUITests/cmuxUITests.swift
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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 `@ios/cmuxUITests/cmuxUITests.swift`:
- Around line 452-481: Update the search button frame snapshots in the test
around searchButton to use waitForUsableFrame instead of reading frame directly
after existence. Apply it to both the initial snapshot and the final frame
before comparing them, while preserving the existing existence and equality
assertions.
- Around line 410-418: Update the filtering assertions in
ios/cmuxUITests/cmuxUITests.swift at lines 410-418 and 540-547: before
searching, assert the relevant fixture rows are hittable; afterward, require the
expected matching row to become or remain hittable rather than relying on
waitForNotHittable. Preserve the existing workspace-tab and keyboard-dismissal
flow while using real visibility/hittability completion signals to prove
filtering.
- Around line 5194-5196: Update the fallbackLabels definition in the
dismissKeyboard flow to retain “Return” as a generic keyboard fallback while
also adding “Search” for search keyboards; do not replace or remove the existing
“Return” label.
🪄 Autofix (Beta)
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: 62e2d330-1519-494e-9bb3-c1b973c21abf
📒 Files selected for processing (11)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobilePrimaryTabScaffold.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedProjection.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedStatusView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedStoreView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swiftPackages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/NotificationFeedProjectionTests.swiftios/cmux/Resources/Localizable.xcstringsios/cmuxUITests/cmuxUITests.swift
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/NotificationFeedProjection.swift`:
- Around line 76-127: Add a brief doc comment immediately above scheduleRebuild
describing its debounce behavior, sourceRevision-keyed index caching,
cancellation, and the invariant that only a task whose captured rebuildRevision
and sourceRevision still match self may write results. Keep the implementation
unchanged.
🪄 Autofix (Beta)
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: a505a220-c920-4a47-b099-e55940289033
📒 Files selected for processing (3)
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedProjection.swiftPackages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/NotificationFeedStatusView.swiftPackages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/NotificationFeedProjectionTests.swift
| private func beginSearchDeactivation(for scope: MobilePrimarySearchScope) { | ||
| searchPhase = .deactivating(scope) | ||
| pendingEmptyCommit = nil | ||
| syncNativeSearchText(fromCommittedQueryFor: scope) | ||
| } |
There was a problem hiding this comment.
When the user clears a non-empty query and then dismisses search, commitNativeSearchText leaves the clear in pendingEmptyCommit. This deactivation path deletes that pending change and copies the old committed query back into the native field. Reopening search therefore restores the query the user explicitly cleared. The lifecycle state needs to preserve queries on presentation-only dismissal without treating a user clear as presentation cleanup.
Rule Used: Flag Swift fixes that patch symptoms while leaving... (source)
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Summary
Verification
Summary by CodeRabbit
New Features
Bug Fixes
Tests