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.
Files changed (136) hide show
  1. package/README.md +117 -111
  2. package/README.zh.md +112 -98
  3. package/client/client.js +547 -540
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog-context.js +181 -0
  6. package/lib/application/catalog.js +217 -1110
  7. package/lib/application/details.js +6 -6
  8. package/lib/application/install-store.js +95 -0
  9. package/lib/application/lsp-service.js +97 -0
  10. package/lib/application/mcp-service.js +246 -0
  11. package/lib/application/panel-resources.js +29 -12
  12. package/lib/application/ports.js +21 -0
  13. package/lib/application/project-agent-roles.js +1 -1
  14. package/lib/application/snapshot-cache.js +160 -0
  15. package/lib/application/source-store.js +521 -0
  16. package/lib/catalog/archive.js +34 -29
  17. package/lib/catalog/component-files.js +14 -6
  18. package/lib/catalog/fs-probes.js +43 -0
  19. package/lib/catalog/manifests.js +53 -92
  20. package/lib/catalog/native-project.js +2 -2
  21. package/lib/catalog/paths.js +66 -55
  22. package/lib/catalog/project-config.js +2 -1
  23. package/lib/catalog/project-hooks.js +9 -1
  24. package/lib/catalog/scan-resolvers.js +29 -45
  25. package/lib/catalog/skills-parse.js +14 -10
  26. package/lib/catalog/source-catalog.js +3 -2
  27. package/lib/catalog/suite-components.js +5 -5
  28. package/lib/catalog/suite-scanner.js +3 -1
  29. package/lib/catalog/surfaces.js +5 -26
  30. package/lib/catalog/validate.js +7 -11
  31. package/lib/contracts/market.js +1 -0
  32. package/lib/index.js +91 -208
  33. package/lib/model/types.js +26 -3
  34. package/lib/routes.js +45 -15
  35. package/lib/runtime/agent-role-names.js +70 -0
  36. package/lib/runtime/agent-role-router.js +116 -102
  37. package/lib/runtime/commands-mounts.js +9 -6
  38. package/lib/runtime/deadline.js +28 -0
  39. package/lib/runtime/feedback-tool.js +94 -43
  40. package/lib/runtime/hooks-mounts.js +9 -11
  41. package/lib/runtime/host-locale.js +10 -21
  42. package/lib/runtime/lsp-direct-config.js +19 -19
  43. package/lib/runtime/lsp-mounts.js +159 -68
  44. package/lib/runtime/lsp-server-state.js +4 -4
  45. package/lib/runtime/lsp-status.js +1 -1
  46. package/lib/runtime/mcp-auth-record.js +42 -0
  47. package/lib/runtime/mcp-backend.js +6 -5
  48. package/lib/runtime/mcp-client/config.js +0 -1
  49. package/lib/runtime/mcp-client/connection.js +32 -37
  50. package/lib/runtime/mcp-client/host-contract.js +10 -0
  51. package/lib/runtime/mcp-client/oauth.js +5 -7
  52. package/lib/runtime/mcp-client/plugin-identity.js +28 -0
  53. package/lib/runtime/mcp-client/projection.js +202 -0
  54. package/lib/runtime/mcp-client/tools.js +4 -189
  55. package/lib/runtime/mcp-config.js +29 -10
  56. package/lib/runtime/mcp-direct-config.js +33 -16
  57. package/lib/runtime/mcp-mounts.js +35 -75
  58. package/lib/runtime/mcp-overrides.js +5 -5
  59. package/lib/runtime/mcp-redaction.js +3 -2
  60. package/lib/runtime/mcp-status.js +7 -8
  61. package/lib/runtime/mount-lifecycle.js +73 -0
  62. package/lib/runtime/profile-seam.js +321 -0
  63. package/lib/runtime/project-runtime.js +11 -8
  64. package/lib/runtime/reconcile-scheduler.js +99 -0
  65. package/lib/runtime/reconciler.js +4 -0
  66. package/lib/runtime/server-config.js +6 -4
  67. package/lib/runtime/settings-namespace.js +136 -0
  68. package/lib/runtime/skills-provider.js +5 -3
  69. package/lib/runtime/source-auto-update.js +70 -0
  70. package/lib/{model/state.js → runtime/state-store.js} +9 -11
  71. package/lib/runtime/storage-migration.js +35 -18
  72. package/lib/runtime/subagent-catalog.js +5 -4
  73. package/lib/runtime/user-commands.js +2 -2
  74. package/lib/runtime/user-panels.js +31 -21
  75. package/lib/runtime/user-store.js +12 -13
  76. package/lib/types/application/catalog-context.d.ts +118 -0
  77. package/lib/types/application/catalog.d.ts +99 -304
  78. package/lib/types/application/install-store.d.ts +21 -0
  79. package/lib/types/application/lsp-service.d.ts +36 -0
  80. package/lib/types/application/mcp-service.d.ts +71 -0
  81. package/lib/types/application/panel-resources.d.ts +8 -0
  82. package/lib/types/application/ports.d.ts +72 -0
  83. package/lib/types/application/queries.d.ts +13 -26
  84. package/lib/types/application/snapshot-cache.d.ts +51 -0
  85. package/lib/types/application/source-store.d.ts +100 -0
  86. package/lib/types/catalog/archive.d.ts +3 -11
  87. package/lib/types/catalog/component-files.d.ts +4 -0
  88. package/lib/types/catalog/fs-probes.d.ts +10 -0
  89. package/lib/types/catalog/manifests.d.ts +17 -16
  90. package/lib/types/catalog/native-project.d.ts +2 -2
  91. package/lib/types/catalog/paths.d.ts +47 -15
  92. package/lib/types/catalog/scan-pipeline.d.ts +3 -3
  93. package/lib/types/catalog/scan-resolvers.d.ts +3 -9
  94. package/lib/types/catalog/skills-parse.d.ts +0 -7
  95. package/lib/types/catalog/source-catalog.d.ts +3 -3
  96. package/lib/types/catalog/suite-scanner.d.ts +8 -6
  97. package/lib/types/catalog/validate.d.ts +0 -2
  98. package/lib/types/contracts/lsp-status.d.ts +35 -0
  99. package/lib/types/contracts/market.d.ts +3 -2
  100. package/lib/types/contracts/mcp-status.d.ts +4 -0
  101. package/lib/types/model/types.d.ts +29 -5
  102. package/lib/types/runtime/agent-role-names.d.ts +6 -0
  103. package/lib/types/runtime/agent-role-router.d.ts +54 -51
  104. package/lib/types/runtime/deadline.d.ts +18 -0
  105. package/lib/types/runtime/feedback-tool.d.ts +33 -11
  106. package/lib/types/runtime/hooks-mounts.d.ts +1 -1
  107. package/lib/types/runtime/host-locale.d.ts +1 -1
  108. package/lib/types/runtime/lsp-direct-config.d.ts +3 -3
  109. package/lib/types/runtime/lsp-mounts.d.ts +62 -19
  110. package/lib/types/runtime/lsp-status.d.ts +2 -1
  111. package/lib/types/runtime/mcp-auth-record.d.ts +29 -0
  112. package/lib/types/runtime/mcp-backend.d.ts +7 -4
  113. package/lib/types/runtime/mcp-client/config.d.ts +0 -2
  114. package/lib/types/runtime/mcp-client/host-contract.d.ts +78 -0
  115. package/lib/types/runtime/mcp-client/oauth.d.ts +1 -1
  116. package/lib/types/runtime/mcp-client/plugin-identity.d.ts +16 -0
  117. package/lib/types/runtime/mcp-client/projection.d.ts +45 -0
  118. package/lib/types/runtime/mcp-client/tools.d.ts +5 -72
  119. package/lib/types/runtime/mcp-config.d.ts +25 -4
  120. package/lib/types/runtime/mcp-direct-config.d.ts +18 -4
  121. package/lib/types/runtime/mcp-mounts.d.ts +10 -15
  122. package/lib/types/runtime/mcp-overrides.d.ts +1 -1
  123. package/lib/types/runtime/mcp-status.d.ts +1 -1
  124. package/lib/types/runtime/mount-lifecycle.d.ts +53 -0
  125. package/lib/types/runtime/profile-seam.d.ts +64 -0
  126. package/lib/types/runtime/reconcile-scheduler.d.ts +45 -0
  127. package/lib/types/runtime/reconciler.d.ts +2 -0
  128. package/lib/types/runtime/settings-namespace.d.ts +76 -0
  129. package/lib/types/runtime/source-auto-update.d.ts +33 -0
  130. package/lib/types/{model/state.d.ts → runtime/state-store.d.ts} +2 -2
  131. package/lib/types/runtime/storage-migration.d.ts +5 -3
  132. package/lib/types/runtime/subagent-catalog.d.ts +2 -0
  133. package/lib/types/runtime/user-panels.d.ts +8 -11
  134. package/lib/types/runtime/user-store.d.ts +2 -4
  135. package/package.json +48 -21
  136. 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]))) : null);
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 fetch(`${MARKET_ROUTES.serverConfig}?${new URLSearchParams({
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
- const response = await fetch(`${MARKET_ROUTES.modelCatalog}${query}`, {
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(async () => {
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
- const response = await fetch(MARKET_ROUTES.progress, { credentials: "same-origin" });
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(async () => {
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(async () => {
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 = async () => {
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
- async function fetchSkillContent(sourceId, suiteId, skill) {
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
- const response = await fetch(skillRoute(sourceId, suiteId, skill), { credentials: "same-origin" });
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
- const response = await fetch(MARKET_ROUTES.mcpBackend, { credentials: "same-origin" });
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(async () => {
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
- const response = await fetch(userPanelRoute(kind), { credentials: "same-origin" });
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 fetch(userPanelMutationRoute(kind, "create"), {
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
- const response = await fetch(userPanelMutationRoute(kind, "update", name), {
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
- const response = await fetch(userPanelMutationRoute(kind, "delete"), {
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
- lspAllMounted: "全部已挂载",
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
- mcpConnect: "连接",
645
- mcpReauthorizing: "等待浏览器授权…",
646
- marketCardDesc: "Agent Plugins 市场套件的安装、启用与运行时行为配置。",
674
+ marketCardDesc: "管理套件来源、安装与运行时开关。",
647
675
  mcpCardTitle: "MCP 增强模式",
648
- mcpCardDescOn: "已开启:支持 OAuth 授权、SSE、授权保持等功能。",
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
- mcpDirectConfigUnavailable: "宿主未提供直接安装 MCP 的配置记录",
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 服务与宿主直接安装的 MCP",
703
+ mcpFilterAllHint: "全部:插件套件声明的 MCP 服务与用户自行添加的 MCP",
695
704
  mcpFilterPluginHint: "Plugin:来自插件市场套件的 mcp.json 声明",
696
- mcpFilterDirectHint: "直接安装:宿主工具表中观测到、非套件来源的 MCP",
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
- lspDetailCommand: "启动命令",
722
- lspDetailExtensions: "扩展映射",
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
- personaTools: "允许使用的工具",
744
- personaModelHint: "模型目录来自 DSH;选择继承时沿用主会话配置。",
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
- feedbackToggleDescOn: "已开启:Agent 遇到本插件的问题时可自动提交 issue 反馈。",
783
- feedbackToggleDescOff: "已关闭:Agent 无法自动提交反馈。"
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
- lspAllMounted: "All mounted",
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: "Direct",
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
- mcpConnect: "Connect",
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
- mcpCardDescOn: "On: enables OAuth authorization, SSE, authorization hold, and more.",
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 routes through a mirror. Affects the download route only.",
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
- mcpDirectConfigUnavailable: "The host does not expose direct-MCP configuration",
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 host-installed MCP",
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: "Direct: MCP observed in the host tool registry outside any suite",
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: "Host missing",
1032
- lspConflict: "Extension conflict",
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: "Direct: user-configured language servers (configured in this panel)",
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
- lspDetailCommand: "Launch command",
1048
- lspDetailExtensions: "Extension map",
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
- personaTools: "Allowed tools",
1070
- personaModelHint: "Models come from DSH. Inheritance uses the session configuration.",
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
- feedbackToggleDescOn: "On: the agent may auto-file an issue when it hits a problem in this plugin.",
1109
- feedbackToggleDescOff: "Off: the agent cannot auto-file feedback."
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 hasTagRow = tags.length > 0 || suite.errors.length > 0 || (suite.mcpErrors?.length ?? 0) > 0;
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: (0, react.createElement)("span", { className: market_module_default.warnLine }, `⚠ ${t("errors")} ${suite.errors.length}`)
1735
- }), (suite.mcpErrors?.length ?? 0) === 0 ? null : (0, react.createElement)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
1736
- label: suite.mcpErrors.slice(0, 8).join(t("sourceErrorSeparator")),
1737
- children: (0, react.createElement)("span", { className: market_module_default.warnLine }, `⚠ ${t("mcpSection")} ${suite.mcpErrors.length}`)
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.0/node_modules/yaml/browser/dist/nodes/identity.js
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.0/node_modules/yaml/browser/dist/visit.js
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.0/node_modules/yaml/browser/dist/doc/directives.js
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.0/node_modules/yaml/browser/dist/doc/anchors.js
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.0/node_modules/yaml/browser/dist/doc/applyReviver.js
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.0/node_modules/yaml/browser/dist/nodes/toJS.js
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.0/node_modules/yaml/browser/dist/nodes/Node.js
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.0/node_modules/yaml/browser/dist/nodes/Alias.js
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 { anchors, doc, maxAliasCount } = ctx;
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
- let data = anchors.get(source);
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.0/node_modules/yaml/browser/dist/nodes/Scalar.js
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.0/node_modules/yaml/browser/dist/doc/createNode.js
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.0/node_modules/yaml/browser/dist/nodes/Collection.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyComment.js
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.0/node_modules/yaml/browser/dist/stringify/foldFlowLines.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyString.js
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.0/node_modules/yaml/browser/dist/stringify/stringify.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyPair.js
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.0/node_modules/yaml/browser/dist/log.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js
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.0/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js
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.0/node_modules/yaml/browser/dist/nodes/Pair.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyCollection.js
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.0/node_modules/yaml/browser/dist/nodes/YAMLMap.js
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.0/node_modules/yaml/browser/dist/schema/common/map.js
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.0/node_modules/yaml/browser/dist/nodes/YAMLSeq.js
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.0/node_modules/yaml/browser/dist/schema/common/seq.js
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.0/node_modules/yaml/browser/dist/schema/common/string.js
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.0/node_modules/yaml/browser/dist/schema/common/null.js
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.0/node_modules/yaml/browser/dist/schema/core/bool.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyNumber.js
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.0/node_modules/yaml/browser/dist/schema/core/float.js
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.0/node_modules/yaml/browser/dist/schema/core/int.js
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.0/node_modules/yaml/browser/dist/schema/core/schema.js
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.0/node_modules/yaml/browser/dist/schema/json/schema.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js
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.0/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js
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.0/node_modules/yaml/browser/dist/schema/tags.js
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.0/node_modules/yaml/browser/dist/schema/Schema.js
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.0/node_modules/yaml/browser/dist/stringify/stringifyDocument.js
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.0/node_modules/yaml/browser/dist/doc/Document.js
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.0/node_modules/yaml/browser/dist/errors.js
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.0/node_modules/yaml/browser/dist/compose/resolve-props.js
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.0/node_modules/yaml/browser/dist/compose/util-contains-newline.js
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.0/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js
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.0/node_modules/yaml/browser/dist/compose/util-map-includes.js
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.0/node_modules/yaml/browser/dist/compose/resolve-block-map.js
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.0/node_modules/yaml/browser/dist/compose/resolve-block-seq.js
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.0/node_modules/yaml/browser/dist/compose/resolve-end.js
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.0/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js
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.0/node_modules/yaml/browser/dist/compose/compose-collection.js
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.0/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js
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.0/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js
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 foldLines(source);
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 foldLines(source.slice(1, -1)).replace(/''/g, "'");
5407
+ return unfoldLines(source.slice(1, -1)).replace(/''/g, "'");
5457
5408
  }
5458
- function foldLines(source) {
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 lookbehind here and in the `re` RegExp is to
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, which doesn't support this yet:
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 first, line;
5420
+ let trimEnd, trimBoth;
5467
5421
  try {
5468
- first = /* @__PURE__ */ new RegExp("(.*?)(?<![ ])[ ]*\r?\n", "sy");
5469
- line = /* @__PURE__ */ new RegExp("[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?\n", "sy");
5422
+ trimEnd = /* @__PURE__ */ new RegExp("(?<![ ])[ ]+$");
5423
+ trimBoth = /* @__PURE__ */ new RegExp("^[ ]+|(?<![ ])[ ]+$", "g");
5470
5424
  } catch {
5471
- first = /(.*?)[ \t]*\r?\n/sy;
5472
- line = /[ \t]*(.*?)[ \t]*\r?\n/sy;
5425
+ trimEnd = /[ \t]+$/;
5426
+ trimBoth = /^[ \t]+|[ \t]+$/g;
5473
5427
  }
5474
- let match = first.exec(source);
5475
- if (!match) return source;
5476
- let res = match[1];
5428
+ let res = match[1].replace(trimEnd, "");
5477
5429
  let sep = " ";
5478
- let pos = first.lastIndex;
5479
- line.lastIndex = pos;
5430
+ let pos = line.lastIndex;
5480
5431
  while (match = line.exec(source)) {
5481
- if (match[1] === "") {
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 + match[1];
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.0/node_modules/yaml/browser/dist/compose/compose-scalar.js
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.0/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js
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.0/node_modules/yaml/browser/dist/compose/compose-node.js
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.0/node_modules/yaml/browser/dist/compose/compose-doc.js
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.0/node_modules/yaml/browser/dist/compose/composer.js
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.0/node_modules/yaml/browser/dist/parse/cst-visit.js
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.0/node_modules/yaml/browser/dist/parse/lexer.js
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.0/node_modules/yaml/browser/dist/parse/line-counter.js
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.0/node_modules/yaml/browser/dist/parse/parser.js
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.0/node_modules/yaml/browser/dist/public-api.js
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
- if (document.errors.length > 0) throw new Error(document.errors[0].message);
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, String(value));
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(reason instanceof Error ? reason.message : String(reason));
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(`⚠ ${reason instanceof Error ? reason.message : String(reason)}`);
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(reason instanceof Error ? reason.message : String(reason));
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 || detail.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", {
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: detail.surfaceToggles[key],
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", { className: market_module_default.sidebarEmpty }, "—") : detail.skills.map((skill) => (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", { className: market_module_default.sidebarEmpty }, "—") : detail.mcpServers.map((server) => {
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", { className: market_module_default.sidebarEmpty }, "—") : detail.commands.map((command) => (0, react.createElement)(PreviewRow, {
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", { className: market_module_default.sidebarEmpty }, "—") : detail.agents.map((agent) => (0, react.createElement)(PreviewRow, {
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", { className: market_module_default.sidebarEmpty }, "—") : detail.hooks.entries.map((hook, index) => (0, react.createElement)(PreviewRow, {
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", { className: market_module_default.sidebarEmpty }, "—") : [...detail.lsp.servers.map((server) => (0, react.createElement)(PreviewRow, {
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 surface shell (title +
7988
- * actions + toolbar + scrollable content region), the busy indicator, the
7989
- * entry editor modal, the danger-confirm modal, and the source badge. The
7990
- * pieces are intentionally small and prop-driven so a panel composes them
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(reason instanceof Error ? reason.message : String(reason)));
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: props.state.title,
8134
- description: props.state.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(props.state.onConfirm(checked)).then(() => props.onClose());
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, credentials, mode = "settings" }) {
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")}: ${error instanceof Error ? error.message : String(error)}`
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")}: ${error instanceof Error ? error.message : String(error)}`
8489
+ message: `${t("actionFail")}: ${clientErrorMessage(t, error)}`
8521
8490
  });
8522
8491
  setProgress({
8523
8492
  step: void 0,
8524
- error: error instanceof Error ? error.message : String(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: async (id) => {
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(String(config.type))) return false;
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 config;
8570
+ let parsed;
8602
8571
  let parseError;
8603
8572
  try {
8604
- config = parseServerConfig(props.text);
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 = String(config?.type ?? "stdio");
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(reason instanceof Error ? reason.message : String(reason));
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(reason instanceof Error ? reason.message : String(reason));
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(reason instanceof Error ? reason.message : String(reason));
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(reason instanceof Error ? reason.message : String(reason));
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
- "retrySpinner": "AUWlZW_retrySpinner",
9152
- "retryStack": "AUWlZW_retryStack",
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(caught instanceof Error ? caught.message : String(caught));
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
- "plugin",
9272
- "direct"
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 chip per non-healthy state, shown only when that state is non-zero.
9233
+ * One inventory row: state dot, server name, tool count, and endpoint.
9320
9234
  *
9321
- * The chips are ordered by severity so the first one the eye lands on is the
9322
- * state that most needs attention, and the whole bar collapses to a single
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") + ": " + (reason instanceof Error ? reason.message : String(reason))
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 }, [entry.kind === "plugin" ? `${t("mcpPlugin")}: ${entry.suiteId ?? entry.source ?? "—"}` : t("mcpDirect"), entry.transport].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, {
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(caught instanceof Error ? caught.message : String(caught))).finally(() => setBusy(false));
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 summary chips, cards, and state pills from mcp-status.module.css.
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(caught instanceof Error ? caught.message : String(caught));
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 needle = search.trim().toLowerCase();
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: FILTER_KEYS.map((key) => ({
9598
+ filters: LSP_FILTERS.map((key) => ({
9646
9599
  id: key,
9647
9600
  label: t(FILTER_LABEL_KEYS[key]),
9648
- count: counts[key] ?? 0,
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: FILTER_HINT_KEYS[key] === void 0 ? void 0 : t(FILTER_HINT_KEYS[key])
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")) : visible.length === 0 ? (0, react.createElement)("div", { className: mcp_status_module_default.empty }, t("lspEmpty")) : (0, react.createElement)(ResourceCollection, {
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
- }, [...visible].sort((left, right) => severity(left) - severity(right)).map((entry) => (0, react.createElement)(LspRow, {
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(reason instanceof Error ? reason.message : String(reason));
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, plus a warning
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, ["tools"].map((key) => (0, react.createElement)("label", {
9965
- className: panel_module_default.editorLabel,
9966
- key
9967
- }, props.t("personaTools"), (0, react.createElement)("input", {
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(reason instanceof Error ? reason.message : String(reason));
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(reason instanceof Error ? reason.message : String(reason));
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
- }))), props.hint === void 0 ? null : (0, react.createElement)("p", { className: panel_module_default.editorHint }, props.hint)), (0, react.createElement)(EntryEditorModal, {
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(cause instanceof Error ? cause.message : String(cause));
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 }, enhanced ? t("mcpCardDescOn") : t("mcpCardDescOff"))), (0, react.createElement)(ToggleSwitch, {
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(cause instanceof Error ? cause.message : String(cause));
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(cause instanceof Error ? cause.message : String(cause));
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 }, scope.feedbackEnabled() ? t("feedbackToggleDescOn") : t("feedbackToggleDescOff"))), (0, react.createElement)(ToggleSwitch, {
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(cause instanceof Error ? cause.message : String(cause));
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 = market_module_default.pageView;
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 = market_module_default.pageEntry;
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 !== false,
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
  })));