dsh-mcp-panel 0.4.0 → 0.4.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.zh.md CHANGED
@@ -1,26 +1,56 @@
1
+ <div align="center">
2
+
1
3
  # dsh-mcp-panel
2
4
 
3
5
  **官方 DeepSeek Harness MCP client 的 MCP 管理控制台 —— 在设置页可视化增删改 MCP 服务器、试用工具调用,配以诚实的连接状态、健康诊断与安全可逆的 profile 写入。**
4
6
 
5
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
7
+ *官方 client = 桥接,本插件 = 控制台:经 `mcp/status` seam 读取状态,只写入只追加、走审批的 profile patch。*
6
8
 
7
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
8
- [![npm](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
9
- [![downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
10
- [![CI](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml/badge.svg)](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml)
11
- [![dsh-plugin](https://img.shields.io/badge/ecosystem-dsh--plugin-8b5cf6)](https://github.com/topics/dsh-plugin)
12
- [![deepseek-harness](https://img.shields.io/badge/runtime-deepseek--harness-4f46e5)](https://github.com/deepseek-ai/deepseek-harness)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-mcp-panel/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-mcp-panel/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-mcp-panel?label=version)](https://github.com/PerryLink/dsh-mcp-panel/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
13
16
 
14
- ## 架构:官方 client 负责桥接,本插件是完整体验层
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
15
18
 
16
- [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) 是**唯一的桥接层**:每个 MCP server 一个插件实例,以手写 `cordis.yml` 行的形式配置,负责连接传输、同步工具并注册 `mcp__<server>__<tool>` 工具名。本插件从不取代它 —— 而是构建其上的**体验层**:
19
+ </div>
17
20
 
18
- ```
21
+ ---
22
+
23
+ ## Compatibility
24
+
25
+ | 维度 | 状态 |
26
+ |---|---|
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8`–`0.2.0` |
28
+ | Node | `^22.19.0 \|\| >=24.0.0` |
29
+ | 平台 | Web GUI(双面:Host + 浏览器) |
30
+ | 模型 | 任意(面板只读;仅 `/mcp` 输出对模型可见) |
31
+
32
+ ## What you get
33
+
34
+ `dsh-mcp-panel` 是官方 MCP client 之上的体验层:只读运行时视图加上安全可逆的 profile 写入。
35
+
36
+ - **`/mcp` 命令** —— 每 server 一行:transport、目标、工具数、连接状态(来自上游 seam;未观测时如实显示 `unknown`)、最近错误、重连计数——模型可读、会话日志可重建、五种输出语言。
37
+ - **`/mcp <server> tools`** —— 模型可见的 `mcp__*` 工具名与描述。
38
+ - **`/mcp <server> health`** —— 派生自愈建议(ENOENT → 依赖缺失、ECONNREFUSED、超时、401/403/404、DNS、限流、重连耗尽…);退出码 / stderr 尾部如实标注*待官方支持*。
39
+ - **`/mcp <server> call <tool> [json]`** —— 经**官方工具管线**(`ctx.tools.execute()`)试用调用;pre-execute 权限策略、审批、guard、post-execute 全部生效。
40
+ - **设置 → 插件 → MCP 页** —— 状态卡片(徽章、诊断、探测),加 server CRUD 与工具试用台。
41
+ - **Server CRUD** —— 增删改表单 → `insert`/`set`/`set disabled` 片段 → 剪贴板复制或审批写入,自动备份。
42
+ - **工具试用台** —— 选 server → 选 `mcp__*` 工具 → JSON 填参 → 规范 JSON 结果 + render 内容;按 `trialMaxResultChars` 截断;仅面板可见、永不进入模型上下文。
43
+
44
+ ## Architecture: official client = bridge, this plugin = console
45
+
46
+ [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) 是**唯一的桥接层**:每个 MCP server 一个插件实例,以手写 `cordis.yml` 行的形式配置,负责连接传输、同步工具并注册 `mcp__<server>__<tool>` 工具名。本插件从不取代它——而是构建其上的**体验层**:
47
+
48
+ ```text
19
49
  ┌────────────────────────────────────────────┐
20
50
  profile │ cordis.yml / cordis.patch.yml │
21
51
  组合(每个 │ - id: mcp-github │
22
- server 一行, │ name: '@deepseek-ai/dsh-mcp-client' │
23
- 手写) │ config: { serverName, transport, … } │
52
+ server 一行, │ name: '@deepseek-ai/dsh-mcp-client' │
53
+ 手写) │ config: { serverName, transport, … } │
24
54
  │ - id: mcp-panel │
25
55
  │ name: dsh-mcp-panel ◄── 本插件 │
26
56
  └───────────────┬────────────────────────────┘
@@ -33,13 +63,14 @@
33
63
  │ • 传输连接 │ │ • /mcp 命令 │ │
34
64
  │ • 工具同步 │ │ • 设置 → 插件 → MCP 页: │ │
35
65
  │ • mcp__* 工具 │◄──────►│ CRUD、工具试用台 │ │
36
- │ • mcp/status seam │ 状态 │ • 健康诊断、探测、能力一览 │ │
37
- └───────────────────┘ └───────────────────────────┘ │
66
+ │ • mcp/status seam │ 状态 │ • 健康诊断 │ │
67
+ └───────────────────┘ │ • 探测、能力一览 │ │
68
+ └───────────────────────────┘ │
38
69
  ```
39
70
 
40
- 控制台通过官方 client 已落地的 `mcp/status` 可观测 seam(事件 + `mcpStatus` 查询服务)、工具注册表与 loader **读取**事实;**写入**只发生在 profile 的 patch 层 —— 只追加、走审批、自动备份。传输、OAuth 与协议完全不动。
71
+ 控制台通过官方 client 已落地的 `mcp/status` 可观测 seam(事件 + `mcpStatus` 查询服务)、工具注册表与 loader **读取**事实;**写入**只发生在 profile 的 patch 层——只追加、走审批、自动备份。传输、OAuth 与协议完全不动。
41
72
 
42
- ## 控制台 vs. 手写 cordis.yml
73
+ ## Console vs. hand-written cordis.yml
43
74
 
44
75
  | | 手写 cordis.yml | dsh-mcp-panel 控制台 |
45
76
  |---|---|---|
@@ -51,33 +82,22 @@
51
82
  | 排查故障 | grep 日志 | `/mcp <server> health` 派生自愈建议 |
52
83
  | 误操作 | 手动回滚 | 每次写入只追加、留时间戳备份 |
53
84
 
54
- 控制台的输出就是 `cordis.patch.yml` 的词汇表 —— 你手写的那几行,由它生成、预览并安全落地。
85
+ 控制台的输出就是 `cordis.patch.yml` 的词汇表——你手写的那几行,由它生成、预览并安全落地。
55
86
 
56
- ## 功能一览
57
-
58
- | 界面 | 功能 |
59
- |---|---|
60
- | **`/mcp` 命令** | 每 server 一行:transport、目标、工具数、连接状态(来自上游 seam;未观测时如实显示 `unknown`)、最近错误、重连计数——模型可读、会话日志可重建、五种输出语言 |
61
- | **`/mcp <server> tools`** | 模型可见的 `mcp__*` 工具名与描述 |
62
- | **`/mcp <server> health`** | 派生自愈建议(ENOENT → 依赖缺失、ECONNREFUSED、超时、401/403/404、DNS、限流、重连耗尽…);退出码 / stderr 尾部如实标注"待官方支持" |
63
- | **`/mcp <server> call <tool> [json]`** | 经**官方工具管线**试用调用——pre-execute 权限策略、审批(经命令所属 agent 路由)、guard、post-execute 全部生效 |
64
- | **`/mcp <server> disable\|enable`** | 精确的 `set` patch 行(同旧版) |
65
- | **设置 → 插件 → MCP 页** | 状态卡片(徽章、诊断、探测),加以下三块控制台 |
66
- | **Server CRUD** | 增删改表单 → `insert`/`set`/`set disabled` 片段 → 剪贴板复制或审批写入,自动备份(`cordis.patch.yml.bak-<ts>`,保留最新 `backupCount` 份) |
67
- | **工具试用台** | 选 server → 选 `mcp__*` 工具 → JSON 填参 → 规范 JSON 结果 + render 内容;按 `trialMaxResultChars` 截断;仅面板可见、永不进入模型上下文 |
68
- | **能力一览** | Resources / Prompts 可用性(特征探测);目前二者均如实标注"待官方支持"(官方 client 仅桥接工具) |
69
- | **探测** | 一键 / 被动 Streamable HTTP 连通性探测(结果仅面板可见) |
70
-
71
- ## 快速开始
87
+ ## Quick start
72
88
 
73
89
  ```sh
74
- # git 渠道(由包的 prepare 脚本构建)
75
- dsh plugin --profile web add github:PerryLink/dsh-mcp-panel#v0.4.0
76
- # npm 渠道(已发布 tarball,无需构建审批)
77
- dsh plugin --profile web add dsh-mcp-panel@0.4.0
90
+ # 1. 把 bundle 安装进 profile
91
+ dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"
92
+
93
+ # 或从 npm(发布版本)
94
+ dsh plugin --profile web add dsh-mcp-panel
95
+
96
+ # 2. 重启并校验该行
97
+ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
78
98
  ```
79
99
 
80
- 随后重启(或让 web 面板热重载 `cordis.patch.yml`),打开 **设置 → 插件 → MCP**,或运行:
100
+ 随后打开 **设置 → 插件 → MCP**,或运行:
81
101
 
82
102
  ```text
83
103
  /mcp
@@ -86,66 +106,106 @@ dsh plugin --profile web add dsh-mcp-panel@0.4.0
86
106
  /mcp everything call echo '{"message": "hi"}'
87
107
  ```
88
108
 
89
- 手动安装:把 `dsh-mcp-panel` 放进 profile 的 `node_modules`(或共享的 `$DSH_HOME/profiles/node_modules` 回退目录),并在 `cordis.patch.yml` 加一行:
90
-
91
- ```yaml
92
- - insert:
93
- - id: mcp-panel
94
- name: dsh-mcp-panel
95
- config:
96
- probeEnabled: true
97
- ```
98
-
99
- ### 卸载
109
+ ## Install & uninstall
100
110
 
101
- 1. 从 `cordis.patch.yml` 移除 `mcp-panel` 行(web 面板热重载;其他面板重启生效)。
102
- 2. 从 profile 的 `node_modules`(或共享 `profiles/node_modules` 回退目录)删除本包。
103
- 3. 用 `dsh web --dump-config` 确认没有残留的 `mcp-panel` 行。
111
+ - **git 通道**(最新 `main`):`dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"` —— `prepare` 脚本只用生产依赖构建。
112
+ - **npm 通道**(发布版本):`dsh plugin --profile web add dsh-mcp-panel`。
113
+ - **tarball 通道**:在本仓库 `pnpm pack`,再 `dsh plugin --profile web add ./dsh-mcp-panel-<version>.tgz`。
114
+ - **卸载**:从 `cordis.patch.yml` 移除 `mcp-panel` 行(web 面板热重载),从 profile 的 `node_modules` 删除本包,并用 `dsh web --dump-config` 确认没有残留的 `mcp-panel` 行。
104
115
 
105
- ## 诚实契约
116
+ ## Configuration
106
117
 
107
- - **桥接层仍是桥接层。** 不改传输、OAuth、协议;每个 server 一行 mcp-client,与你手写完全一致。
108
- - **不伪造状态。** 无上游观测时连接字段显示 `unknown` / `—`,并标注 `statusSource: 'derived'`;退出码与 stderr 尾部绝不臆造。
109
- - **展示全程脱敏。** URL 查询凭据、userinfo 密码、header 值、Bearer token、JWT 在渲染前一律打码;配置的 `headers` 从不进入任何快照;env/header 的**值**绝不出 host(编辑器只见 key)。
110
- - **写入只追加、走审批、先备份。** 控制台从不改写 `cordis.patch.yml`:只追加生成的操作。存在审批服务且调用方会话的 agent 处于开启轮次时,写入走 `ctx.approval`(仅 `allowed-once` 放行);否则以界面显式确认为审批通道。`writeEnabled: false` 是硬性总开关。
111
- - **零提示词注入。** 本插件不注册任何提示词段落;对模型可见的文本只有两个工具/命令描述,沿用官方 client 的 Minimal 风格。
118
+ 所有可调项都是 Schemastery `Config` 字段(可从 cordis.yml 覆盖)。`cordis.patch.yml` 逐键内联注释。
112
119
 
113
- ## 配置
114
-
115
- | 键 | 默认值 | 说明 |
120
+ | 键 | 默认值 | 含义 |
116
121
  |---|---|---|
117
122
  | `probeEnabled` | `true` | 注册 `mcp_probe` 后台任务工具(结果仅面板可见) |
118
123
  | `probeTimeoutMs` | `10000` | 单次探测超时(ms) |
119
124
  | `maxProbes` | `10` | 面板展示的探测记录数 |
120
125
  | `refreshIntervalMs` | `0` | 建议的面板刷新间隔(ms);`0` = 按需 |
121
- | `outputLanguage` | `en` | `/mcp` 输出语言:`en\|zh\|es\|pt\|hi` |
126
+ | `outputLanguage` | `en` | `/mcp` 输出语言:`en \| zh \| es \| pt \| hi` |
122
127
  | `passiveProbeEnabled` | `false` | 周期性探测 streamable-http 服务器 |
123
128
  | `passiveProbeIntervalMs` | `60000` | 被动探测间隔(ms) |
124
129
  | `trialEnabled` | `true` | 工具试用台(设置页 + `/mcp call`) |
125
- | `trialTimeoutMs` | `120000` | 每次试用调用的面板侧截止时间 |
130
+ | `trialTimeoutMs` | `120000` | 每次试用调用的面板侧截止时间(ms) |
126
131
  | `trialMaxResultChars` | `60000` | 试用结果载荷上限(字符) |
127
132
  | `writeEnabled` | `true` | 总开关:`false` 拒绝一切 profile 写入(仍可复制片段) |
128
133
  | `backupCount` | `5` | 每次写入保留的 `cordis.patch.yml` 备份数 |
129
134
 
130
- ## Resources 与 Prompts
135
+ ## Tools & surfaces
136
+
137
+ | 表面 | 类型 | 说明 |
138
+ |---|---|---|
139
+ | `/mcp` | command | 每 server 状态行;模型可读、日志可重建 |
140
+ | `/mcp <server> tools` | command | 模型可见的 `mcp__*` 工具名与描述 |
141
+ | `/mcp <server> health` | command | 由脱敏错误文本派生的自愈建议 |
142
+ | `/mcp <server> call <tool> [json]` | command | 经官方工具管线试用调用 |
143
+ | `mcp_probe` | tool | 可选 Streamable HTTP 连通性探测(后台任务) |
144
+ | 设置 → 插件 → MCP 页 | UI 槽位 | 状态卡片、server CRUD 与工具试用台 |
145
+ | `mcpPanel` Typert Remote | service | 只读快照通道(Host → client) |
146
+
147
+ ## Resources & Prompts
148
+
149
+ 官方 client 明确记载 *"Tools 是当前唯一桥接的 MCP 能力"*——Resources 与 Prompts 处于 deferred 状态。控制台特征探测了上游提案中的 catalog seam,一旦落地即可只读展示列表;在此之前,能力一览中二者均标注**待官方支持**。
131
150
 
132
- 官方 client 明确记载"Tools 是当前唯一桥接的 MCP 能力"——Resources 与 Prompts 处于 deferred 状态。控制台特征探测了上游提案中的 catalog seam,一旦落地即可只读展示列表;在此之前,能力一览中二者均标注**待官方支持**(详见 deepseek-harness `docs/upstream-proposal.md` 的补充提案)。
151
+ ## Permissions & data
133
152
 
134
- ## 开发
153
+ - **权限**:`dshWorkshop` manifest 声明 `network:outbound` 与 `native-code:none`。
154
+ - **数据**:面板只读;只写入只追加的 `cordis.patch.yml` 片段(走审批、先备份)。URL 查询凭据、userinfo 密码、header 值、Bearer token、JWT 在渲染前一律打码;配置的 `headers` 从不进入任何快照,env/header 的**值**绝不出 Host(编辑器只见 key)。
155
+
156
+ ## Security boundaries
157
+
158
+ - **桥接层仍是桥接层。** 不改传输、OAuth、协议;每个 server 一行 mcp-client,与你手写完全一致。
159
+ - **不伪造状态。** 无上游观测时连接字段显示 `unknown` / `—` 并标注 `statusSource: 'derived'`;退出码与 stderr 尾部绝不臆造。
160
+ - **写入只追加、走审批、先备份。** 控制台从不改写 `cordis.patch.yml`:只追加生成的操作,并保留最新 `backupCount` 份备份。
161
+ - **零提示词注入。** 本插件不注册任何提示词段落;对模型可见的文本只有两个工具/命令描述。
162
+
163
+ ## Known limitations
164
+
165
+ - **Resources 与 Prompts** 待官方支持——官方 client 仅桥接工具。
166
+ - **退出码 / stderr 尾部** 在 client 暴露前如实标注*待官方支持*。
167
+ - **只读面板** —— 控制台从不伪造连接状态;不可观测字段显示 `unknown` / `-1` / `—`。
168
+
169
+ ## Development
135
170
 
136
171
  ```sh
137
172
  pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
138
173
  ```
139
174
 
140
- - `src/patch.ts` — 校验、保留语义合并、YAML 片段渲染(纯函数)。
141
- - `src/write.ts` — 备份 + 追加 + 保留策略(唯一写文件模块)。
142
- - `src/trial.ts` — 经 `ctx.tools.execute()` 的官方管线试用调用。
143
- - `src/diagnostics.ts` — 错误模式 → 建议映射(纯函数)。
144
- - `src/client/` — 设置页控制台(服务器编辑器、试用台、诊断)。
145
- - `scripts/verify-headless.mjs` 启动真实 web profile 并打印 `/mcp` 实际输出。
175
+ `scripts/verify-headless.mjs` 启动真实 web profile 并打印 `/mcp` 实际输出。发布:`node scripts/release.mjs <x.y.z>` 跑全量门禁、提交并本地打 `v<x.y.z>` 标签(绝不推送)。
176
+
177
+ ## Topics
146
178
 
147
- 发布:`node scripts/release.mjs <x.y.z>` 跑全量门禁、提交并本地打 `v<x.y.z>` 标签(绝不推送)。
179
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `mcp`, `mcp-client`, `observability`, `panel`
148
180
 
149
- ## 许可证
181
+ ## Contributors
150
182
 
151
- Apache-2.0 —— 见 [LICENSE](LICENSE)。
183
+ - [@PerryLink](https://github.com/PerryLink) —— 创建者与维护者。
184
+ - [@xiaoyuyu6420](https://github.com/xiaoyuyu6420) —— 诊断出干净 checkout 构建失败背后缺失的 client devDependencies(PR #5)。
185
+
186
+ ## PerryLink DSH Plugin Family
187
+
188
+ 本项目是 [PerryLink](https://github.com/PerryLink) 维护的 [DeepSeek Harness 插件](https://github.com/PerryLink)之一。如果你觉得这个插件有用,其余的很可能同样有用:
189
+
190
+ | 插件 | 一句话说明 |
191
+ |---|---|
192
+ | [dsh-mask](https://github.com/PerryLink/dsh-mask) | PII 脱敏中间件:模型边界匿名化、展示层还原 |
193
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | 只读 MCP 运行时面板:/mcp 命令 + 设置页,状态/工具/错误一览 |
194
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | 工程纪律守门:需求审讯、测试证据门、对抗评审 |
195
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | 持久化后台子代理:Web 侧边栏进度、随时留言与打断 |
196
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | 基于语言服务器的诊断/格式化/补全/代码动作/重命名 |
197
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | 对标 Claude Code outputStyles 的运行时风格切换 |
198
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | 对标 Claude Code /rewind:快照、会话 fork、一键回退 |
199
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code 风格声明式 allow/deny/ask 权限规则,带审计 |
200
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | 审批链上的第二模型自动审查,默认 fail-closed |
201
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | 带审批门的跨会话记忆:ctx.memory + SQLite + memory 工具 |
202
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | 安全审计技能包:密钥扫描、依赖与供应链审查 |
203
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | 在 Web 侧边栏置顶会话,持久排序 |
204
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Web 作曲器终端式输入历史:方向键、Ctrl+R 搜索 |
205
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | DSH 的 GitHub PR/issue 集成,所有写操作经审批门 |
206
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | 插件开发知识库,随 bundle 安装的按需 agent 技能 |
207
+ | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | 把 Claude Code 会话、记忆、技能和 CLAUDE.md 迁入 DSH |
208
+
209
+ ## License
210
+
211
+ [Apache License 2.0](LICENSE) © 2026 dsh-mcp-panel contributors
package/lib/index.js CHANGED
@@ -600,7 +600,7 @@ const INITIALIZE_PROTOCOL_VERSION = "2024-11-05";
600
600
  * advertised version tracks the package version. */
601
601
  const PROBE_CLIENT_INFO = {
602
602
  name: "dsh-mcp-panel",
603
- version: "0.4.0"
603
+ version: "0.4.2"
604
604
  };
605
605
  /** Display cap for server-reported name/version fields in probe details. */
606
606
  const DISPLAY_LIMIT = 80;
@@ -1664,8 +1664,6 @@ async function pruneBackups(filePath, keep) {
1664
1664
  //#region src/trial.ts
1665
1665
  /** Panel-owned marker prefix so trial callIds can never collide with model calls. */
1666
1666
  const TRIAL_CALL_PREFIX = "mcp-panel-trial";
1667
- /** Trial callId counter per service instance. */
1668
- let trialCounter = 0;
1669
1667
  /**
1670
1668
  * Validate one trial request structurally; returns an English error string
1671
1669
  * or null. Never throws on untrusted input.
@@ -1684,46 +1682,55 @@ function validateTrialRequest(request) {
1684
1682
  return null;
1685
1683
  }
1686
1684
  /**
1687
- * Run one trial call through the official tool pipeline.
1688
- *
1689
- * @param tools - the registry the call executes through.
1690
- * @param agents - optional live agent registry for approval routing.
1691
- * @param sessionId - optional current session id from the client.
1692
- * @param request - the validated trial request.
1693
- * @param limits - panel-side deadline and result cap.
1694
- * @returns the wire result.
1685
+ * Create the trial caller: one callId sequence per service instance, so a
1686
+ * plugin reload never carries counter state across mounts.
1687
+ * @returns the trial caller bound to its own sequence.
1695
1688
  */
1696
- async function runTrialCall(tools, agents, sessionId, request, limits) {
1697
- const { serverName, toolName } = request;
1698
- const prefix = `mcp__${serverName}__`;
1699
- if (!toolName.startsWith(prefix)) throw new Error(`tool "${toolName}" does not belong to server "${serverName}" (expected the ${prefix}… namespace)`);
1700
- if (tools.get(toolName) === void 0) throw new Error(`tool "${toolName}" is not registered — the server may be down or its sync failed`);
1701
- let argumentsValue;
1702
- try {
1703
- argumentsValue = JSON.parse(request.argsJson);
1704
- } catch {
1705
- throw new Error("argsJson is not valid JSON");
1706
- }
1707
- const agent = sessionId === void 0 || sessionId === "" ? void 0 : agents?.get(sessionId);
1708
- const callId = `${TRIAL_CALL_PREFIX}-${++trialCounter}`;
1709
- const started = Date.now();
1710
- const execution = {
1711
- callId,
1712
- name: toolName,
1713
- arguments: argumentsValue,
1714
- ...agent === void 0 ? {} : { agent },
1715
- signal: AbortSignal.timeout(limits.timeoutMs)
1716
- };
1717
- const result = await tools.execute(execution);
1718
- const durationMs = Date.now() - started;
1719
- const { json, truncated } = projectTrialResult(result, limits.maxResultChars);
1720
- return {
1721
- callId: String(callId),
1722
- isError: result.isError,
1723
- truncated,
1724
- durationMs,
1725
- resultJson: json
1726
- };
1689
+ function createTrialCaller() {
1690
+ let trialCounter = 0;
1691
+ return {
1692
+ /**
1693
+ * Run one trial call through the official tool pipeline.
1694
+ *
1695
+ * @param tools - the registry the call executes through.
1696
+ * @param agents - optional live agent registry for approval routing.
1697
+ * @param sessionId - optional current session id from the client.
1698
+ * @param request - the validated trial request.
1699
+ * @param limits - panel-side deadline and result cap.
1700
+ * @returns the wire result.
1701
+ */
1702
+ async runTrialCall(tools, agents, sessionId, request, limits) {
1703
+ const { serverName, toolName } = request;
1704
+ const prefix = `mcp__${serverName}__`;
1705
+ if (!toolName.startsWith(prefix)) throw new Error(`tool "${toolName}" does not belong to server "${serverName}" (expected the ${prefix}… namespace)`);
1706
+ if (tools.get(toolName) === void 0) throw new Error(`tool "${toolName}" is not registered — the server may be down or its sync failed`);
1707
+ let argumentsValue;
1708
+ try {
1709
+ argumentsValue = JSON.parse(request.argsJson);
1710
+ } catch {
1711
+ throw new Error("argsJson is not valid JSON");
1712
+ }
1713
+ const agent = sessionId === void 0 || sessionId === "" ? void 0 : agents?.get(sessionId);
1714
+ const callId = `${TRIAL_CALL_PREFIX}-${++trialCounter}`;
1715
+ const started = Date.now();
1716
+ const execution = {
1717
+ callId,
1718
+ name: toolName,
1719
+ arguments: argumentsValue,
1720
+ ...agent === void 0 ? {} : { agent },
1721
+ signal: AbortSignal.timeout(limits.timeoutMs)
1722
+ };
1723
+ const result = await tools.execute(execution);
1724
+ const durationMs = Date.now() - started;
1725
+ const { json, truncated } = projectTrialResult(result, limits.maxResultChars);
1726
+ return {
1727
+ callId: String(callId),
1728
+ isError: result.isError,
1729
+ truncated,
1730
+ durationMs,
1731
+ resultJson: json
1732
+ };
1733
+ } };
1727
1734
  }
1728
1735
  /** Project the registry outcome onto the lossless JSON the client renders. */
1729
1736
  function projectTrialResult(result, budget) {
@@ -1919,6 +1926,8 @@ var McpPanelService = class extends TypertRemoteService {
1919
1926
  observedAt = /* @__PURE__ */ new Map();
1920
1927
  /** Latest passive-probe reachability per server namespace. */
1921
1928
  probeStates = /* @__PURE__ */ new Map();
1929
+ /** The trial caller with this instance's own callId sequence. */
1930
+ trialCaller = createTrialCaller();
1922
1931
  /** Passive-probe loop guard: one sweep at a time. */
1923
1932
  passiveRunning = false;
1924
1933
  /**
@@ -2137,7 +2146,7 @@ var McpPanelService = class extends TypertRemoteService {
2137
2146
  }
2138
2147
  const problem = validateTrialRequest(request);
2139
2148
  if (problem !== null) throw new Error(`dsh-mcp-panel: ${problem}`);
2140
- return runTrialCall(this.ctx.tools, agentsOf(this.ctx), sessionId, request, {
2149
+ return this.trialCaller.runTrialCall(this.ctx.tools, agentsOf(this.ctx), sessionId, request, {
2141
2150
  timeoutMs: this.config.trialTimeoutMs,
2142
2151
  maxResultChars: this.config.trialMaxResultChars
2143
2152
  });
@@ -2289,4 +2298,4 @@ async function apply(ctx, config) {
2289
2298
  });
2290
2299
  }
2291
2300
  //#endregion
2292
- export { Config, MCP_STATUS_EVENT, McpPanelService, aggregateServerView, aggregateSnapshot, appendPatchFragment, apply, configViewOf, countServerTools, defaultEntryId, deriveTarget, diagnoseServer, groupMcpTools, inject, mcpCommand, mcpProbeTool, mergeServerConfig, name, nextEntryId, parseMcpArgs, probeEndpoint, probeJob, renderHealth, renderList, renderPatchFragment, renderPatchSuggestion, renderServer, renderTools, renderTrialCall, resolveConfig, resolvePatchOp, runTrialCall, sanitizeError, sanitizeText, sanitizeUrl, serverNameOf, validateServerConfig, validateTrialRequest, yamlScalar };
2301
+ export { Config, MCP_STATUS_EVENT, McpPanelService, aggregateServerView, aggregateSnapshot, appendPatchFragment, apply, configViewOf, countServerTools, createTrialCaller, defaultEntryId, deriveTarget, diagnoseServer, groupMcpTools, inject, mcpCommand, mcpProbeTool, mergeServerConfig, name, nextEntryId, parseMcpArgs, probeEndpoint, probeJob, renderHealth, renderList, renderPatchFragment, renderPatchSuggestion, renderServer, renderTools, renderTrialCall, resolveConfig, resolvePatchOp, sanitizeError, sanitizeText, sanitizeUrl, serverNameOf, validateServerConfig, validateTrialRequest, yamlScalar };
@@ -14,9 +14,9 @@
14
14
  *
15
15
  * @module dsh-mcp-panel/aggregate
16
16
  */
17
- import { type McpToolGroup } from './grouping.ts';
18
- import type { McpServerStatus } from './upstream.ts';
19
- import type { McpFiberPhase, McpPanelSnapshot, McpServerConfigView, McpServerView, McpTransport } from './wire.ts';
17
+ import { type McpToolGroup } from './grouping.js';
18
+ import type { McpServerStatus } from './upstream.js';
19
+ import type { McpFiberPhase, McpPanelSnapshot, McpServerConfigView, McpServerView, McpTransport } from './wire.js';
20
20
  /** One loader-derived mcp-client row (config is raw serialized data). */
21
21
  export interface McpLoaderRow {
22
22
  /** Loader entry id (the patch row id). */
@@ -1,7 +1,7 @@
1
1
  /** The MCP management console tab: server cards, CRUD editor, trial console, capabilities, probes. */
2
2
  import { type ReactNode } from 'react';
3
3
  import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
4
- import type { McpPanelSnapshot, McpTrialResultWire, PatchPreview, PatchWriteResult, ProbeStarted } from '../wire.ts';
4
+ import type { McpPanelSnapshot, McpTrialResultWire, PatchPreview, PatchWriteResult, ProbeStarted } from '../wire.js';
5
5
  /** Registration-side injected face: the console RPCs (RemoteResult already unwrapped). */
6
6
  export interface McpPanelTabInjected {
7
7
  /** Read the current Host snapshot. */
@@ -1,7 +1,7 @@
1
1
  /** Server CRUD editor: form → patch fragment → copy or approval-gated write. */
2
2
  import { type ReactNode } from 'react';
3
3
  import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
4
- import type { McpServerConfigView, PatchPreview, PatchWriteResult } from '../wire.ts';
4
+ import type { McpServerConfigView, PatchPreview, PatchWriteResult } from '../wire.js';
5
5
  /** Editor callbacks supplied by the tab. */
6
6
  export interface ServerEditorActions {
7
7
  previewPatch: (opJson: string) => Promise<PatchPreview>;
@@ -1,7 +1,7 @@
1
1
  /** Tool trial console: server → registered mcp__* tool → JSON args → official pipeline. */
2
2
  import { type ReactNode } from 'react';
3
3
  import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
4
- import type { McpServerView, McpTrialResultWire } from '../wire.ts';
4
+ import type { McpServerView, McpTrialResultWire } from '../wire.js';
5
5
  /** Trial console props supplied by the tab. */
6
6
  export interface TrialConsoleProps {
7
7
  t: PropsLocale<'settings.mcpPanel'>['t'];
@@ -10,11 +10,11 @@
10
10
  * @module dsh-mcp-panel/client
11
11
  */
12
12
  import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client';
13
- import { type McpPanelLocaleKey } from './locales.ts';
14
- export type { McpPanelTabInjected, McpPanelTabProps } from './McpPanelTab.tsx';
15
- export type { McpPanelLocaleKey } from './locales.ts';
16
- export { presentMcpPanel, connectionBadge, probeBadge } from './present.ts';
17
- export type { PresentedMcpPanel, PresentedProbeRow, PresentedServerRow, BadgeTone } from './present.ts';
13
+ import { type McpPanelLocaleKey } from './locales.js';
14
+ export type { McpPanelTabInjected, McpPanelTabProps } from './McpPanelTab.js';
15
+ export type { McpPanelLocaleKey } from './locales.js';
16
+ export { presentMcpPanel, connectionBadge, probeBadge } from './present.js';
17
+ export type { PresentedMcpPanel, PresentedProbeRow, PresentedServerRow, BadgeTone } from './present.js';
18
18
  declare module '@deepseek-ai/dsh-client-ui-slots' {
19
19
  interface LocaleNamespaceMap {
20
20
  /** MCP management console copy. */
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module dsh-mcp-panel/client/present
9
9
  */
10
- import type { McpPanelSnapshot, McpServerView, McpProbeView } from '../wire.ts';
10
+ import type { McpPanelSnapshot, McpServerView, McpProbeView } from '../wire.js';
11
11
  /** Badge tones the stylesheet understands. */
12
12
  export type BadgeTone = 'ok' | 'warn' | 'error' | 'muted';
13
13
  /** Render-ready server row plus derived badge facts. */
@@ -8,7 +8,7 @@
8
8
  * @module dsh-mcp-panel/client/remote
9
9
  */
10
10
  import type { RemoteResult } from '@deepseek-ai/dsh-typert-protocol';
11
- import type { McpPanelSnapshot, McpTrialResultWire, PatchPreview, PatchWriteResult, ProbeStarted } from '../wire.ts';
11
+ import type { McpPanelSnapshot, McpTrialResultWire, PatchPreview, PatchWriteResult, ProbeStarted } from '../wire.js';
12
12
  declare module '@deepseek-ai/dsh-typert-protocol' {
13
13
  interface TypertRemoteNamespace$mcpPanel {
14
14
  /** Read the current console snapshot. */
@@ -20,8 +20,8 @@
20
20
  * @module dsh-mcp-panel/command
21
21
  */
22
22
  import type { CommandDefinition } from '@deepseek-ai/dsh-commands';
23
- import type { McpPanelService } from './service.ts';
24
- import type { McpPanelSnapshot, McpServerView } from './wire.ts';
23
+ import type { McpPanelService } from './service.js';
24
+ import type { McpPanelSnapshot, McpServerView } from './wire.js';
25
25
  /** Display language for the `/mcp` output. */
26
26
  export type CommandLanguage = 'en' | 'zh' | 'es' | 'pt' | 'hi';
27
27
  /** Every display string the renderers emit, per language. */
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * @module dsh-mcp-panel/diagnostics
16
16
  */
17
- import type { McpFiberPhase, McpTransport } from './wire.ts';
17
+ import type { McpFiberPhase, McpTransport } from './wire.js';
18
18
  /** Stable suggestion codes; every surface localizes them by key. */
19
19
  export type McpSuggestionCode = 'command-not-found' | 'command-spawn-failed' | 'connection-refused' | 'connection-dropped' | 'timeout' | 'dns' | 'auth-401' | 'auth-403' | 'path-404' | 'rate-limit' | 'permission' | 'reconnect-exhausted' | 'reconnect-waiting' | 'entry-failed';
20
20
  /** One derived health suggestion. */
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * @module dsh-mcp-panel/grouping
12
12
  */
13
- import type { McpToolView } from './wire.ts';
13
+ import type { McpToolView } from './wire.js';
14
14
  /** The `mcp__` namespace prefix every bridged MCP tool name starts with. */
15
15
  export declare const MCP_TOOL_PREFIX = "mcp__";
16
16
  /** One tool group: a server namespace with its model-visible tools. */
@@ -29,23 +29,23 @@
29
29
  * @module dsh-mcp-panel
30
30
  */
31
31
  import type { Context } from '@deepseek-ai/cordis';
32
- import { Config } from './config.ts';
32
+ import { Config } from './config.js';
33
33
  export declare const name = "mcp-panel";
34
34
  /** Hard services: the facts the console reads. `commands`/`jobs` are optional children. */
35
35
  export declare const inject: string[];
36
- export { Config, resolveConfig } from './config.ts';
37
- export { McpPanelService } from './service.ts';
38
- export { mcpCommand, parseMcpArgs, renderList, renderPatchSuggestion, renderServer, renderTools, renderTrialCall, renderHealth } from './command.ts';
39
- export { groupMcpTools, countServerTools } from './grouping.ts';
40
- export { aggregateServerView, aggregateSnapshot, configViewOf, deriveTarget, serverNameOf } from './aggregate.ts';
41
- export { sanitizeError, sanitizeText, sanitizeUrl } from './sanitize.ts';
42
- export { diagnoseServer, type McpDiagnostic, type McpSuggestionCode, type McpHealthFacts } from './diagnostics.ts';
43
- export { probeEndpoint, probeJob, mcpProbeTool } from './probe.ts';
44
- export { validateServerConfig, mergeServerConfig, renderPatchFragment, resolvePatchOp, nextEntryId, defaultEntryId, yamlScalar, type McpServerConfigInput, type McpPatchOp, type McpPatchResolution, } from './patch.ts';
45
- export { appendPatchFragment } from './write.ts';
46
- export { runTrialCall, validateTrialRequest, type McpTrialRequest, type McpTrialResult } from './trial.ts';
47
- export { MCP_STATUS_EVENT, type McpStatusPayload, type McpStatusQuery, type McpServerStatus } from './upstream.ts';
48
- export type * from './wire.ts';
36
+ export { Config, resolveConfig } from './config.js';
37
+ export { McpPanelService } from './service.js';
38
+ export { mcpCommand, parseMcpArgs, renderList, renderPatchSuggestion, renderServer, renderTools, renderTrialCall, renderHealth } from './command.js';
39
+ export { groupMcpTools, countServerTools } from './grouping.js';
40
+ export { aggregateServerView, aggregateSnapshot, configViewOf, deriveTarget, serverNameOf } from './aggregate.js';
41
+ export { sanitizeError, sanitizeText, sanitizeUrl } from './sanitize.js';
42
+ export { diagnoseServer, type McpDiagnostic, type McpSuggestionCode, type McpHealthFacts } from './diagnostics.js';
43
+ export { probeEndpoint, probeJob, mcpProbeTool } from './probe.js';
44
+ export { validateServerConfig, mergeServerConfig, renderPatchFragment, resolvePatchOp, nextEntryId, defaultEntryId, yamlScalar, type McpServerConfigInput, type McpPatchOp, type McpPatchResolution, } from './patch.js';
45
+ export { appendPatchFragment } from './write.js';
46
+ export { createTrialCaller, validateTrialRequest, type McpTrialRequest, type McpTrialResult } from './trial.js';
47
+ export { MCP_STATUS_EVENT, type McpStatusPayload, type McpStatusQuery, type McpServerStatus } from './upstream.js';
48
+ export type * from './wire.js';
49
49
  /**
50
50
  * Mount the console: the snapshot/action service, the upstream status seam
51
51
  * consumer, the `/mcp` command (when commands exist), and the probe tool
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAMnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,2FAA2F;AAC3F,eAAO,MAAM,MAAM,UAAsB,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpJ,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACjH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAClH,mBAAmB,WAAW,CAAA;AAE9B;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAMnD,eAAO,MAAM,IAAI,cAAc,CAAA;AAE/B,2FAA2F;AAC3F,eAAO,MAAM,MAAM,UAAsB,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACpJ,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACjH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAClH,mBAAmB,WAAW,CAAA;AAE9B;;;;;;;GAOG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCvE"}
@@ -23,7 +23,7 @@
23
23
  * @module dsh-mcp-panel/patch
24
24
  */
25
25
  import { z } from 'zod';
26
- import type { McpServerConfigView } from './wire.ts';
26
+ import type { McpServerConfigView } from './wire.js';
27
27
  /** The official bridge module every generated row names. */
28
28
  export declare const MCP_CLIENT_MODULE = "@deepseek-ai/dsh-mcp-client";
29
29
  /** Wire-shaped complete server config the editor submits (JSON only). */
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import type { JobHooks, JobRegistry } from '@deepseek-ai/dsh-jobs';
12
12
  import type { ToolDefinition } from '@deepseek-ai/dsh-tools';
13
- import type { McpPanelService } from './service.ts';
13
+ import type { McpPanelService } from './service.js';
14
14
  /** Producer kind; also the job-id prefix. */
15
15
  export declare const PROBE_KIND = "mcp-probe";
16
16
  declare module '@deepseek-ai/dsh-jobs' {