@dawn0608/dsh-mcp-manager 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -11
- package/README.zh.md +15 -11
- package/icon.svg +5 -6
- package/lib/client.js +10 -24
- package/lib/client.js.map +2 -2
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
# MCP Management
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[中文](README.zh.md) | English
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
In DeepSeek Harness, open **Settings → MCP Management** to see the servers configured in the current profile's user patch. Each row shows the server name, transport (STDIO or Streamable HTTP), and whether the server is enabled.
|
|
6
|
+
|
|
7
|
+
## Manage servers
|
|
8
|
+
|
|
9
|
+
- Use the switch on an editable row to enable or disable the server. The switch updates the row's `disabled` setting, and Harness hot reloads the change.
|
|
10
|
+
- Add, edit, or remove servers in the profile's `cordis.patch.yml`. You can give your assistant the provider's setup instructions and ask it to edit that file. The panel refreshes while it is open.
|
|
11
|
+
- Rows outside a top-level `insert` list, with missing or duplicate IDs, with conditional `disabled` values, or with another unsupported shape are read-only. The panel also flags duplicate server names.
|
|
8
12
|
|
|
9
13
|
## Credentials
|
|
10
14
|
|
|
@@ -21,6 +25,8 @@ References resolve against the Harness process environment.
|
|
|
21
25
|
|
|
22
26
|
## Install
|
|
23
27
|
|
|
28
|
+
Requires DeepSeek Harness `>=0.2.2-rc.1 <0.3.0`.
|
|
29
|
+
|
|
24
30
|
In Desktop, open **Plugins → Add plugin** and enter `@dawn0608/dsh-mcp-manager`. For a CLI-managed profile, run:
|
|
25
31
|
|
|
26
32
|
```bash
|
|
@@ -32,8 +38,8 @@ You can also download the `.tgz` from [GitHub Releases](https://github.com/dawn0
|
|
|
32
38
|
To install from source, build from the repository root:
|
|
33
39
|
|
|
34
40
|
```bash
|
|
35
|
-
npm
|
|
36
|
-
npm run build
|
|
41
|
+
npm ci
|
|
42
|
+
npm run build --workspace @dawn0608/dsh-mcp-manager
|
|
37
43
|
```
|
|
38
44
|
|
|
39
45
|
Then select the local `plugins/mcp-manager` directory in the plugin picker. If an older installation is present, remove it before switching installation sources. Open **Settings → MCP Management** after installation and restart Harness if prompted.
|
|
@@ -53,11 +59,7 @@ Use `patchPath` only for a non-standard profile layout; the default derives from
|
|
|
53
59
|
|
|
54
60
|
## Limitations
|
|
55
61
|
|
|
56
|
-
|
|
57
|
-
- Rows must sit in a top-level `insert` list, carry a unique id, and use a boolean `disabled`; entries that cannot be safely toggled are shown as read-only.
|
|
58
|
-
- The list flags duplicate names in the same file.
|
|
59
|
-
- Rows using `!!js`, `headers`, or a non-portable environment are skipped by the three-end synchronizer by design: credentials stay local.
|
|
60
|
-
- `yaml` is used at build time and inlined into `lib/index.js`, so the runtime has no extra dependency; see the upstream `eemeli/yaml` repository for its ISC license.
|
|
62
|
+
The panel manages the current profile's user patch. Bundle-provided services, other profiles, and the Codex and Claude Code configurations are managed separately.
|
|
61
63
|
|
|
62
64
|
## Development
|
|
63
65
|
|
|
@@ -66,6 +68,8 @@ npm test # builds first; covers patch editing, validation, references,
|
|
|
66
68
|
npm run verify # from the repository root
|
|
67
69
|
```
|
|
68
70
|
|
|
71
|
+
The host bundle includes the ISC-licensed `yaml` dependency. [Upstream license](https://github.com/eemeli/yaml/blob/main/LICENSE)
|
|
72
|
+
|
|
69
73
|
## License
|
|
70
74
|
|
|
71
75
|
MIT
|
package/README.zh.md
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
# MCP 管理
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](README.md) | 中文
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
在 DeepSeek Harness 打开「设置 → MCP 管理」,查看当前 profile 用户补丁中的 MCP 服务。每行显示服务名、传输方式(STDIO 或 Streamable HTTP)和启用状态。
|
|
6
|
+
|
|
7
|
+
## 管理服务
|
|
8
|
+
|
|
9
|
+
- 用可编辑条目上的开关启停服务。开关更新条目的 `disabled` 设置,Harness 会热加载变更。
|
|
10
|
+
- 在当前 profile 的 `cordis.patch.yml` 中添加、编辑或删除服务。也可把服务提供方的安装说明交给 AI,请它修改该文件。面板打开时会自动刷新。
|
|
11
|
+
- 顶层 `insert` 列表之外的条目、缺少 ID 或 ID 重复的条目、使用条件式 `disabled` 的条目,以及其他无法安全修改的条目均为只读。面板也会标出同名服务。
|
|
8
12
|
|
|
9
13
|
## 凭据
|
|
10
14
|
|
|
@@ -21,6 +25,8 @@ headers:
|
|
|
21
25
|
|
|
22
26
|
## 安装
|
|
23
27
|
|
|
28
|
+
适用于 DeepSeek Harness `>=0.2.2-rc.1 <0.3.0`。
|
|
29
|
+
|
|
24
30
|
在 Desktop 打开「插件 → 添加插件」,输入 `@dawn0608/dsh-mcp-manager`。通过 CLI 管理 profile 时,可运行以下命令。
|
|
25
31
|
|
|
26
32
|
```bash
|
|
@@ -32,8 +38,8 @@ dsh plugin --profile <profile> add @dawn0608/dsh-mcp-manager
|
|
|
32
38
|
从源码安装时,在仓库根目录构建。
|
|
33
39
|
|
|
34
40
|
```bash
|
|
35
|
-
npm
|
|
36
|
-
npm run build
|
|
41
|
+
npm ci
|
|
42
|
+
npm run build --workspace @dawn0608/dsh-mcp-manager
|
|
37
43
|
```
|
|
38
44
|
|
|
39
45
|
构建完成后,通过本地包入口选择 `plugins/mcp-manager`。切换安装来源时,先移除已有安装。安装后打开「设置 → MCP 管理」,按应用提示重启。
|
|
@@ -53,11 +59,7 @@ npm run build
|
|
|
53
59
|
|
|
54
60
|
## 限制
|
|
55
61
|
|
|
56
|
-
|
|
57
|
-
- 行必须位于顶层 `insert` 列表、id 唯一、`disabled` 为布尔值;无法安全启停的条目显示为只读。
|
|
58
|
-
- 列表会标出同一文件内的重名服务。
|
|
59
|
-
- 带 `!!js`、`headers` 或非可移植环境的条目会被三端同步器标记为 skipped,这是有意为之:凭据留在本机。
|
|
60
|
-
- `yaml` 仅在构建时使用并内联进 `lib/index.js`,运行期没有额外依赖;其 ISC 许可证见上游仓库 `eemeli/yaml`。
|
|
62
|
+
面板管理当前 profile 的用户补丁。bundle 自带服务、其他 profile 以及 Codex 和 Claude Code 的配置各自独立管理。
|
|
61
63
|
|
|
62
64
|
## 开发
|
|
63
65
|
|
|
@@ -66,6 +68,8 @@ npm test # 含构建;单元测试覆盖补丁编辑、校验、引用
|
|
|
66
68
|
npm run verify # 仓库根目录
|
|
67
69
|
```
|
|
68
70
|
|
|
71
|
+
Host 构建产物内联了采用 ISC 许可证的 `yaml` 依赖。[上游许可证](https://github.com/eemeli/yaml/blob/main/LICENSE)
|
|
72
|
+
|
|
69
73
|
## 许可证
|
|
70
74
|
|
|
71
75
|
MIT
|
package/icon.svg
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
<circle cx="
|
|
5
|
-
<circle cx="
|
|
6
|
-
<circle cx="32" cy="42" r="5" fill="#ffffff"/>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="36" height="36">
|
|
2
|
+
<path d="M15 9v4m6-4v4M13 13h10v2a5 5 0 0 1-10 0zM18 20v4m-8 2v-2h16v2"
|
|
3
|
+
fill="none" stroke="#527ee8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<circle cx="10" cy="26" r="2" fill="#527ee8"/>
|
|
5
|
+
<circle cx="26" cy="26" r="2" fill="#527ee8"/>
|
|
7
6
|
</svg>
|
package/lib/client.js
CHANGED
|
@@ -41,6 +41,9 @@ module.exports = __toCommonJS(index_exports);
|
|
|
41
41
|
var React3 = __toESM(require("react"), 1);
|
|
42
42
|
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
43
43
|
|
|
44
|
+
// icon.svg
|
|
45
|
+
var icon_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="36" height="36">%0A <path d="M15 9v4m6-4v4M13 13h10v2a5 5 0 0 1-10 0zM18 20v4m-8 2v-2h16v2"%0A fill="none" stroke="%23527ee8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>%0A <circle cx="10" cy="26" r="2" fill="%23527ee8"/>%0A <circle cx="26" cy="26" r="2" fill="%23527ee8"/>%0A</svg>%0A';
|
|
46
|
+
|
|
44
47
|
// src/client/i18n.js
|
|
45
48
|
var NS = "mcpManager";
|
|
46
49
|
var DICTS = {
|
|
@@ -533,34 +536,17 @@ function createPage(options) {
|
|
|
533
536
|
}
|
|
534
537
|
|
|
535
538
|
// src/client/style.css
|
|
536
|
-
var style_default = "/* Match the host's settings typography, controls and surfaces. */\n\n.dshmcp_page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n min-width: 0;\n padding-top: 16px;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 22px;\n}\n\n.dshmcp_title {\n min-width: 0;\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_group {\n box-sizing: border-box;\n min-width: 0;\n margin: 0;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.dshmcp_rows {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.dshmcp_row,\n.dshmcp_skeletonRow {\n padding-block: 10px;\n}\n\n.dshmcp_row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(36px, max-content);\n align-items: center;\n gap: 2px 12px;\n}\n\n.dshmcp_row + .dshmcp_row,\n.dshmcp_skeletonRow + .dshmcp_skeletonRow {\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.dshmcp_identity {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 8px;\n min-width: 0;\n}\n\n.dshmcp_name {\n min-width: 0;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport,\n.dshmcp_reason {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport {\n white-space: nowrap;\n}\n\n/* Composite the native off track over the same base surface as the Plugins page. */\n.dshmcp_switch[aria-checked='false'] {\n background-color: var(--dsw-alias-bg-base);\n background-image: linear-gradient(var(--dsw-alias-border-l3), var(--dsw-alias-border-l3));\n}\n\n.dshmcp_reason {\n grid-column: 1 / -1;\n}\n\n.dshmcp_notice,\n.dshmcp_hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_notice_error {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.dshmcp_hint {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.dshmcp_messagePanel {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 16px;\n}\n\n.dshmcp_messageTitle {\n margin: 0;\n font-weight: 500;\n}\n\n.dshmcp_skeletonRow {\n display: grid;\n align-items: center;\n min-height: 22px;\n}\n\n.dshmcp_skeletonLine {\n display: block;\n height: 12px;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-skeleton);\n}\n\n.dshmcp_skeletonLine[data-w='34'] { width: 34%; }\n.dshmcp_skeletonLine[data-w='46'] { width: 46%; }\n\n@media (prefers-reduced-motion: no-preference) {\n .dshmcp_skeletonLine {\n animation: dshmcp-pulse 1.6s ease-in-out infinite;\n }\n}\n\n@keyframes dshmcp-pulse {\n 50% { opacity: 0.55; }\n}\n";
|
|
539
|
+
var style_default = "/* Match the host's settings typography, controls and surfaces. */\n\n.dshmcp_navIcon {\n display: inline-block;\n flex-shrink: 0;\n background-color: currentColor;\n mask-position: center;\n mask-repeat: no-repeat;\n mask-size: 150%;\n}\n\n.dshmcp_page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n min-width: 0;\n padding-top: 16px;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 22px;\n}\n\n.dshmcp_title {\n min-width: 0;\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_group {\n box-sizing: border-box;\n min-width: 0;\n margin: 0;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.dshmcp_rows {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.dshmcp_row,\n.dshmcp_skeletonRow {\n padding-block: 10px;\n}\n\n.dshmcp_row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(36px, max-content);\n align-items: center;\n gap: 2px 12px;\n}\n\n.dshmcp_row + .dshmcp_row,\n.dshmcp_skeletonRow + .dshmcp_skeletonRow {\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.dshmcp_identity {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 8px;\n min-width: 0;\n}\n\n.dshmcp_name {\n min-width: 0;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport,\n.dshmcp_reason {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport {\n white-space: nowrap;\n}\n\n/* Composite the native off track over the same base surface as the Plugins page. */\n.dshmcp_switch[aria-checked='false'] {\n background-color: var(--dsw-alias-bg-base);\n background-image: linear-gradient(var(--dsw-alias-border-l3), var(--dsw-alias-border-l3));\n}\n\n.dshmcp_reason {\n grid-column: 1 / -1;\n}\n\n.dshmcp_notice,\n.dshmcp_hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_notice_error {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.dshmcp_hint {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.dshmcp_messagePanel {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 16px;\n}\n\n.dshmcp_messageTitle {\n margin: 0;\n font-weight: 500;\n}\n\n.dshmcp_skeletonRow {\n display: grid;\n align-items: center;\n min-height: 22px;\n}\n\n.dshmcp_skeletonLine {\n display: block;\n height: 12px;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-skeleton);\n}\n\n.dshmcp_skeletonLine[data-w='34'] { width: 34%; }\n.dshmcp_skeletonLine[data-w='46'] { width: 46%; }\n\n@media (prefers-reduced-motion: no-preference) {\n .dshmcp_skeletonLine {\n animation: dshmcp-pulse 1.6s ease-in-out infinite;\n }\n}\n\n@keyframes dshmcp-pulse {\n 50% { opacity: 0.55; }\n}\n";
|
|
537
540
|
|
|
538
541
|
// src/client/index.js
|
|
539
542
|
var h3 = React3.createElement;
|
|
540
543
|
function McpIcon({ size = 18, active = false } = {}) {
|
|
541
|
-
return h3(
|
|
542
|
-
"
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
viewBox: "0 0 24 24",
|
|
548
|
-
fill: "none",
|
|
549
|
-
"aria-hidden": true,
|
|
550
|
-
focusable: false,
|
|
551
|
-
"data-active": active ? "true" : void 0
|
|
552
|
-
},
|
|
553
|
-
h3("path", {
|
|
554
|
-
d: "M7.8 9.2 11 15.2M16.2 9.2 13 15.2M9.4 7h5.2",
|
|
555
|
-
stroke: "currentColor",
|
|
556
|
-
strokeWidth: 1.5,
|
|
557
|
-
strokeLinecap: "round",
|
|
558
|
-
strokeLinejoin: "round"
|
|
559
|
-
}),
|
|
560
|
-
h3("circle", { cx: 6.4, cy: 6.8, r: 2.2, stroke: "currentColor", strokeWidth: 1.5 }),
|
|
561
|
-
h3("circle", { cx: 17.6, cy: 6.8, r: 2.2, stroke: "currentColor", strokeWidth: 1.5 }),
|
|
562
|
-
h3("circle", { cx: 12, cy: 17.4, r: 2.2, stroke: "currentColor", strokeWidth: 1.5 })
|
|
563
|
-
);
|
|
544
|
+
return h3("span", {
|
|
545
|
+
className: "dshmcp_navIcon",
|
|
546
|
+
"aria-hidden": true,
|
|
547
|
+
"data-active": active ? "true" : void 0,
|
|
548
|
+
style: { width: size, height: size, maskImage: `url(${JSON.stringify(icon_default)})` }
|
|
549
|
+
});
|
|
564
550
|
}
|
|
565
551
|
var inject = ["slots", "locale"];
|
|
566
552
|
function apply(ctx) {
|
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/index.js", "../src/client/i18n.js", "../src/client/page.js", "../src/client/api.js", "../src/client/controller.js", "../src/client/row.js", "../src/client/model.js", "../src/client/style.css"],
|
|
4
|
-
"sourcesContent": ["/**\n * Client half: the MCP settings section, its navigation icon, and the one slot\n * registration that places it beside the shipped Settings pages.\n */\n\nimport * as React from 'react';\nimport { Switch, Tag } from '@deepseek-ai/dsh-client-ui-primitives';\nimport { createTranslator, registerLocale } from './i18n.js';\nimport { createPage } from './page.js';\nimport css from './style.css';\n\nconst h = React.createElement;\n\nfunction McpIcon({ size = 18, active = false } = {}) {\n return h('svg', {\n className: 'dshmcp_navIcon',\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n 'aria-hidden': true,\n focusable: false,\n 'data-active': active ? 'true' : undefined,\n },\n h('path', {\n d: 'M7.8 9.2 11 15.2M16.2 9.2 13 15.2M9.4 7h5.2',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }),\n h('circle', { cx: 6.4, cy: 6.8, r: 2.2, stroke: 'currentColor', strokeWidth: 1.5 }),\n h('circle', { cx: 17.6, cy: 6.8, r: 2.2, stroke: 'currentColor', strokeWidth: 1.5 }),\n h('circle', { cx: 12, cy: 17.4, r: 2.2, stroke: 'currentColor', strokeWidth: 1.5 }),\n );\n}\n\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n registerLocale(ctx);\n\n ctx.effect(() => {\n const tag = document.createElement('style');\n tag.dataset.plugin = '@dawn0608/dsh-mcp-manager';\n tag.textContent = css;\n document.head.appendChild(tag);\n return () => {\n tag.remove();\n };\n }, 'mcp-manager: styles');\n\n const translate = createTranslator(ctx);\n const subscribeLocale = listener => ctx.locale.subscribe(listener);\n const localeVersion = () => {\n try {\n const snapshot = ctx.locale.getSnapshot();\n return typeof snapshot.revision === 'number' ? snapshot.revision : 0;\n } catch (error) {\n return 0;\n }\n };\n const Page = createPage({ translate, subscribeLocale, localeVersion, Switch, Tag });\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'mcp-manager',\n order: 17,\n label: () => translate('title'),\n }, Page));\n\n ctx.slots.inject('settings.section.icon', () => ctx.slots.register({\n name: 'settings.section.icon',\n id: 'mcp-manager',\n order: 17,\n }, McpIcon));\n}\n", "/** Client dictionaries and the locale-service binding for the MCP settings page. */\n\nexport const NS = 'mcpManager';\n\nexport const DICTS = {\n zh: {\n title: 'MCP \u7BA1\u7406',\n loadFailed: '\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25',\n emptyTitle: '\u8FD8\u6CA1\u6709 MCP \u670D\u52A1',\n duplicate: '\u91CD\u540D',\n duplicateHint: '\u540C\u4E00\u670D\u52A1\u540D\u51FA\u73B0\u591A\u6B21\uFF0CHarness \u53EA\u4F1A\u52A0\u8F7D\u5176\u4E2D\u4E00\u4E2A\u3002',\n readOnly: '\u53EA\u8BFB',\n readOnlyFailure: '\u8BE5\u6761\u76EE\u4E3A\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u5728\u9762\u677F\u4E2D\u4FEE\u6539\u3002',\n unknownName: '\u672A\u547D\u540D\u6761\u76EE',\n readOnlyNotInsert: '\u8BE5 MCP \u6761\u76EE\u4E0D\u5728 insert \u5217\u8868\u4E2D\u3002',\n readOnlyBlockShape: '\u6240\u5728\u7684 patch \u5757\u5305\u542B\u5176\u4ED6\u5B57\u6BB5\u3002',\n readOnlyRowShape: '\u6761\u76EE\u5305\u542B\u9762\u677F\u4E0D\u652F\u6301\u7684\u5B57\u6BB5\u3002',\n readOnlyMissingId: '\u6761\u76EE\u7F3A\u5C11 id\u3002',\n readOnlyDuplicateId: '\u6761\u76EE id \u91CD\u590D\u6216\u88AB\u8986\u76D6\u3002',\n readOnlyConditional: '\u542F\u7528\u72B6\u6001\u662F\u6761\u4EF6\u8868\u8FBE\u5F0F\u3002',\n readOnlyMissingName: '\u6761\u76EE\u7F3A\u5C11 serverName\u3002',\n readOnlyConfig: '\u914D\u7F6E\u7ED3\u6784\u4E0D\u53D7\u652F\u6301\u3002',\n readOnlyConfigEnabled: '\u6761\u76EE\u5728 config \u4E2D\u4F7F\u7528\u4E86 enabled\uFF0C\u65E0\u6CD5\u5B89\u5168\u6539\u5199\u3002',\n transportStdio: 'STDIO',\n transportHttp: 'Streamable HTTP',\n switchLabel: '\u542F\u7528 {name}',\n saving: '\u6B63\u5728\u4FDD\u5B58\u2026',\n invalid: '\u8BF7\u6C42\u65E0\u6548\u3002',\n internal: '\u64CD\u4F5C\u672A\u5B8C\u6210\uFF0C\u8BF7\u67E5\u770B Harness \u65E5\u5FD7\u3002',\n conflict: '\u914D\u7F6E\u6587\u4EF6\u5DF2\u88AB\u5176\u4ED6\u7A0B\u5E8F\u4FEE\u6539\uFF0C\u5DF2\u5237\u65B0\u5217\u8868\uFF0C\u8BF7\u91CD\u8BD5\u3002',\n locked: '\u914D\u7F6E\u6587\u4EF6\u6B63\u88AB\u5176\u4ED6\u64CD\u4F5C\u5360\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002',\n profileUnavailable: '\u65E0\u6CD5\u5B9A\u4F4D\u6216\u8BFB\u5199\u5F53\u524D profile \u8865\u4E01\u6587\u4EF6\u3002',\n network: '\u65E0\u6CD5\u8FDE\u63A5 Harness\u3002',\n unauthorized: '\u5F53\u524D\u9875\u9762\u6CA1\u6709\u8BBF\u95EE Host \u7684\u6743\u9650\u3002',\n },\n};\n\nDICTS.en = {\n title: 'MCP Management',\n loadFailed: 'Could not read the configuration',\n emptyTitle: 'No MCP servers yet',\n duplicate: 'Duplicate name',\n duplicateHint: 'The same server name appears more than once; Harness loads only one of them.',\n readOnly: 'Read-only',\n readOnlyFailure: 'This entry is read-only and cannot be changed from the panel.',\n unknownName: 'Unnamed entry',\n readOnlyNotInsert: 'This MCP entry is outside an insert list.',\n readOnlyBlockShape: 'Its patch block contains other fields.',\n readOnlyRowShape: 'The entry contains fields this panel does not manage.',\n readOnlyMissingId: 'The entry has no id.',\n readOnlyDuplicateId: 'The entry id is duplicated or overridden.',\n readOnlyConditional: 'Enablement is a conditional expression.',\n readOnlyMissingName: 'The entry has no serverName.',\n readOnlyConfig: 'The configuration shape is unsupported.',\n readOnlyConfigEnabled: 'The entry uses enabled inside config and cannot be rewritten safely.',\n transportStdio: 'STDIO',\n transportHttp: 'Streamable HTTP',\n switchLabel: 'Enable {name}',\n saving: 'Saving\u2026',\n invalid: 'The request is invalid.',\n internal: 'The operation did not complete; check the Harness logs.',\n conflict: 'The configuration changed on disk. The list was refreshed; try again.',\n locked: 'The profile is being written by another operation. Try again shortly.',\n profileUnavailable: 'The profile patch for this desktop profile cannot be located or written.',\n network: 'Could not reach Harness.',\n unauthorized: 'This page is not authorized to call the Host.',\n};\n\n/** Interpolate `{name}` placeholders without depending on the locale service. */\nexport function format(template, params) {\n return String(template).replace(/\\{(\\w+)\\}/g, (match, key) =>\n params && Object.prototype.hasOwnProperty.call(params, key) ? String(params[key]) : match);\n}\n\n/** Register both dictionaries under the plugin namespace; safe when locale is unavailable. */\nexport function registerLocale(ctx) {\n return ctx.effect(() => {\n try {\n return ctx.locale.register(NS, DICTS);\n } catch (error) {\n return () => {};\n }\n }, 'mcp-manager: dictionaries');\n}\n\n/** Resolve the active language through the locale service, falling back to English. */\nexport function createTranslator(ctx) {\n let bound;\n try {\n bound = ctx.locale.bind(NS);\n } catch (error) {\n bound = null;\n }\n const fallback = () => {\n let active = 'en';\n try {\n active = ctx.locale.getSnapshot().active || 'en';\n } catch (error) {\n active = 'en';\n }\n return String(active).toLowerCase().startsWith('zh') ? DICTS.zh : DICTS.en;\n };\n return (key, params) => {\n let text;\n if (bound !== null) {\n try {\n text = bound(key, params);\n } catch (error) {\n text = undefined;\n }\n }\n if (typeof text !== 'string' || text === key) {\n const dict = fallback();\n text = format(dict[key] !== undefined ? dict[key] : DICTS.en[key], params);\n }\n return text;\n };\n}\n", "/** The MCP management page: service status and enablement. */\n\nimport * as React from 'react';\nimport { createController } from './controller.js';\nimport { ServerRow } from './row.js';\n\nconst h = React.createElement;\n\nconst CODE_KEYS = {\n conflict: 'conflict',\n locked: 'locked',\n 'profile-unavailable': 'profileUnavailable',\n network: 'network',\n unauthorized: 'unauthorized',\n 'read-only': 'readOnlyFailure',\n 'not-found': 'conflict',\n 'parse-failed': 'loadFailed',\n 'verify-failed': 'internal',\n 'write-failed': 'internal',\n invalid: 'invalid',\n internal: 'internal',\n};\n\nfunction failureText(translate, failure) {\n const key = CODE_KEYS[(failure && failure.code) || 'internal'] || 'internal';\n return translate(key, failure && failure.params ? failure.params : undefined);\n}\n\nfunction Notice({ children }) {\n return h('p', { className: 'dshmcp_notice dshmcp_notice_error', role: 'alert' }, children);\n}\n\nfunction Skeleton() {\n return h('div', { className: 'dshmcp_rows', 'aria-hidden': true },\n h('div', { className: 'dshmcp_skeletonRow' },\n h('span', { className: 'dshmcp_skeletonLine', 'data-w': '34' }),\n ),\n h('div', { className: 'dshmcp_skeletonRow' },\n h('span', { className: 'dshmcp_skeletonLine', 'data-w': '46' }),\n ),\n );\n}\n\nclass Boundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { failed: false };\n }\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n render() {\n if (this.state.failed) return h('p', { className: 'dshmcp_notice dshmcp_notice_error' }, this.props.fallback);\n return this.props.children;\n }\n}\n\n/**\n * @param {{translate: (key: string, params?: object) => string, subscribeLocale: (listener: () => void) => () => void, localeVersion: () => number, Switch: React.ComponentType<{className?: string, checked: boolean, label: string, disabled: boolean, onChange: (checked: boolean) => void}>, Tag: React.ComponentType<{tone: 'neutral' | 'warning', children: React.ReactNode}>, createStore?: () => ReturnType<typeof createController>}} options\n */\nexport function createPage(options) {\n const { translate, subscribeLocale, localeVersion, Switch, Tag } = options;\n const createStore = options.createStore || createController;\n\n function Page() {\n const storeRef = React.useRef(null);\n if (storeRef.current === null) storeRef.current = createStore();\n const store = storeRef.current;\n const snapshot = React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n React.useSyncExternalStore(subscribeLocale, localeVersion, localeVersion);\n\n const servers = snapshot.state && Array.isArray(snapshot.state.servers) ? snapshot.state.servers : [];\n const { busy, action } = snapshot;\n const loading = snapshot.state === null && snapshot.status !== 'error';\n const loadFailure = snapshot.error ? failureText(translate, snapshot.error) : null;\n const actionServer = action && servers.find(server => server.id === action.id && server.name === action.name);\n const actionFailureText = action?.error ? failureText(translate, action.error) : null;\n\n React.useEffect(() => {\n store.start();\n return () => store.stop();\n }, [store]);\n\n return h('section', {\n className: 'dshmcp_page',\n 'aria-labelledby': 'dshmcp-title',\n 'aria-busy': loading ? 'true' : undefined,\n },\n h('h2', { className: 'dshmcp_title', id: 'dshmcp-title' }, translate('title')),\n loading ? h(Skeleton) : null,\n loadFailure && snapshot.state === null\n ? h('div', { className: 'dshmcp_group dshmcp_messagePanel', role: 'alert' },\n h('p', { className: 'dshmcp_messageTitle' }, translate('loadFailed')),\n loadFailure === translate('loadFailed') ? null : h('p', { className: 'dshmcp_hint' }, loadFailure),\n )\n : null,\n snapshot.state !== null\n ? h(React.Fragment, null,\n loadFailure ? h(Notice, null, loadFailure) : null,\n actionFailureText && !actionServer ? h(Notice, null, action.name, ' \u2014 ', actionFailureText) : null,\n servers.length > 0\n ? h('ul', { className: 'dshmcp_rows', role: 'list' },\n servers.map((server, index) => h(ServerRow, {\n key: server.editable ? `service:${server.id}` : `readonly:${index}`,\n server,\n Switch,\n Tag,\n translate,\n busy,\n saving: busy && server === actionServer,\n failure: server === actionServer ? actionFailureText : null,\n onToggle: store.setEnabled,\n })),\n )\n : h('div', { className: 'dshmcp_group dshmcp_messagePanel' },\n h('p', { className: 'dshmcp_messageTitle' }, translate('emptyTitle')),\n ),\n )\n : null,\n );\n }\n\n function SafePage() {\n return h(Boundary, { fallback: translate('internal') }, h(Page));\n }\n SafePage.displayName = 'McpManagerPage';\n\n return SafePage;\n}\n", "/** Browser transport for the settings API. */\n\nconst CONNECTION_PATH = 'api/mcp-manager';\nconst PLAIN_PATH = '/plugin/mcp-manager';\n\nexport class ApiError extends Error {\n constructor(code, status) {\n super(code);\n this.name = 'ApiError';\n this.code = code;\n this.status = status;\n }\n}\n\nfunction streamOrigin() {\n const transport = globalThis.window && globalThis.window.__DSH_TRANSPORT__;\n if (!transport || typeof transport.streamBaseUrl !== 'string' || transport.streamBaseUrl === '') return undefined;\n try {\n const url = new URL(transport.streamBaseUrl, globalThis.location && globalThis.location.href);\n return `${url.protocol === 'wss:' ? 'https:' : url.protocol === 'ws:' ? 'http:' : url.protocol}//${url.host}`;\n } catch {\n return undefined;\n }\n}\n\nfunction documentBase() {\n const location = globalThis.location;\n if (!location || (location.protocol !== 'http:' && location.protocol !== 'https:')) return undefined;\n return location.origin;\n}\n\n/** Candidate URLs, most specific first. Writes stay on the authenticated channel. */\nexport function candidatesFor(method) {\n const urls = [];\n if (method !== 'POST') {\n const stream = streamOrigin();\n if (stream) urls.push(`${stream}${PLAIN_PATH}`);\n const document = documentBase();\n if (document) urls.push(`${document}${PLAIN_PATH}`);\n }\n urls.push(CONNECTION_PATH);\n if (method === 'POST') {\n const document = documentBase();\n if (document) urls.push(`${document}${PLAIN_PATH}`);\n }\n return urls.filter((value, index) => urls.indexOf(value) === index);\n}\n\nfunction isResult(payload) {\n return Boolean(payload) && typeof payload === 'object' && typeof payload.ok === 'boolean';\n}\n\n/**\n * @param {{method?: string, body?: unknown, signal?: AbortSignal, fetchImpl?: typeof fetch}} request\n * @returns {Promise<{status: number, payload: object}>}\n */\nexport async function request(input) {\n const method = input.method || 'GET';\n const fetchImpl = input.fetchImpl || globalThis.fetch;\n const headers = { accept: 'application/json' };\n let body;\n if (input.body !== undefined) {\n headers['content-type'] = 'application/json';\n headers['x-dsh-mcp-manager'] = '1';\n body = JSON.stringify(input.body);\n }\n let lastCode = 'network';\n for (const url of candidatesFor(method)) {\n let response;\n try {\n response = await fetchImpl(url, {\n method,\n headers,\n body,\n cache: 'no-store',\n credentials: 'same-origin',\n signal: input.signal,\n });\n } catch (error) {\n if (error && error.name === 'AbortError') throw new ApiError('aborted', 0);\n lastCode = 'network';\n continue;\n }\n let payload;\n try {\n payload = await response.json();\n } catch {\n payload = undefined;\n }\n if (isResult(payload)) return { status: response.status, payload };\n if (response.status === 401 || response.status === 403) {\n lastCode = 'unauthorized';\n continue;\n }\n if (response.status === 404) {\n lastCode = 'network';\n continue;\n }\n lastCode = 'network';\n }\n throw new ApiError(lastCode, 0);\n}\n", "/** Observable page state: configuration and enablement. */\n\nimport { ApiError, request } from './api.js';\n\nconst POLL_DELAY_MS = 2000;\nconst READ_TIMEOUT_MS = 8000;\n\n/**\n * @param {{fetchImpl?: typeof fetch}} [options]\n */\nexport function createController(options = {}) {\n const fetchImpl = options.fetchImpl;\n let snapshot = {\n status: 'idle',\n state: null,\n error: null,\n busy: false,\n action: null,\n };\n const listeners = new Set();\n let generation = 0;\n let pollTimer;\n let polling;\n let disposed = false;\n\n function publish(patch) {\n if (disposed) return;\n snapshot = { ...snapshot, ...patch };\n for (const listener of listeners) listener();\n }\n\n function subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n function getSnapshot() {\n return snapshot;\n }\n\n function failure(error) {\n if (error instanceof ApiError) return { code: error.code };\n return { code: 'network' };\n }\n\n async function load(lifecycleSignal) {\n if (disposed) return;\n const current = ++generation;\n if (snapshot.status === 'idle') publish({ status: 'loading' });\n const timeout = AbortSignal.timeout(READ_TIMEOUT_MS);\n const signal = lifecycleSignal ? AbortSignal.any([lifecycleSignal, timeout]) : timeout;\n try {\n const { payload } = await request({ method: 'GET', fetchImpl, signal });\n if (current !== generation || disposed) return;\n if (payload.ok === true) {\n publish({ status: 'ready', state: payload, error: null });\n } else {\n publish({\n status: snapshot.state === null ? 'error' : 'ready',\n error: { code: payload.code || 'internal', params: payload.params },\n });\n }\n } catch (error) {\n if (current !== generation || disposed) return;\n publish({ status: snapshot.state === null ? 'error' : 'ready', error: failure(error) });\n }\n }\n\n function start() {\n if (polling || disposed) return;\n const session = new AbortController();\n polling = session;\n\n async function poll() {\n if (!snapshot.busy) await load(session.signal);\n if (!session.signal.aborted) pollTimer = setTimeout(poll, POLL_DELAY_MS);\n }\n\n void poll();\n }\n\n async function setEnabled(target, enabled) {\n if (snapshot.busy) return { ok: false, code: 'locked' };\n const action = { id: target.id, name: target.name };\n // A GET that began before this write must not restore the old switch state.\n generation += 1;\n publish({ busy: true, action });\n try {\n const { payload } = await request({\n method: 'POST',\n fetchImpl,\n body: { action: 'setEnabled', id: target.id, name: target.name, rowHash: target.rowHash, enabled },\n });\n if (payload.ok === true) {\n publish({ busy: false, action: null, status: 'ready', state: payload, error: null });\n return { ok: true };\n }\n if (payload.code === 'conflict' || payload.code === 'not-found') await load();\n const error = { code: payload.code, params: payload.params };\n publish({ busy: false, action: { ...action, error } });\n return { ok: false, ...error };\n } catch (error) {\n const details = failure(error);\n publish({ busy: false, action: { ...action, error: details } });\n return { ok: false, ...details };\n }\n }\n\n /** Stop background work without invalidating the controller (React StrictMode remounts). */\n function stop() {\n generation += 1;\n polling?.abort();\n polling = undefined;\n clearTimeout(pollTimer);\n pollTimer = undefined;\n }\n\n function dispose() {\n disposed = true;\n stop();\n listeners.clear();\n }\n\n return { subscribe, getSnapshot, load, setEnabled, start, stop, dispose };\n}\n", "/** Static service summaries with a native enablement switch. */\n\nimport * as React from 'react';\nimport { serverLabel, transportLabel } from './model.js';\n\nconst h = React.createElement;\n\nconst READ_ONLY_KEYS = {\n 'not-insert': 'readOnlyNotInsert',\n 'block-shape': 'readOnlyBlockShape',\n 'row-shape': 'readOnlyRowShape',\n 'missing-id': 'readOnlyMissingId',\n 'duplicate-id': 'readOnlyDuplicateId',\n 'conditional-disabled': 'readOnlyConditional',\n 'missing-name': 'readOnlyMissingName',\n 'config-invalid': 'readOnlyConfig',\n 'config-enabled': 'readOnlyConfigEnabled',\n};\n\nexport function ServerRow({ server, translate, busy, saving, failure, Switch, Tag, onToggle }) {\n const name = serverLabel(server, translate);\n const readOnlyText = server.editable ? null : translate(READ_ONLY_KEYS[server.readOnlyCode] || 'readOnlyConfig');\n const canToggle = server.editable && server.enabled !== null;\n return h('li', { className: 'dshmcp_row' },\n h('span', { className: 'dshmcp_identity' },\n h('span', { className: 'dshmcp_name' }, name),\n server.duplicate ? h('span', { title: translate('duplicateHint') },\n h(Tag, { tone: 'warning' }, translate('duplicate')),\n ) : null,\n readOnlyText ? h(Tag, { tone: 'neutral' }, translate('readOnly')) : null,\n ),\n h('span', { className: 'dshmcp_transport' }, transportLabel(server, translate)),\n canToggle ? h(Switch, {\n className: 'dshmcp_switch',\n checked: server.enabled === true,\n label: translate('switchLabel', { name }),\n disabled: Boolean(busy),\n onChange: enabled => onToggle(server, enabled),\n }) : null,\n saving ? h('p', { className: 'dshmcp_reason', role: 'status' }, translate('saving')) : null,\n failure ? h('p', { className: 'dshmcp_reason dshmcp_notice_error', role: 'alert' }, failure) : null,\n readOnlyText ? h('span', { className: 'dshmcp_reason' }, readOnlyText) : null,\n );\n}\n", "/** Localized labels for the service list. */\n\n/** Format servers for a compact summary line. */\nexport function serverLabel(server, translate) {\n if (server && typeof server.name === 'string' && server.name !== '') return server.name;\n if (server && typeof server.id === 'string' && server.id !== '') return server.id;\n return translate('unknownName');\n}\n\n/** Localized transport name for one server. */\nexport function transportLabel(server, translate) {\n if (server && server.transport === 'stdio') return translate('transportStdio');\n if (server && server.transport === 'streamable-http') return translate('transportHttp');\n return null;\n}\n", "/* Match the host's settings typography, controls and surfaces. */\n\n.dshmcp_page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n min-width: 0;\n padding-top: 16px;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 22px;\n}\n\n.dshmcp_title {\n min-width: 0;\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_group {\n box-sizing: border-box;\n min-width: 0;\n margin: 0;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.dshmcp_rows {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.dshmcp_row,\n.dshmcp_skeletonRow {\n padding-block: 10px;\n}\n\n.dshmcp_row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(36px, max-content);\n align-items: center;\n gap: 2px 12px;\n}\n\n.dshmcp_row + .dshmcp_row,\n.dshmcp_skeletonRow + .dshmcp_skeletonRow {\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.dshmcp_identity {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 8px;\n min-width: 0;\n}\n\n.dshmcp_name {\n min-width: 0;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport,\n.dshmcp_reason {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport {\n white-space: nowrap;\n}\n\n/* Composite the native off track over the same base surface as the Plugins page. */\n.dshmcp_switch[aria-checked='false'] {\n background-color: var(--dsw-alias-bg-base);\n background-image: linear-gradient(var(--dsw-alias-border-l3), var(--dsw-alias-border-l3));\n}\n\n.dshmcp_reason {\n grid-column: 1 / -1;\n}\n\n.dshmcp_notice,\n.dshmcp_hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_notice_error {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.dshmcp_hint {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.dshmcp_messagePanel {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 16px;\n}\n\n.dshmcp_messageTitle {\n margin: 0;\n font-weight: 500;\n}\n\n.dshmcp_skeletonRow {\n display: grid;\n align-items: center;\n min-height: 22px;\n}\n\n.dshmcp_skeletonLine {\n display: block;\n height: 12px;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-skeleton);\n}\n\n.dshmcp_skeletonLine[data-w='34'] { width: 34%; }\n.dshmcp_skeletonLine[data-w='46'] { width: 46%; }\n\n@media (prefers-reduced-motion: no-preference) {\n .dshmcp_skeletonLine {\n animation: dshmcp-pulse 1.6s ease-in-out infinite;\n }\n}\n\n@keyframes dshmcp-pulse {\n 50% { opacity: 0.55; }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Client half: the MCP settings section, its navigation icon, and the one slot\n * registration that places it beside the shipped Settings pages.\n */\n\nimport * as React from 'react';\nimport { Switch, Tag } from '@deepseek-ai/dsh-client-ui-primitives';\nimport mcpEmblem from '../../icon.svg';\nimport { createTranslator, registerLocale } from './i18n.js';\nimport { createPage } from './page.js';\nimport css from './style.css';\n\nconst h = React.createElement;\n\nfunction McpIcon({ size = 18, active = false } = {}) {\n return h('span', {\n className: 'dshmcp_navIcon',\n 'aria-hidden': true,\n 'data-active': active ? 'true' : undefined,\n style: { width: size, height: size, maskImage: `url(${JSON.stringify(mcpEmblem)})` },\n });\n}\n\nexport const inject = ['slots', 'locale'];\n\nexport function apply(ctx) {\n registerLocale(ctx);\n\n ctx.effect(() => {\n const tag = document.createElement('style');\n tag.dataset.plugin = '@dawn0608/dsh-mcp-manager';\n tag.textContent = css;\n document.head.appendChild(tag);\n return () => {\n tag.remove();\n };\n }, 'mcp-manager: styles');\n\n const translate = createTranslator(ctx);\n const subscribeLocale = listener => ctx.locale.subscribe(listener);\n const localeVersion = () => {\n try {\n const snapshot = ctx.locale.getSnapshot();\n return typeof snapshot.revision === 'number' ? snapshot.revision : 0;\n } catch (error) {\n return 0;\n }\n };\n const Page = createPage({ translate, subscribeLocale, localeVersion, Switch, Tag });\n\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'mcp-manager',\n order: 17,\n label: () => translate('title'),\n }, Page));\n\n ctx.slots.inject('settings.section.icon', () => ctx.slots.register({\n name: 'settings.section.icon',\n id: 'mcp-manager',\n order: 17,\n }, McpIcon));\n}\n", "/** Client dictionaries and the locale-service binding for the MCP settings page. */\n\nexport const NS = 'mcpManager';\n\nexport const DICTS = {\n zh: {\n title: 'MCP \u7BA1\u7406',\n loadFailed: '\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25',\n emptyTitle: '\u8FD8\u6CA1\u6709 MCP \u670D\u52A1',\n duplicate: '\u91CD\u540D',\n duplicateHint: '\u540C\u4E00\u670D\u52A1\u540D\u51FA\u73B0\u591A\u6B21\uFF0CHarness \u53EA\u4F1A\u52A0\u8F7D\u5176\u4E2D\u4E00\u4E2A\u3002',\n readOnly: '\u53EA\u8BFB',\n readOnlyFailure: '\u8BE5\u6761\u76EE\u4E3A\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u5728\u9762\u677F\u4E2D\u4FEE\u6539\u3002',\n unknownName: '\u672A\u547D\u540D\u6761\u76EE',\n readOnlyNotInsert: '\u8BE5 MCP \u6761\u76EE\u4E0D\u5728 insert \u5217\u8868\u4E2D\u3002',\n readOnlyBlockShape: '\u6240\u5728\u7684 patch \u5757\u5305\u542B\u5176\u4ED6\u5B57\u6BB5\u3002',\n readOnlyRowShape: '\u6761\u76EE\u5305\u542B\u9762\u677F\u4E0D\u652F\u6301\u7684\u5B57\u6BB5\u3002',\n readOnlyMissingId: '\u6761\u76EE\u7F3A\u5C11 id\u3002',\n readOnlyDuplicateId: '\u6761\u76EE id \u91CD\u590D\u6216\u88AB\u8986\u76D6\u3002',\n readOnlyConditional: '\u542F\u7528\u72B6\u6001\u662F\u6761\u4EF6\u8868\u8FBE\u5F0F\u3002',\n readOnlyMissingName: '\u6761\u76EE\u7F3A\u5C11 serverName\u3002',\n readOnlyConfig: '\u914D\u7F6E\u7ED3\u6784\u4E0D\u53D7\u652F\u6301\u3002',\n readOnlyConfigEnabled: '\u6761\u76EE\u5728 config \u4E2D\u4F7F\u7528\u4E86 enabled\uFF0C\u65E0\u6CD5\u5B89\u5168\u6539\u5199\u3002',\n transportStdio: 'STDIO',\n transportHttp: 'Streamable HTTP',\n switchLabel: '\u542F\u7528 {name}',\n saving: '\u6B63\u5728\u4FDD\u5B58\u2026',\n invalid: '\u8BF7\u6C42\u65E0\u6548\u3002',\n internal: '\u64CD\u4F5C\u672A\u5B8C\u6210\uFF0C\u8BF7\u67E5\u770B Harness \u65E5\u5FD7\u3002',\n conflict: '\u914D\u7F6E\u6587\u4EF6\u5DF2\u88AB\u5176\u4ED6\u7A0B\u5E8F\u4FEE\u6539\uFF0C\u5DF2\u5237\u65B0\u5217\u8868\uFF0C\u8BF7\u91CD\u8BD5\u3002',\n locked: '\u914D\u7F6E\u6587\u4EF6\u6B63\u88AB\u5176\u4ED6\u64CD\u4F5C\u5360\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002',\n profileUnavailable: '\u65E0\u6CD5\u5B9A\u4F4D\u6216\u8BFB\u5199\u5F53\u524D profile \u8865\u4E01\u6587\u4EF6\u3002',\n network: '\u65E0\u6CD5\u8FDE\u63A5 Harness\u3002',\n unauthorized: '\u5F53\u524D\u9875\u9762\u6CA1\u6709\u8BBF\u95EE Host \u7684\u6743\u9650\u3002',\n },\n};\n\nDICTS.en = {\n title: 'MCP Management',\n loadFailed: 'Could not read the configuration',\n emptyTitle: 'No MCP servers yet',\n duplicate: 'Duplicate name',\n duplicateHint: 'The same server name appears more than once; Harness loads only one of them.',\n readOnly: 'Read-only',\n readOnlyFailure: 'This entry is read-only and cannot be changed from the panel.',\n unknownName: 'Unnamed entry',\n readOnlyNotInsert: 'This MCP entry is outside an insert list.',\n readOnlyBlockShape: 'Its patch block contains other fields.',\n readOnlyRowShape: 'The entry contains fields this panel does not manage.',\n readOnlyMissingId: 'The entry has no id.',\n readOnlyDuplicateId: 'The entry id is duplicated or overridden.',\n readOnlyConditional: 'Enablement is a conditional expression.',\n readOnlyMissingName: 'The entry has no serverName.',\n readOnlyConfig: 'The configuration shape is unsupported.',\n readOnlyConfigEnabled: 'The entry uses enabled inside config and cannot be rewritten safely.',\n transportStdio: 'STDIO',\n transportHttp: 'Streamable HTTP',\n switchLabel: 'Enable {name}',\n saving: 'Saving\u2026',\n invalid: 'The request is invalid.',\n internal: 'The operation did not complete; check the Harness logs.',\n conflict: 'The configuration changed on disk. The list was refreshed; try again.',\n locked: 'The profile is being written by another operation. Try again shortly.',\n profileUnavailable: 'The profile patch for this desktop profile cannot be located or written.',\n network: 'Could not reach Harness.',\n unauthorized: 'This page is not authorized to call the Host.',\n};\n\n/** Interpolate `{name}` placeholders without depending on the locale service. */\nexport function format(template, params) {\n return String(template).replace(/\\{(\\w+)\\}/g, (match, key) =>\n params && Object.prototype.hasOwnProperty.call(params, key) ? String(params[key]) : match);\n}\n\n/** Register both dictionaries under the plugin namespace; safe when locale is unavailable. */\nexport function registerLocale(ctx) {\n return ctx.effect(() => {\n try {\n return ctx.locale.register(NS, DICTS);\n } catch (error) {\n return () => {};\n }\n }, 'mcp-manager: dictionaries');\n}\n\n/** Resolve the active language through the locale service, falling back to English. */\nexport function createTranslator(ctx) {\n let bound;\n try {\n bound = ctx.locale.bind(NS);\n } catch (error) {\n bound = null;\n }\n const fallback = () => {\n let active = 'en';\n try {\n active = ctx.locale.getSnapshot().active || 'en';\n } catch (error) {\n active = 'en';\n }\n return String(active).toLowerCase().startsWith('zh') ? DICTS.zh : DICTS.en;\n };\n return (key, params) => {\n let text;\n if (bound !== null) {\n try {\n text = bound(key, params);\n } catch (error) {\n text = undefined;\n }\n }\n if (typeof text !== 'string' || text === key) {\n const dict = fallback();\n text = format(dict[key] !== undefined ? dict[key] : DICTS.en[key], params);\n }\n return text;\n };\n}\n", "/** The MCP management page: service status and enablement. */\n\nimport * as React from 'react';\nimport { createController } from './controller.js';\nimport { ServerRow } from './row.js';\n\nconst h = React.createElement;\n\nconst CODE_KEYS = {\n conflict: 'conflict',\n locked: 'locked',\n 'profile-unavailable': 'profileUnavailable',\n network: 'network',\n unauthorized: 'unauthorized',\n 'read-only': 'readOnlyFailure',\n 'not-found': 'conflict',\n 'parse-failed': 'loadFailed',\n 'verify-failed': 'internal',\n 'write-failed': 'internal',\n invalid: 'invalid',\n internal: 'internal',\n};\n\nfunction failureText(translate, failure) {\n const key = CODE_KEYS[(failure && failure.code) || 'internal'] || 'internal';\n return translate(key, failure && failure.params ? failure.params : undefined);\n}\n\nfunction Notice({ children }) {\n return h('p', { className: 'dshmcp_notice dshmcp_notice_error', role: 'alert' }, children);\n}\n\nfunction Skeleton() {\n return h('div', { className: 'dshmcp_rows', 'aria-hidden': true },\n h('div', { className: 'dshmcp_skeletonRow' },\n h('span', { className: 'dshmcp_skeletonLine', 'data-w': '34' }),\n ),\n h('div', { className: 'dshmcp_skeletonRow' },\n h('span', { className: 'dshmcp_skeletonLine', 'data-w': '46' }),\n ),\n );\n}\n\nclass Boundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { failed: false };\n }\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n render() {\n if (this.state.failed) return h('p', { className: 'dshmcp_notice dshmcp_notice_error' }, this.props.fallback);\n return this.props.children;\n }\n}\n\n/**\n * @param {{translate: (key: string, params?: object) => string, subscribeLocale: (listener: () => void) => () => void, localeVersion: () => number, Switch: React.ComponentType<{className?: string, checked: boolean, label: string, disabled: boolean, onChange: (checked: boolean) => void}>, Tag: React.ComponentType<{tone: 'neutral' | 'warning', children: React.ReactNode}>, createStore?: () => ReturnType<typeof createController>}} options\n */\nexport function createPage(options) {\n const { translate, subscribeLocale, localeVersion, Switch, Tag } = options;\n const createStore = options.createStore || createController;\n\n function Page() {\n const storeRef = React.useRef(null);\n if (storeRef.current === null) storeRef.current = createStore();\n const store = storeRef.current;\n const snapshot = React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n React.useSyncExternalStore(subscribeLocale, localeVersion, localeVersion);\n\n const servers = snapshot.state && Array.isArray(snapshot.state.servers) ? snapshot.state.servers : [];\n const { busy, action } = snapshot;\n const loading = snapshot.state === null && snapshot.status !== 'error';\n const loadFailure = snapshot.error ? failureText(translate, snapshot.error) : null;\n const actionServer = action && servers.find(server => server.id === action.id && server.name === action.name);\n const actionFailureText = action?.error ? failureText(translate, action.error) : null;\n\n React.useEffect(() => {\n store.start();\n return () => store.stop();\n }, [store]);\n\n return h('section', {\n className: 'dshmcp_page',\n 'aria-labelledby': 'dshmcp-title',\n 'aria-busy': loading ? 'true' : undefined,\n },\n h('h2', { className: 'dshmcp_title', id: 'dshmcp-title' }, translate('title')),\n loading ? h(Skeleton) : null,\n loadFailure && snapshot.state === null\n ? h('div', { className: 'dshmcp_group dshmcp_messagePanel', role: 'alert' },\n h('p', { className: 'dshmcp_messageTitle' }, translate('loadFailed')),\n loadFailure === translate('loadFailed') ? null : h('p', { className: 'dshmcp_hint' }, loadFailure),\n )\n : null,\n snapshot.state !== null\n ? h(React.Fragment, null,\n loadFailure ? h(Notice, null, loadFailure) : null,\n actionFailureText && !actionServer ? h(Notice, null, action.name, ' \u2014 ', actionFailureText) : null,\n servers.length > 0\n ? h('ul', { className: 'dshmcp_rows', role: 'list' },\n servers.map((server, index) => h(ServerRow, {\n key: server.editable ? `service:${server.id}` : `readonly:${index}`,\n server,\n Switch,\n Tag,\n translate,\n busy,\n saving: busy && server === actionServer,\n failure: server === actionServer ? actionFailureText : null,\n onToggle: store.setEnabled,\n })),\n )\n : h('div', { className: 'dshmcp_group dshmcp_messagePanel' },\n h('p', { className: 'dshmcp_messageTitle' }, translate('emptyTitle')),\n ),\n )\n : null,\n );\n }\n\n function SafePage() {\n return h(Boundary, { fallback: translate('internal') }, h(Page));\n }\n SafePage.displayName = 'McpManagerPage';\n\n return SafePage;\n}\n", "/** Browser transport for the settings API. */\n\nconst CONNECTION_PATH = 'api/mcp-manager';\nconst PLAIN_PATH = '/plugin/mcp-manager';\n\nexport class ApiError extends Error {\n constructor(code, status) {\n super(code);\n this.name = 'ApiError';\n this.code = code;\n this.status = status;\n }\n}\n\nfunction streamOrigin() {\n const transport = globalThis.window && globalThis.window.__DSH_TRANSPORT__;\n if (!transport || typeof transport.streamBaseUrl !== 'string' || transport.streamBaseUrl === '') return undefined;\n try {\n const url = new URL(transport.streamBaseUrl, globalThis.location && globalThis.location.href);\n return `${url.protocol === 'wss:' ? 'https:' : url.protocol === 'ws:' ? 'http:' : url.protocol}//${url.host}`;\n } catch {\n return undefined;\n }\n}\n\nfunction documentBase() {\n const location = globalThis.location;\n if (!location || (location.protocol !== 'http:' && location.protocol !== 'https:')) return undefined;\n return location.origin;\n}\n\n/** Candidate URLs, most specific first. Writes stay on the authenticated channel. */\nexport function candidatesFor(method) {\n const urls = [];\n if (method !== 'POST') {\n const stream = streamOrigin();\n if (stream) urls.push(`${stream}${PLAIN_PATH}`);\n const document = documentBase();\n if (document) urls.push(`${document}${PLAIN_PATH}`);\n }\n urls.push(CONNECTION_PATH);\n if (method === 'POST') {\n const document = documentBase();\n if (document) urls.push(`${document}${PLAIN_PATH}`);\n }\n return urls.filter((value, index) => urls.indexOf(value) === index);\n}\n\nfunction isResult(payload) {\n return Boolean(payload) && typeof payload === 'object' && typeof payload.ok === 'boolean';\n}\n\n/**\n * @param {{method?: string, body?: unknown, signal?: AbortSignal, fetchImpl?: typeof fetch}} request\n * @returns {Promise<{status: number, payload: object}>}\n */\nexport async function request(input) {\n const method = input.method || 'GET';\n const fetchImpl = input.fetchImpl || globalThis.fetch;\n const headers = { accept: 'application/json' };\n let body;\n if (input.body !== undefined) {\n headers['content-type'] = 'application/json';\n headers['x-dsh-mcp-manager'] = '1';\n body = JSON.stringify(input.body);\n }\n let lastCode = 'network';\n for (const url of candidatesFor(method)) {\n let response;\n try {\n response = await fetchImpl(url, {\n method,\n headers,\n body,\n cache: 'no-store',\n credentials: 'same-origin',\n signal: input.signal,\n });\n } catch (error) {\n if (error && error.name === 'AbortError') throw new ApiError('aborted', 0);\n lastCode = 'network';\n continue;\n }\n let payload;\n try {\n payload = await response.json();\n } catch {\n payload = undefined;\n }\n if (isResult(payload)) return { status: response.status, payload };\n if (response.status === 401 || response.status === 403) {\n lastCode = 'unauthorized';\n continue;\n }\n if (response.status === 404) {\n lastCode = 'network';\n continue;\n }\n lastCode = 'network';\n }\n throw new ApiError(lastCode, 0);\n}\n", "/** Observable page state: configuration and enablement. */\n\nimport { ApiError, request } from './api.js';\n\nconst POLL_DELAY_MS = 2000;\nconst READ_TIMEOUT_MS = 8000;\n\n/**\n * @param {{fetchImpl?: typeof fetch}} [options]\n */\nexport function createController(options = {}) {\n const fetchImpl = options.fetchImpl;\n let snapshot = {\n status: 'idle',\n state: null,\n error: null,\n busy: false,\n action: null,\n };\n const listeners = new Set();\n let generation = 0;\n let pollTimer;\n let polling;\n let disposed = false;\n\n function publish(patch) {\n if (disposed) return;\n snapshot = { ...snapshot, ...patch };\n for (const listener of listeners) listener();\n }\n\n function subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n function getSnapshot() {\n return snapshot;\n }\n\n function failure(error) {\n if (error instanceof ApiError) return { code: error.code };\n return { code: 'network' };\n }\n\n async function load(lifecycleSignal) {\n if (disposed) return;\n const current = ++generation;\n if (snapshot.status === 'idle') publish({ status: 'loading' });\n const timeout = AbortSignal.timeout(READ_TIMEOUT_MS);\n const signal = lifecycleSignal ? AbortSignal.any([lifecycleSignal, timeout]) : timeout;\n try {\n const { payload } = await request({ method: 'GET', fetchImpl, signal });\n if (current !== generation || disposed) return;\n if (payload.ok === true) {\n publish({ status: 'ready', state: payload, error: null });\n } else {\n publish({\n status: snapshot.state === null ? 'error' : 'ready',\n error: { code: payload.code || 'internal', params: payload.params },\n });\n }\n } catch (error) {\n if (current !== generation || disposed) return;\n publish({ status: snapshot.state === null ? 'error' : 'ready', error: failure(error) });\n }\n }\n\n function start() {\n if (polling || disposed) return;\n const session = new AbortController();\n polling = session;\n\n async function poll() {\n if (!snapshot.busy) await load(session.signal);\n if (!session.signal.aborted) pollTimer = setTimeout(poll, POLL_DELAY_MS);\n }\n\n void poll();\n }\n\n async function setEnabled(target, enabled) {\n if (snapshot.busy) return { ok: false, code: 'locked' };\n const action = { id: target.id, name: target.name };\n // A GET that began before this write must not restore the old switch state.\n generation += 1;\n publish({ busy: true, action });\n try {\n const { payload } = await request({\n method: 'POST',\n fetchImpl,\n body: { action: 'setEnabled', id: target.id, name: target.name, rowHash: target.rowHash, enabled },\n });\n if (payload.ok === true) {\n publish({ busy: false, action: null, status: 'ready', state: payload, error: null });\n return { ok: true };\n }\n if (payload.code === 'conflict' || payload.code === 'not-found') await load();\n const error = { code: payload.code, params: payload.params };\n publish({ busy: false, action: { ...action, error } });\n return { ok: false, ...error };\n } catch (error) {\n const details = failure(error);\n publish({ busy: false, action: { ...action, error: details } });\n return { ok: false, ...details };\n }\n }\n\n /** Stop background work without invalidating the controller (React StrictMode remounts). */\n function stop() {\n generation += 1;\n polling?.abort();\n polling = undefined;\n clearTimeout(pollTimer);\n pollTimer = undefined;\n }\n\n function dispose() {\n disposed = true;\n stop();\n listeners.clear();\n }\n\n return { subscribe, getSnapshot, load, setEnabled, start, stop, dispose };\n}\n", "/** Static service summaries with a native enablement switch. */\n\nimport * as React from 'react';\nimport { serverLabel, transportLabel } from './model.js';\n\nconst h = React.createElement;\n\nconst READ_ONLY_KEYS = {\n 'not-insert': 'readOnlyNotInsert',\n 'block-shape': 'readOnlyBlockShape',\n 'row-shape': 'readOnlyRowShape',\n 'missing-id': 'readOnlyMissingId',\n 'duplicate-id': 'readOnlyDuplicateId',\n 'conditional-disabled': 'readOnlyConditional',\n 'missing-name': 'readOnlyMissingName',\n 'config-invalid': 'readOnlyConfig',\n 'config-enabled': 'readOnlyConfigEnabled',\n};\n\nexport function ServerRow({ server, translate, busy, saving, failure, Switch, Tag, onToggle }) {\n const name = serverLabel(server, translate);\n const readOnlyText = server.editable ? null : translate(READ_ONLY_KEYS[server.readOnlyCode] || 'readOnlyConfig');\n const canToggle = server.editable && server.enabled !== null;\n return h('li', { className: 'dshmcp_row' },\n h('span', { className: 'dshmcp_identity' },\n h('span', { className: 'dshmcp_name' }, name),\n server.duplicate ? h('span', { title: translate('duplicateHint') },\n h(Tag, { tone: 'warning' }, translate('duplicate')),\n ) : null,\n readOnlyText ? h(Tag, { tone: 'neutral' }, translate('readOnly')) : null,\n ),\n h('span', { className: 'dshmcp_transport' }, transportLabel(server, translate)),\n canToggle ? h(Switch, {\n className: 'dshmcp_switch',\n checked: server.enabled === true,\n label: translate('switchLabel', { name }),\n disabled: Boolean(busy),\n onChange: enabled => onToggle(server, enabled),\n }) : null,\n saving ? h('p', { className: 'dshmcp_reason', role: 'status' }, translate('saving')) : null,\n failure ? h('p', { className: 'dshmcp_reason dshmcp_notice_error', role: 'alert' }, failure) : null,\n readOnlyText ? h('span', { className: 'dshmcp_reason' }, readOnlyText) : null,\n );\n}\n", "/** Localized labels for the service list. */\n\n/** Format servers for a compact summary line. */\nexport function serverLabel(server, translate) {\n if (server && typeof server.name === 'string' && server.name !== '') return server.name;\n if (server && typeof server.id === 'string' && server.id !== '') return server.id;\n return translate('unknownName');\n}\n\n/** Localized transport name for one server. */\nexport function transportLabel(server, translate) {\n if (server && server.transport === 'stdio') return translate('transportStdio');\n if (server && server.transport === 'streamable-http') return translate('transportHttp');\n return null;\n}\n", "/* Match the host's settings typography, controls and surfaces. */\n\n.dshmcp_navIcon {\n display: inline-block;\n flex-shrink: 0;\n background-color: currentColor;\n mask-position: center;\n mask-repeat: no-repeat;\n mask-size: 150%;\n}\n\n.dshmcp_page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n min-width: 0;\n padding-top: 16px;\n color: var(--dsw-alias-label-primary);\n font-size: 14px;\n line-height: 22px;\n}\n\n.dshmcp_title {\n min-width: 0;\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_group {\n box-sizing: border-box;\n min-width: 0;\n margin: 0;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.dshmcp_rows {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.dshmcp_row,\n.dshmcp_skeletonRow {\n padding-block: 10px;\n}\n\n.dshmcp_row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(36px, max-content);\n align-items: center;\n gap: 2px 12px;\n}\n\n.dshmcp_row + .dshmcp_row,\n.dshmcp_skeletonRow + .dshmcp_skeletonRow {\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.dshmcp_identity {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 8px;\n min-width: 0;\n}\n\n.dshmcp_name {\n min-width: 0;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport,\n.dshmcp_reason {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_transport {\n white-space: nowrap;\n}\n\n/* Composite the native off track over the same base surface as the Plugins page. */\n.dshmcp_switch[aria-checked='false'] {\n background-color: var(--dsw-alias-bg-base);\n background-image: linear-gradient(var(--dsw-alias-border-l3), var(--dsw-alias-border-l3));\n}\n\n.dshmcp_reason {\n grid-column: 1 / -1;\n}\n\n.dshmcp_notice,\n.dshmcp_hint {\n margin: 0;\n font-size: 12px;\n line-height: 18px;\n overflow-wrap: anywhere;\n}\n\n.dshmcp_notice_error {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.dshmcp_hint {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.dshmcp_messagePanel {\n display: grid;\n justify-items: start;\n gap: 6px;\n padding: 16px;\n}\n\n.dshmcp_messageTitle {\n margin: 0;\n font-weight: 500;\n}\n\n.dshmcp_skeletonRow {\n display: grid;\n align-items: center;\n min-height: 22px;\n}\n\n.dshmcp_skeletonLine {\n display: block;\n height: 12px;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-skeleton);\n}\n\n.dshmcp_skeletonLine[data-w='34'] { width: 34%; }\n.dshmcp_skeletonLine[data-w='46'] { width: 46%; }\n\n@media (prefers-reduced-motion: no-preference) {\n .dshmcp_skeletonLine {\n animation: dshmcp-pulse 1.6s ease-in-out infinite;\n }\n}\n\n@keyframes dshmcp-pulse {\n 50% { opacity: 0.55; }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["React", "React", "document", "Switch", "Tag", "h", "Switch", "Tag", "h"]
|
|
7
7
|
}
|
package/locale/en.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"title": "MCP Management",
|
|
4
|
-
"description": "View and
|
|
4
|
+
"description": "View STDIO and Streamable HTTP servers for the current profile and toggle editable entries from Settings.",
|
|
5
5
|
"detail": "README.md"
|
|
6
6
|
}
|
|
7
7
|
}
|
package/locale/zh.json
CHANGED
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dawn0608/dsh-mcp-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
|
-
"description": "View and
|
|
6
|
+
"description": "View STDIO and Streamable HTTP servers for the current profile and toggle editable entries from Settings.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "dawn0608",
|
|
9
9
|
"keywords": [
|