dsh-plugin 1.3.10 → 1.4.0

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 CHANGED
@@ -14,11 +14,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
14
14
  * zh/en dictionaries for the DSH Plugin Hub settings section.
15
15
  */
16
16
  const zh = {
17
- nav: "插件中心",
17
+ nav: "插件市场",
18
18
  title: "DSH Plugin Hub",
19
- tagline: "DSH Plugin 插件中心:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装",
19
+ tagline: "DSH Plugin 插件市场:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装",
20
20
  adBadge: "推荐",
21
- ad: "DSH Plugin 插件中心:收录 {total} 款插件,{verified} 款人工精选验证,每日更新",
21
+ ad: "DSH Plugin 插件市场:收录 {total} 款插件,{verified} 款人工精选验证,每日更新",
22
22
  search: "搜索插件名称、描述、标签…",
23
23
  all: "全部",
24
24
  sortStars: "Star",
@@ -31,15 +31,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
31
31
  fork: "Fork",
32
32
  loading: "正在加载插件数据…",
33
33
  failed: "插件数据加载失败",
34
- failedDescNoProxy: "你的网络似乎不通,无法获取插件目录数据。请检查网络连接后重试;或点击右上角按钮在浏览器中打开插件中心。",
35
- failedDescProxy: "你的网络似乎不通,或设置里的 HTTP 代理地址不可达,无法获取插件目录数据。请检查代理设置与网络连接后重试;或点击右上角按钮在浏览器中打开插件中心。",
34
+ failedDescNoProxy: "你的网络似乎不通,无法获取插件目录数据。请检查网络连接后重试;或点击右上角按钮在浏览器中打开插件市场。",
35
+ failedDescProxy: "你的网络似乎不通,或设置里的 HTTP 代理地址不可达,无法获取插件目录数据。请检查代理设置与网络连接后重试;或点击右上角按钮在浏览器中打开插件市场。",
36
36
  retry: "重试",
37
37
  install: "安装",
38
38
  cliOnlyHint: "此插件可能需命令行辅助,失败时复制上方命令到 dsh 终端",
39
39
  failedCopyHint: "安装失败。请复制上方安装命令到 dsh 终端手动执行(原生依赖构建脚本可能需要人工放行,如 pnpm approve-builds)",
40
40
  toastCopied: "安装命令已复制,去 dsh 终端粘贴即可安装",
41
41
  installed: "已安装",
42
- viewMarket: "插件中心",
42
+ viewMarket: "插件市场",
43
43
  viewInstalled: "已安装",
44
44
  viewCustom: "自定义安装",
45
45
  viewSettings: "设置",
@@ -76,8 +76,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
76
76
  customLabel: "自定义安装",
77
77
  installedSearch: "搜索已安装的插件…",
78
78
  installedFilterCatalog: "目录插件",
79
- hubInstall: "插件中心",
80
- hubInstallHint: "来自插件中心收录的目录插件",
79
+ hubInstall: "插件市场",
80
+ hubInstallHint: "来自插件市场收录的目录插件",
81
81
  manualInstall: "手动安装",
82
82
  manualInstallHint: "非目录收录,通过命令行手动安装",
83
83
  filterByLabel: "来源",
@@ -108,7 +108,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
108
108
  settingsUpdate: "更新设置",
109
109
  settingsUpdateDesc: "更新检查方式与安装走到的网络通道",
110
110
  settingsCheckOnStart: "启动时检查更新",
111
- settingsCheckOnStartDesc: "打开插件中心时检查已安装插件是否有新版,发现更新会提示",
111
+ settingsCheckOnStartDesc: "打开插件市场时检查已安装插件是否有新版,发现更新会提示",
112
112
  settingsProxy: "HTTP 代理",
113
113
  settingsProxyDesc: "npm / git / 目录数据请求统一走该代理;留空直连",
114
114
  proxyCheckChecking: "正在测试该代理地址…",
@@ -187,6 +187,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
187
187
  diagNpmUnset: "未配置(跟随本机 npm 配置)",
188
188
  diagGithub: "GitHub",
189
189
  diagCatalog: "目录站点",
190
+ diagCatalogTarget: "插件市场",
190
191
  diagProxy: "HTTP 代理",
191
192
  diagOk: "OK",
192
193
  diagChecking: "检测中…",
@@ -206,7 +207,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
206
207
  settingsResetRun: "恢复默认",
207
208
  settingsResetConfirm: "确认恢复",
208
209
  settingsResetConfirmDetail: "确定要恢复默认设置吗?更新策略、镜像源、代理与安全限制将全部回到出厂默认值。",
209
- updatesFound: "发现 {n} 个插件可更新,已加入通知中心",
210
210
  updateNoticeTitle: "发现新版本",
211
211
  updateNoticeGo: "去更新",
212
212
  ignoreUpdateRun: "忽略本次更新",
@@ -291,8 +291,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
291
291
  failNetworkTarget: "无法访问 {url} —— 你的网络连接不通",
292
292
  failNetworkRunDiag: "去系统诊断检测网络",
293
293
  failDshMissingHint: "系统找不到 dsh 命令(dsh 未加入系统 PATH),无法调用安装器执行安装。请确认 DeepSeek Harness 已正确安装、dsh 已加入 PATH(或重新安装),然后重试。这不是插件本身的问题。",
294
+ failGitMissingHint: "系统找不到 git 命令(Git 未安装或未加入系统 PATH),无法从 GitHub 源安装插件。请先安装 Git(如 git-scm.com/downloads)或把 git 加入 PATH,重启 DSH 后重试。这不是插件本身的问题。",
294
295
  failPnpmMissingHint: "安装器找到了 dsh,但系统里没有 pnpm 命令(dsh 用它来管理 profile 插件)。请先安装 pnpm(如 npm install -g pnpm),确认 pnpm 已加入 PATH 后重试。这不是插件本身的问题。",
296
+ failNpmMissingHint: "系统找不到 npm 命令(npm 未安装或未加入系统 PATH),无法执行全局安装。请先安装 Node.js(自带 npm),确认 npm 已加入 PATH 后重试。这不是插件本身的问题。",
295
297
  failPnpmStoreHint: "安装器调用 pnpm 时报「store 位置不匹配」(ERR_PNPM_UNEXPECTED_STORE):你的 profile 目录里旧插件依赖是用另一个大版本的 pnpm 生成的,当前 pnpm 出于安全不认旧目录,导致任何插件装进该 profile 都会失败。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml(可先到「系统日志」或 ~/.dsh/profiles/<profile>/hub.log 查看完整报错),再重新安装。这不是插件本身的问题。",
298
+ failPnpmPolicyHint: "安装器调用 pnpm 时被其供应链安全策略拦截——装任何插件都会撞墙,不是插件本身的问题。分两种情况处理:① 提示「Minimum release age」(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION):包发布还不满 24 小时,pnpm 11 出于安全会拒收这种刚发布的新包。可在 pnpm 配置(pnpm-workspace.yaml)里加 minimumReleaseAge: 0 豁免,或等满 24 小时后重试。② 提示「untrusted origin」(ERR_PNPM_UNTRUSTED_ORIGIN):依赖来源不被本机 pnpm 信任,通常是该 profile 里之前用 github: 或非官方 npm 源装过插件,锁文件记录了不受信任的来源。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml 后重新安装(可先到「系统日志」或 ~/.dsh/profiles/<profile>/hub.log 查看完整报错)。",
296
299
  installChannelNpm: "NPM 包",
297
300
  installChannelGit: "GitHub 源码",
298
301
  installChannelDsh: "DSH 命令",
@@ -509,6 +512,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
509
512
  diagNpmUnset: "Unset (follow local npm config)",
510
513
  diagGithub: "GitHub",
511
514
  diagCatalog: "Catalog site",
515
+ diagCatalogTarget: "Plugin marketplace",
512
516
  diagProxy: "HTTP proxy",
513
517
  diagOk: "OK",
514
518
  diagChecking: "Checking…",
@@ -528,7 +532,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
528
532
  settingsResetRun: "Restore Defaults",
529
533
  settingsResetConfirm: "Restore Defaults",
530
534
  settingsResetConfirmDetail: "Reset all settings to factory defaults? Update policy, npm mirror, proxy and security restrictions will be cleared.",
531
- updatesFound: "{n} plugin(s) have updates — check the notification center",
532
535
  updateNoticeTitle: "Update available",
533
536
  updateNoticeGo: "Update",
534
537
  ignoreUpdateRun: "Ignore this update",
@@ -614,8 +617,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
614
617
  failNetworkTarget: "Cannot reach {url} — your network connection is down",
615
618
  failNetworkRunDiag: "Run a network diagnostic",
616
619
  failDshMissingHint: "The dsh command could not be found (it is not on the system PATH), so the installer could not run. Please make sure DeepSeek Harness is installed correctly and dsh is on your PATH (or reinstall it), then retry. This is not a problem with the plugin itself.",
620
+ failGitMissingHint: "The git command could not be found (Git is not installed or not on the system PATH), so GitHub-source plugins cannot be installed. Please install Git (e.g. from git-scm.com/downloads) or add git to your PATH, restart DSH, then retry. This is not a problem with the plugin itself.",
617
621
  failPnpmMissingHint: "The installer found dsh, but pnpm is missing on this machine (dsh uses it to manage profile plugins). Please install pnpm first (e.g. npm install -g pnpm), make sure it is on your PATH, then retry. This is not a problem with the plugin itself.",
622
+ failNpmMissingHint: "The npm command could not be found (npm is not installed or not on the system PATH), so a global install cannot run. Please install Node.js (which bundles npm), make sure npm is on your PATH, then retry. This is not a problem with the plugin itself.",
618
623
  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.",
624
+ failPnpmPolicyHint: "The installer was blocked by pnpm supply-chain security policy — every plugin install would hit the same wall, so this is not a problem with the plugin itself. Two cases: ① \"Minimum release age\" (ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION): the package was published less than 24 hours ago, and pnpm 11 refuses freshly-published packages for safety. Add minimumReleaseAge: 0 to your pnpm config (pnpm-workspace.yaml) to opt out, or wait until the 24 hours have passed and retry. ② \"untrusted origin\" (ERR_PNPM_UNTRUSTED_ORIGIN): a dependency source is not trusted by this machine, usually because plugins were previously installed via github: or a non-official npm registry, so the lockfile records an untrusted source. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles/<profile>/hub.log for the full output), then reinstall.",
619
625
  installChannelNpm: "NPM package",
620
626
  installChannelGit: "GitHub source",
621
627
  installChannelDsh: "DSH command",
@@ -672,46 +678,46 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
672
678
  css: css$11
673
679
  });
674
680
  var Header_module_css_default = {
675
- "headerTitleRow": "qikqja_headerTitleRow",
676
- "tabs": "qikqja_tabs",
677
- "adText": "qikqja_adText",
681
+ "githubLink": "qikqja_githubLink",
678
682
  "resultCount": "qikqja_resultCount",
679
- "logoIcon": "qikqja_logoIcon",
680
- "tabCount": "qikqja_tabCount",
681
- "tabActive": "qikqja_tabActive",
682
- "adBanner": "qikqja_adBanner",
683
683
  "segLabel": "qikqja_segLabel",
684
- "segGroup": "qikqja_segGroup",
685
- "githubIcon": "qikqja_githubIcon",
684
+ "logoIcon": "qikqja_logoIcon",
686
685
  "tagline": "qikqja_tagline",
687
- "aboutBtn": "qikqja_aboutBtn",
688
- "root": "qikqja_root",
689
- "versionBtn": "qikqja_versionBtn",
690
- "searchRow": "qikqja_searchRow",
691
- "segBtnActive": "qikqja_segBtnActive",
692
- "version": "qikqja_version",
693
686
  "tab": "qikqja_tab",
694
- "langBtn": "qikqja_langBtn",
695
- "adArrow": "qikqja_adArrow",
696
- "headerRight": "qikqja_headerRight",
697
- "tabsRow": "qikqja_tabsRow",
698
687
  "search": "qikqja_search",
699
- "title": "qikqja_title",
700
- "header": "qikqja_header",
701
- "hubUpdateBadge": "qikqja_hubUpdateBadge",
688
+ "copyIcon": "qikqja_copyIcon",
689
+ "root": "qikqja_root",
690
+ "githubIcon": "qikqja_githubIcon",
702
691
  "controls": "qikqja_controls",
703
- "brandTitle": "qikqja_brandTitle",
692
+ "sortGroup": "qikqja_sortGroup",
693
+ "header": "qikqja_header",
694
+ "aboutBtn": "qikqja_aboutBtn",
704
695
  "resultSeg": "qikqja_resultSeg",
696
+ "headerTitleRow": "qikqja_headerTitleRow",
697
+ "segBtnActive": "qikqja_segBtnActive",
698
+ "searchRow": "qikqja_searchRow",
699
+ "tabs": "qikqja_tabs",
700
+ "adText": "qikqja_adText",
701
+ "adArrow": "qikqja_adArrow",
702
+ "tabActive": "qikqja_tabActive",
703
+ "segGroup": "qikqja_segGroup",
704
+ "headerRight": "qikqja_headerRight",
705
+ "langBtn": "qikqja_langBtn",
706
+ "version": "qikqja_version",
705
707
  "segBtn": "qikqja_segBtn",
706
708
  "adBadge": "qikqja_adBadge",
707
- "sortGroup": "qikqja_sortGroup",
709
+ "tabsRow": "qikqja_tabsRow",
710
+ "hubUpdateBadge": "qikqja_hubUpdateBadge",
708
711
  "taglineLink": "qikqja_taglineLink",
709
- "copyIcon": "qikqja_copyIcon",
710
- "githubLink": "qikqja_githubLink"
712
+ "versionBtn": "qikqja_versionBtn",
713
+ "tabCount": "qikqja_tabCount",
714
+ "brandTitle": "qikqja_brandTitle",
715
+ "adBanner": "qikqja_adBanner",
716
+ "title": "qikqja_title"
711
717
  };
712
718
  //#endregion
713
719
  //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
714
- const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:420px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_helpModal{width:720px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:780px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_confirmIconWrap{justify-content:center;padding:2px 0 6px;display:flex}.BiQ1zG_confirmIcon{background:var(--hub-brand);border-radius:50%;flex:none;justify-content:center;align-items:center;width:48px;height:48px;display:inline-flex;box-shadow:0 4px 12px #4f6ef747}.BiQ1zG_confirmIconDanger{background:var(--hub-danger);box-shadow:0 4px 12px #d1242f4d}.BiQ1zG_dangerConfirm{color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:background-color .12s,border-color .12s}.BiQ1zG_dangerConfirm:hover:not(:disabled){background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}.BiQ1zG_dangerConfirm:disabled{opacity:.55;cursor:default}.BiQ1zG_confirmPrimary{color:#fff;background:var(--hub-brand);border:1px solid var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:filter .12s}.BiQ1zG_confirmPrimary:hover:not(:disabled){filter:brightness(1.08)}.BiQ1zG_confirmPrimary:disabled{opacity:.55;cursor:default}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_noticeIgnore{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:5px;flex-shrink:0;margin-left:2px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px;transition:color .12s,border-color .12s,background .12s}.BiQ1zG_noticeIgnore:hover{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_failDiagBtn{box-sizing:border-box;text-align:center;width:100%;color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:8px;margin-top:8px;padding:5px 16px;font-size:13px;font-weight:600;line-height:18px;transition:background .12s,box-shadow .12s;display:block}.BiQ1zG_failDiagBtn:hover{background:var(--hub-btn-hover);box-shadow:0 3px 10px #0000001f}.BiQ1zG_failNetworkTarget{word-break:break-all;color:var(--hub-danger);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:13px;font-weight:700;line-height:20px}.BiQ1zG_aboutModal{width:460px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutContent img[width=\"100\"]{object-fit:contain;width:100px;height:100px;max-height:100px}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:520px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:480px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}";
720
+ const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:540px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:720px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_helpModal{width:760px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:820px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_confirmIconWrap{justify-content:center;padding:2px 0 6px;display:flex}.BiQ1zG_confirmIcon{background:var(--hub-brand);border-radius:50%;flex:none;justify-content:center;align-items:center;width:48px;height:48px;display:inline-flex;box-shadow:0 4px 12px #4f6ef747}.BiQ1zG_confirmIconDanger{background:var(--hub-danger);box-shadow:0 4px 12px #d1242f4d}.BiQ1zG_dangerConfirm{color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:background-color .12s,border-color .12s}.BiQ1zG_dangerConfirm:hover:not(:disabled){background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}.BiQ1zG_dangerConfirm:disabled{opacity:.55;cursor:default}.BiQ1zG_confirmPrimary{color:#fff;background:var(--hub-brand);border:1px solid var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:filter .12s}.BiQ1zG_confirmPrimary:hover:not(:disabled){filter:brightness(1.08)}.BiQ1zG_confirmPrimary:disabled{opacity:.55;cursor:default}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_noticeIgnore{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:5px;flex-shrink:0;margin-left:2px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px;transition:color .12s,border-color .12s,background .12s}.BiQ1zG_noticeIgnore:hover{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_failDiagBtn{box-sizing:border-box;text-align:center;width:100%;color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:8px;margin-top:8px;padding:5px 16px;font-size:13px;font-weight:600;line-height:18px;transition:background .12s,box-shadow .12s;display:block}.BiQ1zG_failDiagBtn:hover{background:var(--hub-btn-hover);box-shadow:0 3px 10px #0000001f}.BiQ1zG_failNetworkTarget{word-break:break-all;color:var(--hub-danger);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:13px;font-weight:700;line-height:20px}.BiQ1zG_aboutModal{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutContent img[width=\"100\"]{object-fit:contain;width:100px;height:100px;max-height:100px}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:620px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:580px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}";
715
721
  const tagId$10 = "dsh-plugin/Modal.module.css";
716
722
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
717
723
  const tag = document.createElement("style");
@@ -726,136 +732,136 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
726
732
  css: css$10
727
733
  });
728
734
  var Modal_module_css_default = {
729
- "helpModal": "BiQ1zG_helpModal",
730
- "aboutModal": "BiQ1zG_aboutModal",
731
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
732
- "detailLink": "BiQ1zG_detailLink",
733
- "failNetworkTarget": "BiQ1zG_failNetworkTarget",
734
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
735
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
736
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
737
- "queueRow": "BiQ1zG_queueRow",
738
- "noticeRowMain": "BiQ1zG_noticeRowMain",
735
+ "confirmIcon": "BiQ1zG_confirmIcon",
739
736
  "noticeRemove": "BiQ1zG_noticeRemove",
737
+ "modalTitle": "BiQ1zG_modalTitle",
738
+ "noticeHead": "BiQ1zG_noticeHead",
739
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
740
+ "modalBody": "BiQ1zG_modalBody",
741
+ "resultDesc": "BiQ1zG_resultDesc",
742
+ "noticeFoot": "BiQ1zG_noticeFoot",
743
+ "detailStatusText": "BiQ1zG_detailStatusText",
744
+ "detailPathBtn": "BiQ1zG_detailPathBtn",
745
+ "restartLater": "BiQ1zG_restartLater",
746
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
747
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
748
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
749
+ "progressFill": "BiQ1zG_progressFill",
750
+ "modalHead": "BiQ1zG_modalHead",
751
+ "failNetworkTarget": "BiQ1zG_failNetworkTarget",
752
+ "detailDim": "BiQ1zG_detailDim",
753
+ "detailLink": "BiQ1zG_detailLink",
740
754
  "resultCheckIcon": "BiQ1zG_resultCheckIcon",
741
- "progressTrack": "BiQ1zG_progressTrack",
742
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
755
+ "modalClose": "BiQ1zG_modalClose",
743
756
  "linkIcon": "BiQ1zG_linkIcon",
744
- "noticeIgnore": "BiQ1zG_noticeIgnore",
745
- "logModal": "BiQ1zG_logModal",
746
- "modalCmdText": "BiQ1zG_modalCmdText",
747
- "aboutContent": "BiQ1zG_aboutContent",
748
- "noticeFoot": "BiQ1zG_noticeFoot",
749
- "queuedHint": "BiQ1zG_queuedHint",
757
+ "modalCancel": "BiQ1zG_modalCancel",
758
+ "restartNow": "BiQ1zG_restartNow",
759
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
760
+ "failCopy": "BiQ1zG_failCopy",
761
+ "modalActions": "BiQ1zG_modalActions",
762
+ "errorHint": "BiQ1zG_errorHint",
763
+ "detailModal": "BiQ1zG_detailModal",
764
+ "progressTrack": "BiQ1zG_progressTrack",
765
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
766
+ "queueRowHead": "BiQ1zG_queueRowHead",
767
+ "queueSectionTitle": "BiQ1zG_queueSectionTitle",
768
+ "modalRow": "BiQ1zG_modalRow",
769
+ "overlay": "BiQ1zG_overlay",
770
+ "confirmIconDanger": "BiQ1zG_confirmIconDanger",
771
+ "resultCheck": "BiQ1zG_resultCheck",
772
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
773
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
774
+ "progressText": "BiQ1zG_progressText",
775
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
776
+ "toastIn": "BiQ1zG_toastIn",
777
+ "toast": "BiQ1zG_toast",
778
+ "queueRowPct": "BiQ1zG_queueRowPct",
779
+ "detailValue": "BiQ1zG_detailValue",
780
+ "failList": "BiQ1zG_failList",
781
+ "queueSection": "BiQ1zG_queueSection",
782
+ "modalCmd": "BiQ1zG_modalCmd",
783
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
784
+ "modal": "BiQ1zG_modal",
785
+ "queueRow": "BiQ1zG_queueRow",
786
+ "modalCopy": "BiQ1zG_modalCopy",
787
+ "confirmPrimary": "BiQ1zG_confirmPrimary",
750
788
  "modalInstall": "BiQ1zG_modalInstall",
751
- "resultDesc": "BiQ1zG_resultDesc",
789
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
752
790
  "queueRowTrack": "BiQ1zG_queueRowTrack",
791
+ "failClear": "BiQ1zG_failClear",
792
+ "detailGrid": "BiQ1zG_detailGrid",
753
793
  "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
754
- "result": "BiQ1zG_result",
755
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
756
- "modalWide": "BiQ1zG_modalWide",
757
- "resultCheck": "BiQ1zG_resultCheck",
758
- "noticeList": "BiQ1zG_noticeList",
759
- "failEmpty": "BiQ1zG_failEmpty",
760
- "detailLabel": "BiQ1zG_detailLabel",
761
- "noticeRow": "BiQ1zG_noticeRow",
762
- "modalLabel": "BiQ1zG_modalLabel",
763
- "detailValue": "BiQ1zG_detailValue",
764
- "failedCopyHint": "BiQ1zG_failedCopyHint",
765
- "failKindUninstall": "BiQ1zG_failKindUninstall",
766
- "toastFail": "BiQ1zG_toastFail",
767
- "detailPath": "BiQ1zG_detailPath",
768
- "noticeMain": "BiQ1zG_noticeMain",
769
- "confirmIconWrap": "BiQ1zG_confirmIconWrap",
770
- "detailStatusPending": "BiQ1zG_detailStatusPending",
771
- "restartLater": "BiQ1zG_restartLater",
772
- "failBigIssue": "BiQ1zG_failBigIssue",
773
- "modalDesc": "BiQ1zG_modalDesc",
774
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
775
794
  "dangerConfirm": "BiQ1zG_dangerConfirm",
776
- "progressFill": "BiQ1zG_progressFill",
777
- "detailMono": "BiQ1zG_detailMono",
778
- "detailStars": "BiQ1zG_detailStars",
779
- "queueRowStatus": "BiQ1zG_queueRowStatus",
780
- "progress": "BiQ1zG_progress",
795
+ "modalValue": "BiQ1zG_modalValue",
796
+ "noticeList": "BiQ1zG_noticeList",
797
+ "detailArrow": "BiQ1zG_detailArrow",
798
+ "modalIn": "BiQ1zG_modalIn",
799
+ "logModal": "BiQ1zG_logModal",
781
800
  "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
782
- "queueRowHead": "BiQ1zG_queueRowHead",
783
- "errorHint": "BiQ1zG_errorHint",
784
- "failDiagBtn": "BiQ1zG_failDiagBtn",
785
- "overlayIn": "BiQ1zG_overlayIn",
786
- "progressHead": "BiQ1zG_progressHead",
801
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
787
802
  "failHead": "BiQ1zG_failHead",
788
- "detailPathBtn": "BiQ1zG_detailPathBtn",
789
- "confirmPrimary": "BiQ1zG_confirmPrimary",
790
- "modalCopy": "BiQ1zG_modalCopy",
791
- "modal": "BiQ1zG_modal",
792
- "modalActions": "BiQ1zG_modalActions",
803
+ "noticeTime": "BiQ1zG_noticeTime",
804
+ "detailRow": "BiQ1zG_detailRow",
805
+ "progressFillFail": "BiQ1zG_progressFillFail",
806
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
807
+ "aboutMeta": "BiQ1zG_aboutMeta",
808
+ "failRepo": "BiQ1zG_failRepo",
809
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
810
+ "queueRowBody": "BiQ1zG_queueRowBody",
811
+ "queuedHint": "BiQ1zG_queuedHint",
812
+ "detailPathText": "BiQ1zG_detailPathText",
813
+ "noticeMain": "BiQ1zG_noticeMain",
814
+ "errorTitle": "BiQ1zG_errorTitle",
815
+ "resultRestarting": "BiQ1zG_resultRestarting",
793
816
  "resultTitle": "BiQ1zG_resultTitle",
794
- "errorBox": "BiQ1zG_errorBox",
795
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
796
- "confirmIcon": "BiQ1zG_confirmIcon",
797
- "detailModal": "BiQ1zG_detailModal",
798
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
799
- "modalHead": "BiQ1zG_modalHead",
800
- "failCopy": "BiQ1zG_failCopy",
801
- "modalIn": "BiQ1zG_modalIn",
802
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
817
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
818
+ "toastFail": "BiQ1zG_toastFail",
819
+ "aboutModal": "BiQ1zG_aboutModal",
820
+ "failEmpty": "BiQ1zG_failEmpty",
803
821
  "modalLink": "BiQ1zG_modalLink",
822
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
823
+ "detailPath": "BiQ1zG_detailPath",
804
824
  "noticeVersion": "BiQ1zG_noticeVersion",
805
- "failList": "BiQ1zG_failList",
806
- "failRepo": "BiQ1zG_failRepo",
807
825
  "trustHint": "BiQ1zG_trustHint",
826
+ "modalLabel": "BiQ1zG_modalLabel",
827
+ "aboutContent": "BiQ1zG_aboutContent",
828
+ "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
829
+ "progress": "BiQ1zG_progress",
830
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
831
+ "stripCancel": "BiQ1zG_stripCancel",
832
+ "detailMono": "BiQ1zG_detailMono",
833
+ "progressHead": "BiQ1zG_progressHead",
834
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
835
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
836
+ "confirmIconWrap": "BiQ1zG_confirmIconWrap",
837
+ "modalDesc": "BiQ1zG_modalDesc",
838
+ "detailLabel": "BiQ1zG_detailLabel",
839
+ "errorBox": "BiQ1zG_errorBox",
840
+ "noticeRow": "BiQ1zG_noticeRow",
808
841
  "detailPathActions": "BiQ1zG_detailPathActions",
809
- "queueRowBody": "BiQ1zG_queueRowBody",
810
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
811
- "restartNow": "BiQ1zG_restartNow",
812
- "errorTitle": "BiQ1zG_errorTitle",
813
- "aboutMeta": "BiQ1zG_aboutMeta",
814
- "noticeTime": "BiQ1zG_noticeTime",
815
- "noticeTextOk": "BiQ1zG_noticeTextOk",
816
- "progressFillFail": "BiQ1zG_progressFillFail",
842
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
817
843
  "queueRowDesc": "BiQ1zG_queueRowDesc",
818
- "failRow": "BiQ1zG_failRow",
819
- "pendingRowActions": "BiQ1zG_pendingRowActions",
844
+ "failedCopyHint": "BiQ1zG_failedCopyHint",
820
845
  "errorModal": "BiQ1zG_errorModal",
821
- "detailArrow": "BiQ1zG_detailArrow",
822
- "modalCancel": "BiQ1zG_modalCancel",
823
- "restartNowWarning": "BiQ1zG_restartNowWarning",
824
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
825
- "toastIn": "BiQ1zG_toastIn",
826
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
827
- "detailGrid": "BiQ1zG_detailGrid",
828
- "failClear": "BiQ1zG_failClear",
829
- "overlay": "BiQ1zG_overlay",
830
- "modalValue": "BiQ1zG_modalValue",
831
- "noticeRowOk": "BiQ1zG_noticeRowOk",
832
- "queueRowTarget": "BiQ1zG_queueRowTarget",
833
- "queueSection": "BiQ1zG_queueSection",
846
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
847
+ "helpModal": "BiQ1zG_helpModal",
848
+ "modalCmdText": "BiQ1zG_modalCmdText",
849
+ "modalWide": "BiQ1zG_modalWide",
850
+ "overlayIn": "BiQ1zG_overlayIn",
851
+ "result": "BiQ1zG_result",
834
852
  "failKind": "BiQ1zG_failKind",
835
- "modalClose": "BiQ1zG_modalClose",
836
- "modalBody": "BiQ1zG_modalBody",
837
- "queueRowPct": "BiQ1zG_queueRowPct",
838
- "toast": "BiQ1zG_toast",
839
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
840
- "failPrepareHint": "BiQ1zG_failPrepareHint",
841
- "errorCopySoft": "BiQ1zG_errorCopySoft",
842
- "noticeHead": "BiQ1zG_noticeHead",
843
- "detailRow": "BiQ1zG_detailRow",
844
- "detailDim": "BiQ1zG_detailDim",
845
- "modalCmd": "BiQ1zG_modalCmd",
846
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
847
- "detailPathText": "BiQ1zG_detailPathText",
848
- "stripCancel": "BiQ1zG_stripCancel",
849
853
  "failKindInstall": "BiQ1zG_failKindInstall",
850
- "resultRestarting": "BiQ1zG_resultRestarting",
851
- "modalTitle": "BiQ1zG_modalTitle",
852
- "noticeTextFail": "BiQ1zG_noticeTextFail",
853
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
854
- "progressText": "BiQ1zG_progressText",
855
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
856
- "detailStatusText": "BiQ1zG_detailStatusText",
857
- "modalRow": "BiQ1zG_modalRow",
858
- "confirmIconDanger": "BiQ1zG_confirmIconDanger"
854
+ "detailStars": "BiQ1zG_detailStars",
855
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
856
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
857
+ "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
858
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
859
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
860
+ "failRow": "BiQ1zG_failRow",
861
+ "failDiagBtn": "BiQ1zG_failDiagBtn",
862
+ "failBigIssue": "BiQ1zG_failBigIssue",
863
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
864
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon"
859
865
  };
860
866
  //#endregion
861
867
  //#region src/client/logic/install-command.ts
@@ -907,9 +913,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
907
913
  }
908
914
  //#endregion
909
915
  //#region src/client/logic/constants.ts
910
- /** 插件中心官网地址。 */
916
+ /** 插件市场官网地址。 */
911
917
  const SITE_URL = "https://dsh-plugin.org/";
912
- /** 插件中心源码仓库:头部右上角 GitHub 图标的跳转地址 */
918
+ /** 插件市场源码仓库:头部右上角 GitHub 图标的跳转地址 */
913
919
  const GITHUB_URL = "https://github.com/dshplugin/dsh-plugin-hub";
914
920
  /**
915
921
  * Hub 自我更新版本控制(接口中心 Pages:api.dsh-plugin.org,静态 JSON 发布)。
@@ -925,7 +931,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
925
931
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
926
932
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
927
933
  */
928
- const PLUGIN_VERSION = "1.3.10";
934
+ const PLUGIN_VERSION = "1.4.0";
929
935
  const CATEGORY_ORDER = [
930
936
  "interface",
931
937
  "session",
@@ -1555,10 +1561,22 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1555
1561
  * 以 Worker 版本控制中心返回的「最新版本」为准,与当前运行的版本号比对——
1556
1562
  * 构建时注入的 PLUGIN_VERSION 是运行 bundle 的真实版本;测试/异常场景缺失时
1557
1563
  * 回退到安装时记录的版本。版本号不等即新版(版本号只在发版时变更,绝无降级场景)。
1564
+ *
1565
+ * 另加 pnpm 供应链安全门槛:新版本发布还不满 24 小时(+30 分钟缓冲)时,pnpm 会静默
1566
+ * 回退到旧版本,此时若提示「可更新」用户点了也更新不到。publishedAt 由接口中心按 npm
1567
+ * registry 真实发布时间下发(同源),据此判断最准。
1558
1568
  */
1559
1569
  const hubHasUpdate = (() => {
1560
1570
  if (!hubUpdateInfo) return false;
1561
- return hubUpdateInfo.version !== "1.3.10";
1571
+ if (hubUpdateInfo.version === "1.4.0") return false;
1572
+ const publishedAt = hubUpdateInfo.publishedAt;
1573
+ if (publishedAt) {
1574
+ const publishedMs = Date.parse(publishedAt);
1575
+ if (!Number.isNaN(publishedMs)) {
1576
+ if (Date.now() - publishedMs < 882e5) return false;
1577
+ }
1578
+ }
1579
+ return true;
1562
1580
  })();
1563
1581
  (0, react.useMemo)(() => {
1564
1582
  if (!plugins) return [];
@@ -1746,14 +1764,31 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1746
1764
  * - dshMissing:安装器 spawn 的 `dsh` 命令找不到(Windows cmd「不是内部或外部命令」/ POSIX
1747
1765
  * 「command not found」/ spawn ENOENT)—— 是本机 DSH 未正确安装或不在 PATH,不是插件问题
1748
1766
  * → 提示检查 PATH/重装 DSH,不引导提 Issue
1767
+ * - gitMissing:安装器调用 `git` 时找不到可执行文件(Windows cmd「'git' is not recognized」/
1768
+ * POSIX「git: command not found」/ spawn ENOENT)—— 是本机 Git 未安装或不在 PATH,不是插件
1769
+ * 问题。pnpm 会把缺失 git 报成 `ERR_PNPM_GIT_RESOLVE_FAILED`(git ls-remote failed),若只看
1770
+ * 错误码会误归插件侧失败;且 dshMissing 的通用「not recognized」模式会先把它吞成 dsh 缺失,
1771
+ * 所以必须在 dshMissing 之前判断(dsh-plugin-hub#21:Win 下装 git 源插件,
1772
+ * `'git' is not recognized` 被误归仓库问题引导去提 Issue)→ 提示安装 Git / 加入 PATH,不引导提 Issue
1749
1773
  * - pnpmMissing:dsh 存在但调用的 `pnpm` 找不到(dsh 报 `pnpm not found on PATH`/POSIX
1750
1774
  * 「pnpm: command not found」/ spawn ENOENT)—— 本机缺 pnpm(dsh 用 pnpm 管理 profile 插件),
1751
1775
  * 不是插件问题(dsh-plugin-hub#13:Linux 下 `dsh: pnpm not found on PATH` 被误归插件侧失败)
1752
1776
  * → 提示安装/开启 pnpm,不引导提 Issue
1777
+ * - npmMissing:全局 npm 安装通道(`npm install -g ...`)spawn 的 `npm` 命令找不到
1778
+ * (Windows cmd「'npm' is not recognized」/ POSIX「npm: command not found」/ spawn ENOENT)——
1779
+ * 本机 npm 未安装或不在 PATH,不是插件问题。dshMissing 的通用「not recognized」模式会把
1780
+ * `'npm' is not recognized` 吞成 dsh 缺失,所以必须在 dshMissing 之前判断
1781
+ * → 提示安装 npm(Node.js 自带)/加入 PATH,不引导提 Issue
1753
1782
  * - pnpmStore:pnpm 存在但报 store 位置不匹配(`ERR_PNPM_UNEXPECTED_STORE` / `Unexpected store
1754
1783
  * location`)—— profile 目录的 node_modules 是用不同大版本的 pnpm 生成的,当前 pnpm 不认,
1755
1784
  * 任何插件装进该 profile 都会失败;不是插件问题(dsh-plugin-hub#14:macOS 下
1756
1785
  * `ERR_PNPM_UNEXPECTED_STORE` 被误归插件侧失败)→ 提示清理 profile 依赖目录重建,不引导提 Issue
1786
+ * - pnpmPolicy:pnpm 11 的供应链安全策略拒绝安装(`ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION` /
1787
+ * `Minimum release age` —— 锁文件里包的发布时间还不满 24 小时被拒;`untrusted origin` —— 依赖来源未被
1788
+ * 本机 pnpm 信任)。拦的是「刚发布的新包」与「未被信任的来源」,装任何新插件都会撞墙,不是
1789
+ * 插件问题(dsh-plugin-hub#15/#16:用户装官方 dsh-plugin 也被这两类策略拦下并误归插件侧失败)
1790
+ * → 提示按子场景给解法(发布未满 24 小时 → `minimumReleaseAge: 0` 豁免或等满 24 小时;untrusted
1791
+ * origin → 删除 profile 的 node_modules + pnpm-lock.yaml 清掉不受信任来源后重装),不引导提 Issue
1757
1792
  * - network:安装前连通性预检拦截(服务端 `[network]` 标记)或底层连接失败
1758
1793
  * (ERR_PNPM_GIT_FETCH_FAILED / ETIMEDOUT / DNS 解析 / TLS 握手 / 代理拒绝)——
1759
1794
  * 是本机网络不通/被墙/代理有问题,不是插件问题 → 提示检查网络,不引导提 Issue
@@ -1768,8 +1803,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1768
1803
  function classifyFailure(message) {
1769
1804
  if (/\[npm-too-low\]|edgesOut/i.test(message)) return "npmTooOld";
1770
1805
  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";
1806
+ if (/\[git-missing\]|spawn git ENOENT|'git' 不是内部或外部命令|"git" 不是内部或外部命令|git['"]?\s*is not recognized|git: command not found/i.test(message)) return "gitMissing";
1807
+ if (/\[npm-missing\]|spawn npm ENOENT|'npm' 不是内部或外部命令|"npm" 不是内部或外部命令|npm['"]?\s*is not recognized|npm: command not found/i.test(message)) return "npmMissing";
1771
1808
  if (/\[dsh-missing\]|不是内部或外部命令|is not recognized as an internal or external command|command not found|spawn dsh ENOENT/i.test(message)) return "dshMissing";
1772
1809
  if (/ERR_PNPM_UNEXPECTED_STORE|Unexpected store location/i.test(message)) return "pnpmStore";
1810
+ if (/ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|Minimum release age|untrusted origin/i.test(message)) return "pnpmPolicy";
1773
1811
  if (/ERR_PNPM_IGNORED_BUILDS|Ignored build scripts:|ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED/i.test(message)) return "pnpmIgnoredBuild";
1774
1812
  if (/\[network\]|ERR_PNPM_GIT_FETCH_FAILED|ETIMEDOUT|ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|EHOSTUNREACH|ENETUNREACH|getaddrinfo|Could not connect|Could not resolve host|Network unreachable|Failed to connect|socket hang up|CERT_HAS_EXPIRED|SSL certificate problem|\bTLS\b|\bSSL\b/i.test(message)) return "network";
1775
1813
  if (/\[packaging\]|entry file missing/i.test(message)) return "pluginPrepare";
@@ -1865,6 +1903,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1865
1903
  case "dshMissing": return "dsh command not found on the user machine";
1866
1904
  case "pnpmMissing": return "pnpm command not found on the user machine";
1867
1905
  case "pnpmStore": return "pnpm store version mismatch on the user machine";
1906
+ case "pnpmPolicy": return "pnpm supply-chain policy blocked the install on the user machine";
1868
1907
  case "pnpmIgnoredBuild": return "build scripts blocked by pnpm allowlist";
1869
1908
  case "pluginPrepare": return "plugin distribution incomplete";
1870
1909
  case "network": return "network failure on the user side";
@@ -1883,7 +1922,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1883
1922
  function pluginIssueUrl(repo, message, env, command, attempts) {
1884
1923
  const kind = classifyFailure(message);
1885
1924
  const title = `[dsh-plugin.org | dsh-plugin-hub] ${reasonTitleOf(kind)}: ${repo}`;
1886
- const reason = /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — the entry file declared in package.json is missing from the published package (github tarball or npm package); please commit build output or publish a complete package" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : 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)" : "plugin-side install failure";
1925
+ const reason = /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — the entry file declared in package.json is missing from the published package (github tarball or npm package); please commit build output or publish a complete package" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : 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 === "pnpmPolicy" ? "the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)" : "plugin-side install failure";
1887
1926
  const code = coreErrorCode(message);
1888
1927
  const build = (coreChars) => {
1889
1928
  const body = [
@@ -1891,8 +1930,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1891
1930
  `- Cause: ${reason}`,
1892
1931
  ...code ? [`- Key error: \`${code}\``] : [],
1893
1932
  "",
1894
- `## [DSH Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1895
- `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件中心的安装程序自动生成,随本次安装失败一并提交。`,
1933
+ `## [DSH Plugin 插件市场](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1934
+ `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件市场的安装程序自动生成,随本次安装失败一并提交。`,
1896
1935
  `- 实际执行的安装命令:\`${command ?? `dsh plugin${env?.profile ? ` --profile ${env.profile}` : ""} add git+https://github.com/${repo}.git`}\``,
1897
1936
  `- 执行结果:安装失败,未能安装该插件。`,
1898
1937
  ...attempts && attempts.length > 0 ? [
@@ -1954,15 +1993,16 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1954
1993
  * Website: https://dsh-plugin.org
1955
1994
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1956
1995
  *
1957
- * Language state for the section: follows the host (system) locale by
1958
- * default, with an optional manual toggle that wins until the user changes
1959
- * it back. Exposes the localized dictionary lookup `t()` plus the zh/en
1960
- * language flag and the /zh/ URL path prefix.
1996
+ * Language state for the section: the Hub shares the host (system) locale —
1997
+ * the header language toggle writes the host locale preference via setLocale,
1998
+ * so the host chrome (left sidebar, settings dialog) and the Hub panel switch
1999
+ * together instead of drifting apart. Exposes the localized dictionary lookup
2000
+ * `t()` plus the zh/en language flag and the /zh/ URL path prefix.
1961
2001
  */
1962
2002
  function useLanguage(locale) {
1963
- /** 界面语言:默认跟随宿主(系统)语言;右上角按钮可手动切换,切换后以手动选择为准 */
1964
- const [manualLang, setManualLang] = (0, react.useState)(null);
1965
- const lang = manualLang ?? locale.getSnapshot().active;
2003
+ const [, setRev] = (0, react.useState)(0);
2004
+ (0, react.useEffect)(() => locale.subscribe(() => setRev((r) => r + 1)), [locale]);
2005
+ const lang = locale.getSnapshot().active;
1966
2006
  const langKey = lang === "en" ? "en" : "zh";
1967
2007
  const langPath = langPathOf(lang);
1968
2008
  const dict = langKey === "en" ? en : zh;
@@ -1975,7 +2015,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1975
2015
  langKey,
1976
2016
  langPath,
1977
2017
  t,
1978
- toggleLang: () => setManualLang(lang === "en" ? "zh" : "en")
2018
+ toggleLang: () => locale.setLocale(lang === "en" ? "zh" : "en")
1979
2019
  };
1980
2020
  }
1981
2021
  //#endregion
@@ -2787,7 +2827,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2787
2827
  strokeLinejoin: "round"
2788
2828
  }));
2789
2829
  }
2790
- /** 插件中心图标:店面货架(stroke 继承 currentColor),一级导航「插件中心」tab 用。 */
2830
+ /** 插件市场图标:店面货架(stroke 继承 currentColor),一级导航「插件市场」tab 用。 */
2791
2831
  function MarketIcon() {
2792
2832
  return (0, react.createElement)("svg", {
2793
2833
  viewBox: "0 0 24 24",
@@ -3265,7 +3305,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3265
3305
  }, repo) : null, (0, react.createElement)("button", {
3266
3306
  className: Modal_module_css_default.errorCopySoft,
3267
3307
  onClick: () => onCopy(copyText)
3268
- }, t("errorCopy"))), (0, react.createElement)("pre", { className: Modal_module_css_default.errorBox }, message), 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 === "pnpmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingHint")) : failureKind === "pnpmStore" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint")) : failureKind === "network" ? (0, react.createElement)("div", null, [
3308
+ }, t("errorCopy"))), (0, react.createElement)("pre", { className: Modal_module_css_default.errorBox }, message), 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 === "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("failPnpmPolicyHint")) : failureKind === "network" ? (0, react.createElement)("div", null, [
3269
3309
  (() => {
3270
3310
  const target = unreachableTargetOf(message);
3271
3311
  return target ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failNetworkTarget", { url: target })) : null;
@@ -3294,7 +3334,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3294
3334
  }
3295
3335
  /** 全局反馈 Toast:复制成功(反色)/ 安装完成(反色)/ 安装失败(红色)/ 卸载结果 */
3296
3336
  function Toast({ toast, t }) {
3297
- const text = toast.kind === "copied" ? t("toastCopied") : toast.kind === "errCopied" ? t("errCopied") : toast.kind === "done" ? t("installDone") : toast.kind === "fail" ? t("installFail") : toast.kind === "removed" ? t("uninstallDone") : toast.kind === "revealFail" ? t("openFolderFail") : toast.kind === "updates" ? t("updatesFound", { n: toast.n ?? 0 }) : t("uninstallFail");
3337
+ const text = toast.kind === "copied" ? t("toastCopied") : toast.kind === "errCopied" ? t("errCopied") : toast.kind === "done" ? t("installDone") : toast.kind === "fail" ? t("installFail") : toast.kind === "removed" ? t("uninstallDone") : toast.kind === "revealFail" ? t("openFolderFail") : t("uninstallFail");
3298
3338
  const fail = toast.kind === "fail" || toast.kind === "removeFail" || toast.kind === "revealFail";
3299
3339
  return (0, react.createElement)("div", {
3300
3340
  key: toast.id,
@@ -3817,8 +3857,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3817
3857
  return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(v ? "failNpmTooLowV" : "failNpmTooLow", v ? { v } : void 0));
3818
3858
  }
3819
3859
  if (kind === "dshMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshMissingHint"));
3860
+ if (kind === "gitMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failGitMissingHint"));
3820
3861
  if (kind === "pnpmMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingHint"));
3862
+ if (kind === "npmMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNpmMissingHint"));
3821
3863
  if (kind === "pnpmStore") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint"));
3864
+ if (kind === "pnpmPolicy") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmPolicyHint"));
3822
3865
  if (kind === "network") return (0, react.createElement)("div", null, [
3823
3866
  (() => {
3824
3867
  const target = unreachableTargetOf(r.message);
@@ -4024,40 +4067,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4024
4067
  css: css$9
4025
4068
  });
4026
4069
  var List_module_css_default = {
4027
- "date": "_3XaZHa_date",
4028
- "retryBtn": "_3XaZHa_retryBtn",
4029
- "uninstallBtn": "_3XaZHa_uninstallBtn",
4030
- "installBtn": "_3XaZHa_installBtn",
4031
- "state": "_3XaZHa_state",
4032
- "stateTitle": "_3XaZHa_stateTitle",
4033
- "cardMain": "_3XaZHa_cardMain",
4034
- "stats": "_3XaZHa_stats",
4035
- "topics": "_3XaZHa_topics",
4036
4070
  "body": "_3XaZHa_body",
4037
- "updateBadge": "_3XaZHa_updateBadge",
4038
- "card": "_3XaZHa_card",
4039
- "installBtnCopied": "_3XaZHa_installBtnCopied",
4040
- "diagBtn": "_3XaZHa_diagBtn",
4041
- "desc": "_3XaZHa_desc",
4042
- "verified": "_3XaZHa_verified",
4071
+ "topics": "_3XaZHa_topics",
4072
+ "detailBtn": "_3XaZHa_detailBtn",
4073
+ "cardTitle": "_3XaZHa_cardTitle",
4043
4074
  "list": "_3XaZHa_list",
4075
+ "stateActions": "_3XaZHa_stateActions",
4076
+ "categoryBadge": "_3XaZHa_categoryBadge",
4077
+ "verified": "_3XaZHa_verified",
4078
+ "state": "_3XaZHa_state",
4044
4079
  "footLink": "_3XaZHa_footLink",
4080
+ "updateBadge": "_3XaZHa_updateBadge",
4081
+ "versionBadge": "_3XaZHa_versionBadge",
4082
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
4083
+ "stats": "_3XaZHa_stats",
4045
4084
  "star": "_3XaZHa_star",
4085
+ "desc": "_3XaZHa_desc",
4086
+ "date": "_3XaZHa_date",
4087
+ "actions": "_3XaZHa_actions",
4088
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
4089
+ "cardMain": "_3XaZHa_cardMain",
4046
4090
  "topic": "_3XaZHa_topic",
4047
- "cardSide": "_3XaZHa_cardSide",
4048
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4049
- "moreSentinel": "_3XaZHa_moreSentinel",
4091
+ "stateDesc": "_3XaZHa_stateDesc",
4092
+ "uninstallBtn": "_3XaZHa_uninstallBtn",
4050
4093
  "cardHead": "_3XaZHa_cardHead",
4094
+ "stateTitle": "_3XaZHa_stateTitle",
4095
+ "card": "_3XaZHa_card",
4051
4096
  "footer": "_3XaZHa_footer",
4052
- "stateDesc": "_3XaZHa_stateDesc",
4053
- "versionBadge": "_3XaZHa_versionBadge",
4054
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
4055
- "stateActions": "_3XaZHa_stateActions",
4056
- "detailBtn": "_3XaZHa_detailBtn",
4057
- "actions": "_3XaZHa_actions",
4058
- "categoryBadge": "_3XaZHa_categoryBadge",
4097
+ "cardSide": "_3XaZHa_cardSide",
4098
+ "diagBtn": "_3XaZHa_diagBtn",
4059
4099
  "fork": "_3XaZHa_fork",
4060
- "cardTitle": "_3XaZHa_cardTitle"
4100
+ "moreSentinel": "_3XaZHa_moreSentinel",
4101
+ "retryBtn": "_3XaZHa_retryBtn",
4102
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4103
+ "installBtn": "_3XaZHa_installBtn"
4061
4104
  };
4062
4105
  //#endregion
4063
4106
  //#region src/client/hooks/useIncrementalList.ts
@@ -4068,7 +4111,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4068
4111
  *
4069
4112
  * Incremental list: renders only the first batch of a (potentially huge)
4070
4113
  * result set and appends the next batch whenever the end sentinel scrolls
4071
- * into view, so the plugin center never mounts thousands of cards at once.
4114
+ * into view, so the plugin market never mounts thousands of cards at once.
4072
4115
  * The items reference is the list identity — category / search / sort
4073
4116
  * changes produce a new array, which resets the window to the first batch.
4074
4117
  */
@@ -4264,15 +4307,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4264
4307
  css: css$8
4265
4308
  });
4266
4309
  var SectionTabs_module_css_default = {
4267
- "tabCountActive": "_7tvizq_tabCountActive",
4268
- "noticeBtn": "_7tvizq_noticeBtn",
4269
- "tab": "_7tvizq_tab",
4270
- "tabIcon": "_7tvizq_tabIcon",
4271
4310
  "root": "_7tvizq_root",
4311
+ "noticeIcon": "_7tvizq_noticeIcon",
4312
+ "tabIcon": "_7tvizq_tabIcon",
4272
4313
  "tabActive": "_7tvizq_tabActive",
4314
+ "tabCountActive": "_7tvizq_tabCountActive",
4315
+ "noticeCount": "_7tvizq_noticeCount",
4316
+ "noticeBtn": "_7tvizq_noticeBtn",
4273
4317
  "tabCount": "_7tvizq_tabCount",
4274
- "noticeIcon": "_7tvizq_noticeIcon",
4275
- "noticeCount": "_7tvizq_noticeCount"
4318
+ "tab": "_7tvizq_tab"
4276
4319
  };
4277
4320
  //#endregion
4278
4321
  //#region src/client/components/layout/SectionTabs.tsx
@@ -4349,42 +4392,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4349
4392
  css: css$7
4350
4393
  });
4351
4394
  var InstalledView_module_css_default = {
4352
- "toolbar": "_1nXeGW_toolbar",
4353
- "segBtnActive": "_1nXeGW_segBtnActive",
4395
+ "segLabel": "_1nXeGW_segLabel",
4396
+ "searchWrap": "_1nXeGW_searchWrap",
4397
+ "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4398
+ "rowUninstall": "_1nXeGW_rowUninstall",
4354
4399
  "emptyTitle": "_1nXeGW_emptyTitle",
4355
- "rowDesc": "_1nXeGW_rowDesc",
4356
- "statusInactive": "_1nXeGW_statusInactive",
4357
- "exampleRow": "_1nXeGW_exampleRow",
4358
- "rowCategory": "_1nXeGW_rowCategory",
4359
- "rowActions": "_1nXeGW_rowActions",
4360
- "rowUpdate": "_1nXeGW_rowUpdate",
4361
- "versionBadge": "_1nXeGW_versionBadge",
4400
+ "empty": "_1nXeGW_empty",
4401
+ "segBtn": "_1nXeGW_segBtn",
4402
+ "emptyDesc": "_1nXeGW_emptyDesc",
4362
4403
  "updateBadge": "_1nXeGW_updateBadge",
4363
- "root": "_1nXeGW_root",
4364
- "row": "_1nXeGW_row",
4365
- "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4404
+ "rowRepo": "_1nXeGW_rowRepo",
4366
4405
  "rowMeta": "_1nXeGW_rowMeta",
4367
- "statusPending": "_1nXeGW_statusPending",
4368
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4406
+ "root": "_1nXeGW_root",
4407
+ "rowRestart": "_1nXeGW_rowRestart",
4369
4408
  "rowDetail": "_1nXeGW_rowDetail",
4370
- "emptyDesc": "_1nXeGW_emptyDesc",
4371
- "rowUninstall": "_1nXeGW_rowUninstall",
4372
- "rowTitleLine": "_1nXeGW_rowTitleLine",
4373
- "rowSourceTag": "_1nXeGW_rowSourceTag",
4409
+ "rowTitle": "_1nXeGW_rowTitle",
4410
+ "toolbar": "_1nXeGW_toolbar",
4411
+ "searchInput": "_1nXeGW_searchInput",
4374
4412
  "statusDot": "_1nXeGW_statusDot",
4375
- "segRow": "_1nXeGW_segRow",
4413
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
4414
+ "statusPending": "_1nXeGW_statusPending",
4415
+ "rowDesc": "_1nXeGW_rowDesc",
4416
+ "row": "_1nXeGW_row",
4417
+ "versionBadge": "_1nXeGW_versionBadge",
4418
+ "rowActions": "_1nXeGW_rowActions",
4419
+ "rowUpdate": "_1nXeGW_rowUpdate",
4420
+ "rowMain": "_1nXeGW_rowMain",
4421
+ "segBtnActive": "_1nXeGW_segBtnActive",
4422
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
4423
+ "list": "_1nXeGW_list",
4376
4424
  "segGroup": "_1nXeGW_segGroup",
4377
- "rowTitle": "_1nXeGW_rowTitle",
4378
- "rowRestart": "_1nXeGW_rowRestart",
4379
- "rowRepo": "_1nXeGW_rowRepo",
4380
- "segLabel": "_1nXeGW_segLabel",
4381
- "empty": "_1nXeGW_empty",
4382
- "segBtn": "_1nXeGW_segBtn",
4425
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4383
4426
  "exampleBadge": "_1nXeGW_exampleBadge",
4384
- "searchWrap": "_1nXeGW_searchWrap",
4385
- "list": "_1nXeGW_list",
4386
- "rowMain": "_1nXeGW_rowMain",
4387
- "searchInput": "_1nXeGW_searchInput"
4427
+ "exampleRow": "_1nXeGW_exampleRow",
4428
+ "statusInactive": "_1nXeGW_statusInactive",
4429
+ "rowCategory": "_1nXeGW_rowCategory",
4430
+ "segRow": "_1nXeGW_segRow"
4388
4431
  };
4389
4432
  //#endregion
4390
4433
  //#region src/client/components/views/InstalledView.tsx
@@ -4630,28 +4673,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4630
4673
  css: css$6
4631
4674
  });
4632
4675
  var CustomInstallView_module_css_default = {
4676
+ "root": "zISxCG_root",
4677
+ "installRow": "zISxCG_installRow",
4633
4678
  "installBtn": "zISxCG_installBtn",
4634
- "helpLine": "zISxCG_helpLine",
4635
- "channelOffText": "zISxCG_channelOffText",
4636
- "installInputError": "zISxCG_installInputError",
4637
- "installInsertBtn": "zISxCG_installInsertBtn",
4638
4679
  "installExample": "zISxCG_installExample",
4680
+ "installCardHead": "zISxCG_installCardHead",
4639
4681
  "installCardDisabled": "zISxCG_installCardDisabled",
4682
+ "installInput": "zISxCG_installInput",
4683
+ "helpLine": "zISxCG_helpLine",
4684
+ "helpCmd": "zISxCG_helpCmd",
4640
4685
  "installCards": "zISxCG_installCards",
4641
- "installCardHead": "zISxCG_installCardHead",
4642
- "channelOff": "zISxCG_channelOff",
4643
- "desc": "zISxCG_desc",
4686
+ "installError": "zISxCG_installError",
4644
4687
  "installCard": "zISxCG_installCard",
4645
- "helpCmd": "zISxCG_helpCmd",
4646
- "channelOffBtn": "zISxCG_channelOffBtn",
4647
4688
  "installHelpBtn": "zISxCG_installHelpBtn",
4648
- "installRow": "zISxCG_installRow",
4649
- "installLabel": "zISxCG_installLabel",
4650
- "installInput": "zISxCG_installInput",
4651
- "installError": "zISxCG_installError",
4652
- "root": "zISxCG_root",
4653
4689
  "helpBody": "zISxCG_helpBody",
4654
- "helpNote": "zISxCG_helpNote"
4690
+ "channelOffBtn": "zISxCG_channelOffBtn",
4691
+ "installInsertBtn": "zISxCG_installInsertBtn",
4692
+ "helpNote": "zISxCG_helpNote",
4693
+ "installInputError": "zISxCG_installInputError",
4694
+ "installLabel": "zISxCG_installLabel",
4695
+ "channelOff": "zISxCG_channelOff",
4696
+ "channelOffText": "zISxCG_channelOffText",
4697
+ "desc": "zISxCG_desc"
4655
4698
  };
4656
4699
  //#endregion
4657
4700
  //#region src/client/components/views/CustomInstallView.tsx
@@ -4941,30 +4984,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4941
4984
  css: css$5
4942
4985
  });
4943
4986
  var SettingsView_module_css_default = {
4944
- "proxyHint": "_506LLG_proxyHint",
4945
- "proxyHintOk": "_506LLG_proxyHintOk",
4946
- "resetBtn": "_506LLG_resetBtn",
4947
- "proxyControl": "_506LLG_proxyControl",
4948
- "settingTitle": "_506LLG_settingTitle",
4949
- "settingLabel": "_506LLG_settingLabel",
4950
4987
  "navIcon": "_506LLG_navIcon",
4951
- "card": "_506LLG_card",
4952
- "navItemActive": "_506LLG_navItemActive",
4953
4988
  "pageTitle": "_506LLG_pageTitle",
4989
+ "sidebar": "_506LLG_sidebar",
4990
+ "settingControl": "_506LLG_settingControl",
4991
+ "proxyHintFail": "_506LLG_proxyHintFail",
4992
+ "settingTitle": "_506LLG_settingTitle",
4993
+ "settingRowStack": "_506LLG_settingRowStack",
4954
4994
  "navItem": "_506LLG_navItem",
4955
- "settingControlStack": "_506LLG_settingControlStack",
4956
- "pageDesc": "_506LLG_pageDesc",
4957
- "textInput": "_506LLG_textInput",
4995
+ "content": "_506LLG_content",
4958
4996
  "controlDropdown": "_506LLG_controlDropdown",
4959
- "proxyHintFail": "_506LLG_proxyHintFail",
4997
+ "settingLabel": "_506LLG_settingLabel",
4998
+ "card": "_506LLG_card",
4960
4999
  "pageHeader": "_506LLG_pageHeader",
4961
- "sidebar": "_506LLG_sidebar",
4962
- "settingRow": "_506LLG_settingRow",
4963
- "content": "_506LLG_content",
4964
- "settingRowStack": "_506LLG_settingRowStack",
4965
- "settingDesc": "_506LLG_settingDesc",
5000
+ "pageDesc": "_506LLG_pageDesc",
5001
+ "proxyHint": "_506LLG_proxyHint",
5002
+ "proxyHintOk": "_506LLG_proxyHintOk",
5003
+ "navItemActive": "_506LLG_navItemActive",
4966
5004
  "root": "_506LLG_root",
4967
- "settingControl": "_506LLG_settingControl"
5005
+ "settingDesc": "_506LLG_settingDesc",
5006
+ "proxyControl": "_506LLG_proxyControl",
5007
+ "resetBtn": "_506LLG_resetBtn",
5008
+ "textInput": "_506LLG_textInput",
5009
+ "settingControlStack": "_506LLG_settingControlStack",
5010
+ "settingRow": "_506LLG_settingRow"
4968
5011
  };
4969
5012
  //#endregion
4970
5013
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -4983,18 +5026,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4983
5026
  css: css$4
4984
5027
  });
4985
5028
  var Dropdown_module_css_default = {
4986
- "dropdownItem": "B_Gxsq_dropdownItem",
4987
- "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
4988
- "dropdownPanel": "B_Gxsq_dropdownPanel",
4989
5029
  "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4990
- "dropdownFill": "B_Gxsq_dropdownFill",
4991
- "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4992
- "dropdown": "B_Gxsq_dropdown",
5030
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
5031
+ "dropdownPanel": "B_Gxsq_dropdownPanel",
5032
+ "dropdownLabel": "B_Gxsq_dropdownLabel",
4993
5033
  "dropdownArrow": "B_Gxsq_dropdownArrow",
4994
5034
  "dropdownBtn": "B_Gxsq_dropdownBtn",
4995
- "dropdownCount": "B_Gxsq_dropdownCount",
4996
- "dropdownLabel": "B_Gxsq_dropdownLabel",
4997
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen"
5035
+ "dropdownFill": "B_Gxsq_dropdownFill",
5036
+ "dropdown": "B_Gxsq_dropdown",
5037
+ "dropdownItem": "B_Gxsq_dropdownItem",
5038
+ "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
5039
+ "dropdownItemActive": "B_Gxsq_dropdownItemActive",
5040
+ "dropdownCount": "B_Gxsq_dropdownCount"
4998
5041
  };
4999
5042
  //#endregion
5000
5043
  //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
@@ -5013,9 +5056,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5013
5056
  css: css$3
5014
5057
  });
5015
5058
  var Toggle_module_css_default = {
5059
+ "knob": "k-cD4G_knob",
5016
5060
  "toggle": "k-cD4G_toggle",
5017
- "toggleOn": "k-cD4G_toggleOn",
5018
- "knob": "k-cD4G_knob"
5061
+ "toggleOn": "k-cD4G_toggleOn"
5019
5062
  };
5020
5063
  //#endregion
5021
5064
  //#region src/client/components/ui/Toggle.tsx
@@ -5115,29 +5158,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5115
5158
  css: css$2
5116
5159
  });
5117
5160
  var DiagnosticsView_module_css_default = {
5118
- "badgeOk": "k9eRya_badgeOk",
5119
- "envRow": "k9eRya_envRow",
5120
- "meta": "k9eRya_meta",
5121
- "badgeRunning": "k9eRya_badgeRunning",
5122
- "badgeFail": "k9eRya_badgeFail",
5123
- "summary": "k9eRya_summary",
5124
5161
  "head": "k9eRya_head",
5125
- "headHint": "k9eRya_headHint",
5126
- "name": "k9eRya_name",
5162
+ "envLabel": "k9eRya_envLabel",
5163
+ "diagPulse": "k9eRya_diagPulse",
5127
5164
  "summaryRunning": "k9eRya_summaryRunning",
5128
- "envCopyBtn": "k9eRya_envCopyBtn",
5129
- "row": "k9eRya_row",
5130
- "summaryFail": "k9eRya_summaryFail",
5131
- "envDesc": "k9eRya_envDesc",
5132
5165
  "runBtn": "k9eRya_runBtn",
5133
- "diagPulse": "k9eRya_diagPulse",
5166
+ "badgeFail": "k9eRya_badgeFail",
5167
+ "envCopyBtn": "k9eRya_envCopyBtn",
5168
+ "badgeOk": "k9eRya_badgeOk",
5169
+ "summary": "k9eRya_summary",
5134
5170
  "envTitle": "k9eRya_envTitle",
5135
- "display": "k9eRya_display",
5136
- "envLabel": "k9eRya_envLabel",
5171
+ "summaryOk": "k9eRya_summaryOk",
5172
+ "summaryFail": "k9eRya_summaryFail",
5137
5173
  "badge": "k9eRya_badge",
5174
+ "meta": "k9eRya_meta",
5175
+ "display": "k9eRya_display",
5176
+ "envRow": "k9eRya_envRow",
5177
+ "headHint": "k9eRya_headHint",
5178
+ "badgeRunning": "k9eRya_badgeRunning",
5138
5179
  "badgeIdle": "k9eRya_badgeIdle",
5139
5180
  "panel": "k9eRya_panel",
5140
- "summaryOk": "k9eRya_summaryOk"
5181
+ "row": "k9eRya_row",
5182
+ "name": "k9eRya_name",
5183
+ "envDesc": "k9eRya_envDesc"
5141
5184
  };
5142
5185
  //#endregion
5143
5186
  //#region src/client/components/views/DiagnosticsView.tsx
@@ -5175,7 +5218,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5175
5218
  },
5176
5219
  {
5177
5220
  key: "github",
5178
- display: "github.com/dshplugin/hello-dsh",
5221
+ display: "github.com",
5179
5222
  nameKey: "diagGithub",
5180
5223
  status: "idle",
5181
5224
  ms: null,
@@ -5183,7 +5226,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5183
5226
  },
5184
5227
  {
5185
5228
  key: "catalog",
5186
- display: "api.dsh-plugin.org",
5229
+ display: "",
5187
5230
  nameKey: "diagCatalog",
5188
5231
  status: "idle",
5189
5232
  ms: null,
@@ -5292,7 +5335,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5292
5335
  disabled: r.status === "running",
5293
5336
  onClick: () => run(r.key),
5294
5337
  title: t("diagRecheck")
5295
- }, (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.name }, t(r.nameKey)), (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.display }, r.display !== "" ? r.display : t("diagNpmUnset")), (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.meta }, r.status === "ok" && r.ms !== null ? `${r.ms} ms` : ""), badge);
5338
+ }, (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.name }, t(r.nameKey)), (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.display }, r.key === "catalog" ? t("diagCatalogTarget") : r.display !== "" ? r.display : t("diagNpmUnset")), (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.meta }, r.status === "ok" && r.ms !== null ? `${r.ms} ms` : ""), badge);
5296
5339
  }), (0, react.createElement)("div", { className: `${DiagnosticsView_module_css_default.summary} ${anyRunning ? DiagnosticsView_module_css_default.summaryRunning : allOk ? DiagnosticsView_module_css_default.summaryOk : DiagnosticsView_module_css_default.summaryFail}` }, anyRunning ? t("diagSummaryRunning") : allOk ? t("diagSummaryOk") : t("diagSummaryFail")));
5297
5340
  }
5298
5341
  //#endregion
@@ -5312,57 +5355,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5312
5355
  css: css$1
5313
5356
  });
5314
5357
  var LogsView_module_css_default = {
5315
- "footActions": "_3j77BW_footActions",
5316
- "pathLabel": "_3j77BW_pathLabel",
5317
- "badgeError": "_3j77BW_badgeError",
5318
- "btn": "_3j77BW_btn",
5319
- "clearBtn": "_3j77BW_clearBtn",
5320
- "foot": "_3j77BW_foot",
5358
+ "searchInput": "_3j77BW_searchInput",
5359
+ "time": "_3j77BW_time",
5360
+ "badgeWarn": "_3j77BW_badgeWarn",
5361
+ "catDiagnostics": "_3j77BW_catDiagnostics",
5362
+ "catSystem": "_3j77BW_catSystem",
5363
+ "search": "_3j77BW_search",
5364
+ "catInstall": "_3j77BW_catInstall",
5365
+ "pathDraft": "_3j77BW_pathDraft",
5321
5366
  "pathDialog": "_3j77BW_pathDialog",
5322
- "head": "_3j77BW_head",
5323
- "logList": "_3j77BW_logList",
5324
- "event": "_3j77BW_event",
5325
- "moreEnd": "_3j77BW_moreEnd",
5326
- "badge": "_3j77BW_badge",
5327
- "actions": "_3j77BW_actions",
5328
- "badgeInfo": "_3j77BW_badgeInfo",
5329
- "catUninstall": "_3j77BW_catUninstall",
5330
5367
  "catSettings": "_3j77BW_catSettings",
5368
+ "badgeDebug": "_3j77BW_badgeDebug",
5331
5369
  "pathDialogDesc": "_3j77BW_pathDialogDesc",
5332
- "search": "_3j77BW_search",
5333
- "headHint": "_3j77BW_headHint",
5334
- "footCount": "_3j77BW_footCount",
5335
- "catInstall": "_3j77BW_catInstall",
5336
- "catSystem": "_3j77BW_catSystem",
5337
- "filterChip": "_3j77BW_filterChip",
5370
+ "catUpdate": "_3j77BW_catUpdate",
5371
+ "moreEnd": "_3j77BW_moreEnd",
5338
5372
  "empty": "_3j77BW_empty",
5339
- "more": "_3j77BW_more",
5373
+ "message": "_3j77BW_message",
5374
+ "clearBtn": "_3j77BW_clearBtn",
5375
+ "linkBtn": "_3j77BW_linkBtn",
5376
+ "catUninstall": "_3j77BW_catUninstall",
5340
5377
  "pathDialogRow": "_3j77BW_pathDialogRow",
5341
- "time": "_3j77BW_time",
5342
- "filterChipActive": "_3j77BW_filterChipActive",
5343
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
5344
- "filterBar": "_3j77BW_filterBar",
5345
- "badgeSuccess": "_3j77BW_badgeSuccess",
5346
- "previewRow": "_3j77BW_previewRow",
5347
- "list": "_3j77BW_list",
5348
- "badgeWarn": "_3j77BW_badgeWarn",
5378
+ "pathLabel": "_3j77BW_pathLabel",
5349
5379
  "panel": "_3j77BW_panel",
5350
- "footFail": "_3j77BW_footFail",
5351
- "catUpdate": "_3j77BW_catUpdate",
5352
- "pathDialogHint": "_3j77BW_pathDialogHint",
5353
- "badgeDebug": "_3j77BW_badgeDebug",
5380
+ "badgeInfo": "_3j77BW_badgeInfo",
5381
+ "headHint": "_3j77BW_headHint",
5354
5382
  "catBadge": "_3j77BW_catBadge",
5355
- "catDiagnostics": "_3j77BW_catDiagnostics",
5383
+ "btn": "_3j77BW_btn",
5384
+ "list": "_3j77BW_list",
5385
+ "filterBar": "_3j77BW_filterBar",
5386
+ "filterChipActive": "_3j77BW_filterChipActive",
5387
+ "logList": "_3j77BW_logList",
5388
+ "footActions": "_3j77BW_footActions",
5389
+ "event": "_3j77BW_event",
5390
+ "head": "_3j77BW_head",
5356
5391
  "footPath": "_3j77BW_footPath",
5357
- "searchInput": "_3j77BW_searchInput",
5392
+ "actions": "_3j77BW_actions",
5393
+ "pathText": "_3j77BW_pathText",
5358
5394
  "headActions": "_3j77BW_headActions",
5395
+ "previewRow": "_3j77BW_previewRow",
5396
+ "footCount": "_3j77BW_footCount",
5397
+ "foot": "_3j77BW_foot",
5398
+ "badge": "_3j77BW_badge",
5359
5399
  "entry": "_3j77BW_entry",
5360
- "message": "_3j77BW_message",
5361
- "pathText": "_3j77BW_pathText",
5362
- "linkBtn": "_3j77BW_linkBtn",
5363
- "pathDraft": "_3j77BW_pathDraft",
5400
+ "badgeError": "_3j77BW_badgeError",
5401
+ "filterChip": "_3j77BW_filterChip",
5402
+ "pathDialogHint": "_3j77BW_pathDialogHint",
5403
+ "footFail": "_3j77BW_footFail",
5364
5404
  "pathRow": "_3j77BW_pathRow",
5365
- "pathDialogReset": "_3j77BW_pathDialogReset"
5405
+ "more": "_3j77BW_more",
5406
+ "pathDialogReset": "_3j77BW_pathDialogReset",
5407
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
5408
+ "badgeSuccess": "_3j77BW_badgeSuccess"
5366
5409
  };
5367
5410
  //#endregion
5368
5411
  //#region src/client/components/modals/LogsModal.tsx
@@ -6179,7 +6222,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6179
6222
  const catalog = useCatalog(lang);
6180
6223
  /** 设置状态:服务端 hub-settings.json 持久化,本地乐观更新即时生效 */
6181
6224
  const { settings: hubSettings, ready: settingsReady, update: updateSettings, reset: resetSettings } = useSettings();
6182
- /** 一级导航:插件中心 / 已安装 / 自定义安装 / 设置 */
6225
+ /** 一级导航:插件市场 / 已安装 / 自定义安装 / 设置 */
6183
6226
  const [view, setView] = (0, react.useState)("market");
6184
6227
  /** 外部跳转设置分组的一次性信号(错误弹窗「去系统诊断」→ 设置 → 系统诊断):
6185
6228
  * 传给 SettingsView 消费后即清空,避免下次进设置被强制带跳 */
@@ -6348,12 +6391,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6348
6391
  if (!settingsReady || catalog.plugins === null || catalog.failed) return;
6349
6392
  startupCheckedRef.current = true;
6350
6393
  if (!hubSettings.checkUpdatesOnStart) return;
6351
- const added = syncUpdateNotices();
6352
- if (added > 0) setToast({
6353
- id: Date.now(),
6354
- kind: "updates",
6355
- n: added
6356
- });
6394
+ syncUpdateNotices();
6357
6395
  }, [
6358
6396
  settingsReady,
6359
6397
  hubSettings,
@@ -6607,7 +6645,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6607
6645
  openSection: settingsSection,
6608
6646
  onConsumedOpenSection: () => setSettingsSection(null)
6609
6647
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
6610
- info: catalog.hubUpdateInfo ?? { version: "1.3.10" },
6648
+ info: catalog.hubUpdateInfo ?? { version: "1.4.0" },
6611
6649
  lang,
6612
6650
  t,
6613
6651
  hasUpdate: catalog.hubHasUpdate,