dsh-plugin 1.4.3 → 1.4.4
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.en.md +14 -14
- package/README.md +14 -14
- package/client/client.js +312 -293
- package/client/client.js.map +1 -1
- package/package.json +2 -2
- package/src/client/components/modals/NotificationsModal.tsx +10 -0
- package/src/client/components/modals/modals.tsx +8 -0
- package/src/client/locales.ts +4 -0
- package/src/client/logic/failures.ts +28 -5
- package/src/client/logic/renderMarkdown.ts +2 -2
- package/src/client/logic/urls.ts +8 -2
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin",
|
|
3
|
-
"version": "1.4.
|
|
4
|
-
"description": "A community plugin marketplace for DeepSeek Harness, built to the official plugin spec — browse, search and install
|
|
3
|
+
"version": "1.4.4",
|
|
4
|
+
"description": "A community plugin marketplace for DeepSeek Harness, built to the official plugin spec — browse, search and install 8000+ human-curated community plugins without leaving the app. · DeepSeek Harness 社区插件市场(遵循官方开发规范):8000+ 人工精选社区插件,每日更新。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/types/index.d.ts",
|
|
@@ -303,6 +303,16 @@ export function NotificationsModal({ records, tasks, pendingRestarts, t, env, on
|
|
|
303
303
|
// 本机 pnpm 策略不放行,装任何「刚发布/新来源」插件都撞墙 —— 给豁免指引,不引导提 Issue
|
|
304
304
|
return h('div', { className: styles.failPrepareHint }, t('failPnpmPolicyHint'))
|
|
305
305
|
}
|
|
306
|
+
if (kind === 'pnpmUnusedPatch') {
|
|
307
|
+
// profile 里留着指向旧版本 dsh-plugin 的补丁声明(ERR_PNPM_UNUSED_PATCH):pnpm
|
|
308
|
+
// 发现补丁没被用上就中止安装,任何插件都装不进来 —— 不引导提 Issue(#48)
|
|
309
|
+
return h('div', { className: styles.failPrepareHint }, t('failPnpmUnusedPatchHint'))
|
|
310
|
+
}
|
|
311
|
+
if (kind === 'fileLocked') {
|
|
312
|
+
// profile 里的文件被其他进程占用(Windows os error 32):通常是宿主或杀毒软件
|
|
313
|
+
// 持有句柄 —— 给出完全退出宿主的指引,不引导提 Issue(#47)
|
|
314
|
+
return h('div', { className: styles.failPrepareHint }, t('failFileLockedHint'))
|
|
315
|
+
}
|
|
306
316
|
if (kind === 'network') {
|
|
307
317
|
// 安装前预检 / 安装日志里的连接失败([network] / git fetch 超时 / DNS / TLS):
|
|
308
318
|
// 是本机网络不通或代理有问题,不是插件问题 —— 提示检查网络 + 直达「系统诊断」,
|
|
@@ -417,6 +417,14 @@ export function ErrorModal({ message, repo, kind, command, attempts, t, env, onC
|
|
|
417
417
|
// pnpm 11 供应链安全策略拦截(minimumReleaseAge 拒收发布太新的包 / untrusted origin):
|
|
418
418
|
// 本机 pnpm 策略不放行,装任何「刚发布/新来源」插件都撞墙 —— 给豁免指引,不引导提 Issue
|
|
419
419
|
? h('div', { className: styles.failPrepareHint }, t('failPnpmPolicyHint'))
|
|
420
|
+
: failureKind === 'pnpmUnusedPatch'
|
|
421
|
+
// profile 里留着指向旧版本 dsh-plugin 的补丁声明(ERR_PNPM_UNUSED_PATCH):pnpm 发现
|
|
422
|
+
// 补丁没被用上就中止整次安装,任何插件都装不进来 —— 给删除条目的指引,不引导提 Issue(#48)
|
|
423
|
+
? h('div', { className: styles.failPrepareHint }, t('failPnpmUnusedPatchHint'))
|
|
424
|
+
: failureKind === 'fileLocked'
|
|
425
|
+
// profile 里的文件被其他进程占用(Windows os error 32):pnpm 无法替换被占用的文件,
|
|
426
|
+
// 通常是宿主或杀毒软件持有句柄 —— 给退出宿主的指引,不引导提 Issue(#47)
|
|
427
|
+
? h('div', { className: styles.failPrepareHint }, t('failFileLockedHint'))
|
|
420
428
|
: failureKind === 'network'
|
|
421
429
|
// 安装前预检 / 安装日志里的连接失败([network] / git fetch 超时 / DNS / TLS):
|
|
422
430
|
// 是本机网络不通或代理有问题,不是插件问题 —— 提示检查网络 + 直达「系统诊断」,
|
package/src/client/locales.ts
CHANGED
|
@@ -317,6 +317,8 @@ export const zh = {
|
|
|
317
317
|
failPnpmMissingHint: '安装器找到了 dsh,但系统里没有 pnpm 命令(dsh 用它来管理 profile 插件)。请先安装 pnpm(如 npm install -g pnpm),确认 pnpm 已加入 PATH 后重试。这不是插件本身的问题。',
|
|
318
318
|
failNpmMissingHint: '系统找不到 npm 命令(npm 未安装或未加入系统 PATH),无法执行全局安装。请先安装 Node.js(自带 npm),确认 npm 已加入 PATH 后重试。这不是插件本身的问题。',
|
|
319
319
|
failPnpmStoreHint: '安装器调用 pnpm 时报「store 位置不匹配」(ERR_PNPM_UNEXPECTED_STORE):你的 profile 目录里旧插件依赖是用另一个大版本的 pnpm 生成的,当前 pnpm 出于安全不认旧目录,导致任何插件装进该 profile 都会失败。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml(可先到「系统日志」或 ~/.dsh/profiles/<profile>/hub.log 查看完整报错),再重新安装。这不是插件本身的问题。',
|
|
320
|
+
failPnpmUnusedPatchHint: '安装器调用 pnpm 时报「有些补丁没有被使用」(ERR_PNPM_UNUSED_PATCH):你的 profile 里留着一条指向旧版本 dsh-plugin 的补丁声明(例如 dsh-plugin@1.4.2),而本次安装解析到的版本已经不是它,pnpm 出于安全直接中止整次安装,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 pnpm-workspace.yaml(pnpm 11 及以上)或 package.json 的 pnpm.patchedDependencies(pnpm 10)里删除该 dsh-plugin 补丁条目后重试。',
|
|
321
|
+
failFileLockedHint: '安装过程中 pnpm 无法替换 profile 里的文件:有程序正占用着它(Windows 常见报错 os error 32「另一个程序正在使用此文件」)。通常是 DeepSeek Harness 自身或杀毒软件的实时扫描持有文件句柄。这不是插件本身的问题——请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试。',
|
|
320
322
|
failPnpmWorkspaceHint: '安装器调用 pnpm 时报「不能把依赖装到 workspace 根目录」(ERR_PNPM_ADDING_TO_ROOT):你的 profile 目录被 pnpm 视为 workspace 根目录,而本次安装命令没有声明在根目录操作,pnpm 直接拒绝执行,因此任何插件装进来都会失败。这不是插件本身的问题——可在 profile 目录(~/.dsh/profiles/<profile>)的 .npmrc 里加一行 ignore-workspace-root-check=true 后重试,或把 DeepSeek Harness 升级到最新版再试。',
|
|
321
323
|
failPnpmPolicyHint: '安装器调用 pnpm 时被其供应链安全策略拦截——装任何插件都会撞墙,不是插件本身的问题。分两种情况处理:① 提示「Minimum release age」(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION):包发布还不满 24 小时,pnpm 11 出于安全会拒收这种刚发布的新包。可在 pnpm 配置(pnpm-workspace.yaml)里加 minimumReleaseAge: 0 豁免,或等满 24 小时后重试。② 提示「untrusted origin」(ERR_PNPM_UNTRUSTED_ORIGIN):依赖来源不被本机 pnpm 信任,通常是该 profile 里之前用 github: 或非官方 npm 源装过插件,锁文件记录了不受信任的来源。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml 后重新安装(可先到「系统日志」或 ~/.dsh/profiles/<profile>/hub.log 查看完整报错)。',
|
|
322
324
|
// 自定义安装三卡片入口的渠道名(报错/日志溯源:本次安装从哪个入口发起)
|
|
@@ -678,6 +680,8 @@ export const en = {
|
|
|
678
680
|
failPnpmMissingHint: 'The installer found dsh, but pnpm is missing on this machine (dsh uses it to manage profile plugins). Please install pnpm first (e.g. npm install -g pnpm), make sure it is on your PATH, then retry. This is not a problem with the plugin itself.',
|
|
679
681
|
failNpmMissingHint: 'The npm command could not be found (npm is not installed or not on the system PATH), so a global install cannot run. Please install Node.js (which bundles npm), make sure npm is on your PATH, then retry. This is not a problem with the plugin itself.',
|
|
680
682
|
failPnpmStoreHint: 'pnpm reported an unexpected store location (ERR_PNPM_UNEXPECTED_STORE): the profile directory was previously set up with a different major version of pnpm, and the current pnpm refuses to reuse it — no plugin can be installed into that profile. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles/<profile>/hub.log for the full output), then reinstall. This is not a problem with the plugin itself.',
|
|
683
|
+
failPnpmUnusedPatchHint: 'pnpm reported that some patches were not used (ERR_PNPM_UNUSED_PATCH): your profile still holds a patch entry for an older dsh-plugin version (for example dsh-plugin@1.4.2), while this install resolved a different version, so pnpm aborts the whole install for safety — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dsh-plugin patch entry from pnpm-workspace.yaml (pnpm 11+) or from pnpm.patchedDependencies in package.json (pnpm 10) inside the profile directory (~/.dsh/profiles/<profile>), then retry.',
|
|
684
|
+
failFileLockedHint: 'During install, pnpm could not replace a file inside the profile because another program is holding it (on Windows this shows as os error 32, "the process cannot access the file because it is being used by another process"). Usually DeepSeek Harness itself or a real-time antivirus scan holds the handle. This is not a problem with the plugin itself — fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry.',
|
|
681
685
|
failPnpmWorkspaceHint: 'pnpm refused to add the dependency to the workspace root (ERR_PNPM_ADDING_TO_ROOT): the profile directory is treated as a pnpm workspace root, and this install command did not declare that it operates at the root, so pnpm rejected it outright — no plugin can be installed into that profile. This is not a problem with the plugin itself. Add `ignore-workspace-root-check=true` to the `.npmrc` inside the profile directory (~/.dsh/profiles/<profile>) and retry, or upgrade DeepSeek Harness and try again.',
|
|
682
686
|
failPnpmPolicyHint: 'The installer was blocked by pnpm supply-chain security policy — every plugin install would hit the same wall, so this is not a problem with the plugin itself. Two cases: ① "Minimum release age" (ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION): the package was published less than 24 hours ago, and pnpm 11 refuses freshly-published packages for safety. Add minimumReleaseAge: 0 to your pnpm config (pnpm-workspace.yaml) to opt out, or wait until the 24 hours have passed and retry. ② "untrusted origin" (ERR_PNPM_UNTRUSTED_ORIGIN): a dependency source is not trusted by this machine, usually because plugins were previously installed via github: or a non-official npm registry, so the lockfile records an untrusted source. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles/<profile>/hub.log for the full output), then reinstall.',
|
|
683
687
|
// Custom install entry channel names (the three cards) — used in error/log traceability
|
|
@@ -151,7 +151,7 @@ export function removeNotification(id: number): NotificationRecord[] {
|
|
|
151
151
|
return next
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
export type FailureKind = 'npmTooOld' | 'dshMissing' | 'gitMissing' | 'pnpmMissing' | 'npmMissing' | 'pnpmStore' | 'pnpmWorkspace' | 'pnpmPolicy' | 'pnpmIgnoredBuild' | 'pluginPrepare' | 'network' | 'repo'
|
|
154
|
+
export type FailureKind = 'npmTooOld' | 'dshMissing' | 'gitMissing' | 'pnpmMissing' | 'npmMissing' | 'pnpmStore' | 'pnpmWorkspace' | 'pnpmPolicy' | 'pnpmUnusedPatch' | 'fileLocked' | 'pnpmIgnoredBuild' | 'pluginPrepare' | 'network' | 'repo'
|
|
155
155
|
|
|
156
156
|
/**
|
|
157
157
|
* 失败归类,七态。无论底层机制如何(pnpm 白名单拦截 / 构建脚本被忽略 / prepare 失败),
|
|
@@ -195,12 +195,21 @@ export type FailureKind = 'npmTooOld' | 'dshMissing' | 'gitMissing' | 'pnpmMissi
|
|
|
195
195
|
* 插件问题(dsh-plugin-hub#15/#16:用户装官方 dsh-plugin 也被这两类策略拦下并误归插件侧失败)
|
|
196
196
|
* → 提示按子场景给解法(发布未满 24 小时 → `minimumReleaseAge: 0` 豁免或等满 24 小时;untrusted
|
|
197
197
|
* origin → 删除 profile 的 node_modules + pnpm-lock.yaml 清掉不受信任来源后重装),不引导提 Issue
|
|
198
|
+
* - pnpmUnusedPatch:profile 里留着指向旧版本 dsh-plugin 的 patch 声明,本次安装解析到的版本
|
|
199
|
+
* 已经不是它(`ERR_PNPM_UNUSED_PATCH` / `The following patches were not used: dsh-plugin@1.4.2`)
|
|
200
|
+
* —— pnpm 发现补丁没被用上即中止整次安装,任何插件都装不进来,不是插件问题
|
|
201
|
+
* (dsh-plugin-hub#48:用户升级 dsh-plugin 后旧 patch 条目失配)→ 提示删掉该条目后重试,不引导提 Issue
|
|
202
|
+
* - fileLocked:pnpm 无法替换 profile 里被其他进程占用的文件(Windows `os error 32`
|
|
203
|
+
* 「另一个程序正在使用此文件」/ `EBUSY` / `resource busy or locked`)—— 通常是宿主进程或杀毒软件
|
|
204
|
+
* 实时扫描持有句柄,不是插件问题(dsh-plugin-hub#47)→ 提示完全退出宿主后重试,不引导提 Issue
|
|
198
205
|
* - network:安装前连通性预检拦截(服务端 `[network]` 标记)、底层连接失败
|
|
199
206
|
* (ERR_PNPM_GIT_FETCH_FAILED / ETIMEDOUT / DNS 解析 / TLS 握手 / 代理拒绝),或
|
|
200
207
|
* registry tarball 拉取失败(`fetch failed` / `GET …/-/…tgz error (n)` —— 常见于本机
|
|
201
|
-
* npm/pnpm 的 registry
|
|
202
|
-
*
|
|
203
|
-
*
|
|
208
|
+
* npm/pnpm 的 registry 被指向内网/自定义源,该源取不到包),或界面请求压根没送达宿主服务
|
|
209
|
+
* (浏览器 fetch 的 `Failed to fetch` —— 宿主未就绪/正在重启,或本地代理拦了回环地址;
|
|
210
|
+
* dsh-plugin-hub#45:该消息此前落进 repo 兜底,被误报成「插件侧安装失败」)—— 是本机网络
|
|
211
|
+
* 不通/被墙/代理有问题/源配置异常,不是插件问题 → 提示检查网络,registry 指向自定义源时
|
|
212
|
+
* 给出换源指引,不引导提 Issue
|
|
204
213
|
* - pnpmIgnoredBuild:插件自身或依赖的构建脚本被 pnpm 安全白名单(allowBuilds)默认拦截
|
|
205
214
|
* (`ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED` / `ERR_PNPM_IGNORED_BUILDS`)。只影响带安装期
|
|
206
215
|
* 构建的插件,其他插件不受影响 —— 差异在插件的依赖/打包方式,属插件依赖/打包问题
|
|
@@ -258,6 +267,17 @@ export function classifyFailure(message: string): FailureKind {
|
|
|
258
267
|
// 装任何「新发布/非信任来源」的插件都会同样失败,不是插件问题(dsh-plugin-hub#15/#16)。
|
|
259
268
|
// 必须在 pnpmIgnoredBuild 之前 —— 该策略优先于「构建脚本被白名单拦截」,且两者都不引导提 Issue。
|
|
260
269
|
if (/ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|Minimum release age|untrusted origin/i.test(message)) return 'pnpmPolicy'
|
|
270
|
+
// profile 里留着指向旧版本 dsh-plugin 的 patch 声明(ERR_PNPM_UNUSED_PATCH /
|
|
271
|
+
// `The following patches were not used: dsh-plugin@1.4.2`):本机 pnpm 配置与本次解析到的版本
|
|
272
|
+
// 对不上,pnpm 出于安全直接中止整次安装 —— 任何插件都装不进来,不是插件问题
|
|
273
|
+
// (dsh-plugin-hub#48:用户升级 dsh-plugin 后旧 patch 条目失配)→ 提示删条目后重试,不引导提 Issue。
|
|
274
|
+
// 必须在兜底之前,否则被归成「插件侧失败」引导去提 Issue。
|
|
275
|
+
if (/ERR_PNPM_UNUSED_PATCH|patches were not used/i.test(message)) return 'pnpmUnusedPatch'
|
|
276
|
+
// profile 里的文件被其他进程占用,pnpm 无法替换(Windows `os error 32`
|
|
277
|
+
// 「另一个程序正在使用此文件,进程无法访问」/ EBUSY / resource busy or locked)——
|
|
278
|
+
// 通常是宿主进程或杀毒软件实时扫描持有句柄;`os error 32` 用 ASCII 特征,中文原文乱码也能命中
|
|
279
|
+
// (dsh-plugin-hub#47)→ 提示完全退出宿主后重试,不引导提 Issue
|
|
280
|
+
if (/os error 32|EBUSY|resource busy or locked|being used by another process/i.test(message)) return 'fileLocked'
|
|
261
281
|
// 构建脚本被 pnpm 白名单(allowBuilds)拦截:插件的 prepare 脚本或依赖里的原生模块构建
|
|
262
282
|
// 被默认拒绝(ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED / ERR_PNPM_IGNORED_BUILDS)。
|
|
263
283
|
// 这类错误出现即说明 pnpm 已成功 fetch 到 tarball(网络是通的),主因是插件构建脚本
|
|
@@ -274,7 +294,10 @@ export function classifyFailure(message: string): FailureKind {
|
|
|
274
294
|
// 404 类「目标不存在」不含这些特征,仍归 repo(那是仓库/包的问题)。
|
|
275
295
|
// 注意:fetch failed 只在 pnpm 拉取阶段出现;prepare/构建已跑起来(tarball 到手)的
|
|
276
296
|
// 插件问题不带此特征,不会误伤(graph-memory #82-#84 的 allowBuilds 拦截在上一分支先判)。
|
|
277
|
-
|
|
297
|
+
// `Failed to fetch` 是浏览器 fetch 的 TypeError(词序与 Node 的 fetch failed 相反):界面
|
|
298
|
+
// 请求根本没送达宿主服务(宿主未就绪/正在重启、本地代理拦了回环地址)—— 同样不是插件问题
|
|
299
|
+
// (dsh-plugin-hub#45:此前不被识别,落进 repo 兜底并自动提了「插件侧安装失败」)。
|
|
300
|
+
if (/\[network\]|ERR_PNPM_GIT_FETCH_FAILED|ETIMEDOUT|ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|EHOSTUNREACH|ENETUNREACH|getaddrinfo|Could not connect|Could not resolve host|Network unreachable|Failed to connect|socket hang up|CERT_HAS_EXPIRED|SSL certificate problem|\bTLS\b|\bSSL\b|fetch failed|failed to fetch|\bGET https?:\/\/\S+\.tgz\s+error \(\d+\)/i.test(message)) return 'network'
|
|
278
301
|
// 装后校验拦截(服务端 verifyInstalledEntry 标记):入口文件缺失 = git 分发缺构建产物,
|
|
279
302
|
// 与 pluginPrepare 同类(插件打包/分发问题),引导去仓库提 Issue
|
|
280
303
|
if (/\[packaging\]|entry file missing/i.test(message)) return 'pluginPrepare'
|
|
@@ -33,11 +33,11 @@ function inline(s: string): string {
|
|
|
33
33
|
return `\u0000${codeSpans.length - 1}\u0000`
|
|
34
34
|
})
|
|
35
35
|
// 图片 :仅放行 http(s),用于展示反馈群二维码等;limited by CSS
|
|
36
|
-
// 文件名为 dsh-plugin-user-group-qr
|
|
36
|
+
// 文件名为 dsh-plugin-user-group-qr 前缀的视为用户反馈群二维码,固定 100×100 不撑破弹窗。
|
|
37
37
|
out = out.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (m, alt, url) => {
|
|
38
38
|
const src = String(url)
|
|
39
39
|
if (!/^https?:\/\//i.test(src) || /[\u0000]/.test(src)) return m
|
|
40
|
-
if (/\/dsh-plugin-user-group-qr
|
|
40
|
+
if (/\/dsh-plugin-user-group-qr[^/]*$/i.test(src)) {
|
|
41
41
|
return `<img src="${src}" alt="${String(alt)}" width="100" height="100" loading="lazy">`
|
|
42
42
|
}
|
|
43
43
|
return `<img src="${src}" alt="${String(alt)}" loading="lazy">`
|
package/src/client/logic/urls.ts
CHANGED
|
@@ -51,6 +51,8 @@ function reasonTitleOf(kind: FailureKind): string {
|
|
|
51
51
|
case 'pnpmStore': return 'pnpm store version mismatch on the user machine'
|
|
52
52
|
case 'pnpmWorkspace': return 'pnpm workspace-root check blocked the install on the user machine'
|
|
53
53
|
case 'pnpmPolicy': return 'pnpm supply-chain policy blocked the install on the user machine'
|
|
54
|
+
case 'pnpmUnusedPatch': return 'stale pnpm patch entry on the user machine'
|
|
55
|
+
case 'fileLocked': return 'file locked by another process on the user machine'
|
|
54
56
|
case 'pnpmIgnoredBuild': return 'build scripts blocked by pnpm allowlist'
|
|
55
57
|
case 'pluginPrepare': return 'plugin distribution incomplete'
|
|
56
58
|
case 'network': return 'network failure on the user side'
|
|
@@ -83,8 +85,12 @@ export function pluginIssueUrl(repo: string, message: string, env?: EnvInfo | nu
|
|
|
83
85
|
: kind === 'pnpmIgnoredBuild'
|
|
84
86
|
? 'plugin depends on a native module whose build script pnpm blocks by default (use a prebuilt variant)'
|
|
85
87
|
: kind === 'pnpmPolicy'
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
? 'the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)'
|
|
89
|
+
: kind === 'pnpmUnusedPatch'
|
|
90
|
+
? 'the profile keeps a pnpm patch entry for an older dsh-plugin version, so pnpm aborted the install (local config issue)'
|
|
91
|
+
: kind === 'fileLocked'
|
|
92
|
+
? 'a file in the profile is locked by another process on the user machine (local environment issue)'
|
|
93
|
+
: 'plugin-side install failure'
|
|
88
94
|
const code = coreErrorCode(message)
|
|
89
95
|
// 按给定核心摘要预算构建完整预填 URL(含 URL 编码);预算可调,供超长时逐档缩小
|
|
90
96
|
const build = (coreChars: number): string => {
|