dsh-agent-plugins-market 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -111
- package/README.zh.md +112 -98
- package/client/client.js +547 -540
- package/client/client.js.map +1 -1
- package/lib/application/catalog-context.js +181 -0
- package/lib/application/catalog.js +217 -1110
- package/lib/application/details.js +6 -6
- package/lib/application/install-store.js +95 -0
- package/lib/application/lsp-service.js +97 -0
- package/lib/application/mcp-service.js +246 -0
- package/lib/application/panel-resources.js +29 -12
- package/lib/application/ports.js +21 -0
- package/lib/application/project-agent-roles.js +1 -1
- package/lib/application/snapshot-cache.js +160 -0
- package/lib/application/source-store.js +521 -0
- package/lib/catalog/archive.js +34 -29
- package/lib/catalog/component-files.js +14 -6
- package/lib/catalog/fs-probes.js +43 -0
- package/lib/catalog/manifests.js +53 -92
- package/lib/catalog/native-project.js +2 -2
- package/lib/catalog/paths.js +66 -55
- package/lib/catalog/project-config.js +2 -1
- package/lib/catalog/project-hooks.js +9 -1
- package/lib/catalog/scan-resolvers.js +29 -45
- package/lib/catalog/skills-parse.js +14 -10
- package/lib/catalog/source-catalog.js +3 -2
- package/lib/catalog/suite-components.js +5 -5
- package/lib/catalog/suite-scanner.js +3 -1
- package/lib/catalog/surfaces.js +5 -26
- package/lib/catalog/validate.js +7 -11
- package/lib/contracts/market.js +1 -0
- package/lib/index.js +91 -208
- package/lib/model/types.js +26 -3
- package/lib/routes.js +45 -15
- package/lib/runtime/agent-role-names.js +70 -0
- package/lib/runtime/agent-role-router.js +116 -102
- package/lib/runtime/commands-mounts.js +9 -6
- package/lib/runtime/deadline.js +28 -0
- package/lib/runtime/feedback-tool.js +94 -43
- package/lib/runtime/hooks-mounts.js +9 -11
- package/lib/runtime/host-locale.js +10 -21
- package/lib/runtime/lsp-direct-config.js +19 -19
- package/lib/runtime/lsp-mounts.js +159 -68
- package/lib/runtime/lsp-server-state.js +4 -4
- package/lib/runtime/lsp-status.js +1 -1
- package/lib/runtime/mcp-auth-record.js +42 -0
- package/lib/runtime/mcp-backend.js +6 -5
- package/lib/runtime/mcp-client/config.js +0 -1
- package/lib/runtime/mcp-client/connection.js +32 -37
- package/lib/runtime/mcp-client/host-contract.js +10 -0
- package/lib/runtime/mcp-client/oauth.js +5 -7
- package/lib/runtime/mcp-client/plugin-identity.js +28 -0
- package/lib/runtime/mcp-client/projection.js +202 -0
- package/lib/runtime/mcp-client/tools.js +4 -189
- package/lib/runtime/mcp-config.js +29 -10
- package/lib/runtime/mcp-direct-config.js +33 -16
- package/lib/runtime/mcp-mounts.js +35 -75
- package/lib/runtime/mcp-overrides.js +5 -5
- package/lib/runtime/mcp-redaction.js +3 -2
- package/lib/runtime/mcp-status.js +7 -8
- package/lib/runtime/mount-lifecycle.js +73 -0
- package/lib/runtime/profile-seam.js +321 -0
- package/lib/runtime/project-runtime.js +11 -8
- package/lib/runtime/reconcile-scheduler.js +99 -0
- package/lib/runtime/reconciler.js +4 -0
- package/lib/runtime/server-config.js +6 -4
- package/lib/runtime/settings-namespace.js +136 -0
- package/lib/runtime/skills-provider.js +5 -3
- package/lib/runtime/source-auto-update.js +70 -0
- package/lib/{model/state.js → runtime/state-store.js} +9 -11
- package/lib/runtime/storage-migration.js +35 -18
- package/lib/runtime/subagent-catalog.js +5 -4
- package/lib/runtime/user-commands.js +2 -2
- package/lib/runtime/user-panels.js +31 -21
- package/lib/runtime/user-store.js +12 -13
- package/lib/types/application/catalog-context.d.ts +118 -0
- package/lib/types/application/catalog.d.ts +99 -304
- package/lib/types/application/install-store.d.ts +21 -0
- package/lib/types/application/lsp-service.d.ts +36 -0
- package/lib/types/application/mcp-service.d.ts +71 -0
- package/lib/types/application/panel-resources.d.ts +8 -0
- package/lib/types/application/ports.d.ts +72 -0
- package/lib/types/application/queries.d.ts +13 -26
- package/lib/types/application/snapshot-cache.d.ts +51 -0
- package/lib/types/application/source-store.d.ts +100 -0
- package/lib/types/catalog/archive.d.ts +3 -11
- package/lib/types/catalog/component-files.d.ts +4 -0
- package/lib/types/catalog/fs-probes.d.ts +10 -0
- package/lib/types/catalog/manifests.d.ts +17 -16
- package/lib/types/catalog/native-project.d.ts +2 -2
- package/lib/types/catalog/paths.d.ts +47 -15
- package/lib/types/catalog/scan-pipeline.d.ts +3 -3
- package/lib/types/catalog/scan-resolvers.d.ts +3 -9
- package/lib/types/catalog/skills-parse.d.ts +0 -7
- package/lib/types/catalog/source-catalog.d.ts +3 -3
- package/lib/types/catalog/suite-scanner.d.ts +8 -6
- package/lib/types/catalog/validate.d.ts +0 -2
- package/lib/types/contracts/lsp-status.d.ts +35 -0
- package/lib/types/contracts/market.d.ts +3 -2
- package/lib/types/contracts/mcp-status.d.ts +4 -0
- package/lib/types/model/types.d.ts +29 -5
- package/lib/types/runtime/agent-role-names.d.ts +6 -0
- package/lib/types/runtime/agent-role-router.d.ts +54 -51
- package/lib/types/runtime/deadline.d.ts +18 -0
- package/lib/types/runtime/feedback-tool.d.ts +33 -11
- package/lib/types/runtime/hooks-mounts.d.ts +1 -1
- package/lib/types/runtime/host-locale.d.ts +1 -1
- package/lib/types/runtime/lsp-direct-config.d.ts +3 -3
- package/lib/types/runtime/lsp-mounts.d.ts +62 -19
- package/lib/types/runtime/lsp-status.d.ts +2 -1
- package/lib/types/runtime/mcp-auth-record.d.ts +29 -0
- package/lib/types/runtime/mcp-backend.d.ts +7 -4
- package/lib/types/runtime/mcp-client/config.d.ts +0 -2
- package/lib/types/runtime/mcp-client/host-contract.d.ts +78 -0
- package/lib/types/runtime/mcp-client/oauth.d.ts +1 -1
- package/lib/types/runtime/mcp-client/plugin-identity.d.ts +16 -0
- package/lib/types/runtime/mcp-client/projection.d.ts +45 -0
- package/lib/types/runtime/mcp-client/tools.d.ts +5 -72
- package/lib/types/runtime/mcp-config.d.ts +25 -4
- package/lib/types/runtime/mcp-direct-config.d.ts +18 -4
- package/lib/types/runtime/mcp-mounts.d.ts +10 -15
- package/lib/types/runtime/mcp-overrides.d.ts +1 -1
- package/lib/types/runtime/mcp-status.d.ts +1 -1
- package/lib/types/runtime/mount-lifecycle.d.ts +53 -0
- package/lib/types/runtime/profile-seam.d.ts +64 -0
- package/lib/types/runtime/reconcile-scheduler.d.ts +45 -0
- package/lib/types/runtime/reconciler.d.ts +2 -0
- package/lib/types/runtime/settings-namespace.d.ts +76 -0
- package/lib/types/runtime/source-auto-update.d.ts +33 -0
- package/lib/types/{model/state.d.ts → runtime/state-store.d.ts} +2 -2
- package/lib/types/runtime/storage-migration.d.ts +5 -3
- package/lib/types/runtime/subagent-catalog.d.ts +2 -0
- package/lib/types/runtime/user-panels.d.ts +8 -11
- package/lib/types/runtime/user-store.d.ts +2 -4
- package/package.json +48 -21
- package/schemas/README.md +1 -1
package/client/client.js
CHANGED
|
@@ -2,7 +2,7 @@ window.__ModuleLoader__.load({ id: "dsh-agent-plugins-market", factory: (require
|
|
|
2
2
|
|
|
3
3
|
var module = { exports: {} };
|
|
4
4
|
var exports = module.exports;
|
|
5
|
-
(function(){if(typeof document!=="undefined"){var s=document.createElement("style");s.setAttribute("data-dsh-client","dsh-agent-plugins-market");s.textContent=".qUlk6a_overlay {\n z-index: 2147483647;\n box-sizing: border-box;\n background: var(--dsw-alias-bg-mask-3);\n backdrop-filter: blur(3px);\n cursor: progress;\n outline: none;\n place-items: center;\n display: grid;\n position: fixed;\n overflow: hidden;\n}\n\n.qUlk6a_overlay[data-visible=\"false\"] {\n backdrop-filter: none;\n background: none;\n}\n\n.qUlk6a_overlay[data-visible=\"true\"] {\n animation: .14s ease-out qUlk6a_busy-enter;\n}\n\n.qUlk6a_content {\n box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n width: min(360px, 100% - 32px);\n color: var(--dsw-alias-label-primary);\n text-align: center;\n border-radius: 8px;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n display: flex;\n}\n\n.qUlk6a_spinner {\n width: 28px;\n height: 28px;\n animation: .9s linear infinite qUlk6a_busy-spin;\n display: flex;\n}\n\n.qUlk6a_label {\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.qUlk6a_hintViewport {\n width: 100%;\n min-height: 54px;\n overflow: hidden;\n}\n\n.qUlk6a_hint {\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n animation: .3s ease-out qUlk6a_busy-hint;\n}\n\n@keyframes qUlk6a_busy-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes qUlk6a_busy-enter {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes qUlk6a_busy-hint {\n from {\n opacity: 0;\n transform: translateY(14px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .qUlk6a_overlay, .qUlk6a_hint {\n animation: none;\n }\n\n .qUlk6a_spinner {\n animation-duration: 2.4s;\n }\n}\n._72qoAq_market {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 24px;\n display: flex;\n}\n\n._72qoAq_pageMode {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n}\n\n._72qoAq_marketControls {\n flex-direction: column;\n gap: 8px;\n min-height: 0;\n display: flex;\n}\n\n._72qoAq_mcpSurface {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n\n._72qoAq_surfaceSwitch {\n border: 1px solid var(--dsw-alias-border-l2, #d4dce8);\n background: var(--dsw-alias-bg-layer-1, #fff);\n height: 26px;\n color: var(--dsw-alias-brand-primary, #4966f5);\n cursor: pointer;\n border-radius: 7px;\n flex: none;\n align-self: center;\n padding: 0 10px;\n font-size: 11px;\n}\n\n._72qoAq_surfaceSwitch:hover {\n background: var(--dsw-alias-state-business-tertiary, #e4edfd);\n}\n\nhtml[data-dsh-agent-plugins-market-page] [data-pane=\"conversation\"], html[data-dsh-agent-plugins-market-page] [class*=\"centerCol\"] {\n position: relative;\n}\n\n._72qoAq_pageView {\n z-index: 60;\n background: var(--dsw-alias-bg-base, #f7f8fa);\n min-width: 0;\n min-height: 0;\n padding: 20px 24px;\n display: none;\n position: absolute;\n inset: 0;\n overflow: hidden;\n}\n\nhtml[data-dsh-agent-plugins-market-page] ._72qoAq_pageView {\n display: flex;\n}\n\nhtml[data-dsh-agent-plugins-market-page] [data-pane=\"conversation\"] > :not([data-dsh-agent-plugins-market-page-view]), html[data-dsh-agent-plugins-market-page] [class*=\"centerCol\"] > :not([data-dsh-agent-plugins-market-page-view]) {\n display: none !important;\n}\n\n._72qoAq_pageEntry {\n width: 100%;\n min-height: 32px;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n font: inherit;\n text-align: left;\n background: none;\n border: none;\n border-radius: 8px;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n font-size: 13px;\n line-height: 20px;\n display: flex;\n}\n\n._72qoAq_pageEntry:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n._72qoAq_pageEntry:active {\n background: var(--dsw-alias-interactive-bg-active, #2631481a);\n}\n\n._72qoAq_pageEntry svg {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-shrink: 0;\n}\n\n._72qoAq_pageEntry span {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n[data-dsh-frame][data-sidebar-collapsed] ._72qoAq_pageEntry {\n justify-content: center;\n padding-inline: 0;\n}\n\n[data-dsh-frame][data-sidebar-collapsed] ._72qoAq_pageEntry span {\n display: none;\n}\n\n._72qoAq_pageEntry:focus-visible, ._72qoAq_srcTabMain:focus-visible, ._72qoAq_srcTabEdit:focus-visible, ._72qoAq_srcTabDel:focus-visible, ._72qoAq_seg:focus-visible, ._72qoAq_segOn:focus-visible, ._72qoAq_detailItemRow:focus-visible, ._72qoAq_detailItemOpen:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n._72qoAq_header {\n flex-direction: column;\n flex-shrink: 0;\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_titleRow {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n._72qoAq_sub {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n align-items: center;\n gap: 8px;\n min-width: 0;\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n display: flex;\n overflow: hidden;\n}\n\n._72qoAq_spacer {\n flex: 1;\n}\n\n._72qoAq_searchGroup {\n align-items: center;\n gap: 2px;\n display: flex;\n}\n\n._72qoAq_body {\n flex: 1;\n align-items: flex-start;\n gap: 20px;\n min-height: 0;\n display: flex;\n}\n\n._72qoAq_sourceTabsBox {\n min-width: 0;\n position: relative;\n}\n\n._72qoAq_sourceTabsRow {\n grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n._72qoAq_sourceTabsBoxFold {\n height: 52px;\n}\n\n._72qoAq_sourceTabsBoxFold ._72qoAq_sourceTabsRow {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 10px;\n max-height: 58px;\n padding: 6px 6px 0;\n transition: max-height .16s, box-shadow .16s, padding-bottom .16s;\n position: absolute;\n inset: -6px -6px auto;\n overflow: hidden;\n -webkit-mask-image: linear-gradient(#000 78%, #0000 100%);\n mask-image: linear-gradient(#000 78%, #0000 100%);\n}\n\n._72qoAq_sourceTabsBoxFold:hover ._72qoAq_sourceTabsRow, ._72qoAq_sourceTabsBoxFold:has(:focus-visible) ._72qoAq_sourceTabsRow {\n z-index: 30;\n max-height: 420px;\n box-shadow: 0 0 0 1px var(--dsw-alias-border-l3, #d9dde3),\n 0 12px 28px #10182829;\n padding-bottom: 6px;\n -webkit-mask-image: none;\n mask-image: none;\n}\n\n._72qoAq_sourceTabsBoxFold._72qoAq_sourceTabsBoxPicked:hover ._72qoAq_sourceTabsRow, ._72qoAq_sourceTabsBoxFold._72qoAq_sourceTabsBoxPicked:has(:focus-visible) ._72qoAq_sourceTabsRow {\n max-height: 58px;\n box-shadow: none;\n padding-bottom: 0;\n -webkit-mask-image: linear-gradient(#000 78%, #0000 100%);\n mask-image: linear-gradient(#000 78%, #0000 100%);\n}\n\n._72qoAq_unmanagedRow {\n color: var(--dsw-alias-label-secondary, #57606a);\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n display: flex;\n}\n\n._72qoAq_unmanagedLabel {\n flex-shrink: 0;\n}\n\n._72qoAq_unmanagedChip {\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 999px;\n align-items: center;\n gap: 2px;\n max-width: 220px;\n height: 22px;\n padding: 0 4px 0 8px;\n display: inline-flex;\n}\n\n._72qoAq_unmanagedChipName {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n overflow: hidden;\n}\n\n._72qoAq_unmanagedAdopt {\n font: inherit;\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_unmanagedAdopt:disabled {\n cursor: default;\n opacity: .5;\n}\n\n._72qoAq_srcTabEdit {\n font: inherit;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n margin-left: 4px;\n padding: 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_srcTabEdit:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabEdit, ._72qoAq_srcTabOn ._72qoAq_srcTabEdit:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n._72qoAq_srcTab, ._72qoAq_srcTabOn {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n width: auto;\n max-width: 100%;\n height: 24px;\n padding: 0 10px;\n display: inline-flex;\n overflow: hidden;\n}\n\n._72qoAq_srcTabMain {\n font: inherit;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n white-space: nowrap;\n text-overflow: ellipsis;\n background: none;\n border: none;\n flex: 1;\n min-width: 0;\n padding: 0;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n._72qoAq_srcTabMain:hover {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n._72qoAq_srcTabOn {\n background: var(--dsw-alias-brand-primary, #0f1115);\n border-color: var(--dsw-alias-brand-primary, #0f1115);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabMain {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n font-weight: 600;\n}\n\n._72qoAq_srcTabDel {\n font: inherit;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n margin-left: 4px;\n padding: 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_srcTabDel:hover {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabDel, ._72qoAq_srcTabOn ._72qoAq_srcTabDel:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n._72qoAq_grid {\n scrollbar-gutter: stable;\n flex: 1;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: grid;\n overflow-y: auto;\n}\n\n._72qoAq_list {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 8px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: flex;\n overflow-y: auto;\n}\n\n._72qoAq_list ._72qoAq_card {\n flex-flow: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n._72qoAq_list ._72qoAq_cardTop {\n flex: none;\n}\n\n._72qoAq_list ._72qoAq_cardDesc {\n flex: 1;\n min-width: 200px;\n min-height: 0;\n max-height: 18px;\n overflow: hidden;\n}\n\n._72qoAq_list ._72qoAq_cardActions {\n flex: none;\n}\n\n._72qoAq_list ._72qoAq_meta, ._72qoAq_list ._72qoAq_tagRow {\n flex-basis: 100%;\n}\n\n._72qoAq_empty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-align: center;\n grid-column: 1 / -1;\n padding: 48px 0;\n font-size: 13px;\n}\n\n._72qoAq_card {\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-left: 3px solid var(--dsw-alias-border-l2);\n cursor: pointer;\n border-radius: 12px;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n padding: 12px 14px;\n transition: border-color .15s, background .15s, box-shadow .15s;\n display: flex;\n}\n\n._72qoAq_card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n box-shadow: 0 1px 4px #1018280f;\n}\n\n._72qoAq_cardTop {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_cardTitle {\n flex: 1;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_cardName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 22px;\n overflow: hidden;\n}\n\n._72qoAq_version {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n._72qoAq_cardActions {\n flex-shrink: 0;\n align-items: center;\n gap: 4px;\n display: flex;\n}\n\n._72qoAq_iconBtn {\n cursor: pointer;\n width: 26px;\n height: 26px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: none;\n border: none;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n padding: 0;\n transition: background .15s, color .15s;\n display: inline-flex;\n}\n\n._72qoAq_iconBtn svg {\n fill: none;\n stroke: currentColor;\n stroke-width: 1.8px;\n stroke-linecap: round;\n stroke-linejoin: round;\n width: 15px;\n height: 15px;\n}\n\n._72qoAq_iconBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n._72qoAq_iconBtn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, #2631481a);\n}\n\n._72qoAq_iconBtn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n._72qoAq_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n._72qoAq_iconBtnDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #ec1313);\n}\n\n._72qoAq_switchOn, ._72qoAq_switchOff {\n cursor: pointer;\n border: none;\n border-radius: 999px;\n flex-shrink: 0;\n width: 38px;\n height: 22px;\n padding: 0;\n transition: background-color .15s;\n position: relative;\n}\n\n._72qoAq_switchOn {\n background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #4f6ef7));\n}\n\n._72qoAq_switchOff {\n background: var(--dsw-alias-label-dimmed, #e1e5ee);\n}\n\n._72qoAq_switchOn:disabled, ._72qoAq_switchOff:disabled {\n opacity: .6;\n cursor: default;\n}\n\n._72qoAq_switchThumb {\n pointer-events: none;\n background: #fff;\n border-radius: 50%;\n width: 16px;\n height: 16px;\n transition: left .15s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 2px #0003;\n}\n\n._72qoAq_switchOn ._72qoAq_switchThumb {\n left: 19px;\n}\n\n._72qoAq_desc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n max-height: 36px;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n._72qoAq_meta, ._72qoAq_tagRow {\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_src {\n color: var(--dsw-alias-label-secondary, #9ca3af);\n font-size: 12px;\n text-decoration: none;\n}\n\n._72qoAq_tag {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-radius: 4px;\n flex-shrink: 0;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_okState {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n font-size: 12px;\n font-weight: 600;\n}\n\n._72qoAq_warnLine {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n cursor: help;\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n._72qoAq_modalFooter {\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n display: flex;\n}\n\n._72qoAq_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n._72qoAq_modalFooterLeft {\n gap: 8px;\n margin-right: auto;\n display: flex;\n}\n\n._72qoAq_editorDialog {\n width: min(500px, 92vw);\n}\n\n._72qoAq_installConfirmBody {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_installConfirmSuite {\n color: var(--dsw-alias-label-primary, #111827);\n font-weight: 600;\n}\n\n._72qoAq_installConfirmMeta {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n}\n\n._72qoAq_installConfirmCommit {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n\n._72qoAq_installConfirmTags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_installConfirmWarn {\n color: var(--dsw-alias-state-warn-label, #dd8629);\n border: 1px solid var(--dsw-alias-state-warn-label, #dd8629);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 12px;\n}\n\n._72qoAq_editorForm {\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_modeRow {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n border-radius: 10px;\n align-self: flex-start;\n gap: 6px;\n padding: 3px;\n display: flex;\n}\n\n._72qoAq_seg, ._72qoAq_segOn {\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 8px;\n padding: 5px 14px;\n font-size: 13px;\n line-height: 20px;\n}\n\n._72qoAq_segOn {\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n box-shadow: 0 1px 2px #00000014;\n}\n\n._72qoAq_fieldGroup {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n._72qoAq_fieldLabel {\n color: var(--dsw-alias-label-secondary, #6b7280);\n font-size: 12px;\n font-weight: 600;\n}\n\n._72qoAq_fieldHint {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n line-height: 16px;\n}\n\n._72qoAq_staticId {\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n border-radius: 8px;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n display: flex;\n}\n\n._72qoAq_staticIdValue {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailDialog {\n width: min(800px, 94vw);\n}\n\n._72qoAq_detailBody {\n flex-direction: column;\n gap: 14px;\n max-height: 78vh;\n display: flex;\n overflow-y: auto;\n}\n\n._72qoAq_detailSections {\n flex-direction: column;\n gap: 14px;\n display: flex;\n}\n\n._72qoAq_detailSection {\n flex-direction: column;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_detailHead {\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0;\n padding-bottom: 4px;\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailGrid {\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 6px 14px;\n display: grid;\n}\n\n._72qoAq_detailCell {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_detailKey {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n}\n\n._72qoAq_detailValue {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n overflow: hidden;\n}\n\n._72qoAq_detailDesc {\n color: var(--dsw-alias-label-secondary, #6b7280);\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n._72qoAq_mono {\n word-break: break-all;\n white-space: pre-wrap;\n color: var(--dsw-alias-label-primary, #1f2328);\n margin: 0;\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_detailItem {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n flex-direction: column;\n display: flex;\n overflow: hidden;\n}\n\n._72qoAq_detailItemRow, ._72qoAq_detailItemOpen {\n width: 100%;\n font: inherit;\n text-align: left;\n cursor: pointer;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: none;\n border: none;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n display: flex;\n}\n\n._72qoAq_detailItemRow:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n._72qoAq_detailItemOpen {\n background: var(--dsw-alias-state-business-tertiary, #e4edfd);\n}\n\n._72qoAq_detailItemName {\n flex-shrink: 0;\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailItemDesc {\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n font-size: 12px;\n overflow: hidden;\n}\n\n._72qoAq_detailChevron {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n flex-shrink: 0;\n}\n\n._72qoAq_skillContent {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n max-height: 320px;\n color: var(--dsw-alias-label-primary, #1f2328);\n padding: 10px 12px;\n font-size: 13px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n._72qoAq_progress, ._72qoAq_progressError {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, #7f7f7f0f);\n color: var(--dsw-alias-label-primary, #1f2328);\n border-radius: 8px;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n font-size: 13px;\n line-height: 20px;\n display: flex;\n}\n\n._72qoAq_progressError {\n border-color: var(--dsw-alias-state-error-primary, #ec1313);\n color: var(--dsw-alias-state-error-primary, #ec1313);\n}\n\n._72qoAq_progressSpin {\n border: 2px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-top-color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-radius: 50%;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n animation: .8s linear infinite _72qoAq_dshApmSpin;\n}\n\n@keyframes _72qoAq_dshApmSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n._72qoAq_progressFail {\n flex-shrink: 0;\n font-size: 13px;\n}\n\n._72qoAq_progressText {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n@media (width <= 720px) {\n ._72qoAq_pageView {\n padding: 14px;\n }\n\n ._72qoAq_titleRow {\n flex-wrap: wrap;\n }\n\n ._72qoAq_title {\n flex: 1 0 auto;\n }\n\n ._72qoAq_sub {\n white-space: normal;\n flex: 1 0 100%;\n order: 3;\n }\n\n ._72qoAq_searchGroup {\n flex: 1 0 100%;\n order: 4;\n }\n\n ._72qoAq_sourceTabsRow {\n grid-template-columns: repeat(auto-fill, minmax(102px, 1fr));\n }\n\n ._72qoAq_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n ._72qoAq_list ._72qoAq_cardTop, ._72qoAq_list ._72qoAq_cardActions {\n max-width: 100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._72qoAq_progressSpin, ._72qoAq_switchOn, ._72qoAq_switchOff, ._72qoAq_switchThumb {\n transition: none;\n animation: none;\n }\n}\n\n._72qoAq_surfaceToggles {\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 14px;\n display: flex;\n}\n\n._72qoAq_surfaceToggle {\n color: var(--dsw-alias-label-secondary, #61666b);\n cursor: pointer;\n user-select: none;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n display: inline-flex;\n}\n\n._72qoAq_surfaceToggle input[type=\"checkbox\"] {\n accent-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n margin: 0;\n}\n\n._72qoAq_mcpOverrideForm, ._72qoAq_mcpCredentialForm {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-radius: 8px;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 10px;\n padding: 10px;\n display: flex;\n}\n\n._72qoAq_mcpCredentialRow {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n._72qoAq_mcpCredentialControls, ._72qoAq_mcpCredentialEditor {\n flex-direction: column;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_mcpOverrideCheck {\n cursor: pointer;\n user-select: none;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n display: inline-flex;\n}\n\n._72qoAq_mcpOverrideInput {\n box-sizing: border-box;\n width: 100%;\n padding: 6px 8px;\n font-size: 12px;\n}\n\n._72qoAq_mcpOverrideArea {\n box-sizing: border-box;\n resize: vertical;\n width: 100%;\n padding: 6px 8px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n\n._72qoAq_mcpOverrideActions {\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_backendBlock {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n opacity: 1;\n border-radius: 10px;\n flex-direction: column;\n gap: 6px;\n padding: 12px 14px;\n display: flex;\n}\n\n._72qoAq_backendBlock[data-busy=\"true\"] {\n opacity: .6;\n pointer-events: none;\n}\n\n._72qoAq_backendRow {\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n display: flex;\n}\n\n._72qoAq_backendTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_backendCurrent {\n margin: 0;\n font-size: 12px;\n font-weight: 500;\n}\n\n._72qoAq_backendHint {\n opacity: .7;\n margin: 0;\n font-size: 11px;\n}\n\n._72qoAq_backendVersion {\n opacity: .55;\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n}\n\n._72qoAq_pluginCard {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-3, #fff);\n border-radius: 12px;\n list-style: none;\n transition: border-color .16s, background .16s;\n container: _72qoAq_market-config / inline-size;\n}\n\n._72qoAq_pluginCard:hover {\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n._72qoAq_pluginCardOpen {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n._72qoAq_pluginCard[data-busy=\"true\"] {\n opacity: .6;\n pointer-events: none;\n}\n\n._72qoAq_pluginCardHeader {\n appearance: none;\n width: 100%;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 12px;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n display: flex;\n}\n\n._72qoAq_pluginCardHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: -2px;\n}\n\n._72qoAq_pluginCardBody {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n flex-direction: column;\n gap: 8px;\n margin: 0 16px;\n padding: 4px 0 8px;\n display: flex;\n}\n\n._72qoAq_pluginCardRow {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 8px 0 4px;\n display: flex;\n}\n\n._72qoAq_pluginCardText {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_pluginCardTitle {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 15px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n._72qoAq_pluginCardDesc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 1.5;\n}\n\n._72qoAq_pluginCardRowLabel {\n font-size: 13px;\n font-weight: 500;\n line-height: 20px;\n}\n\n@container _72qoAq_market-config (width <= 320px) {\n ._72qoAq_pluginCardRow {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n ._72qoAq_pluginCardText {\n overflow-wrap: anywhere;\n width: 100%;\n }\n\n ._72qoAq_regionSeg {\n flex-wrap: wrap;\n max-width: 100%;\n }\n}\n\n._72qoAq_pluginCardError {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n}\n\n._72qoAq_pluginChevron {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n flex: none;\n transition: transform .16s;\n display: inline-flex;\n}\n\n._72qoAq_pluginChevronOpen {\n transform: rotate(180deg);\n}\n\n._72qoAq_regionSeg {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n flex: none;\n gap: 2px;\n padding: 2px;\n display: inline-flex;\n}\n\n._72qoAq_regionSegBtn {\n appearance: none;\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_regionSegOn {\n appearance: none;\n font: inherit;\n cursor: pointer;\n background: var(--dsw-alias-bg-layer-2, #eef0f4);\n color: var(--dsw-alias-label-primary, #1f2328);\n border: none;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n._72qoAq_regionSegBtn:disabled, ._72qoAq_regionSegOn:disabled {\n cursor: default;\n opacity: .5;\n}\n.IgyjIq_card[data-resource-state] {\n box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-primary);\n box-shadow: none;\n border-left-width: 3px;\n border-radius: 8px;\n}\n\n.IgyjIq_card[data-resource-state=\"active\"] {\n border-left-color: var(--dsw-alias-state-success-primary);\n}\n\n.IgyjIq_card[data-resource-state=\"disabled\"] {\n border-left-color: var(--dsw-alias-label-tertiary);\n}\n\n.IgyjIq_card[data-resource-state=\"warning\"] {\n border-left-color: var(--dsw-alias-state-warn-primary);\n}\n\n.IgyjIq_card[data-resource-state=\"error\"] {\n border-left-color: var(--dsw-alias-state-error-primary);\n}\n\n.IgyjIq_card[data-resource-state]:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.IgyjIq_collection[data-resource-view] {\n box-sizing: border-box;\n scrollbar-gutter: stable;\n align-content: start;\n align-items: stretch;\n gap: 12px;\n width: 100%;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n.IgyjIq_collection[data-resource-view=\"grid\"] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n display: grid;\n}\n\n.IgyjIq_collection[data-resource-view=\"list\"] {\n flex-direction: column;\n display: flex;\n}\n\n.IgyjIq_collection[data-resource-view=\"list\"] > .IgyjIq_card {\n flex-shrink: 0;\n}\n.sBXwgW_dialog[role=\"dialog\"] {\n box-sizing: border-box;\n width: min(1120px, 100vw - 48px);\n max-width: calc(100vw - 48px);\n max-height: calc(100dvh - 48px);\n}\n\n.sBXwgW_body {\n overflow-wrap: anywhere;\n min-width: 0;\n min-height: 0;\n max-height: calc(100dvh - 200px);\n overflow-y: auto;\n}\n\n.sBXwgW_modes {\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 12px;\n display: flex;\n}\n\n.sBXwgW_footer {\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n width: 100%;\n display: flex;\n}\n\n.sBXwgW_footer > :first-child {\n flex: 1;\n}\n\n.sBXwgW_footerSlot:empty {\n display: none;\n}\n\n.sBXwgW_mode {\n border: 1px solid var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-secondary);\n font: inherit;\n cursor: pointer;\n background: none;\n border-radius: 4px;\n padding: 6px 12px;\n}\n\n.sBXwgW_mode[aria-pressed=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\n.sBXwgW_mode:focus-visible, .sBXwgW_raw:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.sBXwgW_raw {\n box-sizing: border-box;\n resize: vertical;\n border: 1px solid var(--dsw-alias-border-l2);\n width: 100%;\n min-height: 320px;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n border-radius: 6px;\n padding: 12px;\n font: 13px / 1.6 ui-monospace, monospace;\n}\n\n.sBXwgW_section {\n min-width: 0;\n margin: 0 0 16px;\n}\n\n.sBXwgW_heading {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.sBXwgW_metadata {\n grid-template-columns: minmax(100px, 180px) minmax(0, 1fr);\n margin: 0;\n font-size: 13px;\n display: grid;\n}\n\n.sBXwgW_metadata dt, .sBXwgW_metadata dd {\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n min-width: 0;\n margin: 0;\n padding: 8px 0;\n}\n\n.sBXwgW_metadata dt {\n color: var(--dsw-alias-label-secondary);\n padding-right: 12px;\n}\n\n.sBXwgW_metadata dd {\n color: var(--dsw-alias-label-primary);\n}\n\n.sBXwgW_values {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.sBXwgW_value {\n background: var(--dsw-alias-interactive-bg-hover);\n border-radius: 4px;\n max-width: 100%;\n padding: 2px 6px;\n}\n\n.sBXwgW_preview {\n min-width: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 1.6;\n}\n\n.sBXwgW_preview pre, .sBXwgW_preview table {\n max-width: 100%;\n overflow: auto;\n}\n\n.sBXwgW_preview img {\n max-width: 100%;\n height: auto;\n}\n\n.sBXwgW_error {\n color: var(--dsw-alias-state-error-primary);\n margin: 8px 0;\n font-size: 13px;\n}\n\n.sBXwgW_form {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 16px;\n display: grid;\n}\n\n.sBXwgW_field {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 13px;\n display: flex;\n}\n\n.sBXwgW_field input, .sBXwgW_field select, .sBXwgW_field textarea {\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n border: 1px solid var(--dsw-alias-border-l2);\n font: inherit;\n border-radius: 4px;\n padding: 8px;\n}\n\n.sBXwgW_wide {\n grid-column: 1 / -1;\n}\n\n.sBXwgW_rows {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.sBXwgW_row {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.sBXwgW_row input {\n flex: 1;\n width: 0;\n}\n\n.sBXwgW_row button {\n flex: none;\n}\n\n.sBXwgW_rows > button {\n align-self: flex-start;\n}\n\n@media (width <= 640px) {\n .sBXwgW_dialog[role=\"dialog\"] {\n width: calc(100vw - 16px);\n max-width: calc(100vw - 16px);\n max-height: calc(100dvh - 16px);\n }\n\n .sBXwgW_form {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .sBXwgW_metadata {\n grid-template-columns: minmax(80px, 30%) minmax(0, 1fr);\n }\n}\n.vavGuW_toolbar {\n flex: none;\n align-items: flex-end;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.vavGuW_filterGap, .vavGuW_viewGap {\n flex: 1 0 12px;\n min-width: 0;\n}\n\n.vavGuW_search {\n box-sizing: border-box;\n flex: 0 240px;\n align-items: center;\n min-width: 0;\n height: 36px;\n display: flex;\n}\n\n.vavGuW_search input {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 36px;\n min-height: 36px;\n max-height: 36px;\n padding-top: 0;\n padding-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.vavGuW_filter, .vavGuW_filterOn {\n min-width: 54px;\n height: 36px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: none;\n border-bottom: 2px solid #0000;\n flex: none;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 7px 9px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.vavGuW_filterOn {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-bottom-color: var(--dsw-alias-brand-primary, #4f6ef7);\n font-weight: 600;\n}\n\n.vavGuW_filter svg, .vavGuW_filterOn svg, .vavGuW_viewSwitch svg {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.vavGuW_filterCount {\n font-variant-numeric: tabular-nums;\n}\n\n.vavGuW_viewSwitch {\n width: 34px;\n height: 36px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n border-bottom: 2px solid #0000;\n flex: none;\n justify-content: center;\n align-items: center;\n display: inline-flex;\n}\n\n.vavGuW_extraAction {\n height: 36px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: none;\n border-bottom: 2px solid #0000;\n flex: none;\n align-items: center;\n gap: 6px;\n padding: 0 10px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.vavGuW_extraAction:hover, .vavGuW_viewSwitch:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.vavGuW_viewSwitch:focus-visible, .vavGuW_filter:focus-visible, .vavGuW_filterOn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n@container (width <= 700px) {\n .vavGuW_toolbar {\n flex-wrap: wrap;\n justify-content: flex-end;\n }\n\n .vavGuW_search {\n flex-basis: 100%;\n }\n\n .vavGuW_filterGap {\n display: none;\n }\n}\n.HJ9x7a_shell {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 16px;\n display: flex;\n container-type: inline-size;\n}\n\n.HJ9x7a_header {\n flex-direction: row;\n flex: none;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n min-height: 46px;\n display: flex;\n}\n\n.HJ9x7a_headerText {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.HJ9x7a_subtitle {\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.HJ9x7a_headerActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.HJ9x7a_body {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 12px;\n min-height: 0;\n display: flex;\n overflow-y: auto;\n}\n\n.HJ9x7a_busyLine {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_busyLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n.HJ9x7a_spinner {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex: none;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_spinning {\n animation: .9s linear infinite HJ9x7a_panel-spin;\n}\n\n@keyframes HJ9x7a_panel-spin {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .HJ9x7a_spinning {\n animation-duration: 2.4s;\n }\n}\n\n.HJ9x7a_badgePlugin, .HJ9x7a_badgeUser {\n white-space: nowrap;\n box-sizing: border-box;\n text-overflow: ellipsis;\n background: var(--dsw-alias-interactive-bg-hover);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n border-radius: 4px;\n flex: none;\n align-items: center;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 16px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.HJ9x7a_editorDialog {\n max-width: 720px;\n}\n\n.HJ9x7a_editorBody {\n flex-direction: column;\n gap: 10px;\n display: flex;\n}\n\n.HJ9x7a_editorForm {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_editorNameRow {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorName {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_editorPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_editorHint {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_editorArea {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n resize: vertical;\n border-radius: 8px;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n.HJ9x7a_editorFooter {\n flex-direction: row;\n flex: 1;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorError {\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n margin-right: auto;\n font-size: 12px;\n}\n\n.HJ9x7a_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_entryList {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryRow {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-left: 3px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 8px;\n flex-direction: row;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n display: flex;\n}\n\n.HJ9x7a_entryRowDisabled {\n opacity: .72;\n}\n\n.HJ9x7a_entryMain {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n max-width: 100%;\n display: flex;\n}\n\n.HJ9x7a_entryHead {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.HJ9x7a_entryDesc {\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary, #6b7280);\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n display: -webkit-box;\n overflow: hidden;\n}\n\n.HJ9x7a_entryPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_entryActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n display: flex;\n}\n\n.HJ9x7a_iconBtn {\n width: 32px;\n height: 32px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n justify-content: center;\n align-items: center;\n padding: 0;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_iconBtn:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.HJ9x7a_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n.HJ9x7a_iconBtnDanger:hover {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n}\n\n.HJ9x7a_empty {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-align: center;\n padding: 24px 12px;\n font-size: 12px;\n}\n\n.HJ9x7a_entryGrid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n display: grid;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryPath {\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryRow {\n flex-direction: column;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryActions {\n align-self: flex-end;\n margin-top: auto;\n}\n\n.HJ9x7a_iconBtn:focus-visible, .HJ9x7a_entryName:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n@container (width <= 540px) {\n .HJ9x7a_entryGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .HJ9x7a_entryRow {\n flex-wrap: wrap;\n }\n\n .HJ9x7a_entryActions {\n margin-left: auto;\n }\n\n .HJ9x7a_entryMain {\n flex-basis: 100%;\n }\n}\n\n.HJ9x7a_entryName {\n max-width: 100%;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.HJ9x7a_entryName:hover {\n text-decoration: underline;\n}\n\n.HJ9x7a_entryHead {\n flex-wrap: wrap;\n}\n\n.HJ9x7a_roleFields {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-radius: 8px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n min-width: 0;\n padding: 12px;\n display: grid;\n}\n\n.HJ9x7a_roleFields legend {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_roleFields .HJ9x7a_editorHint, .HJ9x7a_roleFields .HJ9x7a_editorError {\n grid-column: 1 / -1;\n}\n\n.HJ9x7a_editorLabel {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_editorInput {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n min-width: 0;\n color: inherit;\n font: inherit;\n border-radius: 6px;\n padding: 8px 10px;\n}\n\n@media (width <= 480px) {\n .HJ9x7a_roleFields {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n.G2mDja_form {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n display: flex;\n}\n\n.G2mDja_head {\n color: var(--dsw-alias-label-secondary, #667085);\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n}\n\n.G2mDja_error {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n overflow-wrap: anywhere;\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.G2mDja_row {\n border-top: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n padding-top: 8px;\n display: flex;\n}\n\n.G2mDja_ref {\n color: var(--dsw-alias-label-primary, #1f2328);\n font: 600 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.G2mDja_controls {\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.G2mDja_facts {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.G2mDja_factOk, .G2mDja_factMiss {\n border-radius: 999px;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.G2mDja_factOk {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.G2mDja_factMiss {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.G2mDja_note {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 17px;\n}\n\n.G2mDja_editor {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.G2mDja_input {\n box-sizing: border-box;\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n padding: 7px 10px;\n font-size: 12px;\n}\n\n.G2mDja_input:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.G2mDja_actions {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n.HJ9x7a_shell {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 16px;\n display: flex;\n container-type: inline-size;\n}\n\n.HJ9x7a_header {\n flex-direction: row;\n flex: none;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n min-height: 46px;\n display: flex;\n}\n\n.HJ9x7a_headerText {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.HJ9x7a_subtitle {\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.HJ9x7a_headerActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.HJ9x7a_body {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 12px;\n min-height: 0;\n display: flex;\n overflow-y: auto;\n}\n\n.HJ9x7a_busyLine {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_busyLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n.HJ9x7a_spinner {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex: none;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_spinning {\n animation: .9s linear infinite HJ9x7a_panel-spin;\n}\n\n@keyframes HJ9x7a_panel-spin {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .HJ9x7a_spinning {\n animation-duration: 2.4s;\n }\n}\n\n.HJ9x7a_badgePlugin, .HJ9x7a_badgeUser {\n white-space: nowrap;\n box-sizing: border-box;\n text-overflow: ellipsis;\n background: var(--dsw-alias-interactive-bg-hover);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n border-radius: 4px;\n flex: none;\n align-items: center;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 16px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.HJ9x7a_editorDialog {\n max-width: 720px;\n}\n\n.HJ9x7a_editorBody {\n flex-direction: column;\n gap: 10px;\n display: flex;\n}\n\n.HJ9x7a_editorForm {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_editorNameRow {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorName {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_editorPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_editorHint {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_editorArea {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n resize: vertical;\n border-radius: 8px;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n.HJ9x7a_editorFooter {\n flex-direction: row;\n flex: 1;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorError {\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n margin-right: auto;\n font-size: 12px;\n}\n\n.HJ9x7a_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_entryList {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryRow {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-left: 3px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 8px;\n flex-direction: row;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n display: flex;\n}\n\n.HJ9x7a_entryRowDisabled {\n opacity: .72;\n}\n\n.HJ9x7a_entryMain {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n max-width: 100%;\n display: flex;\n}\n\n.HJ9x7a_entryHead {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.HJ9x7a_entryDesc {\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary, #6b7280);\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n display: -webkit-box;\n overflow: hidden;\n}\n\n.HJ9x7a_entryPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_entryActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n display: flex;\n}\n\n.HJ9x7a_iconBtn {\n width: 32px;\n height: 32px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n justify-content: center;\n align-items: center;\n padding: 0;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_iconBtn:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.HJ9x7a_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n.HJ9x7a_iconBtnDanger:hover {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n}\n\n.HJ9x7a_empty {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-align: center;\n padding: 24px 12px;\n font-size: 12px;\n}\n\n.HJ9x7a_entryGrid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n display: grid;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryPath {\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryRow {\n flex-direction: column;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryActions {\n align-self: flex-end;\n margin-top: auto;\n}\n\n.HJ9x7a_iconBtn:focus-visible, .HJ9x7a_entryName:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n@container (width <= 540px) {\n .HJ9x7a_entryGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .HJ9x7a_entryRow {\n flex-wrap: wrap;\n }\n\n .HJ9x7a_entryActions {\n margin-left: auto;\n }\n\n .HJ9x7a_entryMain {\n flex-basis: 100%;\n }\n}\n\n.HJ9x7a_entryName {\n max-width: 100%;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.HJ9x7a_entryName:hover {\n text-decoration: underline;\n}\n\n.HJ9x7a_entryHead {\n flex-wrap: wrap;\n}\n\n.HJ9x7a_roleFields {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-radius: 8px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n min-width: 0;\n padding: 12px;\n display: grid;\n}\n\n.HJ9x7a_roleFields legend {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_roleFields .HJ9x7a_editorHint, .HJ9x7a_roleFields .HJ9x7a_editorError {\n grid-column: 1 / -1;\n}\n\n.HJ9x7a_editorLabel {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_editorInput {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n min-width: 0;\n color: inherit;\n font: inherit;\n border-radius: 6px;\n padding: 8px 10px;\n}\n\n@media (width <= 480px) {\n .HJ9x7a_roleFields {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.AUWlZW_surface {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n display: flex;\n}\n\n.AUWlZW_summary {\n color: var(--dsw-alias-label-secondary, #667085);\n white-space: nowrap;\n align-items: center;\n gap: 7px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.AUWlZW_errorSummary {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n font-variant-numeric: tabular-nums;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.AUWlZW_summaryBar {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n flex-wrap: wrap;\n flex: none;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n display: flex;\n}\n\n.AUWlZW_summaryChip {\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n border-radius: 999px;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n display: inline-flex;\n}\n\n.AUWlZW_chiporphaned, .AUWlZW_chipfailed {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n}\n\n.AUWlZW_chipneedsCredentials, .AUWlZW_chipdegraded {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_chipdisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n\n.AUWlZW_summaryAllGood {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n align-items: center;\n gap: 7px;\n font-size: 12px;\n display: inline-flex;\n}\n\n.AUWlZW_summaryCount {\n font-weight: 700;\n}\n\n.AUWlZW_summaryLabel {\n color: inherit;\n}\n\n.AUWlZW_observedAt {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n white-space: nowrap;\n margin-left: auto;\n font-size: 11px;\n}\n\n.AUWlZW_summaryDotGreen, .AUWlZW_summaryDotRed {\n border-radius: 50%;\n width: 7px;\n height: 7px;\n}\n\n.AUWlZW_summaryDotGreen {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_summaryDotRed {\n background: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_summaryDotWarn {\n background: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_summaryDotInfo {\n background: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.AUWlZW_toolbar {\n flex: none;\n}\n\n.AUWlZW_grid {\n scrollbar-gutter: stable;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: grid;\n overflow-y: auto;\n}\n\n@media (width <= 760px) {\n .AUWlZW_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.AUWlZW_list {\n scrollbar-gutter: stable;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: flex;\n overflow-y: auto;\n}\n\n.AUWlZW_list .AUWlZW_card {\n flex-flow: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n.AUWlZW_card {\n min-width: 0;\n min-height: 0;\n color: inherit;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n cursor: pointer;\n font: inherit;\n text-align: left;\n user-select: none;\n border-radius: 8px;\n flex-direction: column;\n transition: border-color .15s, background .15s, box-shadow .15s;\n display: flex;\n}\n\n.AUWlZW_card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n.AUWlZW_cardBody {\n flex-direction: column;\n flex: 1;\n gap: 8px;\n min-width: 0;\n padding: 12px 14px 10px;\n display: flex;\n}\n\n.AUWlZW_card:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n.AUWlZW_cardTop {\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.AUWlZW_statusDot {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n border-radius: 50%;\n flex: none;\n width: 7px;\n height: 7px;\n}\n\n.AUWlZW_statusconnected {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_statusdegraded {\n background: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusfailed {\n background: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statusneeds-credentials {\n background: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusorphaned {\n background: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statusdisabled {\n background: var(--dsw-alias-label-tertiary, #98a2b3);\n}\n\n.AUWlZW_service {\n flex: 1;\n min-width: 0;\n}\n\n.AUWlZW_name {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 600 13px / 22px ui-monospace, Menlo, Consolas, monospace;\n display: block;\n overflow: hidden;\n}\n\n.AUWlZW_endpoint {\n max-height: 36px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n overflow-wrap: anywhere;\n margin: 0;\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n overflow: hidden;\n}\n\n.AUWlZW_sourcePlugin, .AUWlZW_sourceDirect, .AUWlZW_transport, .AUWlZW_toolCount {\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-radius: 4px;\n align-items: center;\n gap: 5px;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.AUWlZW_sourcePlugin svg, .AUWlZW_sourceDirect svg {\n color: currentColor;\n stroke: currentColor;\n stroke-width: 1.35px;\n stroke-linecap: round;\n stroke-linejoin: round;\n flex: none;\n width: 14px;\n height: 14px;\n}\n\n.AUWlZW_transport {\n font-family: ui-monospace, Menlo, Consolas, monospace;\n}\n\n.AUWlZW_toolCount {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex: none;\n font-weight: 600;\n}\n\n.AUWlZW_reasonLabel {\n opacity: .85;\n flex: none;\n font-weight: 600;\n}\n\n.AUWlZW_statePill {\n white-space: nowrap;\n border-radius: 999px;\n align-items: center;\n gap: 5px;\n padding: 1px 8px;\n font-size: 11px;\n font-weight: 600;\n line-height: 17px;\n display: inline-flex;\n}\n\n.AUWlZW_statePill:before {\n content: \"\";\n background: currentColor;\n border-radius: 50%;\n width: 6px;\n height: 6px;\n}\n\n.AUWlZW_stateconnected {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.AUWlZW_statedegraded, .AUWlZW_stateneeds-credentials {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_statefailed, .AUWlZW_stateorphaned {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n}\n\n.AUWlZW_statedisabled {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n}\n\n.AUWlZW_state, .AUWlZW_detailState {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n display: inline-flex;\n}\n\n.AUWlZW_state:before, .AUWlZW_detailState:before {\n content: \"\";\n background: currentColor;\n border-radius: 50%;\n width: 6px;\n height: 6px;\n}\n\n.AUWlZW_stateconnected, .AUWlZW_detailStateconnected {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_statedegraded, .AUWlZW_detailStatedegraded {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statefailed, .AUWlZW_detailStatefailed {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_stateneeds-credentials, .AUWlZW_detailStateneeds-credentials {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_stateorphaned, .AUWlZW_detailStateorphaned {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statedisabled, .AUWlZW_detailStatedisabled {\n color: var(--dsw-alias-label-tertiary, #98a2b3);\n}\n\n.AUWlZW_chevron {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 18px;\n}\n\n.AUWlZW_empty, .AUWlZW_detailEmpty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-align: center;\n padding: 24px;\n font-size: 12px;\n}\n\n.AUWlZW_error {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n align-items: center;\n gap: 8px;\n margin: 16px 0;\n font-size: 12px;\n display: flex;\n}\n\n.AUWlZW_boundary {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-left: 2px solid var(--dsw-alias-border-l3, #d9dde3);\n margin: 10px 0 0;\n padding: 9px 10px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.AUWlZW_detailDialog {\n width: min(720px, 94vw);\n}\n\n.AUWlZW_detailBody {\n max-height: 72vh;\n overflow-y: auto;\n}\n\n.AUWlZW_modalFooter {\n justify-content: flex-end;\n width: 100%;\n display: flex;\n}\n\n.AUWlZW_detail {\n flex-direction: column;\n gap: 16px;\n display: flex;\n}\n\n.AUWlZW_detailMeta {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.AUWlZW_detailHero {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n display: flex;\n}\n\n.AUWlZW_detailHeroText {\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n display: flex;\n}\n\n.AUWlZW_detailEndpoint {\n color: var(--dsw-alias-label-secondary, #667085);\n overflow-wrap: anywhere;\n margin: 0;\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.AUWlZW_reason {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n border-left: 2px solid;\n padding: 9px 10px;\n font-size: 11px;\n line-height: 16px;\n}\n\n.AUWlZW_reasonBox {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n border-radius: 8px;\n flex-direction: column;\n gap: 4px;\n padding: 10px 12px;\n display: flex;\n}\n\n.AUWlZW_reasonText {\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.AUWlZW_detailSection {\n flex-direction: column;\n gap: 7px;\n display: flex;\n}\n\n.AUWlZW_detailHead {\n color: var(--dsw-alias-label-secondary, #667085);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0;\n padding-bottom: 5px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.AUWlZW_config {\n max-height: 220px;\n color: var(--dsw-alias-label-primary, #344054);\n background: var(--dsw-alias-bg-layer-2, #f6f8fc);\n border: 1px solid var(--dsw-alias-border-l1, #e2e7ef);\n white-space: pre-wrap;\n word-break: break-word;\n border-radius: 7px;\n margin: 0;\n padding: 10px;\n font: 11px / 17px ui-monospace, Menlo, Consolas, monospace;\n overflow: auto;\n}\n\n.AUWlZW_toolList {\n flex-direction: column;\n display: flex;\n}\n\n.AUWlZW_tool {\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n grid-template-columns: minmax(140px, max-content) minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 7px 0;\n display: grid;\n}\n\n.AUWlZW_tool:last-child {\n border-bottom: none;\n}\n\n.AUWlZW_toolName {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 11px / 16px ui-monospace, Menlo, Consolas, monospace;\n overflow: hidden;\n}\n\n.AUWlZW_toolDescription {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 10px;\n overflow: hidden;\n}\n\n@media (width <= 760px) {\n .AUWlZW_header, .AUWlZW_toolbar {\n padding-left: 0;\n padding-right: 0;\n }\n\n .AUWlZW_header {\n flex-direction: column;\n }\n\n .AUWlZW_headerActions {\n justify-content: space-between;\n width: 100%;\n margin-left: 0;\n }\n\n .AUWlZW_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .AUWlZW_list .AUWlZW_cardTop {\n max-width: 100%;\n }\n\n .AUWlZW_tool {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .AUWlZW_toolDescription {\n display: none;\n }\n\n .AUWlZW_summaryBar {\n gap: 6px;\n padding: 8px 10px;\n }\n\n .AUWlZW_observedAt {\n flex-basis: 100%;\n margin-left: 0;\n }\n}\n\n.AUWlZW_statemounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.AUWlZW_statehost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_stateconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n}\n\n.AUWlZW_statusmounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_statushost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_chipmounted {\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.AUWlZW_chipblocked {\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_list .AUWlZW_card {\n min-height: 0;\n padding: 2px 0;\n}\n\n.AUWlZW_list .AUWlZW_cardBody {\n flex-flow: row;\n align-items: center;\n gap: 12px;\n padding: 8px 14px;\n}\n\n.AUWlZW_list .AUWlZW_cardTop {\n flex: 0 300px;\n min-width: 0;\n}\n\n.AUWlZW_list .AUWlZW_endpoint {\n white-space: nowrap;\n text-overflow: ellipsis;\n flex: 240px;\n max-height: 22px;\n overflow: hidden;\n}\n\n.AUWlZW_extRow {\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n grid-template-columns: minmax(64px, auto) 20px minmax(0, 1fr);\n align-items: center;\n gap: 10px;\n padding: 7px 0;\n display: grid;\n}\n\n.AUWlZW_extRow:last-child {\n border-bottom: none;\n}\n\n.AUWlZW_extName {\n color: var(--dsw-alias-label-primary, #1f2328);\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.AUWlZW_extArrow {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n}\n\n.AUWlZW_extLanguage {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n overflow: hidden;\n}\n\n.AUWlZW_retryStack {\n align-items: center;\n gap: 10px;\n margin-right: 4px;\n display: inline-flex;\n}\n\n.AUWlZW_retrySpinner {\n font-size: 13px;\n line-height: 1;\n display: inline-flex;\n}\n\n.AUWlZW_spinning {\n animation: .9s linear infinite AUWlZW_mcp-retry-spin;\n}\n\n@keyframes AUWlZW_mcp-retry-spin {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .AUWlZW_spinning {\n animation: none;\n }\n}\n\n.AUWlZW_retryEchoSuccess, .AUWlZW_retryEchoFailure {\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.AUWlZW_retryEchoSuccess {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_retryEchoFailure {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statusstarting {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n animation: 1.2s ease-in-out infinite AUWlZW_lspStartingPulse;\n}\n\n@keyframes AUWlZW_lspStartingPulse {\n 50% {\n opacity: .35;\n }\n}\n\n.AUWlZW_statusforeign {\n background: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.AUWlZW_reasonRaw {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n word-break: break-all;\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n.l0H8fW_workspace {\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 12px;\n display: flex;\n}\n\n.l0H8fW_pageMode {\n box-sizing: border-box;\n padding: 4px 0;\n}\n\n.l0H8fW_tabRow {\n border-bottom: 1px solid var(--dsw-alias-border-l2, #0000001a);\n scrollbar-width: none;\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 4px;\n display: flex;\n overflow-x: auto;\n}\n\n.l0H8fW_tab, .l0H8fW_tabOn {\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: none;\n padding: 7px 14px;\n font-size: 13px;\n line-height: 20px;\n position: relative;\n}\n\n.l0H8fW_tab:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.l0H8fW_tabOn {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n\n.l0H8fW_tabOn:after {\n background: var(--dsw-alias-brand-primary);\n content: \"\";\n border-radius: 2px;\n height: 2px;\n position: absolute;\n bottom: 0;\n left: 10px;\n right: 10px;\n}\n\n.l0H8fW_tabPanel {\n flex-direction: column;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n";document.head.appendChild(s);}})();
|
|
5
|
+
(function(){if(typeof document!=="undefined"){var s=document.createElement("style");s.setAttribute("data-dsh-client","dsh-agent-plugins-market");s.textContent=".qUlk6a_overlay {\n z-index: 2147483647;\n box-sizing: border-box;\n background: var(--dsw-alias-bg-mask-3);\n backdrop-filter: blur(3px);\n cursor: progress;\n outline: none;\n place-items: center;\n display: grid;\n position: fixed;\n overflow: hidden;\n}\n\n.qUlk6a_overlay[data-visible=\"false\"] {\n backdrop-filter: none;\n background: none;\n}\n\n.qUlk6a_overlay[data-visible=\"true\"] {\n animation: .14s ease-out qUlk6a_busy-enter;\n}\n\n.qUlk6a_content {\n box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n width: min(360px, 100% - 32px);\n color: var(--dsw-alias-label-primary);\n text-align: center;\n border-radius: 8px;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n display: flex;\n}\n\n.qUlk6a_spinner {\n width: 28px;\n height: 28px;\n animation: .9s linear infinite qUlk6a_busy-spin;\n display: flex;\n}\n\n.qUlk6a_label {\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n\n.qUlk6a_hintViewport {\n width: 100%;\n min-height: 54px;\n overflow: hidden;\n}\n\n.qUlk6a_hint {\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 13px;\n line-height: 18px;\n animation: .3s ease-out qUlk6a_busy-hint;\n}\n\n.qUlk6a_warning {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n overflow-wrap: anywhere;\n border-radius: 6px;\n margin: 0;\n padding: 6px 8px;\n font-size: 12px;\n line-height: 17px;\n}\n\n@keyframes qUlk6a_busy-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes qUlk6a_busy-enter {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes qUlk6a_busy-hint {\n from {\n opacity: 0;\n transform: translateY(14px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .qUlk6a_overlay, .qUlk6a_hint {\n animation: none;\n }\n\n .qUlk6a_spinner {\n animation-duration: 2.4s;\n }\n}\n._72qoAq_market {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 24px;\n display: flex;\n}\n\n._72qoAq_pageMode {\n width: 100%;\n min-width: 0;\n height: 100%;\n min-height: 0;\n}\n\n._72qoAq_marketControls {\n flex-direction: column;\n gap: 8px;\n min-height: 0;\n display: flex;\n}\n\nhtml[data-dsh-agent-plugins-market-page] [data-pane=\"conversation\"], html[data-dsh-agent-plugins-market-page] [class*=\"centerCol\"] {\n position: relative;\n}\n\n._72qoAq_pageView {\n z-index: 60;\n background: var(--dsw-alias-bg-base, #f7f8fa);\n min-width: 0;\n min-height: 0;\n padding: 20px 24px;\n display: none;\n position: absolute;\n inset: 0;\n overflow: hidden;\n}\n\nhtml[data-dsh-agent-plugins-market-page] ._72qoAq_pageView {\n display: flex;\n}\n\nhtml[data-dsh-agent-plugins-market-page] [data-pane=\"conversation\"] > :not([data-dsh-agent-plugins-market-page-view]), html[data-dsh-agent-plugins-market-page] [class*=\"centerCol\"] > :not([data-dsh-agent-plugins-market-page-view]) {\n display: none !important;\n}\n\n._72qoAq_pageEntry {\n width: 100%;\n min-height: 32px;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n font: inherit;\n text-align: left;\n background: none;\n border: none;\n border-radius: 8px;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n font-size: 13px;\n line-height: 20px;\n display: flex;\n}\n\n._72qoAq_pageEntry:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n._72qoAq_pageEntry:active {\n background: var(--dsw-alias-interactive-bg-active, #2631481a);\n}\n\n._72qoAq_pageEntry svg {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-shrink: 0;\n}\n\n._72qoAq_pageEntry span {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n[data-dsh-frame][data-sidebar-collapsed] ._72qoAq_pageEntry {\n justify-content: center;\n padding-inline: 0;\n}\n\n[data-dsh-frame][data-sidebar-collapsed] ._72qoAq_pageEntry span {\n display: none;\n}\n\n._72qoAq_pageEntry:focus-visible, ._72qoAq_srcTabMain:focus-visible, ._72qoAq_srcTabEdit:focus-visible, ._72qoAq_srcTabDel:focus-visible, ._72qoAq_seg:focus-visible, ._72qoAq_segOn:focus-visible, ._72qoAq_detailItemRow:focus-visible, ._72qoAq_detailItemOpen:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n._72qoAq_header {\n flex-direction: column;\n flex-shrink: 0;\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_sourceTabsBox {\n min-width: 0;\n position: relative;\n}\n\n._72qoAq_sourceTabsRow {\n grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));\n gap: 4px;\n min-width: 0;\n display: grid;\n}\n\n._72qoAq_sourceTabsBoxFold {\n height: 52px;\n}\n\n._72qoAq_sourceTabsBoxFold ._72qoAq_sourceTabsRow {\n box-sizing: border-box;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 10px;\n max-height: 58px;\n padding: 6px 6px 0;\n transition: max-height .16s, box-shadow .16s, padding-bottom .16s;\n position: absolute;\n inset: -6px -6px auto;\n overflow: hidden;\n -webkit-mask-image: linear-gradient(#000 78%, #0000 100%);\n mask-image: linear-gradient(#000 78%, #0000 100%);\n}\n\n._72qoAq_sourceTabsBoxFold:hover ._72qoAq_sourceTabsRow, ._72qoAq_sourceTabsBoxFold:has(:focus-visible) ._72qoAq_sourceTabsRow {\n z-index: 30;\n max-height: 420px;\n box-shadow: 0 0 0 1px var(--dsw-alias-border-l3, #d9dde3),\n 0 12px 28px #10182829;\n padding-bottom: 6px;\n -webkit-mask-image: none;\n mask-image: none;\n}\n\n._72qoAq_sourceTabsBoxFold._72qoAq_sourceTabsBoxPicked:hover ._72qoAq_sourceTabsRow, ._72qoAq_sourceTabsBoxFold._72qoAq_sourceTabsBoxPicked:has(:focus-visible) ._72qoAq_sourceTabsRow {\n max-height: 58px;\n box-shadow: none;\n padding-bottom: 0;\n -webkit-mask-image: linear-gradient(#000 78%, #0000 100%);\n mask-image: linear-gradient(#000 78%, #0000 100%);\n}\n\n._72qoAq_unmanagedRow {\n color: var(--dsw-alias-label-secondary, #57606a);\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n font-size: 12px;\n display: flex;\n}\n\n._72qoAq_unmanagedLabel {\n flex-shrink: 0;\n}\n\n._72qoAq_unmanagedChip {\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 999px;\n align-items: center;\n gap: 2px;\n max-width: 220px;\n height: 22px;\n padding: 0 4px 0 8px;\n display: inline-flex;\n}\n\n._72qoAq_unmanagedChipName {\n white-space: nowrap;\n text-overflow: ellipsis;\n font-size: 12px;\n overflow: hidden;\n}\n\n._72qoAq_unmanagedAdopt {\n font: inherit;\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n padding: 0 4px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_unmanagedAdopt:disabled {\n cursor: default;\n opacity: .5;\n}\n\n._72qoAq_srcTabEdit {\n font: inherit;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n margin-left: 4px;\n padding: 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_srcTabEdit:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabEdit, ._72qoAq_srcTabOn ._72qoAq_srcTabEdit:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n._72qoAq_srcTab, ._72qoAq_srcTabOn {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n width: auto;\n max-width: 100%;\n height: 24px;\n padding: 0 10px;\n display: inline-flex;\n overflow: hidden;\n}\n\n._72qoAq_srcTabMain {\n font: inherit;\n color: var(--dsw-alias-label-primary, #1f2328);\n cursor: pointer;\n white-space: nowrap;\n text-overflow: ellipsis;\n background: none;\n border: none;\n flex: 1;\n min-width: 0;\n padding: 0;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n._72qoAq_srcTabMain:hover {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n._72qoAq_srcTabOn {\n background: var(--dsw-alias-brand-primary, #0f1115);\n border-color: var(--dsw-alias-brand-primary, #0f1115);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabMain {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n font-weight: 600;\n}\n\n._72qoAq_srcTabDel {\n font: inherit;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n flex-shrink: 0;\n margin-left: 4px;\n padding: 0 2px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_srcTabDel:hover {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n._72qoAq_srcTabOn ._72qoAq_srcTabDel, ._72qoAq_srcTabOn ._72qoAq_srcTabDel:hover {\n color: var(--dsw-alias-label-primary-foreground, #fff);\n}\n\n._72qoAq_grid {\n scrollbar-gutter: stable;\n flex: 1;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: grid;\n overflow-y: auto;\n}\n\n._72qoAq_list {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 8px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: flex;\n overflow-y: auto;\n}\n\n._72qoAq_list ._72qoAq_card {\n flex-flow: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n._72qoAq_list ._72qoAq_cardTop, ._72qoAq_list ._72qoAq_cardActions {\n flex: none;\n}\n\n._72qoAq_list ._72qoAq_meta, ._72qoAq_list ._72qoAq_tagRow {\n flex-basis: 100%;\n}\n\n._72qoAq_empty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-align: center;\n grid-column: 1 / -1;\n padding: 48px 0;\n font-size: 13px;\n}\n\n._72qoAq_card {\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-left: 3px solid var(--dsw-alias-border-l2);\n cursor: pointer;\n border-radius: 12px;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n padding: 12px 14px;\n transition: border-color .15s, background .15s, box-shadow .15s;\n display: flex;\n}\n\n._72qoAq_card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n box-shadow: 0 1px 4px #1018280f;\n}\n\n._72qoAq_cardTop {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n._72qoAq_cardTitle {\n flex: 1;\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_cardName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n line-height: 22px;\n overflow: hidden;\n}\n\n._72qoAq_version {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-variant-numeric: tabular-nums;\n flex-shrink: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n._72qoAq_cardActions {\n flex-shrink: 0;\n align-items: center;\n gap: 4px;\n display: flex;\n}\n\n._72qoAq_iconBtn {\n cursor: pointer;\n width: 26px;\n height: 26px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n background: none;\n border: none;\n border-radius: 999px;\n justify-content: center;\n align-items: center;\n padding: 0;\n transition: background .15s, color .15s;\n display: inline-flex;\n}\n\n._72qoAq_iconBtn svg {\n fill: none;\n stroke: currentColor;\n stroke-width: 1.8px;\n stroke-linecap: round;\n stroke-linejoin: round;\n width: 15px;\n height: 15px;\n}\n\n._72qoAq_iconBtn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n._72qoAq_iconBtn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, #2631481a);\n}\n\n._72qoAq_iconBtn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n._72qoAq_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n._72qoAq_iconBtnDanger:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #ec1313);\n}\n\n._72qoAq_switchOn, ._72qoAq_switchOff {\n cursor: pointer;\n border: none;\n border-radius: 999px;\n flex-shrink: 0;\n width: 38px;\n height: 22px;\n padding: 0;\n transition: background-color .15s;\n position: relative;\n}\n\n._72qoAq_switchOn {\n background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-brand-primary, #4f6ef7));\n}\n\n._72qoAq_switchOff {\n background: var(--dsw-alias-label-dimmed, #e1e5ee);\n}\n\n._72qoAq_switchOn:disabled, ._72qoAq_switchOff:disabled {\n opacity: .6;\n cursor: default;\n}\n\n._72qoAq_switchThumb {\n pointer-events: none;\n background: #fff;\n border-radius: 50%;\n width: 16px;\n height: 16px;\n transition: left .15s;\n position: absolute;\n top: 3px;\n left: 3px;\n box-shadow: 0 1px 2px #0003;\n}\n\n._72qoAq_switchOn ._72qoAq_switchThumb {\n left: 19px;\n}\n\n._72qoAq_desc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n max-height: 36px;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow: hidden;\n}\n\n._72qoAq_meta, ._72qoAq_tagRow {\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_src {\n color: var(--dsw-alias-label-secondary, #9ca3af);\n font-size: 12px;\n text-decoration: none;\n}\n\n._72qoAq_tag {\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-radius: 4px;\n flex-shrink: 0;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_okState {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n font-size: 12px;\n font-weight: 600;\n}\n\n._72qoAq_warnLine {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n cursor: help;\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n._72qoAq_modalFooter {\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n display: flex;\n}\n\n._72qoAq_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n._72qoAq_modalFooterLeft {\n gap: 8px;\n margin-right: auto;\n display: flex;\n}\n\n._72qoAq_editorDialog {\n width: min(500px, 92vw);\n}\n\n._72qoAq_installConfirmBody {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_installConfirmSuite {\n color: var(--dsw-alias-label-primary, #111827);\n font-weight: 600;\n}\n\n._72qoAq_installConfirmMeta {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-size: 12px;\n}\n\n._72qoAq_installConfirmCommit {\n color: var(--dsw-alias-label-secondary, #4b5563);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n\n._72qoAq_installConfirmTags {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_installConfirmWarn {\n color: var(--dsw-alias-state-warn-label, #dd8629);\n border: 1px solid var(--dsw-alias-state-warn-label, #dd8629);\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 12px;\n}\n\n._72qoAq_editorForm {\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_modeRow {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n border-radius: 10px;\n align-self: flex-start;\n gap: 6px;\n padding: 3px;\n display: flex;\n}\n\n._72qoAq_seg, ._72qoAq_segOn {\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 8px;\n padding: 5px 14px;\n font-size: 13px;\n line-height: 20px;\n}\n\n._72qoAq_segOn {\n background: var(--dsw-alias-bg-layer-1, #fff);\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n box-shadow: 0 1px 2px #00000014;\n}\n\n._72qoAq_fieldGroup {\n flex-direction: column;\n gap: 5px;\n display: flex;\n}\n\n._72qoAq_fieldLabel {\n color: var(--dsw-alias-label-secondary, #6b7280);\n font-size: 12px;\n font-weight: 600;\n}\n\n._72qoAq_fieldHint {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n line-height: 16px;\n}\n\n._72qoAq_staticId {\n border: 1px dashed var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-bg-layer-2, #f3f4f6);\n border-radius: 8px;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n display: flex;\n}\n\n._72qoAq_staticIdValue {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailDialog {\n width: min(800px, 94vw);\n}\n\n._72qoAq_detailBody {\n flex-direction: column;\n gap: 14px;\n max-height: 78vh;\n display: flex;\n overflow-y: auto;\n}\n\n._72qoAq_detailSections {\n flex-direction: column;\n gap: 14px;\n display: flex;\n}\n\n._72qoAq_detailSection {\n flex-direction: column;\n gap: 6px;\n display: flex;\n}\n\n._72qoAq_detailHead {\n color: var(--dsw-alias-label-secondary, #6b7280);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0;\n padding-bottom: 4px;\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailGrid {\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 6px 14px;\n display: grid;\n}\n\n._72qoAq_detailCell {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_detailKey {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 12px;\n}\n\n._72qoAq_detailValue {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n overflow: hidden;\n}\n\n._72qoAq_detailDesc {\n color: var(--dsw-alias-label-secondary, #6b7280);\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n._72qoAq_mono {\n word-break: break-all;\n white-space: pre-wrap;\n color: var(--dsw-alias-label-primary, #1f2328);\n margin: 0;\n font-family: ui-monospace, Menlo, Consolas, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_detailItem {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n flex-direction: column;\n display: flex;\n overflow: hidden;\n}\n\n._72qoAq_detailItemRow, ._72qoAq_detailItemOpen {\n width: 100%;\n font: inherit;\n text-align: left;\n cursor: pointer;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: none;\n border: none;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n display: flex;\n}\n\n._72qoAq_detailItemRow:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n._72qoAq_detailItemOpen {\n background: var(--dsw-alias-state-business-tertiary, #e4edfd);\n}\n\n._72qoAq_detailItemName {\n flex-shrink: 0;\n font-size: 13px;\n font-weight: 600;\n}\n\n._72qoAq_detailItemDesc {\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n font-size: 12px;\n overflow: hidden;\n}\n\n._72qoAq_detailChevron {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n flex-shrink: 0;\n}\n\n._72qoAq_skillContent {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n max-height: 320px;\n color: var(--dsw-alias-label-primary, #1f2328);\n padding: 10px 12px;\n font-size: 13px;\n line-height: 20px;\n overflow-y: auto;\n}\n\n._72qoAq_progress, ._72qoAq_progressError {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-2, #7f7f7f0f);\n color: var(--dsw-alias-label-primary, #1f2328);\n border-radius: 8px;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n font-size: 13px;\n line-height: 20px;\n display: flex;\n}\n\n._72qoAq_progressError {\n border-color: var(--dsw-alias-state-error-primary, #ec1313);\n color: var(--dsw-alias-state-error-primary, #ec1313);\n}\n\n._72qoAq_progressSpin {\n border: 2px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-top-color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-radius: 50%;\n flex-shrink: 0;\n width: 14px;\n height: 14px;\n animation: .8s linear infinite _72qoAq_dshApmSpin;\n}\n\n@keyframes _72qoAq_dshApmSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n._72qoAq_progressFail {\n flex-shrink: 0;\n font-size: 13px;\n}\n\n._72qoAq_progressText {\n overflow-wrap: anywhere;\n min-width: 0;\n}\n\n@media (width <= 720px) {\n ._72qoAq_pageView {\n padding: 14px;\n }\n\n ._72qoAq_sourceTabsRow {\n grid-template-columns: repeat(auto-fill, minmax(102px, 1fr));\n }\n\n ._72qoAq_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n ._72qoAq_list ._72qoAq_cardTop, ._72qoAq_list ._72qoAq_cardActions {\n max-width: 100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._72qoAq_progressSpin, ._72qoAq_switchOn, ._72qoAq_switchOff, ._72qoAq_switchThumb {\n transition: none;\n animation: none;\n }\n}\n\n._72qoAq_surfaceToggles {\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 14px;\n display: flex;\n}\n\n._72qoAq_surfaceToggle {\n color: var(--dsw-alias-label-secondary, #61666b);\n cursor: pointer;\n user-select: none;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n display: inline-flex;\n}\n\n._72qoAq_surfaceToggle input[type=\"checkbox\"] {\n accent-color: var(--dsw-alias-brand-primary-new-colorprimary-new-color, #4176e6);\n margin: 0;\n}\n\n._72qoAq_pluginCard {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n background: var(--dsw-alias-bg-layer-3, #fff);\n border-radius: 12px;\n list-style: none;\n transition: border-color .16s, background .16s;\n container: _72qoAq_market-config / inline-size;\n}\n\n._72qoAq_pluginCard:hover {\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n._72qoAq_pluginCardOpen {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border-color: var(--dsw-alias-label-dimmed, #c8ccd4);\n}\n\n._72qoAq_pluginCard[data-busy=\"true\"] {\n opacity: .6;\n pointer-events: none;\n}\n\n._72qoAq_pluginCardHeader {\n appearance: none;\n width: 100%;\n font: inherit;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: 12px;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n display: flex;\n}\n\n._72qoAq_pluginCardHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: -2px;\n}\n\n._72qoAq_pluginCardBody {\n border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n flex-direction: column;\n gap: 8px;\n margin: 0 16px;\n padding: 4px 0 8px;\n display: flex;\n}\n\n._72qoAq_pluginCardRow {\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 8px 0 4px;\n display: flex;\n}\n\n._72qoAq_pluginCardText {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n display: flex;\n}\n\n._72qoAq_pluginCardTitle {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-size: 15px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n._72qoAq_pluginCardDesc {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 13px;\n line-height: 1.5;\n}\n\n._72qoAq_pluginCardRowLabel {\n font-size: 13px;\n font-weight: 500;\n line-height: 20px;\n}\n\n@container _72qoAq_market-config (width <= 320px) {\n ._72qoAq_pluginCardRow {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n ._72qoAq_pluginCardText {\n overflow-wrap: anywhere;\n width: 100%;\n }\n\n ._72qoAq_regionSeg {\n flex-wrap: wrap;\n max-width: 100%;\n }\n}\n\n._72qoAq_pluginCardError {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n}\n\n._72qoAq_pluginChevron {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n flex: none;\n transition: transform .16s;\n display: inline-flex;\n}\n\n._72qoAq_pluginChevronOpen {\n transform: rotate(180deg);\n}\n\n._72qoAq_regionSeg {\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n flex: none;\n gap: 2px;\n padding: 2px;\n display: inline-flex;\n}\n\n._72qoAq_regionSegBtn {\n appearance: none;\n font: inherit;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n._72qoAq_regionSegOn {\n appearance: none;\n font: inherit;\n cursor: pointer;\n background: var(--dsw-alias-bg-layer-2, #eef0f4);\n color: var(--dsw-alias-label-primary, #1f2328);\n border: none;\n border-radius: 6px;\n padding: 3px 10px;\n font-size: 12px;\n font-weight: 600;\n line-height: 18px;\n}\n\n._72qoAq_regionSegBtn:disabled, ._72qoAq_regionSegOn:disabled {\n cursor: default;\n opacity: .5;\n}\n.IgyjIq_card[data-resource-state] {\n box-sizing: border-box;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-primary);\n box-shadow: none;\n border-left-width: 3px;\n border-radius: 8px;\n}\n\n.IgyjIq_card[data-resource-state=\"active\"] {\n border-left-color: var(--dsw-alias-state-success-primary);\n}\n\n.IgyjIq_card[data-resource-state=\"disabled\"] {\n border-left-color: var(--dsw-alias-label-tertiary);\n}\n\n.IgyjIq_card[data-resource-state=\"warning\"] {\n border-left-color: var(--dsw-alias-state-warn-primary);\n}\n\n.IgyjIq_card[data-resource-state=\"error\"] {\n border-left-color: var(--dsw-alias-state-error-primary);\n}\n\n.IgyjIq_card[data-resource-state]:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.IgyjIq_collection[data-resource-view] {\n box-sizing: border-box;\n scrollbar-gutter: stable;\n align-content: start;\n align-items: stretch;\n gap: 12px;\n width: 100%;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n.IgyjIq_collection[data-resource-view=\"grid\"] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n display: grid;\n}\n\n.IgyjIq_collection[data-resource-view=\"list\"] {\n flex-direction: column;\n display: flex;\n}\n\n.IgyjIq_collection[data-resource-view=\"list\"] > .IgyjIq_card {\n flex-shrink: 0;\n}\n.sBXwgW_dialog[role=\"dialog\"] {\n box-sizing: border-box;\n width: min(1120px, 100vw - 48px);\n max-width: calc(100vw - 48px);\n max-height: calc(100dvh - 48px);\n}\n\n.sBXwgW_body {\n overflow-wrap: anywhere;\n min-width: 0;\n min-height: 0;\n max-height: calc(100dvh - 200px);\n overflow-y: auto;\n}\n\n.sBXwgW_modes {\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 12px;\n display: flex;\n}\n\n.sBXwgW_footer {\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n width: 100%;\n display: flex;\n}\n\n.sBXwgW_footer > :first-child {\n flex: 1;\n}\n\n.sBXwgW_footerSlot:empty {\n display: none;\n}\n\n.sBXwgW_mode {\n border: 1px solid var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-secondary);\n font: inherit;\n cursor: pointer;\n background: none;\n border-radius: 4px;\n padding: 6px 12px;\n}\n\n.sBXwgW_mode[aria-pressed=\"true\"] {\n background: var(--dsw-alias-interactive-bg-active);\n color: var(--dsw-alias-label-primary);\n}\n\n.sBXwgW_mode:focus-visible, .sBXwgW_raw:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.sBXwgW_raw {\n box-sizing: border-box;\n resize: vertical;\n border: 1px solid var(--dsw-alias-border-l2);\n width: 100%;\n min-height: 320px;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n border-radius: 6px;\n padding: 12px;\n font: 13px / 1.6 ui-monospace, monospace;\n}\n\n.sBXwgW_section {\n min-width: 0;\n margin: 0 0 16px;\n}\n\n.sBXwgW_heading {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.sBXwgW_metadata {\n grid-template-columns: minmax(100px, 180px) minmax(0, 1fr);\n margin: 0;\n font-size: 13px;\n display: grid;\n}\n\n.sBXwgW_metadata dt, .sBXwgW_metadata dd {\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n min-width: 0;\n margin: 0;\n padding: 8px 0;\n}\n\n.sBXwgW_metadata dt {\n color: var(--dsw-alias-label-secondary);\n padding-right: 12px;\n}\n\n.sBXwgW_metadata dd {\n color: var(--dsw-alias-label-primary);\n}\n\n.sBXwgW_values {\n flex-wrap: wrap;\n gap: 6px;\n display: flex;\n}\n\n.sBXwgW_value {\n background: var(--dsw-alias-interactive-bg-hover);\n border-radius: 4px;\n max-width: 100%;\n padding: 2px 6px;\n}\n\n.sBXwgW_preview {\n min-width: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 1.6;\n}\n\n.sBXwgW_preview pre, .sBXwgW_preview table {\n max-width: 100%;\n overflow: auto;\n}\n\n.sBXwgW_preview img {\n max-width: 100%;\n height: auto;\n}\n\n.sBXwgW_error {\n color: var(--dsw-alias-state-error-primary);\n margin: 8px 0;\n font-size: 13px;\n}\n\n.sBXwgW_form {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 16px;\n display: grid;\n}\n\n.sBXwgW_field {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 13px;\n display: flex;\n}\n\n.sBXwgW_field input, .sBXwgW_field select, .sBXwgW_field textarea {\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n border: 1px solid var(--dsw-alias-border-l2);\n font: inherit;\n border-radius: 4px;\n padding: 8px;\n}\n\n.sBXwgW_wide {\n grid-column: 1 / -1;\n}\n\n.sBXwgW_rows {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.sBXwgW_row {\n align-items: center;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.sBXwgW_row input {\n flex: 1;\n width: 0;\n}\n\n.sBXwgW_row button {\n flex: none;\n}\n\n.sBXwgW_rows > button {\n align-self: flex-start;\n}\n\n@media (width <= 640px) {\n .sBXwgW_dialog[role=\"dialog\"] {\n width: calc(100vw - 16px);\n max-width: calc(100vw - 16px);\n max-height: calc(100dvh - 16px);\n }\n\n .sBXwgW_form {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .sBXwgW_metadata {\n grid-template-columns: minmax(80px, 30%) minmax(0, 1fr);\n }\n}\n.vavGuW_toolbar {\n flex: none;\n align-items: flex-end;\n gap: 6px;\n min-width: 0;\n display: flex;\n}\n\n.vavGuW_filterGap, .vavGuW_viewGap {\n flex: 1 0 12px;\n min-width: 0;\n}\n\n.vavGuW_search {\n box-sizing: border-box;\n flex: 0 240px;\n align-items: center;\n min-width: 0;\n height: 36px;\n display: flex;\n}\n\n.vavGuW_search input {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 36px;\n min-height: 36px;\n max-height: 36px;\n padding-top: 0;\n padding-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n}\n\n.vavGuW_filter, .vavGuW_filterOn {\n min-width: 54px;\n height: 36px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: none;\n border-bottom: 2px solid #0000;\n flex: none;\n justify-content: center;\n align-items: center;\n gap: 5px;\n padding: 7px 9px;\n font-size: 13px;\n display: inline-flex;\n}\n\n.vavGuW_filterOn {\n color: var(--dsw-alias-brand-primary, #4f6ef7);\n border-bottom-color: var(--dsw-alias-brand-primary, #4f6ef7);\n font-weight: 600;\n}\n\n.vavGuW_filter svg, .vavGuW_filterOn svg, .vavGuW_viewSwitch svg {\n stroke: currentColor;\n stroke-width: 1.5px;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.vavGuW_filterCount {\n font-variant-numeric: tabular-nums;\n}\n\n.vavGuW_viewSwitch {\n width: 34px;\n height: 36px;\n color: var(--dsw-alias-label-tertiary, #9ca3af);\n cursor: pointer;\n background: none;\n border: none;\n border-bottom: 2px solid #0000;\n flex: none;\n justify-content: center;\n align-items: center;\n display: inline-flex;\n}\n\n.vavGuW_viewSwitch:hover {\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.vavGuW_viewSwitch:focus-visible, .vavGuW_filter:focus-visible, .vavGuW_filterOn:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n@container (width <= 700px) {\n .vavGuW_toolbar {\n flex-wrap: wrap;\n justify-content: flex-end;\n }\n\n .vavGuW_search {\n flex-basis: 100%;\n }\n\n .vavGuW_filterGap {\n display: none;\n }\n}\n.HJ9x7a_shell {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 16px;\n display: flex;\n container-type: inline-size;\n}\n\n.HJ9x7a_header {\n flex-direction: row;\n flex: none;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n min-height: 46px;\n display: flex;\n}\n\n.HJ9x7a_headerText {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.HJ9x7a_subtitle {\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.HJ9x7a_headerActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.HJ9x7a_body {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 12px;\n min-height: 0;\n display: flex;\n overflow-y: auto;\n}\n\n.HJ9x7a_busyLine {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_busyLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n.HJ9x7a_spinner {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex: none;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_spinning {\n animation: .9s linear infinite HJ9x7a_panel-spin;\n}\n\n@keyframes HJ9x7a_panel-spin {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .HJ9x7a_spinning {\n animation-duration: 2.4s;\n }\n}\n\n.HJ9x7a_badgePlugin, .HJ9x7a_badgeUser {\n white-space: nowrap;\n box-sizing: border-box;\n text-overflow: ellipsis;\n background: var(--dsw-alias-interactive-bg-hover);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n border-radius: 4px;\n flex: none;\n align-items: center;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 16px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.HJ9x7a_editorDialog {\n max-width: 720px;\n}\n\n.HJ9x7a_editorBody {\n flex-direction: column;\n gap: 10px;\n display: flex;\n}\n\n.HJ9x7a_editorForm {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_editorNameRow {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_editorHint {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_editorArea {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n resize: vertical;\n border-radius: 8px;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n.HJ9x7a_editorFooter {\n flex-direction: row;\n flex: 1;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorError {\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n margin-right: auto;\n font-size: 12px;\n}\n\n.HJ9x7a_editorWarning {\n color: var(--dsw-alias-state-warn-primary, #b47800);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_entryList {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryRow {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-left: 3px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 8px;\n flex-direction: row;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n display: flex;\n}\n\n.HJ9x7a_entryMain {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n max-width: 100%;\n display: flex;\n}\n\n.HJ9x7a_entryHead {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.HJ9x7a_entryDesc {\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary, #6b7280);\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n display: -webkit-box;\n overflow: hidden;\n}\n\n.HJ9x7a_entryPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_entryActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n display: flex;\n}\n\n.HJ9x7a_iconBtn {\n width: 32px;\n height: 32px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n justify-content: center;\n align-items: center;\n padding: 0;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_iconBtn:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.HJ9x7a_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n.HJ9x7a_iconBtnDanger:hover {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n}\n\n.HJ9x7a_empty {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-align: center;\n padding: 24px 12px;\n font-size: 12px;\n}\n\n.HJ9x7a_entryGrid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n display: grid;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryPath {\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryRow {\n flex-direction: column;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryActions {\n align-self: flex-end;\n margin-top: auto;\n}\n\n.HJ9x7a_iconBtn:focus-visible, .HJ9x7a_entryName:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n@container (width <= 540px) {\n .HJ9x7a_entryGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .HJ9x7a_entryRow {\n flex-wrap: wrap;\n }\n\n .HJ9x7a_entryActions {\n margin-left: auto;\n }\n\n .HJ9x7a_entryMain {\n flex-basis: 100%;\n }\n}\n\n.HJ9x7a_entryName {\n max-width: 100%;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.HJ9x7a_entryName:hover {\n text-decoration: underline;\n}\n\n.HJ9x7a_entryHead {\n flex-wrap: wrap;\n}\n\n.HJ9x7a_roleFields {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-radius: 8px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n min-width: 0;\n padding: 12px;\n display: grid;\n}\n\n.HJ9x7a_roleFields legend {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_roleFields .HJ9x7a_editorHint, .HJ9x7a_roleFields .HJ9x7a_editorWarning, .HJ9x7a_roleFields .HJ9x7a_editorError {\n grid-column: 1 / -1;\n}\n\n.HJ9x7a_editorLabel {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_editorInput {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n min-width: 0;\n color: inherit;\n font: inherit;\n border-radius: 6px;\n padding: 8px 10px;\n}\n\n@media (width <= 480px) {\n .HJ9x7a_roleFields {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n.G2mDja_form {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n display: flex;\n}\n\n.G2mDja_head {\n color: var(--dsw-alias-label-secondary, #667085);\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n}\n\n.G2mDja_error {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n overflow-wrap: anywhere;\n border-radius: 8px;\n padding: 8px 10px;\n font-size: 12px;\n line-height: 18px;\n}\n\n.G2mDja_row {\n border-top: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n padding-top: 8px;\n display: flex;\n}\n\n.G2mDja_ref {\n color: var(--dsw-alias-label-primary, #1f2328);\n font: 600 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.G2mDja_controls {\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.G2mDja_facts {\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.G2mDja_factOk, .G2mDja_factMiss {\n border-radius: 999px;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 17px;\n}\n\n.G2mDja_factOk {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.G2mDja_factMiss {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.G2mDja_note {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n line-height: 17px;\n}\n\n.G2mDja_editor {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.G2mDja_input {\n box-sizing: border-box;\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 8px;\n padding: 7px 10px;\n font-size: 12px;\n}\n\n.G2mDja_input:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 1px;\n}\n\n.G2mDja_actions {\n align-items: center;\n gap: 8px;\n display: flex;\n}\n.HJ9x7a_shell {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 16px;\n display: flex;\n container-type: inline-size;\n}\n\n.HJ9x7a_header {\n flex-direction: row;\n flex: none;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n min-height: 46px;\n display: flex;\n}\n\n.HJ9x7a_headerText {\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.HJ9x7a_subtitle {\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n}\n\n.HJ9x7a_headerActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 6px;\n display: flex;\n}\n\n.HJ9x7a_body {\n scrollbar-gutter: stable;\n flex-direction: column;\n flex: 1;\n gap: 12px;\n min-height: 0;\n display: flex;\n overflow-y: auto;\n}\n\n.HJ9x7a_busyLine {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_busyLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n overflow: hidden;\n}\n\n.HJ9x7a_spinner {\n color: var(--dsw-alias-label-secondary, #6b7280);\n flex: none;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_spinning {\n animation: .9s linear infinite HJ9x7a_panel-spin;\n}\n\n@keyframes HJ9x7a_panel-spin {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .HJ9x7a_spinning {\n animation-duration: 2.4s;\n }\n}\n\n.HJ9x7a_badgePlugin, .HJ9x7a_badgeUser {\n white-space: nowrap;\n box-sizing: border-box;\n text-overflow: ellipsis;\n background: var(--dsw-alias-interactive-bg-hover);\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n border-radius: 4px;\n flex: none;\n align-items: center;\n padding: 1px 8px;\n font-size: 11px;\n line-height: 16px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.HJ9x7a_editorDialog {\n max-width: 720px;\n}\n\n.HJ9x7a_editorBody {\n flex-direction: column;\n gap: 10px;\n display: flex;\n}\n\n.HJ9x7a_editorForm {\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n display: flex;\n}\n\n.HJ9x7a_editorNameRow {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_editorHint {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_editorArea {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n width: 100%;\n color: var(--dsw-alias-label-primary, #1f2328);\n resize: vertical;\n border-radius: 8px;\n padding: 8px 10px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n line-height: 18px;\n}\n\n.HJ9x7a_editorFooter {\n flex-direction: row;\n flex: 1;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_editorError {\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n margin-right: auto;\n font-size: 12px;\n}\n\n.HJ9x7a_editorWarning {\n color: var(--dsw-alias-state-warn-primary, #b47800);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.HJ9x7a_confirmCheck {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: row;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_entryList {\n flex-direction: column;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryRow {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-left: 3px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1, #fff);\n border-radius: 8px;\n flex-direction: row;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n display: flex;\n}\n\n.HJ9x7a_entryMain {\n flex-direction: column;\n flex: 1;\n gap: 4px;\n min-width: 0;\n max-width: 100%;\n display: flex;\n}\n\n.HJ9x7a_entryHead {\n flex-direction: row;\n align-items: baseline;\n gap: 8px;\n display: flex;\n}\n\n.HJ9x7a_entryName {\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n}\n\n.HJ9x7a_entryDesc {\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary, #6b7280);\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n display: -webkit-box;\n overflow: hidden;\n}\n\n.HJ9x7a_entryPath {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n overflow: hidden;\n}\n\n.HJ9x7a_entryActions {\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n display: flex;\n}\n\n.HJ9x7a_iconBtn {\n width: 32px;\n height: 32px;\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: 6px;\n justify-content: center;\n align-items: center;\n padding: 0;\n font-size: 13px;\n display: inline-flex;\n}\n\n.HJ9x7a_iconBtn:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.HJ9x7a_iconBtn:disabled {\n cursor: default;\n opacity: .4;\n}\n\n.HJ9x7a_iconBtnDanger:hover {\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n color: var(--dsw-alias-state-error-primary, #c81e1e);\n}\n\n.HJ9x7a_empty {\n color: var(--dsw-alias-label-tertiary, #6b7280);\n text-align: center;\n padding: 24px 12px;\n font-size: 12px;\n}\n\n.HJ9x7a_entryGrid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n display: grid;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryPath {\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryRow {\n flex-direction: column;\n}\n\n.HJ9x7a_entryGrid .HJ9x7a_entryActions {\n align-self: flex-end;\n margin-top: auto;\n}\n\n.HJ9x7a_iconBtn:focus-visible, .HJ9x7a_entryName:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n@container (width <= 540px) {\n .HJ9x7a_entryGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .HJ9x7a_entryRow {\n flex-wrap: wrap;\n }\n\n .HJ9x7a_entryActions {\n margin-left: auto;\n }\n\n .HJ9x7a_entryMain {\n flex-basis: 100%;\n }\n}\n\n.HJ9x7a_entryName {\n max-width: 100%;\n color: inherit;\n text-align: left;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n}\n\n.HJ9x7a_entryName:hover {\n text-decoration: underline;\n}\n\n.HJ9x7a_entryHead {\n flex-wrap: wrap;\n}\n\n.HJ9x7a_roleFields {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n border-radius: 8px;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n min-width: 0;\n padding: 12px;\n display: grid;\n}\n\n.HJ9x7a_roleFields legend {\n font-size: 13px;\n font-weight: 600;\n}\n\n.HJ9x7a_roleFields .HJ9x7a_editorHint, .HJ9x7a_roleFields .HJ9x7a_editorWarning, .HJ9x7a_roleFields .HJ9x7a_editorError {\n grid-column: 1 / -1;\n}\n\n.HJ9x7a_editorLabel {\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n font-size: 12px;\n display: flex;\n}\n\n.HJ9x7a_editorInput {\n border: 1px solid var(--dsw-alias-border-l2, #0000001a);\n background: var(--dsw-alias-bg-layer-1, #fff);\n min-width: 0;\n color: inherit;\n font: inherit;\n border-radius: 6px;\n padding: 8px 10px;\n}\n\n@media (width <= 480px) {\n .HJ9x7a_roleFields {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.AUWlZW_surface {\n min-width: 0;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n display: flex;\n}\n\n.AUWlZW_toolbar {\n flex: none;\n}\n\n.AUWlZW_grid {\n scrollbar-gutter: stable;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-content: start;\n gap: 12px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: grid;\n overflow-y: auto;\n}\n\n@media (width <= 760px) {\n .AUWlZW_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n.AUWlZW_list {\n scrollbar-gutter: stable;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n min-height: 0;\n padding-right: 4px;\n display: flex;\n overflow-y: auto;\n}\n\n.AUWlZW_list .AUWlZW_card {\n flex-flow: wrap;\n align-items: center;\n gap: 8px 14px;\n}\n\n.AUWlZW_card {\n min-width: 0;\n min-height: 0;\n color: inherit;\n background: var(--dsw-alias-bg-layer-1, #fff);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n cursor: pointer;\n font: inherit;\n text-align: left;\n user-select: none;\n border-radius: 8px;\n flex-direction: column;\n transition: border-color .15s, background .15s, box-shadow .15s;\n display: flex;\n}\n\n.AUWlZW_card:hover {\n border-color: var(--dsw-alias-border-l3, #d9dde3);\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n}\n\n.AUWlZW_cardBody {\n flex-direction: column;\n flex: 1;\n gap: 8px;\n min-width: 0;\n padding: 12px 14px 10px;\n display: flex;\n}\n\n.AUWlZW_card:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #4f6ef7);\n outline-offset: 2px;\n}\n\n.AUWlZW_cardTop {\n align-items: center;\n gap: 8px;\n min-width: 0;\n display: flex;\n}\n\n.AUWlZW_statusDot {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n border-radius: 50%;\n flex: none;\n width: 7px;\n height: 7px;\n}\n\n.AUWlZW_statusconnected {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_statusdegraded {\n background: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusfailed {\n background: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statusneeds-credentials {\n background: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusorphaned {\n background: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_statusdisabled {\n background: var(--dsw-alias-label-tertiary, #98a2b3);\n}\n\n.AUWlZW_service {\n flex: 1;\n min-width: 0;\n}\n\n.AUWlZW_name {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 600 13px / 22px ui-monospace, Menlo, Consolas, monospace;\n display: block;\n overflow: hidden;\n}\n\n.AUWlZW_endpoint {\n max-height: 36px;\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n overflow-wrap: anywhere;\n margin: 0;\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n overflow: hidden;\n}\n\n.AUWlZW_sourcePlugin, .AUWlZW_sourceDirect, .AUWlZW_toolCount {\n min-width: 0;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary, #6b7280);\n border: 1px solid var(--dsw-alias-border-l3, #d9dde3);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-radius: 4px;\n align-items: center;\n gap: 5px;\n padding: 1px 6px;\n font-size: 12px;\n line-height: 18px;\n display: inline-flex;\n overflow: hidden;\n}\n\n.AUWlZW_sourcePlugin svg, .AUWlZW_sourceDirect svg {\n color: currentColor;\n stroke: currentColor;\n stroke-width: 1.35px;\n stroke-linecap: round;\n stroke-linejoin: round;\n flex: none;\n width: 14px;\n height: 14px;\n}\n\n.AUWlZW_toolCount {\n color: var(--dsw-alias-label-primary, #1f2328);\n flex: none;\n font-weight: 600;\n}\n\n.AUWlZW_reasonLabel {\n opacity: .85;\n flex: none;\n font-weight: 600;\n}\n\n.AUWlZW_statePill {\n white-space: nowrap;\n border-radius: 999px;\n align-items: center;\n gap: 5px;\n padding: 1px 8px;\n font-size: 11px;\n font-weight: 600;\n line-height: 17px;\n display: inline-flex;\n}\n\n.AUWlZW_statePill:before {\n content: \"\";\n background: currentColor;\n border-radius: 50%;\n width: 6px;\n height: 6px;\n}\n\n.AUWlZW_stateconnected {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.AUWlZW_statedegraded, .AUWlZW_stateneeds-credentials {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_statefailed, .AUWlZW_stateorphaned {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n}\n\n.AUWlZW_statedisabled {\n color: var(--dsw-alias-label-tertiary, #98a2b3);\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n}\n\n.AUWlZW_empty, .AUWlZW_detailEmpty {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-align: center;\n padding: 24px;\n font-size: 12px;\n}\n\n.AUWlZW_error {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n align-items: center;\n gap: 8px;\n margin: 16px 0;\n font-size: 12px;\n display: flex;\n}\n\n.AUWlZW_detailDialog {\n width: min(720px, 94vw);\n}\n\n.AUWlZW_detailBody {\n max-height: 72vh;\n overflow-y: auto;\n}\n\n.AUWlZW_modalFooter {\n justify-content: flex-end;\n width: 100%;\n display: flex;\n}\n\n.AUWlZW_detail {\n flex-direction: column;\n gap: 16px;\n display: flex;\n}\n\n.AUWlZW_detailHero {\n background: var(--dsw-alias-bg-layer-2, #f7f8fa);\n border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n border-radius: 10px;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n display: flex;\n}\n\n.AUWlZW_detailHeroText {\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n display: flex;\n}\n\n.AUWlZW_detailEndpoint {\n color: var(--dsw-alias-label-secondary, #667085);\n overflow-wrap: anywhere;\n margin: 0;\n font: 12px / 18px ui-monospace, Menlo, Consolas, monospace;\n}\n\n.AUWlZW_reasonBox {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n border-radius: 8px;\n flex-direction: column;\n gap: 4px;\n padding: 10px 12px;\n display: flex;\n}\n\n.AUWlZW_reasonText {\n overflow-wrap: anywhere;\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.AUWlZW_detailSection {\n flex-direction: column;\n gap: 7px;\n display: flex;\n}\n\n.AUWlZW_detailHead {\n color: var(--dsw-alias-label-secondary, #667085);\n border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb);\n margin: 0;\n padding-bottom: 5px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.AUWlZW_toolList {\n flex-direction: column;\n display: flex;\n}\n\n.AUWlZW_tool {\n border-bottom: 1px solid var(--dsw-alias-border-l1, #eef1f5);\n grid-template-columns: minmax(140px, max-content) minmax(0, 1fr);\n align-items: center;\n gap: 12px;\n padding: 7px 0;\n display: grid;\n}\n\n.AUWlZW_tool:last-child {\n border-bottom: none;\n}\n\n.AUWlZW_toolName {\n color: var(--dsw-alias-label-primary, #1f2328);\n text-overflow: ellipsis;\n white-space: nowrap;\n font: 11px / 16px ui-monospace, Menlo, Consolas, monospace;\n overflow: hidden;\n}\n\n.AUWlZW_toolDescription {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 10px;\n overflow: hidden;\n}\n\n@media (width <= 760px) {\n .AUWlZW_toolbar {\n padding-left: 0;\n padding-right: 0;\n }\n\n .AUWlZW_grid {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .AUWlZW_list .AUWlZW_cardTop {\n max-width: 100%;\n }\n\n .AUWlZW_tool {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .AUWlZW_toolDescription {\n display: none;\n }\n}\n\n.AUWlZW_statemounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-state-success-tertiary, #e6faed);\n}\n\n.AUWlZW_statehost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #fef5e7);\n}\n\n.AUWlZW_stateconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n background: var(--dsw-alias-interactive-bg-hover-danger, #ec13130d);\n}\n\n.AUWlZW_statusmounted {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n.AUWlZW_statushost-missing {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n}\n\n.AUWlZW_statusconflict {\n color: var(--dsw-alias-state-error-primary, #dc2626);\n}\n\n.AUWlZW_list .AUWlZW_card {\n min-height: 0;\n padding: 2px 0;\n}\n\n.AUWlZW_list .AUWlZW_cardBody {\n flex-flow: row;\n align-items: center;\n gap: 12px;\n padding: 8px 14px;\n}\n\n.AUWlZW_list .AUWlZW_cardTop {\n flex: 0 300px;\n min-width: 0;\n}\n\n.AUWlZW_list .AUWlZW_endpoint {\n white-space: nowrap;\n text-overflow: ellipsis;\n flex: 240px;\n max-height: 22px;\n overflow: hidden;\n}\n\n.AUWlZW_retryEchoSuccess {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n white-space: nowrap;\n font-size: 12px;\n line-height: 18px;\n}\n\n.AUWlZW_statusstarting {\n color: var(--dsw-alias-state-warn-primary, #b45309);\n animation: 1.2s ease-in-out infinite AUWlZW_lspStartingPulse;\n}\n\n@keyframes AUWlZW_lspStartingPulse {\n 50% {\n opacity: .35;\n }\n}\n\n.AUWlZW_statusforeign {\n background: var(--dsw-alias-brand-primary, #4f6ef7);\n}\n\n.AUWlZW_reasonRaw {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n word-break: break-all;\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.AUWlZW_seamBanner {\n border-left: 3px solid var(--dsw-alias-state-warn-primary, #b45309);\n background: var(--dsw-alias-state-warn-tertiary, #b4530914);\n border-radius: 8px;\n flex-direction: column;\n gap: 8px;\n margin: 0 0 12px;\n padding: 12px 14px;\n display: flex;\n}\n\n.AUWlZW_seamTitle {\n color: var(--dsw-alias-label-primary, #1f2329);\n font-size: 13px;\n font-weight: 600;\n}\n\n.AUWlZW_seamBody {\n color: var(--dsw-alias-label-secondary, #4e5969);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n\n.AUWlZW_seamPathLabel {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n font-size: 11px;\n}\n\n.AUWlZW_seamPath {\n color: var(--dsw-alias-label-secondary, #4e5969);\n overflow-wrap: anywhere;\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 16px;\n}\n\n.AUWlZW_seamOther {\n color: var(--dsw-alias-label-tertiary, #8b93a1);\n margin: 0;\n font-size: 11px;\n line-height: 16px;\n}\n\n.AUWlZW_seamDone {\n color: var(--dsw-alias-state-success-primary, #15803d);\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n}\n.l0H8fW_workspace {\n min-width: 0;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary, #1f2328);\n flex-direction: column;\n flex: 1;\n gap: 12px;\n display: flex;\n}\n\n.l0H8fW_pageMode {\n box-sizing: border-box;\n padding: 4px 0;\n}\n\n.l0H8fW_tabRow {\n border-bottom: 1px solid var(--dsw-alias-border-l2, #0000001a);\n scrollbar-width: none;\n flex-direction: row;\n flex: none;\n align-items: center;\n gap: 4px;\n display: flex;\n overflow-x: auto;\n}\n\n.l0H8fW_tab, .l0H8fW_tabOn {\n color: var(--dsw-alias-label-secondary, #6b7280);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n background: none;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: none;\n padding: 7px 14px;\n font-size: 13px;\n line-height: 20px;\n position: relative;\n}\n\n.l0H8fW_tab:hover {\n background: var(--dsw-alias-interactive-bg-hover, #2631480f);\n color: var(--dsw-alias-label-primary, #1f2328);\n}\n\n.l0H8fW_tabOn {\n color: var(--dsw-alias-label-primary, #1f2328);\n font-weight: 600;\n}\n\n.l0H8fW_tabOn:after {\n background: var(--dsw-alias-brand-primary);\n content: \"\";\n border-radius: 2px;\n height: 2px;\n position: absolute;\n bottom: 0;\n left: 10px;\n right: 10px;\n}\n\n.l0H8fW_tabPanel {\n flex-direction: column;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n";document.head.appendChild(s);}})();
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
7
|
//#region \0rolldown/runtime.js
|
|
8
8
|
var __create = Object.create;
|
|
@@ -83,17 +83,34 @@ var busy_overlay_module_default = {
|
|
|
83
83
|
"hintViewport": "qUlk6a_hintViewport",
|
|
84
84
|
"label": "qUlk6a_label",
|
|
85
85
|
"overlay": "qUlk6a_overlay",
|
|
86
|
-
"spinner": "qUlk6a_spinner"
|
|
86
|
+
"spinner": "qUlk6a_spinner",
|
|
87
|
+
"warning": "qUlk6a_warning"
|
|
87
88
|
};
|
|
89
|
+
/**
|
|
90
|
+
* When a leased operation outlives this, the overlay says so. Nothing local
|
|
91
|
+
* should take this long, so the user learns the wait is still real instead of
|
|
92
|
+
* reading an unchanging spinner as "it finished and the dialog stuck".
|
|
93
|
+
*/
|
|
94
|
+
const BUSY_LONG_RUNNING_MS = 2e4;
|
|
88
95
|
/** Mount once per client. A body-level host covers portaled dialogs without inheriting their inert state. */
|
|
89
96
|
function BusyOverlay({ t }) {
|
|
90
97
|
const tasks = (0, react.useSyncExternalStore)(subscribeBusy, busySnapshot, busySnapshot);
|
|
91
98
|
const target = [...tasks].reverse().find((task) => task.target?.isConnected)?.target ?? (tasks.length ? operationTarget() : null);
|
|
92
99
|
const [heldTarget, setHeldTarget] = (0, react.useState)(null);
|
|
93
100
|
const [visible, setVisible] = (0, react.useState)(false);
|
|
101
|
+
const [slow, setSlow] = (0, react.useState)(false);
|
|
94
102
|
const startedAt = (0, react.useRef)(null);
|
|
95
103
|
const shownAt = (0, react.useRef)(null);
|
|
96
104
|
const active = tasks.length > 0;
|
|
105
|
+
(0, react.useEffect)(() => {
|
|
106
|
+
if (!active || target === null) {
|
|
107
|
+
setSlow(false);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const started = startedAt.current ?? Date.now();
|
|
111
|
+
const timer = setTimeout(() => setSlow(true), Math.max(0, BUSY_LONG_RUNNING_MS - (Date.now() - started)));
|
|
112
|
+
return () => clearTimeout(timer);
|
|
113
|
+
}, [active, target]);
|
|
97
114
|
(0, react.useLayoutEffect)(() => {
|
|
98
115
|
let timer;
|
|
99
116
|
if (active && target) {
|
|
@@ -121,10 +138,11 @@ function BusyOverlay({ t }) {
|
|
|
121
138
|
return displayedTarget && (active || visible) ? (0, react.createElement)(ActiveOverlay, {
|
|
122
139
|
target: displayedTarget,
|
|
123
140
|
t,
|
|
124
|
-
visible
|
|
141
|
+
visible,
|
|
142
|
+
slow
|
|
125
143
|
}) : null;
|
|
126
144
|
}
|
|
127
|
-
function ActiveOverlay({ target, t, visible }) {
|
|
145
|
+
function ActiveOverlay({ target, t, visible, slow }) {
|
|
128
146
|
const ref = (0, react.useRef)(null);
|
|
129
147
|
const [rect, setRect] = (0, react.useState)(() => target.getBoundingClientRect());
|
|
130
148
|
const [message, setMessage] = (0, react.useState)(0);
|
|
@@ -222,9 +240,29 @@ function ActiveOverlay({ target, t, visible }) {
|
|
|
222
240
|
}, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.IconLoadingOutline16, { size: 28 })), (0, react.createElement)("strong", { className: busy_overlay_module_default.label }, t("panelWorking")), (0, react.createElement)("div", { className: busy_overlay_module_default.hintViewport }, (0, react.createElement)("p", {
|
|
223
241
|
key: message,
|
|
224
242
|
className: busy_overlay_module_default.hint
|
|
225
|
-
}, hints[message]))
|
|
243
|
+
}, hints[message])), slow ? (0, react.createElement)("p", {
|
|
244
|
+
className: busy_overlay_module_default.warning,
|
|
245
|
+
role: "alert"
|
|
246
|
+
}, t("busyLongRunning")) : null) : null);
|
|
226
247
|
}
|
|
227
248
|
//#endregion
|
|
249
|
+
//#region src/client/request-error.ts
|
|
250
|
+
/**
|
|
251
|
+
* The client's request-failure vocabulary.
|
|
252
|
+
*
|
|
253
|
+
* Kept out of the wire module so a panel can identify a timeout without
|
|
254
|
+
* importing — and mocking — the whole API surface.
|
|
255
|
+
*
|
|
256
|
+
* @module client/request-error
|
|
257
|
+
*/
|
|
258
|
+
/** One request that stopped waiting. The host may still be working on it. */
|
|
259
|
+
var RequestTimeoutError = class extends Error {
|
|
260
|
+
constructor(timeoutMs) {
|
|
261
|
+
super(`request timed out after ${Math.round(timeoutMs / 1e3)}s`);
|
|
262
|
+
this.name = "RequestTimeoutError";
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
//#endregion
|
|
228
266
|
//#region src/contracts/market.ts
|
|
229
267
|
/** Browser-safe market wire records and route constants shared by host and client. */
|
|
230
268
|
/** Prefix for all Agent Plugins Market HTTP routes. */
|
|
@@ -237,6 +275,7 @@ const MARKET_ROUTES = {
|
|
|
237
275
|
lspStatus: `${MARKET_API_PREFIX}lsp-status`,
|
|
238
276
|
lspServers: `${MARKET_API_PREFIX}lsp-servers`,
|
|
239
277
|
addLspServer: `${MARKET_API_PREFIX}lsp-servers/add`,
|
|
278
|
+
migrateLspSeam: `${MARKET_API_PREFIX}lsp-servers/migrate-seam`,
|
|
240
279
|
serverConfig: `${MARKET_API_PREFIX}server-config`,
|
|
241
280
|
saveServerConfig: `${MARKET_API_PREFIX}server-config/save`,
|
|
242
281
|
progress: `${MARKET_API_PREFIX}progress`,
|
|
@@ -281,12 +320,74 @@ function skillRoute(sourceId, suiteId, skill) {
|
|
|
281
320
|
//#endregion
|
|
282
321
|
//#region src/client/api.ts
|
|
283
322
|
/** Typed fetch helpers over the host's `/api/agent-plugins/*` routes. */
|
|
323
|
+
/** Reads are local and settle in milliseconds; a stalled host must not hold the page. */
|
|
324
|
+
const READ_TIMEOUT_MS = 15e3;
|
|
325
|
+
/** Mutations may legitimately clone or archive for minutes; this only caps a stalled one. */
|
|
326
|
+
const MUTATION_TIMEOUT_MS = 6e5;
|
|
327
|
+
/**
|
|
328
|
+
* One same-origin request that gives up waiting after `timeoutMs`.
|
|
329
|
+
*
|
|
330
|
+
* Aborting releases whoever is waiting — the panel, and the blocking overlay
|
|
331
|
+
* with it — while the host keeps working. The next read then reports where the
|
|
332
|
+
* operation actually stands, which is more useful than a spinner that never
|
|
333
|
+
* ends.
|
|
334
|
+
*/
|
|
335
|
+
async function boundedFetch(url, init, timeoutMs) {
|
|
336
|
+
const controller = new AbortController();
|
|
337
|
+
const external = init.signal ?? void 0;
|
|
338
|
+
const forward = () => controller.abort();
|
|
339
|
+
if (external?.aborted === true) controller.abort();
|
|
340
|
+
else external?.addEventListener("abort", forward, { once: true });
|
|
341
|
+
let timedOut = false;
|
|
342
|
+
const timer = setTimeout(() => {
|
|
343
|
+
timedOut = true;
|
|
344
|
+
controller.abort();
|
|
345
|
+
}, timeoutMs);
|
|
346
|
+
try {
|
|
347
|
+
return await fetch(url, {
|
|
348
|
+
...init,
|
|
349
|
+
signal: controller.signal
|
|
350
|
+
});
|
|
351
|
+
} catch (error) {
|
|
352
|
+
if (timedOut) throw new RequestTimeoutError(timeoutMs);
|
|
353
|
+
throw error;
|
|
354
|
+
} finally {
|
|
355
|
+
clearTimeout(timer);
|
|
356
|
+
external?.removeEventListener("abort", forward);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* One same-origin GET decoded as JSON.
|
|
361
|
+
*
|
|
362
|
+
* `label` names the resource in the thrown message, so a failed load reads the
|
|
363
|
+
* same in every panel that shares this helper.
|
|
364
|
+
*/
|
|
365
|
+
async function getJson(url, label, init) {
|
|
366
|
+
const response = await boundedFetch(url, {
|
|
367
|
+
credentials: "same-origin",
|
|
368
|
+
...init
|
|
369
|
+
}, READ_TIMEOUT_MS);
|
|
370
|
+
if (!response.ok) throw new Error(`${label}: ${response.status}`);
|
|
371
|
+
return response.json();
|
|
372
|
+
}
|
|
373
|
+
/** One POST carrying the market API's `{ ok, error }` result envelope. */
|
|
374
|
+
async function postOkJson(url, body, label) {
|
|
375
|
+
const response = await boundedFetch(url, {
|
|
376
|
+
method: "POST",
|
|
377
|
+
credentials: "same-origin",
|
|
378
|
+
headers: { "content-type": "application/json" },
|
|
379
|
+
body: JSON.stringify(body)
|
|
380
|
+
}, MUTATION_TIMEOUT_MS);
|
|
381
|
+
const payload = await response.json();
|
|
382
|
+
if (!response.ok || payload.ok !== true) throw new Error(payload.error ?? `${label}: ${response.status}`);
|
|
383
|
+
return payload;
|
|
384
|
+
}
|
|
284
385
|
async function fetchServerConfig(kind, id) {
|
|
285
386
|
return withBusyOperation(async () => {
|
|
286
|
-
const response = await
|
|
387
|
+
const response = await boundedFetch(`${MARKET_ROUTES.serverConfig}?${new URLSearchParams({
|
|
287
388
|
kind,
|
|
288
389
|
id
|
|
289
|
-
})}`, { credentials: "same-origin" });
|
|
390
|
+
})}`, { credentials: "same-origin" }, READ_TIMEOUT_MS);
|
|
290
391
|
const body = await response.json();
|
|
291
392
|
if (!response.ok) throw new Error(body.error ?? `Server configuration failed: ${response.status}`);
|
|
292
393
|
return body;
|
|
@@ -307,47 +408,25 @@ async function fetchModelCatalog(provider, signal, model) {
|
|
|
307
408
|
if (provider !== void 0) params.set("provider", provider);
|
|
308
409
|
if (model !== void 0) params.set("model", model);
|
|
309
410
|
const query = params.size === 0 ? "" : `?${params}`;
|
|
310
|
-
|
|
311
|
-
credentials: "same-origin",
|
|
312
|
-
signal
|
|
313
|
-
});
|
|
314
|
-
if (!response.ok) throw new Error(`DSH model directory failed: ${response.status}`);
|
|
315
|
-
return response.json();
|
|
411
|
+
return getJson(`${MARKET_ROUTES.modelCatalog}${query}`, "DSH model directory failed", { signal });
|
|
316
412
|
}
|
|
317
413
|
async function fetchOverview() {
|
|
318
|
-
return withBusyOperation(
|
|
319
|
-
const response = await fetch(MARKET_ROUTES.overview, { credentials: "same-origin" });
|
|
320
|
-
if (!response.ok) throw new Error(`overview failed: ${response.status}`);
|
|
321
|
-
return response.json();
|
|
322
|
-
});
|
|
414
|
+
return withBusyOperation(() => getJson(MARKET_ROUTES.overview, "overview failed"));
|
|
323
415
|
}
|
|
324
416
|
async function fetchSourceProgress() {
|
|
325
|
-
|
|
326
|
-
if (!response.ok) throw new Error(`progress failed: ${response.status}`);
|
|
327
|
-
return response.json();
|
|
417
|
+
return getJson(MARKET_ROUTES.progress, "progress failed");
|
|
328
418
|
}
|
|
329
419
|
async function fetchSuiteDetail(sourceId, suiteId) {
|
|
330
|
-
return withBusyOperation(
|
|
331
|
-
const response = await fetch(suiteRoute(sourceId, suiteId), { credentials: "same-origin" });
|
|
332
|
-
if (!response.ok) throw new Error(`suite detail failed: ${response.status}`);
|
|
333
|
-
return response.json();
|
|
334
|
-
});
|
|
420
|
+
return withBusyOperation(() => getJson(suiteRoute(sourceId, suiteId), "suite detail failed"));
|
|
335
421
|
}
|
|
336
422
|
async function fetchMcpStatus() {
|
|
337
|
-
return withBusyOperation(
|
|
338
|
-
const response = await fetch(MARKET_ROUTES.mcpStatus, { credentials: "same-origin" });
|
|
339
|
-
if (!response.ok) throw new Error(`MCP status failed: ${response.status}`);
|
|
340
|
-
return response.json();
|
|
341
|
-
});
|
|
423
|
+
return withBusyOperation(() => getJson(MARKET_ROUTES.mcpStatus, "MCP status failed"));
|
|
342
424
|
}
|
|
343
425
|
async function fetchLspStatus(background = false) {
|
|
344
|
-
const load =
|
|
345
|
-
const response = await fetch(MARKET_ROUTES.lspStatus, { credentials: "same-origin" });
|
|
346
|
-
if (!response.ok) throw new Error(`LSP status failed: ${response.status}`);
|
|
347
|
-
return response.json();
|
|
348
|
-
};
|
|
426
|
+
const load = () => getJson(MARKET_ROUTES.lspStatus, "LSP status failed");
|
|
349
427
|
return background ? load() : withBusyOperation(load);
|
|
350
428
|
}
|
|
429
|
+
/** Add one direct LSP server to the user's table. */
|
|
351
430
|
async function addLspServer(name, config) {
|
|
352
431
|
return withBusyOperation(async () => {
|
|
353
432
|
await postAction("lsp-servers/add", {
|
|
@@ -356,13 +435,18 @@ async function addLspServer(name, config) {
|
|
|
356
435
|
});
|
|
357
436
|
});
|
|
358
437
|
}
|
|
359
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Remove a profile's hand-written LSP layer — the `cordis.patch.yml` rows an
|
|
440
|
+
* older release told users to add, which now claim the seam this plugin owns.
|
|
441
|
+
*/
|
|
442
|
+
async function migrateLspSeam(profile) {
|
|
360
443
|
return withBusyOperation(async () => {
|
|
361
|
-
|
|
362
|
-
if (!response.ok) throw new Error(`skill content failed: ${response.status}`);
|
|
363
|
-
return response.json();
|
|
444
|
+
return (await postAction("lsp-servers/migrate-seam", { profile })).migration;
|
|
364
445
|
});
|
|
365
446
|
}
|
|
447
|
+
async function fetchSkillContent(sourceId, suiteId, skill) {
|
|
448
|
+
return withBusyOperation(() => getJson(skillRoute(sourceId, suiteId, skill), "skill content failed"));
|
|
449
|
+
}
|
|
366
450
|
/** Re-run the host MCP reconcile: retries failed mounts, clears residual tools. */
|
|
367
451
|
async function retryMcpMounts() {
|
|
368
452
|
return withBusyOperation(async () => {
|
|
@@ -385,35 +469,21 @@ async function reauthorizeMcpServer(serverName) {
|
|
|
385
469
|
});
|
|
386
470
|
}
|
|
387
471
|
async function fetchMcpBackend() {
|
|
388
|
-
|
|
389
|
-
if (!response.ok) throw new Error(`mcp backend failed: ${response.status}`);
|
|
390
|
-
return response.json();
|
|
472
|
+
return getJson(MARKET_ROUTES.mcpBackend, "mcp backend failed");
|
|
391
473
|
}
|
|
392
474
|
async function postAction(path, body) {
|
|
393
|
-
return withBusyOperation(
|
|
394
|
-
const response = await fetch(`${MARKET_API_PREFIX}${path}`, {
|
|
395
|
-
method: "POST",
|
|
396
|
-
credentials: "same-origin",
|
|
397
|
-
headers: { "content-type": "application/json" },
|
|
398
|
-
body: JSON.stringify(body)
|
|
399
|
-
});
|
|
400
|
-
const payload = await response.json();
|
|
401
|
-
if (!response.ok || payload.ok !== true) throw new Error(payload.error ?? `request failed: ${response.status}`);
|
|
402
|
-
return payload;
|
|
403
|
-
});
|
|
475
|
+
return withBusyOperation(() => postOkJson(`${MARKET_API_PREFIX}${path}`, body, "request failed"));
|
|
404
476
|
}
|
|
405
477
|
/** List one panel's entries. */
|
|
406
478
|
async function fetchUserPanel(kind) {
|
|
407
479
|
return withBusyOperation(async () => {
|
|
408
|
-
|
|
409
|
-
if (!response.ok) throw new Error(`user panel failed: ${response.status}`);
|
|
410
|
-
return (await response.json()).entries ?? [];
|
|
480
|
+
return (await getJson(userPanelRoute(kind), "user panel failed")).entries ?? [];
|
|
411
481
|
});
|
|
412
482
|
}
|
|
413
483
|
/** Create one panel entry. */
|
|
414
484
|
async function createUserPanelEntry(kind, name, text) {
|
|
415
485
|
return withBusyOperation(async () => {
|
|
416
|
-
const response = await
|
|
486
|
+
const response = await boundedFetch(userPanelMutationRoute(kind, "create"), {
|
|
417
487
|
method: "POST",
|
|
418
488
|
credentials: "same-origin",
|
|
419
489
|
headers: { "content-type": "application/json" },
|
|
@@ -421,7 +491,7 @@ async function createUserPanelEntry(kind, name, text) {
|
|
|
421
491
|
name,
|
|
422
492
|
text
|
|
423
493
|
})
|
|
424
|
-
});
|
|
494
|
+
}, MUTATION_TIMEOUT_MS);
|
|
425
495
|
const payload = await response.json();
|
|
426
496
|
if (!response.ok || payload.ok !== true || payload.entry === void 0) throw new Error(payload.error ?? `create failed: ${response.status}`);
|
|
427
497
|
return payload.entry;
|
|
@@ -430,27 +500,13 @@ async function createUserPanelEntry(kind, name, text) {
|
|
|
430
500
|
/** Replace one panel entry's file content. */
|
|
431
501
|
async function updateUserPanelEntry(kind, name, text) {
|
|
432
502
|
return withBusyOperation(async () => {
|
|
433
|
-
|
|
434
|
-
method: "POST",
|
|
435
|
-
credentials: "same-origin",
|
|
436
|
-
headers: { "content-type": "application/json" },
|
|
437
|
-
body: JSON.stringify({ text })
|
|
438
|
-
});
|
|
439
|
-
const payload = await response.json();
|
|
440
|
-
if (!response.ok || payload.ok !== true) throw new Error(payload.error ?? `save failed: ${response.status}`);
|
|
503
|
+
await postOkJson(userPanelMutationRoute(kind, "update", name), { text }, "save failed");
|
|
441
504
|
});
|
|
442
505
|
}
|
|
443
506
|
/** Delete one panel entry. */
|
|
444
507
|
async function deleteUserPanelEntry(kind, name) {
|
|
445
508
|
return withBusyOperation(async () => {
|
|
446
|
-
|
|
447
|
-
method: "POST",
|
|
448
|
-
credentials: "same-origin",
|
|
449
|
-
headers: { "content-type": "application/json" },
|
|
450
|
-
body: JSON.stringify({ name })
|
|
451
|
-
});
|
|
452
|
-
const payload = await response.json();
|
|
453
|
-
if (!response.ok || payload.ok !== true) throw new Error(payload.error ?? `delete failed: ${response.status}`);
|
|
509
|
+
await postOkJson(userPanelMutationRoute(kind, "delete"), { name }, "delete failed");
|
|
454
510
|
});
|
|
455
511
|
}
|
|
456
512
|
//#endregion
|
|
@@ -480,7 +536,6 @@ const zh = {
|
|
|
480
536
|
detailKey: "键",
|
|
481
537
|
detailValue: "值",
|
|
482
538
|
detailUniqueKeys: "键不能为空或重复",
|
|
483
|
-
subtitle: "发现与安装 Agent Plugins(agent-plugins.org 便携包)",
|
|
484
539
|
searchPh: "搜索 Agent Plugins…",
|
|
485
540
|
tabAll: "全部",
|
|
486
541
|
tabInstalled: "已安装",
|
|
@@ -497,8 +552,6 @@ const zh = {
|
|
|
497
552
|
branchPh: "分支(可选)",
|
|
498
553
|
sourceLocal: "本地",
|
|
499
554
|
sourceArchive: "压缩包",
|
|
500
|
-
sourceFoldExpand: "展开全部",
|
|
501
|
-
sourceFoldCollapse: "收起",
|
|
502
555
|
sha256Ph: "SHA-256(可选,64 位十六进制)",
|
|
503
556
|
unmanagedTitle: "检测到未登记的本地仓库:",
|
|
504
557
|
unmanagedAdopt: "收编为源(只登记,不克隆不删除)",
|
|
@@ -527,12 +580,9 @@ const zh = {
|
|
|
527
580
|
surfaceTogglesSection: "运行时注入开关",
|
|
528
581
|
surfaceTogglesHint: "按能力面控制注入:关闭后立即卸载对应注入(技能 / MCP / Hooks / 命令 / 子代理 / LSP)",
|
|
529
582
|
mcpOverrideDisabledBadge: "已停用",
|
|
530
|
-
noSkills: "(无技能)",
|
|
531
|
-
noMcp: "(无 MCP 服务)",
|
|
532
583
|
loading: "加载中…",
|
|
533
584
|
lspSection: "LSP 服务",
|
|
534
585
|
editorHint: "仓库源提供 Agent Plugins。本地目录直接读取(实时反映工作树);git 源克隆到 ~/.dsh/agent-plugins/.sources/<id>。",
|
|
535
|
-
idHint: "小写字母/数字/连字符,全局唯一",
|
|
536
586
|
urlGitHint: "git 仓库地址,例如 https://github.com/org/repo.git",
|
|
537
587
|
urlArchiveHint: "HTTPS 压缩包地址,例如 https://example.com/plugin.zip;下载后解压为源目录",
|
|
538
588
|
urlLocalHint: "绝对路径或 ~/…,直接读取本地目录(不克隆、移除源时不会删除)",
|
|
@@ -543,14 +593,11 @@ const zh = {
|
|
|
543
593
|
progressCloning: "正在克隆仓库(git clone),可能需要几十秒…",
|
|
544
594
|
progressDownloading: "正在下载并解压压缩包,可能需要几十秒…",
|
|
545
595
|
progressReading: "正在读取插件清单…",
|
|
546
|
-
idAutoLabel: "源 ID(自动生成)",
|
|
547
|
-
idAutoHint: "自动从插件清单名或仓库名解析,无需填写",
|
|
548
596
|
detailHint: "点击技能或 MCP 服务行可展开查看详情",
|
|
549
597
|
add: "添加",
|
|
550
598
|
remove: "移除",
|
|
551
599
|
refresh: "刷新",
|
|
552
600
|
install: "安装",
|
|
553
|
-
installing: "安装中…",
|
|
554
601
|
installedBadge: "已安装",
|
|
555
602
|
uninstall: "卸载",
|
|
556
603
|
uninstallConfirmTitle: "卸载 Agent Plugins",
|
|
@@ -567,11 +614,11 @@ const zh = {
|
|
|
567
614
|
enable: "启用",
|
|
568
615
|
disable: "禁用",
|
|
569
616
|
cancel: "取消",
|
|
570
|
-
confirm: "确认",
|
|
571
617
|
empty: "没有匹配的 Agent Plugins",
|
|
572
618
|
installedEmpty: "还没有安装 Agent Plugins",
|
|
573
619
|
loadFail: "Agent Plugins 目录加载失败,请稍后重试",
|
|
574
620
|
actionFail: "操作失败",
|
|
621
|
+
requestTimeout: "等不到本地服务响应,已停止等待。操作可能仍在后台继续,稍后刷新即可看到结果",
|
|
575
622
|
version: "版本",
|
|
576
623
|
dimensionUser: "用户级",
|
|
577
624
|
dimensionProject: "项目级",
|
|
@@ -594,80 +641,48 @@ const zh = {
|
|
|
594
641
|
surfaceCommands: "命令",
|
|
595
642
|
surfaceAgents: "子代理",
|
|
596
643
|
surfaceLsp: "LSP",
|
|
597
|
-
sourceNotCloned: "未克隆",
|
|
598
|
-
sourceCloned: "已克隆",
|
|
599
644
|
errors: "校验问题",
|
|
600
645
|
scanNotes: "扫描提示",
|
|
601
646
|
sourceErrorSeparator: ";",
|
|
602
|
-
viewMode: "视图模式",
|
|
603
647
|
grid: "网格",
|
|
604
648
|
list: "列表",
|
|
605
|
-
openSettings: "在设置中打开",
|
|
606
649
|
rootLabel: "Agent Plugins 目录",
|
|
607
|
-
dataLabel: "Agent Plugins 数据目录",
|
|
608
|
-
countAll: "共 {n} 个 Agent Plugins",
|
|
609
|
-
countInstalled: "已装 {n}",
|
|
610
|
-
countEnabled: "启用 {n}",
|
|
611
|
-
mcpStatusNav: "MCP 服务",
|
|
612
|
-
lspStatusNav: "LSP 服务",
|
|
613
650
|
lspSearch: "搜索 LSP 服务",
|
|
614
|
-
|
|
615
|
-
lspDirect: "直接安装",
|
|
651
|
+
lspDirect: "用户",
|
|
616
652
|
mcpStatusTitle: "MCP 服务",
|
|
617
653
|
mcpStatusSubtitle: "连接状态、来源和工具清单",
|
|
618
654
|
mcpSearch: "搜索 MCP 名称、来源或地址…",
|
|
619
655
|
mcpAll: "全部",
|
|
620
656
|
mcpPlugin: "Plugin",
|
|
621
|
-
mcpDirect: "
|
|
622
|
-
mcpService: "服务",
|
|
623
|
-
mcpSource: "来源",
|
|
624
|
-
mcpTransport: "传输",
|
|
657
|
+
mcpDirect: "用户",
|
|
625
658
|
mcpTools: "工具",
|
|
626
659
|
mcpTool: "工具",
|
|
627
|
-
mcpAllConnected: "全部已连接",
|
|
628
660
|
mcpReasonLabel: "原因",
|
|
629
|
-
mcpRetryNote: "已自动重试多次仍失败。点击「重试」立即重连,或在插件市场中检查该服务的配置。",
|
|
630
|
-
mcpRetrying: "正在重连…",
|
|
631
661
|
mcpRetrySuccess: "重连成功,服务已恢复",
|
|
632
|
-
mcpRetryFailure: "重连失败,请检查原因说明",
|
|
633
662
|
mcpReauthorize: "重新授权",
|
|
634
663
|
mcpClose: "关闭",
|
|
635
664
|
mcpRetryConnection: "重试连接",
|
|
636
665
|
mcpRetryPreservesCredentials: "重新尝试连接失败的托管服务;保留已有凭据。此操作会检查所有托管 MCP 服务。",
|
|
637
666
|
mcpReauthExplain: "这将清除本服务已保存的 OAuth 授权并重新连接,可能中断正在使用它的请求。仅在需要更换账号或授权权限时使用;若服务要求登录,请在打开的浏览器页面完成授权。",
|
|
638
667
|
mcpConfirmReauth: "清除授权并重新连接",
|
|
668
|
+
mcpOauthDefault: "授权默认开启",
|
|
639
669
|
mcpSaveFirst: "请先保存配置,再执行连接操作;连接操作只使用已保存的配置。",
|
|
640
670
|
mcpStillUnavailable: "操作已执行,但当前尚未确认服务已连接,请检查连接状态和错误原因",
|
|
641
671
|
mcpConfigureCredentialsFirst: "请先在凭据配置中填写缺失的凭据;重试连接不会自动补齐凭据。",
|
|
642
672
|
mcpSavedStatusUnknown: "配置已保存,但无法刷新连接状态",
|
|
643
673
|
mcpEntryGone: "服务已不在当前列表中,请关闭详情并刷新",
|
|
644
|
-
|
|
645
|
-
mcpReauthorizing: "等待浏览器授权…",
|
|
646
|
-
marketCardDesc: "Agent Plugins 市场套件的安装、启用与运行时行为配置。",
|
|
674
|
+
marketCardDesc: "管理套件来源、安装与运行时开关。",
|
|
647
675
|
mcpCardTitle: "MCP 增强模式",
|
|
648
|
-
|
|
649
|
-
mcpCardDescOff: "已关闭:使用宿主 dsh-mcp-client。",
|
|
676
|
+
mcpCardDesc: "内置桥接,支持 OAuth 授权与 SSE;关闭后改用宿主 dsh-mcp-client。",
|
|
650
677
|
mcpCardReadonly: "当前环境设置文档只读,无法切换。",
|
|
651
|
-
mcpForeign: "已由其他客户端挂载",
|
|
652
678
|
mcpForeignHint: "该服务器已通过其他途径(原生配置或另一插件)挂载了同名 MCP,市场已跳过以避免重复挂载。如需由市场接管,请先停用另一来源的该服务器;若确认是残留挂载,重启宿主即可清除。",
|
|
653
679
|
mcpDuplicateHint: "另一来源已挂载了相同的服务器,本副本未注册——同一服务器挂载两份对模型没有额外意义。卸载另一来源的套件后,本副本会在下次刷新时自动接管。",
|
|
654
680
|
regionLabel: "下载区域",
|
|
655
|
-
regionHint: "
|
|
681
|
+
regionHint: "中国大陆走镜像线路,仅影响下载。",
|
|
656
682
|
regionGlobal: "全球",
|
|
657
683
|
regionChina: "中国大陆",
|
|
658
684
|
mcpBackendHostMissing: "宿主 dsh-mcp-client 在当前环境不可用,无法切换到兼容模式。",
|
|
659
|
-
mcpReauthHint: "删除已保存的授权令牌并重新走浏览器授权——用于权限范围选少了的场景。点击后请在弹出的页面完成登录。",
|
|
660
|
-
mcpConnectHint: "删除旧的授权记录并重新发起浏览器登录。点击后请在弹出的页面完成授权,服务会自动连接。",
|
|
661
|
-
mcpReauthSuccess: "已清除旧授权,请在弹出的浏览器页面重新登录",
|
|
662
|
-
mcpReauthFailure: "重新授权失败,请稍后重试",
|
|
663
685
|
mcpZeroTools: "该服务已连接,但未声明任何工具。",
|
|
664
|
-
mcpConnected: "已连接",
|
|
665
|
-
mcpDegraded: "降级",
|
|
666
|
-
mcpFailed: "失败",
|
|
667
|
-
mcpNeedsCredentials: "需要凭据",
|
|
668
|
-
mcpOrphaned: "插件已卸载,工具残留",
|
|
669
|
-
mcpConfigureCredentials: "配置凭据",
|
|
670
|
-
mcpViewDetails: "查看详情",
|
|
671
686
|
mcpCredentialTitle: "凭据配置",
|
|
672
687
|
mcpCredentialConfigured: "已配置",
|
|
673
688
|
mcpCredentialMissing: "未配置",
|
|
@@ -676,50 +691,44 @@ const zh = {
|
|
|
676
691
|
mcpCredentialPlaceholder: "输入凭据(不会回显)",
|
|
677
692
|
mcpCredentialSave: "保存凭据",
|
|
678
693
|
mcpCredentialUnset: "删除凭据",
|
|
679
|
-
mcpDisabled: "未启用",
|
|
680
694
|
mcpObservedEndpoint: "当前工具表观测",
|
|
681
695
|
mcpServiceDetail: "服务详情",
|
|
682
696
|
mcpConfig: "连接配置",
|
|
683
|
-
mcpSelectHint: "选择一个 MCP 服务查看配置与工具",
|
|
684
697
|
mcpEmpty: "没有匹配的 MCP 服务",
|
|
685
698
|
mcpNoTools: "当前没有已注册工具",
|
|
686
|
-
|
|
687
|
-
mcpDirectBoundary: "直接安装 MCP 仅显示当前工具表中可观测的服务;宿主未提供配置与连接状态 API。",
|
|
688
|
-
mcpEnabled: "启用 MCP 服务",
|
|
699
|
+
mcpDirectBoundary: "用户 MCP 仅显示当前工具表中可观测的服务;宿主未提供配置与连接状态 API。",
|
|
689
700
|
mcpAddTitle: "新增 MCP 服务",
|
|
690
701
|
mcpServerName: "服务名称",
|
|
691
|
-
mcpServerConfig: "服务配置(JSON)",
|
|
692
|
-
mcpBackToMarket: "返回市场",
|
|
693
702
|
mcpRetry: "重试",
|
|
694
|
-
mcpFilterAllHint: "全部:插件套件声明的 MCP
|
|
703
|
+
mcpFilterAllHint: "全部:插件套件声明的 MCP 服务与用户自行添加的 MCP",
|
|
695
704
|
mcpFilterPluginHint: "Plugin:来自插件市场套件的 mcp.json 声明",
|
|
696
|
-
mcpFilterDirectHint: "
|
|
705
|
+
mcpFilterDirectHint: "用户:非套件来源的 MCP,来自本面板添加或宿主工具表观测",
|
|
697
706
|
lspStatusTitle: "LSP 服务",
|
|
698
707
|
lspStatusSubtitle: "语言服务器声明与挂载状态",
|
|
699
708
|
lspAll: "全部",
|
|
700
709
|
lspMounted: "已挂载",
|
|
701
710
|
lspStarting: "启动中…",
|
|
702
|
-
lspBlocked: "被阻塞",
|
|
703
711
|
lspFailed: "失败",
|
|
704
712
|
lspDisabled: "未启用",
|
|
705
|
-
lspHostMissingShort: "
|
|
706
|
-
lspConflict: "
|
|
707
|
-
lspHostMissing: "当前 DSH 运行时未携带 LSP 组件(@deepseek-ai/dsh-lsp、dsh-lsp-stdio、dsh-tool-lsp),声明不会被挂载;升级宿主并在 profile 中挂载这三层后重新启用套件即可。",
|
|
713
|
+
lspHostMissingShort: "LSP 组件缺失",
|
|
714
|
+
lspConflict: "接缝冲突",
|
|
708
715
|
lspEmpty: "没有已声明的 LSP 服务器",
|
|
709
716
|
lspReasonLabel: "原因",
|
|
710
717
|
lspFilterAllHint: "全部:套件声明与用户自配的全部语言服务器",
|
|
711
718
|
lspFilterPluginHint: "Plugin:来自插件市场套件的内联 lspServers 声明",
|
|
712
|
-
lspFilterDirectHint: "
|
|
713
|
-
lspFilterBlockedHint: "被阻塞:缺宿主组件、挂载失败或扩展冲突,点击卡片查看原因",
|
|
714
|
-
lspFilterDisabledHint: "未启用:套件的 LSP 能力面开关已关闭",
|
|
719
|
+
lspFilterDirectHint: "用户:自行配置的语言服务器(本面板配置)",
|
|
715
720
|
lspPlugin: "Plugin",
|
|
716
|
-
lspConfigure: "配置 LSP",
|
|
717
|
-
lspConfigureHint: "编辑用户自配的语言服务器表(Claude Code lspServers 格式),保存后自动挂载",
|
|
718
|
-
lspEnabled: "启用 LSP 服务",
|
|
719
721
|
lspSave: "保存",
|
|
720
722
|
lspDetailSubtitle: "语言服务器详情",
|
|
721
|
-
|
|
722
|
-
|
|
723
|
+
lspSeamTitle: "需要一次升级清理",
|
|
724
|
+
lspSeamBody: "这个 profile 里还有一份手工添加的 LSP 层(升级前的安装说明要求你自己加)。它和插件自带的 LSP 抢同一个接缝,所以语言服务器现在挂载不上。移除这一层即可,插件的副本会接管它;插件会保留一份原文件备份。",
|
|
725
|
+
lspSeamFile: "要修改的文件",
|
|
726
|
+
lspSeamRemove: "移除这一层",
|
|
727
|
+
lspSeamRemoving: "正在移除…",
|
|
728
|
+
lspSeamDone: "已移除,正在重新挂载语言服务器。",
|
|
729
|
+
lspSeamRestart: "已移除。重启 DSH 后这一层才会真正卸载。",
|
|
730
|
+
lspSeamBackup: "原文件已备份到",
|
|
731
|
+
lspSeamOther: "其他 profile 也有同样的层,本操作只处理上面这个:",
|
|
723
732
|
mdCodeCopy: "复制",
|
|
724
733
|
mdCodeCopied: "已复制",
|
|
725
734
|
mdFootnotes: "脚注",
|
|
@@ -740,9 +749,8 @@ const zh = {
|
|
|
740
749
|
personaSelectModel: "选择模型",
|
|
741
750
|
personaUnavailable: "当前不可用",
|
|
742
751
|
personaCatalogError: "无法读取 DSH 模型目录",
|
|
743
|
-
|
|
744
|
-
personaModelHint: "
|
|
745
|
-
personaToolsHint: "工具名称以逗号分隔;留空继承可用工具。原始 YAML 同样支持 tools 数组。",
|
|
752
|
+
personaRouteIgnored: "该路由不会被应用:需要同时指定供应商与模型,否则子代理继承主会话路由。",
|
|
753
|
+
personaModelHint: "路由声明必须同时给出供应商与模型才会生效;只写其中一项、或写成 provider/model,都会被忽略并继承主会话路由。",
|
|
746
754
|
personaMetadataInvalid: "请先修复原始 YAML,才能使用运行配置。",
|
|
747
755
|
panelDetails: "查看详情",
|
|
748
756
|
panelSave: "保存",
|
|
@@ -752,6 +760,7 @@ const zh = {
|
|
|
752
760
|
busyHintProcessing: "正在处理请求,请稍候。",
|
|
753
761
|
busyHintRefresh: "操作完成后,将自动更新当前视图。",
|
|
754
762
|
busyHintWaiting: "等待时间取决于本地服务和网络响应。",
|
|
763
|
+
busyLongRunning: "已等待较久,本地服务或网络可能没有响应。你可以继续等待,或稍后刷新查看结果。",
|
|
755
764
|
panelSearchLabel: "搜索条目…",
|
|
756
765
|
panelFilterAll: "全部",
|
|
757
766
|
panelFilterDisabled: "已禁用",
|
|
@@ -765,7 +774,6 @@ const zh = {
|
|
|
765
774
|
panelEmpty: "暂无条目,点击右上角 + 新增",
|
|
766
775
|
panelDisabledBadge: "已禁用",
|
|
767
776
|
panelDelete: "删除",
|
|
768
|
-
commandsPanelHint: "命令是聊天时的「快捷回复」:输入 /名称 即可把模板正文(含 $ARGUMENTS 占位符)作为指令转交模型执行。",
|
|
769
777
|
skillsPanelDescription: "查看已加载技能,并维护用户技能。",
|
|
770
778
|
commandsPanelDescription: "查看插件和用户命令。",
|
|
771
779
|
personasPanelDescription: "查看插件代理角色与用户角色卡,维护常用的 SubAgent 设定。",
|
|
@@ -779,8 +787,10 @@ const zh = {
|
|
|
779
787
|
removeSourceKeepFiles: "仅取消登记,保留本地目录",
|
|
780
788
|
feedbackToggleLabel: "体验反馈工具",
|
|
781
789
|
projectLayoutsLabel: "扫描项目 Agent 布局",
|
|
782
|
-
|
|
783
|
-
|
|
790
|
+
projectLayoutsDesc: "读取项目 .claude、.agents 等目录中的技能、命令、角色、MCP 与 hooks。",
|
|
791
|
+
autoUpdateLabel: "后台自动更新来源",
|
|
792
|
+
autoUpdateDesc: "每 6 小时刷新全部已配置来源。",
|
|
793
|
+
feedbackToggleDesc: "Agent 遇到本插件的问题时可自动提交 issue 反馈。"
|
|
784
794
|
};
|
|
785
795
|
const en = {
|
|
786
796
|
nav: "Agent Plugins Market",
|
|
@@ -806,7 +816,6 @@ const en = {
|
|
|
806
816
|
detailKey: "Key",
|
|
807
817
|
detailValue: "Value",
|
|
808
818
|
detailUniqueKeys: "Keys must be non-empty and unique",
|
|
809
|
-
subtitle: "Discover and install Agent Plugins suites (agent-plugins.org portable packages)",
|
|
810
819
|
searchPh: "Search suites…",
|
|
811
820
|
tabAll: "All",
|
|
812
821
|
tabInstalled: "Installed",
|
|
@@ -823,8 +832,6 @@ const en = {
|
|
|
823
832
|
branchPh: "branch (optional)",
|
|
824
833
|
sourceLocal: "local",
|
|
825
834
|
sourceArchive: "archive",
|
|
826
|
-
sourceFoldExpand: "Show all",
|
|
827
|
-
sourceFoldCollapse: "Show less",
|
|
828
835
|
sha256Ph: "SHA-256 (optional, 64 hex chars)",
|
|
829
836
|
unmanagedTitle: "Unregistered local checkouts found:",
|
|
830
837
|
unmanagedAdopt: "Adopt as a source (register only — no clone, no deletion)",
|
|
@@ -853,12 +860,9 @@ const en = {
|
|
|
853
860
|
surfaceTogglesSection: "Runtime injection toggles",
|
|
854
861
|
surfaceTogglesHint: "Control injection per surface: turning one off unmounts that surface immediately (skills / MCP / hooks / commands / subagents / LSP)",
|
|
855
862
|
mcpOverrideDisabledBadge: "disabled",
|
|
856
|
-
noSkills: "(no skills)",
|
|
857
|
-
noMcp: "(no MCP servers)",
|
|
858
863
|
loading: "Loading…",
|
|
859
864
|
lspSection: "LSP servers",
|
|
860
865
|
editorHint: "A source provides suites (Agent Plugins). Local directories are read in place (live working tree); git sources clone into ~/.dsh/agent-plugins/.sources/<id>.",
|
|
861
|
-
idHint: "lowercase letters / digits / hyphens, globally unique",
|
|
862
866
|
urlGitHint: "git repository URL, e.g. https://github.com/org/repo.git",
|
|
863
867
|
urlArchiveHint: "HTTPS archive URL, e.g. https://example.com/plugin.zip — downloaded and extracted as the source directory",
|
|
864
868
|
urlLocalHint: "absolute path or ~/…, read in place (never cloned, never deleted on removal)",
|
|
@@ -869,14 +873,11 @@ const en = {
|
|
|
869
873
|
progressCloning: "Cloning the repository (git clone) — this can take tens of seconds…",
|
|
870
874
|
progressDownloading: "Downloading and extracting the archive — this can take tens of seconds…",
|
|
871
875
|
progressReading: "Reading plugin manifests…",
|
|
872
|
-
idAutoLabel: "Source ID (auto)",
|
|
873
|
-
idAutoHint: "Derived from the suite or repo name — no need to type it",
|
|
874
876
|
detailHint: "Click a skill or MCP server row to expand its details",
|
|
875
877
|
add: "Add",
|
|
876
878
|
remove: "Remove",
|
|
877
879
|
refresh: "Refresh",
|
|
878
880
|
install: "Install",
|
|
879
|
-
installing: "Installing…",
|
|
880
881
|
installedBadge: "Installed",
|
|
881
882
|
uninstall: "Uninstall",
|
|
882
883
|
uninstallConfirmTitle: "Uninstall suite",
|
|
@@ -893,11 +894,11 @@ const en = {
|
|
|
893
894
|
enable: "Enable",
|
|
894
895
|
disable: "Disable",
|
|
895
896
|
cancel: "Cancel",
|
|
896
|
-
confirm: "Confirm",
|
|
897
897
|
empty: "No matching suites",
|
|
898
898
|
installedEmpty: "No suites installed yet",
|
|
899
899
|
loadFail: "Failed to load the suite catalog, try again later",
|
|
900
900
|
actionFail: "Action failed",
|
|
901
|
+
requestTimeout: "A local service stopped responding, so waiting was stopped. The operation may still be running — refresh shortly to see the result",
|
|
901
902
|
version: "Version",
|
|
902
903
|
dimensionUser: "user",
|
|
903
904
|
dimensionProject: "project",
|
|
@@ -920,80 +921,48 @@ const en = {
|
|
|
920
921
|
surfaceCommands: "commands",
|
|
921
922
|
surfaceAgents: "subagents",
|
|
922
923
|
surfaceLsp: "LSP",
|
|
923
|
-
sourceNotCloned: "not cloned",
|
|
924
|
-
sourceCloned: "cloned",
|
|
925
924
|
errors: "validation issues",
|
|
926
925
|
scanNotes: "scan notes",
|
|
927
926
|
sourceErrorSeparator: "; ",
|
|
928
|
-
viewMode: "View mode",
|
|
929
927
|
grid: "grid",
|
|
930
928
|
list: "list",
|
|
931
|
-
openSettings: "Open in settings",
|
|
932
929
|
rootLabel: "Suite root",
|
|
933
|
-
dataLabel: "Suite data root",
|
|
934
|
-
countAll: "{n} suites",
|
|
935
|
-
countInstalled: "{n} installed",
|
|
936
|
-
countEnabled: "{n} enabled",
|
|
937
|
-
mcpStatusNav: "MCP services",
|
|
938
|
-
lspStatusNav: "LSP servers",
|
|
939
930
|
lspSearch: "Search LSP servers",
|
|
940
|
-
|
|
941
|
-
lspDirect: "Direct",
|
|
931
|
+
lspDirect: "User",
|
|
942
932
|
mcpStatusTitle: "MCP services",
|
|
943
933
|
mcpStatusSubtitle: "Connection state, sources, and tools",
|
|
944
934
|
mcpSearch: "Search MCP names, sources, or endpoints…",
|
|
945
935
|
mcpAll: "All",
|
|
946
936
|
mcpPlugin: "Plugin",
|
|
947
|
-
mcpDirect: "
|
|
948
|
-
mcpService: "Service",
|
|
949
|
-
mcpSource: "Source",
|
|
950
|
-
mcpTransport: "Transport",
|
|
937
|
+
mcpDirect: "User",
|
|
951
938
|
mcpTools: "tools",
|
|
952
939
|
mcpTool: "tool",
|
|
953
|
-
mcpAllConnected: "All connected",
|
|
954
940
|
mcpReasonLabel: "Reason",
|
|
955
|
-
mcpRetryNote: "Automatic retries were exhausted. Use Retry to reconnect now, or check the server configuration in the market.",
|
|
956
|
-
mcpRetrying: "Reconnecting…",
|
|
957
941
|
mcpRetrySuccess: "Reconnected — the service is live again",
|
|
958
|
-
mcpRetryFailure: "Reconnect failed — see the reason above",
|
|
959
942
|
mcpReauthorize: "Re-authorize",
|
|
960
943
|
mcpClose: "Close",
|
|
961
944
|
mcpRetryConnection: "Retry connection",
|
|
962
945
|
mcpRetryPreservesCredentials: "Retries failed managed connections without clearing credentials. Checks all managed MCP services.",
|
|
963
946
|
mcpReauthExplain: "This clears the saved OAuth grant for this service and reconnects it, which may interrupt active requests. Use it to change accounts or permissions. If sign-in is required, complete authorization in the browser page that opens.",
|
|
964
947
|
mcpConfirmReauth: "Clear authorization and reconnect",
|
|
948
|
+
mcpOauthDefault: "OAuth on by default",
|
|
965
949
|
mcpSaveFirst: "Save configuration before connection actions; they use saved configuration only.",
|
|
966
950
|
mcpStillUnavailable: "The operation finished, but the service is not confirmed connected. Check its status and error details",
|
|
967
951
|
mcpConfigureCredentialsFirst: "Configure the missing credentials first. Retrying cannot supply them automatically.",
|
|
968
952
|
mcpSavedStatusUnknown: "Configuration saved, but connection status could not be refreshed",
|
|
969
953
|
mcpEntryGone: "This service is no longer listed. Close the details and refresh.",
|
|
970
|
-
|
|
971
|
-
mcpReauthorizing: "Waiting for browser authorization…",
|
|
972
|
-
marketCardDesc: "Install, enable, and runtime settings for Agent Plugins Market suites.",
|
|
954
|
+
marketCardDesc: "Manage suite sources, installs, and runtime switches.",
|
|
973
955
|
mcpCardTitle: "MCP enhancement",
|
|
974
|
-
|
|
975
|
-
mcpCardDescOff: "Off: uses the host dsh-mcp-client.",
|
|
956
|
+
mcpCardDesc: "Built-in bridge with OAuth and SSE; off falls back to the host dsh-mcp-client.",
|
|
976
957
|
mcpCardReadonly: "The settings document is read-only in this environment; the switch is unavailable.",
|
|
977
|
-
mcpForeign: "Mounted elsewhere",
|
|
978
958
|
mcpForeignHint: "This server is already mounted through another path (native config or another plugin); the market skipped it to avoid a duplicate. To let the market take over, disable the other source first. If it is a leftover mount, a Host restart clears it.",
|
|
979
959
|
mcpDuplicateHint: "Another source already mounted this server, so this copy was not registered — mounting the same server twice adds nothing for the model. Uninstall the other source's suite and this copy takes over on the next refresh.",
|
|
980
960
|
regionLabel: "Download region",
|
|
981
|
-
regionHint: "China mainland
|
|
961
|
+
regionHint: "China mainland uses a mirror. Affects downloads only.",
|
|
982
962
|
regionGlobal: "Global",
|
|
983
963
|
regionChina: "China mainland",
|
|
984
964
|
mcpBackendHostMissing: "The host dsh-mcp-client is not available here; compat mode cannot be enabled.",
|
|
985
|
-
mcpReauthHint: "Drops the saved OAuth token and re-runs the browser authorization — for when you picked too narrow a scope. Finish the sign-in in the page that opens.",
|
|
986
|
-
mcpConnectHint: "Drops the stale grant and starts a fresh browser sign-in. Approve in the page that opens and the service connects automatically.",
|
|
987
|
-
mcpReauthSuccess: "Old grant dropped — finish the sign-in in the browser page that opened",
|
|
988
|
-
mcpReauthFailure: "Re-authorization failed — try again shortly",
|
|
989
965
|
mcpZeroTools: "Connected, but this service advertises no tools.",
|
|
990
|
-
mcpConnected: "connected",
|
|
991
|
-
mcpDegraded: "degraded",
|
|
992
|
-
mcpFailed: "failed",
|
|
993
|
-
mcpNeedsCredentials: "credentials required",
|
|
994
|
-
mcpOrphaned: "plugin removed; tools remain",
|
|
995
|
-
mcpConfigureCredentials: "Configure credentials",
|
|
996
|
-
mcpViewDetails: "View details",
|
|
997
966
|
mcpCredentialTitle: "Credential configuration",
|
|
998
967
|
mcpCredentialConfigured: "configured",
|
|
999
968
|
mcpCredentialMissing: "not configured",
|
|
@@ -1002,50 +971,44 @@ const en = {
|
|
|
1002
971
|
mcpCredentialPlaceholder: "Enter credential (not echoed)",
|
|
1003
972
|
mcpCredentialSave: "Save credential",
|
|
1004
973
|
mcpCredentialUnset: "Remove credential",
|
|
1005
|
-
mcpDisabled: "disabled",
|
|
1006
974
|
mcpObservedEndpoint: "observed from tool registry",
|
|
1007
975
|
mcpServiceDetail: "Service detail",
|
|
1008
976
|
mcpConfig: "Connection config",
|
|
1009
|
-
mcpSelectHint: "Select an MCP service to inspect config and tools",
|
|
1010
977
|
mcpEmpty: "No matching MCP services",
|
|
1011
978
|
mcpNoTools: "No registered tools",
|
|
1012
|
-
|
|
1013
|
-
mcpDirectBoundary: "Direct MCP entries only show services observed in the current tool registry; the host exposes no config or connection-status API.",
|
|
1014
|
-
mcpEnabled: "Enable MCP service",
|
|
979
|
+
mcpDirectBoundary: "User MCP entries only show services observed in the current tool registry; the host exposes no config or connection-status API.",
|
|
1015
980
|
mcpAddTitle: "New MCP service",
|
|
1016
981
|
mcpServerName: "Server name",
|
|
1017
|
-
mcpServerConfig: "Server configuration (JSON)",
|
|
1018
|
-
mcpBackToMarket: "Back to market",
|
|
1019
982
|
mcpRetry: "Retry",
|
|
1020
|
-
mcpFilterAllHint: "All: MCP services declared by plugin suites plus
|
|
983
|
+
mcpFilterAllHint: "All: MCP services declared by plugin suites plus MCP you added",
|
|
1021
984
|
mcpFilterPluginHint: "Plugin: mcp.json declarations from market suites",
|
|
1022
|
-
mcpFilterDirectHint: "
|
|
985
|
+
mcpFilterDirectHint: "User: MCP observed in the host tool registry outside any suite",
|
|
1023
986
|
lspStatusTitle: "LSP servers",
|
|
1024
987
|
lspStatusSubtitle: "Declared language servers and their mount state",
|
|
1025
988
|
lspAll: "All",
|
|
1026
989
|
lspMounted: "Mounted",
|
|
1027
990
|
lspStarting: "Starting…",
|
|
1028
|
-
lspBlocked: "Blocked",
|
|
1029
991
|
lspFailed: "Failed",
|
|
1030
992
|
lspDisabled: "Disabled",
|
|
1031
|
-
lspHostMissingShort: "
|
|
1032
|
-
lspConflict: "
|
|
1033
|
-
lspHostMissing: "This DSH runtime does not carry the LSP packages (@deepseek-ai/dsh-lsp, dsh-lsp-stdio, dsh-tool-lsp), so declarations are not mounted; upgrade the host, mount the three layers in the profile, and re-enable the suite.",
|
|
993
|
+
lspHostMissingShort: "LSP components missing",
|
|
994
|
+
lspConflict: "Seam conflict",
|
|
1034
995
|
lspEmpty: "No declared LSP servers",
|
|
1035
996
|
lspReasonLabel: "Reason",
|
|
1036
997
|
lspFilterAllHint: "All: suite-declared and user-configured language servers",
|
|
1037
998
|
lspFilterPluginHint: "Plugin: inline lspServers declarations from market suites",
|
|
1038
|
-
lspFilterDirectHint: "
|
|
1039
|
-
lspFilterBlockedHint: "Blocked: missing host packages, failed mounts, or extension conflicts — open a card for the reason",
|
|
1040
|
-
lspFilterDisabledHint: "Disabled: the suite LSP surface toggle is off",
|
|
999
|
+
lspFilterDirectHint: "User: language servers configured in this panel",
|
|
1041
1000
|
lspPlugin: "Plugin",
|
|
1042
|
-
lspConfigure: "Configure LSP",
|
|
1043
|
-
lspConfigureHint: "Edit the user-configured language-server table (Claude Code lspServers format); servers mount automatically after save",
|
|
1044
|
-
lspEnabled: "Enable LSP service",
|
|
1045
1001
|
lspSave: "Save",
|
|
1046
1002
|
lspDetailSubtitle: "Language server detail",
|
|
1047
|
-
|
|
1048
|
-
|
|
1003
|
+
lspSeamTitle: "One upgrade step is needed",
|
|
1004
|
+
lspSeamBody: "This profile still carries a hand-added LSP layer — the setup instructions shipped before the plugin provided LSP itself asked you to add it. It claims the same seam as the plugin copy, so language servers cannot mount. Removing it is enough; the plugin copy takes over and keeps a backup of the file.",
|
|
1005
|
+
lspSeamFile: "File to change",
|
|
1006
|
+
lspSeamRemove: "Remove the layer",
|
|
1007
|
+
lspSeamRemoving: "Removing…",
|
|
1008
|
+
lspSeamDone: "Removed. Remounting language servers.",
|
|
1009
|
+
lspSeamRestart: "Removed. Restart DSH for the layer to unload.",
|
|
1010
|
+
lspSeamBackup: "Original file backed up to",
|
|
1011
|
+
lspSeamOther: "Other profiles carry the same layer; this action only handles the one above:",
|
|
1049
1012
|
mdCodeCopy: "Copy",
|
|
1050
1013
|
mdCodeCopied: "Copied",
|
|
1051
1014
|
mdFootnotes: "Footnotes",
|
|
@@ -1066,9 +1029,8 @@ const en = {
|
|
|
1066
1029
|
personaSelectModel: "Select model",
|
|
1067
1030
|
personaUnavailable: "Currently unavailable",
|
|
1068
1031
|
personaCatalogError: "Unable to load the DSH model directory",
|
|
1069
|
-
|
|
1070
|
-
personaModelHint: "
|
|
1071
|
-
personaToolsHint: "Separate tool names with commas; leave blank to inherit available tools. Raw YAML also accepts a tools sequence.",
|
|
1032
|
+
personaRouteIgnored: "This route is not applied: set both a provider and a model, or the child inherits the session route.",
|
|
1033
|
+
personaModelHint: "A route applies only when a provider and a model are both set; a lone value or a provider/model string is ignored and the child inherits the session route.",
|
|
1072
1034
|
personaMetadataInvalid: "Fix the raw YAML before editing runtime configuration.",
|
|
1073
1035
|
panelDetails: "View details",
|
|
1074
1036
|
panelSave: "Save",
|
|
@@ -1078,6 +1040,7 @@ const en = {
|
|
|
1078
1040
|
busyHintProcessing: "Your request is being processed. Please wait.",
|
|
1079
1041
|
busyHintRefresh: "The current view will update when the operation finishes.",
|
|
1080
1042
|
busyHintWaiting: "Waiting time depends on local services and network responses.",
|
|
1043
|
+
busyLongRunning: "This has been waiting a while; a local service or the network may not be responding. Keep waiting, or refresh shortly to see the result.",
|
|
1081
1044
|
panelSearchLabel: "Search entries…",
|
|
1082
1045
|
panelFilterAll: "All",
|
|
1083
1046
|
panelFilterDisabled: "Disabled",
|
|
@@ -1091,7 +1054,6 @@ const en = {
|
|
|
1091
1054
|
panelEmpty: "No entries yet — use + to add one",
|
|
1092
1055
|
panelDisabledBadge: "disabled",
|
|
1093
1056
|
panelDelete: "Delete",
|
|
1094
|
-
commandsPanelHint: "Commands are chat quick-replies: typing /name forwards the template body (with $ARGUMENTS) to the model as instructions.",
|
|
1095
1057
|
skillsPanelDescription: "Inspect loaded plugin and user skills, and maintain user skills.",
|
|
1096
1058
|
commandsPanelDescription: "Inspect plugin and user commands.",
|
|
1097
1059
|
personasPanelDescription: "Inspect plugin agent roles and user persona cards and maintain reusable SubAgent setups.",
|
|
@@ -1105,8 +1067,10 @@ const en = {
|
|
|
1105
1067
|
removeSourceKeepFiles: "Unregister only; keep the local directory",
|
|
1106
1068
|
feedbackToggleLabel: "Experience feedback tool",
|
|
1107
1069
|
projectLayoutsLabel: "Scan project Agent layouts",
|
|
1108
|
-
|
|
1109
|
-
|
|
1070
|
+
projectLayoutsDesc: "Reads skills, commands, roles, MCP servers and hooks from the project .claude, .agents and similar directories.",
|
|
1071
|
+
autoUpdateLabel: "Background source updates",
|
|
1072
|
+
autoUpdateDesc: "Refreshes every configured source every 6 hours.",
|
|
1073
|
+
feedbackToggleDesc: "The agent may auto-file an issue when it hits a problem in this plugin."
|
|
1110
1074
|
};
|
|
1111
1075
|
//#endregion
|
|
1112
1076
|
//#region src/client/features/market/market-resource.ts
|
|
@@ -1218,16 +1182,8 @@ function searchableFor$1(overview) {
|
|
|
1218
1182
|
//#endregion
|
|
1219
1183
|
//#region src/client/market.module.css
|
|
1220
1184
|
var market_module_default = {
|
|
1221
|
-
"backendBlock": "_72qoAq_backendBlock",
|
|
1222
|
-
"backendCurrent": "_72qoAq_backendCurrent",
|
|
1223
|
-
"backendHint": "_72qoAq_backendHint",
|
|
1224
|
-
"backendRow": "_72qoAq_backendRow",
|
|
1225
|
-
"backendTitle": "_72qoAq_backendTitle",
|
|
1226
|
-
"backendVersion": "_72qoAq_backendVersion",
|
|
1227
|
-
"body": "_72qoAq_body",
|
|
1228
1185
|
"card": "_72qoAq_card",
|
|
1229
1186
|
"cardActions": "_72qoAq_cardActions",
|
|
1230
|
-
"cardDesc": "_72qoAq_cardDesc",
|
|
1231
1187
|
"cardName": "_72qoAq_cardName",
|
|
1232
1188
|
"cardTitle": "_72qoAq_cardTitle",
|
|
1233
1189
|
"cardTop": "_72qoAq_cardTop",
|
|
@@ -1270,16 +1226,6 @@ var market_module_default = {
|
|
|
1270
1226
|
"market": "_72qoAq_market",
|
|
1271
1227
|
"market-config": "_72qoAq_market-config",
|
|
1272
1228
|
"marketControls": "_72qoAq_marketControls",
|
|
1273
|
-
"mcpCredentialControls": "_72qoAq_mcpCredentialControls",
|
|
1274
|
-
"mcpCredentialEditor": "_72qoAq_mcpCredentialEditor",
|
|
1275
|
-
"mcpCredentialForm": "_72qoAq_mcpCredentialForm",
|
|
1276
|
-
"mcpCredentialRow": "_72qoAq_mcpCredentialRow",
|
|
1277
|
-
"mcpOverrideActions": "_72qoAq_mcpOverrideActions",
|
|
1278
|
-
"mcpOverrideArea": "_72qoAq_mcpOverrideArea",
|
|
1279
|
-
"mcpOverrideCheck": "_72qoAq_mcpOverrideCheck",
|
|
1280
|
-
"mcpOverrideForm": "_72qoAq_mcpOverrideForm",
|
|
1281
|
-
"mcpOverrideInput": "_72qoAq_mcpOverrideInput",
|
|
1282
|
-
"mcpSurface": "_72qoAq_mcpSurface",
|
|
1283
1229
|
"meta": "_72qoAq_meta",
|
|
1284
1230
|
"modalFooter": "_72qoAq_modalFooter",
|
|
1285
1231
|
"modalFooterLeft": "_72qoAq_modalFooterLeft",
|
|
@@ -1309,7 +1255,6 @@ var market_module_default = {
|
|
|
1309
1255
|
"regionSeg": "_72qoAq_regionSeg",
|
|
1310
1256
|
"regionSegBtn": "_72qoAq_regionSegBtn",
|
|
1311
1257
|
"regionSegOn": "_72qoAq_regionSegOn",
|
|
1312
|
-
"searchGroup": "_72qoAq_searchGroup",
|
|
1313
1258
|
"seg": "_72qoAq_seg",
|
|
1314
1259
|
"segOn": "_72qoAq_segOn",
|
|
1315
1260
|
"skillContent": "_72qoAq_skillContent",
|
|
@@ -1317,7 +1262,6 @@ var market_module_default = {
|
|
|
1317
1262
|
"sourceTabsBoxFold": "_72qoAq_sourceTabsBoxFold",
|
|
1318
1263
|
"sourceTabsBoxPicked": "_72qoAq_sourceTabsBoxPicked",
|
|
1319
1264
|
"sourceTabsRow": "_72qoAq_sourceTabsRow",
|
|
1320
|
-
"spacer": "_72qoAq_spacer",
|
|
1321
1265
|
"src": "_72qoAq_src",
|
|
1322
1266
|
"srcTab": "_72qoAq_srcTab",
|
|
1323
1267
|
"srcTabDel": "_72qoAq_srcTabDel",
|
|
@@ -1326,8 +1270,6 @@ var market_module_default = {
|
|
|
1326
1270
|
"srcTabOn": "_72qoAq_srcTabOn",
|
|
1327
1271
|
"staticId": "_72qoAq_staticId",
|
|
1328
1272
|
"staticIdValue": "_72qoAq_staticIdValue",
|
|
1329
|
-
"sub": "_72qoAq_sub",
|
|
1330
|
-
"surfaceSwitch": "_72qoAq_surfaceSwitch",
|
|
1331
1273
|
"surfaceToggle": "_72qoAq_surfaceToggle",
|
|
1332
1274
|
"surfaceToggles": "_72qoAq_surfaceToggles",
|
|
1333
1275
|
"switchOff": "_72qoAq_switchOff",
|
|
@@ -1335,8 +1277,6 @@ var market_module_default = {
|
|
|
1335
1277
|
"switchThumb": "_72qoAq_switchThumb",
|
|
1336
1278
|
"tag": "_72qoAq_tag",
|
|
1337
1279
|
"tagRow": "_72qoAq_tagRow",
|
|
1338
|
-
"title": "_72qoAq_title",
|
|
1339
|
-
"titleRow": "_72qoAq_titleRow",
|
|
1340
1280
|
"unmanagedAdopt": "_72qoAq_unmanagedAdopt",
|
|
1341
1281
|
"unmanagedChip": "_72qoAq_unmanagedChip",
|
|
1342
1282
|
"unmanagedChipName": "_72qoAq_unmanagedChipName",
|
|
@@ -1664,6 +1604,14 @@ function suiteLayoutLabel(layout, t) {
|
|
|
1664
1604
|
//#endregion
|
|
1665
1605
|
//#region src/client/features/market/SuiteCard.tsx
|
|
1666
1606
|
/** A suite card in the market grid/list. */
|
|
1607
|
+
/**
|
|
1608
|
+
* A tooltip anchor. `Tooltip` clones its child and chains its own hover/focus
|
|
1609
|
+
* handlers onto it, so the anchor must expose a span's handler props.
|
|
1610
|
+
*/
|
|
1611
|
+
function warnAnchor(text) {
|
|
1612
|
+
const props = { className: market_module_default.warnLine };
|
|
1613
|
+
return (0, react.createElement)("span", props, text);
|
|
1614
|
+
}
|
|
1667
1615
|
function SuiteCard(props) {
|
|
1668
1616
|
const { t, suite, busy } = props;
|
|
1669
1617
|
const tags = [
|
|
@@ -1676,7 +1624,8 @@ function SuiteCard(props) {
|
|
|
1676
1624
|
].filter(([, count]) => count > 0);
|
|
1677
1625
|
const layoutLabel = suiteLayoutLabel(suite.layout, t);
|
|
1678
1626
|
const isRemote = suite.remoteUrl !== void 0;
|
|
1679
|
-
const
|
|
1627
|
+
const mcpErrors = suite.mcpErrors ?? [];
|
|
1628
|
+
const hasTagRow = tags.length > 0 || suite.errors.length > 0 || mcpErrors.length > 0;
|
|
1680
1629
|
const stop = (callback) => (event) => {
|
|
1681
1630
|
event.stopPropagation();
|
|
1682
1631
|
callback();
|
|
@@ -1731,10 +1680,10 @@ function SuiteCard(props) {
|
|
|
1731
1680
|
className: market_module_default.tag
|
|
1732
1681
|
}, `${label} ${count}`)), suite.errors.length === 0 ? null : (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
1733
1682
|
label: suite.errors.slice(0, 8).join(t("sourceErrorSeparator")),
|
|
1734
|
-
children: (
|
|
1735
|
-
}),
|
|
1736
|
-
label:
|
|
1737
|
-
children: (
|
|
1683
|
+
children: warnAnchor(`⚠ ${t("errors")} ${suite.errors.length}`)
|
|
1684
|
+
}), mcpErrors.length === 0 ? null : (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
1685
|
+
label: mcpErrors.slice(0, 8).join(t("sourceErrorSeparator")),
|
|
1686
|
+
children: warnAnchor(`⚠ ${t("mcpSection")} ${mcpErrors.length}`)
|
|
1738
1687
|
})) : null);
|
|
1739
1688
|
}
|
|
1740
1689
|
//#endregion
|
|
@@ -1824,7 +1773,7 @@ function DetailModal(props) {
|
|
|
1824
1773
|
}));
|
|
1825
1774
|
}
|
|
1826
1775
|
//#endregion
|
|
1827
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
1776
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/identity.js
|
|
1828
1777
|
const ALIAS = Symbol.for("yaml.alias");
|
|
1829
1778
|
const DOC = Symbol.for("yaml.document");
|
|
1830
1779
|
const MAP = Symbol.for("yaml.map");
|
|
@@ -1856,7 +1805,7 @@ function isNode(node) {
|
|
|
1856
1805
|
}
|
|
1857
1806
|
const hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;
|
|
1858
1807
|
//#endregion
|
|
1859
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
1808
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/visit.js
|
|
1860
1809
|
const BREAK$1 = Symbol("break visit");
|
|
1861
1810
|
const SKIP$1 = Symbol("skip children");
|
|
1862
1811
|
const REMOVE$1 = Symbol("remove node");
|
|
@@ -2042,7 +1991,7 @@ function replaceNode(key, path, node) {
|
|
|
2042
1991
|
}
|
|
2043
1992
|
}
|
|
2044
1993
|
//#endregion
|
|
2045
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
1994
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/doc/directives.js
|
|
2046
1995
|
const escapeChars = {
|
|
2047
1996
|
"!": "%21",
|
|
2048
1997
|
",": "%2C",
|
|
@@ -2201,7 +2150,7 @@ Directives.defaultYaml = {
|
|
|
2201
2150
|
};
|
|
2202
2151
|
Directives.defaultTags = { "!!": "tag:yaml.org,2002:" };
|
|
2203
2152
|
//#endregion
|
|
2204
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2153
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/doc/anchors.js
|
|
2205
2154
|
/**
|
|
2206
2155
|
* Verify that the input string is a valid anchor.
|
|
2207
2156
|
*
|
|
@@ -2260,7 +2209,7 @@ function createNodeAnchors(doc, prefix) {
|
|
|
2260
2209
|
};
|
|
2261
2210
|
}
|
|
2262
2211
|
//#endregion
|
|
2263
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2212
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/doc/applyReviver.js
|
|
2264
2213
|
/**
|
|
2265
2214
|
* Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,
|
|
2266
2215
|
* in section 24.5.1.1 "Runtime Semantics: InternalizeJSONProperty" of the
|
|
@@ -2299,7 +2248,7 @@ function applyReviver(reviver, obj, key, val) {
|
|
|
2299
2248
|
return reviver.call(obj, key, val);
|
|
2300
2249
|
}
|
|
2301
2250
|
//#endregion
|
|
2302
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2251
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/toJS.js
|
|
2303
2252
|
/**
|
|
2304
2253
|
* Recursively convert any node or its contents to native JavaScript
|
|
2305
2254
|
*
|
|
@@ -2332,7 +2281,7 @@ function toJS(value, arg, ctx) {
|
|
|
2332
2281
|
return value;
|
|
2333
2282
|
}
|
|
2334
2283
|
//#endregion
|
|
2335
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2284
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/Node.js
|
|
2336
2285
|
var NodeBase = class {
|
|
2337
2286
|
constructor(type) {
|
|
2338
2287
|
Object.defineProperty(this, NODE_TYPE, { value: type });
|
|
@@ -2360,7 +2309,7 @@ var NodeBase = class {
|
|
|
2360
2309
|
}
|
|
2361
2310
|
};
|
|
2362
2311
|
//#endregion
|
|
2363
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2312
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/Alias.js
|
|
2364
2313
|
var Alias = class extends NodeBase {
|
|
2365
2314
|
constructor(source) {
|
|
2366
2315
|
super(ALIAS);
|
|
@@ -2389,29 +2338,31 @@ var Alias = class extends NodeBase {
|
|
|
2389
2338
|
if (node === this) break;
|
|
2390
2339
|
if (node.anchor === this.source) found = node;
|
|
2391
2340
|
}
|
|
2341
|
+
if (found && ctx) {
|
|
2342
|
+
const { anchors, doc, maxAliasCount } = ctx;
|
|
2343
|
+
let data = anchors.get(found);
|
|
2344
|
+
if (!data) {
|
|
2345
|
+
toJS(found, null, ctx);
|
|
2346
|
+
data = anchors.get(found);
|
|
2347
|
+
}
|
|
2348
|
+
/* istanbul ignore if */
|
|
2349
|
+
if (data?.res === void 0) throw new ReferenceError("This should not happen: Alias anchor was not resolved?");
|
|
2350
|
+
if (maxAliasCount >= 0) {
|
|
2351
|
+
data.count += 1;
|
|
2352
|
+
if (data.aliasCount === 0) data.aliasCount = getAliasCount(doc, found, anchors);
|
|
2353
|
+
if (data.count * data.aliasCount > maxAliasCount) throw new ReferenceError("Excessive alias count indicates a resource exhaustion attack");
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2392
2356
|
return found;
|
|
2393
2357
|
}
|
|
2394
2358
|
toJSON(_arg, ctx) {
|
|
2395
2359
|
if (!ctx) return { source: this.source };
|
|
2396
|
-
const
|
|
2397
|
-
const source = this.resolve(doc, ctx);
|
|
2360
|
+
const source = this.resolve(ctx.doc, ctx);
|
|
2398
2361
|
if (!source) {
|
|
2399
2362
|
const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;
|
|
2400
2363
|
throw new ReferenceError(msg);
|
|
2401
2364
|
}
|
|
2402
|
-
|
|
2403
|
-
if (!data) {
|
|
2404
|
-
toJS(source, null, ctx);
|
|
2405
|
-
data = anchors.get(source);
|
|
2406
|
-
}
|
|
2407
|
-
/* istanbul ignore if */
|
|
2408
|
-
if (data?.res === void 0) throw new ReferenceError("This should not happen: Alias anchor was not resolved?");
|
|
2409
|
-
if (maxAliasCount >= 0) {
|
|
2410
|
-
data.count += 1;
|
|
2411
|
-
if (data.aliasCount === 0) data.aliasCount = getAliasCount(doc, source, anchors);
|
|
2412
|
-
if (data.count * data.aliasCount > maxAliasCount) throw new ReferenceError("Excessive alias count indicates a resource exhaustion attack");
|
|
2413
|
-
}
|
|
2414
|
-
return data.res;
|
|
2365
|
+
return ctx.anchors.get(source).res;
|
|
2415
2366
|
}
|
|
2416
2367
|
toString(ctx, _onComment, _onChompKeep) {
|
|
2417
2368
|
const src = `*${this.source}`;
|
|
@@ -2446,7 +2397,7 @@ function getAliasCount(doc, node, anchors) {
|
|
|
2446
2397
|
return 1;
|
|
2447
2398
|
}
|
|
2448
2399
|
//#endregion
|
|
2449
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2400
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/Scalar.js
|
|
2450
2401
|
const isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object";
|
|
2451
2402
|
var Scalar = class extends NodeBase {
|
|
2452
2403
|
constructor(value) {
|
|
@@ -2466,7 +2417,7 @@ Scalar.PLAIN = "PLAIN";
|
|
|
2466
2417
|
Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE";
|
|
2467
2418
|
Scalar.QUOTE_SINGLE = "QUOTE_SINGLE";
|
|
2468
2419
|
//#endregion
|
|
2469
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2420
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/doc/createNode.js
|
|
2470
2421
|
const defaultTagPrefix = "tag:yaml.org,2002:";
|
|
2471
2422
|
function findTagObject(value, tagName, tags) {
|
|
2472
2423
|
if (tagName) {
|
|
@@ -2523,7 +2474,7 @@ function createNode(value, tagName, ctx) {
|
|
|
2523
2474
|
return node;
|
|
2524
2475
|
}
|
|
2525
2476
|
//#endregion
|
|
2526
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2477
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/Collection.js
|
|
2527
2478
|
function collectionFromPath(schema, path, value) {
|
|
2528
2479
|
let v = value;
|
|
2529
2480
|
for (let i = path.length - 1; i >= 0; --i) {
|
|
@@ -2636,7 +2587,7 @@ var Collection = class extends NodeBase {
|
|
|
2636
2587
|
}
|
|
2637
2588
|
};
|
|
2638
2589
|
//#endregion
|
|
2639
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2590
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyComment.js
|
|
2640
2591
|
/**
|
|
2641
2592
|
* Stringifies a comment.
|
|
2642
2593
|
*
|
|
@@ -2651,7 +2602,7 @@ function indentComment(comment, indent) {
|
|
|
2651
2602
|
}
|
|
2652
2603
|
const lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment;
|
|
2653
2604
|
//#endregion
|
|
2654
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2605
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/foldFlowLines.js
|
|
2655
2606
|
const FOLD_FLOW = "flow";
|
|
2656
2607
|
const FOLD_BLOCK = "block";
|
|
2657
2608
|
const FOLD_QUOTED = "quoted";
|
|
@@ -2765,7 +2716,7 @@ function consumeMoreIndentedLines(text, i, indent) {
|
|
|
2765
2716
|
return end;
|
|
2766
2717
|
}
|
|
2767
2718
|
//#endregion
|
|
2768
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2719
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyString.js
|
|
2769
2720
|
const getFoldOptions = (ctx, isBlock) => ({
|
|
2770
2721
|
indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart,
|
|
2771
2722
|
lineWidth: ctx.options.lineWidth,
|
|
@@ -2984,7 +2935,7 @@ function stringifyString(item, ctx, onComment, onChompKeep) {
|
|
|
2984
2935
|
return res;
|
|
2985
2936
|
}
|
|
2986
2937
|
//#endregion
|
|
2987
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
2938
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringify.js
|
|
2988
2939
|
function createStringifyContext(doc, options) {
|
|
2989
2940
|
const opt = Object.assign({
|
|
2990
2941
|
blockQuote: true,
|
|
@@ -3084,7 +3035,7 @@ function stringify(item, ctx, onComment, onChompKeep) {
|
|
|
3084
3035
|
return isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props}\n${ctx.indent}${str}`;
|
|
3085
3036
|
}
|
|
3086
3037
|
//#endregion
|
|
3087
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3038
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyPair.js
|
|
3088
3039
|
function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
3089
3040
|
const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;
|
|
3090
3041
|
let keyComment = isNode(key) && key.comment || null;
|
|
@@ -3174,12 +3125,12 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
3174
3125
|
return str;
|
|
3175
3126
|
}
|
|
3176
3127
|
//#endregion
|
|
3177
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3128
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/log.js
|
|
3178
3129
|
function warn(logLevel, warning) {
|
|
3179
3130
|
if (logLevel === "debug" || logLevel === "warn") console.warn(warning);
|
|
3180
3131
|
}
|
|
3181
3132
|
//#endregion
|
|
3182
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3133
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js
|
|
3183
3134
|
const MERGE_KEY = "<<";
|
|
3184
3135
|
const merge = {
|
|
3185
3136
|
identify: (value) => value === MERGE_KEY || typeof value === "symbol" && value.description === MERGE_KEY,
|
|
@@ -3215,7 +3166,7 @@ function resolveAliasValue(ctx, value) {
|
|
|
3215
3166
|
return ctx && isAlias(value) ? value.resolve(ctx.doc, ctx) : value;
|
|
3216
3167
|
}
|
|
3217
3168
|
//#endregion
|
|
3218
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3169
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js
|
|
3219
3170
|
function addPairToJSMap(ctx, map, { key, value }) {
|
|
3220
3171
|
if (isNode(key) && key.addToJSMap) key.addToJSMap(ctx, map, value);
|
|
3221
3172
|
else if (isMergeKey(ctx, key)) addMergeToJSMap(ctx, map, value);
|
|
@@ -3258,7 +3209,7 @@ function stringifyKey(key, jsKey, ctx) {
|
|
|
3258
3209
|
return JSON.stringify(jsKey);
|
|
3259
3210
|
}
|
|
3260
3211
|
//#endregion
|
|
3261
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3212
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/Pair.js
|
|
3262
3213
|
function createPair(key, value, ctx) {
|
|
3263
3214
|
return new Pair(createNode(key, void 0, ctx), createNode(value, void 0, ctx));
|
|
3264
3215
|
}
|
|
@@ -3282,7 +3233,7 @@ var Pair = class Pair {
|
|
|
3282
3233
|
}
|
|
3283
3234
|
};
|
|
3284
3235
|
//#endregion
|
|
3285
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3236
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyCollection.js
|
|
3286
3237
|
function stringifyCollection(collection, ctx, options) {
|
|
3287
3238
|
return (ctx.inFlow ?? collection.flow ? stringifyFlowCollection : stringifyBlockCollection)(collection, ctx, options);
|
|
3288
3239
|
}
|
|
@@ -3394,7 +3345,7 @@ function addCommentBefore({ indent, options: { commentString } }, lines, comment
|
|
|
3394
3345
|
}
|
|
3395
3346
|
}
|
|
3396
3347
|
//#endregion
|
|
3397
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3348
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/YAMLMap.js
|
|
3398
3349
|
function findPair(items, key) {
|
|
3399
3350
|
const k = isScalar(key) ? key.value : key;
|
|
3400
3351
|
for (const it of items) if (isPair(it)) {
|
|
@@ -3493,7 +3444,7 @@ var YAMLMap = class extends Collection {
|
|
|
3493
3444
|
}
|
|
3494
3445
|
};
|
|
3495
3446
|
//#endregion
|
|
3496
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3447
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/common/map.js
|
|
3497
3448
|
const map = {
|
|
3498
3449
|
collection: "map",
|
|
3499
3450
|
default: true,
|
|
@@ -3506,7 +3457,7 @@ const map = {
|
|
|
3506
3457
|
createNode: (schema, obj, ctx) => YAMLMap.from(schema, obj, ctx)
|
|
3507
3458
|
};
|
|
3508
3459
|
//#endregion
|
|
3509
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3460
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/nodes/YAMLSeq.js
|
|
3510
3461
|
var YAMLSeq = class extends Collection {
|
|
3511
3462
|
static get tagName() {
|
|
3512
3463
|
return "tag:yaml.org,2002:seq";
|
|
@@ -3603,7 +3554,7 @@ function asItemIndex(key) {
|
|
|
3603
3554
|
return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null;
|
|
3604
3555
|
}
|
|
3605
3556
|
//#endregion
|
|
3606
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3557
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/common/seq.js
|
|
3607
3558
|
const seq = {
|
|
3608
3559
|
collection: "seq",
|
|
3609
3560
|
default: true,
|
|
@@ -3616,7 +3567,7 @@ const seq = {
|
|
|
3616
3567
|
createNode: (schema, obj, ctx) => YAMLSeq.from(schema, obj, ctx)
|
|
3617
3568
|
};
|
|
3618
3569
|
//#endregion
|
|
3619
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3570
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/common/string.js
|
|
3620
3571
|
const string = {
|
|
3621
3572
|
identify: (value) => typeof value === "string",
|
|
3622
3573
|
default: true,
|
|
@@ -3628,7 +3579,7 @@ const string = {
|
|
|
3628
3579
|
}
|
|
3629
3580
|
};
|
|
3630
3581
|
//#endregion
|
|
3631
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3582
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/common/null.js
|
|
3632
3583
|
const nullTag = {
|
|
3633
3584
|
identify: (value) => value == null,
|
|
3634
3585
|
createNode: () => new Scalar(null),
|
|
@@ -3639,7 +3590,7 @@ const nullTag = {
|
|
|
3639
3590
|
stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr
|
|
3640
3591
|
};
|
|
3641
3592
|
//#endregion
|
|
3642
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3593
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/core/bool.js
|
|
3643
3594
|
const boolTag = {
|
|
3644
3595
|
identify: (value) => typeof value === "boolean",
|
|
3645
3596
|
default: true,
|
|
@@ -3654,7 +3605,7 @@ const boolTag = {
|
|
|
3654
3605
|
}
|
|
3655
3606
|
};
|
|
3656
3607
|
//#endregion
|
|
3657
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3608
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyNumber.js
|
|
3658
3609
|
function stringifyNumber({ format, minFractionDigits, tag, value }) {
|
|
3659
3610
|
if (typeof value === "bigint") return String(value);
|
|
3660
3611
|
const num = typeof value === "number" ? value : Number(value);
|
|
@@ -3672,7 +3623,7 @@ function stringifyNumber({ format, minFractionDigits, tag, value }) {
|
|
|
3672
3623
|
return n;
|
|
3673
3624
|
}
|
|
3674
3625
|
//#endregion
|
|
3675
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3626
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/core/float.js
|
|
3676
3627
|
const floatNaN$1 = {
|
|
3677
3628
|
identify: (value) => typeof value === "number",
|
|
3678
3629
|
default: true,
|
|
@@ -3707,7 +3658,7 @@ const float$1 = {
|
|
|
3707
3658
|
stringify: stringifyNumber
|
|
3708
3659
|
};
|
|
3709
3660
|
//#endregion
|
|
3710
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3661
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/core/int.js
|
|
3711
3662
|
const intIdentify$2 = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
3712
3663
|
const intResolve$1 = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix);
|
|
3713
3664
|
function intStringify$1(node, radix, prefix) {
|
|
@@ -3742,7 +3693,7 @@ const intHex$1 = {
|
|
|
3742
3693
|
stringify: (node) => intStringify$1(node, 16, "0x")
|
|
3743
3694
|
};
|
|
3744
3695
|
//#endregion
|
|
3745
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3696
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/core/schema.js
|
|
3746
3697
|
const schema$2 = [
|
|
3747
3698
|
map,
|
|
3748
3699
|
seq,
|
|
@@ -3757,7 +3708,7 @@ const schema$2 = [
|
|
|
3757
3708
|
float$1
|
|
3758
3709
|
];
|
|
3759
3710
|
//#endregion
|
|
3760
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3711
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/json/schema.js
|
|
3761
3712
|
function intIdentify$1(value) {
|
|
3762
3713
|
return typeof value === "bigint" || Number.isInteger(value);
|
|
3763
3714
|
}
|
|
@@ -3814,7 +3765,7 @@ const schema$1 = [map, seq].concat(jsonScalars, {
|
|
|
3814
3765
|
}
|
|
3815
3766
|
});
|
|
3816
3767
|
//#endregion
|
|
3817
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3768
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js
|
|
3818
3769
|
const binary = {
|
|
3819
3770
|
identify: (value) => value instanceof Uint8Array,
|
|
3820
3771
|
default: false,
|
|
@@ -3863,7 +3814,7 @@ const binary = {
|
|
|
3863
3814
|
}
|
|
3864
3815
|
};
|
|
3865
3816
|
//#endregion
|
|
3866
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3817
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js
|
|
3867
3818
|
function resolvePairs(seq, onError) {
|
|
3868
3819
|
if (isSeq(seq)) for (let i = 0; i < seq.items.length; ++i) {
|
|
3869
3820
|
let item = seq.items[i];
|
|
@@ -3915,7 +3866,7 @@ const pairs = {
|
|
|
3915
3866
|
createNode: createPairs
|
|
3916
3867
|
};
|
|
3917
3868
|
//#endregion
|
|
3918
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3869
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js
|
|
3919
3870
|
var YAMLOMap = class YAMLOMap extends YAMLSeq {
|
|
3920
3871
|
constructor() {
|
|
3921
3872
|
super();
|
|
@@ -3971,7 +3922,7 @@ const omap = {
|
|
|
3971
3922
|
createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)
|
|
3972
3923
|
};
|
|
3973
3924
|
//#endregion
|
|
3974
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3925
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js
|
|
3975
3926
|
function boolStringify({ value, source }, ctx) {
|
|
3976
3927
|
if (source && (value ? trueTag : falseTag).test.test(source)) return source;
|
|
3977
3928
|
return value ? ctx.options.trueStr : ctx.options.falseStr;
|
|
@@ -3993,7 +3944,7 @@ const falseTag = {
|
|
|
3993
3944
|
stringify: boolStringify
|
|
3994
3945
|
};
|
|
3995
3946
|
//#endregion
|
|
3996
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3947
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js
|
|
3997
3948
|
const floatNaN = {
|
|
3998
3949
|
identify: (value) => typeof value === "number",
|
|
3999
3950
|
default: true,
|
|
@@ -4031,7 +3982,7 @@ const float = {
|
|
|
4031
3982
|
stringify: stringifyNumber
|
|
4032
3983
|
};
|
|
4033
3984
|
//#endregion
|
|
4034
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
3985
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js
|
|
4035
3986
|
const intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
|
|
4036
3987
|
function intResolve(str, offset, radix, { intAsBigInt }) {
|
|
4037
3988
|
const sign = str[0];
|
|
@@ -4097,7 +4048,7 @@ const intHex = {
|
|
|
4097
4048
|
stringify: (node) => intStringify(node, 16, "0x")
|
|
4098
4049
|
};
|
|
4099
4050
|
//#endregion
|
|
4100
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4051
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js
|
|
4101
4052
|
var YAMLSet = class YAMLSet extends YAMLMap {
|
|
4102
4053
|
constructor(schema) {
|
|
4103
4054
|
super(schema);
|
|
@@ -4159,7 +4110,7 @@ const set = {
|
|
|
4159
4110
|
}
|
|
4160
4111
|
};
|
|
4161
4112
|
//#endregion
|
|
4162
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4113
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js
|
|
4163
4114
|
/** Internal types handle bigint as number, because TS can't figure it out. */
|
|
4164
4115
|
function parseSexagesimal(str, asBigInt) {
|
|
4165
4116
|
const sign = str[0];
|
|
@@ -4236,7 +4187,7 @@ const timestamp = {
|
|
|
4236
4187
|
stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\.000Z$/, "") ?? ""
|
|
4237
4188
|
};
|
|
4238
4189
|
//#endregion
|
|
4239
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4190
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js
|
|
4240
4191
|
const schema = [
|
|
4241
4192
|
map,
|
|
4242
4193
|
seq,
|
|
@@ -4261,7 +4212,7 @@ const schema = [
|
|
|
4261
4212
|
timestamp
|
|
4262
4213
|
];
|
|
4263
4214
|
//#endregion
|
|
4264
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4215
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/tags.js
|
|
4265
4216
|
const schemas = /* @__PURE__ */ new Map([
|
|
4266
4217
|
["core", schema$2],
|
|
4267
4218
|
["failsafe", [
|
|
@@ -4327,7 +4278,7 @@ function getTags(customTags, schemaName, addMergeTag) {
|
|
|
4327
4278
|
}, []);
|
|
4328
4279
|
}
|
|
4329
4280
|
//#endregion
|
|
4330
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4281
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/schema/Schema.js
|
|
4331
4282
|
const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
|
|
4332
4283
|
var Schema = class Schema {
|
|
4333
4284
|
constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {
|
|
@@ -4348,7 +4299,7 @@ var Schema = class Schema {
|
|
|
4348
4299
|
}
|
|
4349
4300
|
};
|
|
4350
4301
|
//#endregion
|
|
4351
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4302
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/stringify/stringifyDocument.js
|
|
4352
4303
|
function stringifyDocument(doc, options) {
|
|
4353
4304
|
const lines = [];
|
|
4354
4305
|
let hasDirectives = options.directives === true;
|
|
@@ -4404,7 +4355,7 @@ function stringifyDocument(doc, options) {
|
|
|
4404
4355
|
return lines.join("\n") + "\n";
|
|
4405
4356
|
}
|
|
4406
4357
|
//#endregion
|
|
4407
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4358
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/doc/Document.js
|
|
4408
4359
|
var Document = class Document {
|
|
4409
4360
|
constructor(value, replacer, options) {
|
|
4410
4361
|
/** A comment before this Document */
|
|
@@ -4669,7 +4620,7 @@ function assertCollection(contents) {
|
|
|
4669
4620
|
throw new Error("Expected a YAML collection as document contents");
|
|
4670
4621
|
}
|
|
4671
4622
|
//#endregion
|
|
4672
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4623
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/errors.js
|
|
4673
4624
|
var YAMLError = class extends Error {
|
|
4674
4625
|
constructor(name, pos, code, message) {
|
|
4675
4626
|
super();
|
|
@@ -4716,7 +4667,7 @@ const prettifyError = (src, lc) => (error) => {
|
|
|
4716
4667
|
}
|
|
4717
4668
|
};
|
|
4718
4669
|
//#endregion
|
|
4719
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4670
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-props.js
|
|
4720
4671
|
function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
|
|
4721
4672
|
let spaceBefore = false;
|
|
4722
4673
|
let atNewline = startOnNewline;
|
|
@@ -4820,7 +4771,7 @@ function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIn
|
|
|
4820
4771
|
};
|
|
4821
4772
|
}
|
|
4822
4773
|
//#endregion
|
|
4823
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4774
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/util-contains-newline.js
|
|
4824
4775
|
function containsNewline(key) {
|
|
4825
4776
|
if (!key) return null;
|
|
4826
4777
|
switch (key.type) {
|
|
@@ -4846,7 +4797,7 @@ function containsNewline(key) {
|
|
|
4846
4797
|
}
|
|
4847
4798
|
}
|
|
4848
4799
|
//#endregion
|
|
4849
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4800
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js
|
|
4850
4801
|
function flowIndentCheck(indent, fc, onError) {
|
|
4851
4802
|
if (fc?.type === "flow-collection") {
|
|
4852
4803
|
const end = fc.end[0];
|
|
@@ -4854,7 +4805,7 @@ function flowIndentCheck(indent, fc, onError) {
|
|
|
4854
4805
|
}
|
|
4855
4806
|
}
|
|
4856
4807
|
//#endregion
|
|
4857
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4808
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/util-map-includes.js
|
|
4858
4809
|
function mapIncludes(ctx, items, search) {
|
|
4859
4810
|
const { uniqueKeys } = ctx.options;
|
|
4860
4811
|
if (uniqueKeys === false) return false;
|
|
@@ -4862,7 +4813,7 @@ function mapIncludes(ctx, items, search) {
|
|
|
4862
4813
|
return items.some((pair) => isEqual(pair.key, search));
|
|
4863
4814
|
}
|
|
4864
4815
|
//#endregion
|
|
4865
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4816
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-block-map.js
|
|
4866
4817
|
const startColMsg = "All mapping items must start at the same column";
|
|
4867
4818
|
function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) {
|
|
4868
4819
|
const map = new ((tag?.nodeClass) ?? YAMLMap)(ctx.schema);
|
|
@@ -4941,7 +4892,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, ta
|
|
|
4941
4892
|
return map;
|
|
4942
4893
|
}
|
|
4943
4894
|
//#endregion
|
|
4944
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4895
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-block-seq.js
|
|
4945
4896
|
function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {
|
|
4946
4897
|
const seq = new ((tag?.nodeClass) ?? YAMLSeq)(ctx.schema);
|
|
4947
4898
|
if (ctx.atRoot) ctx.atRoot = false;
|
|
@@ -4980,7 +4931,7 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, ta
|
|
|
4980
4931
|
return seq;
|
|
4981
4932
|
}
|
|
4982
4933
|
//#endregion
|
|
4983
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4934
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-end.js
|
|
4984
4935
|
function resolveEnd(end, offset, reqSpace, onError) {
|
|
4985
4936
|
let comment = "";
|
|
4986
4937
|
if (end) {
|
|
@@ -5015,7 +4966,7 @@ function resolveEnd(end, offset, reqSpace, onError) {
|
|
|
5015
4966
|
};
|
|
5016
4967
|
}
|
|
5017
4968
|
//#endregion
|
|
5018
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
4969
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js
|
|
5019
4970
|
const blockMsg = "Block collections are not allowed within flow collections";
|
|
5020
4971
|
const isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq");
|
|
5021
4972
|
function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {
|
|
@@ -5167,7 +5118,7 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
5167
5118
|
return coll;
|
|
5168
5119
|
}
|
|
5169
5120
|
//#endregion
|
|
5170
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5121
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/compose-collection.js
|
|
5171
5122
|
function resolveCollection(CN, ctx, token, onError, tagName, tag) {
|
|
5172
5123
|
const coll = token.type === "block-map" ? resolveBlockMap(CN, ctx, token, onError, tag) : token.type === "block-seq" ? resolveBlockSeq(CN, ctx, token, onError, tag) : resolveFlowCollection(CN, ctx, token, onError, tag);
|
|
5173
5124
|
const Coll = coll.constructor;
|
|
@@ -5209,7 +5160,7 @@ function composeCollection(CN, ctx, token, props, onError) {
|
|
|
5209
5160
|
return node;
|
|
5210
5161
|
}
|
|
5211
5162
|
//#endregion
|
|
5212
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5163
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js
|
|
5213
5164
|
function resolveBlockScalar(ctx, scalar, onError) {
|
|
5214
5165
|
const start = scalar.offset;
|
|
5215
5166
|
const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);
|
|
@@ -5382,7 +5333,7 @@ function splitLines(source) {
|
|
|
5382
5333
|
return lines;
|
|
5383
5334
|
}
|
|
5384
5335
|
//#endregion
|
|
5385
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5336
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js
|
|
5386
5337
|
function resolveFlowScalar(scalar, strict, onError) {
|
|
5387
5338
|
const { offset, type, source, end } = scalar;
|
|
5388
5339
|
let _type;
|
|
@@ -5449,40 +5400,41 @@ function plainValue(source, onError) {
|
|
|
5449
5400
|
case "`": badChar = `reserved character ${source[0]}`;
|
|
5450
5401
|
}
|
|
5451
5402
|
if (badChar) onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`);
|
|
5452
|
-
return
|
|
5403
|
+
return unfoldLines(source);
|
|
5453
5404
|
}
|
|
5454
5405
|
function singleQuotedValue(source, onError) {
|
|
5455
5406
|
if (source[source.length - 1] !== "'" || source.length === 1) onError(source.length, "MISSING_CHAR", "Missing closing 'quote");
|
|
5456
|
-
return
|
|
5407
|
+
return unfoldLines(source.slice(1, -1)).replace(/''/g, "'");
|
|
5457
5408
|
}
|
|
5458
|
-
function
|
|
5409
|
+
function unfoldLines(source) {
|
|
5410
|
+
const line = /(.*?)\r?\n/sy;
|
|
5411
|
+
let match = line.exec(source);
|
|
5412
|
+
if (!match) return source;
|
|
5459
5413
|
/**
|
|
5460
|
-
* The negative
|
|
5414
|
+
* The negative lookbehinds in these RegExps are to
|
|
5461
5415
|
* prevent causing a polynomial search time in certain cases.
|
|
5462
5416
|
*
|
|
5463
|
-
* The try-catch is for Safari
|
|
5417
|
+
* The try-catch is for Safari < 16.4 and other old browsers:
|
|
5464
5418
|
* https://caniuse.com/js-regexp-lookbehind
|
|
5465
5419
|
*/
|
|
5466
|
-
let
|
|
5420
|
+
let trimEnd, trimBoth;
|
|
5467
5421
|
try {
|
|
5468
|
-
|
|
5469
|
-
|
|
5422
|
+
trimEnd = /* @__PURE__ */ new RegExp("(?<![ ])[ ]+$");
|
|
5423
|
+
trimBoth = /* @__PURE__ */ new RegExp("^[ ]+|(?<![ ])[ ]+$", "g");
|
|
5470
5424
|
} catch {
|
|
5471
|
-
|
|
5472
|
-
|
|
5425
|
+
trimEnd = /[ \t]+$/;
|
|
5426
|
+
trimBoth = /^[ \t]+|[ \t]+$/g;
|
|
5473
5427
|
}
|
|
5474
|
-
let
|
|
5475
|
-
if (!match) return source;
|
|
5476
|
-
let res = match[1];
|
|
5428
|
+
let res = match[1].replace(trimEnd, "");
|
|
5477
5429
|
let sep = " ";
|
|
5478
|
-
let pos =
|
|
5479
|
-
line.lastIndex = pos;
|
|
5430
|
+
let pos = line.lastIndex;
|
|
5480
5431
|
while (match = line.exec(source)) {
|
|
5481
|
-
|
|
5432
|
+
const lm = match[1].replace(trimBoth, "");
|
|
5433
|
+
if (lm === "") {
|
|
5482
5434
|
if (sep === "\n") res += sep;
|
|
5483
5435
|
else sep = "\n";
|
|
5484
5436
|
} else {
|
|
5485
|
-
res += sep +
|
|
5437
|
+
res += sep + lm;
|
|
5486
5438
|
sep = " ";
|
|
5487
5439
|
}
|
|
5488
5440
|
pos = line.lastIndex;
|
|
@@ -5581,7 +5533,7 @@ function parseCharCode(source, offset, length, onError) {
|
|
|
5581
5533
|
}
|
|
5582
5534
|
}
|
|
5583
5535
|
//#endregion
|
|
5584
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5536
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/compose-scalar.js
|
|
5585
5537
|
function composeScalar(ctx, token, tagToken, onError) {
|
|
5586
5538
|
const { value, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar(ctx, token, onError) : resolveFlowScalar(token, ctx.options.strict, onError);
|
|
5587
5539
|
const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null;
|
|
@@ -5635,7 +5587,7 @@ function findScalarTagByTest({ atKey, directives, schema }, value, token, onErro
|
|
|
5635
5587
|
return tag;
|
|
5636
5588
|
}
|
|
5637
5589
|
//#endregion
|
|
5638
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5590
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js
|
|
5639
5591
|
function emptyScalarPosition(offset, before, pos) {
|
|
5640
5592
|
if (before) {
|
|
5641
5593
|
pos ?? (pos = before.length);
|
|
@@ -5659,7 +5611,7 @@ function emptyScalarPosition(offset, before, pos) {
|
|
|
5659
5611
|
return offset;
|
|
5660
5612
|
}
|
|
5661
5613
|
//#endregion
|
|
5662
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5614
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/compose-node.js
|
|
5663
5615
|
const CN = {
|
|
5664
5616
|
composeNode,
|
|
5665
5617
|
composeEmptyNode
|
|
@@ -5739,7 +5691,7 @@ function composeAlias({ options }, { offset, source, end }, onError) {
|
|
|
5739
5691
|
return alias;
|
|
5740
5692
|
}
|
|
5741
5693
|
//#endregion
|
|
5742
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5694
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/compose-doc.js
|
|
5743
5695
|
function composeDoc(options, directives, { offset, start, value, end }, onError) {
|
|
5744
5696
|
const doc = new Document(void 0, Object.assign({ _directives: directives }, options));
|
|
5745
5697
|
const ctx = {
|
|
@@ -5773,7 +5725,7 @@ function composeDoc(options, directives, { offset, start, value, end }, onError)
|
|
|
5773
5725
|
return doc;
|
|
5774
5726
|
}
|
|
5775
5727
|
//#endregion
|
|
5776
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5728
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/compose/composer.js
|
|
5777
5729
|
function getErrorPos(src) {
|
|
5778
5730
|
if (typeof src === "number") return [src, src + 1];
|
|
5779
5731
|
if (Array.isArray(src)) return src.length === 2 ? src : [src[0], src[1]];
|
|
@@ -5959,7 +5911,7 @@ var Composer = class {
|
|
|
5959
5911
|
}
|
|
5960
5912
|
};
|
|
5961
5913
|
//#endregion
|
|
5962
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
5914
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/parse/cst-visit.js
|
|
5963
5915
|
const BREAK = Symbol("break visit");
|
|
5964
5916
|
const SKIP = Symbol("skip children");
|
|
5965
5917
|
const REMOVE = Symbol("remove item");
|
|
@@ -6083,7 +6035,7 @@ function tokenType(source) {
|
|
|
6083
6035
|
return null;
|
|
6084
6036
|
}
|
|
6085
6037
|
//#endregion
|
|
6086
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
6038
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/parse/lexer.js
|
|
6087
6039
|
function isEmpty(ch) {
|
|
6088
6040
|
switch (ch) {
|
|
6089
6041
|
case void 0:
|
|
@@ -6612,7 +6564,7 @@ var Lexer = class {
|
|
|
6612
6564
|
}
|
|
6613
6565
|
};
|
|
6614
6566
|
//#endregion
|
|
6615
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
6567
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/parse/line-counter.js
|
|
6616
6568
|
/**
|
|
6617
6569
|
* Tracks newlines during parsing in order to provide an efficient API for
|
|
6618
6570
|
* determining the one-indexed `{ line, col }` position for any offset
|
|
@@ -6656,7 +6608,7 @@ var LineCounter = class {
|
|
|
6656
6608
|
}
|
|
6657
6609
|
};
|
|
6658
6610
|
//#endregion
|
|
6659
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
6611
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/parse/parser.js
|
|
6660
6612
|
function includesToken(list, type) {
|
|
6661
6613
|
for (let i = 0; i < list.length; ++i) if (list[i].type === type) return true;
|
|
6662
6614
|
return false;
|
|
@@ -7515,7 +7467,7 @@ var Parser = class {
|
|
|
7515
7467
|
}
|
|
7516
7468
|
};
|
|
7517
7469
|
//#endregion
|
|
7518
|
-
//#region node_modules/.pnpm/yaml@2.9.
|
|
7470
|
+
//#region node_modules/.pnpm/yaml@2.9.1/node_modules/yaml/browser/dist/public-api.js
|
|
7519
7471
|
function parseOptions(options) {
|
|
7520
7472
|
const prettyErrors = options.prettyErrors !== false;
|
|
7521
7473
|
return {
|
|
@@ -7547,7 +7499,8 @@ function frontmatter(text) {
|
|
|
7547
7499
|
const match = /^(?:\uFEFF)?---\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/.exec(text);
|
|
7548
7500
|
if (/^(?:\uFEFF)?---\r?\n/.test(text) && match === null) throw new Error("Unclosed YAML frontmatter");
|
|
7549
7501
|
const document = parseDocument(match?.[1] ?? "");
|
|
7550
|
-
|
|
7502
|
+
const error = document.errors[0];
|
|
7503
|
+
if (error !== void 0) throw new Error(error.message);
|
|
7551
7504
|
if (document.contents !== null && !isMap(document.contents)) throw new Error("Frontmatter must be a YAML mapping");
|
|
7552
7505
|
return {
|
|
7553
7506
|
document,
|
|
@@ -7565,8 +7518,7 @@ function readRoleFields(text) {
|
|
|
7565
7518
|
return {
|
|
7566
7519
|
reasoningEffort: effort ?? alias ?? "",
|
|
7567
7520
|
model: typeof fields.model === "string" ? fields.model : "",
|
|
7568
|
-
provider: typeof fields.provider === "string" ? fields.provider : ""
|
|
7569
|
-
tools: Array.isArray(fields.tools) ? fields.tools.join(", ") : typeof fields.tools === "string" ? fields.tools : ""
|
|
7521
|
+
provider: typeof fields.provider === "string" ? fields.provider : ""
|
|
7570
7522
|
};
|
|
7571
7523
|
}
|
|
7572
7524
|
/** Store the canonical effort key and remove its alias so execution cannot see conflicting values. */
|
|
@@ -7589,9 +7541,13 @@ function updateFrontmatter(text, key, value) {
|
|
|
7589
7541
|
}
|
|
7590
7542
|
//#endregion
|
|
7591
7543
|
//#region src/client/ui/MarkdownDocument.tsx
|
|
7544
|
+
/** Metadata leaves render as text; callers pass only values that are not objects. */
|
|
7545
|
+
function leafText(value) {
|
|
7546
|
+
return String(value);
|
|
7547
|
+
}
|
|
7592
7548
|
function metadataValue(value, depth = 0, parents = /* @__PURE__ */ new Set()) {
|
|
7593
7549
|
if (value === null || value === void 0) return (0, react.createElement)("span", null, "null");
|
|
7594
|
-
if (typeof value !== "object") return (0, react.createElement)("span", null,
|
|
7550
|
+
if (typeof value !== "object") return (0, react.createElement)("span", null, leafText(value));
|
|
7595
7551
|
if (parents.has(value)) return (0, react.createElement)("span", null, "[Circular]");
|
|
7596
7552
|
const next = new Set(parents).add(value);
|
|
7597
7553
|
if (depth >= 12) return (0, react.createElement)("span", null, "[...]");
|
|
@@ -7639,6 +7595,21 @@ function createLatestRequestGuard() {
|
|
|
7639
7595
|
};
|
|
7640
7596
|
}
|
|
7641
7597
|
//#endregion
|
|
7598
|
+
//#region src/client/ui/error-message.ts
|
|
7599
|
+
/**
|
|
7600
|
+
* One user-facing failure line for every panel.
|
|
7601
|
+
*
|
|
7602
|
+
* A request that stopped waiting reads as a timeout, because the host may
|
|
7603
|
+
* still be working on it; everything else keeps the message the host or the
|
|
7604
|
+
* browser produced.
|
|
7605
|
+
*
|
|
7606
|
+
* @module client/ui/error-message
|
|
7607
|
+
*/
|
|
7608
|
+
function clientErrorMessage(t, error) {
|
|
7609
|
+
if (error instanceof RequestTimeoutError) return t("requestTimeout");
|
|
7610
|
+
return error instanceof Error ? error.message : String(error);
|
|
7611
|
+
}
|
|
7612
|
+
//#endregion
|
|
7642
7613
|
//#region src/client/SuiteDetail.tsx
|
|
7643
7614
|
/**
|
|
7644
7615
|
* Suite detail modal: click one suite card to browse its internals.
|
|
@@ -7680,7 +7651,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7680
7651
|
fetchSuiteDetail(sourceId, suiteId).then((value) => {
|
|
7681
7652
|
if (!cancelled) setDetail(value);
|
|
7682
7653
|
}).catch((reason) => {
|
|
7683
|
-
if (!cancelled) setError(
|
|
7654
|
+
if (!cancelled) setError(clientErrorMessage(t, reason));
|
|
7684
7655
|
});
|
|
7685
7656
|
return () => {
|
|
7686
7657
|
cancelled = true;
|
|
@@ -7700,7 +7671,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7700
7671
|
const content = await fetchSkillContent(sourceId, suiteId, name);
|
|
7701
7672
|
if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(content.content);
|
|
7702
7673
|
} catch (reason) {
|
|
7703
|
-
if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(`⚠ ${
|
|
7674
|
+
if (skillRequestGuard.current.isCurrent(requestId)) setSkillText(`⚠ ${clientErrorMessage(t, reason)}`);
|
|
7704
7675
|
} finally {
|
|
7705
7676
|
if (skillRequestGuard.current.isCurrent(requestId)) setSkillLoading(false);
|
|
7706
7677
|
}
|
|
@@ -7721,12 +7692,13 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7721
7692
|
const next = await fetchSuiteDetail(sourceId, suiteId);
|
|
7722
7693
|
setDetail(next);
|
|
7723
7694
|
} catch (reason) {
|
|
7724
|
-
setError(
|
|
7695
|
+
setError(clientErrorMessage(t, reason));
|
|
7725
7696
|
} finally {
|
|
7726
7697
|
setSurfaceBusy(false);
|
|
7727
7698
|
}
|
|
7728
7699
|
};
|
|
7729
7700
|
const layoutLabel = detail === void 0 ? "" : suiteLayoutLabel(detail.layout, t);
|
|
7701
|
+
const surfaceToggles = detail === void 0 ? null : detail.surfaceToggles;
|
|
7730
7702
|
return (0, react.createElement)(DetailModal, {
|
|
7731
7703
|
open: true,
|
|
7732
7704
|
onClose,
|
|
@@ -7741,7 +7713,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7741
7713
|
}, t("cancel"))),
|
|
7742
7714
|
children: (0, react.createElement)(ErrorBoundary, {
|
|
7743
7715
|
fallback: (boundaryError) => (0, react.createElement)("div", { className: market_module_default.warnLine }, `${t("actionFail")}: ${boundaryError.message}`),
|
|
7744
|
-
children: error !== void 0 ? (0, react.createElement)("div", { className: market_module_default.warnLine }, error) : detail === void 0 ? (0, react.createElement)("div", { className: market_module_default.empty }, t("loading")) : (0, react.createElement)("div", { className: market_module_default.detailSections }, (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, t("overviewSection")), (0, react.createElement)("div", { className: market_module_default.detailGrid }, (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("sourceLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.sourceId)), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("dimensionLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.dimension === "user" ? t("dimensionUser") : t("dimensionProject"))), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("layoutLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, layoutLabel)), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("statusLabel")), (0, react.createElement)("span", { className: detail.enabled ? market_module_default.okState : market_module_default.detailValue }, detail.installed ? detail.enabled ? t("installedBadge") : t("disabledLabel") : t("notInstalledLabel"))), detail.author === null ? null : (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("authorLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.author)), detail.keywords.length === 0 ? null : (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("keywordsLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.keywords.join(", ")))), detail.description === null ? null : (0, react.createElement)("p", { className: market_module_default.detailDesc }, detail.description), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("rootLabel")), (0, react.createElement)("span", { className: market_module_default.mono }, detail.root)), detail.installed === false ||
|
|
7716
|
+
children: error !== void 0 ? (0, react.createElement)("div", { className: market_module_default.warnLine }, error) : detail === void 0 ? (0, react.createElement)("div", { className: market_module_default.empty }, t("loading")) : (0, react.createElement)("div", { className: market_module_default.detailSections }, (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, t("overviewSection")), (0, react.createElement)("div", { className: market_module_default.detailGrid }, (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("sourceLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.sourceId)), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("dimensionLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.dimension === "user" ? t("dimensionUser") : t("dimensionProject"))), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("layoutLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, layoutLabel)), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("statusLabel")), (0, react.createElement)("span", { className: detail.enabled ? market_module_default.okState : market_module_default.detailValue }, detail.installed ? detail.enabled ? t("installedBadge") : t("disabledLabel") : t("notInstalledLabel"))), detail.author === null ? null : (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("authorLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.author)), detail.keywords.length === 0 ? null : (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("keywordsLabel")), (0, react.createElement)("span", { className: market_module_default.detailValue }, detail.keywords.join(", ")))), detail.description === null ? null : (0, react.createElement)("p", { className: market_module_default.detailDesc }, detail.description), (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("rootLabel")), (0, react.createElement)("span", { className: market_module_default.mono }, detail.root)), detail.installed === false || surfaceToggles === null ? null : (0, react.createElement)("div", { className: market_module_default.detailCell }, (0, react.createElement)("span", { className: market_module_default.detailKey }, t("surfaceTogglesSection")), (0, react.createElement)("div", {
|
|
7745
7717
|
className: market_module_default.surfaceToggles,
|
|
7746
7718
|
title: t("surfaceTogglesHint")
|
|
7747
7719
|
}, ...SURFACE_TOGGLE_ROWS.map(([key, labelKey]) => (0, react.createElement)("label", {
|
|
@@ -7749,12 +7721,12 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7749
7721
|
className: market_module_default.surfaceToggle
|
|
7750
7722
|
}, (0, react.createElement)("input", {
|
|
7751
7723
|
type: "checkbox",
|
|
7752
|
-
checked:
|
|
7724
|
+
checked: surfaceToggles[key],
|
|
7753
7725
|
disabled: surfaceBusy,
|
|
7754
7726
|
onChange: (event) => {
|
|
7755
7727
|
toggleSurface(key, event.target.checked);
|
|
7756
7728
|
}
|
|
7757
|
-
}), t(labelKey)))))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("skillsSection")} (${detail.skills.length})`), detail.skills.length === 0 ? (0, react.createElement)("div",
|
|
7729
|
+
}), t(labelKey)))))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("skillsSection")} (${detail.skills.length})`), detail.skills.length === 0 ? (0, react.createElement)("div", null, "—") : detail.skills.map((skill) => (0, react.createElement)("div", {
|
|
7758
7730
|
key: skill.name,
|
|
7759
7731
|
className: market_module_default.detailItem
|
|
7760
7732
|
}, (0, react.createElement)("button", {
|
|
@@ -7769,7 +7741,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7769
7741
|
}))))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("mcpSection")} (${detail.mcpServers.length})`), detail.mcpErrors.length === 0 ? null : (0, react.createElement)("div", {
|
|
7770
7742
|
className: market_module_default.warnLine,
|
|
7771
7743
|
style: { margin: "0 0 6px" }
|
|
7772
|
-
}, `⚠ ${detail.mcpErrors.join(t("sourceErrorSeparator"))}`), detail.mcpServers.length === 0 ? (0, react.createElement)("div",
|
|
7744
|
+
}, `⚠ ${detail.mcpErrors.join(t("sourceErrorSeparator"))}`), detail.mcpServers.length === 0 ? (0, react.createElement)("div", null, "—") : detail.mcpServers.map((server) => {
|
|
7773
7745
|
const disabled = detail.mcpOverrides?.[server.key]?.enabled === false;
|
|
7774
7746
|
return (0, react.createElement)("div", {
|
|
7775
7747
|
key: server.key,
|
|
@@ -7779,7 +7751,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7779
7751
|
className: openMcp === server.key ? market_module_default.detailItemOpen : market_module_default.detailItemRow,
|
|
7780
7752
|
onClick: () => toggleMcp(server.key)
|
|
7781
7753
|
}, (0, react.createElement)("span", { className: market_module_default.detailItemName }, server.key), (0, react.createElement)("span", { className: market_module_default.detailItemDesc }, `${mcpSummary(server)}${disabled ? ` · ${t("mcpOverrideDisabledBadge")}` : ""}`), (0, react.createElement)("span", { className: market_module_default.detailChevron }, openMcp === server.key ? "▾" : "▸")), openMcp === server.key ? (0, react.createElement)("div", { className: market_module_default.skillContent }, (0, react.createElement)("pre", { className: market_module_default.mono }, JSON.stringify(server, null, 2))) : null);
|
|
7782
|
-
})), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("commandsSection")} (${detail.commands.length})`), detail.commands.length === 0 ? (0, react.createElement)("div",
|
|
7754
|
+
})), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("commandsSection")} (${detail.commands.length})`), detail.commands.length === 0 ? (0, react.createElement)("div", null, "—") : detail.commands.map((command) => (0, react.createElement)(PreviewRow, {
|
|
7783
7755
|
key: `c:${command.name}`,
|
|
7784
7756
|
t,
|
|
7785
7757
|
name: `/${command.name}`,
|
|
@@ -7790,7 +7762,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7790
7762
|
text: command.content,
|
|
7791
7763
|
t
|
|
7792
7764
|
})
|
|
7793
|
-
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("agentsSection")} (${detail.agents.length})`), detail.agents.length === 0 ? (0, react.createElement)("div",
|
|
7765
|
+
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("agentsSection")} (${detail.agents.length})`), detail.agents.length === 0 ? (0, react.createElement)("div", null, "—") : detail.agents.map((agent) => (0, react.createElement)(PreviewRow, {
|
|
7794
7766
|
key: `a:${agent.name}`,
|
|
7795
7767
|
t,
|
|
7796
7768
|
name: agent.name,
|
|
@@ -7801,7 +7773,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7801
7773
|
text: agent.content,
|
|
7802
7774
|
t
|
|
7803
7775
|
})
|
|
7804
|
-
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("hooksLabel")} (${detail.hooks.count})`), detail.hooks.count === 0 ? (0, react.createElement)("div",
|
|
7776
|
+
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("hooksLabel")} (${detail.hooks.count})`), detail.hooks.count === 0 ? (0, react.createElement)("div", null, "—") : detail.hooks.entries.map((hook, index) => (0, react.createElement)(PreviewRow, {
|
|
7805
7777
|
key: `h:${index}`,
|
|
7806
7778
|
t,
|
|
7807
7779
|
name: hook.event,
|
|
@@ -7809,7 +7781,7 @@ function SuiteDetailModal({ t, sourceId, suiteId, onClose }) {
|
|
|
7809
7781
|
open: openPreview === `h:${index}`,
|
|
7810
7782
|
onToggle: () => setOpenPreview(openPreview === `h:${index}` ? void 0 : `h:${index}`),
|
|
7811
7783
|
children: (0, react.createElement)("pre", { className: market_module_default.mono }, JSON.stringify(hook, null, 2))
|
|
7812
|
-
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("lspSection")} (${detail.lsp.servers.length + detail.lsp.raw.length})`), detail.lsp.servers.length === 0 && detail.lsp.raw.length === 0 ? (0, react.createElement)("div",
|
|
7784
|
+
}))), (0, react.createElement)("section", { className: market_module_default.detailSection }, (0, react.createElement)("h4", { className: market_module_default.detailHead }, `${t("lspSection")} (${detail.lsp.servers.length + detail.lsp.raw.length})`), detail.lsp.servers.length === 0 && detail.lsp.raw.length === 0 ? (0, react.createElement)("div", null, "—") : [...detail.lsp.servers.map((server) => (0, react.createElement)(PreviewRow, {
|
|
7813
7785
|
key: `l:${server.key}`,
|
|
7814
7786
|
t,
|
|
7815
7787
|
name: server.key,
|
|
@@ -7850,7 +7822,6 @@ function PreviewRow(props) {
|
|
|
7850
7822
|
//#endregion
|
|
7851
7823
|
//#region src/client/SearchFilterToolbar.module.css
|
|
7852
7824
|
var SearchFilterToolbar_module_default = {
|
|
7853
|
-
"extraAction": "vavGuW_extraAction",
|
|
7854
7825
|
"filter": "vavGuW_filter",
|
|
7855
7826
|
"filterCount": "vavGuW_filterCount",
|
|
7856
7827
|
"filterGap": "vavGuW_filterGap",
|
|
@@ -7951,9 +7922,9 @@ var panel_module_default = {
|
|
|
7951
7922
|
"editorHint": "HJ9x7a_editorHint",
|
|
7952
7923
|
"editorInput": "HJ9x7a_editorInput",
|
|
7953
7924
|
"editorLabel": "HJ9x7a_editorLabel",
|
|
7954
|
-
"editorName": "HJ9x7a_editorName",
|
|
7955
7925
|
"editorNameRow": "HJ9x7a_editorNameRow",
|
|
7956
7926
|
"editorPath": "HJ9x7a_editorPath",
|
|
7927
|
+
"editorWarning": "HJ9x7a_editorWarning",
|
|
7957
7928
|
"empty": "HJ9x7a_empty",
|
|
7958
7929
|
"entryActions": "HJ9x7a_entryActions",
|
|
7959
7930
|
"entryDesc": "HJ9x7a_entryDesc",
|
|
@@ -7964,7 +7935,6 @@ var panel_module_default = {
|
|
|
7964
7935
|
"entryName": "HJ9x7a_entryName",
|
|
7965
7936
|
"entryPath": "HJ9x7a_entryPath",
|
|
7966
7937
|
"entryRow": "HJ9x7a_entryRow",
|
|
7967
|
-
"entryRowDisabled": "HJ9x7a_entryRowDisabled",
|
|
7968
7938
|
"header": "HJ9x7a_header",
|
|
7969
7939
|
"headerActions": "HJ9x7a_headerActions",
|
|
7970
7940
|
"headerText": "HJ9x7a_headerText",
|
|
@@ -7984,11 +7954,10 @@ var panel_module_default = {
|
|
|
7984
7954
|
* Shared panel building blocks for the plugin workspace surfaces
|
|
7985
7955
|
* (market / skills / commands / personas / MCP / LSP).
|
|
7986
7956
|
*
|
|
7987
|
-
* Everything the six panels repeat lives here: the
|
|
7988
|
-
*
|
|
7989
|
-
*
|
|
7990
|
-
*
|
|
7991
|
-
* instead of re-implementing the geometry.
|
|
7957
|
+
* Everything the six panels repeat lives here: the header, the trailing header
|
|
7958
|
+
* commands, the busy indicator, the entry editor modal, the danger-confirm
|
|
7959
|
+
* modal, and the source badge. The pieces are intentionally small and
|
|
7960
|
+
* prop-driven so a panel composes them instead of re-implementing the geometry.
|
|
7992
7961
|
* @module client/ui/panel
|
|
7993
7962
|
*/
|
|
7994
7963
|
/** The trailing header commands have one position and one visual treatment. */
|
|
@@ -8083,7 +8052,7 @@ function EntryEditorModal(props) {
|
|
|
8083
8052
|
name: current.name.trim()
|
|
8084
8053
|
}).then((ok) => {
|
|
8085
8054
|
if (ok) setError(void 0);
|
|
8086
|
-
}).catch((reason) => setError(
|
|
8055
|
+
}).catch((reason) => setError(clientErrorMessage(props.t, reason)));
|
|
8087
8056
|
}
|
|
8088
8057
|
}, props.saveLabel ?? "✓"))
|
|
8089
8058
|
}, (0, react.createElement)("div", { className: panel_module_default.editorForm }, props.state.mode === "create" ? (0, react.createElement)("label", { className: panel_module_default.editorLabel }, props.nameLabel, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Input, {
|
|
@@ -8127,11 +8096,12 @@ function ConfirmModal(props) {
|
|
|
8127
8096
|
setChecked(props.state?.checkbox?.checked === true);
|
|
8128
8097
|
}, [props.state]);
|
|
8129
8098
|
if (props.state === void 0) return null;
|
|
8099
|
+
const state = props.state;
|
|
8130
8100
|
return (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
|
|
8131
8101
|
open: true,
|
|
8132
8102
|
onClose: props.onClose,
|
|
8133
|
-
title:
|
|
8134
|
-
description:
|
|
8103
|
+
title: state.title,
|
|
8104
|
+
description: state.description,
|
|
8135
8105
|
closeLabel: props.cancelLabel,
|
|
8136
8106
|
footer: (0, react.createElement)("div", { className: panel_module_default.editorFooter }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
8137
8107
|
variant: "ghost",
|
|
@@ -8140,7 +8110,7 @@ function ConfirmModal(props) {
|
|
|
8140
8110
|
variant: "primary",
|
|
8141
8111
|
disabled: props.busy === true,
|
|
8142
8112
|
onClick: () => {
|
|
8143
|
-
Promise.resolve(
|
|
8113
|
+
Promise.resolve(state.onConfirm(checked)).then(() => props.onClose());
|
|
8144
8114
|
}
|
|
8145
8115
|
}, props.confirmLabel))
|
|
8146
8116
|
}, props.state.checkbox === void 0 ? null : (0, react.createElement)("label", { className: panel_module_default.confirmCheck }, (0, react.createElement)("input", {
|
|
@@ -8210,7 +8180,7 @@ function progressStepLabel(t, step) {
|
|
|
8210
8180
|
const key = PROGRESS_STEP_LABELS[step];
|
|
8211
8181
|
return key === void 0 ? step : t(key);
|
|
8212
8182
|
}
|
|
8213
|
-
function MarketSection({ t,
|
|
8183
|
+
function MarketSection({ t, mode = "settings" }) {
|
|
8214
8184
|
const [overview, setOverview] = (0, react.useState)(() => loadOverview().initial);
|
|
8215
8185
|
const [loading, setLoading] = (0, react.useState)(() => loadOverview().revalidating);
|
|
8216
8186
|
const [search, setSearch] = (0, react.useState)("");
|
|
@@ -8254,7 +8224,7 @@ function MarketSection({ t, credentials, mode = "settings" }) {
|
|
|
8254
8224
|
} catch (error) {
|
|
8255
8225
|
setToast({
|
|
8256
8226
|
key: Date.now(),
|
|
8257
|
-
message: `${t("actionFail")}: ${
|
|
8227
|
+
message: `${t("actionFail")}: ${clientErrorMessage(t, error)}`
|
|
8258
8228
|
});
|
|
8259
8229
|
return false;
|
|
8260
8230
|
} finally {
|
|
@@ -8481,7 +8451,6 @@ function MarketSection({ t, credentials, mode = "settings" }) {
|
|
|
8481
8451
|
}, t("confirmDelete")))
|
|
8482
8452
|
}), detail === void 0 ? null : (0, react.createElement)(SuiteDetailModal, {
|
|
8483
8453
|
t,
|
|
8484
|
-
credentials,
|
|
8485
8454
|
sourceId: detail.sourceId,
|
|
8486
8455
|
suiteId: detail.suiteId,
|
|
8487
8456
|
onClose: () => setDetail(void 0)
|
|
@@ -8517,11 +8486,11 @@ function MarketSection({ t, credentials, mode = "settings" }) {
|
|
|
8517
8486
|
} catch (error) {
|
|
8518
8487
|
setToast({
|
|
8519
8488
|
key: Date.now(),
|
|
8520
|
-
message: `${t("actionFail")}: ${
|
|
8489
|
+
message: `${t("actionFail")}: ${clientErrorMessage(t, error)}`
|
|
8521
8490
|
});
|
|
8522
8491
|
setProgress({
|
|
8523
8492
|
step: void 0,
|
|
8524
|
-
error:
|
|
8493
|
+
error: clientErrorMessage(t, error)
|
|
8525
8494
|
});
|
|
8526
8495
|
return false;
|
|
8527
8496
|
} finally {
|
|
@@ -8536,7 +8505,7 @@ function MarketSection({ t, credentials, mode = "settings" }) {
|
|
|
8536
8505
|
if (ok) setEditor(void 0);
|
|
8537
8506
|
return ok;
|
|
8538
8507
|
},
|
|
8539
|
-
onRemove:
|
|
8508
|
+
onRemove: (id) => {
|
|
8540
8509
|
setConfirm({
|
|
8541
8510
|
kind: "removeSource",
|
|
8542
8511
|
sourceId: id,
|
|
@@ -8581,11 +8550,11 @@ function serverFormCompatible(config, kind) {
|
|
|
8581
8550
|
].every((key) => config[key] === void 0 || typeof config[key] === "string")) return false;
|
|
8582
8551
|
if (config.args !== void 0 && (!Array.isArray(config.args) || config.args.some((value) => typeof value !== "string"))) return false;
|
|
8583
8552
|
if (!isMap(config.env) || !isMap(config.headers) || !isMap(config.extensionToLanguage)) return false;
|
|
8584
|
-
if (kind === "mcp" && config.type !== void 0 && ![
|
|
8553
|
+
if (kind === "mcp" && config.type !== void 0 && (typeof config.type !== "string" || ![
|
|
8585
8554
|
"stdio",
|
|
8586
8555
|
"streamable-http",
|
|
8587
8556
|
"sse"
|
|
8588
|
-
].includes(
|
|
8557
|
+
].includes(config.type))) return false;
|
|
8589
8558
|
if (config.auth !== void 0 && (config.auth === null || typeof config.auth !== "object" || Array.isArray(config.auth))) return false;
|
|
8590
8559
|
const auth = config.auth;
|
|
8591
8560
|
if (auth?.enabled !== void 0 && typeof auth.enabled !== "boolean") return false;
|
|
@@ -8598,13 +8567,14 @@ function serverFormCompatible(config, kind) {
|
|
|
8598
8567
|
function ServerConfigEditor(props) {
|
|
8599
8568
|
const [mode, setMode] = (0, react.useState)("form");
|
|
8600
8569
|
const [issues, setIssues] = (0, react.useState)({});
|
|
8601
|
-
let
|
|
8570
|
+
let parsed;
|
|
8602
8571
|
let parseError;
|
|
8603
8572
|
try {
|
|
8604
|
-
|
|
8573
|
+
parsed = parseServerConfig(props.text);
|
|
8605
8574
|
} catch (error) {
|
|
8606
8575
|
parseError = error instanceof Error ? error.message : String(error);
|
|
8607
8576
|
}
|
|
8577
|
+
const config = parsed;
|
|
8608
8578
|
const compatible = config !== void 0 && serverFormCompatible(config, props.kind);
|
|
8609
8579
|
const hasIssue = Object.values(issues).some(Boolean);
|
|
8610
8580
|
const requiredValid = config !== void 0 && (props.kind === "lsp" ? typeof config.command === "string" && config.command.trim() !== "" && config.extensionToLanguage !== null && typeof config.extensionToLanguage === "object" && Object.keys(config.extensionToLanguage).length > 0 : config.type === "stdio" ? typeof config.command === "string" && config.command.trim() !== "" : ["sse", "streamable-http"].includes(String(config.type)) && typeof config.url === "string" && config.url.trim() !== "");
|
|
@@ -8648,7 +8618,7 @@ function ServerConfigEditor(props) {
|
|
|
8648
8618
|
onChange: (value) => field(key, value),
|
|
8649
8619
|
onIssue: (bad) => issue(key, bad)
|
|
8650
8620
|
}));
|
|
8651
|
-
const type =
|
|
8621
|
+
const type = typeof config?.type === "string" ? config.type : "stdio";
|
|
8652
8622
|
const auth = config?.auth ?? {};
|
|
8653
8623
|
return (0, react.createElement)("div", { className: detail_module_default.section }, (0, react.createElement)("div", { className: detail_module_default.modes }, ["form", "json"].map((value) => (0, react.createElement)("button", {
|
|
8654
8624
|
type: "button",
|
|
@@ -8833,7 +8803,7 @@ function ServerConfigDetail({ kind, id, t, onSaved, onDirtyChange }) {
|
|
|
8833
8803
|
setDirty(false);
|
|
8834
8804
|
onSaved?.();
|
|
8835
8805
|
} catch (reason) {
|
|
8836
|
-
setError(
|
|
8806
|
+
setError(clientErrorMessage(t, reason));
|
|
8837
8807
|
} finally {
|
|
8838
8808
|
setBusy(false);
|
|
8839
8809
|
}
|
|
@@ -8958,7 +8928,7 @@ function McpCredentialEditor(props) {
|
|
|
8958
8928
|
if (cancelled) return;
|
|
8959
8929
|
setViews(Object.fromEntries(entries.flatMap(([ref, view]) => view === void 0 ? [] : [[ref, view]])));
|
|
8960
8930
|
}).catch((reason) => {
|
|
8961
|
-
if (!cancelled) setError(
|
|
8931
|
+
if (!cancelled) setError(clientErrorMessage(t, reason));
|
|
8962
8932
|
});
|
|
8963
8933
|
return () => {
|
|
8964
8934
|
cancelled = true;
|
|
@@ -8986,7 +8956,7 @@ function McpCredentialEditor(props) {
|
|
|
8986
8956
|
}));
|
|
8987
8957
|
await refresh(ref);
|
|
8988
8958
|
} catch (reason) {
|
|
8989
|
-
setError(
|
|
8959
|
+
setError(clientErrorMessage(t, reason));
|
|
8990
8960
|
} finally {
|
|
8991
8961
|
setBusy(void 0);
|
|
8992
8962
|
}
|
|
@@ -8999,7 +8969,7 @@ function McpCredentialEditor(props) {
|
|
|
8999
8969
|
await unsetCredential(api, ref);
|
|
9000
8970
|
await refresh(ref);
|
|
9001
8971
|
} catch (reason) {
|
|
9002
|
-
setError(
|
|
8972
|
+
setError(clientErrorMessage(t, reason));
|
|
9003
8973
|
} finally {
|
|
9004
8974
|
setBusy(void 0);
|
|
9005
8975
|
}
|
|
@@ -9046,30 +9016,12 @@ function deriveMcpStatusViewModel(payload, filter, search) {
|
|
|
9046
9016
|
plugin: 0,
|
|
9047
9017
|
direct: 0
|
|
9048
9018
|
};
|
|
9049
|
-
const visibleTotals = {
|
|
9050
|
-
all: 0,
|
|
9051
|
-
connected: 0,
|
|
9052
|
-
degraded: 0,
|
|
9053
|
-
failed: 0,
|
|
9054
|
-
needsCredentials: 0,
|
|
9055
|
-
orphaned: 0,
|
|
9056
|
-
disabled: 0,
|
|
9057
|
-
foreign: 0
|
|
9058
|
-
};
|
|
9059
9019
|
const filtered = [];
|
|
9060
9020
|
const needle = search.trim().toLowerCase();
|
|
9061
9021
|
for (const item of searchable) {
|
|
9062
9022
|
const entry = item.entry;
|
|
9063
9023
|
filterCounts.all++;
|
|
9064
9024
|
filterCounts[entry.kind]++;
|
|
9065
|
-
visibleTotals.all++;
|
|
9066
|
-
if (entry.state === "connected") visibleTotals.connected++;
|
|
9067
|
-
if (entry.state === "degraded") visibleTotals.degraded++;
|
|
9068
|
-
if (entry.state === "failed") visibleTotals.failed++;
|
|
9069
|
-
if (entry.state === "needs-credentials") visibleTotals.needsCredentials++;
|
|
9070
|
-
if (entry.state === "orphaned") visibleTotals.orphaned++;
|
|
9071
|
-
if (entry.state === "disabled") visibleTotals.disabled++;
|
|
9072
|
-
if (entry.state === "foreign") visibleTotals.foreign++;
|
|
9073
9025
|
if (filter !== "all" && entry.kind !== filter) continue;
|
|
9074
9026
|
if (needle !== "" && !item.haystack.includes(needle)) continue;
|
|
9075
9027
|
filtered.push(entry);
|
|
@@ -9077,8 +9029,7 @@ function deriveMcpStatusViewModel(payload, filter, search) {
|
|
|
9077
9029
|
return {
|
|
9078
9030
|
activeEntries,
|
|
9079
9031
|
filtered,
|
|
9080
|
-
filterCounts
|
|
9081
|
-
visibleTotals
|
|
9032
|
+
filterCounts
|
|
9082
9033
|
};
|
|
9083
9034
|
}
|
|
9084
9035
|
function searchableFor(payload) {
|
|
@@ -9094,19 +9045,9 @@ function searchableFor(payload) {
|
|
|
9094
9045
|
//#endregion
|
|
9095
9046
|
//#region src/client/mcp-status.module.css
|
|
9096
9047
|
var mcp_status_module_default = {
|
|
9097
|
-
"boundary": "AUWlZW_boundary",
|
|
9098
9048
|
"card": "AUWlZW_card",
|
|
9099
9049
|
"cardBody": "AUWlZW_cardBody",
|
|
9100
9050
|
"cardTop": "AUWlZW_cardTop",
|
|
9101
|
-
"chevron": "AUWlZW_chevron",
|
|
9102
|
-
"chipblocked": "AUWlZW_chipblocked",
|
|
9103
|
-
"chipdegraded": "AUWlZW_chipdegraded",
|
|
9104
|
-
"chipdisabled": "AUWlZW_chipdisabled",
|
|
9105
|
-
"chipfailed": "AUWlZW_chipfailed",
|
|
9106
|
-
"chipmounted": "AUWlZW_chipmounted",
|
|
9107
|
-
"chipneedsCredentials": "AUWlZW_chipneedsCredentials",
|
|
9108
|
-
"chiporphaned": "AUWlZW_chiporphaned",
|
|
9109
|
-
"config": "AUWlZW_config",
|
|
9110
9051
|
"detail": "AUWlZW_detail",
|
|
9111
9052
|
"detailBody": "AUWlZW_detailBody",
|
|
9112
9053
|
"detailDialog": "AUWlZW_detailDialog",
|
|
@@ -9115,46 +9056,30 @@ var mcp_status_module_default = {
|
|
|
9115
9056
|
"detailHead": "AUWlZW_detailHead",
|
|
9116
9057
|
"detailHero": "AUWlZW_detailHero",
|
|
9117
9058
|
"detailHeroText": "AUWlZW_detailHeroText",
|
|
9118
|
-
"detailMeta": "AUWlZW_detailMeta",
|
|
9119
9059
|
"detailSection": "AUWlZW_detailSection",
|
|
9120
|
-
"detailState": "AUWlZW_detailState",
|
|
9121
|
-
"detailStateconnected": "AUWlZW_detailStateconnected",
|
|
9122
|
-
"detailStatedegraded": "AUWlZW_detailStatedegraded",
|
|
9123
|
-
"detailStatedisabled": "AUWlZW_detailStatedisabled",
|
|
9124
|
-
"detailStatefailed": "AUWlZW_detailStatefailed",
|
|
9125
|
-
"detailStateneeds-credentials": "AUWlZW_detailStateneeds-credentials",
|
|
9126
|
-
"detailStateorphaned": "AUWlZW_detailStateorphaned",
|
|
9127
9060
|
"empty": "AUWlZW_empty",
|
|
9128
9061
|
"endpoint": "AUWlZW_endpoint",
|
|
9129
9062
|
"error": "AUWlZW_error",
|
|
9130
|
-
"errorSummary": "AUWlZW_errorSummary",
|
|
9131
|
-
"extArrow": "AUWlZW_extArrow",
|
|
9132
|
-
"extLanguage": "AUWlZW_extLanguage",
|
|
9133
|
-
"extName": "AUWlZW_extName",
|
|
9134
|
-
"extRow": "AUWlZW_extRow",
|
|
9135
9063
|
"grid": "AUWlZW_grid",
|
|
9136
|
-
"header": "AUWlZW_header",
|
|
9137
|
-
"headerActions": "AUWlZW_headerActions",
|
|
9138
9064
|
"list": "AUWlZW_list",
|
|
9139
9065
|
"lspStartingPulse": "AUWlZW_lspStartingPulse",
|
|
9140
|
-
"mcp-retry-spin": "AUWlZW_mcp-retry-spin",
|
|
9141
9066
|
"modalFooter": "AUWlZW_modalFooter",
|
|
9142
9067
|
"name": "AUWlZW_name",
|
|
9143
|
-
"observedAt": "AUWlZW_observedAt",
|
|
9144
|
-
"reason": "AUWlZW_reason",
|
|
9145
9068
|
"reasonBox": "AUWlZW_reasonBox",
|
|
9146
9069
|
"reasonLabel": "AUWlZW_reasonLabel",
|
|
9147
9070
|
"reasonRaw": "AUWlZW_reasonRaw",
|
|
9148
9071
|
"reasonText": "AUWlZW_reasonText",
|
|
9149
|
-
"retryEchoFailure": "AUWlZW_retryEchoFailure",
|
|
9150
9072
|
"retryEchoSuccess": "AUWlZW_retryEchoSuccess",
|
|
9151
|
-
"
|
|
9152
|
-
"
|
|
9073
|
+
"seamBanner": "AUWlZW_seamBanner",
|
|
9074
|
+
"seamBody": "AUWlZW_seamBody",
|
|
9075
|
+
"seamDone": "AUWlZW_seamDone",
|
|
9076
|
+
"seamOther": "AUWlZW_seamOther",
|
|
9077
|
+
"seamPath": "AUWlZW_seamPath",
|
|
9078
|
+
"seamPathLabel": "AUWlZW_seamPathLabel",
|
|
9079
|
+
"seamTitle": "AUWlZW_seamTitle",
|
|
9153
9080
|
"service": "AUWlZW_service",
|
|
9154
9081
|
"sourceDirect": "AUWlZW_sourceDirect",
|
|
9155
9082
|
"sourcePlugin": "AUWlZW_sourcePlugin",
|
|
9156
|
-
"spinning": "AUWlZW_spinning",
|
|
9157
|
-
"state": "AUWlZW_state",
|
|
9158
9083
|
"stateconflict": "AUWlZW_stateconflict",
|
|
9159
9084
|
"stateconnected": "AUWlZW_stateconnected",
|
|
9160
9085
|
"statedegraded": "AUWlZW_statedegraded",
|
|
@@ -9177,24 +9102,13 @@ var mcp_status_module_default = {
|
|
|
9177
9102
|
"statusneeds-credentials": "AUWlZW_statusneeds-credentials",
|
|
9178
9103
|
"statusorphaned": "AUWlZW_statusorphaned",
|
|
9179
9104
|
"statusstarting": "AUWlZW_statusstarting",
|
|
9180
|
-
"summary": "AUWlZW_summary",
|
|
9181
|
-
"summaryAllGood": "AUWlZW_summaryAllGood",
|
|
9182
|
-
"summaryBar": "AUWlZW_summaryBar",
|
|
9183
|
-
"summaryChip": "AUWlZW_summaryChip",
|
|
9184
|
-
"summaryCount": "AUWlZW_summaryCount",
|
|
9185
|
-
"summaryDotGreen": "AUWlZW_summaryDotGreen",
|
|
9186
|
-
"summaryDotInfo": "AUWlZW_summaryDotInfo",
|
|
9187
|
-
"summaryDotRed": "AUWlZW_summaryDotRed",
|
|
9188
|
-
"summaryDotWarn": "AUWlZW_summaryDotWarn",
|
|
9189
|
-
"summaryLabel": "AUWlZW_summaryLabel",
|
|
9190
9105
|
"surface": "AUWlZW_surface HJ9x7a_shell",
|
|
9191
9106
|
"tool": "AUWlZW_tool",
|
|
9192
9107
|
"toolbar": "AUWlZW_toolbar",
|
|
9193
9108
|
"toolCount": "AUWlZW_toolCount",
|
|
9194
9109
|
"toolDescription": "AUWlZW_toolDescription",
|
|
9195
9110
|
"toolList": "AUWlZW_toolList",
|
|
9196
|
-
"toolName": "AUWlZW_toolName"
|
|
9197
|
-
"transport": "AUWlZW_transport"
|
|
9111
|
+
"toolName": "AUWlZW_toolName"
|
|
9198
9112
|
};
|
|
9199
9113
|
//#endregion
|
|
9200
9114
|
//#region src/client/McpStatusPanel.tsx
|
|
@@ -9243,7 +9157,7 @@ function McpStatusPanel({ t, credentials }) {
|
|
|
9243
9157
|
setLoading(true);
|
|
9244
9158
|
setError(void 0);
|
|
9245
9159
|
fetchMcpStatus().then(setPayload).catch((caught) => {
|
|
9246
|
-
setError(
|
|
9160
|
+
setError(clientErrorMessage(t, caught));
|
|
9247
9161
|
}).finally(() => setLoading(false));
|
|
9248
9162
|
};
|
|
9249
9163
|
(0, react.useEffect)(() => {
|
|
@@ -9268,8 +9182,8 @@ function McpStatusPanel({ t, credentials }) {
|
|
|
9268
9182
|
onSearchChange: setSearch,
|
|
9269
9183
|
filters: [
|
|
9270
9184
|
"all",
|
|
9271
|
-
"
|
|
9272
|
-
"
|
|
9185
|
+
"direct",
|
|
9186
|
+
"plugin"
|
|
9273
9187
|
].map((kind) => ({
|
|
9274
9188
|
id: kind,
|
|
9275
9189
|
label: filterLabel(t, kind),
|
|
@@ -9316,11 +9230,10 @@ function McpStatusPanel({ t, credentials }) {
|
|
|
9316
9230
|
}));
|
|
9317
9231
|
}
|
|
9318
9232
|
/**
|
|
9319
|
-
* One
|
|
9233
|
+
* One inventory row: state dot, server name, tool count, and endpoint.
|
|
9320
9234
|
*
|
|
9321
|
-
* The
|
|
9322
|
-
*
|
|
9323
|
-
* "all connected" confirmation when nothing is wrong.
|
|
9235
|
+
* The reason text, the actions (retry, reauthorize), and the configuration
|
|
9236
|
+
* editor live in the detail dialog, so a wall of failing rows stays scannable.
|
|
9324
9237
|
*/
|
|
9325
9238
|
function McpCard({ entry, t, onClick }) {
|
|
9326
9239
|
const interactive = {
|
|
@@ -9393,7 +9306,7 @@ function McpDetailModal({ entry, t, credentials, onClose, onRetry, onReauthorize
|
|
|
9393
9306
|
} catch (reason) {
|
|
9394
9307
|
setFeedback({
|
|
9395
9308
|
error: true,
|
|
9396
|
-
text: t("actionFail") + ": " + (
|
|
9309
|
+
text: t("actionFail") + ": " + clientErrorMessage(t, reason)
|
|
9397
9310
|
});
|
|
9398
9311
|
} finally {
|
|
9399
9312
|
setPending(false);
|
|
@@ -9449,7 +9362,11 @@ function McpDetailModal({ entry, t, credentials, onClose, onRetry, onReauthorize
|
|
|
9449
9362
|
}, t("mcpConfirmReauth"))) : null, dirty && (actions.retry || actions.reauthorize) ? (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, t("mcpSaveFirst")) : null, entry.state === "needs-credentials" ? (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, t("mcpConfigureCredentialsFirst")) : null, (0, react.createElement)("div", { className: mcp_status_module_default.detailHero }, (0, react.createElement)("span", {
|
|
9450
9363
|
className: `${mcp_status_module_default.statusDot} ${mcp_status_module_default[`status${entry.state}`]}`,
|
|
9451
9364
|
"aria-hidden": true
|
|
9452
|
-
}), (0, react.createElement)("div", { className: mcp_status_module_default.detailHeroText }, entry.endpoint === void 0 ? null : (0, react.createElement)("p", { className: mcp_status_module_default.detailEndpoint }, entry.endpoint), (0, react.createElement)("p", { className: mcp_status_module_default.detailEndpoint }, [
|
|
9365
|
+
}), (0, react.createElement)("div", { className: mcp_status_module_default.detailHeroText }, entry.endpoint === void 0 ? null : (0, react.createElement)("p", { className: mcp_status_module_default.detailEndpoint }, entry.endpoint), (0, react.createElement)("p", { className: mcp_status_module_default.detailEndpoint }, [
|
|
9366
|
+
entry.kind === "plugin" ? `${t("mcpPlugin")}: ${entry.suiteId ?? entry.source ?? "—"}` : t("mcpDirect"),
|
|
9367
|
+
entry.transport,
|
|
9368
|
+
...entry.oauthDefault === true ? [t("mcpOauthDefault")] : []
|
|
9369
|
+
].join(" · ")))), entry.state === "foreign" ? (0, react.createElement)("div", { className: mcp_status_module_default.reasonBox }, (0, react.createElement)("span", { className: mcp_status_module_default.reasonLabel }, t("mcpReasonLabel")), (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, entry.code === "duplicate-mount" ? t("mcpDuplicateHint") : t("mcpForeignHint")), entry.reason === void 0 ? null : (0, react.createElement)("p", { className: mcp_status_module_default.reasonRaw }, entry.reason)) : entry.reason === void 0 ? null : (0, react.createElement)("div", { className: mcp_status_module_default.reasonBox }, (0, react.createElement)("span", { className: mcp_status_module_default.reasonLabel }, t("mcpReasonLabel")), (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, entry.reason)), entry.kind === "direct" && !entry.managed ? (0, react.createElement)("div", { className: mcp_status_module_default.reasonBox }, (0, react.createElement)("p", { className: mcp_status_module_default.reasonText }, t("mcpDirectBoundary"))) : null, entry.credentialRefs?.length === 0 || entry.credentialRefs === void 0 ? null : (0, react.createElement)(McpCredentialEditor, {
|
|
9453
9370
|
t,
|
|
9454
9371
|
api: credentials,
|
|
9455
9372
|
refs: entry.credentialRefs
|
|
@@ -9479,7 +9396,7 @@ function McpAddModal({ t, onClose, onSaved }) {
|
|
|
9479
9396
|
const save = () => {
|
|
9480
9397
|
setBusy(true);
|
|
9481
9398
|
setError(void 0);
|
|
9482
|
-
Promise.resolve().then(() => addMcpServer(name.trim(), parseServerConfig(config))).then(onSaved).catch((caught) => setError(
|
|
9399
|
+
Promise.resolve().then(() => addMcpServer(name.trim(), parseServerConfig(config))).then(onSaved).catch((caught) => setError(clientErrorMessage(t, caught))).finally(() => setBusy(false));
|
|
9483
9400
|
};
|
|
9484
9401
|
return (0, react.createElement)(DetailModal, {
|
|
9485
9402
|
open: true,
|
|
@@ -9527,6 +9444,54 @@ function mcpFilterHint(t, kind) {
|
|
|
9527
9444
|
return t("mcpFilterAllHint");
|
|
9528
9445
|
}
|
|
9529
9446
|
//#endregion
|
|
9447
|
+
//#region src/client/features/lsp-status/lsp-status-view-model.ts
|
|
9448
|
+
/** Filter tabs in display order. */
|
|
9449
|
+
const LSP_FILTERS = [
|
|
9450
|
+
"all",
|
|
9451
|
+
"direct",
|
|
9452
|
+
"plugin"
|
|
9453
|
+
];
|
|
9454
|
+
/**
|
|
9455
|
+
* Derive per-filter counts and the visible rows in one pass over the payload.
|
|
9456
|
+
*
|
|
9457
|
+
* Visible rows are ordered so the languages a user must act on come first.
|
|
9458
|
+
*/
|
|
9459
|
+
function deriveLspStatusViewModel(payload, filter, search) {
|
|
9460
|
+
const needle = search.trim().toLowerCase();
|
|
9461
|
+
const filterCounts = {
|
|
9462
|
+
all: 0,
|
|
9463
|
+
plugin: 0,
|
|
9464
|
+
direct: 0
|
|
9465
|
+
};
|
|
9466
|
+
const filtered = [];
|
|
9467
|
+
for (const entry of payload.entries) {
|
|
9468
|
+
for (const key of LSP_FILTERS) if (matches(entry, key)) filterCounts[key]++;
|
|
9469
|
+
if (!matches(entry, filter)) continue;
|
|
9470
|
+
if (needle !== "" && !searchableText(entry).includes(needle)) continue;
|
|
9471
|
+
filtered.push(entry);
|
|
9472
|
+
}
|
|
9473
|
+
filtered.sort((left, right) => severity(left.state) - severity(right.state));
|
|
9474
|
+
return {
|
|
9475
|
+
filtered,
|
|
9476
|
+
filterCounts
|
|
9477
|
+
};
|
|
9478
|
+
}
|
|
9479
|
+
function matches(entry, filter) {
|
|
9480
|
+
return filter === "all" || entry.kind === filter;
|
|
9481
|
+
}
|
|
9482
|
+
function searchableText(entry) {
|
|
9483
|
+
return `${entry.serverKey} ${entry.suiteName} ${entry.command}`.toLowerCase();
|
|
9484
|
+
}
|
|
9485
|
+
/** Rank of a state for display order: the failures that need action rank first. */
|
|
9486
|
+
function severity(state) {
|
|
9487
|
+
if (state === "failed") return 0;
|
|
9488
|
+
if (state === "conflict") return 1;
|
|
9489
|
+
if (state === "host-missing") return 2;
|
|
9490
|
+
if (state === "starting") return 3;
|
|
9491
|
+
if (state === "disabled") return 4;
|
|
9492
|
+
return 5;
|
|
9493
|
+
}
|
|
9494
|
+
//#endregion
|
|
9530
9495
|
//#region src/client/LspStatusPanel.tsx
|
|
9531
9496
|
/**
|
|
9532
9497
|
* LSP status panel: declared language servers of enabled suites with their
|
|
@@ -9534,8 +9499,8 @@ function mcpFilterHint(t, kind) {
|
|
|
9534
9499
|
* `ctx.lsp` seam has no provider snapshot, so "mounted" means the mount
|
|
9535
9500
|
* registration succeeded, not that a process probe ran.
|
|
9536
9501
|
*
|
|
9537
|
-
* Visual language mirrors McpStatusPanel: the same shared SearchFilterToolbar
|
|
9538
|
-
* the same
|
|
9502
|
+
* Visual language mirrors McpStatusPanel: the same shared SearchFilterToolbar
|
|
9503
|
+
* and the same cards, state pills, and detail dialog from mcp-status.module.css.
|
|
9539
9504
|
* Cards stay lean (state dot + name + command + one state pill); the source
|
|
9540
9505
|
* suite and the full extension map live in the detail dialog.
|
|
9541
9506
|
*/
|
|
@@ -9551,11 +9516,6 @@ const EMPTY_STATUS = {
|
|
|
9551
9516
|
},
|
|
9552
9517
|
hostMissing: true
|
|
9553
9518
|
};
|
|
9554
|
-
const FILTER_KEYS = [
|
|
9555
|
-
"all",
|
|
9556
|
-
"plugin",
|
|
9557
|
-
"direct"
|
|
9558
|
-
];
|
|
9559
9519
|
const FILTER_LABEL_KEYS = {
|
|
9560
9520
|
all: "lspAll",
|
|
9561
9521
|
plugin: "lspPlugin",
|
|
@@ -9567,19 +9527,6 @@ const FILTER_HINT_KEYS = {
|
|
|
9567
9527
|
plugin: "lspFilterPluginHint",
|
|
9568
9528
|
direct: "lspFilterDirectHint"
|
|
9569
9529
|
};
|
|
9570
|
-
function matches(entry, filter) {
|
|
9571
|
-
if (filter === "all") return true;
|
|
9572
|
-
if (filter === "plugin" || filter === "direct") return entry.kind === filter;
|
|
9573
|
-
return false;
|
|
9574
|
-
}
|
|
9575
|
-
function severity(entry) {
|
|
9576
|
-
if (entry.state === "failed") return 0;
|
|
9577
|
-
if (entry.state === "conflict") return 1;
|
|
9578
|
-
if (entry.state === "host-missing") return 2;
|
|
9579
|
-
if (entry.state === "starting") return 3;
|
|
9580
|
-
if (entry.state === "disabled") return 4;
|
|
9581
|
-
return 5;
|
|
9582
|
-
}
|
|
9583
9530
|
/** Language-server inventory with per-state overview and per-server detail. */
|
|
9584
9531
|
function LspStatusPanel({ t }) {
|
|
9585
9532
|
const [payload, setPayload] = (0, react.useState)(EMPTY_STATUS);
|
|
@@ -9590,11 +9537,12 @@ function LspStatusPanel({ t }) {
|
|
|
9590
9537
|
const [view, setView] = useWorkspaceView();
|
|
9591
9538
|
const [selected, setSelected] = (0, react.useState)(void 0);
|
|
9592
9539
|
const [editorOpen, setEditorOpen] = (0, react.useState)(false);
|
|
9540
|
+
const [seamMigration, setSeamMigration] = (0, react.useState)(void 0);
|
|
9593
9541
|
const refresh = () => {
|
|
9594
9542
|
setLoading(true);
|
|
9595
9543
|
setError(void 0);
|
|
9596
9544
|
fetchLspStatus().then(setPayload).catch((caught) => {
|
|
9597
|
-
setError(
|
|
9545
|
+
setError(clientErrorMessage(t, caught));
|
|
9598
9546
|
}).finally(() => setLoading(false));
|
|
9599
9547
|
};
|
|
9600
9548
|
(0, react.useEffect)(() => {
|
|
@@ -9620,12 +9568,7 @@ function LspStatusPanel({ t }) {
|
|
|
9620
9568
|
clearInterval(timer);
|
|
9621
9569
|
};
|
|
9622
9570
|
}, [anyStarting]);
|
|
9623
|
-
const
|
|
9624
|
-
const counts = FILTER_KEYS.reduce((acc, key) => {
|
|
9625
|
-
acc[key] = payload.entries.filter((entry) => matches(entry, key)).length;
|
|
9626
|
-
return acc;
|
|
9627
|
-
}, {});
|
|
9628
|
-
const visible = payload.entries.filter((entry) => matches(entry, filter)).filter((entry) => needle === "" || `${entry.serverKey} ${entry.suiteName} ${entry.command}`.toLowerCase().includes(needle));
|
|
9571
|
+
const { filtered, filterCounts } = deriveLspStatusViewModel(payload, filter, search);
|
|
9629
9572
|
return (0, react.createElement)("div", { className: mcp_status_module_default.surface }, (0, react.createElement)(PanelHeader, {
|
|
9630
9573
|
title: t("lspStatusTitle"),
|
|
9631
9574
|
subtitle: t("lspStatusSubtitle"),
|
|
@@ -9636,20 +9579,30 @@ function LspStatusPanel({ t }) {
|
|
|
9636
9579
|
onRefresh: refresh,
|
|
9637
9580
|
busy: loading
|
|
9638
9581
|
})
|
|
9582
|
+
}), payload.legacySeam === void 0 ? seamMigration === void 0 ? null : (0, react.createElement)(SeamResult, {
|
|
9583
|
+
result: seamMigration,
|
|
9584
|
+
t
|
|
9585
|
+
}) : (0, react.createElement)(SeamBanner, {
|
|
9586
|
+
seam: payload.legacySeam,
|
|
9587
|
+
t,
|
|
9588
|
+
onMigrated: (result) => {
|
|
9589
|
+
setSeamMigration(result);
|
|
9590
|
+
refresh();
|
|
9591
|
+
}
|
|
9639
9592
|
}), (0, react.createElement)(SearchFilterToolbar, {
|
|
9640
9593
|
className: mcp_status_module_default.toolbar,
|
|
9641
9594
|
search,
|
|
9642
9595
|
searchLabel: t("lspSearch"),
|
|
9643
9596
|
searchPlaceholder: t("lspSearch"),
|
|
9644
9597
|
onSearchChange: setSearch,
|
|
9645
|
-
filters:
|
|
9598
|
+
filters: LSP_FILTERS.map((key) => ({
|
|
9646
9599
|
id: key,
|
|
9647
9600
|
label: t(FILTER_LABEL_KEYS[key]),
|
|
9648
|
-
count:
|
|
9601
|
+
count: filterCounts[key],
|
|
9649
9602
|
icon: (0, react.createElement)(LspFilterIcon, { k: key }),
|
|
9650
9603
|
active: filter === key,
|
|
9651
9604
|
onSelect: () => setFilter(key),
|
|
9652
|
-
hint:
|
|
9605
|
+
hint: t(FILTER_HINT_KEYS[key])
|
|
9653
9606
|
})),
|
|
9654
9607
|
view,
|
|
9655
9608
|
gridLabel: t("grid"),
|
|
@@ -9659,10 +9612,10 @@ function LspStatusPanel({ t }) {
|
|
|
9659
9612
|
variant: "ghost",
|
|
9660
9613
|
size: "sm",
|
|
9661
9614
|
onClick: refresh
|
|
9662
|
-
}, t("mcpRetry"))) : loading && payload.entries.length === 0 ? (0, react.createElement)("div", { className: mcp_status_module_default.empty }, t("loading")) :
|
|
9615
|
+
}, t("mcpRetry"))) : loading && payload.entries.length === 0 ? (0, react.createElement)("div", { className: mcp_status_module_default.empty }, t("loading")) : filtered.length === 0 ? (0, react.createElement)("div", { className: mcp_status_module_default.empty }, t("lspEmpty")) : (0, react.createElement)(ResourceCollection, {
|
|
9663
9616
|
view,
|
|
9664
9617
|
className: view === "grid" ? mcp_status_module_default.grid : mcp_status_module_default.list
|
|
9665
|
-
},
|
|
9618
|
+
}, filtered.map((entry) => (0, react.createElement)(LspRow, {
|
|
9666
9619
|
key: entry.id,
|
|
9667
9620
|
entry,
|
|
9668
9621
|
t,
|
|
@@ -9684,6 +9637,47 @@ function LspStatusPanel({ t }) {
|
|
|
9684
9637
|
}) : null);
|
|
9685
9638
|
}
|
|
9686
9639
|
/**
|
|
9640
|
+
* One-action upgrade repair for a profile that still carries the hand-written
|
|
9641
|
+
* LSP layer the pre-self-provisioning instructions asked for. The panel only
|
|
9642
|
+
* offers this while a `seam-conflict` is actually reported, and the action
|
|
9643
|
+
* edits exactly the one profile named here.
|
|
9644
|
+
*/
|
|
9645
|
+
function SeamBanner({ seam, t, onMigrated }) {
|
|
9646
|
+
const [busy, setBusy] = (0, react.useState)(false);
|
|
9647
|
+
const [error, setError] = (0, react.useState)(void 0);
|
|
9648
|
+
const migrate = async () => {
|
|
9649
|
+
setBusy(true);
|
|
9650
|
+
setError(void 0);
|
|
9651
|
+
try {
|
|
9652
|
+
onMigrated(await migrateLspSeam(seam.profile));
|
|
9653
|
+
} catch (reason) {
|
|
9654
|
+
setError(clientErrorMessage(t, reason));
|
|
9655
|
+
} finally {
|
|
9656
|
+
setBusy(false);
|
|
9657
|
+
}
|
|
9658
|
+
};
|
|
9659
|
+
return (0, react.createElement)("div", {
|
|
9660
|
+
className: mcp_status_module_default.seamBanner,
|
|
9661
|
+
role: "status"
|
|
9662
|
+
}, (0, react.createElement)("span", { className: mcp_status_module_default.seamTitle }, t("lspSeamTitle")), (0, react.createElement)("p", { className: mcp_status_module_default.seamBody }, t("lspSeamBody")), (0, react.createElement)("span", { className: mcp_status_module_default.seamPathLabel }, t("lspSeamFile")), (0, react.createElement)("p", { className: mcp_status_module_default.seamPath }, seam.patchPath), seam.otherProfiles.length === 0 ? null : (0, react.createElement)("p", { className: mcp_status_module_default.seamOther }, `${t("lspSeamOther")} ${seam.otherProfiles.join(", ")}`), error === void 0 ? null : (0, react.createElement)("div", { className: mcp_status_module_default.error }, error), (0, react.createElement)("div", { className: mcp_status_module_default.modalFooter }, (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
9663
|
+
variant: "primary",
|
|
9664
|
+
size: "sm",
|
|
9665
|
+
disabled: busy,
|
|
9666
|
+
onClick: () => void migrate()
|
|
9667
|
+
}, busy ? t("lspSeamRemoving") : t("lspSeamRemove"))));
|
|
9668
|
+
}
|
|
9669
|
+
/**
|
|
9670
|
+
* The outcome of a removal, held by the panel rather than the banner: the
|
|
9671
|
+
* refresh that follows takes the banner away, and the confirmation — with the
|
|
9672
|
+
* backup path that makes the edit reversible — must outlive it.
|
|
9673
|
+
*/
|
|
9674
|
+
function SeamResult({ result, t }) {
|
|
9675
|
+
return (0, react.createElement)("div", {
|
|
9676
|
+
className: mcp_status_module_default.seamBanner,
|
|
9677
|
+
role: "status"
|
|
9678
|
+
}, (0, react.createElement)("p", { className: mcp_status_module_default.seamDone }, result.restartRequired ? t("lspSeamRestart") : t("lspSeamDone")), (0, react.createElement)("p", { className: mcp_status_module_default.seamPath }, `${t("lspSeamBackup")} ${result.backupPath}`));
|
|
9679
|
+
}
|
|
9680
|
+
/**
|
|
9687
9681
|
* Direct LSP configuration editor: one JSON document shaped like Claude
|
|
9688
9682
|
* Code's `lspServers` table. The host validates with the same fail-closed
|
|
9689
9683
|
* rules as suite declarations and mounts direct servers on the next
|
|
@@ -9702,7 +9696,7 @@ function LspConfigEditor({ t, onClose, onSaved }) {
|
|
|
9702
9696
|
await addLspServer(name.trim(), parseServerConfig(text));
|
|
9703
9697
|
onSaved();
|
|
9704
9698
|
} catch (reason) {
|
|
9705
|
-
setError(
|
|
9699
|
+
setError(clientErrorMessage(t, reason));
|
|
9706
9700
|
} finally {
|
|
9707
9701
|
setBusy(false);
|
|
9708
9702
|
}
|
|
@@ -9788,8 +9782,7 @@ function LspDetailModal({ entry, t, onClose }) {
|
|
|
9788
9782
|
});
|
|
9789
9783
|
}
|
|
9790
9784
|
/** Filter icons mirroring McpFilterIcon's language: shared glyph shapes for
|
|
9791
|
-
* all/plugin/direct so the two panels read as one system
|
|
9792
|
-
* triangle for the blocked state. */
|
|
9785
|
+
* all/plugin/direct so the two panels read as one system. */
|
|
9793
9786
|
function LspFilterIcon({ k }) {
|
|
9794
9787
|
const common = {
|
|
9795
9788
|
width: 16,
|
|
@@ -9804,15 +9797,6 @@ function LspFilterIcon({ k }) {
|
|
|
9804
9797
|
cy: 5,
|
|
9805
9798
|
r: 2.2
|
|
9806
9799
|
}), (0, react.createElement)("path", { d: "M3.5 13c.6-2.2 2.1-3.3 4.5-3.3s3.9 1.1 4.5 3.3" }));
|
|
9807
|
-
if (k === "blocked") return (0, react.createElement)("svg", common, (0, react.createElement)("path", {
|
|
9808
|
-
d: "M8 2.5 14 13H2L8 2.5Z",
|
|
9809
|
-
stroke: "currentColor",
|
|
9810
|
-
strokeLinejoin: "round"
|
|
9811
|
-
}), (0, react.createElement)("path", {
|
|
9812
|
-
d: "M8 6.5v3M8 11.2v.3",
|
|
9813
|
-
stroke: "currentColor",
|
|
9814
|
-
strokeLinecap: "round"
|
|
9815
|
-
}));
|
|
9816
9800
|
return (0, react.createElement)("svg", common, (0, react.createElement)("path", { d: "M2.5 5 8 2.5 13.5 5 8 7.5 2.5 5Zm0 3L8 10.5 13.5 8M2.5 11 8 13.5 13.5 11" }));
|
|
9817
9801
|
}
|
|
9818
9802
|
/** The status-dot CSS suffix (lowercase state names in the stylesheet). */
|
|
@@ -9867,6 +9851,8 @@ function RoleFields(props) {
|
|
|
9867
9851
|
const model = !fields.provider && qualified ? fields.model.slice(qualified.id.length + 1) : fields.model === "inherit" ? "" : fields.model;
|
|
9868
9852
|
const route = JSON.stringify([provider, model]);
|
|
9869
9853
|
const hasRoute = provider !== "" && model !== "";
|
|
9854
|
+
const storedModel = fields.model === "inherit" ? "" : fields.model;
|
|
9855
|
+
const ignoredRoute = fields.provider === "" !== (storedModel === "") || storedModel !== "" && qualified !== void 0;
|
|
9870
9856
|
const effortLoading = hasRoute && reasoning?.route !== route && effortError !== route;
|
|
9871
9857
|
const efforts = reasoning?.route === route ? reasoning.value?.efforts ?? [] : [];
|
|
9872
9858
|
(0, react.useEffect)(() => {
|
|
@@ -9961,14 +9947,10 @@ function RoleFields(props) {
|
|
|
9961
9947
|
}, t("personaCatalogError"), (0, react.createElement)("button", {
|
|
9962
9948
|
type: "button",
|
|
9963
9949
|
onClick: () => setRevision((value) => value + 1)
|
|
9964
|
-
}, t("refresh"))) : null,
|
|
9965
|
-
className: panel_module_default.
|
|
9966
|
-
|
|
9967
|
-
},
|
|
9968
|
-
className: panel_module_default.editorInput,
|
|
9969
|
-
value: fields[key],
|
|
9970
|
-
onChange: (event) => props.onChange(updateFrontmatter(props.text, key, event.target.value))
|
|
9971
|
-
}))), (0, react.createElement)("p", { className: panel_module_default.editorHint }, props.t("personaModelHint")), (0, react.createElement)("p", { className: panel_module_default.editorHint }, props.t("personaToolsHint")));
|
|
9950
|
+
}, t("refresh"))) : null, ignoredRoute ? (0, react.createElement)("p", {
|
|
9951
|
+
className: panel_module_default.editorWarning,
|
|
9952
|
+
role: "status"
|
|
9953
|
+
}, t("personaRouteIgnored")) : null, (0, react.createElement)("p", { className: panel_module_default.editorHint }, props.t("personaModelHint")));
|
|
9972
9954
|
}
|
|
9973
9955
|
//#endregion
|
|
9974
9956
|
//#region src/client/ui/UserPanelSurface.tsx
|
|
@@ -10027,7 +10009,7 @@ function UserPanelSurface(props) {
|
|
|
10027
10009
|
const data = await fetchUserPanel(kind);
|
|
10028
10010
|
if (refreshSeq.current === seq) setEntries(data);
|
|
10029
10011
|
} catch (reason) {
|
|
10030
|
-
if (refreshSeq.current === seq) setError(
|
|
10012
|
+
if (refreshSeq.current === seq) setError(clientErrorMessage(t, reason));
|
|
10031
10013
|
} finally {
|
|
10032
10014
|
if (refreshSeq.current === seq) setLoading(false);
|
|
10033
10015
|
}
|
|
@@ -10053,7 +10035,7 @@ function UserPanelSurface(props) {
|
|
|
10053
10035
|
await refresh();
|
|
10054
10036
|
return true;
|
|
10055
10037
|
} catch (reason) {
|
|
10056
|
-
setError(
|
|
10038
|
+
setError(clientErrorMessage(t, reason));
|
|
10057
10039
|
return false;
|
|
10058
10040
|
} finally {
|
|
10059
10041
|
setBusy(false);
|
|
@@ -10183,7 +10165,7 @@ function UserPanelSurface(props) {
|
|
|
10183
10165
|
onEdit: () => openEdit(entry),
|
|
10184
10166
|
onToggle: () => toggleDisabled(entry),
|
|
10185
10167
|
onDelete: () => openDelete(entry)
|
|
10186
|
-
})))
|
|
10168
|
+
})))), (0, react.createElement)(EntryEditorModal, {
|
|
10187
10169
|
t,
|
|
10188
10170
|
open: editor !== void 0,
|
|
10189
10171
|
state: editor,
|
|
@@ -10330,7 +10312,6 @@ function renderTab(tab, t, credentials, mode) {
|
|
|
10330
10312
|
switch (tab) {
|
|
10331
10313
|
case "market": return (0, react.createElement)(MarketSection, {
|
|
10332
10314
|
t,
|
|
10333
|
-
credentials,
|
|
10334
10315
|
mode
|
|
10335
10316
|
});
|
|
10336
10317
|
case "skills": return (0, react.createElement)(UserPanelSurface, {
|
|
@@ -10339,8 +10320,7 @@ function renderTab(tab, t, credentials, mode) {
|
|
|
10339
10320
|
});
|
|
10340
10321
|
case "commands": return (0, react.createElement)(UserPanelSurface, {
|
|
10341
10322
|
t,
|
|
10342
|
-
kind: "commands"
|
|
10343
|
-
hint: t("commandsPanelHint")
|
|
10323
|
+
kind: "commands"
|
|
10344
10324
|
});
|
|
10345
10325
|
case "personas": return (0, react.createElement)(UserPanelSurface, {
|
|
10346
10326
|
t,
|
|
@@ -10402,7 +10382,7 @@ function McpPluginCard({ t, scope, probe }) {
|
|
|
10402
10382
|
scope.setEnhanced(next).then(() => {
|
|
10403
10383
|
setBusy(false);
|
|
10404
10384
|
}).catch((cause) => {
|
|
10405
|
-
setError(
|
|
10385
|
+
setError(clientErrorMessage(t, cause));
|
|
10406
10386
|
setBusy(false);
|
|
10407
10387
|
});
|
|
10408
10388
|
};
|
|
@@ -10416,7 +10396,7 @@ function McpPluginCard({ t, scope, probe }) {
|
|
|
10416
10396
|
onClick: () => {
|
|
10417
10397
|
setOpen((current) => !current);
|
|
10418
10398
|
}
|
|
10419
|
-
}, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardTitle }, t("nav")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("marketCardDesc"))), (0, react.createElement)("span", { className: open ? `${market_module_default.pluginChevron} ${market_module_default.pluginChevronOpen}` : market_module_default.pluginChevron }, chevronIcon !== void 0 ? (0, react.createElement)(chevronIcon, { size: 14 }) : "▾")), open ? (0, react.createElement)("div", { className: market_module_default.pluginCardBody }, (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("mcpCardTitle")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc },
|
|
10399
|
+
}, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardTitle }, t("nav")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("marketCardDesc"))), (0, react.createElement)("span", { className: open ? `${market_module_default.pluginChevron} ${market_module_default.pluginChevronOpen}` : market_module_default.pluginChevron }, chevronIcon !== void 0 ? (0, react.createElement)(chevronIcon, { size: 14 }) : "▾")), open ? (0, react.createElement)("div", { className: market_module_default.pluginCardBody }, (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("mcpCardTitle")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("mcpCardDesc"))), (0, react.createElement)(ToggleSwitch, {
|
|
10420
10400
|
on: enhanced,
|
|
10421
10401
|
disabled: busy || !writable,
|
|
10422
10402
|
title: writable ? void 0 : t("mcpCardReadonly"),
|
|
@@ -10433,11 +10413,11 @@ function McpPluginCard({ t, scope, probe }) {
|
|
|
10433
10413
|
scope.setRegion(region).then(() => {
|
|
10434
10414
|
setBusy(false);
|
|
10435
10415
|
}).catch((cause) => {
|
|
10436
|
-
setError(
|
|
10416
|
+
setError(clientErrorMessage(t, cause));
|
|
10437
10417
|
setBusy(false);
|
|
10438
10418
|
});
|
|
10439
10419
|
}
|
|
10440
|
-
}, region === "global" ? t("regionGlobal") : t("regionChina"))))), scope.scanProjectLayouts !== void 0 && scope.setScanProjectLayouts !== void 0 ? (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("projectLayoutsLabel"))), (0, react.createElement)(ToggleSwitch, {
|
|
10420
|
+
}, region === "global" ? t("regionGlobal") : t("regionChina"))))), scope.scanProjectLayouts !== void 0 && scope.setScanProjectLayouts !== void 0 ? (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("projectLayoutsLabel")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("projectLayoutsDesc"))), (0, react.createElement)(ToggleSwitch, {
|
|
10441
10421
|
on: scope.scanProjectLayouts(),
|
|
10442
10422
|
title: t("projectLayoutsLabel"),
|
|
10443
10423
|
disabled: busy || !writable,
|
|
@@ -10446,10 +10426,22 @@ function McpPluginCard({ t, scope, probe }) {
|
|
|
10446
10426
|
setBusy(true);
|
|
10447
10427
|
setError(void 0);
|
|
10448
10428
|
scope.setScanProjectLayouts(!scope.scanProjectLayouts()).catch((cause) => {
|
|
10449
|
-
setError(
|
|
10429
|
+
setError(clientErrorMessage(t, cause));
|
|
10430
|
+
}).finally(() => setBusy(false));
|
|
10431
|
+
}
|
|
10432
|
+
})) : null, scope.autoUpdateSources !== void 0 && scope.setAutoUpdateSources !== void 0 ? (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("autoUpdateLabel")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("autoUpdateDesc"))), (0, react.createElement)(ToggleSwitch, {
|
|
10433
|
+
on: scope.autoUpdateSources(),
|
|
10434
|
+
title: t("autoUpdateLabel"),
|
|
10435
|
+
disabled: busy || !writable,
|
|
10436
|
+
onChange: () => {
|
|
10437
|
+
if (busy || !writable) return;
|
|
10438
|
+
setBusy(true);
|
|
10439
|
+
setError(void 0);
|
|
10440
|
+
scope.setAutoUpdateSources(!scope.autoUpdateSources()).catch((cause) => {
|
|
10441
|
+
setError(clientErrorMessage(t, cause));
|
|
10450
10442
|
}).finally(() => setBusy(false));
|
|
10451
10443
|
}
|
|
10452
|
-
})) : null, scope.feedbackEnabled !== void 0 && scope.setFeedbackEnabled !== void 0 ? (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("feedbackToggleLabel")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc },
|
|
10444
|
+
})) : null, scope.feedbackEnabled !== void 0 && scope.setFeedbackEnabled !== void 0 ? (0, react.createElement)("div", { className: market_module_default.pluginCardRow }, (0, react.createElement)("div", { className: market_module_default.pluginCardText }, (0, react.createElement)("div", { className: market_module_default.pluginCardRowLabel }, t("feedbackToggleLabel")), (0, react.createElement)("div", { className: market_module_default.pluginCardDesc }, t("feedbackToggleDesc"))), (0, react.createElement)(ToggleSwitch, {
|
|
10453
10445
|
on: scope.feedbackEnabled(),
|
|
10454
10446
|
disabled: busy || !writable,
|
|
10455
10447
|
onChange: () => {
|
|
@@ -10459,7 +10451,7 @@ function McpPluginCard({ t, scope, probe }) {
|
|
|
10459
10451
|
scope.setFeedbackEnabled(!scope.feedbackEnabled()).then(() => {
|
|
10460
10452
|
setBusy(false);
|
|
10461
10453
|
}).catch((cause) => {
|
|
10462
|
-
setError(
|
|
10454
|
+
setError(clientErrorMessage(t, cause));
|
|
10463
10455
|
setBusy(false);
|
|
10464
10456
|
});
|
|
10465
10457
|
}
|
|
@@ -10572,7 +10564,7 @@ function mountLegacyPageMode(options) {
|
|
|
10572
10564
|
container?.remove();
|
|
10573
10565
|
container = document.createElement("div");
|
|
10574
10566
|
container.setAttribute(VIEW_ATTRIBUTE, "");
|
|
10575
|
-
container.className =
|
|
10567
|
+
container.className = cssClass("pageView");
|
|
10576
10568
|
column.appendChild(container);
|
|
10577
10569
|
root = (0, react_dom_client.createRoot)(container);
|
|
10578
10570
|
renderView();
|
|
@@ -10666,11 +10658,24 @@ function newSessionButton(root) {
|
|
|
10666
10658
|
function conversationColumn() {
|
|
10667
10659
|
return document.querySelector(CONVERSATION_COLUMN_SELECTOR) ?? void 0;
|
|
10668
10660
|
}
|
|
10661
|
+
/**
|
|
10662
|
+
* One class of the page-mode stylesheet. The generated module is an unchecked
|
|
10663
|
+
* string map, so a renamed class would otherwise reach the DOM as the literal
|
|
10664
|
+
* `undefined`; the surface renders unstyled and says so instead of failing.
|
|
10665
|
+
*/
|
|
10666
|
+
function cssClass(name) {
|
|
10667
|
+
const value = market_module_default[name];
|
|
10668
|
+
if (value === void 0) {
|
|
10669
|
+
console.warn(`[dsh-agent-plugins-market] market.module.css has no class "${name}" — the page-mode surface renders unstyled`);
|
|
10670
|
+
return "";
|
|
10671
|
+
}
|
|
10672
|
+
return value;
|
|
10673
|
+
}
|
|
10669
10674
|
function createEntry(onClick) {
|
|
10670
10675
|
const button = document.createElement("button");
|
|
10671
10676
|
button.type = "button";
|
|
10672
10677
|
button.setAttribute(ENTRY_ATTRIBUTE, "");
|
|
10673
|
-
button.className =
|
|
10678
|
+
button.className = cssClass("pageEntry");
|
|
10674
10679
|
button.innerHTML = "<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\"/></svg>";
|
|
10675
10680
|
const label = document.createElement("span");
|
|
10676
10681
|
label.dataset.dshAgentPluginsMarketLabel = "";
|
|
@@ -10768,8 +10773,10 @@ function apply(ctx) {
|
|
|
10768
10773
|
setRegion: (next) => withBusyOperation(() => scope.set("downloadRegion", next)),
|
|
10769
10774
|
feedbackEnabled: () => scope.getSnapshot().value?.feedbackEnabled !== false,
|
|
10770
10775
|
setFeedbackEnabled: (next) => withBusyOperation(() => scope.set("feedbackEnabled", next)),
|
|
10771
|
-
scanProjectLayouts: () => scope.getSnapshot().value?.scanProjectLayouts
|
|
10772
|
-
setScanProjectLayouts: (next) => withBusyOperation(() => scope.set("scanProjectLayouts", next))
|
|
10776
|
+
scanProjectLayouts: () => scope.getSnapshot().value?.scanProjectLayouts === true,
|
|
10777
|
+
setScanProjectLayouts: (next) => withBusyOperation(() => scope.set("scanProjectLayouts", next)),
|
|
10778
|
+
autoUpdateSources: () => scope.getSnapshot().value?.autoUpdateSources === true,
|
|
10779
|
+
setAutoUpdateSources: (next) => withBusyOperation(() => scope.set("autoUpdateSources", next))
|
|
10773
10780
|
},
|
|
10774
10781
|
probe: () => fetchMcpBackend()
|
|
10775
10782
|
})));
|