dsh-plugin 2.1.0 → 2.2.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/client/client.js +665 -352
- package/client/client.js.map +1 -1
- package/lib/http/diagnostics.js +2 -63
- package/lib/services/host-version.js +72 -0
- package/lib/services/install/dsh-compat.js +105 -0
- package/lib/services/install/operation-log.js +1 -1
- package/lib/services/install/registry-fallback.js +5 -0
- package/lib/services/install/task-queue.js +64 -1
- package/lib/services/npm-release-age.js +10 -6
- package/lib/services/profile/installed-versions.js +6 -2
- package/lib/types/services/host-version.d.ts +10 -0
- package/lib/types/services/install/dsh-compat.d.ts +19 -0
- package/lib/types/services/install/install-types.d.ts +5 -0
- package/lib/types/services/install/registry-fallback.d.ts +2 -0
- package/lib/types/services/install/task-queue.d.ts +5 -0
- package/lib/types/services/npm-release-age.d.ts +1 -1
- package/package.json +1 -1
- package/src/client/components/modals/NotificationsModal.tsx +80 -5
- package/src/client/components/modals/modals.tsx +84 -5
- package/src/client/hooks/useCatalog.ts +45 -25
- package/src/client/hooks/useTaskQueue.ts +30 -8
- package/src/client/locales.ts +56 -2
- package/src/client/logic/failures.ts +98 -7
- package/src/client/logic/installed.ts +4 -1
- package/src/client/logic/release-age.ts +52 -4
- package/src/client/logic/urls.ts +23 -3
- package/src/server/http/diagnostics.ts +2 -59
- package/src/server/services/host-version.ts +69 -0
- package/src/server/services/install/dsh-compat.ts +99 -0
- package/src/server/services/install/install-types.ts +5 -0
- package/src/server/services/install/operation-log.ts +1 -1
- package/src/server/services/install/registry-fallback.ts +5 -0
- package/src/server/services/install/task-queue.ts +64 -1
- package/src/server/services/npm-release-age.ts +10 -6
- package/src/server/services/profile/installed-versions.ts +6 -2
package/client/client.js
CHANGED
|
@@ -28,6 +28,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
28
28
|
sortAria: "插件排序方式",
|
|
29
29
|
openHint: "打开 dsh-plugin.org",
|
|
30
30
|
toggleLangHint: "切换界面语言",
|
|
31
|
+
githubHint: "在 GitHub 查看源码",
|
|
31
32
|
fork: "Fork",
|
|
32
33
|
loading: "正在加载插件数据…",
|
|
33
34
|
failed: "插件数据加载失败",
|
|
@@ -267,6 +268,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
267
268
|
queuedUninstallTitle: "已加入卸载排队",
|
|
268
269
|
queuedHint: "已加入排队,前序任务完成后将自动开始,可关闭本窗口继续浏览。",
|
|
269
270
|
cancelTask: "取消任务",
|
|
271
|
+
cancel: "取消",
|
|
270
272
|
cancelling: "正在取消…",
|
|
271
273
|
errorTitle: "操作失败",
|
|
272
274
|
errorTitleInstall: "安装失败",
|
|
@@ -309,6 +311,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
309
311
|
bundleDeselectedHint: "注意:插件市场在当前 profile 的 bundle 列表中被取消勾选,重启宿主后它不会出现。请到「设置 → 插件」重新勾选 dsh-plugin。",
|
|
310
312
|
failPnpmStoreHint: "安装器调用 pnpm 时报「store 位置不匹配」(ERR_PNPM_UNEXPECTED_STORE):你的 profile 目录里旧插件依赖是用另一个大版本的 pnpm 生成的,当前 pnpm 出于安全不认旧目录,导致任何插件装进该 profile 都会失败。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml(可先到「系统日志」或 ~/.dsh/profiles/<profile>/hub.log 查看完整报错),再重新安装。这不是插件本身的问题。",
|
|
311
313
|
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 补丁条目后重试。",
|
|
314
|
+
failProfileStateHint: "安装器调用 pnpm 时报 profile 的元数据与当前环境对不上(如 ERR_PNPM_OUTDATED_LOCKFILE / ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND / ERR_PNPM_BAD_PM_VERSION / ERR_PNPM_PATCH_NOT_APPLIED):profile 里的 pnpm-lock.yaml、package.json 或补丁声明与当前 pnpm 版本不一致,pnpm 在真正装插件之前就中止了,所以这个 profile 里装任何插件都会失败。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)里删除 pnpm-lock.yaml 后重试(pnpm 会按当前依赖重新生成);若报的是 packageManager 版本不符,把 package.json 里的 packageManager 字段改成当前 pnpm 的大版本或直接删掉该字段;仍不行请重建该 profile 的依赖。",
|
|
315
|
+
failNodeEngineHint: "这个插件(或它的某个依赖)声明了更高的 Node / pnpm 版本要求(ERR_PNPM_UNSUPPORTED_ENGINE / EBADENGINE),当前版本不满足,pnpm 在安装阶段直接拒绝。这不是插件本身的问题——请把 Node 升级到要求的版本(nvm / fnm 切换,或安装新版 Node.js),确认 node -v 与 pnpm -v 都满足要求后重试。",
|
|
312
316
|
failPnpmMissingDepTarget: "{pkg} 在 npm registry 上不存在(404)",
|
|
313
317
|
failPnpmMissingDepHint: "安装器调用 pnpm 时报「包不存在」(ERR_PNPM_FETCH_404):你的 profile 里留着一条指向 registry 上未发布包的依赖,pnpm 每次解析依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 package.json 里删除该依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件)后重试。",
|
|
314
318
|
failRegistryMirrorLagHint: "安装器调用 pnpm 时报「包不存在」(ERR_PNPM_FETCH_404):该包在官方 npm 源上是有的,但你本机配置的 npm/pnpm 源(registry 或镜像)没有同步到它。请把 npm/pnpm 的 registry 指回官方源 https://registry.npmjs.org(或换一个已同步该包的镜像)后重试。这不是插件本身的问题。",
|
|
@@ -331,6 +335,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
331
335
|
failReason_buildToolchainMissing: "这个插件依赖需要在本机编译的原生模块,但找不到可用的编译器。",
|
|
332
336
|
failKind_pnpmStore: "pnpm store 版本不匹配",
|
|
333
337
|
failReason_pnpmStore: "profile 里的依赖由另一大版本的 pnpm 生成,当前 pnpm 不认。",
|
|
338
|
+
failKind_pnpmModulesMismatch: "profile 的依赖目录与当前 pnpm 配置不一致",
|
|
339
|
+
failReason_pnpmModulesMismatch: "node_modules 是用另一套 pnpm 配置(hoist / 虚拟目录长度等)创建的,pnpm 拒绝复用。",
|
|
340
|
+
failPnpmModulesMismatchHint: "安装器调用 pnpm 时报「modules 目录与当前配置不一致」(`ERR_PNPM_*_DIFF`,例如 virtual-store-dir-max-length、public-hoist-pattern、hoist 规则、node-linker):profile 里的 node_modules 是在另一套 pnpm 配置下生成的(常见于改过 .npmrc、换过 pnpm 大版本,或桌面端内置 pnpm 与 PATH 上的 pnpm 不是同一个),当前 pnpm 出于安全拒绝在它上面继续操作 —— 所以这个 profile 里的安装/卸载都会失败。修复(任选其一,在 profile 目录 ~/.dsh/profiles/<profile> 下操作):① 执行一次 pnpm install,让它按当前配置重建 modules 目录;② 删掉该目录下的 node_modules,下次安装/卸载会自动重建;③ 如果你在 .npmrc 里设过这些配置项,把它们统一成同一个值(或删掉自定义、回到默认)。这不是插件本身的问题。",
|
|
334
341
|
failKind_pnpmWorkspace: "workspace 根校验阻止了安装",
|
|
335
342
|
failReason_pnpmWorkspace: "profile 被当作 workspace 根,但没有声明根操作,pnpm 中止了安装。",
|
|
336
343
|
failKind_originRejected: "本地服务的来源校验未通过",
|
|
@@ -339,6 +346,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
339
346
|
failReason_pnpmPolicy: "版本未满最小发布年龄,或缺完整性校验 / 来源不可信。",
|
|
340
347
|
failKind_pnpmUnusedPatch: "profile 残留旧补丁声明",
|
|
341
348
|
failReason_pnpmUnusedPatch: "profile 里留着指向旧版本 dsh-plugin 的补丁,pnpm 出于安全中止了安装。",
|
|
349
|
+
failKind_profileState: "profile 的 pnpm 元数据与本机不一致",
|
|
350
|
+
failReason_profileState: "profile 的 lockfile / package.json / packageManager 版本与当前 pnpm 对不上,安装没开始就被中止。",
|
|
351
|
+
failKind_nodeEngine: "本机 Node / pnpm 版本不满足要求",
|
|
352
|
+
failReason_nodeEngine: "这个插件(或其依赖)要求更高的 Node / pnpm 版本,当前版本被 pnpm 拒绝。",
|
|
342
353
|
failKind_pnpmMissingDep: "依赖包在 registry 上不存在",
|
|
343
354
|
failReason_pnpmMissingDep: "profile 里有一条指向未发布包的依赖,pnpm 每次解析都卡在它上面。",
|
|
344
355
|
failKind_pluginMissingDep: "插件依赖未发布",
|
|
@@ -347,6 +358,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
347
358
|
failReason_registryVersionStale: "实际安装用的源还没同步到这个版本,或版本号写错。",
|
|
348
359
|
failKind_registryAuth: "npm 源拒绝了访问",
|
|
349
360
|
failReason_registryAuth: "registry 返回 401/403:这个源需要登录凭据,或当前网络不被允许。",
|
|
361
|
+
failKind_profileExclusive: "profile 由桌面应用独占管理",
|
|
362
|
+
failReason_profileExclusive: "命令行 dsh 无权管理桌面应用的 profile,安装前就被宿主拒绝。",
|
|
350
363
|
failKind_pnpmLinkedDirMissing: "profile 里有失效的本地依赖",
|
|
351
364
|
failReason_pnpmLinkedDirMissing: "有一条指向本机不存在目录的 link/file 依赖,pnpm 每次解析都卡住。",
|
|
352
365
|
failKind_fileLocked: "文件被其他程序占用",
|
|
@@ -363,20 +376,36 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
363
376
|
failReason_hostIncompatible: "插件声明的兼容清单里没有你正在运行的 DSH 版本。",
|
|
364
377
|
failKind_network: "网络连接失败",
|
|
365
378
|
failReason_network: "安装过程中连不上 npm 源或代理,请求没有完成。",
|
|
379
|
+
failKind_tlsTrust: "HTTPS 证书校验失败",
|
|
380
|
+
failReason_tlsTrust: "本机有程序替换了 HTTPS 证书,Node / pnpm 不信任它的根证书。",
|
|
381
|
+
failTlsTrustHint: "安装器访问 npm 源时 TLS 证书校验失败(`ERR_PNPM_META_FETCH_FAIL` / unable to verify the first certificate):本机有程序在替换 HTTPS 证书 —— 公司网络的 SSL 审计、杀毒软件的网页防护、Fiddler / Charles 这类抓包工具,或本机代理的 HTTPS 解密 —— 而 Node / pnpm 不信任它的根证书。这不是插件本身的问题,任何插件都会一样失败。按顺序处理:① 如果公司网络有 SSL 审计,找 IT 要根证书(.cer / .pem),把环境变量 NODE_EXTRA_CA_CERTS 指向该文件后重试;② Node ≥ 22.15 可以设置 NODE_OPTIONS=--use-system-ca,让 Node 直接信任系统证书库;③ 如果只是本机代理开了 HTTPS 解密,把 registry.npmjs.org 加进直连(跳过 MITM);④ 也可以先临时切到公共镜像源 https://registry.npmmirror.com 重试。不建议直接关闭 strict-ssl:那等于放弃校验,会把你暴露在中间人攻击下。",
|
|
366
382
|
failKind_hostCliSpawn: "无法启动 DSH 宿主",
|
|
367
383
|
failReason_hostCliSpawn: "解析到的宿主入口起不来,安装命令没有真正执行。",
|
|
368
384
|
failKind_hubState: "插件中心状态不同步",
|
|
369
385
|
failReason_hubState: "本地记录的安装状态与实际不一致,这次操作没有生效。",
|
|
386
|
+
failKind_profileBundleMissing: "profile 的依赖没装全",
|
|
387
|
+
failReason_profileBundleMissing: "宿主找不到 profile 里声明的某个 bundle,安装命令还没执行就失败了。",
|
|
388
|
+
failProfileBundleMissingHint: "宿主在启动插件管理时找不到 profile 依赖「{pkg}」—— 说明这个 profile 里声明的依赖没有装全(node_modules 被删过、上次安装中断,或桌面应用升级不完整)。这与你要装的插件无关,换任何插件都会一样失败。修复:① 让宿主把这个 profile 的依赖装回来(在桌面应用内重新打开插件中心,或执行 `dsh plugin --profile {profile} install`;桌面 profile 需在应用内执行,外部 CLI 无权管理);② 仍然报同样的错,说明是应用本体不完整,请重装或升级 DeepSeek Harness 桌面端。",
|
|
370
389
|
failKind_timeout: "操作超时",
|
|
371
390
|
failReason_timeout: "安装耗时超过上限仍未完成,已经中止。",
|
|
372
391
|
failKind_profileLock: "profile 被其他进程占用",
|
|
373
392
|
failReason_profileLock: "另一个 dsh 进程正在使用这个 profile。",
|
|
374
393
|
failKind_hub: "出现未知错误",
|
|
375
394
|
failReason_hub: "我们还没能识别这条报错,你可以一键反馈给我们。",
|
|
395
|
+
failKind_localEnv: "本机环境异常",
|
|
396
|
+
failReason_localEnv: "报错特征指向你的本机环境(系统错误码 / 证书代理 / 本地配置),没有发现插件侧原因。",
|
|
397
|
+
failKind_dshTooOld: "DSH 版本低于插件要求",
|
|
398
|
+
failReason_dshTooOld: "插件声明的最低 DSH 版本高于你当前运行的宿主版本。",
|
|
399
|
+
failDshTooOldHint: "插件「{pkg}」声明需要 DSH {floor} 或更高,而你当前运行的是 {current} —— 版本不够时装不上(或装上后无法正常加载),这不是插件本身的问题,也不是插件市场的误判。请先把 DeepSeek Harness 升级到 {floor} 以上,再回到插件中心重试。如果升级后仍然失败,把新的报错发给我们。",
|
|
400
|
+
failLocalEnvHint: "从日志能确认的只有一点:没有插件侧的失败证据;报错特征落在本机环境(系统调用错误码、证书/代理校验、本地配置文件损坏等),但还不足以精确到某一类。这类问题装别的插件同样会失败,不是插件本身的问题。请按顺序自查:① 点下面的「运行系统诊断」看本机检查项;② 确认 profile 目录(~/.dsh/profiles/<profile>)可写、磁盘有空间、杀毒软件没拦截;③ 若在用代理或公司镜像源,先临时切回官方源 https://registry.npmjs.org 重试;④ 完全退出 DeepSeek Harness 后重试。排查后仍然失败、且你确信环境没问题,再用下面的链接反馈给我们,并附上通知中心里复制的完整日志。",
|
|
376
401
|
failRegistryVersionStaleHint: "安装器调用 pnpm 时报「找不到匹配的版本」(ERR_PNPM_NO_MATCHING_VERSION):要装的这个版本在实际执行安装的 npm 源里查不到。常见原因是你设置的 npmRegistry 与本机 ~/.npmrc 用的不是同一个源——官方源刚发布、镜像还没同步上来(快则几分钟、慢则几小时),也可能只是版本号写错了。这不是插件本身的问题。可在插件市场设置里把 npmRegistry 改成与本机 ~/.npmrc 一致(或反过来),或那一次显式走官方源(https://registry.npmjs.org)、改用离线包后重试;若该版本刚发布不久,等镜像同步后重试即可。",
|
|
377
402
|
failRegistryAuthHint: "安装器访问 npm 源时被拒绝(HTTP 401/403):这个源需要登录凭据,或不允许当前网络/IP 访问。如果你在用公司或私有源,请先配好认证(npm login,或在 ~/.npmrc 写入 //{host}/:_authToken=…);如果不需要私有源,把 registry 换回官方源 https://registry.npmjs.org,或在插件市场设置里切换到公共镜像后重试。这不是插件本身的问题。",
|
|
378
403
|
failRegistryAuthHintNoHost: "安装器访问 npm 源时被拒绝(HTTP 401/403):这个源需要登录凭据,或不允许当前网络/IP 访问。如果你在用公司或私有源,请先配好认证(npm login,或在 ~/.npmrc 写入 //<registry>/:_authToken=…);如果不需要私有源,把 registry 换回官方源 https://registry.npmjs.org,或在插件市场设置里切换到公共镜像后重试。这不是插件本身的问题。",
|
|
404
|
+
failProfileExclusiveHint: "profile「{profile}」由桌面应用独占管理,命令行 dsh 无权安装 —— 这不是插件本身的问题。请在 DeepSeek Harness 桌面应用的「设置 → 插件市场」里安装;或改用非桌面独占的 profile(例如 web)后重试。如果你就是在桌面应用内看到这条错误,请到插件市场的「通知」里打开这条失败记录点「复制」,把完整日志发给我们。",
|
|
405
|
+
failProfileExclusiveHintNoProfile: "当前 profile 由桌面应用独占管理,命令行 dsh 无权安装 —— 这不是插件本身的问题。请在 DeepSeek Harness 桌面应用的「设置 → 插件市场」里安装;或改用非桌面独占的 profile(例如 web)后重试。如果你就是在桌面应用内看到这条错误,请到插件市场的「通知」里打开这条失败记录点「复制」,把完整日志发给我们。",
|
|
406
|
+
failDesktopCliFallbackHint: "这次是安装器没找到桌面应用内置的 CLI 引导脚本、退回命令行 dsh 才被拒绝 —— 属于插件中心自身的问题,不是你的环境问题。点下面的按钮把完整日志发给我们,我们会补上路径推导。",
|
|
379
407
|
failPnpmLinkedDirMissingHint: "安装器调用 pnpm 时报「要安装的目录不存在」(ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND):你的 profile 里留着一条指向本机不存在目录的本地依赖(link: / file: 形式,例如用 dsh plugin add <本地路径> 装过开发中的插件,之后那个目录被删除或移动了)。pnpm 每次解析 profile 依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 package.json 里删除该本地依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件),或把该目录恢复回原路径后重试。",
|
|
408
|
+
failLinkedDirTarget: "缺失的本地目录:{path}",
|
|
380
409
|
failFileLockedHint: "安装过程中 pnpm 无法替换 profile 里的文件:有程序正占用着它(Windows 常见报错 os error 32「另一个程序正在使用此文件」)。通常是 DeepSeek Harness 自身或杀毒软件的实时扫描持有文件句柄。这不是插件本身的问题——请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试。",
|
|
381
410
|
failAccessDeniedHint: "安装过程中 pnpm 写入 profile 里的文件被系统拒绝访问(Windows 常见报错 os error 5「拒绝访问」,英文为 Access is denied;Node 下的 EPERM / EACCES 同理)。常见原因是该文件或目录正被其他进程占用、文件带只读属性、目录权限受限,或杀毒软件实时防护拦截了写入——这与「文件正被占用」(os error 32)同属本机文件系统问题,任何插件装进该目录都会一样失败,不是插件本身的问题。请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试;若仍然失败,请检查 profile 目录及其文件是否被设为只读,并以管理员身份重新运行。",
|
|
382
411
|
failFsUnavailableHint: "安装过程中 pnpm 无法把文件写进本机磁盘(这类报错与装哪个插件无关,任何插件装在同一目录都会失败,不是插件本身的问题)。请按报错对号入座:① 磁盘空间不足(ENOSPC / no space left on device,Windows 为 os error 112)——请清理 profile 所在磁盘的剩余空间后重试;② 磁盘或挂载点只读、带写保护(EROFS / read-only file system,Windows 为 os error 19)——请确认 profile 目录所在磁盘可写(外接盘/U 盘、带写保护的移动盘或只读挂载的分区都会触发),必要时把插件目录换到系统盘的可写位置;③ 进程可用的文件句柄被耗尽(EMFILE / ENFILE / too many open files)——请关闭占用大量文件的程序并重启 DeepSeek Harness 后重试。",
|
|
@@ -513,8 +542,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
513
542
|
settingsUpdateDesc: "Update checks and the network channels used for installs",
|
|
514
543
|
settingsCheckOnStart: "Check for updates on startup",
|
|
515
544
|
settingsCheckOnStartDesc: "Check installed plugins for new versions when the hub opens; you will be notified when updates are found",
|
|
516
|
-
settingsAutoInstall: "Auto-install updates",
|
|
517
|
-
settingsAutoInstallDesc: "Install detected updates in the background without asking (a host restart applies them)",
|
|
518
545
|
settingsProxy: "HTTP proxy",
|
|
519
546
|
settingsProxyDesc: "Route npm, git and catalog requests through this proxy; leave empty to connect directly",
|
|
520
547
|
proxyCheckChecking: "Testing this proxy address…",
|
|
@@ -723,6 +750,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
723
750
|
bundleDeselectedHint: "Note: the marketplace is unchecked in this profile's bundle list, so it will not appear after the host restarts. Re-check dsh-plugin under Settings → Plugins.",
|
|
724
751
|
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.",
|
|
725
752
|
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.",
|
|
753
|
+
failProfileStateHint: "pnpm reported that the profile metadata does not match the current environment (e.g. ERR_PNPM_OUTDATED_LOCKFILE / ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND / ERR_PNPM_BAD_PM_VERSION / ERR_PNPM_PATCH_NOT_APPLIED): pnpm-lock.yaml, package.json or the patch declarations inside the profile disagree with the pnpm version in use, so pnpm aborts before installing anything — every plugin install into this profile will fail. This is not a problem with the plugin itself. Delete pnpm-lock.yaml inside the profile directory (~/.dsh/profiles/<profile>) and retry (pnpm regenerates it from the declared dependencies); if the error is about packageManager, set that field in package.json to the current pnpm major or remove it; if it still fails, rebuild the profile dependencies.",
|
|
754
|
+
failNodeEngineHint: "This plugin (or one of its dependencies) declares a higher Node / pnpm version (ERR_PNPM_UNSUPPORTED_ENGINE / EBADENGINE), which the current one does not satisfy, so pnpm refuses at install time. This is not a problem with the plugin itself. Upgrade Node to the required version (switch with nvm / fnm, or install a newer Node.js), confirm node -v and pnpm -v both satisfy it, then retry.",
|
|
726
755
|
failPnpmMissingDepTarget: "{pkg} was not found on the npm registry (404)",
|
|
727
756
|
failPnpmMissingDepHint: "pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): your profile keeps a dependency on a package that was never published, and pnpm hits it every time it resolves dependencies — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — then retry.",
|
|
728
757
|
failRegistryMirrorLagHint: "pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): that package does exist on the official npm registry, but the npm/pnpm registry (or mirror) configured on your machine has not synced it. Point the npm/pnpm registry back at the official one (https://registry.npmjs.org), or switch to a mirror that has the package, then retry. This is not a problem with the plugin itself.",
|
|
@@ -745,6 +774,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
745
774
|
failReason_buildToolchainMissing: "A dependency of this plugin must be compiled locally, but no usable compiler was found.",
|
|
746
775
|
failKind_pnpmStore: "pnpm store version mismatch",
|
|
747
776
|
failReason_pnpmStore: "The profile dependencies were written by a different pnpm major, which the current pnpm does not accept.",
|
|
777
|
+
failKind_pnpmModulesMismatch: "profile dependency directory does not match the current pnpm config",
|
|
778
|
+
failReason_pnpmModulesMismatch: "node_modules was created with a different pnpm config (hoisting / virtual store length), so pnpm refuses to reuse it.",
|
|
779
|
+
failPnpmModulesMismatchHint: "pnpm reported that the modules directory does not match the current configuration (`ERR_PNPM_*_DIFF`, e.g. virtual-store-dir-max-length, public-hoist-pattern, hoisting rules, node-linker): node_modules inside the profile was built under a different pnpm config (typically after editing .npmrc, switching pnpm majors, or when the pnpm bundled with the desktop app differs from the one on PATH), so the current pnpm refuses to operate on it — installs and removals in this profile will keep failing. Fix it (any one of these, run inside the profile directory ~/.dsh/profiles/<profile>): ① run pnpm install once so it recreates the modules directory with the current config; ② delete node_modules there — the next install/removal recreates it; ③ if you set these options in .npmrc, make the values consistent (or drop the overrides and go back to the defaults). This is not a problem with the plugin itself.",
|
|
748
780
|
failKind_pnpmWorkspace: "workspace-root check blocked the install",
|
|
749
781
|
failReason_pnpmWorkspace: "The profile is treated as a workspace root without a root operation declared, so pnpm aborted.",
|
|
750
782
|
failKind_originRejected: "request origin rejected by the local service",
|
|
@@ -753,6 +785,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
753
785
|
failReason_pnpmPolicy: "The version is younger than the minimum release age, or an integrity / trust check failed.",
|
|
754
786
|
failKind_pnpmUnusedPatch: "stale patch entry in the profile",
|
|
755
787
|
failReason_pnpmUnusedPatch: "The profile keeps a patch for an older dsh-plugin version, so pnpm aborted for safety.",
|
|
788
|
+
failKind_profileState: "profile pnpm metadata does not match this machine",
|
|
789
|
+
failReason_profileState: "The profile lockfile / package.json / packageManager version disagrees with the current pnpm, so the install aborts before starting.",
|
|
790
|
+
failKind_nodeEngine: "Node / pnpm on this machine is below the required version",
|
|
791
|
+
failReason_nodeEngine: "This plugin (or a dependency) requires a newer Node / pnpm, so pnpm rejects the install.",
|
|
756
792
|
failKind_pnpmMissingDep: "a dependency does not exist on the registry",
|
|
757
793
|
failReason_pnpmMissingDep: "The profile keeps a dependency on an unpublished package, which pnpm hits on every resolve.",
|
|
758
794
|
failKind_pluginMissingDep: "plugin dependency is not published",
|
|
@@ -761,6 +797,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
761
797
|
failReason_registryVersionStale: "The registry that actually performs the install has not synced this version yet, or the version is mistyped.",
|
|
762
798
|
failKind_registryAuth: "the npm registry rejected access",
|
|
763
799
|
failReason_registryAuth: "The registry returned 401/403: it needs credentials, or the current network is not allowed.",
|
|
800
|
+
failKind_profileExclusive: "the profile is managed only by the desktop app",
|
|
801
|
+
failReason_profileExclusive: "The dsh CLI may not manage the desktop profile, so the host refused before installing.",
|
|
764
802
|
failKind_pnpmLinkedDirMissing: "dangling local dependency in the profile",
|
|
765
803
|
failReason_pnpmLinkedDirMissing: "A link/file dependency points at a directory that no longer exists, so pnpm stalls on it.",
|
|
766
804
|
failKind_fileLocked: "a file is held by another program",
|
|
@@ -777,20 +815,36 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
777
815
|
failReason_hostIncompatible: "The plugin's declared compatibility list does not include the DSH version you are running.",
|
|
778
816
|
failKind_network: "network connection failed",
|
|
779
817
|
failReason_network: "The install could not reach the npm registry or the proxy, so the request never completed.",
|
|
818
|
+
failKind_tlsTrust: "HTTPS certificate verification failed",
|
|
819
|
+
failReason_tlsTrust: "Something on this machine is replacing HTTPS certificates, and Node / pnpm does not trust its root CA.",
|
|
820
|
+
failTlsTrustHint: "TLS certificate verification failed while reaching the npm registry (`ERR_PNPM_META_FETCH_FAIL` / unable to verify the first certificate): something on this machine is replacing HTTPS certificates — corporate SSL inspection, an antivirus web shield, a debugging proxy such as Fiddler / Charles, or HTTPS decryption in a local proxy — and Node / pnpm does not trust its root CA. This is not a problem with the plugin; every plugin would fail the same way. In order: ① if your network performs SSL inspection, ask IT for the root certificate (.cer / .pem) and point the NODE_EXTRA_CA_CERTS environment variable at it; ② on Node ≥ 22.15 you can set NODE_OPTIONS=--use-system-ca so Node trusts the system certificate store; ③ if only your local proxy decrypts HTTPS, add registry.npmjs.org to its direct (no-MITM) list; ④ as a temporary workaround, switch to a public mirror such as https://registry.npmmirror.com and retry. We do not recommend disabling strict-ssl: that gives up verification entirely and exposes you to man-in-the-middle attacks.",
|
|
780
821
|
failKind_hostCliSpawn: "the DSH host could not be launched",
|
|
781
822
|
failReason_hostCliSpawn: "The resolved host entry point would not start, so the install command never ran.",
|
|
782
823
|
failKind_hubState: "plugin hub state is out of sync",
|
|
783
824
|
failReason_hubState: "The locally recorded install state does not match reality, so this operation had no effect.",
|
|
825
|
+
failKind_profileBundleMissing: "profile dependencies are incomplete",
|
|
826
|
+
failReason_profileBundleMissing: "The host cannot find a bundle the profile declares, so the install failed before it even started.",
|
|
827
|
+
failProfileBundleMissingHint: "The host could not resolve the profile dependency \"{pkg}\" while starting plugin management — the dependencies declared by this profile are not fully installed (node_modules was deleted, a previous install was interrupted, or the desktop app update was incomplete). This has nothing to do with the plugin you were installing; any plugin would fail the same way. Fix it: ① let the host install the profile dependencies again (reopen the Plugin Hub inside the desktop app, or run `dsh plugin --profile {profile} install`; a desktop-managed profile has to be handled from inside the app, an external CLI is not allowed); ② if the same error persists, the app installation itself is incomplete — reinstall or upgrade DeepSeek Harness Desktop.",
|
|
784
828
|
failKind_timeout: "operation timed out",
|
|
785
829
|
failReason_timeout: "The install exceeded the time limit and was aborted.",
|
|
786
830
|
failKind_profileLock: "profile is locked by another process",
|
|
787
831
|
failReason_profileLock: "Another dsh process is using this profile right now.",
|
|
788
832
|
failKind_hub: "unknown error",
|
|
789
833
|
failReason_hub: "We could not identify this error yet — you can report it to us in one click.",
|
|
834
|
+
failKind_localEnv: "local environment failure",
|
|
835
|
+
failReason_localEnv: "The error points at your local environment (system error codes, certificates/proxy, or local config), and no plugin-side cause was found.",
|
|
836
|
+
failKind_dshTooOld: "DSH is older than the plugin requires",
|
|
837
|
+
failReason_dshTooOld: "The plugin declares a minimum DSH version that is newer than the host you are running.",
|
|
838
|
+
failDshTooOldHint: "The plugin \"{pkg}\" requires DSH {floor} or newer, but this host runs {current} — the install cannot succeed on an older host (or the plugin will not load properly). This is not a problem with the plugin itself, and not a mistake by the marketplace. Upgrade DeepSeek Harness to {floor} or newer, then retry from the Plugin Hub. If it still fails after upgrading, send us the new error.",
|
|
839
|
+
failLocalEnvHint: "The log only tells us one thing for sure: there is no evidence of a plugin-side failure — the signals point at your local environment (system call error codes, certificate/proxy validation, a broken local config file), but not precisely enough to name one. Any plugin would fail the same way on this machine, so it is not a problem with the plugin itself. Check in order: ① press \"Run diagnostics\" below; ② make sure the profile directory (~/.dsh/profiles/<profile>) is writable, the disk has free space, and antivirus is not blocking it; ③ if you use a proxy or a company mirror, switch back to the official registry (https://registry.npmjs.org) for one retry; ④ fully quit DeepSeek Harness and retry. If it still fails and you are sure your environment is fine, use the link below to report it with the full log copied from the Hub notifications.",
|
|
790
840
|
failRegistryVersionStaleHint: "pnpm reported that no matching version was found (ERR_PNPM_NO_MATCHING_VERSION): the version being installed does not exist in the npm registry that actually performs the install. This usually means the npmRegistry configured in the hub differs from the source in your local ~/.npmrc — the official registry has published it but the mirror has not synced yet (it can take minutes to hours) — or the version number was simply mistyped. This is not a problem with the plugin itself. Align the hub's npmRegistry with your local ~/.npmrc (or the other way round), or explicitly use the official registry (https://registry.npmjs.org) for that one install, or use an offline package, then retry; if the version was published only recently, waiting for the mirror to sync is enough.",
|
|
791
841
|
failRegistryAuthHint: "The installer was denied access to the npm registry (HTTP 401/403): that registry requires credentials, or it does not allow the current network/IP. If you are using a company or private registry, configure authentication first (npm login, or write //{host}/:_authToken=… into ~/.npmrc). If you do not need a private registry, point the registry back to the official one (https://registry.npmjs.org), or switch to a public mirror in the hub settings, then retry. This is not a problem with the plugin itself.",
|
|
792
842
|
failRegistryAuthHintNoHost: "The installer was denied access to the npm registry (HTTP 401/403): that registry requires credentials, or it does not allow the current network/IP. If you are using a company or private registry, configure authentication first (npm login, or write //<registry>/:_authToken=… into ~/.npmrc). If you do not need a private registry, point the registry back to the official one (https://registry.npmjs.org), or switch to a public mirror in the hub settings, then retry. This is not a problem with the plugin itself.",
|
|
843
|
+
failProfileExclusiveHint: "Profile \"{profile}\" is managed exclusively by the desktop app, and the command-line dsh is not allowed to install into it — this is not a problem with the plugin itself. Install from \"Settings → Plugin Hub\" inside DeepSeek Harness Desktop, or retry with a profile that is not desktop-managed (for example web). If you hit this inside the desktop app, open the Hub notifications, select the failed record and press \"Copy\" so you can send us the full log.",
|
|
844
|
+
failProfileExclusiveHintNoProfile: "The current profile is managed exclusively by the desktop app, and the command-line dsh is not allowed to install into it — this is not a problem with the plugin itself. Install from \"Settings → Plugin Hub\" inside DeepSeek Harness Desktop, or retry with a profile that is not desktop-managed (for example web). If you hit this inside the desktop app, open the Hub notifications, select the failed record and press \"Copy\" so you can send us the full log.",
|
|
845
|
+
failDesktopCliFallbackHint: "This failed because the installer could not find the desktop app's bundled CLI bootstrap and fell back to the command-line dsh, which is then refused — that is a bug in the plugin hub, not your environment. Use the button below to send us the full log and we will fix the path detection.",
|
|
793
846
|
failPnpmLinkedDirMissingHint: "pnpm reported that a directory it needs to install from does not exist (ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND): your profile keeps a local dependency (a link: / file: entry, e.g. from `dsh plugin add <local path>`) whose target directory has since been deleted or moved. pnpm hits it every time it resolves profile dependencies, so no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that local dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — or restore the directory to its original path, then retry.",
|
|
847
|
+
failLinkedDirTarget: "Missing local directory: {path}",
|
|
794
848
|
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.",
|
|
795
849
|
failAccessDeniedHint: "During install, Windows denied pnpm access to a file inside the profile (this shows as os error 5, \"Access is denied\"; on Node the equivalent codes are EPERM / EACCES). Typical causes: the file or directory is held by another process, the file is marked read-only, the directory permissions are restricted, or a real-time antivirus scan blocked the write. This is the same class of local file-system problem as a locked file (os error 32) — no plugin can be installed into that directory, so it 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. If it still fails, check whether the profile directory or its files are read-only and run as administrator.",
|
|
796
850
|
failFsUnavailableHint: "During install, pnpm could not write files to the local disk — this has nothing to do with which plugin you are installing: any plugin installed into the same directory would fail the same way, so it is not a problem with the plugin itself. Match the error you see: ① Out of space (ENOSPC / no space left on device, os error 112 on Windows) — free up space on the drive that holds the profile and retry. ② Read-only or write-protected volume (EROFS / read-only file system, os error 19 on Windows) — make sure the drive holding the profile directory is writable (external or USB drives, write-protected media, and read-only mounts all trigger this); move the plugin directory to a writable location on the system drive if needed. ③ File handles exhausted (EMFILE / ENFILE / too many open files) — close programs that hold many files open, restart DeepSeek Harness, then retry.",
|
|
@@ -854,42 +908,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
854
908
|
css: css$11
|
|
855
909
|
});
|
|
856
910
|
var Header_module_css_default = {
|
|
857
|
-
"
|
|
858
|
-
"
|
|
859
|
-
"
|
|
860
|
-
"
|
|
861
|
-
"logoIcon": "qikqja_logoIcon",
|
|
862
|
-
"segBtn": "qikqja_segBtn",
|
|
863
|
-
"tabCount": "qikqja_tabCount",
|
|
864
|
-
"taglineLink": "qikqja_taglineLink",
|
|
865
|
-
"segGroup": "qikqja_segGroup",
|
|
911
|
+
"root": "qikqja_root",
|
|
912
|
+
"brandTitle": "qikqja_brandTitle",
|
|
913
|
+
"adBanner": "qikqja_adBanner",
|
|
914
|
+
"adArrow": "qikqja_adArrow",
|
|
866
915
|
"version": "qikqja_version",
|
|
867
|
-
"
|
|
868
|
-
"
|
|
916
|
+
"resultCount": "qikqja_resultCount",
|
|
917
|
+
"search": "qikqja_search",
|
|
869
918
|
"tabs": "qikqja_tabs",
|
|
870
|
-
"
|
|
919
|
+
"versionBtn": "qikqja_versionBtn",
|
|
871
920
|
"hubUpdateBadge": "qikqja_hubUpdateBadge",
|
|
872
|
-
"
|
|
921
|
+
"segGroup": "qikqja_segGroup",
|
|
922
|
+
"segBtnActive": "qikqja_segBtnActive",
|
|
923
|
+
"tab": "qikqja_tab",
|
|
873
924
|
"headerTitleRow": "qikqja_headerTitleRow",
|
|
874
|
-
"
|
|
875
|
-
"
|
|
876
|
-
"
|
|
877
|
-
"
|
|
878
|
-
"title": "qikqja_title",
|
|
879
|
-
"adBanner": "qikqja_adBanner",
|
|
925
|
+
"header": "qikqja_header",
|
|
926
|
+
"taglineLink": "qikqja_taglineLink",
|
|
927
|
+
"tagline": "qikqja_tagline",
|
|
928
|
+
"adText": "qikqja_adText",
|
|
880
929
|
"adBadge": "qikqja_adBadge",
|
|
881
|
-
"
|
|
882
|
-
"
|
|
883
|
-
"
|
|
884
|
-
"resultSeg": "qikqja_resultSeg",
|
|
885
|
-
"adArrow": "qikqja_adArrow",
|
|
886
|
-
"sortGroup": "qikqja_sortGroup",
|
|
930
|
+
"tabCount": "qikqja_tabCount",
|
|
931
|
+
"langBtn": "qikqja_langBtn",
|
|
932
|
+
"logoIcon": "qikqja_logoIcon",
|
|
887
933
|
"githubIcon": "qikqja_githubIcon",
|
|
934
|
+
"resultSeg": "qikqja_resultSeg",
|
|
935
|
+
"title": "qikqja_title",
|
|
936
|
+
"copyIcon": "qikqja_copyIcon",
|
|
888
937
|
"segLabel": "qikqja_segLabel",
|
|
889
|
-
"
|
|
938
|
+
"githubLink": "qikqja_githubLink",
|
|
890
939
|
"aboutBtn": "qikqja_aboutBtn",
|
|
891
|
-
"
|
|
892
|
-
"
|
|
940
|
+
"headerRight": "qikqja_headerRight",
|
|
941
|
+
"segBtn": "qikqja_segBtn",
|
|
942
|
+
"controls": "qikqja_controls",
|
|
943
|
+
"searchRow": "qikqja_searchRow",
|
|
944
|
+
"sortGroup": "qikqja_sortGroup",
|
|
945
|
+
"tabActive": "qikqja_tabActive",
|
|
946
|
+
"tabsRow": "qikqja_tabsRow"
|
|
893
947
|
};
|
|
894
948
|
//#endregion
|
|
895
949
|
//#region \0dsh-css:src/client/styles/Modal.module.css.mjs
|
|
@@ -908,142 +962,142 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
908
962
|
css: css$10
|
|
909
963
|
});
|
|
910
964
|
var Modal_module_css_default = {
|
|
911
|
-
"
|
|
912
|
-
"
|
|
965
|
+
"failBigIssue": "BiQ1zG_failBigIssue",
|
|
966
|
+
"toast": "BiQ1zG_toast",
|
|
967
|
+
"noticeTextFail": "BiQ1zG_noticeTextFail",
|
|
968
|
+
"noticeTextOk": "BiQ1zG_noticeTextOk",
|
|
969
|
+
"queueRowHead": "BiQ1zG_queueRowHead",
|
|
913
970
|
"resultCheckIcon": "BiQ1zG_resultCheckIcon",
|
|
914
|
-
"
|
|
915
|
-
"
|
|
916
|
-
"
|
|
917
|
-
"
|
|
918
|
-
"
|
|
919
|
-
"
|
|
920
|
-
"
|
|
921
|
-
"
|
|
922
|
-
"
|
|
923
|
-
"modalClose": "BiQ1zG_modalClose",
|
|
924
|
-
"queueRowDesc": "BiQ1zG_queueRowDesc",
|
|
925
|
-
"modalActions": "BiQ1zG_modalActions",
|
|
926
|
-
"toastFail": "BiQ1zG_toastFail",
|
|
927
|
-
"restartLater": "BiQ1zG_restartLater",
|
|
971
|
+
"noticeTime": "BiQ1zG_noticeTime",
|
|
972
|
+
"detailPath": "BiQ1zG_detailPath",
|
|
973
|
+
"modalIn": "BiQ1zG_modalIn",
|
|
974
|
+
"stripCancel": "BiQ1zG_stripCancel",
|
|
975
|
+
"modalTitleBusy": "BiQ1zG_modalTitleBusy",
|
|
976
|
+
"modalRow": "BiQ1zG_modalRow",
|
|
977
|
+
"noticeRow": "BiQ1zG_noticeRow",
|
|
978
|
+
"detailArrow": "BiQ1zG_detailArrow",
|
|
979
|
+
"queuedHint": "BiQ1zG_queuedHint",
|
|
928
980
|
"modalDesc": "BiQ1zG_modalDesc",
|
|
929
|
-
"
|
|
930
|
-
"
|
|
931
|
-
"detailStatusPending": "BiQ1zG_detailStatusPending",
|
|
932
|
-
"aboutModal": "BiQ1zG_aboutModal",
|
|
981
|
+
"toastIn": "BiQ1zG_toastIn",
|
|
982
|
+
"failDiagBtn": "BiQ1zG_failDiagBtn",
|
|
933
983
|
"failedCopyHint": "BiQ1zG_failedCopyHint",
|
|
934
|
-
"aboutMeta": "BiQ1zG_aboutMeta",
|
|
935
|
-
"errorHint": "BiQ1zG_errorHint",
|
|
936
|
-
"detailLink": "BiQ1zG_detailLink",
|
|
937
|
-
"modalIn": "BiQ1zG_modalIn",
|
|
938
|
-
"noticeList": "BiQ1zG_noticeList",
|
|
939
|
-
"helpModal": "BiQ1zG_helpModal",
|
|
940
|
-
"trustHint": "BiQ1zG_trustHint",
|
|
941
984
|
"queueRowPct": "BiQ1zG_queueRowPct",
|
|
942
|
-
"
|
|
985
|
+
"queueRowTrack": "BiQ1zG_queueRowTrack",
|
|
986
|
+
"noticeHead": "BiQ1zG_noticeHead",
|
|
987
|
+
"detailStatusText": "BiQ1zG_detailStatusText",
|
|
988
|
+
"resultCheck": "BiQ1zG_resultCheck",
|
|
989
|
+
"errorHint": "BiQ1zG_errorHint",
|
|
990
|
+
"errorModal": "BiQ1zG_errorModal",
|
|
991
|
+
"confirmPrimary": "BiQ1zG_confirmPrimary",
|
|
943
992
|
"detailDim": "BiQ1zG_detailDim",
|
|
944
|
-
"
|
|
945
|
-
"
|
|
946
|
-
"
|
|
947
|
-
"
|
|
993
|
+
"modalTitle": "BiQ1zG_modalTitle",
|
|
994
|
+
"modalCmdText": "BiQ1zG_modalCmdText",
|
|
995
|
+
"pendingRowStatus": "BiQ1zG_pendingRowStatus",
|
|
996
|
+
"noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
|
|
997
|
+
"helpModal": "BiQ1zG_helpModal",
|
|
998
|
+
"failReason": "BiQ1zG_failReason",
|
|
999
|
+
"resultRestarting": "BiQ1zG_resultRestarting",
|
|
1000
|
+
"restartNowWarning": "BiQ1zG_restartNowWarning",
|
|
1001
|
+
"hubUpdateModal": "BiQ1zG_hubUpdateModal",
|
|
1002
|
+
"noticeList": "BiQ1zG_noticeList",
|
|
1003
|
+
"dangerConfirm": "BiQ1zG_dangerConfirm",
|
|
1004
|
+
"modalInstall": "BiQ1zG_modalInstall",
|
|
1005
|
+
"detailPathActions": "BiQ1zG_detailPathActions",
|
|
1006
|
+
"progressFillFail": "BiQ1zG_progressFillFail",
|
|
948
1007
|
"queueRow": "BiQ1zG_queueRow",
|
|
949
|
-
"
|
|
950
|
-
"
|
|
1008
|
+
"aboutModal": "BiQ1zG_aboutModal",
|
|
1009
|
+
"detailPathText": "BiQ1zG_detailPathText",
|
|
951
1010
|
"resultDesc": "BiQ1zG_resultDesc",
|
|
952
|
-
"
|
|
953
|
-
"progressFill": "BiQ1zG_progressFill",
|
|
954
|
-
"failNetworkTarget": "BiQ1zG_failNetworkTarget",
|
|
955
|
-
"failMisjudgeLink": "BiQ1zG_failMisjudgeLink",
|
|
956
|
-
"bundleDeselectedHint": "BiQ1zG_bundleDeselectedHint",
|
|
957
|
-
"detailPathActions": "BiQ1zG_detailPathActions",
|
|
958
|
-
"toast": "BiQ1zG_toast",
|
|
959
|
-
"linkIcon": "BiQ1zG_linkIcon",
|
|
960
|
-
"modalRow": "BiQ1zG_modalRow",
|
|
961
|
-
"detailValue": "BiQ1zG_detailValue",
|
|
962
|
-
"progress": "BiQ1zG_progress",
|
|
963
|
-
"modalBody": "BiQ1zG_modalBody",
|
|
964
|
-
"resultTitle": "BiQ1zG_resultTitle",
|
|
965
|
-
"noticeRemove": "BiQ1zG_noticeRemove",
|
|
966
|
-
"modalInstall": "BiQ1zG_modalInstall",
|
|
967
|
-
"overlay": "BiQ1zG_overlay",
|
|
1011
|
+
"modalCmdCopy": "BiQ1zG_modalCmdCopy",
|
|
968
1012
|
"queueRowTarget": "BiQ1zG_queueRowTarget",
|
|
969
|
-
"
|
|
1013
|
+
"modal": "BiQ1zG_modal",
|
|
1014
|
+
"modalHead": "BiQ1zG_modalHead",
|
|
1015
|
+
"noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
|
|
970
1016
|
"uninstallConfirm": "BiQ1zG_uninstallConfirm",
|
|
971
|
-
"modalCmd": "BiQ1zG_modalCmd",
|
|
972
|
-
"failRepoLabel": "BiQ1zG_failRepoLabel",
|
|
973
1017
|
"cliOnlyHint": "BiQ1zG_cliOnlyHint",
|
|
974
|
-
"confirmIconDanger": "BiQ1zG_confirmIconDanger",
|
|
975
|
-
"modalCancel": "BiQ1zG_modalCancel",
|
|
976
|
-
"queueRowStatus": "BiQ1zG_queueRowStatus",
|
|
977
|
-
"queuedHint": "BiQ1zG_queuedHint",
|
|
978
1018
|
"noticeVersion": "BiQ1zG_noticeVersion",
|
|
979
|
-
"
|
|
980
|
-
"restartNow": "BiQ1zG_restartNow",
|
|
981
|
-
"detailGrid": "BiQ1zG_detailGrid",
|
|
982
|
-
"detailLabel": "BiQ1zG_detailLabel",
|
|
983
|
-
"failPrepareHint": "BiQ1zG_failPrepareHint",
|
|
984
|
-
"progressFillFail": "BiQ1zG_progressFillFail",
|
|
1019
|
+
"hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
|
|
985
1020
|
"confirmIconWrap": "BiQ1zG_confirmIconWrap",
|
|
986
|
-
"
|
|
1021
|
+
"detailStatusRunning": "BiQ1zG_detailStatusRunning",
|
|
1022
|
+
"detailRow": "BiQ1zG_detailRow",
|
|
1023
|
+
"pendingRowActions": "BiQ1zG_pendingRowActions",
|
|
1024
|
+
"failRepoUrl": "BiQ1zG_failRepoUrl",
|
|
1025
|
+
"queueRowDesc": "BiQ1zG_queueRowDesc",
|
|
1026
|
+
"confirmIconDanger": "BiQ1zG_confirmIconDanger",
|
|
1027
|
+
"failRepoLabel": "BiQ1zG_failRepoLabel",
|
|
987
1028
|
"noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
|
|
988
|
-
"
|
|
989
|
-
"
|
|
990
|
-
"confirmPrimary": "BiQ1zG_confirmPrimary",
|
|
991
|
-
"resultRestarting": "BiQ1zG_resultRestarting",
|
|
1029
|
+
"modalTitleQueued": "BiQ1zG_modalTitleQueued",
|
|
1030
|
+
"errorCopySoft": "BiQ1zG_errorCopySoft",
|
|
992
1031
|
"detailUpdateHint": "BiQ1zG_detailUpdateHint",
|
|
993
|
-
"
|
|
994
|
-
"
|
|
995
|
-
"
|
|
996
|
-
"
|
|
997
|
-
"
|
|
998
|
-
"
|
|
999
|
-
"errorBox": "BiQ1zG_errorBox",
|
|
1000
|
-
"noticeRowOk": "BiQ1zG_noticeRowOk",
|
|
1001
|
-
"detailArrow": "BiQ1zG_detailArrow",
|
|
1002
|
-
"detailStatusText": "BiQ1zG_detailStatusText",
|
|
1032
|
+
"failPrepareHint": "BiQ1zG_failPrepareHint",
|
|
1033
|
+
"detailLink": "BiQ1zG_detailLink",
|
|
1034
|
+
"modalClose": "BiQ1zG_modalClose",
|
|
1035
|
+
"noticeRowMain": "BiQ1zG_noticeRowMain",
|
|
1036
|
+
"failKindInstall": "BiQ1zG_failKindInstall",
|
|
1037
|
+
"detailModal": "BiQ1zG_detailModal",
|
|
1003
1038
|
"failClear": "BiQ1zG_failClear",
|
|
1004
|
-
"
|
|
1005
|
-
"
|
|
1006
|
-
"
|
|
1007
|
-
"
|
|
1008
|
-
"
|
|
1039
|
+
"failKind": "BiQ1zG_failKind",
|
|
1040
|
+
"detailMono": "BiQ1zG_detailMono",
|
|
1041
|
+
"detailStatusPending": "BiQ1zG_detailStatusPending",
|
|
1042
|
+
"progressFill": "BiQ1zG_progressFill",
|
|
1043
|
+
"aboutContent": "BiQ1zG_aboutContent",
|
|
1044
|
+
"modalBody": "BiQ1zG_modalBody",
|
|
1045
|
+
"progressText": "BiQ1zG_progressText",
|
|
1046
|
+
"logModal": "BiQ1zG_logModal",
|
|
1047
|
+
"trustHint": "BiQ1zG_trustHint",
|
|
1048
|
+
"toastFail": "BiQ1zG_toastFail",
|
|
1049
|
+
"confirmIcon": "BiQ1zG_confirmIcon",
|
|
1009
1050
|
"failRepo": "BiQ1zG_failRepo",
|
|
1010
|
-
"
|
|
1011
|
-
"
|
|
1012
|
-
"
|
|
1051
|
+
"queueSection": "BiQ1zG_queueSection",
|
|
1052
|
+
"queueRowStatus": "BiQ1zG_queueRowStatus",
|
|
1053
|
+
"hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
|
|
1013
1054
|
"modalWide": "BiQ1zG_modalWide",
|
|
1014
|
-
"
|
|
1015
|
-
"result": "BiQ1zG_result",
|
|
1016
|
-
"noticeRowMain": "BiQ1zG_noticeRowMain",
|
|
1017
|
-
"failKindTitle": "BiQ1zG_failKindTitle",
|
|
1055
|
+
"bundleDeselectedHint": "BiQ1zG_bundleDeselectedHint",
|
|
1018
1056
|
"modalCloseIcon": "BiQ1zG_modalCloseIcon",
|
|
1019
|
-
"
|
|
1020
|
-
"
|
|
1021
|
-
"confirmIcon": "BiQ1zG_confirmIcon",
|
|
1022
|
-
"noticeMain": "BiQ1zG_noticeMain",
|
|
1023
|
-
"failRepoUrl": "BiQ1zG_failRepoUrl",
|
|
1024
|
-
"failReason": "BiQ1zG_failReason",
|
|
1025
|
-
"failDiagBtn": "BiQ1zG_failDiagBtn",
|
|
1026
|
-
"dangerConfirm": "BiQ1zG_dangerConfirm",
|
|
1027
|
-
"modalTitleBusy": "BiQ1zG_modalTitleBusy",
|
|
1057
|
+
"errorTitle": "BiQ1zG_errorTitle",
|
|
1058
|
+
"noticeFoot": "BiQ1zG_noticeFoot",
|
|
1028
1059
|
"failCopy": "BiQ1zG_failCopy",
|
|
1029
|
-
"
|
|
1030
|
-
"
|
|
1031
|
-
"
|
|
1032
|
-
"
|
|
1033
|
-
"queueRowTrack": "BiQ1zG_queueRowTrack",
|
|
1060
|
+
"hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
|
|
1061
|
+
"failList": "BiQ1zG_failList",
|
|
1062
|
+
"detailPathBtn": "BiQ1zG_detailPathBtn",
|
|
1063
|
+
"failEmpty": "BiQ1zG_failEmpty",
|
|
1034
1064
|
"progressHead": "BiQ1zG_progressHead",
|
|
1065
|
+
"restartNow": "BiQ1zG_restartNow",
|
|
1066
|
+
"resultTitle": "BiQ1zG_resultTitle",
|
|
1067
|
+
"progress": "BiQ1zG_progress",
|
|
1068
|
+
"failMisjudgeLink": "BiQ1zG_failMisjudgeLink",
|
|
1069
|
+
"noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
|
|
1070
|
+
"failKindUninstall": "BiQ1zG_failKindUninstall",
|
|
1071
|
+
"noticeMain": "BiQ1zG_noticeMain",
|
|
1072
|
+
"modalLink": "BiQ1zG_modalLink",
|
|
1035
1073
|
"failRow": "BiQ1zG_failRow",
|
|
1036
|
-
"
|
|
1037
|
-
"
|
|
1038
|
-
"
|
|
1039
|
-
"
|
|
1040
|
-
"
|
|
1041
|
-
"
|
|
1074
|
+
"detailLabel": "BiQ1zG_detailLabel",
|
|
1075
|
+
"failNetworkTarget": "BiQ1zG_failNetworkTarget",
|
|
1076
|
+
"modalActions": "BiQ1zG_modalActions",
|
|
1077
|
+
"detailValue": "BiQ1zG_detailValue",
|
|
1078
|
+
"modalValue": "BiQ1zG_modalValue",
|
|
1079
|
+
"noticeRemove": "BiQ1zG_noticeRemove",
|
|
1080
|
+
"failKindTitle": "BiQ1zG_failKindTitle",
|
|
1081
|
+
"errorBox": "BiQ1zG_errorBox",
|
|
1042
1082
|
"modalCopy": "BiQ1zG_modalCopy",
|
|
1043
|
-
"
|
|
1044
|
-
"
|
|
1045
|
-
"
|
|
1046
|
-
"
|
|
1083
|
+
"aboutMeta": "BiQ1zG_aboutMeta",
|
|
1084
|
+
"overlayIn": "BiQ1zG_overlayIn",
|
|
1085
|
+
"detailGrid": "BiQ1zG_detailGrid",
|
|
1086
|
+
"detailStars": "BiQ1zG_detailStars",
|
|
1087
|
+
"queueSectionTitle": "BiQ1zG_queueSectionTitle",
|
|
1088
|
+
"noticeRowOk": "BiQ1zG_noticeRowOk",
|
|
1089
|
+
"result": "BiQ1zG_result",
|
|
1090
|
+
"failHead": "BiQ1zG_failHead",
|
|
1091
|
+
"noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
|
|
1092
|
+
"overlay": "BiQ1zG_overlay",
|
|
1093
|
+
"modalCmd": "BiQ1zG_modalCmd",
|
|
1094
|
+
"queueRowBody": "BiQ1zG_queueRowBody",
|
|
1095
|
+
"progressTrack": "BiQ1zG_progressTrack",
|
|
1096
|
+
"restartLater": "BiQ1zG_restartLater",
|
|
1097
|
+
"modalLabel": "BiQ1zG_modalLabel",
|
|
1098
|
+
"linkIcon": "BiQ1zG_linkIcon",
|
|
1099
|
+
"modalCancel": "BiQ1zG_modalCancel",
|
|
1100
|
+
"noticeIgnore": "BiQ1zG_noticeIgnore"
|
|
1047
1101
|
};
|
|
1048
1102
|
//#endregion
|
|
1049
1103
|
//#region src/server/services/install/release-target.ts
|
|
@@ -1133,7 +1187,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1133
1187
|
* tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
|
|
1134
1188
|
* node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
|
|
1135
1189
|
*/
|
|
1136
|
-
const PLUGIN_VERSION = "2.1
|
|
1190
|
+
const PLUGIN_VERSION = "2.2.1";
|
|
1137
1191
|
const CATEGORY_ORDER = [
|
|
1138
1192
|
"interface",
|
|
1139
1193
|
"session",
|
|
@@ -1472,19 +1526,56 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1472
1526
|
if (Number.isNaN(ms)) return false;
|
|
1473
1527
|
return now - ms < MIN_RELEASE_AGE_MS;
|
|
1474
1528
|
}
|
|
1475
|
-
/** 版本号比较(逐段数字;缺失段按 0)。返回负数/0/正数,非法输入按相等处理。
|
|
1529
|
+
/** 版本号比较(逐段数字;缺失段按 0)。返回负数/0/正数,非法输入按相等处理。
|
|
1530
|
+
* 兼容目录里的 `v1.1.8` 与 npm 的 `1.1.8`:每段先剥掉前导非数字,再取整。
|
|
1531
|
+
* 预发布后缀单独处理:`1.0.0` 高于 `1.0.0-beta.1`,两个预发布版按标识符比较
|
|
1532
|
+
* (纯数字段按数值,数字段低于字母段)。 */
|
|
1476
1533
|
function compareVersions(a, b) {
|
|
1477
|
-
const
|
|
1478
|
-
const
|
|
1479
|
-
|
|
1534
|
+
const core = (v) => (v.split("+")[0] ?? "").split("-")[0].split(".").map((part) => Number.parseInt(part.replace(/^[^\d]+/, ""), 10)).filter((n) => !Number.isNaN(n));
|
|
1535
|
+
const pre = (v) => {
|
|
1536
|
+
const rest = (v.split("+")[0] ?? "").split("-").slice(1);
|
|
1537
|
+
return rest.length === 0 ? [] : rest.join("-").split(".");
|
|
1538
|
+
};
|
|
1539
|
+
const va = core(a);
|
|
1540
|
+
const vb = core(b);
|
|
1480
1541
|
const len = Math.max(va.length, vb.length);
|
|
1481
1542
|
for (let i = 0; i < len; i++) {
|
|
1482
1543
|
const d = (va[i] ?? 0) - (vb[i] ?? 0);
|
|
1483
1544
|
if (d !== 0) return d;
|
|
1484
1545
|
}
|
|
1546
|
+
const pa = pre(a);
|
|
1547
|
+
const pb = pre(b);
|
|
1548
|
+
if (pa.length === 0 && pb.length === 0) return 0;
|
|
1549
|
+
if (pa.length === 0) return 1;
|
|
1550
|
+
if (pb.length === 0) return -1;
|
|
1551
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
1552
|
+
const x = pa[i];
|
|
1553
|
+
const y = pb[i];
|
|
1554
|
+
if (x === void 0) return -1;
|
|
1555
|
+
if (y === void 0) return 1;
|
|
1556
|
+
const nx = /^\d+$/.test(x) ? Number(x) : null;
|
|
1557
|
+
const ny = /^\d+$/.test(y) ? Number(y) : null;
|
|
1558
|
+
if (nx !== null && ny !== null) {
|
|
1559
|
+
if (nx !== ny) return nx - ny;
|
|
1560
|
+
} else if (x !== y) return x < y ? -1 : 1;
|
|
1561
|
+
}
|
|
1485
1562
|
return 0;
|
|
1486
1563
|
}
|
|
1487
1564
|
/**
|
|
1565
|
+
* 是否值得提示「可更新」:npm 上最新可安装版本确实比已装版本新,且已过供应链门禁。
|
|
1566
|
+
*
|
|
1567
|
+
* 更新命令执行的是 `pkg@latest`,所以「目录里标的版本」不是最终能装上的版本:
|
|
1568
|
+
* 作者可能只打了 GitHub release 没发 npm —— 此时提示会变成永远点不掉的循环。
|
|
1569
|
+
* 任一信息缺失(查不到发布信息 / 没有已装版本记录)返回 true,交回调用方原有判定:
|
|
1570
|
+
* 宁可提示,也不因为一次查询失败把真实更新吃掉。
|
|
1571
|
+
*/
|
|
1572
|
+
function isUpdateOffered(release, installedVersion, now) {
|
|
1573
|
+
if (release === null) return true;
|
|
1574
|
+
if (isReleaseTooFresh(release.publishedAt, now)) return false;
|
|
1575
|
+
if (installedVersion !== null && compareVersions(release.version, installedVersion) <= 0) return false;
|
|
1576
|
+
return true;
|
|
1577
|
+
}
|
|
1578
|
+
/**
|
|
1488
1579
|
* 选出本次真正该提示的更新版本。
|
|
1489
1580
|
*
|
|
1490
1581
|
* 只看最新版会漏更新:连续发版时间隔小于供应链门禁时,最新版永远「太新」,
|
|
@@ -1563,6 +1654,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1563
1654
|
* 是否有更新:仅对已安装插件有意义。
|
|
1564
1655
|
* 双信号判定——有 release 版本的比版本;无版本(repo 不打 tag)的比仓库最近更新时间
|
|
1565
1656
|
* (repoUpdatedAt,ISO 字符串字典序 = 时间序),更新时间变新说明有新提交。
|
|
1657
|
+
* 版本用「目录 > 已装」判断,不做 != 比较:目录可能滞后于 npm,若直接用不等,
|
|
1658
|
+
* 会把「已装 1.1.10、目录还写 1.1.8」判成有更新,反而引导用户降级。
|
|
1566
1659
|
*/
|
|
1567
1660
|
function hasUpdateOf(plugin, installed, versions) {
|
|
1568
1661
|
if (installedNameOf(plugin, installed, versions) === null) return false;
|
|
@@ -1570,7 +1663,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1570
1663
|
if (!repo) return false;
|
|
1571
1664
|
const rec = versions[repo.toLowerCase()];
|
|
1572
1665
|
if (!rec) return false;
|
|
1573
|
-
if (plugin.version) return plugin.version
|
|
1666
|
+
if (plugin.version) return compareVersions(plugin.version, rec.version) > 0;
|
|
1574
1667
|
const current = plugin.dates?.repoUpdatedAt;
|
|
1575
1668
|
return Boolean(current && rec.updatedAt && current > rec.updatedAt);
|
|
1576
1669
|
}
|
|
@@ -1693,8 +1786,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1693
1786
|
*/
|
|
1694
1787
|
/** 插件市场自身仓库:DSH Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
|
|
1695
1788
|
const SELF_REPO = "dshplugin/dsh-plugin-hub";
|
|
1696
|
-
/**
|
|
1697
|
-
const
|
|
1789
|
+
/** 共享的空发布信息表:无候选包时复用,避免每次渲染新建对象。 */
|
|
1790
|
+
const EMPTY_RELEASES = {};
|
|
1698
1791
|
/** 市场各排序的默认方向:全部按倒序(Star/Fork 多、更新/收录近的在前) */
|
|
1699
1792
|
const SORT_DEFAULT_DIR$1 = {
|
|
1700
1793
|
sortStars: "desc",
|
|
@@ -1839,14 +1932,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1839
1932
|
/** 该插件安装时记录的目录版本(无记录/未安装 → null)。 */
|
|
1840
1933
|
const installedVersion = (p) => installedVersionOf(p, versions);
|
|
1841
1934
|
/**
|
|
1842
|
-
*
|
|
1935
|
+
* 更新可用性校验状态:npm registry 上每个包的最新可安装版本与发布时间。
|
|
1843
1936
|
* key 是这批候选包名的指纹,与已查出的 key 一致才算就绪,避免查询未回来时先显示更新。
|
|
1844
1937
|
*/
|
|
1845
1938
|
const [releaseAge, setReleaseAge] = (0, react.useState)({
|
|
1846
1939
|
key: "",
|
|
1847
|
-
|
|
1940
|
+
releases: EMPTY_RELEASES
|
|
1848
1941
|
});
|
|
1849
|
-
/**
|
|
1942
|
+
/** 已安装项原始列表(未套校验):先算出来才能收集需要查发布信息的候选包名。 */
|
|
1850
1943
|
const rawInstalledItems = (0, react.useMemo)(() => installedItemsOf(plugins, installed, versions, installPaths, loadedNames, dshCapableNames), [
|
|
1851
1944
|
plugins,
|
|
1852
1945
|
installed,
|
|
@@ -1855,7 +1948,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1855
1948
|
loadedNames,
|
|
1856
1949
|
dshCapableNames
|
|
1857
1950
|
]);
|
|
1858
|
-
/**
|
|
1951
|
+
/** 校验候选:有更新、且有 npm 包名(更新走 npm registry)的已安装插件包名。 */
|
|
1859
1952
|
const releaseAgeCandidates = (0, react.useMemo)(() => {
|
|
1860
1953
|
const names = /* @__PURE__ */ new Set();
|
|
1861
1954
|
for (const item of rawInstalledItems) {
|
|
@@ -1866,61 +1959,83 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1866
1959
|
return [...names].sort();
|
|
1867
1960
|
}, [rawInstalledItems, versions]);
|
|
1868
1961
|
const releaseAgeKey = releaseAgeCandidates.join("\n");
|
|
1962
|
+
/** 包名 → 已装版本:判断 npm 上最新版是否真的比已装版本新。 */
|
|
1963
|
+
const installedByPackage = (0, react.useMemo)(() => {
|
|
1964
|
+
const map = /* @__PURE__ */ new Map();
|
|
1965
|
+
for (const item of rawInstalledItems) {
|
|
1966
|
+
if (!item.plugin) continue;
|
|
1967
|
+
const pkg = npmPackageOf(item.plugin, versions);
|
|
1968
|
+
const version = installedVersionOf(item.plugin, versions);
|
|
1969
|
+
if (pkg !== null && version !== null) map.set(pkg, version);
|
|
1970
|
+
}
|
|
1971
|
+
return map;
|
|
1972
|
+
}, [rawInstalledItems, versions]);
|
|
1869
1973
|
(0, react.useEffect)(() => {
|
|
1870
1974
|
if (releaseAgeKey === releaseAge.key) return;
|
|
1871
1975
|
if (releaseAgeCandidates.length === 0) {
|
|
1872
1976
|
setReleaseAge({
|
|
1873
1977
|
key: "",
|
|
1874
|
-
|
|
1978
|
+
releases: EMPTY_RELEASES
|
|
1875
1979
|
});
|
|
1876
1980
|
return;
|
|
1877
1981
|
}
|
|
1878
1982
|
let cancelled = false;
|
|
1879
1983
|
fetchNpmReleaseAge(releaseAgeCandidates).then((result) => {
|
|
1880
1984
|
if (cancelled) return;
|
|
1881
|
-
const now = Date.now();
|
|
1882
|
-
const held = /* @__PURE__ */ new Set();
|
|
1883
|
-
for (const name of releaseAgeCandidates) {
|
|
1884
|
-
const info = result?.[name];
|
|
1885
|
-
if (info && isReleaseTooFresh(info.publishedAt, now)) held.add(name);
|
|
1886
|
-
}
|
|
1887
1985
|
setReleaseAge({
|
|
1888
1986
|
key: releaseAgeKey,
|
|
1889
|
-
|
|
1987
|
+
releases: result ?? EMPTY_RELEASES
|
|
1890
1988
|
});
|
|
1891
1989
|
});
|
|
1892
1990
|
return () => {
|
|
1893
1991
|
cancelled = true;
|
|
1894
1992
|
};
|
|
1895
1993
|
}, [releaseAgeKey, releaseAge.key]);
|
|
1896
|
-
/**
|
|
1994
|
+
/** 校验结果是否已就绪(候选为空也算就绪):未就绪时不写更新提醒,等查询回来再定。 */
|
|
1897
1995
|
const releaseAgeReady = releaseAgeKey === releaseAge.key;
|
|
1898
|
-
|
|
1996
|
+
/**
|
|
1997
|
+
* 不能提示更新的包:
|
|
1998
|
+
* - npm 上最新版还没过供应链门禁(发布不满 24h,pnpm 会静默回退,点了也装不上);
|
|
1999
|
+
* - npm 上最新版并不高于已装版本 —— 更新走的是 `pkg@latest`,此时无论目录标到哪个 tag,
|
|
2000
|
+
* 都不可能装上(作者可能只打了 GitHub release 没发 npm),提示只会变成永远点不掉的循环。
|
|
2001
|
+
*/
|
|
2002
|
+
const updateBlocked = (0, react.useMemo)(() => {
|
|
2003
|
+
const blocked = /* @__PURE__ */ new Set();
|
|
2004
|
+
if (!releaseAgeReady) return blocked;
|
|
2005
|
+
const now = Date.now();
|
|
2006
|
+
for (const pkg of releaseAgeCandidates) if (!isUpdateOffered(releaseAge.releases[pkg] ?? null, installedByPackage.get(pkg) ?? null, now)) blocked.add(pkg);
|
|
2007
|
+
return blocked;
|
|
2008
|
+
}, [
|
|
2009
|
+
releaseAgeReady,
|
|
2010
|
+
releaseAgeCandidates,
|
|
2011
|
+
releaseAge.releases,
|
|
2012
|
+
installedByPackage
|
|
2013
|
+
]);
|
|
1899
2014
|
/**
|
|
1900
2015
|
* 是否有更新:仅对已安装插件有意义。
|
|
1901
2016
|
* 双信号判定——有 release 版本的比版本;无版本(repo 不打 tag)的比仓库最近更新时间
|
|
1902
2017
|
* (repoUpdatedAt,ISO 字符串字典序 = 时间序),更新时间变新说明有新提交。
|
|
1903
|
-
*
|
|
2018
|
+
* 再用 npm registry 的实际最新版本复核:装不上的(太新 / 不比已装新)不打更新标记。
|
|
1904
2019
|
*/
|
|
1905
2020
|
const hasUpdate = (p) => {
|
|
1906
2021
|
if (!hasUpdateOf(p, installed, versions)) return false;
|
|
1907
2022
|
const pkg = npmPackageOf(p, versions);
|
|
1908
|
-
return pkg === null || !
|
|
2023
|
+
return pkg === null || !updateBlocked.has(pkg);
|
|
1909
2024
|
};
|
|
1910
|
-
/** 已安装项统一列表(目录元数据 +
|
|
2025
|
+
/** 已安装项统一列表(目录元数据 + 运行时信息合并):被拦下的去掉更新标记,驱动「已安装」tab。 */
|
|
1911
2026
|
const installedItems = (0, react.useMemo)(() => {
|
|
1912
|
-
if (
|
|
2027
|
+
if (updateBlocked.size === 0) return rawInstalledItems;
|
|
1913
2028
|
return rawInstalledItems.map((item) => {
|
|
1914
2029
|
if (!item.hasUpdate || !item.plugin) return item;
|
|
1915
2030
|
const pkg = npmPackageOf(item.plugin, versions);
|
|
1916
|
-
return pkg !== null &&
|
|
2031
|
+
return pkg !== null && updateBlocked.has(pkg) ? {
|
|
1917
2032
|
...item,
|
|
1918
2033
|
hasUpdate: false
|
|
1919
2034
|
} : item;
|
|
1920
2035
|
});
|
|
1921
2036
|
}, [
|
|
1922
2037
|
rawInstalledItems,
|
|
1923
|
-
|
|
2038
|
+
updateBlocked,
|
|
1924
2039
|
versions
|
|
1925
2040
|
]);
|
|
1926
2041
|
/**
|
|
@@ -1934,7 +2049,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1934
2049
|
* registry 真实发布时间下发(同源),据此判断最准。门槛命中要单列成 `pending` 而不是
|
|
1935
2050
|
* 落回「无更新」——回落会让弹窗在本机版本落后时谎称「已是最新」。
|
|
1936
2051
|
*/
|
|
1937
|
-
const hubCurrentVersion = "2.1
|
|
2052
|
+
const hubCurrentVersion = "2.2.1";
|
|
1938
2053
|
const hubUpdateResult = hubUpdateInfo === null ? {
|
|
1939
2054
|
state: "none",
|
|
1940
2055
|
target: null
|
|
@@ -2182,37 +2297,50 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2182
2297
|
*/
|
|
2183
2298
|
function classifyFailure(message) {
|
|
2184
2299
|
if (/installation rejected:.*incompatible with dsh/i.test(message)) return "hostIncompatible";
|
|
2300
|
+
if (/is managed exclusively by the Electron application|managed exclusively by the desktop app/i.test(message)) return "profileExclusive";
|
|
2185
2301
|
if (/\[npm-too-low\]|edgesOut/i.test(message)) return "npmTooOld";
|
|
2302
|
+
if (/ERR_PNPM_UNSUPPORTED_ENGINE|ERR_PNPM_INVALID_NODE_VERSION|\bEBADENGINE\b/i.test(message)) return "nodeEngine";
|
|
2186
2303
|
if (/\[pnpm-missing\]|pnpm not found|pnpm: command not found|spawn pnpm ENOENT|'pnpm' 不是内部或外部命令|"pnpm" 不是内部或外部命令|pnpm['"]?\s*is not recognized/i.test(message)) return "pnpmMissing";
|
|
2187
2304
|
if (/\[git-missing\]|spawn git ENOENT|'git' 不是内部或外部命令|"git" 不是内部或外部命令|git['"]?\s*is not recognized|git: command not found/i.test(message)) return "gitMissing";
|
|
2188
2305
|
if (/\[npm-missing\]|spawn npm ENOENT|'npm' 不是内部或外部命令|"npm" 不是内部或外部命令|npm['"]?\s*is not recognized|npm: command not found/i.test(message)) return "npmMissing";
|
|
2189
2306
|
if (/\[dsh-missing\]|不是内部或外部命令|is not recognized as an internal or external command|command not found|spawn dsh ENOENT/i.test(message)) return "dshMissing";
|
|
2190
|
-
if (/
|
|
2307
|
+
if (/ERR_PNPM_[A-Z0-9_]*DIFF\b|modules directory was created using a different/i.test(message)) return "pnpmModulesMismatch";
|
|
2308
|
+
if (/ERR_PNPM_UNEXPECTED_(VIRTUAL_)?STORE|ERR_PNPM_UNEXPECTED_PKG_CONTENT_IN_STORE|Unexpected (virtual )?store location/i.test(message)) return "pnpmStore";
|
|
2191
2309
|
if (/ERR_PNPM_ADDING_TO_ROOT|add the dependency to the workspace root/i.test(message)) return "pnpmWorkspace";
|
|
2192
2310
|
if (/(^|\n)untrusted origin\s*$/.test(message)) return "originRejected";
|
|
2193
2311
|
if (missingTarballIntegrity(message) || mismatchedTarballIntegrity(message) || /ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|ERR_PNPM_NO_MATURE_MATCHING_VERSION|Minimum release age|minimumReleaseAge|untrusted origin/i.test(message)) return "pnpmPolicy";
|
|
2194
2312
|
if (/ERR_PNPM_UNUSED_PATCH|patches were not used/i.test(message)) return "pnpmUnusedPatch";
|
|
2313
|
+
if (/ERR_PNPM_OUTDATED_LOCKFILE|ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND|ERR_PNPM_NO_PKG_MANIFEST|ERR_PNPM_BAD_PM_VERSION|ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY|ERR_PNPM_PATCH_NOT_APPLIED|ERR_PNPM_WORKSPACE_PKG_NOT_FOUND|ERR_PNPM_JSON_PARSE|ERR_PNPM_PKG_MANIFEST_IS_NOT_OBJECT|ERR_PNPM_MISSING_HOIST_PATTERN|Cannot install with "frozen-lockfile"/i.test(message)) return "profileState";
|
|
2195
2314
|
if (/os error 32|EBUSY|resource busy or locked|being used by another process/i.test(message)) return "fileLocked";
|
|
2196
2315
|
if (/os error 5\b|ERROR_ACCESS_DENIED|\bEPERM\b|\bEACCES\b|access is denied/i.test(message)) return "accessDenied";
|
|
2197
2316
|
if (/os error 112\b|os error 19\b|ERROR_DISK_FULL|ERROR_WRITE_PROTECT|\bENOSPC\b|\bEROFS\b|\bEMFILE\b|\bENFILE\b|no space left on device|read-only file system|too many open files/i.test(message)) return "fsUnavailable";
|
|
2198
2317
|
if (/ERR_PNPM_IGNORED_BUILDS|Ignored build scripts:|ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED/i.test(message)) return "pnpmIgnoredBuild";
|
|
2199
2318
|
if (/ERR_PNPM_FETCH_40[13]\b|\bE40[13]\b|(?:Unauthorized|Forbidden)\s*-\s*40[13]\b/i.test(message)) return "registryAuth";
|
|
2200
|
-
if (
|
|
2319
|
+
if (/ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND|Could not install from .+ as it does not exist|pnpm:\s*ENOENT: no such file or directory,\s*(?:lstat|scandir|readlink)/i.test(message)) return "pnpmLinkedDirMissing";
|
|
2320
|
+
if (/unable to verify the first certificate|SELF_SIGNED_CERT_IN_CHAIN|UNABLE_TO_VERIFY_LEAF_SIGNATURE|ERR_TLS_CERT_ALTNAME_INVALID|CERT_HAS_EXPIRED|certificate has expired|UNABLE_TO_GET_ISSUER_CERT|CERT_UNTRUSTED|ERR_TLS_CERT/i.test(message)) return "tlsTrust";
|
|
2321
|
+
if (/\[network\]|ERR_PNPM_GIT_FETCH_FAILED|ERR_PNPM_FETCH_5\d\d|ERR_PNPM_META_FETCH_FAIL|ERR_SOCKET_TIMEOUT|ETIMEDOUT|ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|EHOSTUNREACH|ENETUNREACH|UND_ERR_[A-Z0-9_]+|getaddrinfo|Could not connect|Could not resolve host|Network unreachable|Failed to connect|socket hang up|CERT_HAS_EXPIRED|SSL certificate problem|SSL routines|TLS handshake|SSL handshake|ERR_SSL_|ssl_error|fetch failed|failed to fetch|\bGET https?:\/\/\S+\.tgz\s+error \([A-Za-z0-9_]+\)/i.test(message)) return "network";
|
|
2201
2322
|
if (/\[request-timeout\]/i.test(message)) return "network";
|
|
2202
2323
|
if (/\[packaging\]|entry file missing/i.test(message)) return "pluginPrepare";
|
|
2203
2324
|
if (/\[registry-missing\]/i.test(message)) return "pluginMissingDep";
|
|
2204
2325
|
if (/ERR_PNPM_FETCH_404|404 Not Found|Not Found - 404/i.test(message)) return "pnpmMissingDep";
|
|
2205
2326
|
if (/\bERR_PNPM_NO_MATCHING_VERSION\b|\bETARGET\b|No matching version found/i.test(message)) return "registryVersionStale";
|
|
2206
|
-
if (/\bERR_PNPM_LINKED_PKG_DIR_NOT_FOUND\b|Could not install from .+ as it does not exist/i.test(message)) return "pnpmLinkedDirMissing";
|
|
2207
2327
|
if (/Unable to detect compiler type|gyp ERR!|Could not find any Visual Studio|No Xcode or CLT version detected|xcode-select|python(?:3)? is (?:not set|not found)|Could not find Python|\bmake: not found\b|\bgcc: not found\b|\bg\+\+: not found\b|\bMSB\d{4}\b/i.test(message)) return "buildToolchainMissing";
|
|
2208
2328
|
if (/ERR_PNPM_PREPARE_PACKAGE|ELIFECYCLE|prepare-guard/i.test(message) || /Command failed/.test(message)) return "pluginPrepare";
|
|
2209
2329
|
if (/plugin is not installed|plugin cannot be uninstalled here|already queued:|^already installed: \S+$/im.test(message)) return "hubState";
|
|
2210
2330
|
if (/^\[timed out\]$/m.test(message)) return "timeout";
|
|
2211
2331
|
if (/atomic-write: timed out waiting for the writer lock|timed out waiting for the writer lock/i.test(message)) return "profileLock";
|
|
2212
2332
|
if (/git-hosted plugins build on install via their prepare script|add the exact key pnpm printed above under allowBuilds/i.test(message)) return "pnpmIgnoredBuild";
|
|
2333
|
+
if (/cannot resolve profile bundle/i.test(message)) return "profileBundleMissing";
|
|
2213
2334
|
if (/\[host-spawn\]/i.test(message)) return "hostCliSpawn";
|
|
2335
|
+
if (/\[dsh-too-old\]/i.test(message)) return "dshTooOld";
|
|
2336
|
+
if (/spawn .+ ENOENT/i.test(message)) return "hub";
|
|
2337
|
+
if (LOCAL_ENV_RE.test(message)) return "localEnv";
|
|
2214
2338
|
return "hub";
|
|
2215
2339
|
}
|
|
2340
|
+
/** 「特征指向本机环境但说不清具体哪一类」的兜底判据:系统调用错误码(权限/路径过长/设备异常)、
|
|
2341
|
+
* 证书与代理校验失败、本地配置文件(~/.npmrc、profile 的 package.json)损坏。
|
|
2342
|
+
* 只做排除用:命中它表示「不是插件侧问题」,不代表我们已经定位到原因。 */
|
|
2343
|
+
const LOCAL_ENV_RE = /os error \d{1,3}\b|ERROR_[A-Z_]{4,}|\bE(?:ACCES|PERM|NOENT|NAMETOOLONG|INVAL|PROTO|ISDIR|NOTDIR|EXIST|BADF|NOTEMPTY|JSONPARSE|NOMEM)\b|JavaScript heap out of memory|Unexpected token .{0,60}in JSON|SELF_SIGNED_CERT_IN_CHAIN|UNABLE_TO_VERIFY_LEAF_SIGNATURE|ERR_TLS_CERT_ALTNAME_INVALID|unable to verify the first certificate|self[- ]signed certificate|ERR_INVALID_URL|invalid registry|proxy authentication|407 Proxy/i;
|
|
2216
2344
|
/** 从服务端 `[npm-too-low]` 标记行提取本机 npm 版本(如 `[npm-too-low] npm@11.3.0` → "11.3.0");
|
|
2217
2345
|
* 历史记录无标记时返回 null,前端据此决定提示文案是否带具体版本。 */
|
|
2218
2346
|
function npmTooLowVersion(message) {
|
|
@@ -2227,6 +2355,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2227
2355
|
* 无关 —— 抓核心错误时必须跳过,否则会被 CORE_LINE_RE 的 `missing` 分支误抓、淹没真正的
|
|
2228
2356
|
* 错误码(如 git 源的 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED),让 issue 正文只剩一堆 peer WARN。 */
|
|
2229
2357
|
const PEER_WARN_RE = /missing peer|issues with peer dependencies|peer dependencies that should be installed/i;
|
|
2358
|
+
/** 安装器自己打的诊断标记行:它们本身就是「为什么没有日志 / 卡在哪一步」的证据,
|
|
2359
|
+
* 不含 CORE_LINE_RE 的关键词,必须无条件保留 —— 否则上报正文会退回成只剩宿主那句摘要,
|
|
2360
|
+
* 我们又拿不到任何可排查的信息(#382/#393 就是这样)。 */
|
|
2361
|
+
const MARKER_LINE_RE = /^\[(?:pnpm log|no-output|desktop-cli-fallback|dsh-too-old|host-spawn|npm-too-low|git-missing|npm-missing|pnpm-missing|dsh-missing|network|packaging|registry-missing|registry-mirror-lag|registry-fallback|allow build|stale pipe|install-channel|internal|exit\b|timed out)/i;
|
|
2230
2362
|
/** 提交 issue 时正文里错误摘要的上限字符数。GitHub 请求行上限 8192 字节,
|
|
2231
2363
|
* 固定模板与 URL 编码开销约 1~2K,核心错误(以 ASCII 日志为主)可安全带到 ~5K;
|
|
2232
2364
|
* 仍超长时 pluginIssueUrl 会逐档缩小核心预算,最终 URL 不会超限。 */
|
|
@@ -2257,7 +2389,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2257
2389
|
const core = [];
|
|
2258
2390
|
for (const raw of message.split(/\r?\n/)) {
|
|
2259
2391
|
const line = raw.trim();
|
|
2260
|
-
if (!line || PEER_WARN_RE.test(line)
|
|
2392
|
+
if (!line || PEER_WARN_RE.test(line)) continue;
|
|
2393
|
+
if (!MARKER_LINE_RE.test(line) && !CORE_LINE_RE.test(line)) continue;
|
|
2261
2394
|
const short = line.length > MAX_LINE_CHARS ? `${line.slice(0, MAX_LINE_CHARS)}…` : line;
|
|
2262
2395
|
if (!seen.has(short)) {
|
|
2263
2396
|
seen.add(short);
|
|
@@ -2335,6 +2468,58 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2335
2468
|
return PUBLIC_REGISTRY_HOSTS.has(host) ? null : host;
|
|
2336
2469
|
}
|
|
2337
2470
|
/**
|
|
2471
|
+
* 「本地依赖目录不存在」失败里缺失的路径:
|
|
2472
|
+
* `pnpm: ENOENT: no such file or directory, lstat '<path>'`
|
|
2473
|
+
* 或 `Could not install from "<path>" as it does not exist`。取不到返回 null。
|
|
2474
|
+
*/
|
|
2475
|
+
function missingLocalDirOf(message) {
|
|
2476
|
+
const lstat = /ENOENT: no such file or directory,\s*(?:lstat|scandir|readlink)\s+'([^']+)'/i.exec(message);
|
|
2477
|
+
if (lstat !== null) return lstat[1];
|
|
2478
|
+
const quoted = /Could not install from\s+"([^"]+)"\s+as it does not exist/i.exec(message) ?? /Could not install from\s+'([^']+)'\s+as it does not exist/i.exec(message);
|
|
2479
|
+
return quoted === null ? null : quoted[1];
|
|
2480
|
+
}
|
|
2481
|
+
/**
|
|
2482
|
+
* 「profile 由桌面应用独占」错误里的 profile 名:
|
|
2483
|
+
* `error: profile "desktop" is managed exclusively by the Electron application`。
|
|
2484
|
+
* 取不到返回 null(提示文案退回通用说法)。
|
|
2485
|
+
*/
|
|
2486
|
+
function exclusiveProfileOf(message) {
|
|
2487
|
+
const m = /profile\s+"?([A-Za-z0-9_-]+)"?\s+is managed exclusively/i.exec(message);
|
|
2488
|
+
return m === null ? null : m[1];
|
|
2489
|
+
}
|
|
2490
|
+
/**
|
|
2491
|
+
* 日志里有安装器的 `[desktop-cli-fallback]` 标记:没找到桌面应用内置的 CLI 引导脚本,
|
|
2492
|
+
* 退回 PATH 上的 dsh 才被「profile 独占」拒绝 —— 是我们的路径推导问题,不是用户环境问题。
|
|
2493
|
+
*/
|
|
2494
|
+
function desktopCliFallbackOf(message) {
|
|
2495
|
+
return /\[desktop-cli-fallback\]/i.test(message);
|
|
2496
|
+
}
|
|
2497
|
+
/** `[dsh-too-old]` 标记里的三方信息(包名 / 插件要求的 DSH 下限 / 当前宿主版本);取不到返回 null。 */
|
|
2498
|
+
function dshTooOldInfoOf(message) {
|
|
2499
|
+
const m = /\[dsh-too-old\]\s*(\S+)\s+requires DSH >= (\S+).*?runs (\S+)/i.exec(message);
|
|
2500
|
+
return m === null ? null : {
|
|
2501
|
+
pkg: m[1],
|
|
2502
|
+
floor: m[2],
|
|
2503
|
+
current: m[3]
|
|
2504
|
+
};
|
|
2505
|
+
}
|
|
2506
|
+
/**
|
|
2507
|
+
* `cannot resolve profile bundle "<pkg>" from the dsh installation or <profileDir>` 里的
|
|
2508
|
+
* 缺失包名与 profile 目录;只取到包名也算成功(profile 目录可能被换行截断)。
|
|
2509
|
+
*/
|
|
2510
|
+
function unresolvedBundleOf(message) {
|
|
2511
|
+
const m = /cannot resolve profile bundle\s+"([^"]+)"\s+from the dsh installation or\s+(.+?)\s*(?:;|$)/im.exec(message);
|
|
2512
|
+
if (m !== null) return {
|
|
2513
|
+
pkg: m[1],
|
|
2514
|
+
profileDir: m[2].trim()
|
|
2515
|
+
};
|
|
2516
|
+
const only = /cannot resolve profile bundle\s+"([^"]+)"/i.exec(message);
|
|
2517
|
+
return only === null ? null : {
|
|
2518
|
+
pkg: only[1],
|
|
2519
|
+
profileDir: ""
|
|
2520
|
+
};
|
|
2521
|
+
}
|
|
2522
|
+
/**
|
|
2338
2523
|
* 鉴权失败(401/403)时被拒绝的源主机名:从 `ERR_PNPM_FETCH_401 GET https://host/pkg: Unauthorized - 401`
|
|
2339
2524
|
* 里取,取不到返回 null(提示文案退回通用说法,不拼出残缺句子)。
|
|
2340
2525
|
*/
|
|
@@ -2374,9 +2559,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2374
2559
|
const word = actionWordEn(action);
|
|
2375
2560
|
switch (kind) {
|
|
2376
2561
|
case "npmTooOld": return `npm too old for this ${word}`;
|
|
2562
|
+
case "nodeEngine": return `Node / pnpm on the user machine is below the version this ${word} requires`;
|
|
2563
|
+
case "profileState": return `the user profile's pnpm metadata does not match the local pnpm for this ${word}`;
|
|
2377
2564
|
case "dshMissing": return "dsh command not found on the user machine";
|
|
2378
2565
|
case "pnpmMissing": return "pnpm command not found on the user machine";
|
|
2379
2566
|
case "pnpmStore": return "pnpm store version mismatch on the user machine";
|
|
2567
|
+
case "pnpmModulesMismatch": return "the profile modules directory was built with a different pnpm config on the user machine";
|
|
2380
2568
|
case "pnpmWorkspace": return `pnpm workspace-root check blocked the ${word} on the user machine`;
|
|
2381
2569
|
case "originRejected": return "request origin rejected by the local service on the user machine";
|
|
2382
2570
|
case "pnpmPolicy": return `pnpm supply-chain policy blocked the ${word} on the user machine`;
|
|
@@ -2384,6 +2572,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2384
2572
|
case "pnpmMissingDep": return "dependency not found on the npm registry on the user machine";
|
|
2385
2573
|
case "registryVersionStale": return `requested version not available on the npm registry in use on the user machine`;
|
|
2386
2574
|
case "registryAuth": return `npm registry rejected the credentials for this ${word} on the user machine`;
|
|
2575
|
+
case "profileExclusive": return `the desktop profile is managed only by the Electron app, so the CLI refused the ${word}`;
|
|
2387
2576
|
case "pnpmLinkedDirMissing": return "dangling local (link:) dependency in the user profile";
|
|
2388
2577
|
case "fileLocked": return "file locked by another process on the user machine";
|
|
2389
2578
|
case "accessDenied": return "file write access denied on the user machine";
|
|
@@ -2392,11 +2581,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2392
2581
|
case "pluginPrepare": return "plugin distribution incomplete";
|
|
2393
2582
|
case "hostIncompatible": return "plugin does not support the DSH version in use";
|
|
2394
2583
|
case "network": return "network failure on the user side";
|
|
2584
|
+
case "tlsTrust": return `TLS certificate verification failed on the user machine during the ${word}`;
|
|
2395
2585
|
case "hostCliSpawn": return "the DSH host could not be launched on the user machine";
|
|
2396
2586
|
case "hubState": return `stale ${word} state in the plugin hub`;
|
|
2587
|
+
case "profileBundleMissing": return "the DSH profile is missing a bundle it declares";
|
|
2397
2588
|
case "timeout": return `${word} timed out`;
|
|
2398
2589
|
case "profileLock": return "DSH profile is locked by another process";
|
|
2399
2590
|
case "pluginMissingDep": return "a dependency of the plugin is not published on npm";
|
|
2591
|
+
case "dshTooOld": return "the plugin requires a newer DSH than the host runs";
|
|
2592
|
+
case "localEnv": return `no plugin-side cause found — the failure points at the local environment for this ${word}`;
|
|
2400
2593
|
case "hub": return `${word} failed (cause unclassified)`;
|
|
2401
2594
|
default: return `plugin ${word} failed`;
|
|
2402
2595
|
}
|
|
@@ -2415,7 +2608,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2415
2608
|
const executed = executedCommandOf(command, attempts);
|
|
2416
2609
|
const zhWord = actionWordZh(action);
|
|
2417
2610
|
const title = `[dsh-plugin.org | dsh-plugin-hub] ${reasonTitleOf(kind, action)}: ${repo}`;
|
|
2418
|
-
const reason = kind === "hostIncompatible" ? "the plugin declares a dsh compatibility range that does not include the runtime in use, so the host rejects it before installing anything; please extend the supported dsh versions or publish a compatible release" : /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — a file the package needs (its entry from main / exports, an entry a bundled patch mounts, or the patch declared by dsh.bundle.patch) is missing from the published npm package; please publish a complete package" : /\[registry-missing\]/i.test(message) ? "a dependency declared by the plugin is not published on the public npm registry (missing, removed, or never released); please publish or correct that dependency, or ship it with the plugin" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : kind === "registryAuth" ? "the npm registry rejected the request with 401/403 — the configured registry needs credentials or blocks this network (local environment issue)" : kind === "pluginPrepare" ? "plugin prepare/build script failed during install (packaging/distribution issue)" : kind === "pnpmIgnoredBuild" ? "plugin depends on a native module whose build script pnpm blocks by default (use a prebuilt variant)" : kind === "originRejected" ? "the request never reached the install flow — the local service rejected its origin (local environment issue)" : kind === "pnpmPolicy" ? pnpmPolicyHintOf(message) === "failPnpmTarballIntegrityHint" ? "pnpm rejected a lockfile entry without tarball integrity; inspect and back up the profile lockfile before resolving it again, keeping integrity checks enabled" : "the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)" : kind === "pnpmUnusedPatch" ? "the profile keeps a pnpm patch entry for an older dsh-plugin version, so pnpm aborted the install (local config issue)" : kind === "fileLocked" ? "a file in the profile is locked by another process on the user machine (local environment issue)" : kind === "accessDenied" ? "the system denied write access to a file in the profile on the user machine (local environment issue)" : kind === "fsUnavailable" ? "the local file system could not accept the write — no space left, read-only volume, or too many open file handles on the user machine (local environment issue)" : "plugin-side install failure";
|
|
2611
|
+
const reason = kind === "hostIncompatible" ? "the plugin declares a dsh compatibility range that does not include the runtime in use, so the host rejects it before installing anything; please extend the supported dsh versions or publish a compatible release" : /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — a file the package needs (its entry from main / exports, an entry a bundled patch mounts, or the patch declared by dsh.bundle.patch) is missing from the published npm package; please publish a complete package" : /\[registry-missing\]/i.test(message) ? "a dependency declared by the plugin is not published on the public npm registry (missing, removed, or never released); please publish or correct that dependency, or ship it with the plugin" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : kind === "tlsTrust" ? "the local certificate chain is not trusted by Node/pnpm (corporate SSL inspection, antivirus web shield, or a local MITM proxy) — local environment issue" : kind === "localEnv" ? "no evidence of a plugin-side cause; the log shows local-environment signals (system error codes, certificates/proxy, or a broken local config), so this is reported for triage of the classifier only" : kind === "dshTooOld" ? "the plugin declares a minimum DSH version this host does not meet — upgrade DSH first (local environment issue)" : kind === "pnpmModulesMismatch" ? "the profile node_modules was created with a different pnpm config (hoisting / virtual store settings), so pnpm refuses to reuse it (local environment issue)" : kind === "profileBundleMissing" ? "the profile declares a bundle that is not installed in it (interrupted install or incomplete app update), so the host aborts before installing anything (local environment issue)" : kind === "registryAuth" ? "the npm registry rejected the request with 401/403 — the configured registry needs credentials or blocks this network (local environment issue)" : kind === "profileExclusive" ? "the desktop profile can only be managed by the Electron app, and the install was attempted from an external CLI (local environment issue)" : kind === "pluginPrepare" ? "plugin prepare/build script failed during install (packaging/distribution issue)" : kind === "pnpmIgnoredBuild" ? "plugin depends on a native module whose build script pnpm blocks by default (use a prebuilt variant)" : kind === "originRejected" ? "the request never reached the install flow — the local service rejected its origin (local environment issue)" : kind === "pnpmPolicy" ? pnpmPolicyHintOf(message) === "failPnpmTarballIntegrityHint" ? "pnpm rejected a lockfile entry without tarball integrity; inspect and back up the profile lockfile before resolving it again, keeping integrity checks enabled" : "the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)" : kind === "pnpmUnusedPatch" ? "the profile keeps a pnpm patch entry for an older dsh-plugin version, so pnpm aborted the install (local config issue)" : kind === "fileLocked" ? "a file in the profile is locked by another process on the user machine (local environment issue)" : kind === "accessDenied" ? "the system denied write access to a file in the profile on the user machine (local environment issue)" : kind === "fsUnavailable" ? "the local file system could not accept the write — no space left, read-only volume, or too many open file handles on the user machine (local environment issue)" : "plugin-side install failure";
|
|
2419
2612
|
const code = coreErrorCode(message);
|
|
2420
2613
|
const build = (coreChars) => {
|
|
2421
2614
|
const body = [
|
|
@@ -2450,7 +2643,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2450
2643
|
`- OS: ${env.platform} ${env.arch} (${env.release})`,
|
|
2451
2644
|
`- Profile: \`${env.profile}\``,
|
|
2452
2645
|
`- DSH Home: \`${env.dshHome}\``,
|
|
2453
|
-
|
|
2646
|
+
"- Full log: open the Hub notifications, select the failed record and press \"Copy\""
|
|
2454
2647
|
] : [],
|
|
2455
2648
|
`- Catalog: [${pluginSiteUrl(repo)}](${pluginSiteUrl(repo)})`,
|
|
2456
2649
|
"",
|
|
@@ -2516,7 +2709,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2516
2709
|
`- OS: ${env.platform} ${env.arch} (${env.release})`,
|
|
2517
2710
|
`- Profile: \`${env.profile}\``,
|
|
2518
2711
|
`- DSH Home: \`${env.dshHome}\``,
|
|
2519
|
-
|
|
2712
|
+
"- Full log: open the Hub notifications, select the failed record and press \"Copy\""
|
|
2520
2713
|
] : [],
|
|
2521
2714
|
...repo !== "unknown" ? [`- Catalog: [${pluginSiteUrl(repo)}](${pluginSiteUrl(repo)})`] : [],
|
|
2522
2715
|
"",
|
|
@@ -2748,34 +2941,51 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2748
2941
|
pendingRef.current = next;
|
|
2749
2942
|
setPendingRestarts(next);
|
|
2750
2943
|
};
|
|
2751
|
-
/** 向宿主记录某插件的安装时目录信号(version + updatedAt
|
|
2944
|
+
/** 向宿主记录某插件的安装时目录信号(version + updatedAt)。
|
|
2945
|
+
* 版本未知时**不写**:服务端把空版本当作「卸载清理」会删掉整条记录(连 npm 包名映射一起),
|
|
2946
|
+
* 刷新页面后任务丢了快照就会走到这条路径 —— 宁可保留旧记录,也不能把账本清空。 */
|
|
2752
2947
|
const syncInstalledVersion = async (repo, version, updatedAt) => {
|
|
2753
|
-
if (!repo) return;
|
|
2948
|
+
if (!repo || version === void 0 || version === "") return;
|
|
2754
2949
|
try {
|
|
2755
2950
|
await fetch("/dsh-plugin-hub/installed-version", {
|
|
2756
2951
|
method: "POST",
|
|
2757
2952
|
headers: { "content-type": "application/json" },
|
|
2758
2953
|
body: JSON.stringify({
|
|
2759
2954
|
repo,
|
|
2760
|
-
version
|
|
2955
|
+
version,
|
|
2761
2956
|
updatedAt
|
|
2762
2957
|
})
|
|
2763
2958
|
});
|
|
2764
2959
|
} catch {}
|
|
2765
2960
|
};
|
|
2961
|
+
/** 清除某仓库的版本记录(卸载成功后调用):空版本是服务端的「删除记录」语义,只在这里显式发送。 */
|
|
2962
|
+
const clearInstalledVersion = async (repo) => {
|
|
2963
|
+
if (!repo) return;
|
|
2964
|
+
try {
|
|
2965
|
+
await fetch("/dsh-plugin-hub/installed-version", {
|
|
2966
|
+
method: "POST",
|
|
2967
|
+
headers: { "content-type": "application/json" },
|
|
2968
|
+
body: JSON.stringify({
|
|
2969
|
+
repo,
|
|
2970
|
+
version: null
|
|
2971
|
+
})
|
|
2972
|
+
});
|
|
2973
|
+
} catch {}
|
|
2974
|
+
};
|
|
2766
2975
|
/** 后台任务结束(active 中消失后查终态确认):完成 → 刷新安装表 + 结果视图/toast;失败 → 完整错误弹窗 */
|
|
2767
2976
|
const finishQueueTask = (ok, q, lines) => {
|
|
2768
2977
|
applyQueue((prev) => prev.filter((x) => x.id !== q.id));
|
|
2769
2978
|
if (ok) {
|
|
2770
2979
|
refreshInstalled();
|
|
2771
2980
|
if (q.kind === "uninstall") {
|
|
2772
|
-
|
|
2981
|
+
clearInstalledVersion(q.repo);
|
|
2773
2982
|
onUninstallDone(modalTaskRef.current === q.id, q.repo, q.needsRestart, q.needsReload ?? false);
|
|
2774
2983
|
} else {
|
|
2775
|
-
|
|
2984
|
+
const recordedVersion = q.installedVersion ?? q.version;
|
|
2985
|
+
syncInstalledVersion(q.repo, recordedVersion, q.updatedAt);
|
|
2776
2986
|
pendingInfoRef.current.set(q.target, {
|
|
2777
2987
|
desc: q.desc,
|
|
2778
|
-
version:
|
|
2988
|
+
version: recordedVersion
|
|
2779
2989
|
});
|
|
2780
2990
|
onInstallDone(modalTaskRef.current === q.id, q.repo, q.needsRestart, q.action === "update", q.needsReload ?? false, q.bundleDeselected === true);
|
|
2781
2991
|
}
|
|
@@ -2819,6 +3029,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2819
3029
|
let lines = [];
|
|
2820
3030
|
let attempts;
|
|
2821
3031
|
let bundleDeselected;
|
|
3032
|
+
let installedVersion;
|
|
2822
3033
|
try {
|
|
2823
3034
|
const res = await fetch(`/dsh-plugin-hub/status?task=${q.id}`, { cache: "no-store" });
|
|
2824
3035
|
if (res.ok) {
|
|
@@ -2828,6 +3039,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2828
3039
|
lines = task.lines ?? [];
|
|
2829
3040
|
attempts = Array.isArray(task.attempts) ? task.attempts : void 0;
|
|
2830
3041
|
bundleDeselected = task.bundleDeselected === true ? true : void 0;
|
|
3042
|
+
installedVersion = typeof task.installedVersion === "string" && task.installedVersion !== "" ? task.installedVersion : void 0;
|
|
2831
3043
|
const needsRestart = typeof task.needsRestart === "boolean" ? task.needsRestart : q.needsRestart;
|
|
2832
3044
|
const needsReload = typeof task.needsReload === "boolean" ? task.needsReload : q.needsReload ?? false;
|
|
2833
3045
|
if (status === "done") {
|
|
@@ -2835,7 +3047,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
2835
3047
|
...q,
|
|
2836
3048
|
needsRestart,
|
|
2837
3049
|
needsReload,
|
|
2838
|
-
bundleDeselected: bundleDeselected === true ? true : q.bundleDeselected
|
|
3050
|
+
bundleDeselected: bundleDeselected === true ? true : q.bundleDeselected,
|
|
3051
|
+
installedVersion
|
|
2839
3052
|
};
|
|
2840
3053
|
if (q.kind === "uninstall") settleDone(settled, lines);
|
|
2841
3054
|
else finishQueueTask(true, settled, lines);
|
|
@@ -3866,7 +4079,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
3866
4079
|
})() : null, (0, react.createElement)("button", {
|
|
3867
4080
|
className: Modal_module_css_default.errorCopySoft,
|
|
3868
4081
|
onClick: () => onCopy(copyText)
|
|
3869
|
-
}, t("errorCopy"))), (0, react.createElement)("pre", { className: Modal_module_css_default.errorBox }, displayMessage), (0, react.createElement)("div", { className: Modal_module_css_default.failKindTitle }, t(`failKind_${failureKind}`, failureKind === "hostIncompatible" ? { version: /incompatible with dsh\s+([^\s:;,]+)/i.exec(message)?.[1] ?? "" } : void 0)), failureKind === "hostIncompatible" ? null : (0, react.createElement)("div", { className: Modal_module_css_default.failReason }, t(`failReason_${failureKind}`)), failureKind === "npmTooOld" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(npmVersion ? "failNpmTooLowV" : "failNpmTooLow", npmVersion ? { v: npmVersion } : void 0)) : failureKind === "dshMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshMissingHint")) : failureKind === "gitMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failGitMissingHint")) : failureKind === "pnpmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingHint")) : failureKind === "npmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNpmMissingHint")) : failureKind === "buildToolchainMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failBuildToolchainHint")) : failureKind === "pnpmWorkspace" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmWorkspaceHint")) : failureKind === "pnpmStore" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint")) : failureKind === "pnpmPolicy" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(pnpmPolicyHintOf(message), pnpmPolicyHintParams(message))) : failureKind === "pnpmUnusedPatch" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmUnusedPatchHint")) : failureKind === "pnpmMissingDep" ? (0, react.createElement)("div", null, [(() => {
|
|
4082
|
+
}, t("errorCopy"))), (0, react.createElement)("pre", { className: Modal_module_css_default.errorBox }, displayMessage), (0, react.createElement)("div", { className: Modal_module_css_default.failKindTitle }, t(`failKind_${failureKind}`, failureKind === "hostIncompatible" ? { version: /incompatible with dsh\s+([^\s:;,]+)/i.exec(message)?.[1] ?? "" } : void 0)), failureKind === "hostIncompatible" ? null : (0, react.createElement)("div", { className: Modal_module_css_default.failReason }, t(`failReason_${failureKind}`)), failureKind === "npmTooOld" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(npmVersion ? "failNpmTooLowV" : "failNpmTooLow", npmVersion ? { v: npmVersion } : void 0)) : failureKind === "dshMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshMissingHint")) : failureKind === "gitMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failGitMissingHint")) : failureKind === "pnpmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingHint")) : failureKind === "npmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNpmMissingHint")) : failureKind === "buildToolchainMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failBuildToolchainHint")) : failureKind === "pnpmWorkspace" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmWorkspaceHint")) : failureKind === "pnpmModulesMismatch" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmModulesMismatchHint")) : failureKind === "pnpmStore" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint")) : failureKind === "pnpmPolicy" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(pnpmPolicyHintOf(message), pnpmPolicyHintParams(message))) : failureKind === "pnpmUnusedPatch" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmUnusedPatchHint")) : failureKind === "profileState" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileStateHint")) : failureKind === "nodeEngine" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNodeEngineHint")) : failureKind === "pnpmMissingDep" ? (0, react.createElement)("div", null, [(() => {
|
|
3870
4083
|
const pkg = missingRegistryPackageOf(message);
|
|
3871
4084
|
return pkg ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failPnpmMissingDepTarget", { pkg })) : null;
|
|
3872
4085
|
})(), (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(registryMissingHintOf(message)))]) : failureKind === "pluginMissingDep" ? (0, react.createElement)("div", null, [
|
|
@@ -3891,10 +4104,50 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
3891
4104
|
target: "_blank",
|
|
3892
4105
|
rel: "noopener noreferrer",
|
|
3893
4106
|
title: t("failIssueHint")
|
|
3894
|
-
}, t("failIssueBig")) : null]) : failureKind === "registryVersionStale" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failRegistryVersionStaleHint")) : failureKind === "pnpmLinkedDirMissing" ? (0, react.createElement)("div",
|
|
4107
|
+
}, t("failIssueBig")) : null]) : failureKind === "registryVersionStale" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failRegistryVersionStaleHint")) : failureKind === "pnpmLinkedDirMissing" ? (0, react.createElement)("div", null, [(() => {
|
|
4108
|
+
const dir = missingLocalDirOf(message);
|
|
4109
|
+
return dir ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failLinkedDirTarget", { path: dir })) : null;
|
|
4110
|
+
})(), (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmLinkedDirMissingHint"))]) : failureKind === "fileLocked" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFileLockedHint")) : failureKind === "accessDenied" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failAccessDeniedHint")) : failureKind === "fsUnavailable" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFsUnavailableHint")) : failureKind === "originRejected" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failOriginRejectedHint", { profile: env?.profile ?? "<profile>" })) : failureKind === "profileExclusive" ? (() => {
|
|
4111
|
+
const profile = exclusiveProfileOf(message);
|
|
4112
|
+
const ourBug = desktopCliFallbackOf(message);
|
|
4113
|
+
return (0, react.createElement)("div", null, [
|
|
4114
|
+
(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(profile ? "failProfileExclusiveHint" : "failProfileExclusiveHintNoProfile", profile ? { profile } : void 0)),
|
|
4115
|
+
ourBug ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDesktopCliFallbackHint")) : null,
|
|
4116
|
+
ourBug ? (0, react.createElement)("a", {
|
|
4117
|
+
className: Modal_module_css_default.failBigIssue,
|
|
4118
|
+
href: hubIssueUrl(repo, message, env, command, attempts, "triage", action),
|
|
4119
|
+
target: "_blank",
|
|
4120
|
+
rel: "noopener noreferrer",
|
|
4121
|
+
title: t("failHubIssueHint")
|
|
4122
|
+
}, t("failIssueBig")) : null
|
|
4123
|
+
]);
|
|
4124
|
+
})() : failureKind === "registryAuth" ? (() => {
|
|
3895
4125
|
const host = authRegistryHostOf(message);
|
|
3896
4126
|
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(host ? "failRegistryAuthHint" : "failRegistryAuthHintNoHost", host ? { host } : void 0));
|
|
3897
|
-
})() : failureKind === "
|
|
4127
|
+
})() : failureKind === "dshTooOld" ? (() => {
|
|
4128
|
+
const info = dshTooOldInfoOf(message);
|
|
4129
|
+
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshTooOldHint", info ?? {
|
|
4130
|
+
pkg: repo ?? "plugin",
|
|
4131
|
+
floor: "?",
|
|
4132
|
+
current: "?"
|
|
4133
|
+
}));
|
|
4134
|
+
})() : failureKind === "localEnv" ? (0, react.createElement)("div", null, [
|
|
4135
|
+
(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failLocalEnvHint")),
|
|
4136
|
+
onRunDiagnostics ? (0, react.createElement)("button", {
|
|
4137
|
+
className: Modal_module_css_default.failDiagBtn,
|
|
4138
|
+
onClick: onRunDiagnostics
|
|
4139
|
+
}, t("failNetworkRunDiag")) : null,
|
|
4140
|
+
(0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failMisjudgeHint")), (0, react.createElement)("a", {
|
|
4141
|
+
className: Modal_module_css_default.failMisjudgeLink,
|
|
4142
|
+
href: hubIssueUrl(repo, message, env, command, attempts, "triage", action),
|
|
4143
|
+
target: "_blank",
|
|
4144
|
+
rel: "noopener noreferrer",
|
|
4145
|
+
title: t("failHubIssueHint")
|
|
4146
|
+
}, t("failMisjudgeLink"))])
|
|
4147
|
+
]) : failureKind === "tlsTrust" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failTlsTrustHint")), onRunDiagnostics ? (0, react.createElement)("button", {
|
|
4148
|
+
className: Modal_module_css_default.failDiagBtn,
|
|
4149
|
+
onClick: onRunDiagnostics
|
|
4150
|
+
}, t("failNetworkRunDiag")) : null]) : failureKind === "network" ? (0, react.createElement)("div", null, [
|
|
3898
4151
|
(() => {
|
|
3899
4152
|
const target = unreachableTargetOf(message);
|
|
3900
4153
|
return target ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failNetworkTarget", { url: target })) : null;
|
|
@@ -3924,7 +4177,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
3924
4177
|
rel: "noopener noreferrer",
|
|
3925
4178
|
title: t("failHubIssueHint")
|
|
3926
4179
|
}, t("failMisjudgeLink"))]) : null
|
|
3927
|
-
]) : failureKind === "
|
|
4180
|
+
]) : failureKind === "profileBundleMissing" ? (() => {
|
|
4181
|
+
const info = unresolvedBundleOf(message);
|
|
4182
|
+
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileBundleMissingHint", {
|
|
4183
|
+
pkg: info?.pkg ?? "unknown",
|
|
4184
|
+
profile: env?.profile ?? "<profile>"
|
|
4185
|
+
}));
|
|
4186
|
+
})() : failureKind === "hubState" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failHubStateHint", { action: actionWord }))]) : failureKind === "timeout" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failTimeoutHint"))]) : failureKind === "profileLock" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileLockHint", { action: actionWord }))]) : failureKind === "hostCliSpawn" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failHostCliSpawnHint"))]) : failureKind === "pnpmIgnoredBuild" ? (0, react.createElement)("div", null, [
|
|
3928
4187
|
(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failIgnoredBuild")),
|
|
3929
4188
|
repo ? (0, react.createElement)("a", {
|
|
3930
4189
|
className: Modal_module_css_default.failBigIssue,
|
|
@@ -4487,9 +4746,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4487
4746
|
if (kind === "npmMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNpmMissingHint"));
|
|
4488
4747
|
if (kind === "buildToolchainMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failBuildToolchainHint"));
|
|
4489
4748
|
if (kind === "pnpmWorkspace") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmWorkspaceHint"));
|
|
4749
|
+
if (kind === "pnpmModulesMismatch") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmModulesMismatchHint"));
|
|
4490
4750
|
if (kind === "pnpmStore") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint"));
|
|
4491
4751
|
if (kind === "pnpmPolicy") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(pnpmPolicyHintOf(r.message), pnpmPolicyHintParams(r.message)));
|
|
4492
4752
|
if (kind === "pnpmUnusedPatch") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmUnusedPatchHint"));
|
|
4753
|
+
if (kind === "profileState") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileStateHint"));
|
|
4754
|
+
if (kind === "nodeEngine") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNodeEngineHint"));
|
|
4493
4755
|
if (kind === "pnpmMissingDep") {
|
|
4494
4756
|
const pkg = missingRegistryPackageOf(r.message);
|
|
4495
4757
|
return (0, react.createElement)("div", null, [pkg ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failPnpmMissingDepTarget", { pkg })) : null, (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(registryMissingHintOf(r.message)))]);
|
|
@@ -4523,15 +4785,59 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4523
4785
|
]);
|
|
4524
4786
|
}
|
|
4525
4787
|
if (kind === "registryVersionStale") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failRegistryVersionStaleHint"));
|
|
4526
|
-
if (kind === "pnpmLinkedDirMissing")
|
|
4788
|
+
if (kind === "pnpmLinkedDirMissing") {
|
|
4789
|
+
const dir = missingLocalDirOf(r.message);
|
|
4790
|
+
return (0, react.createElement)("div", null, [dir ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failLinkedDirTarget", { path: dir })) : null, (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmLinkedDirMissingHint"))]);
|
|
4791
|
+
}
|
|
4527
4792
|
if (kind === "fileLocked") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFileLockedHint"));
|
|
4528
4793
|
if (kind === "accessDenied") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failAccessDeniedHint"));
|
|
4529
4794
|
if (kind === "fsUnavailable") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFsUnavailableHint"));
|
|
4530
4795
|
if (kind === "originRejected") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failOriginRejectedHint", { profile: env?.profile ?? "<profile>" }));
|
|
4796
|
+
if (kind === "profileExclusive") {
|
|
4797
|
+
const profile = exclusiveProfileOf(r.message);
|
|
4798
|
+
const ourBug = desktopCliFallbackOf(r.message);
|
|
4799
|
+
return (0, react.createElement)("div", null, [
|
|
4800
|
+
(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(profile ? "failProfileExclusiveHint" : "failProfileExclusiveHintNoProfile", profile ? { profile } : void 0)),
|
|
4801
|
+
ourBug ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDesktopCliFallbackHint")) : null,
|
|
4802
|
+
ourBug ? (0, react.createElement)("a", {
|
|
4803
|
+
className: Modal_module_css_default.failBigIssue,
|
|
4804
|
+
href: hubIssueUrl(shownRepo || r.repo, r.message, env, r.command, r.attempts, "triage", action),
|
|
4805
|
+
target: "_blank",
|
|
4806
|
+
rel: "noopener noreferrer",
|
|
4807
|
+
title: t("failHubIssueHint")
|
|
4808
|
+
}, t("failIssueBig")) : null
|
|
4809
|
+
]);
|
|
4810
|
+
}
|
|
4531
4811
|
if (kind === "registryAuth") {
|
|
4532
4812
|
const host = authRegistryHostOf(r.message);
|
|
4533
4813
|
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(host ? "failRegistryAuthHint" : "failRegistryAuthHintNoHost", host ? { host } : void 0));
|
|
4534
4814
|
}
|
|
4815
|
+
if (kind === "dshTooOld") {
|
|
4816
|
+
const info = dshTooOldInfoOf(r.message);
|
|
4817
|
+
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshTooOldHint", info ?? {
|
|
4818
|
+
pkg: shownRepo || r.repo || "plugin",
|
|
4819
|
+
floor: "?",
|
|
4820
|
+
current: "?"
|
|
4821
|
+
}));
|
|
4822
|
+
}
|
|
4823
|
+
if (kind === "localEnv") return (0, react.createElement)("div", null, [
|
|
4824
|
+
(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failLocalEnvHint")),
|
|
4825
|
+
onRunDiagnostics ? (0, react.createElement)("button", {
|
|
4826
|
+
className: Modal_module_css_default.failDiagBtn,
|
|
4827
|
+
onClick: onRunDiagnostics
|
|
4828
|
+
}, t("failNetworkRunDiag")) : null,
|
|
4829
|
+
(0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failMisjudgeHint")), (0, react.createElement)("a", {
|
|
4830
|
+
className: Modal_module_css_default.failMisjudgeLink,
|
|
4831
|
+
href: hubIssueUrl(shownRepo || r.repo, r.message, env, r.command, r.attempts, "triage", action),
|
|
4832
|
+
target: "_blank",
|
|
4833
|
+
rel: "noopener noreferrer",
|
|
4834
|
+
title: t("failHubIssueHint")
|
|
4835
|
+
}, t("failMisjudgeLink"))])
|
|
4836
|
+
]);
|
|
4837
|
+
if (kind === "tlsTrust") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failTlsTrustHint")), onRunDiagnostics ? (0, react.createElement)("button", {
|
|
4838
|
+
className: Modal_module_css_default.failDiagBtn,
|
|
4839
|
+
onClick: onRunDiagnostics
|
|
4840
|
+
}, t("failNetworkRunDiag")) : null]);
|
|
4535
4841
|
if (kind === "network") return (0, react.createElement)("div", null, [
|
|
4536
4842
|
(() => {
|
|
4537
4843
|
const target = unreachableTargetOf(r.message);
|
|
@@ -4564,6 +4870,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4564
4870
|
title: t("failHubIssueHint")
|
|
4565
4871
|
}, t("failMisjudgeLink"))]) : null
|
|
4566
4872
|
]);
|
|
4873
|
+
if (kind === "profileBundleMissing") {
|
|
4874
|
+
const info = unresolvedBundleOf(r.message);
|
|
4875
|
+
return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileBundleMissingHint", {
|
|
4876
|
+
pkg: info?.pkg ?? "unknown",
|
|
4877
|
+
profile: env?.profile ?? "<profile>"
|
|
4878
|
+
}));
|
|
4879
|
+
}
|
|
4567
4880
|
if (kind === "hubState") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failHubStateHint", { action: actionWord }))]);
|
|
4568
4881
|
if (kind === "timeout") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failTimeoutHint"))]);
|
|
4569
4882
|
if (kind === "profileLock") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failProfileLockHint", { action: actionWord }))]);
|
|
@@ -4769,40 +5082,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4769
5082
|
css: css$9
|
|
4770
5083
|
});
|
|
4771
5084
|
var List_module_css_default = {
|
|
4772
|
-
"
|
|
4773
|
-
"stateActions": "_3XaZHa_stateActions",
|
|
4774
|
-
"moreSentinel": "_3XaZHa_moreSentinel",
|
|
4775
|
-
"categoryBadge": "_3XaZHa_categoryBadge",
|
|
4776
|
-
"installBtnInstalled": "_3XaZHa_installBtnInstalled",
|
|
5085
|
+
"star": "_3XaZHa_star",
|
|
4777
5086
|
"updateBadge": "_3XaZHa_updateBadge",
|
|
4778
|
-
"
|
|
4779
|
-
"installBtnUpdate": "_3XaZHa_installBtnUpdate",
|
|
4780
|
-
"retryBtn": "_3XaZHa_retryBtn",
|
|
4781
|
-
"footer": "_3XaZHa_footer",
|
|
4782
|
-
"stateTitle": "_3XaZHa_stateTitle",
|
|
4783
|
-
"cardTitle": "_3XaZHa_cardTitle",
|
|
4784
|
-
"list": "_3XaZHa_list",
|
|
4785
|
-
"uninstallBtn": "_3XaZHa_uninstallBtn",
|
|
4786
|
-
"actions": "_3XaZHa_actions",
|
|
4787
|
-
"stateDesc": "_3XaZHa_stateDesc",
|
|
4788
|
-
"body": "_3XaZHa_body",
|
|
5087
|
+
"installBtn": "_3XaZHa_installBtn",
|
|
4789
5088
|
"cardMain": "_3XaZHa_cardMain",
|
|
4790
|
-
"installBtnCopied": "_3XaZHa_installBtnCopied",
|
|
4791
5089
|
"desc": "_3XaZHa_desc",
|
|
4792
|
-
"
|
|
5090
|
+
"retryBtn": "_3XaZHa_retryBtn",
|
|
4793
5091
|
"state": "_3XaZHa_state",
|
|
4794
|
-
"
|
|
4795
|
-
"
|
|
5092
|
+
"moreSentinel": "_3XaZHa_moreSentinel",
|
|
5093
|
+
"installBtnCopied": "_3XaZHa_installBtnCopied",
|
|
5094
|
+
"stateActions": "_3XaZHa_stateActions",
|
|
5095
|
+
"fork": "_3XaZHa_fork",
|
|
5096
|
+
"list": "_3XaZHa_list",
|
|
5097
|
+
"installBtnUpdate": "_3XaZHa_installBtnUpdate",
|
|
5098
|
+
"stateDesc": "_3XaZHa_stateDesc",
|
|
5099
|
+
"uninstallBtn": "_3XaZHa_uninstallBtn",
|
|
5100
|
+
"installBtnInstalled": "_3XaZHa_installBtnInstalled",
|
|
5101
|
+
"card": "_3XaZHa_card",
|
|
4796
5102
|
"stats": "_3XaZHa_stats",
|
|
5103
|
+
"versionBadge": "_3XaZHa_versionBadge",
|
|
4797
5104
|
"cardHead": "_3XaZHa_cardHead",
|
|
4798
|
-
"
|
|
4799
|
-
"
|
|
4800
|
-
"cardSide": "_3XaZHa_cardSide",
|
|
5105
|
+
"stateTitle": "_3XaZHa_stateTitle",
|
|
5106
|
+
"footLink": "_3XaZHa_footLink",
|
|
4801
5107
|
"topic": "_3XaZHa_topic",
|
|
4802
|
-
"star": "_3XaZHa_star",
|
|
4803
|
-
"installBtn": "_3XaZHa_installBtn",
|
|
4804
5108
|
"date": "_3XaZHa_date",
|
|
4805
|
-
"
|
|
5109
|
+
"detailBtn": "_3XaZHa_detailBtn",
|
|
5110
|
+
"verified": "_3XaZHa_verified",
|
|
5111
|
+
"cardSide": "_3XaZHa_cardSide",
|
|
5112
|
+
"footer": "_3XaZHa_footer",
|
|
5113
|
+
"actions": "_3XaZHa_actions",
|
|
5114
|
+
"categoryBadge": "_3XaZHa_categoryBadge",
|
|
5115
|
+
"diagBtn": "_3XaZHa_diagBtn",
|
|
5116
|
+
"body": "_3XaZHa_body",
|
|
5117
|
+
"cardTitle": "_3XaZHa_cardTitle",
|
|
5118
|
+
"topics": "_3XaZHa_topics"
|
|
4806
5119
|
};
|
|
4807
5120
|
//#endregion
|
|
4808
5121
|
//#region src/client/hooks/useIncrementalList.ts
|
|
@@ -5007,16 +5320,16 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5007
5320
|
css: css$8
|
|
5008
5321
|
});
|
|
5009
5322
|
var SectionTabs_module_css_default = {
|
|
5010
|
-
"
|
|
5011
|
-
"
|
|
5012
|
-
"tab": "_7tvizq_tab",
|
|
5323
|
+
"tabCountActive": "_7tvizq_tabCountActive",
|
|
5324
|
+
"tabActive": "_7tvizq_tabActive",
|
|
5013
5325
|
"tabLabel": "_7tvizq_tabLabel",
|
|
5326
|
+
"root": "_7tvizq_root",
|
|
5014
5327
|
"noticeBtn": "_7tvizq_noticeBtn",
|
|
5015
|
-
"
|
|
5328
|
+
"tabCount": "_7tvizq_tabCount",
|
|
5329
|
+
"tabIcon": "_7tvizq_tabIcon",
|
|
5016
5330
|
"noticeIcon": "_7tvizq_noticeIcon",
|
|
5017
|
-
"
|
|
5018
|
-
"
|
|
5019
|
-
"tabIcon": "_7tvizq_tabIcon"
|
|
5331
|
+
"tab": "_7tvizq_tab",
|
|
5332
|
+
"noticeCount": "_7tvizq_noticeCount"
|
|
5020
5333
|
};
|
|
5021
5334
|
//#endregion
|
|
5022
5335
|
//#region src/client/components/layout/SectionTabs.tsx
|
|
@@ -5092,42 +5405,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5092
5405
|
css: css$7
|
|
5093
5406
|
});
|
|
5094
5407
|
var InstalledView_module_css_default = {
|
|
5408
|
+
"updateBadge": "_1nXeGW_updateBadge",
|
|
5409
|
+
"segGroup": "_1nXeGW_segGroup",
|
|
5410
|
+
"list": "_1nXeGW_list",
|
|
5411
|
+
"exampleRow": "_1nXeGW_exampleRow",
|
|
5412
|
+
"statusInactive": "_1nXeGW_statusInactive",
|
|
5095
5413
|
"rowCategory": "_1nXeGW_rowCategory",
|
|
5096
|
-
"
|
|
5097
|
-
"empty": "_1nXeGW_empty",
|
|
5098
|
-
"rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
|
|
5099
|
-
"versionBadge": "_1nXeGW_versionBadge",
|
|
5100
|
-
"row": "_1nXeGW_row",
|
|
5414
|
+
"toolbar": "_1nXeGW_toolbar",
|
|
5101
5415
|
"rowTitle": "_1nXeGW_rowTitle",
|
|
5102
5416
|
"rowSourceTag": "_1nXeGW_rowSourceTag",
|
|
5103
|
-
"
|
|
5104
|
-
"
|
|
5105
|
-
"
|
|
5417
|
+
"rowActions": "_1nXeGW_rowActions",
|
|
5418
|
+
"rowRepo": "_1nXeGW_rowRepo",
|
|
5419
|
+
"rowTitleLine": "_1nXeGW_rowTitleLine",
|
|
5420
|
+
"statusDot": "_1nXeGW_statusDot",
|
|
5106
5421
|
"rowUpdate": "_1nXeGW_rowUpdate",
|
|
5422
|
+
"segBtn": "_1nXeGW_segBtn",
|
|
5423
|
+
"rowDetail": "_1nXeGW_rowDetail",
|
|
5424
|
+
"row": "_1nXeGW_row",
|
|
5425
|
+
"rowDesc": "_1nXeGW_rowDesc",
|
|
5426
|
+
"segBtnActive": "_1nXeGW_segBtnActive",
|
|
5427
|
+
"exampleBadge": "_1nXeGW_exampleBadge",
|
|
5107
5428
|
"searchInput": "_1nXeGW_searchInput",
|
|
5108
|
-
"list": "_1nXeGW_list",
|
|
5109
5429
|
"emptyDesc": "_1nXeGW_emptyDesc",
|
|
5110
|
-
"
|
|
5111
|
-
"rowDesc": "_1nXeGW_rowDesc",
|
|
5112
|
-
"rowRepo": "_1nXeGW_rowRepo",
|
|
5113
|
-
"rowMeta": "_1nXeGW_rowMeta",
|
|
5430
|
+
"segLabel": "_1nXeGW_segLabel",
|
|
5114
5431
|
"rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
|
|
5115
|
-
"
|
|
5116
|
-
"segGroup": "_1nXeGW_segGroup",
|
|
5117
|
-
"exampleBadge": "_1nXeGW_exampleBadge",
|
|
5118
|
-
"statusInactive": "_1nXeGW_statusInactive",
|
|
5119
|
-
"statusPending": "_1nXeGW_statusPending",
|
|
5432
|
+
"root": "_1nXeGW_root",
|
|
5120
5433
|
"emptyTitle": "_1nXeGW_emptyTitle",
|
|
5121
|
-
"rowRestart": "_1nXeGW_rowRestart",
|
|
5122
5434
|
"searchWrap": "_1nXeGW_searchWrap",
|
|
5123
|
-
"
|
|
5124
|
-
"
|
|
5125
|
-
"
|
|
5126
|
-
"
|
|
5127
|
-
"segBtn": "_1nXeGW_segBtn",
|
|
5435
|
+
"rowRestart": "_1nXeGW_rowRestart",
|
|
5436
|
+
"rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
|
|
5437
|
+
"empty": "_1nXeGW_empty",
|
|
5438
|
+
"rowMain": "_1nXeGW_rowMain",
|
|
5128
5439
|
"rowUninstall": "_1nXeGW_rowUninstall",
|
|
5129
|
-
"
|
|
5130
|
-
"
|
|
5440
|
+
"segRow": "_1nXeGW_segRow",
|
|
5441
|
+
"versionBadge": "_1nXeGW_versionBadge",
|
|
5442
|
+
"statusPending": "_1nXeGW_statusPending",
|
|
5443
|
+
"rowMeta": "_1nXeGW_rowMeta"
|
|
5131
5444
|
};
|
|
5132
5445
|
//#endregion
|
|
5133
5446
|
//#region src/client/components/views/InstalledView.tsx
|
|
@@ -5371,27 +5684,27 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5371
5684
|
css: css$6
|
|
5372
5685
|
});
|
|
5373
5686
|
var CustomInstallView_module_css_default = {
|
|
5374
|
-
"installRow": "zISxCG_installRow",
|
|
5375
|
-
"installInputError": "zISxCG_installInputError",
|
|
5376
5687
|
"channelOffText": "zISxCG_channelOffText",
|
|
5377
|
-
"
|
|
5378
|
-
"helpBody": "zISxCG_helpBody",
|
|
5379
|
-
"helpCmd": "zISxCG_helpCmd",
|
|
5380
|
-
"installCards": "zISxCG_installCards",
|
|
5381
|
-
"desc": "zISxCG_desc",
|
|
5688
|
+
"installRow": "zISxCG_installRow",
|
|
5382
5689
|
"installCardHead": "zISxCG_installCardHead",
|
|
5383
|
-
"installExample": "zISxCG_installExample",
|
|
5384
|
-
"installInput": "zISxCG_installInput",
|
|
5385
|
-
"helpNote": "zISxCG_helpNote",
|
|
5386
5690
|
"channelOff": "zISxCG_channelOff",
|
|
5691
|
+
"installInput": "zISxCG_installInput",
|
|
5692
|
+
"helpCmd": "zISxCG_helpCmd",
|
|
5387
5693
|
"installHelpBtn": "zISxCG_installHelpBtn",
|
|
5388
|
-
"installLabel": "zISxCG_installLabel",
|
|
5389
|
-
"installCardDisabled": "zISxCG_installCardDisabled",
|
|
5390
5694
|
"installBtn": "zISxCG_installBtn",
|
|
5391
|
-
"
|
|
5392
|
-
"
|
|
5695
|
+
"helpNote": "zISxCG_helpNote",
|
|
5696
|
+
"installCardDisabled": "zISxCG_installCardDisabled",
|
|
5393
5697
|
"installError": "zISxCG_installError",
|
|
5394
|
-
"
|
|
5698
|
+
"desc": "zISxCG_desc",
|
|
5699
|
+
"installExample": "zISxCG_installExample",
|
|
5700
|
+
"installLabel": "zISxCG_installLabel",
|
|
5701
|
+
"installInputError": "zISxCG_installInputError",
|
|
5702
|
+
"root": "zISxCG_root",
|
|
5703
|
+
"installCards": "zISxCG_installCards",
|
|
5704
|
+
"installCard": "zISxCG_installCard",
|
|
5705
|
+
"channelOffBtn": "zISxCG_channelOffBtn",
|
|
5706
|
+
"helpBody": "zISxCG_helpBody",
|
|
5707
|
+
"helpLine": "zISxCG_helpLine"
|
|
5395
5708
|
};
|
|
5396
5709
|
//#endregion
|
|
5397
5710
|
//#region src/client/components/views/CustomInstallView.tsx
|
|
@@ -5547,30 +5860,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5547
5860
|
css: css$5
|
|
5548
5861
|
});
|
|
5549
5862
|
var SettingsView_module_css_default = {
|
|
5550
|
-
"root": "_506LLG_root",
|
|
5551
|
-
"navItem": "_506LLG_navItem",
|
|
5552
|
-
"sidebar": "_506LLG_sidebar",
|
|
5553
|
-
"navIcon": "_506LLG_navIcon",
|
|
5554
|
-
"navItemActive": "_506LLG_navItemActive",
|
|
5555
|
-
"proxyControl": "_506LLG_proxyControl",
|
|
5556
|
-
"settingDesc": "_506LLG_settingDesc",
|
|
5557
|
-
"card": "_506LLG_card",
|
|
5558
|
-
"settingControl": "_506LLG_settingControl",
|
|
5559
|
-
"settingControlStack": "_506LLG_settingControlStack",
|
|
5560
|
-
"proxyHintOk": "_506LLG_proxyHintOk",
|
|
5561
5863
|
"content": "_506LLG_content",
|
|
5562
|
-
"
|
|
5563
|
-
"
|
|
5864
|
+
"settingControl": "_506LLG_settingControl",
|
|
5865
|
+
"resetBtn": "_506LLG_resetBtn",
|
|
5866
|
+
"navItem": "_506LLG_navItem",
|
|
5564
5867
|
"textInput": "_506LLG_textInput",
|
|
5565
|
-
"
|
|
5566
|
-
"
|
|
5567
|
-
"
|
|
5868
|
+
"settingDesc": "_506LLG_settingDesc",
|
|
5869
|
+
"proxyControl": "_506LLG_proxyControl",
|
|
5870
|
+
"proxyHintFail": "_506LLG_proxyHintFail",
|
|
5568
5871
|
"pageDesc": "_506LLG_pageDesc",
|
|
5872
|
+
"pageTitle": "_506LLG_pageTitle",
|
|
5873
|
+
"settingControlStack": "_506LLG_settingControlStack",
|
|
5874
|
+
"root": "_506LLG_root",
|
|
5875
|
+
"card": "_506LLG_card",
|
|
5569
5876
|
"settingRowStack": "_506LLG_settingRowStack",
|
|
5570
5877
|
"proxyHint": "_506LLG_proxyHint",
|
|
5571
|
-
"
|
|
5572
|
-
"
|
|
5573
|
-
"
|
|
5878
|
+
"navIcon": "_506LLG_navIcon",
|
|
5879
|
+
"settingTitle": "_506LLG_settingTitle",
|
|
5880
|
+
"settingRow": "_506LLG_settingRow",
|
|
5881
|
+
"navItemActive": "_506LLG_navItemActive",
|
|
5882
|
+
"sidebar": "_506LLG_sidebar",
|
|
5883
|
+
"controlDropdown": "_506LLG_controlDropdown",
|
|
5884
|
+
"proxyHintOk": "_506LLG_proxyHintOk",
|
|
5885
|
+
"pageHeader": "_506LLG_pageHeader",
|
|
5886
|
+
"settingLabel": "_506LLG_settingLabel"
|
|
5574
5887
|
};
|
|
5575
5888
|
//#endregion
|
|
5576
5889
|
//#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
|
|
@@ -5589,18 +5902,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5589
5902
|
css: css$4
|
|
5590
5903
|
});
|
|
5591
5904
|
var Dropdown_module_css_default = {
|
|
5592
|
-
"dropdownCount": "B_Gxsq_dropdownCount",
|
|
5593
5905
|
"dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
|
|
5906
|
+
"dropdownFill": "B_Gxsq_dropdownFill",
|
|
5907
|
+
"dropdownItemActive": "B_Gxsq_dropdownItemActive",
|
|
5908
|
+
"dropdownBtn": "B_Gxsq_dropdownBtn",
|
|
5909
|
+
"dropdown": "B_Gxsq_dropdown",
|
|
5910
|
+
"dropdownCountActive": "B_Gxsq_dropdownCountActive",
|
|
5594
5911
|
"dropdownPanel": "B_Gxsq_dropdownPanel",
|
|
5912
|
+
"dropdownCount": "B_Gxsq_dropdownCount",
|
|
5595
5913
|
"dropdownLabel": "B_Gxsq_dropdownLabel",
|
|
5596
5914
|
"dropdownArrow": "B_Gxsq_dropdownArrow",
|
|
5597
|
-
"dropdownFill": "B_Gxsq_dropdownFill",
|
|
5598
|
-
"dropdownItemActive": "B_Gxsq_dropdownItemActive",
|
|
5599
5915
|
"dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
|
|
5600
|
-
"
|
|
5601
|
-
"dropdown": "B_Gxsq_dropdown",
|
|
5602
|
-
"dropdownItem": "B_Gxsq_dropdownItem",
|
|
5603
|
-
"dropdownBtn": "B_Gxsq_dropdownBtn"
|
|
5916
|
+
"dropdownItem": "B_Gxsq_dropdownItem"
|
|
5604
5917
|
};
|
|
5605
5918
|
//#endregion
|
|
5606
5919
|
//#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
|
|
@@ -5619,8 +5932,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5619
5932
|
css: css$3
|
|
5620
5933
|
});
|
|
5621
5934
|
var Toggle_module_css_default = {
|
|
5622
|
-
"toggle": "k-cD4G_toggle",
|
|
5623
5935
|
"knob": "k-cD4G_knob",
|
|
5936
|
+
"toggle": "k-cD4G_toggle",
|
|
5624
5937
|
"toggleOn": "k-cD4G_toggleOn"
|
|
5625
5938
|
};
|
|
5626
5939
|
//#endregion
|
|
@@ -5718,29 +6031,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5718
6031
|
css: css$2
|
|
5719
6032
|
});
|
|
5720
6033
|
var DiagnosticsView_module_css_default = {
|
|
5721
|
-
"
|
|
5722
|
-
"
|
|
5723
|
-
"summaryOk": "k9eRya_summaryOk",
|
|
6034
|
+
"badge": "k9eRya_badge",
|
|
6035
|
+
"panel": "k9eRya_panel",
|
|
5724
6036
|
"row": "k9eRya_row",
|
|
5725
|
-
"summary": "k9eRya_summary",
|
|
5726
|
-
"badgeFail": "k9eRya_badgeFail",
|
|
5727
|
-
"head": "k9eRya_head",
|
|
5728
|
-
"envRow": "k9eRya_envRow",
|
|
5729
|
-
"diagPulse": "k9eRya_diagPulse",
|
|
5730
|
-
"runBtn": "k9eRya_runBtn",
|
|
5731
|
-
"envTitle": "k9eRya_envTitle",
|
|
5732
6037
|
"envLabel": "k9eRya_envLabel",
|
|
5733
|
-
"envDesc": "k9eRya_envDesc",
|
|
5734
6038
|
"headHint": "k9eRya_headHint",
|
|
5735
|
-
"
|
|
6039
|
+
"head": "k9eRya_head",
|
|
5736
6040
|
"display": "k9eRya_display",
|
|
5737
|
-
"badgeIdle": "k9eRya_badgeIdle",
|
|
5738
6041
|
"badgeOk": "k9eRya_badgeOk",
|
|
5739
|
-
"summaryFail": "k9eRya_summaryFail",
|
|
5740
|
-
"panel": "k9eRya_panel",
|
|
5741
6042
|
"badgeRunning": "k9eRya_badgeRunning",
|
|
6043
|
+
"diagPulse": "k9eRya_diagPulse",
|
|
5742
6044
|
"name": "k9eRya_name",
|
|
5743
|
-
"
|
|
6045
|
+
"envDesc": "k9eRya_envDesc",
|
|
6046
|
+
"meta": "k9eRya_meta",
|
|
6047
|
+
"badgeIdle": "k9eRya_badgeIdle",
|
|
6048
|
+
"summary": "k9eRya_summary",
|
|
6049
|
+
"summaryOk": "k9eRya_summaryOk",
|
|
6050
|
+
"summaryRunning": "k9eRya_summaryRunning",
|
|
6051
|
+
"envCopyBtn": "k9eRya_envCopyBtn",
|
|
6052
|
+
"envTitle": "k9eRya_envTitle",
|
|
6053
|
+
"summaryFail": "k9eRya_summaryFail",
|
|
6054
|
+
"runBtn": "k9eRya_runBtn",
|
|
6055
|
+
"envRow": "k9eRya_envRow",
|
|
6056
|
+
"badgeFail": "k9eRya_badgeFail"
|
|
5744
6057
|
};
|
|
5745
6058
|
//#endregion
|
|
5746
6059
|
//#region src/client/components/views/DiagnosticsView.tsx
|
|
@@ -5915,57 +6228,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5915
6228
|
css: css$1
|
|
5916
6229
|
});
|
|
5917
6230
|
var LogsView_module_css_default = {
|
|
5918
|
-
"footFail": "_3j77BW_footFail",
|
|
5919
|
-
"pathDialogHint": "_3j77BW_pathDialogHint",
|
|
5920
|
-
"message": "_3j77BW_message",
|
|
5921
|
-
"pathDialogReset": "_3j77BW_pathDialogReset",
|
|
5922
|
-
"previewRow": "_3j77BW_previewRow",
|
|
5923
|
-
"moreEnd": "_3j77BW_moreEnd",
|
|
5924
|
-
"badgeSuccess": "_3j77BW_badgeSuccess",
|
|
5925
|
-
"entry": "_3j77BW_entry",
|
|
5926
|
-
"searchInput": "_3j77BW_searchInput",
|
|
5927
|
-
"more": "_3j77BW_more",
|
|
5928
|
-
"headHint": "_3j77BW_headHint",
|
|
5929
|
-
"footPath": "_3j77BW_footPath",
|
|
5930
|
-
"badgeError": "_3j77BW_badgeError",
|
|
5931
|
-
"catUninstall": "_3j77BW_catUninstall",
|
|
5932
|
-
"headActions": "_3j77BW_headActions",
|
|
5933
|
-
"footCount": "_3j77BW_footCount",
|
|
5934
6231
|
"clearBtn": "_3j77BW_clearBtn",
|
|
5935
|
-
"
|
|
6232
|
+
"list": "_3j77BW_list",
|
|
6233
|
+
"footCount": "_3j77BW_footCount",
|
|
6234
|
+
"catInstall": "_3j77BW_catInstall",
|
|
6235
|
+
"message": "_3j77BW_message",
|
|
5936
6236
|
"badgeInfo": "_3j77BW_badgeInfo",
|
|
5937
|
-
"
|
|
5938
|
-
"
|
|
5939
|
-
"
|
|
5940
|
-
"time": "_3j77BW_time",
|
|
5941
|
-
"empty": "_3j77BW_empty",
|
|
5942
|
-
"pathDialogFoot": "_3j77BW_pathDialogFoot",
|
|
6237
|
+
"pathDialogDesc": "_3j77BW_pathDialogDesc",
|
|
6238
|
+
"more": "_3j77BW_more",
|
|
6239
|
+
"catDiagnostics": "_3j77BW_catDiagnostics",
|
|
5943
6240
|
"logList": "_3j77BW_logList",
|
|
5944
|
-
"
|
|
5945
|
-
"pathDraft": "_3j77BW_pathDraft",
|
|
5946
|
-
"pathDialogRow": "_3j77BW_pathDialogRow",
|
|
5947
|
-
"head": "_3j77BW_head",
|
|
6241
|
+
"filterChip": "_3j77BW_filterChip",
|
|
5948
6242
|
"badgeWarn": "_3j77BW_badgeWarn",
|
|
5949
|
-
"
|
|
5950
|
-
"
|
|
6243
|
+
"btn": "_3j77BW_btn",
|
|
6244
|
+
"time": "_3j77BW_time",
|
|
6245
|
+
"pathDialog": "_3j77BW_pathDialog",
|
|
5951
6246
|
"badgeDebug": "_3j77BW_badgeDebug",
|
|
5952
|
-
"
|
|
5953
|
-
"
|
|
5954
|
-
"
|
|
5955
|
-
"
|
|
5956
|
-
"
|
|
5957
|
-
"filterChip": "_3j77BW_filterChip",
|
|
6247
|
+
"entry": "_3j77BW_entry",
|
|
6248
|
+
"actions": "_3j77BW_actions",
|
|
6249
|
+
"filterBar": "_3j77BW_filterBar",
|
|
6250
|
+
"head": "_3j77BW_head",
|
|
6251
|
+
"filterChipActive": "_3j77BW_filterChipActive",
|
|
5958
6252
|
"footActions": "_3j77BW_footActions",
|
|
5959
|
-
"
|
|
5960
|
-
"pathDialog": "_3j77BW_pathDialog",
|
|
5961
|
-
"event": "_3j77BW_event",
|
|
6253
|
+
"pathDialogReset": "_3j77BW_pathDialogReset",
|
|
5962
6254
|
"catSystem": "_3j77BW_catSystem",
|
|
6255
|
+
"foot": "_3j77BW_foot",
|
|
6256
|
+
"pathText": "_3j77BW_pathText",
|
|
6257
|
+
"footFail": "_3j77BW_footFail",
|
|
5963
6258
|
"panel": "_3j77BW_panel",
|
|
6259
|
+
"linkBtn": "_3j77BW_linkBtn",
|
|
6260
|
+
"catUpdate": "_3j77BW_catUpdate",
|
|
6261
|
+
"headActions": "_3j77BW_headActions",
|
|
6262
|
+
"pathDialogHint": "_3j77BW_pathDialogHint",
|
|
6263
|
+
"catBadge": "_3j77BW_catBadge",
|
|
6264
|
+
"catSettings": "_3j77BW_catSettings",
|
|
6265
|
+
"empty": "_3j77BW_empty",
|
|
5964
6266
|
"pathLabel": "_3j77BW_pathLabel",
|
|
5965
|
-
"
|
|
5966
|
-
"
|
|
5967
|
-
"
|
|
5968
|
-
"
|
|
6267
|
+
"badgeSuccess": "_3j77BW_badgeSuccess",
|
|
6268
|
+
"pathRow": "_3j77BW_pathRow",
|
|
6269
|
+
"searchInput": "_3j77BW_searchInput",
|
|
6270
|
+
"pathDraft": "_3j77BW_pathDraft",
|
|
6271
|
+
"footPath": "_3j77BW_footPath",
|
|
6272
|
+
"badgeError": "_3j77BW_badgeError",
|
|
6273
|
+
"catUninstall": "_3j77BW_catUninstall",
|
|
6274
|
+
"pathDialogFoot": "_3j77BW_pathDialogFoot",
|
|
6275
|
+
"moreEnd": "_3j77BW_moreEnd",
|
|
6276
|
+
"search": "_3j77BW_search",
|
|
6277
|
+
"badge": "_3j77BW_badge",
|
|
6278
|
+
"previewRow": "_3j77BW_previewRow",
|
|
6279
|
+
"headHint": "_3j77BW_headHint",
|
|
6280
|
+
"pathDialogRow": "_3j77BW_pathDialogRow",
|
|
6281
|
+
"event": "_3j77BW_event"
|
|
5969
6282
|
};
|
|
5970
6283
|
//#endregion
|
|
5971
6284
|
//#region src/client/components/modals/LogsModal.tsx
|
|
@@ -7239,7 +7552,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
7239
7552
|
openSection: settingsSection,
|
|
7240
7553
|
onConsumedOpenSection: () => setSettingsSection(null)
|
|
7241
7554
|
}), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
|
|
7242
|
-
info: catalog.hubUpdateTarget ?? catalog.hubUpdateInfo ?? { version: "2.1
|
|
7555
|
+
info: catalog.hubUpdateTarget ?? catalog.hubUpdateInfo ?? { version: "2.2.1" },
|
|
7243
7556
|
state: catalog.hubUpdateState,
|
|
7244
7557
|
currentVersion: catalog.hubCurrentVersion,
|
|
7245
7558
|
lang,
|