fix(plugins): recover plugins stuck after an app ABI bump (#1380)#1444
Merged
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7b0340707d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
e03f81c to
f044302
Compare
Signed-off-by: Ngô Quốc Đạt <datlechin@gmail.com>
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.
Problem
After updating TablePro across a PluginKit ABI bump, an already-installed registry plugin (MongoDB, Cloudflare D1, etc.) becomes incompatible and the app behaves badly in two ways that look like the same "Plugin was built for PluginKit version N" error (#1380):
pluginNotInstalled("Plugin Not Installed") and a manual Install collided with the in-flight update. Users worked around it by quitting and reopening, which let reconciliation finish between sessions.plugins.jsonactually shipped a kit-15 bundle. A user on app 0.44.0 downloaded it and the app rejected it on ABI validation, with no way to recover. The build always compiles currentmain, and the registry kit version was a workflow label, not read from the served binary.Changes
Connect path (Part A)
DatabaseDriverFactory.createDrivernow awaits reconciliation when the type's plugin is installed-but-outdated, then re-checks the driver. If no compatible build exists, it throwsPluginError.pluginUpdateUnavailable(reason:)carrying the reconcile reason ("A newer version of TablePro is required...") instead of the misleading "Plugin Not Installed" prompt.RejectedPlugingainsprovidedDatabaseTypeIdsso a connect can map a database type to a stale-but-reconciling plugin. NewPluginManagerhelpers:hasOutdatedRejectedPlugin(forTypeId:),outdatedReconcileReason(forTypeId:),awaitReconciliation(). AreconciliationActiveflag bounds the wait to the first pass so a connect never blocks on a retry sleep.Registry integrity (Part B)
build-plugin.ymlnow downloads the published public asset and verifies itsInfo.plistmatches the label before the registry is updated. The existing guard only checked the local build output; this checks the bytes the registry will actually point at, so a clobbered or stale asset can't poison the registry again.Already applied (registry repo)
The poisoned kit-14 data was purged from
TableProApp/plugins(plugins.json, commit9c9715bon main): the 20 mismatched kit-14 binaries were removed, leaving each plugin with its genuine kit-15 binaries. Users still on 0.44.0 now get the honest "update TablePro" message instead of a failing download.Test plan
PluginManagerReconciliationTestscover the missing-vs-outdated decision and the reason surfacing.