diff --git a/ui/src/pages/plugins/plugins-page.test.ts b/ui/src/pages/plugins/plugins-page.test.ts index 2169a47d16c4..65aefcb82512 100644 --- a/ui/src/pages/plugins/plugins-page.test.ts +++ b/ui/src/pages/plugins/plugins-page.test.ts @@ -260,6 +260,8 @@ describe("PluginsPage", () => { await waitForFast(() => expect(request.mock.calls.filter(([method]) => method === "plugins.install")).toHaveLength(2), ); + await page.install("clawhub:@openclaw/lobster", installRequest); + expect(request.mock.calls.filter(([method]) => method === "plugins.install")).toHaveLength(2); expect(page.messages[rowKey]?.installPolicyWarning).toBeDefined(); page.messages["plugin:workboard"] = { kind: "success", text: "Unrelated message." }; @@ -369,50 +371,6 @@ describe("PluginsPage", () => { expect(page.result?.plugins[0]?.installed).toBe(false); }); - it("deduplicates an active install across catalog and ClawHub search rows", async () => { - const pendingInstall = deferred(); - const { client, request } = createClient(async (method) => { - if (method === "plugins.install") { - return pendingInstall.promise; - } - if (method === "plugins.list") { - return createResult( - createPlugin({ id: "lobster", name: "Lobster", installed: true, enabled: true }), - ); - } - throw new Error(`Unexpected method ${method}`); - }); - const harness = createGateway(client); - const catalog = createResult( - createPlugin({ - id: "lobster", - name: "Lobster", - installed: false, - install: { source: "clawhub", packageName: "@openclaw/lobster" }, - }), - ); - const { page } = await mountPage( - createContext(harness.gateway), - createPluginsRouteData(harness.gateway, catalog), - ); - const installRequest = { - source: "clawhub", - packageName: "@openclaw/lobster", - } satisfies PluginInstallRequest; - - const catalogInstall = page.install("plugin:lobster", installRequest); - await waitForFast(() => expect(request).toHaveBeenCalledOnce()); - await page.install("clawhub:@openclaw/lobster", installRequest); - expect(request).toHaveBeenCalledOnce(); - - pendingInstall.resolve({ - ok: true, - plugin: createPlugin({ id: "lobster", name: "Lobster", installed: true, enabled: true }), - restartRequired: true, - }); - await catalogInstall; - }); - it("debounces two-character ClawHub searches and cancels stale input", async () => { vi.useFakeTimers(); const { client, request } = createClient(async (method) => { diff --git a/ui/src/pages/plugins/view.ts b/ui/src/pages/plugins/view.ts index a7eae049ac9a..7787f3462e3f 100644 --- a/ui/src/pages/plugins/view.ts +++ b/ui/src/pages/plugins/view.ts @@ -780,7 +780,7 @@ function renderPluginRow( ): TemplateResult { const key = pluginRowKey(plugin.id); const installOperation = installOperationState(props, plugin.install); - const busy = Boolean(props.busy[key] || installOperation.busy); + const busy = props.busy[key] || installOperation.busy; return html`