fix: restore the redraws the macOS 13 port dropped and clear main's red test suite - #2940
Merged
Merged
Conversation
…onfirm typed queries
…n banner follow installs
This was referenced Sep 17, 2026
Merged
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.
macOS Testshas failed on every completed run ofmainsince v0.74.0. This clears what those runs reported, and most of what they reported was a real regression in the app rather than a stale test.One regression behind most of it
#2874 (macOS 13 support) converted every
@Observableclass toObservableObject. Observation tracks any property a view body reads.ObservableObjectpublishes only@Publishedproperties, and only to a view that holds the object as@ObservedObjector@StateObject. Wherever the conversion missed one half, the view stopped redrawing:HistoryPanelStateproperties had no@PublishedHistoryPanelViewkeeps its model in@State, which subscribes to nothing, and read the selection from thereDiagramZoomToolbarheld its viewport as a plain property; the ER diagram only hid it because its own toolbar observes the same objectHighlightRuleStorage, which nothing observed; its_ = revisionread is an Observation idiom that does nothing hereTableStructureViewobserves its session, but a change inside the session'schangeManagernever fires the session's publisherupdaterheld as a plain propertyNone of these shipped, since #2874 is unreleased, so they carry no CHANGELOG entries.
Also fixed
SuggestionController.handleKeyDownruns from a local key monitor, which AppKit consults before the main menu, and it switched on the key code alone. A chord with a real modifier now passes through. This one shipped in 0.74.0 and has a Fixed entry.TrinoStatementClientTests.testCancelStopsPollingraced its own stub.cancel()releases the statement with aDELETEfired from a detached task, and the stub served thatDELETEfrom the queue of canned pages. When it won, it took the page the in-flightGETwas waiting for; theGETgot the empty default, read it as the last page and returned before the loop checked for cancellation. Reproduced by giving theDELETEa 50 ms head start: the old stub fails 3 of 3, the fixed one passes 3 of 3.ClientBoxis also locked now, since it crosses threads.storeIsTrusted, which needs an integrity key from the system keychain the CI test host cannot reach. Both stores now take aConnectionStoreIntegrity, defaulting to.shared, and the tests pass one backed byStoredIntegrityKeySourceover an in-memory keychain. The sandboxed key path now uses the same type.OffMainActorHandlerGuardTests: the SQLite agent heartbeat handler was missing@Sendable.Tests that described old behaviour
.remoteDatabaseSessionregisters a byte counter, so it belongs in the measured set.capableContext()never sethasRowSelectionorcanDropSelectedTables.query-execute-menuand "Execute All Statements" becamequery-run-menuand "Run All Statements" in the Run split button.hasFocusraisesNSInternalInconsistencyExceptionon macOS, so focus is read from the element's ownKeyboard Focusedattribute instead.EXPLAIN QUERY PLANarrived asIN QUERY PLAN.typeQuerynow confirms the text arrived.click()on a history row, which AppKit publishes as disabled, selects it without a mouse-down, so the list never took the keyboard. Those rows are clicked by coordinate now.Verification
mainreported red passes locally, plus the fullTableProEditorpackage.QueryHistoryPanelUITests,WindowFocusUITests,QueryPlanResultUITests,DiagramKeyboardZoomUITests,HighlightRulesUITests,ImportFromAWSUITests,StructureForeignKeyEditUITests(twice),GridTimeZoneOffsetUITestsandResultMapModeUITests.QueryHistoryFocusUITestsand the Run in New Tab case need this run to confirm: a concurrentxcodebuildon the same Mac broke the automation session partway through.testCommandEqualsZoomsAClickedERDiagramfails about one run in four onmaintoo.Audit of the rest of #2874
Every class the port converted was checked against its pre-port declaration, and every SwiftUI body that reads one of the shared objects was checked for observation.
@Publishednow. Of 37, four are read by a view:PluginManager's plugin collections, so Settings > Plugins and the rejected-plugin banner did not follow an install, update or rejection. The banner also held the manager as a constant.LicenseManager.isValidating, so Check Again was never disabled during a check.MainContentCoordinator.inspectorRowContentRevision, whoseonChangecould never fire, so the inspector's JSON view went stale while a value window edited the row. It is now aPassthroughSubjectwithonReceive, not a published counter: publishing it would have redrawn every view observing the coordinator on each keystroke.Foo.shared.barread in a body on its own;ObservableObjectdoes not. 79 observations across 71 files now cover what they read:ThemeEngine32,AppSettingsManager21,LicenseManager8,DatabaseManager8,PluginManager5,MCPServerManager2, and one each forSchemaService,CustomSlashCommandStorageandTeamLibrarySyncCoordinator. Only reads that run while building the body count: reads in initializers and in action closures (onChange,task, button actions) are left alone, and so isMainContentView, whose reads build a sheet at presentation time. Without this, changing the editor or data grid font, sidebar display options, keyboard shortcuts or the license left open views as they were, and the welcome window's connection status did not follow a connect or disconnect.QueryCompletionProfileRegistrywas designed so a body depended on one scope's revision box and nothing else. After the port nothing observed the box, so a schema invalidation reached the editor only on the next keystroke. The editor now subscribes to that scope's box withonReceive. It does not observe the registry, which publishes on every fetch.Lint
MainContentCommandActionswas at 1102 lines against the 1100 limit, which failed SwiftLint onmainand would have failed the release tag's lint job. The switcher commands moved toMainContentCommandActions+Switchers.swift.