diff --git a/apps/web/public/extensions/registry.json b/apps/web/public/extensions/registry.json index 7dbc53b2..b340c4fe 100644 --- a/apps/web/public/extensions/registry.json +++ b/apps/web/public/extensions/registry.json @@ -1,6 +1,6 @@ { "registryVersion": "1", - "updatedAt": "2026-09-08T16:21:56.000Z", + "updatedAt": "2026-09-08T16:40:19.000Z", "entries": [ { "id": "org.edgeever.plugins.ai-rss", @@ -15,10 +15,10 @@ "repositoryUrl": "https://github.com/tianma-if/edgeever-ai-rss" }, "verification": { - "version": "0.5.2", + "version": "0.5.3", "checksums": { - "manifestJson": "b8063f246730da33f9cee342670ca776c9319eb5a07585cb44f8641d49caa989", - "mainJs": "46bc00002a647f1f087ac2444e02192ec5ae2d1f04719e027de9386e8bf04934", + "manifestJson": "b164bf6ab199f0ef4282319dd87294a876ef3e7701962bae35a7b65c4e3c1156", + "mainJs": "7828d256ad758f85bd736742a72cac62ba46db6a2108c3a974bf9f429fcc3be4", "stylesCss": "05cd135a1fe70c3f38d34850a2e9abf6b0c0530b09477960036f567375b2082e" } } diff --git a/apps/web/src/components/WorkspaceApp.tsx b/apps/web/src/components/WorkspaceApp.tsx index c4dc2612..9231639e 100644 --- a/apps/web/src/components/WorkspaceApp.tsx +++ b/apps/web/src/components/WorkspaceApp.tsx @@ -100,7 +100,7 @@ import { useWorkspacePreferences } from "@/hooks/useWorkspacePreferences"; import { useWorkspaceSelection } from "@/hooks/useWorkspaceSelection"; import { useWorkspaceQueuedSync } from "@/hooks/useWorkspaceQueuedSync"; import { EdgeEverPluginHost, type RegisteredPluginPanel } from "@/lib/plugins/plugin-host"; -import { loadPluginMarketplace } from "@/lib/plugins/plugin-marketplace"; +import { loadResolvedPluginMarketplace } from "@/lib/plugins/plugin-marketplace"; import { updateOfficialMarketplacePlugins } from "@/lib/plugins/plugin-updates"; import { createPublicNetworkAdapter } from "@/lib/plugins/public-network-adapter"; import { clearRendererRecoveryRequired, isRendererRecoveryRequired } from "@/lib/renderer-recovery"; @@ -803,8 +803,12 @@ export const WorkspaceApp = ({ if (!active || running) return; running = true; try { - const marketplace = await loadPluginMarketplace(); + const marketplace = await loadResolvedPluginMarketplace(); const result = await updateOfficialMarketplacePlugins(pluginHost, marketplace.entries); + const firstResolutionError = Object.entries(marketplace.resolutionErrors)[0]; + if (firstResolutionError) { + console.error(`Official plugin ${firstResolutionError[0]} update resolution failed.`, firstResolutionError[1]); + } if (active && result.updated.length > 0) { setAppNoticeDialog({ title: t("plugins.noticeTitle"), diff --git a/apps/web/src/components/settings/PluginManagerCard.test.mjs b/apps/web/src/components/settings/PluginManagerCard.test.mjs index 8c0f2f8a..528b3d08 100644 --- a/apps/web/src/components/settings/PluginManagerCard.test.mjs +++ b/apps/web/src/components/settings/PluginManagerCard.test.mjs @@ -16,4 +16,9 @@ describe("plugin manager card layout", () => { expect(source).toContain("href={entry.repositoryUrl}"); expect(source).toContain("href={extension.source.repositoryUrl}"); }); + + test("shows update checks when marketplace plugins exist without installed extensions", () => { + expect(source).toContain("snapshot.extensions.length > 0 || (marketplaceQuery.data?.entries.length ?? 0) > 0"); + expect(source).not.toContain("{snapshot.extensions.length > 0 ? (\n (null); const [pendingUpdate, setPendingUpdate] = useState(null); const [pendingTrustPluginId, setPendingTrustPluginId] = useState(null); - const marketplaceQuery = useQuery({ queryKey: ["plugin-marketplace", "v1"], queryFn: () => loadPluginMarketplace(), staleTime: 5 * 60_000 }); + const marketplaceQuery = useQuery({ queryKey: ["plugin-marketplace", "v1"], queryFn: () => loadResolvedPluginMarketplace(), staleTime: 5 * 60_000 }); const extensionVersionKey = snapshot.extensions .map((extension) => `${extension.manifest.id}:${extension.manifest.version}:${extension.source.kind}`) .join("|"); @@ -374,8 +374,11 @@ export const PluginManagerCard = ({ ["plugin-updates", extensionVersionKey, refreshedMarketplace.data?.updatedAt ?? "unavailable"], result, ); - setLastManualCheckCount(result.updates.length); - const firstCheckError = Object.values(result.errors)[0]; + const firstCheckError = Object.values({ + ...(refreshedMarketplace.data?.resolutionErrors ?? {}), + ...result.errors, + })[0]; + setLastManualCheckCount(firstCheckError ? null : result.updates.length); if (firstCheckError) setError(t("plugins.updates.checkFailed", { message: firstCheckError })); } catch (checkError) { setError(checkError instanceof Error ? checkError.message : String(checkError)); @@ -423,7 +426,7 @@ export const PluginManagerCard = ({
- {snapshot.extensions.length > 0 ? ( + {snapshot.extensions.length > 0 || (marketplaceQuery.data?.entries.length ?? 0) > 0 ? (