cann-doctor 0.1.0 → 0.1.1
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 +13 -5
- package/client.js +8 -32
- package/docs/installation.md +31 -3
- package/docs/release.md +9 -4
- package/docs/verification.md +3 -1
- package/package.json +39 -8
package/README.md
CHANGED
|
@@ -6,19 +6,27 @@ DeepSeek Harness Desktop(DSH)的原生 CANN 故障诊断工作台插件。
|
|
|
6
6
|
- 启动时及每 6 小时检查版本;更新验证后切换,网络失败保留旧版。
|
|
7
7
|
- Skill 完成后在当前会话的右侧工作台展示 Markdown / HTML 诊断报告。
|
|
8
8
|
- 报告提供「本次诊断是否准确?」「👍 诊断准确」「👎 诊断错误」,反馈可更正并持久保存。
|
|
9
|
-
- 原生 DSH bundle
|
|
9
|
+
- 原生 DSH bundle 已发布到 npm 官方源,另提供本地安装包。
|
|
10
10
|
|
|
11
11
|
## 安装
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
CANN Doctor `0.1.1` 已在 [npm 官方源](https://www.npmjs.com/package/cann-doctor/v/0.1.1)公开可见。在 DSH「插件」页面添加 `cann-doctor@0.1.1` 并启用。进入会话后点击顶部 `✚ CANN Doctor` 打开右侧工作台;如安装提示需要重启,请重启 Desktop。
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
CLI 的 Web profile 安装示例:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
dsh plugin --profile web add cann-doctor@0.1.1 --registry=https://registry.npmjs.org/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
已通过隔离 DSH profile 的 npm 安装和原生 Host 集成验证。也可在 DSH「插件」页添加 `cann-doctor-0.1.1.tgz` 的**绝对路径**安装本地包。若此前遇到 `cann-doctor declares no dsh.bundle` 或仍在下载 `0.0.0-stage` 占位包,请取消旧安装并使用固定版本 `cann-doctor@0.1.1` 重试,详见[安装说明](docs/installation.md#npm-占位包报错)。
|
|
22
|
+
|
|
23
|
+
已核实目标:DeepSeek Harness `0.2.1-rc.5`。官方 Skill 在首次激活时通过 Git 从 GitCode 下载,需要 Git 与 GitCode 网络访问。故障诊断使用当前会话模型与用户提供的真实日志。采集操作需要 Ascend 目标环境。
|
|
16
24
|
|
|
17
25
|
```text
|
|
18
26
|
使用 CANN Doctor 分析 /path/to/cann-logs,生成有证据链和可信度的报告,并发布到右侧工作台。
|
|
19
27
|
```
|
|
20
28
|
|
|
21
|
-
完整配置和使用边界见[安装说明](docs/installation.md)。反馈默认只保存在本机,插件没有云端反馈上传;HTML 为禁用脚本的隔离静态预览。
|
|
29
|
+
完整配置和使用边界见[安装说明](docs/installation.md),在 DSH「发现」页分发见[市场索引说明](docs/marketplace.md)。反馈默认只保存在本机,插件没有云端反馈上传;HTML 为禁用脚本的隔离静态预览。
|
|
22
30
|
|
|
23
31
|
## 开发与发布
|
|
24
32
|
|
|
@@ -27,7 +35,7 @@ npm ci
|
|
|
27
35
|
npm run pack:release
|
|
28
36
|
```
|
|
29
37
|
|
|
30
|
-
生成 `dist/cann-doctor-0.1.
|
|
38
|
+
生成 `dist/cann-doctor-0.1.1.tgz`、校验和、产物清单及 Release 说明。发布步骤见[发布文档](docs/release.md),测试和现场验收范围见[验证记录](docs/verification.md),实施记录见[计划](docs/superpowers/plans/2026-11-05-cann-doctor.md)。
|
|
31
39
|
|
|
32
40
|
## 代码结构
|
|
33
41
|
|
package/client.js
CHANGED
|
@@ -12,9 +12,7 @@ window.__ModuleLoader__.load({
|
|
|
12
12
|
loading: 'Loading…', selectReport: 'Choose a diagnosis report',
|
|
13
13
|
'feedback.question': 'Was this diagnosis accurate?', 'feedback.accurate': 'Diagnosis accurate',
|
|
14
14
|
'feedback.incorrect': 'Diagnosis incorrect', 'feedback.saved': 'Feedback saved',
|
|
15
|
-
'
|
|
16
|
-
'skills.updating': 'Updating skills…', 'skills.ready': 'Skills ready', 'skills.pending': 'Preparing diagnosis skills…',
|
|
17
|
-
'skills.updated': 'Skills are up to date', 'report.preview': 'Diagnosis report preview',
|
|
15
|
+
'report.preview': 'Diagnosis report preview',
|
|
18
16
|
'report.created': 'Created', 'report.download': 'Download report', error: 'CANN Doctor could not finish this operation',
|
|
19
17
|
};
|
|
20
18
|
const zh = {
|
|
@@ -24,15 +22,13 @@ window.__ModuleLoader__.load({
|
|
|
24
22
|
loading: '正在加载…', selectReport: '选择诊断报告',
|
|
25
23
|
'feedback.question': '本次诊断是否准确?', 'feedback.accurate': '诊断准确',
|
|
26
24
|
'feedback.incorrect': '诊断错误', 'feedback.saved': '反馈已保存',
|
|
27
|
-
'
|
|
28
|
-
'skills.updating': '正在更新技能…', 'skills.ready': '技能已就绪', 'skills.pending': '正在准备诊断技能…',
|
|
29
|
-
'skills.updated': '技能已是最新版本', 'report.preview': '诊断报告预览',
|
|
25
|
+
'report.preview': '诊断报告预览',
|
|
30
26
|
'report.created': '生成时间', 'report.download': '下载报告', error: 'CANN Doctor 操作未完成',
|
|
31
27
|
};
|
|
32
28
|
const css = `
|
|
33
29
|
.cann-doctor{height:100%;min-height:0;display:flex;flex-direction:column;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:1.6}
|
|
34
30
|
.cann-doctor *{box-sizing:border-box}.cann-doctor button,.cann-doctor select,.cann-doctor-entry{font:inherit;color:inherit}
|
|
35
|
-
.cann-doctor-toolbar,.cann-doctor-feedback
|
|
31
|
+
.cann-doctor-toolbar,.cann-doctor-feedback{padding:16px 20px;border-bottom:1px solid var(--dsw-alias-border-l1);flex:none}
|
|
36
32
|
.cann-doctor-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
|
|
37
33
|
.cann-doctor h2{font-size:16px;margin:0}.cann-doctor-muted{color:var(--dsw-alias-label-secondary);font-size:12px}
|
|
38
34
|
.cann-doctor button,.cann-doctor-entry{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-1);padding:6px 10px;cursor:pointer}
|
|
@@ -46,7 +42,7 @@ window.__ModuleLoader__.load({
|
|
|
46
42
|
.cann-doctor-content code{font-family:ui-monospace,monospace;font-size:12px}.cann-doctor-content table{border-collapse:collapse;width:100%;font-size:12px}.cann-doctor-content td,.cann-doctor-content th{border:1px solid var(--dsw-alias-border-l2);padding:7px;text-align:left}
|
|
47
43
|
.cann-doctor-content a{color:var(--dsw-alias-brand-primary)}.cann-doctor-content iframe{height:100%;min-height:360px;width:100%;border:0;background:var(--dsw-alias-bg-layer-1)}
|
|
48
44
|
.cann-doctor-empty{margin:36px auto;max-width:320px;text-align:center}.cann-doctor-feedback p{margin:0 0 10px}.cann-doctor-error{padding:8px 20px;color:var(--dsw-alias-state-error-primary)}
|
|
49
|
-
.cann-doctor-
|
|
45
|
+
.cann-doctor-feedback{border-top:1px solid var(--dsw-alias-border-l1);border-bottom:0}
|
|
50
46
|
`;
|
|
51
47
|
|
|
52
48
|
/** The shared Fetch channel authenticates requests in Desktop and Web, without command-history writes. */
|
|
@@ -211,7 +207,6 @@ window.__ModuleLoader__.load({
|
|
|
211
207
|
);
|
|
212
208
|
const reports = snapshot.reports;
|
|
213
209
|
const [selected, setSelected] = React.useState('');
|
|
214
|
-
const [status, setStatus] = React.useState(null);
|
|
215
210
|
const [error, setError] = React.useState('');
|
|
216
211
|
const [busy, setBusy] = React.useState('');
|
|
217
212
|
const [loading, setLoading] = React.useState(true);
|
|
@@ -222,8 +217,8 @@ window.__ModuleLoader__.load({
|
|
|
222
217
|
React.useEffect(() => {
|
|
223
218
|
if (!tab.visible) return;
|
|
224
219
|
let disposed = false;
|
|
225
|
-
|
|
226
|
-
.then((
|
|
220
|
+
loadReports(sessionId)
|
|
221
|
+
.then(() => { if (!disposed) setError(''); })
|
|
227
222
|
.catch((error) => { if (!disposed) setError(error.message); })
|
|
228
223
|
.finally(() => { if (!disposed) setLoading(false); });
|
|
229
224
|
return () => { disposed = true; };
|
|
@@ -234,26 +229,10 @@ window.__ModuleLoader__.load({
|
|
|
234
229
|
loadReport(sessionId, summary.id).catch((error) => { if (!disposed) setError(error.message); });
|
|
235
230
|
return () => { disposed = true; };
|
|
236
231
|
}, [sessionId, tab.visible, summary?.id]);
|
|
237
|
-
React.useEffect(() => {
|
|
238
|
-
if (!tab.visible || !status?.updating) return;
|
|
239
|
-
let disposed = false;
|
|
240
|
-
let pending = false;
|
|
241
|
-
const timer = setInterval(async () => {
|
|
242
|
-
if (disposed || pending || document.hidden) return;
|
|
243
|
-
pending = true;
|
|
244
|
-
try {
|
|
245
|
-
const next = await callDoctor(sessionId, { action: 'status' });
|
|
246
|
-
if (!disposed) setStatus(next);
|
|
247
|
-
} catch (error) { if (!disposed) setError(error.message); }
|
|
248
|
-
finally { pending = false; }
|
|
249
|
-
}, 5000);
|
|
250
|
-
return () => { disposed = true; clearInterval(timer); };
|
|
251
|
-
}, [sessionId, tab.visible, status?.updating]);
|
|
252
232
|
async function run(action) {
|
|
253
233
|
setBusy(action); setError('');
|
|
254
234
|
try {
|
|
255
|
-
|
|
256
|
-
else setStatus(await callDoctor(sessionId, { action: 'update-skills' }));
|
|
235
|
+
await loadReports(sessionId);
|
|
257
236
|
} catch (error) { setError(error.message); }
|
|
258
237
|
finally { setBusy(''); }
|
|
259
238
|
}
|
|
@@ -283,10 +262,7 @@ window.__ModuleLoader__.load({
|
|
|
283
262
|
h('button', { type: 'button', disabled: !!busy, 'aria-pressed': report.feedback?.verdict === 'accurate', onClick: () => vote('accurate') }, '👍 ', t('feedback.accurate')),
|
|
284
263
|
h('button', { type: 'button', disabled: !!busy, 'aria-pressed': report.feedback?.verdict === 'incorrect', onClick: () => vote('incorrect') }, '👎 ', t('feedback.incorrect'))),
|
|
285
264
|
report.feedback && h('p', { className: 'cann-doctor-muted', role: 'status' }, t('feedback.saved'))),
|
|
286
|
-
|
|
287
|
-
h('strong', null, t('skills.title')), h('button', { type: 'button', disabled: !!busy || status?.updating, onClick: () => run('update-skills') }, t(busy === 'update-skills' || status?.updating ? 'skills.updating' : 'skills.update'))),
|
|
288
|
-
h('p', { className: 'cann-doctor-muted', role: 'status' }, t(status?.skills ? 'skills.ready' : 'skills.pending')),
|
|
289
|
-
status?.lastError && h('p', { role: 'alert', className: 'cann-doctor-error' }, status.lastError)));
|
|
265
|
+
);
|
|
290
266
|
}
|
|
291
267
|
|
|
292
268
|
ctx.effect(() => ctx.locale.register(NS, { zh, en }));
|
package/docs/installation.md
CHANGED
|
@@ -4,12 +4,40 @@
|
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
7
|
-
1.
|
|
8
|
-
|
|
7
|
+
插件 `0.1.1` 已在 [npm 官方源](https://www.npmjs.com/package/cann-doctor/v/0.1.1)公开可见。首次激活时的官方 Skill 安装与后续更新需要 Git,并能访问 `https://gitcode.com/cann/oam-tools.git`。
|
|
8
|
+
|
|
9
|
+
1. 安装 DeepSeek Harness Desktop,确保能访问 `https://registry.npmjs.org/`。
|
|
10
|
+
2. 打开左侧「插件」,使用插件安装入口添加 `cann-doctor@0.1.1`。
|
|
9
11
|
3. 确认 CANN Doctor 已启用。安装结果若是 `restart-required`,重启 Desktop 再使用;若是 `failed`,按返回诊断修复,不能只根据包下载完成判断安装成功。
|
|
10
12
|
4. 进入一个会话,点击会话头部的 `✚ CANN Doctor`,右侧打开工作台。新会话首页尚无会话时,DSH 不创建右侧工作台。
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
CLI 的 Web profile 安装示例:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
dsh plugin --profile web add cann-doctor@0.1.1 --registry=https://registry.npmjs.org/
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Desktop profile 的包操作由桌面壳管理,优先使用桌面插件安装入口。也可添加 `cann-doctor-0.1.1.tgz` 的**绝对路径**安装本地包;开发调试可添加仓库绝对路径。
|
|
21
|
+
|
|
22
|
+
已使用 Desktop 随附的 DSH CLI,在隔离的 `DSH_HOME` 中从 npm 官方 registry 安装 `cann-doctor@0.1.1`,并从安装后的包通过原生 Host 的报告发布、反馈及卸载清理验证。
|
|
23
|
+
|
|
24
|
+
### npm 占位包报错
|
|
25
|
+
|
|
26
|
+
发布处理期间,npm 的 `latest` 曾短暂指向 `0.0.0-stage` 占位包。当时在 DSH 中添加无版本号的 `cann-doctor`,可能得到:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
这个包没有声明组合包,无法作为插件安装:cann-doctor declares no dsh.bundle
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
原因是 DSH 读取到的占位包没有 `dsh.bundle`。现在 `0.1.1` 已公开可见且 `latest` 已指向该版本;若此前遇到此错误,请取消旧安装,使用上面的官方 registry 命令或在界面中添加固定版本 `cann-doctor@0.1.1` 重试。
|
|
33
|
+
|
|
34
|
+
如果界面仍在下载 `cann-doctor-0.0.0-stage.tgz` 并报 `ERR_PNPM_TARBALL_EXTRACT`,同样先取消该占位包安装,再指定 `cann-doctor@0.1.1`。也可改用本地包:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
dsh plugin --profile web add /absolute/path/cann-doctor-0.1.1.tgz
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
发布与回读状态见[发布记录](publication.md),安装验证范围见[验证记录](verification.md)。
|
|
13
41
|
|
|
14
42
|
## 默认技能与更新
|
|
15
43
|
|
package/docs/release.md
CHANGED
|
@@ -7,11 +7,11 @@ npm ci
|
|
|
7
7
|
npm run pack:release
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
输出 `dist/cann-doctor-0.1.
|
|
10
|
+
输出 `dist/cann-doctor-0.1.1.tgz`、`dist/SHA256SUMS`、`dist/release.json` 和 `dist/RELEASE-NOTES.md`。tarball 自带原生 DSH manifest、Host/Client、内置工作台 Skill、原始 SVG 图标、中英文元数据、许可证和使用说明。官方诊断 Skill 在激活时从固定源安装,其提交记录在用户数据目录。
|
|
11
11
|
|
|
12
12
|
## GitCode Release
|
|
13
13
|
|
|
14
|
-
本仓配置的发布仓库为 `https://gitcode.com/cann-platform/plugin`。将经过检查的源代码推送到该仓库,创建 `v0.1.
|
|
14
|
+
本仓配置的发布仓库为 `https://gitcode.com/cann-platform/plugin`。将经过检查的源代码推送到该仓库,创建 `v0.1.1` 标签,在 GitCode 发布入口选择该标签,使用 `dist/RELEASE-NOTES.md` 为说明并上传 tarball、SHA256SUMS、release.json。最终公开下载地址以 GitCode 发布结果为准。
|
|
15
15
|
|
|
16
16
|
## npm 分发
|
|
17
17
|
|
|
@@ -19,10 +19,15 @@ npm run pack:release
|
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
npm whoami --registry=https://registry.npmjs.org/
|
|
22
|
-
npm publish dist/cann-doctor-0.1.
|
|
22
|
+
npm publish ./dist/cann-doctor-0.1.1.tgz --access public --registry=https://registry.npmjs.org/
|
|
23
|
+
node scripts/verify-npm.mjs
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
本地安装包路径应带 `./` 或使用绝对路径,避免 npm 将 `dist/...` 解析为 GitHub 仓库简写。
|
|
27
|
+
|
|
28
|
+
发布命令完成后,registry 可能仍在异步处理,新包会暂时公开缺少 `dsh.bundle` 的 `0.0.0-stage` 占位版本。运行 `node scripts/verify-npm.mjs`,确认精确版本已公开、bundle 声明有效、远端 tarball 的 integrity 及 SHA-256/SHA-512 与本地已测试安装包一致;门禁失败时不要宣告已可安装,也不要要求用户安装占位版本。该门禁不读取 npm 凭据,支持 `--name`、`--version`、`--registry` 和 `--tarball` 覆盖目标。
|
|
29
|
+
|
|
30
|
+
如果目标名称需要使用组织 scope,请在 `package.json`、`cordis.patch.yml` 和 `client.js` 的 module id 同步改为同一个包名,重新测试打包。发布后通过 `npm view cann-doctor@0.1.1 dist.integrity` 核实,使用另一 DSH profile 安装 registry 包验证。DSH `0.2.1-rc.5` 没有统一官方市场;要出现在「发现」页,需部署自定义市场索引,详见[市场索引说明](marketplace.md)。npm 或 GitCode Release 发布不会自动登记市场条目。
|
|
26
31
|
|
|
27
32
|
## 发布验收
|
|
28
33
|
|
package/docs/verification.md
CHANGED
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
## 已完成
|
|
6
6
|
|
|
7
7
|
- `npm run check`:原生 manifest、语法、元数据、图标、交付资源通过。
|
|
8
|
-
- `npm test`:46
|
|
8
|
+
- `npm test`:55 项通过,包括原有 46 项插件测试与新增 9 项发布门禁测试,覆盖真实本地 Git 仓库更新、更新失败、历史版本、symlink 边界、报告持久化、反馈更正、会话隔离、原生 API 路由、真实 React 组件交互,以及 npm 占位版本、bundle 缺失与制品篡改。
|
|
9
9
|
- 默认上游在线安装:从 `https://gitcode.com/cann/oam-tools.git` 安装五个完整官方 Skill,验证提交 `8d1993e5c11e58384449a290a047bf33afef69df`。
|
|
10
10
|
- 原生 Host 集成:从安装包内真实 Cordis、SkillRegistry、ToolRuntime、CommandRuntime 和 SystemPrompt 运行插件,验证技能发现/读取、工具 schema、发布报告、保存反馈、卸载清理。
|
|
11
11
|
- 可安装产物:使用本机 `dsh plugin --profile web add <tarball>` 安装到隔离的 `DSH_HOME`,DSH 自动选中 `cann-doctor` bundle,`--dump-config` 正常组合出插件行。
|
|
12
12
|
- 从已安装 tarball 再次运行原生 Host 集成,报告发布、反馈和清理通过。
|
|
13
|
+
- npm 官方源:匿名读取 `cann-doctor@0.1.1`,确认 `latest`、`dsh.bundle` 和 integrity;匿名下载的 24683 bytes tarball 与已验证 Release 的 SHA-256 一致。`node scripts/verify-npm.mjs` 对真实官方源检查通过。
|
|
14
|
+
- npm 安装:使用 Desktop 自带的 DSH CLI,在全新隔离 `DSH_HOME` 中执行 `plugin --profile web add cann-doctor@0.1.1 --registry=https://registry.npmjs.org/`,成功下载并安装;从安装后的包运行原生 Host 检查,报告发布、用户反馈及卸载清理全部通过。
|
|
13
15
|
- 独立代码审查:未发现剩余 P0/P1 阻断问题;实际 tarball 与源码逐字节核对且校验和一致。
|
|
14
16
|
|
|
15
17
|
可复跑原生 Host 检查:
|
package/package.json
CHANGED
|
@@ -1,31 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cann-doctor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "CANN fault diagnosis workbench for DeepSeek Harness Desktop",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
|
-
"engines": {
|
|
8
|
-
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=22",
|
|
9
|
+
"dsh": ">=0.2.1-rc.5 <0.3.0"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://gitcode.com/cann-platform/plugin.git"
|
|
14
|
+
},
|
|
9
15
|
"exports": {
|
|
10
16
|
".": "./index.js",
|
|
11
17
|
"./client": "./client.js",
|
|
12
18
|
"./locale/*.json": "./locale/*.json",
|
|
13
19
|
"./icon": "./icon.svg"
|
|
14
20
|
},
|
|
15
|
-
"files": [
|
|
21
|
+
"files": [
|
|
22
|
+
"index.js",
|
|
23
|
+
"client.js",
|
|
24
|
+
"src/",
|
|
25
|
+
"skills/",
|
|
26
|
+
"locale/",
|
|
27
|
+
"icon.svg",
|
|
28
|
+
"cordis.patch.yml",
|
|
29
|
+
"README.md",
|
|
30
|
+
"docs/installation.md",
|
|
31
|
+
"docs/release.md",
|
|
32
|
+
"docs/verification.md",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"NOTICE"
|
|
35
|
+
],
|
|
16
36
|
"scripts": {
|
|
17
37
|
"test": "node --test tests/*.test.js",
|
|
18
38
|
"check": "node scripts/check.mjs",
|
|
19
39
|
"pack:release": "npm run check && npm test && node scripts/package.mjs"
|
|
20
40
|
},
|
|
21
41
|
"dsh": {
|
|
22
|
-
"bundle": {
|
|
42
|
+
"bundle": {
|
|
43
|
+
"patch": "./cordis.patch.yml"
|
|
44
|
+
},
|
|
23
45
|
"client": {
|
|
24
46
|
"platform": "web",
|
|
25
47
|
"immediately": true,
|
|
26
|
-
"inject": [
|
|
48
|
+
"inject": [
|
|
49
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right",
|
|
50
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
51
|
+
]
|
|
27
52
|
}
|
|
28
53
|
},
|
|
29
|
-
"publishConfig": {
|
|
30
|
-
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public",
|
|
56
|
+
"registry": "https://registry.npmjs.org/"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"react": "18.2.0",
|
|
60
|
+
"react-test-renderer": "18.2.0"
|
|
61
|
+
}
|
|
31
62
|
}
|