🐛 Fix indicate that the mcp is disabled if the mcp key has expired

If the mcp key has expired, the switch that indicates the status in the dashboard will appear as disabled, and will show a modal for regenerate the key. It will also appear as disabled in the workspace, not allowing the plugin to connect
This commit is contained in:
Luis de Dios 2026-04-22 15:17:46 +02:00
parent b0b2c0d264
commit b60695f54a
3 changed files with 33 additions and 25 deletions

View File

@ -648,3 +648,9 @@
(def progress (def progress
(l/derived :progress st/state)) (l/derived :progress st/state))
(def access-tokens
(l/derived :access-tokens st/state))
(def access-token-created
(l/derived :access-token-created st/state))

View File

@ -34,15 +34,8 @@
[app.util.dom :as dom] [app.util.dom :as dom]
[app.util.forms :as fm] [app.util.forms :as fm]
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[okulary.core :as l]
[rumext.v2 :as mf])) [rumext.v2 :as mf]))
(def tokens-ref
(l/derived :access-tokens st/state))
(def token-created-ref
(l/derived :access-token-created st/state))
(def notification-timeout 7000) (def notification-timeout 7000)
(def ^:private schema:form-access-token (def ^:private schema:form-access-token
@ -78,7 +71,7 @@
(mf/defc token-created* (mf/defc token-created*
{::mf/private true} {::mf/private true}
[{:keys [title mcp-key?]}] [{:keys [title mcp-key?]}]
(let [token-created (mf/deref token-created-ref) (let [token-created (mf/deref refs/access-token-created)
on-copy-to-clipboard on-copy-to-clipboard
(mf/use-fn (mf/use-fn
@ -310,7 +303,7 @@
[] []
(let [created? (mf/use-state false) (let [created? (mf/use-state false)
tokens (mf/deref tokens-ref) tokens (mf/deref refs/access-tokens)
mcp-key (some #(when (= (:type %) "mcp") %) tokens) mcp-key (some #(when (= (:type %) "mcp") %) tokens)
mcp-key-id (:id mcp-key) mcp-key-id (:id mcp-key)
@ -413,7 +406,7 @@
(mf/defc mcp-server-section* (mf/defc mcp-server-section*
{::mf/private true} {::mf/private true}
[] []
(let [tokens (mf/deref tokens-ref) (let [tokens (mf/deref refs/access-tokens)
profile (mf/deref refs/profile) profile (mf/deref refs/profile)
mcp-key (some #(when (= (:type %) "mcp") %) tokens) mcp-key (some #(when (= (:type %) "mcp") %) tokens)
@ -422,6 +415,8 @@
expires-at (:expires-at mcp-key) expires-at (:expires-at mcp-key)
expired? (and (some? expires-at) (> (ct/now) expires-at)) expired? (and (some? expires-at) (> (ct/now) expires-at))
show-enabled? (and mcp-enabled? (false? expired?))
tooltip-id tooltip-id
(mf/use-id) (mf/use-id)
@ -511,14 +506,17 @@
(tr "integrations.mcp-server.status.expired.1")]]]) (tr "integrations.mcp-server.status.expired.1")]]])
[:div {:class (stl/css :mcp-server-switch)} [:div {:class (stl/css :mcp-server-switch)}
[:> switch* {:label (if mcp-enabled? [:> switch* {:label (if show-enabled?
(tr "integrations.mcp-server.status.enabled") (tr "integrations.mcp-server.status.enabled")
(tr "integrations.mcp-server.status.disabled")) (tr "integrations.mcp-server.status.disabled"))
:default-checked mcp-enabled? :default-checked show-enabled?
:on-change handle-mcp-change}] :on-change handle-mcp-change}]
(when (and (false? mcp-enabled?) (nil? mcp-key)) (when (and (false? mcp-enabled?) (nil? mcp-key))
[:div {:class (stl/css :mcp-server-switch-cover) [:div {:class (stl/css :mcp-server-switch-cover)
:on-click handle-generate-mcp-key}])]]] :on-click handle-generate-mcp-key}])
(when (true? expired?)
[:div {:class (stl/css :mcp-server-switch-cover)
:on-click handle-regenerate-mcp-key}])]]]
(when (some? mcp-key) (when (some? mcp-key)
[:div {:class (stl/css :mcp-server-key)} [:div {:class (stl/css :mcp-server-key)}
@ -567,7 +565,7 @@
(mf/defc access-tokens-section* (mf/defc access-tokens-section*
{::mf/private true} {::mf/private true}
[] []
(let [tokens (mf/deref tokens-ref) (let [tokens (mf/deref refs/access-tokens)
handle-click handle-click
(mf/use-fn (mf/use-fn

View File

@ -43,13 +43,9 @@
[app.util.i18n :as i18n :refer [tr]] [app.util.i18n :as i18n :refer [tr]]
[app.util.keyboard :as kbd] [app.util.keyboard :as kbd]
[beicon.v2.core :as rx] [beicon.v2.core :as rx]
[okulary.core :as l]
[potok.v2.core :as ptk] [potok.v2.core :as ptk]
[rumext.v2 :as mf])) [rumext.v2 :as mf]))
(def tokens-ref
(l/derived :access-tokens st/state))
(mf/defc shortcuts* (mf/defc shortcuts*
{::mf/private true} {::mf/private true}
[{:keys [id]}] [{:keys [id]}]
@ -749,14 +745,22 @@
(mf/defc mcp-menu* (mf/defc mcp-menu*
{::mf/private true} {::mf/private true}
[{:keys [on-close]}] [{:keys [on-close]}]
(let [plugins? (features/active-feature? @st/state "plugins/runtime") (let [plugins? (features/active-feature? @st/state "plugins/runtime")
profile (mf/deref refs/profile) profile (mf/deref refs/profile)
mcp (mf/deref refs/mcp) mcp (mf/deref refs/mcp)
tokens (mf/deref refs/access-tokens)
expired? (some->> tokens
(some #(when (= (:type %) "mcp") %))
:expires-at
(> (ct/now)))
mcp-enabled? (true? (-> profile :props :mcp-enabled)) mcp-enabled? (true? (-> profile :props :mcp-enabled))
mcp-connected? (= "connected" (get mcp :connection-status)) mcp-connected? (= "connected" (get mcp :connection-status))
show-enabled? (and mcp-enabled? (false? expired?))
on-nav-to-integrations on-nav-to-integrations
(mf/use-fn (mf/use-fn
(fn [] (fn []
@ -794,7 +798,7 @@
:pos-6 plugins?) :pos-6 plugins?)
:on-close on-close} :on-close on-close}
(when mcp-enabled? (when show-enabled?
[:> dropdown-menu-item* {:id "mcp-menu-toggle-mcp-plugin" [:> dropdown-menu-item* {:id "mcp-menu-toggle-mcp-plugin"
:class (stl/css :base-menu-item :submenu-item) :class (stl/css :base-menu-item :submenu-item)
:on-click on-toggle-mcp-plugin :on-click on-toggle-mcp-plugin
@ -809,7 +813,7 @@
:on-click on-nav-to-integrations :on-click on-nav-to-integrations
:on-key-down on-nav-to-integrations-key-down} :on-key-down on-nav-to-integrations-key-down}
[:span {:class (stl/css :item-name)} [:span {:class (stl/css :item-name)}
(if mcp-enabled? (if show-enabled?
(tr "workspace.header.menu.mcp.server.status.enabled") (tr "workspace.header.menu.mcp.server.status.enabled")
(tr "workspace.header.menu.mcp.server.status.disabled"))]]])) (tr "workspace.header.menu.mcp.server.status.disabled"))]]]))
@ -983,7 +987,7 @@
:class (stl/css :item-arrow)}]]) :class (stl/css :item-arrow)}]])
(when (contains? cf/flags :mcp) (when (contains? cf/flags :mcp)
(let [tokens (mf/deref tokens-ref) (let [tokens (mf/deref refs/access-tokens)
expired? (some->> tokens expired? (some->> tokens
(some #(when (= (:type %) "mcp") %)) (some #(when (= (:type %) "mcp") %))
:expires-at :expires-at