dsh-plugin 1.3.4 → 1.3.6

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.
Files changed (34) hide show
  1. package/README.en.md +38 -1
  2. package/README.md +38 -1
  3. package/client/client.js +449 -410
  4. package/client/client.js.map +1 -1
  5. package/lib/http/routes.js +9 -5
  6. package/lib/services/install/npm-resolve.js +3 -1
  7. package/lib/services/install/task-queue.js +29 -15
  8. package/lib/services/profile/profile.js +4 -3
  9. package/lib/services/settings.js +1 -1
  10. package/lib/types/services/install/install-types.d.ts +2 -2
  11. package/lib/types/services/install/npm-resolve.d.ts +3 -1
  12. package/lib/types/services/install/task-queue.d.ts +3 -3
  13. package/lib/types/services/settings.d.ts +2 -2
  14. package/package.json +1 -1
  15. package/src/client/components/PluginHubSection.tsx +13 -7
  16. package/src/client/components/modals/NotificationsModal.tsx +9 -3
  17. package/src/client/components/views/CustomInstallView.tsx +35 -14
  18. package/src/client/components/views/DiagnosticsView.tsx +7 -3
  19. package/src/client/components/views/SettingsView.tsx +20 -33
  20. package/src/client/hooks/useSettings.ts +3 -3
  21. package/src/client/hooks/useTaskQueue.ts +12 -6
  22. package/src/client/locales.ts +31 -15
  23. package/src/client/logic/failures.ts +3 -0
  24. package/src/client/logic/renderMarkdown.ts +9 -5
  25. package/src/client/logic/urls.ts +12 -1
  26. package/src/client/styles/CustomInstallView.module.css +25 -0
  27. package/src/client/styles/Dropdown.module.css +10 -0
  28. package/src/client/styles/Modal.module.css +11 -0
  29. package/src/server/http/routes.ts +9 -4
  30. package/src/server/services/install/install-types.ts +2 -2
  31. package/src/server/services/install/npm-resolve.ts +3 -1
  32. package/src/server/services/install/task-queue.ts +36 -20
  33. package/src/server/services/profile/profile.ts +4 -3
  34. package/src/server/services/settings.ts +3 -3
package/client/client.js CHANGED
@@ -59,13 +59,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
59
59
  gitInstallInvalid: "请输入 GitHub 仓库地址,例如:owner/repo 或 https://github.com/owner/repo",
60
60
  dshCmdLabel: "DeepSeek Harness 命令",
61
61
  dshCmdPlaceholder: "粘贴官方 dsh plugin 命令",
62
- dshCmdExample: "例如:dsh plugin --profile web add github:owner/repo",
63
- dshCmdInvalid: "请输入官方 dsh plugin 安装命令(--profile 必填)。例如:dsh plugin --profile web add github:owner/repo",
62
+ dshCmdInsertHubUpdate: "插入更新命令",
63
+ dshCmdExample: "例如:dsh plugin --profile web add github:owner/repo,或 dsh plugin --profile web update dsh-plugin",
64
+ dshCmdInvalid: "请输入官方 dsh plugin 命令(--profile 必填,支持 add / update)。例如:dsh plugin --profile web update dsh-plugin",
64
65
  installHelp: "帮助",
65
66
  helpModalTitle: "支持的命令格式",
66
67
  npmInstallHelp: "lodash、@scope/pkg 直接输入包名\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli 全局安装 CLI 工具,不进「已安装」列表",
67
68
  gitInstallHelp: "owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git",
68
- dshCmdHelp: "dsh plugin --profile web add <目标>\ndsh plugin --profile=web add <目标>\n --profile 必填,官方 CLI 无 -p 简写;<目标> 可为 npm 包名或 github:owner/repo",
69
+ dshCmdHelp: "dsh plugin --profile web add <目标> 安装\ndsh plugin --profile web update <目标> 更新已安装目标到最新版本\ndsh plugin --profile=web add <目标>\ndsh plugin --profile=web update <目标>\n --profile 必填,官方 CLI 无 -p 简写;<目标> 可为 npm 包名或 github:owner/repo;卸载请用「已安装」列表",
69
70
  globalNpmHint: "将全局安装 CLI 工具(npm install -g),不会出现在「已安装」列表,无需重启宿主",
70
71
  installCliBtn: "安装",
71
72
  channelDisabledHint: "该安装通道已关闭,请在「设置 → 安全信任」中打开开关",
@@ -107,14 +108,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
107
108
  settingsUpdateDesc: "更新检查方式与安装走到的网络通道",
108
109
  settingsCheckOnStart: "启动时检查更新",
109
110
  settingsCheckOnStartDesc: "打开插件中心时检查已安装插件是否有新版,发现更新会提示",
111
+ settingsProxy: "HTTP 代理",
112
+ settingsProxyDesc: "npm / git / 目录数据请求统一走该代理;留空直连",
110
113
  settingsMirror: "npm 镜像源",
111
- settingsMirrorDesc: "npm 安装与版本反查走自定义镜像,网络不佳时更稳定;留空使用官方源",
114
+ settingsMirrorDesc: "默认跟随本机 npm 配置;官方源慢可换国内镜像",
115
+ mirrorNone: "未配置(跟随本机 npm 配置)",
112
116
  mirrorOfficial: "官方源 registry.npmjs.org",
113
117
  mirrorNpmmirror: "阿里云 npmmirror",
114
118
  mirrorTencent: "腾讯云镜像",
115
- mirrorCustom: "自定义镜像源",
116
- settingsProxy: "HTTP 代理",
117
- settingsProxyDesc: "npm / git / 目录数据请求统一走该代理;留空直连",
119
+ mirrorTsinghua: "清华大学 TUNA 镜像",
118
120
  settingsSecurity: "安全信任",
119
121
  settingsSecurityDesc: "命令行安装的三个通道开关:NPM 包、GitHub 源码与 DSH 命令",
120
122
  settingsEnableNpm: "启用 NPM 安装",
@@ -178,6 +180,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
178
180
  logEmptyFilter: "没有符合条件的日志",
179
181
  settingsDiagFail: "不可达",
180
182
  diagNpm: "npm 源",
183
+ diagNpmUnset: "未配置(跟随本机 npm 配置)",
181
184
  diagGithub: "GitHub",
182
185
  diagCatalog: "目录站点",
183
186
  diagOk: "OK",
@@ -226,6 +229,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
226
229
  installNow: "直接安装",
227
230
  installing: "安装中…",
228
231
  installDone: "安装成功",
232
+ updateDone: "更新成功",
229
233
  installResultTitle: "插件安装成功",
230
234
  installResultDesc: "",
231
235
  confirmUpdateTitle: "确认更新",
@@ -265,6 +269,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
265
269
  errorTitle: "操作失败",
266
270
  errorTitleInstall: "安装失败",
267
271
  errorTitleUninstall: "卸载失败",
272
+ errorTitleUpdate: "更新失败",
268
273
  errorPlugin: "插件",
269
274
  errorClose: "知道了",
270
275
  errorCopy: "复制错误信息",
@@ -359,13 +364,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
359
364
  gitInstallInvalid: "Enter a GitHub repository address, e.g. owner/repo or https://github.com/owner/repo",
360
365
  dshCmdLabel: "DeepSeek Harness command",
361
366
  dshCmdPlaceholder: "Paste an official dsh plugin command",
362
- dshCmdExample: "e.g. dsh plugin --profile web add github:owner/repo",
363
- dshCmdInvalid: "Paste an official dsh plugin install command (--profile required), e.g. dsh plugin --profile web add github:owner/repo",
367
+ dshCmdInsertHubUpdate: "Insert update command",
368
+ dshCmdExample: "e.g. dsh plugin --profile web add github:owner/repo, or dsh plugin --profile web update dsh-plugin",
369
+ dshCmdInvalid: "Paste an official dsh plugin command (--profile required, add / update), e.g. dsh plugin --profile web update dsh-plugin",
364
370
  installHelp: "Help",
365
371
  helpModalTitle: "Supported command formats",
366
372
  npmInstallHelp: "lodash or @scope/pkg just type the package name\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli installs the CLI globally, not shown in Installed",
367
373
  gitInstallHelp: "owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git",
368
- dshCmdHelp: "dsh plugin --profile web add <target>\ndsh plugin --profile=web add <target>\n --profile is required and there is no -p shorthand; <target> can be an npm package or github:owner/repo",
374
+ dshCmdHelp: "dsh plugin --profile web add <target> install\ndsh plugin --profile web update <target> update an installed target to the latest version\ndsh plugin --profile=web add <target>\ndsh plugin --profile=web update <target>\n --profile is required and there is no -p shorthand; <target> can be an npm package or github:owner/repo; uninstall from the Installed list",
369
375
  globalNpmHint: "This installs CLI tools globally (npm install -g). They won't appear in Installed and no host restart is needed.",
370
376
  installCliBtn: "Install",
371
377
  channelDisabledHint: "This install channel is disabled — enable it in Settings → Security & Trust",
@@ -409,14 +415,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
409
415
  settingsCheckOnStartDesc: "Check installed plugins for new versions when the hub opens; you will be notified when updates are found",
410
416
  settingsAutoInstall: "Auto-install updates",
411
417
  settingsAutoInstallDesc: "Install detected updates in the background without asking (a host restart applies them)",
412
- settingsMirror: "npm registry mirror",
413
- settingsMirrorDesc: "Route npm installs and lookups through a mirror for unstable networks; leave empty for the official registry",
418
+ settingsProxy: "HTTP proxy",
419
+ settingsProxyDesc: "Route npm, git and catalog requests through this proxy; leave empty to connect directly",
420
+ settingsMirror: "npm mirror",
421
+ settingsMirrorDesc: "Unset by default — follows local npm config; pick a domestic mirror if slow",
422
+ mirrorNone: "Unset (follow local npm config)",
414
423
  mirrorOfficial: "Official registry.npmjs.org",
415
424
  mirrorNpmmirror: "Alibaba npmmirror",
416
425
  mirrorTencent: "Tencent Cloud mirror",
417
- mirrorCustom: "Custom mirror",
418
- settingsProxy: "HTTP proxy",
419
- settingsProxyDesc: "Route npm, git and catalog requests through this proxy; leave empty to connect directly",
426
+ mirrorTsinghua: "Tsinghua TUNA mirror",
420
427
  settingsSecurity: "Security & Trust",
421
428
  settingsSecurityDesc: "Toggles for the three command-line install channels: npm packages, GitHub sources and DSH commands",
422
429
  settingsEnableNpm: "Enable npm installs",
@@ -480,6 +487,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
480
487
  logEmptyFilter: "No matching log entries",
481
488
  settingsDiagFail: "Unreachable",
482
489
  diagNpm: "npm registry",
490
+ diagNpmUnset: "Unset (follow local npm config)",
483
491
  diagGithub: "GitHub",
484
492
  diagCatalog: "Catalog site",
485
493
  diagOk: "OK",
@@ -528,6 +536,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
528
536
  installNow: "Install",
529
537
  installing: "Installing…",
530
538
  installDone: "Installed",
539
+ updateDone: "Updated",
531
540
  installResultTitle: "Plugin installed successfully",
532
541
  installResultDesc: "",
533
542
  confirmUpdateTitle: "Confirm update",
@@ -568,6 +577,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
568
577
  errorTitle: "Operation failed",
569
578
  errorTitleInstall: "Install failed",
570
579
  errorTitleUninstall: "Removal failed",
580
+ errorTitleUpdate: "Update failed",
571
581
  errorPlugin: "Plugin",
572
582
  errorClose: "Got it",
573
583
  errorCopy: "Copy error",
@@ -632,46 +642,46 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
632
642
  css: css$11
633
643
  });
634
644
  var Header_module_css_default = {
635
- "headerTitleRow": "qikqja_headerTitleRow",
636
- "sortGroup": "qikqja_sortGroup",
637
- "segGroup": "qikqja_segGroup",
638
- "segBtn": "qikqja_segBtn",
639
- "tabsRow": "qikqja_tabsRow",
640
- "search": "qikqja_search",
641
- "header": "qikqja_header",
642
- "tabs": "qikqja_tabs",
643
- "copyIcon": "qikqja_copyIcon",
644
645
  "adBanner": "qikqja_adBanner",
646
+ "githubIcon": "qikqja_githubIcon",
647
+ "tabsRow": "qikqja_tabsRow",
645
648
  "segBtnActive": "qikqja_segBtnActive",
646
- "githubLink": "qikqja_githubLink",
647
- "langBtn": "qikqja_langBtn",
648
- "headerRight": "qikqja_headerRight",
649
- "tabActive": "qikqja_tabActive",
649
+ "segBtn": "qikqja_segBtn",
650
650
  "aboutBtn": "qikqja_aboutBtn",
651
+ "version": "qikqja_version",
652
+ "segGroup": "qikqja_segGroup",
653
+ "tabs": "qikqja_tabs",
654
+ "taglineLink": "qikqja_taglineLink",
655
+ "tabCount": "qikqja_tabCount",
656
+ "tagline": "qikqja_tagline",
657
+ "headerTitleRow": "qikqja_headerTitleRow",
651
658
  "resultSeg": "qikqja_resultSeg",
659
+ "adText": "qikqja_adText",
652
660
  "root": "qikqja_root",
661
+ "langBtn": "qikqja_langBtn",
662
+ "sortGroup": "qikqja_sortGroup",
663
+ "adArrow": "qikqja_adArrow",
664
+ "controls": "qikqja_controls",
665
+ "tabActive": "qikqja_tabActive",
653
666
  "adBadge": "qikqja_adBadge",
654
- "tagline": "qikqja_tagline",
655
- "version": "qikqja_version",
656
- "versionBtn": "qikqja_versionBtn",
657
- "logoIcon": "qikqja_logoIcon",
658
667
  "brandTitle": "qikqja_brandTitle",
659
- "searchRow": "qikqja_searchRow",
660
- "githubIcon": "qikqja_githubIcon",
661
- "segLabel": "qikqja_segLabel",
668
+ "resultCount": "qikqja_resultCount",
669
+ "header": "qikqja_header",
670
+ "logoIcon": "qikqja_logoIcon",
671
+ "search": "qikqja_search",
672
+ "headerRight": "qikqja_headerRight",
662
673
  "tab": "qikqja_tab",
663
- "tabCount": "qikqja_tabCount",
674
+ "versionBtn": "qikqja_versionBtn",
664
675
  "hubUpdateBadge": "qikqja_hubUpdateBadge",
665
- "resultCount": "qikqja_resultCount",
666
676
  "title": "qikqja_title",
667
- "taglineLink": "qikqja_taglineLink",
668
- "adText": "qikqja_adText",
669
- "controls": "qikqja_controls",
670
- "adArrow": "qikqja_adArrow"
677
+ "copyIcon": "qikqja_copyIcon",
678
+ "githubLink": "qikqja_githubLink",
679
+ "searchRow": "qikqja_searchRow",
680
+ "segLabel": "qikqja_segLabel"
671
681
  };
672
682
  //#endregion
673
683
  //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
674
- 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_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_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}";
684
+ 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_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=\"250\"]{object-fit:contain;width:250px;height:250px;max-height:250px}.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}";
675
685
  const tagId$10 = "dsh-plugin/Modal.module.css";
676
686
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
677
687
  const tag = document.createElement("style");
@@ -686,134 +696,134 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
686
696
  css: css$10
687
697
  });
688
698
  var Modal_module_css_default = {
689
- "resultCheck": "BiQ1zG_resultCheck",
690
- "dangerConfirm": "BiQ1zG_dangerConfirm",
691
- "detailModal": "BiQ1zG_detailModal",
692
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
693
- "modalLabel": "BiQ1zG_modalLabel",
694
- "toast": "BiQ1zG_toast",
695
- "queueRowHead": "BiQ1zG_queueRowHead",
696
- "queueRowTarget": "BiQ1zG_queueRowTarget",
697
- "queueSection": "BiQ1zG_queueSection",
699
+ "modalCancel": "BiQ1zG_modalCancel",
698
700
  "errorTitle": "BiQ1zG_errorTitle",
699
- "progressTrack": "BiQ1zG_progressTrack",
700
- "failKindUninstall": "BiQ1zG_failKindUninstall",
701
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
702
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
703
- "errorBox": "BiQ1zG_errorBox",
704
- "detailStatusText": "BiQ1zG_detailStatusText",
705
- "errorCopySoft": "BiQ1zG_errorCopySoft",
706
- "failHead": "BiQ1zG_failHead",
707
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
708
- "noticeRowMain": "BiQ1zG_noticeRowMain",
709
- "noticeTextOk": "BiQ1zG_noticeTextOk",
710
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
711
- "progress": "BiQ1zG_progress",
712
- "aboutContent": "BiQ1zG_aboutContent",
713
- "overlayIn": "BiQ1zG_overlayIn",
714
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
701
+ "noticeTime": "BiQ1zG_noticeTime",
702
+ "queueSection": "BiQ1zG_queueSection",
703
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
704
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
705
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
706
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
707
+ "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
708
+ "detailModal": "BiQ1zG_detailModal",
715
709
  "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
716
- "noticeList": "BiQ1zG_noticeList",
717
- "failKindInstall": "BiQ1zG_failKindInstall",
710
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
711
+ "modalWide": "BiQ1zG_modalWide",
718
712
  "modalDesc": "BiQ1zG_modalDesc",
719
713
  "modalLink": "BiQ1zG_modalLink",
720
- "restartNow": "BiQ1zG_restartNow",
721
- "detailDim": "BiQ1zG_detailDim",
722
- "detailMono": "BiQ1zG_detailMono",
723
- "modalWide": "BiQ1zG_modalWide",
724
- "queuedHint": "BiQ1zG_queuedHint",
725
- "failPrepareHint": "BiQ1zG_failPrepareHint",
726
- "overlay": "BiQ1zG_overlay",
727
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
728
- "failedCopyHint": "BiQ1zG_failedCopyHint",
729
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
730
714
  "resultTitle": "BiQ1zG_resultTitle",
731
- "detailArrow": "BiQ1zG_detailArrow",
732
- "noticeHead": "BiQ1zG_noticeHead",
733
- "noticeTextFail": "BiQ1zG_noticeTextFail",
734
- "modalValue": "BiQ1zG_modalValue",
735
- "noticeRowOk": "BiQ1zG_noticeRowOk",
736
- "pendingRowActions": "BiQ1zG_pendingRowActions",
737
- "detailPathActions": "BiQ1zG_detailPathActions",
715
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
716
+ "detailPathBtn": "BiQ1zG_detailPathBtn",
717
+ "errorBox": "BiQ1zG_errorBox",
738
718
  "trustHint": "BiQ1zG_trustHint",
739
- "confirmIconDanger": "BiQ1zG_confirmIconDanger",
740
- "confirmPrimary": "BiQ1zG_confirmPrimary",
741
- "progressText": "BiQ1zG_progressText",
742
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
743
- "failClear": "BiQ1zG_failClear",
744
- "failBigIssue": "BiQ1zG_failBigIssue",
745
- "failRepo": "BiQ1zG_failRepo",
746
- "modalCmd": "BiQ1zG_modalCmd",
747
- "queueRowStatus": "BiQ1zG_queueRowStatus",
748
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
749
- "noticeIgnore": "BiQ1zG_noticeIgnore",
750
- "confirmIconWrap": "BiQ1zG_confirmIconWrap",
751
- "errorHint": "BiQ1zG_errorHint",
752
- "stripCancel": "BiQ1zG_stripCancel",
719
+ "queueRowHead": "BiQ1zG_queueRowHead",
720
+ "failedCopyHint": "BiQ1zG_failedCopyHint",
721
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
722
+ "queueSectionTitle": "BiQ1zG_queueSectionTitle",
723
+ "restartLater": "BiQ1zG_restartLater",
753
724
  "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
754
- "queueRow": "BiQ1zG_queueRow",
755
- "noticeTime": "BiQ1zG_noticeTime",
756
- "helpModal": "BiQ1zG_helpModal",
725
+ "confirmIcon": "BiQ1zG_confirmIcon",
726
+ "toastIn": "BiQ1zG_toastIn",
727
+ "resultCheck": "BiQ1zG_resultCheck",
728
+ "modalInstall": "BiQ1zG_modalInstall",
757
729
  "result": "BiQ1zG_result",
758
- "failCopy": "BiQ1zG_failCopy",
759
- "queueRowTrack": "BiQ1zG_queueRowTrack",
730
+ "noticeMain": "BiQ1zG_noticeMain",
731
+ "confirmIconDanger": "BiQ1zG_confirmIconDanger",
732
+ "detailPath": "BiQ1zG_detailPath",
733
+ "detailLink": "BiQ1zG_detailLink",
760
734
  "resultRestarting": "BiQ1zG_resultRestarting",
761
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
762
- "detailPathText": "BiQ1zG_detailPathText",
763
- "resultDesc": "BiQ1zG_resultDesc",
735
+ "failCopy": "BiQ1zG_failCopy",
736
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
764
737
  "failList": "BiQ1zG_failList",
765
- "aboutModal": "BiQ1zG_aboutModal",
766
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
767
- "progressFill": "BiQ1zG_progressFill",
768
- "aboutMeta": "BiQ1zG_aboutMeta",
769
738
  "modalRow": "BiQ1zG_modalRow",
770
- "noticeRemove": "BiQ1zG_noticeRemove",
771
- "queueRowBody": "BiQ1zG_queueRowBody",
772
- "queueRowPct": "BiQ1zG_queueRowPct",
773
- "detailLink": "BiQ1zG_detailLink",
739
+ "failKindInstall": "BiQ1zG_failKindInstall",
740
+ "modalLabel": "BiQ1zG_modalLabel",
741
+ "queueRowDesc": "BiQ1zG_queueRowDesc",
742
+ "detailRow": "BiQ1zG_detailRow",
743
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
744
+ "logModal": "BiQ1zG_logModal",
745
+ "linkIcon": "BiQ1zG_linkIcon",
746
+ "aboutContent": "BiQ1zG_aboutContent",
747
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
748
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
749
+ "detailPathText": "BiQ1zG_detailPathText",
750
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
751
+ "detailStars": "BiQ1zG_detailStars",
752
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
753
+ "detailStatusText": "BiQ1zG_detailStatusText",
754
+ "confirmPrimary": "BiQ1zG_confirmPrimary",
774
755
  "modalClose": "BiQ1zG_modalClose",
775
- "noticeRow": "BiQ1zG_noticeRow",
776
- "modalBody": "BiQ1zG_modalBody",
756
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
757
+ "dangerConfirm": "BiQ1zG_dangerConfirm",
758
+ "errorModal": "BiQ1zG_errorModal",
759
+ "modalActions": "BiQ1zG_modalActions",
760
+ "detailMono": "BiQ1zG_detailMono",
761
+ "failRepo": "BiQ1zG_failRepo",
762
+ "detailPathActions": "BiQ1zG_detailPathActions",
763
+ "failKind": "BiQ1zG_failKind",
764
+ "modalValue": "BiQ1zG_modalValue",
777
765
  "toastFail": "BiQ1zG_toastFail",
778
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
779
- "noticeFoot": "BiQ1zG_noticeFoot",
780
- "detailGrid": "BiQ1zG_detailGrid",
781
- "detailRow": "BiQ1zG_detailRow",
782
- "modalCopy": "BiQ1zG_modalCopy",
783
- "restartLater": "BiQ1zG_restartLater",
784
- "progressHead": "BiQ1zG_progressHead",
785
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
786
- "queueRowDesc": "BiQ1zG_queueRowDesc",
766
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
767
+ "queuedHint": "BiQ1zG_queuedHint",
768
+ "detailDim": "BiQ1zG_detailDim",
769
+ "queueRowPct": "BiQ1zG_queueRowPct",
770
+ "noticeHead": "BiQ1zG_noticeHead",
771
+ "noticeVersion": "BiQ1zG_noticeVersion",
787
772
  "progressFillFail": "BiQ1zG_progressFillFail",
788
- "modalTitle": "BiQ1zG_modalTitle",
789
- "modal": "BiQ1zG_modal",
790
- "errorModal": "BiQ1zG_errorModal",
773
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
774
+ "modalIn": "BiQ1zG_modalIn",
791
775
  "modalHead": "BiQ1zG_modalHead",
792
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
793
- "noticeMain": "BiQ1zG_noticeMain",
794
- "failEmpty": "BiQ1zG_failEmpty",
795
- "confirmIcon": "BiQ1zG_confirmIcon",
796
- "detailValue": "BiQ1zG_detailValue",
797
- "detailPathBtn": "BiQ1zG_detailPathBtn",
776
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
777
+ "progressHead": "BiQ1zG_progressHead",
778
+ "progressTrack": "BiQ1zG_progressTrack",
779
+ "stripCancel": "BiQ1zG_stripCancel",
780
+ "aboutModal": "BiQ1zG_aboutModal",
781
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
782
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
783
+ "modal": "BiQ1zG_modal",
784
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
785
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
786
+ "detailArrow": "BiQ1zG_detailArrow",
787
+ "progressFill": "BiQ1zG_progressFill",
788
+ "confirmIconWrap": "BiQ1zG_confirmIconWrap",
789
+ "modalBody": "BiQ1zG_modalBody",
790
+ "noticeRemove": "BiQ1zG_noticeRemove",
791
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
792
+ "detailGrid": "BiQ1zG_detailGrid",
793
+ "overlay": "BiQ1zG_overlay",
794
+ "failRow": "BiQ1zG_failRow",
795
+ "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
796
+ "aboutMeta": "BiQ1zG_aboutMeta",
798
797
  "detailLabel": "BiQ1zG_detailLabel",
799
- "detailStatusPending": "BiQ1zG_detailStatusPending",
798
+ "noticeRow": "BiQ1zG_noticeRow",
799
+ "progress": "BiQ1zG_progress",
800
+ "detailValue": "BiQ1zG_detailValue",
801
+ "modalTitle": "BiQ1zG_modalTitle",
802
+ "modalCopy": "BiQ1zG_modalCopy",
803
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
804
+ "progressText": "BiQ1zG_progressText",
805
+ "failHead": "BiQ1zG_failHead",
806
+ "helpModal": "BiQ1zG_helpModal",
807
+ "toast": "BiQ1zG_toast",
808
+ "queueRowBody": "BiQ1zG_queueRowBody",
800
809
  "modalCmdText": "BiQ1zG_modalCmdText",
801
- "logModal": "BiQ1zG_logModal",
802
- "modalInstall": "BiQ1zG_modalInstall",
803
- "restartNowWarning": "BiQ1zG_restartNowWarning",
804
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
805
- "failRow": "BiQ1zG_failRow",
806
- "noticeVersion": "BiQ1zG_noticeVersion",
807
- "modalCancel": "BiQ1zG_modalCancel",
808
- "linkIcon": "BiQ1zG_linkIcon",
809
- "failKind": "BiQ1zG_failKind",
810
- "modalIn": "BiQ1zG_modalIn",
811
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
812
- "toastIn": "BiQ1zG_toastIn",
813
- "detailPath": "BiQ1zG_detailPath",
814
- "modalActions": "BiQ1zG_modalActions",
815
- "detailStars": "BiQ1zG_detailStars",
816
- "resultCheckIcon": "BiQ1zG_resultCheckIcon"
810
+ "restartNow": "BiQ1zG_restartNow",
811
+ "noticeList": "BiQ1zG_noticeList",
812
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
813
+ "overlayIn": "BiQ1zG_overlayIn",
814
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
815
+ "queueRow": "BiQ1zG_queueRow",
816
+ "resultDesc": "BiQ1zG_resultDesc",
817
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
818
+ "errorHint": "BiQ1zG_errorHint",
819
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
820
+ "failClear": "BiQ1zG_failClear",
821
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
822
+ "failEmpty": "BiQ1zG_failEmpty",
823
+ "modalCmd": "BiQ1zG_modalCmd",
824
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
825
+ "noticeFoot": "BiQ1zG_noticeFoot",
826
+ "failBigIssue": "BiQ1zG_failBigIssue"
817
827
  };
818
828
  //#endregion
819
829
  //#region src/client/logic/install-command.ts
@@ -822,7 +832,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
822
832
  * (走 npm registry tarball,更快、与 GitHub 网络无关);无 npm 包名 → git 直装。
823
833
  * 返回值 target 即传给后端 /install 的安装目标(npm 包名 或 owner/repo)。
824
834
  */
825
- function installTargetOf$1(p) {
835
+ function installTargetOf(p) {
826
836
  const pkg = (p.source?.npmPackage ?? "").trim();
827
837
  const repo = (p.source?.repo ?? "").trim();
828
838
  if (pkg && repo) return {
@@ -838,7 +848,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
838
848
  * 需专属 profile(--profile dsh-tui),无法从 repo/npm 包名推断,必须用官方命令);
839
849
  * 常规插件无目录命令时按通道回退生成:npm 显示包名,git 显示显式 HTTPS URL。 */
840
850
  function installCommandOf(p, withProfile = false) {
841
- const { target, via } = installTargetOf$1(p);
851
+ const { target, via } = installTargetOf(p);
842
852
  if (via === "npm") {
843
853
  const cmd = p.install?.command;
844
854
  if (cmd) return cmd;
@@ -883,7 +893,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
883
893
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
884
894
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
885
895
  */
886
- const PLUGIN_VERSION = "1.3.4";
896
+ const PLUGIN_VERSION = "1.3.6";
887
897
  const CATEGORY_ORDER = [
888
898
  "interface",
889
899
  "session",
@@ -1516,7 +1526,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1516
1526
  */
1517
1527
  const hubHasUpdate = (() => {
1518
1528
  if (!hubUpdateInfo) return false;
1519
- return hubUpdateInfo.version !== "1.3.4";
1529
+ return hubUpdateInfo.version !== "1.3.6";
1520
1530
  })();
1521
1531
  (0, react.useMemo)(() => {
1522
1532
  if (!plugins) return [];
@@ -1783,6 +1793,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1783
1793
  function pluginSiteUrl(repo) {
1784
1794
  return `${SITE_URL}plugins/${repo}`;
1785
1795
  }
1796
+ /** 根据实际执行的命令判定失败动作标签(安装/更新/卸载):
1797
+ * 命令形如 `dsh plugin --profile web add|update|remove <target>`,
1798
+ * 出现 remove/update 动词即对应归类,其余(add、全局 npm 命令、未知)一律算安装。 */
1799
+ function actionLabelOf(command) {
1800
+ if (command && /\s+remove\s+/i.test(command)) return "Remove";
1801
+ if (command && /\s+update\s+/i.test(command)) return "Update";
1802
+ return "Install";
1803
+ }
1786
1804
  /**
1787
1805
  * 一键反馈 GitHub Issue 的预填链接:标题带「来自 dsh-plugin.org」标识,正文只带
1788
1806
  * 核心信息 —— 原因判定 + 关键错误代码 + 尝试过的安装方式 + 宿主机器环境快照 +
@@ -1793,7 +1811,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1793
1811
  * 组织 scope 与 GitHub 用户名不一致时也能直接指认正确的 npm 包名。
1794
1812
  */
1795
1813
  function pluginIssueUrl(repo, message, env, command, attempts) {
1796
- const title = `[dsh-plugin.org | dsh-plugin-hub] Install/Remove failed: ${repo}`;
1814
+ const title = `[dsh-plugin.org | dsh-plugin-hub] ${actionLabelOf(command)} failed: ${repo}`;
1797
1815
  const kind = classifyFailure(message);
1798
1816
  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 === "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";
1799
1817
  const code = coreErrorCode(message);
@@ -1901,8 +1919,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1901
1919
  */
1902
1920
  const DEFAULT_SETTINGS = {
1903
1921
  checkUpdatesOnStart: true,
1904
- npmRegistry: "",
1905
1922
  proxy: "",
1923
+ npmRegistry: "",
1906
1924
  enableNpmInstall: true,
1907
1925
  enableGitInstall: true,
1908
1926
  enableDshInstall: true,
@@ -2088,11 +2106,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2088
2106
  desc: q.desc,
2089
2107
  version: q.version
2090
2108
  });
2091
- onInstallDone(modalTaskRef.current === q.id, q.repo, q.needsRestart);
2109
+ onInstallDone(modalTaskRef.current === q.id, q.repo, q.needsRestart, q.action === "update");
2092
2110
  }
2093
2111
  } else {
2094
2112
  const detail = lines.length > 0 ? [...lines].reverse().join("\n") : q.kind === "uninstall" ? t("uninstallFail") : t("installFail");
2095
- onError(detail, q.repo, q.kind, q.command, q.attempts);
2113
+ onError(detail, q.repo, q.kind, q.command, q.attempts, q.action === "update");
2096
2114
  }
2097
2115
  maybeStopPoll();
2098
2116
  };
@@ -2230,6 +2248,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2230
2248
  kind: isRemove ? "uninstall" : "install",
2231
2249
  target: isRemove ? fallback : display || fallback,
2232
2250
  repo: isRemove ? null : display || fallback,
2251
+ action: a.action === "add" || a.action === "update" || a.action === "remove" ? a.action : "add",
2233
2252
  status: a.status === "running" ? "running" : "pending",
2234
2253
  progress: typeof a.progress === "number" ? a.progress : 0,
2235
2254
  lines: Array.isArray(a.lines) ? a.lines : [],
@@ -2272,6 +2291,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2272
2291
  lines: [],
2273
2292
  optimistic: true,
2274
2293
  command: input.command,
2294
+ action: input.update ? "update" : "add",
2275
2295
  attempts: [],
2276
2296
  needsRestart: true
2277
2297
  }]);
@@ -2323,7 +2343,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2323
2343
  const installNow = async (p, opts) => {
2324
2344
  const repo = p.source?.repo ?? "";
2325
2345
  if (!repo) return;
2326
- const { target } = installTargetOf$1(p);
2346
+ const { target } = installTargetOf(p);
2327
2347
  if (!target) return;
2328
2348
  await submitInstall({
2329
2349
  target,
@@ -3236,7 +3256,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3236
3256
  codeSpans.push(String(code));
3237
3257
  return `\u0000${codeSpans.length - 1}\u0000`;
3238
3258
  });
3239
- out = out.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (m, alt, url) => /^https?:\/\//i.test(String(url)) && !/[\u0000]/.test(String(url)) ? `<img src="${String(url)}" alt="${String(alt)}" loading="lazy">` : m);
3259
+ out = out.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (m, alt, url) => {
3260
+ const src = String(url);
3261
+ if (!/^https?:\/\//i.test(src) || /[\u0000]/.test(src)) return m;
3262
+ if (/\/dsh-plugin-user-group-qr-[^/]*$/i.test(src)) return `<img src="${src}" alt="${String(alt)}" width="250" height="250" loading="lazy">`;
3263
+ return `<img src="${src}" alt="${String(alt)}" loading="lazy">`;
3264
+ });
3240
3265
  out = out.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (m, text, url) => /^https?:\/\//i.test(String(url)) && !/[\u0000]/.test(String(url)) ? `<a href="${String(url)}" target="_blank" rel="noopener noreferrer">${String(text)}</a>` : m);
3241
3266
  out = out.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
3242
3267
  out = out.replace(/(^|[^*])\*([^*]+)\*/g, "$1<em>$2</em>");
@@ -3641,7 +3666,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3641
3666
  onClick: () => onUpdate(r.repo),
3642
3667
  title: t("updateNoticeGo")
3643
3668
  } : {}
3644
- }, (0, react.createElement)("div", { className: Modal_module_css_default.noticeRowMain }, (0, react.createElement)("div", { className: r.ok ? Modal_module_css_default.noticeBadgeOk : Modal_module_css_default.noticeBadgeFail }, (0, react.createElement)(BadgeGlyph, { ok: r.ok })), (0, react.createElement)("div", { className: Modal_module_css_default.noticeMain }, (0, react.createElement)("div", { className: Modal_module_css_default.noticeHead }, (0, react.createElement)("span", { className: r.ok ? Modal_module_css_default.noticeTextOk : Modal_module_css_default.noticeTextFail }, r.ok ? isUpdate ? t("updateNoticeTitle") : r.kind === "install" ? t("installDone") : t("uninstallDone") : r.kind === "install" ? t("errorTitleInstall") : t("errorTitleUninstall")), isUpdate && r.version ? (0, react.createElement)("span", {
3669
+ }, (0, react.createElement)("div", { className: Modal_module_css_default.noticeRowMain }, (0, react.createElement)("div", { className: r.ok ? Modal_module_css_default.noticeBadgeOk : Modal_module_css_default.noticeBadgeFail }, (0, react.createElement)(BadgeGlyph, { ok: r.ok })), (0, react.createElement)("div", { className: Modal_module_css_default.noticeMain }, (0, react.createElement)("div", { className: Modal_module_css_default.noticeHead }, (0, react.createElement)("span", { className: r.ok ? Modal_module_css_default.noticeTextOk : Modal_module_css_default.noticeTextFail }, r.ok ? isUpdate ? t("updateNoticeTitle") : r.action === "update" ? t("updateDone") : r.kind === "install" ? t("installDone") : t("uninstallDone") : r.action === "update" ? t("errorTitleUpdate") : r.kind === "install" ? t("errorTitleInstall") : t("errorTitleUninstall")), isUpdate && r.version ? (0, react.createElement)("span", {
3645
3670
  className: Modal_module_css_default.noticeVersion,
3646
3671
  title: r.version
3647
3672
  }, `v${r.version}`) : null, r.repo ? isUpdate ? (0, react.createElement)("span", {
@@ -3653,7 +3678,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3653
3678
  target: "_blank",
3654
3679
  rel: "noopener noreferrer",
3655
3680
  title: shownRepo
3656
- }, shownRepo) : null : null, !r.ok && (0, react.createElement)("button", {
3681
+ }, shownRepo) : (0, react.createElement)("span", {
3682
+ className: Modal_module_css_default.failRepo,
3683
+ title: r.repo
3684
+ }, r.repo) : null, !r.ok && (0, react.createElement)("button", {
3657
3685
  className: Modal_module_css_default.failCopy,
3658
3686
  onClick: () => onCopy(r.message)
3659
3687
  }, t("failCopy")), r.ok ? (0, react.createElement)("span", {
@@ -3879,38 +3907,38 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3879
3907
  css: css$9
3880
3908
  });
3881
3909
  var List_module_css_default = {
3882
- "desc": "_3XaZHa_desc",
3883
- "cardHead": "_3XaZHa_cardHead",
3884
- "moreSentinel": "_3XaZHa_moreSentinel",
3885
- "cardTitle": "_3XaZHa_cardTitle",
3886
- "installBtn": "_3XaZHa_installBtn",
3887
- "stateTitle": "_3XaZHa_stateTitle",
3888
- "retryBtn": "_3XaZHa_retryBtn",
3889
3910
  "cardSide": "_3XaZHa_cardSide",
3890
- "footLink": "_3XaZHa_footLink",
3891
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3892
- "categoryBadge": "_3XaZHa_categoryBadge",
3893
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3894
- "cardMain": "_3XaZHa_cardMain",
3895
- "verified": "_3XaZHa_verified",
3896
- "topic": "_3XaZHa_topic",
3897
3911
  "card": "_3XaZHa_card",
3912
+ "actions": "_3XaZHa_actions",
3913
+ "topics": "_3XaZHa_topics",
3914
+ "cardMain": "_3XaZHa_cardMain",
3898
3915
  "body": "_3XaZHa_body",
3899
- "fork": "_3XaZHa_fork",
3900
3916
  "list": "_3XaZHa_list",
3917
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3918
+ "footer": "_3XaZHa_footer",
3919
+ "cardTitle": "_3XaZHa_cardTitle",
3920
+ "retryBtn": "_3XaZHa_retryBtn",
3901
3921
  "uninstallBtn": "_3XaZHa_uninstallBtn",
3902
- "stats": "_3XaZHa_stats",
3903
- "state": "_3XaZHa_state",
3904
- "stateDesc": "_3XaZHa_stateDesc",
3905
- "updateBadge": "_3XaZHa_updateBadge",
3922
+ "date": "_3XaZHa_date",
3923
+ "topic": "_3XaZHa_topic",
3924
+ "fork": "_3XaZHa_fork",
3925
+ "categoryBadge": "_3XaZHa_categoryBadge",
3906
3926
  "versionBadge": "_3XaZHa_versionBadge",
3907
- "topics": "_3XaZHa_topics",
3908
- "star": "_3XaZHa_star",
3909
- "actions": "_3XaZHa_actions",
3910
- "footer": "_3XaZHa_footer",
3911
- "installBtnCopied": "_3XaZHa_installBtnCopied",
3927
+ "installBtn": "_3XaZHa_installBtn",
3912
3928
  "detailBtn": "_3XaZHa_detailBtn",
3913
- "date": "_3XaZHa_date"
3929
+ "desc": "_3XaZHa_desc",
3930
+ "verified": "_3XaZHa_verified",
3931
+ "star": "_3XaZHa_star",
3932
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3933
+ "stateDesc": "_3XaZHa_stateDesc",
3934
+ "footLink": "_3XaZHa_footLink",
3935
+ "state": "_3XaZHa_state",
3936
+ "moreSentinel": "_3XaZHa_moreSentinel",
3937
+ "updateBadge": "_3XaZHa_updateBadge",
3938
+ "stats": "_3XaZHa_stats",
3939
+ "stateTitle": "_3XaZHa_stateTitle",
3940
+ "cardHead": "_3XaZHa_cardHead",
3941
+ "installBtnCopied": "_3XaZHa_installBtnCopied"
3914
3942
  };
3915
3943
  //#endregion
3916
3944
  //#region src/client/hooks/useIncrementalList.ts
@@ -4112,15 +4140,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4112
4140
  css: css$8
4113
4141
  });
4114
4142
  var SectionTabs_module_css_default = {
4115
- "root": "_7tvizq_root",
4143
+ "tabCount": "_7tvizq_tabCount",
4144
+ "tabActive": "_7tvizq_tabActive",
4116
4145
  "tabIcon": "_7tvizq_tabIcon",
4117
- "noticeBtn": "_7tvizq_noticeBtn",
4118
4146
  "noticeIcon": "_7tvizq_noticeIcon",
4119
- "tabActive": "_7tvizq_tabActive",
4120
- "tabCount": "_7tvizq_tabCount",
4147
+ "noticeBtn": "_7tvizq_noticeBtn",
4148
+ "noticeCount": "_7tvizq_noticeCount",
4149
+ "root": "_7tvizq_root",
4121
4150
  "tab": "_7tvizq_tab",
4122
- "tabCountActive": "_7tvizq_tabCountActive",
4123
- "noticeCount": "_7tvizq_noticeCount"
4151
+ "tabCountActive": "_7tvizq_tabCountActive"
4124
4152
  };
4125
4153
  //#endregion
4126
4154
  //#region src/client/components/layout/SectionTabs.tsx
@@ -4197,42 +4225,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4197
4225
  css: css$7
4198
4226
  });
4199
4227
  var InstalledView_module_css_default = {
4200
- "root": "_1nXeGW_root",
4201
- "empty": "_1nXeGW_empty",
4202
- "segGroup": "_1nXeGW_segGroup",
4203
- "toolbar": "_1nXeGW_toolbar",
4204
- "statusDot": "_1nXeGW_statusDot",
4228
+ "segBtn": "_1nXeGW_segBtn",
4205
4229
  "list": "_1nXeGW_list",
4230
+ "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4231
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4232
+ "rowUpdate": "_1nXeGW_rowUpdate",
4206
4233
  "segBtnActive": "_1nXeGW_segBtnActive",
4234
+ "statusInactive": "_1nXeGW_statusInactive",
4235
+ "rowCategory": "_1nXeGW_rowCategory",
4207
4236
  "emptyDesc": "_1nXeGW_emptyDesc",
4208
- "rowSourceTag": "_1nXeGW_rowSourceTag",
4209
- "searchInput": "_1nXeGW_searchInput",
4210
- "segBtn": "_1nXeGW_segBtn",
4211
- "emptyTitle": "_1nXeGW_emptyTitle",
4237
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
4238
+ "segLabel": "_1nXeGW_segLabel",
4212
4239
  "row": "_1nXeGW_row",
4213
- "exampleBadge": "_1nXeGW_exampleBadge",
4240
+ "statusDot": "_1nXeGW_statusDot",
4241
+ "rowMeta": "_1nXeGW_rowMeta",
4242
+ "searchInput": "_1nXeGW_searchInput",
4243
+ "updateBadge": "_1nXeGW_updateBadge",
4244
+ "searchWrap": "_1nXeGW_searchWrap",
4245
+ "root": "_1nXeGW_root",
4246
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
4214
4247
  "exampleRow": "_1nXeGW_exampleRow",
4215
- "rowTitleLine": "_1nXeGW_rowTitleLine",
4216
- "rowRestart": "_1nXeGW_rowRestart",
4217
- "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4218
- "rowRepo": "_1nXeGW_rowRepo",
4219
- "segRow": "_1nXeGW_segRow",
4220
4248
  "rowDesc": "_1nXeGW_rowDesc",
4221
- "updateBadge": "_1nXeGW_updateBadge",
4249
+ "segRow": "_1nXeGW_segRow",
4250
+ "emptyTitle": "_1nXeGW_emptyTitle",
4222
4251
  "rowActions": "_1nXeGW_rowActions",
4223
- "statusPending": "_1nXeGW_statusPending",
4224
- "searchWrap": "_1nXeGW_searchWrap",
4225
- "rowDetail": "_1nXeGW_rowDetail",
4226
- "statusInactive": "_1nXeGW_statusInactive",
4227
4252
  "versionBadge": "_1nXeGW_versionBadge",
4228
- "rowCategory": "_1nXeGW_rowCategory",
4229
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4230
- "rowMeta": "_1nXeGW_rowMeta",
4231
- "rowUninstall": "_1nXeGW_rowUninstall",
4232
- "segLabel": "_1nXeGW_segLabel",
4253
+ "segGroup": "_1nXeGW_segGroup",
4254
+ "statusPending": "_1nXeGW_statusPending",
4233
4255
  "rowTitle": "_1nXeGW_rowTitle",
4234
- "rowUpdate": "_1nXeGW_rowUpdate",
4235
- "rowMain": "_1nXeGW_rowMain"
4256
+ "exampleBadge": "_1nXeGW_exampleBadge",
4257
+ "empty": "_1nXeGW_empty",
4258
+ "rowRepo": "_1nXeGW_rowRepo",
4259
+ "rowRestart": "_1nXeGW_rowRestart",
4260
+ "rowMain": "_1nXeGW_rowMain",
4261
+ "rowUninstall": "_1nXeGW_rowUninstall",
4262
+ "toolbar": "_1nXeGW_toolbar",
4263
+ "rowDetail": "_1nXeGW_rowDetail"
4236
4264
  };
4237
4265
  //#endregion
4238
4266
  //#region src/client/components/views/InstalledView.tsx
@@ -4463,7 +4491,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4463
4491
  }
4464
4492
  //#endregion
4465
4493
  //#region \0dsh-css:src/client/styles/CustomInstallView.module.css.mjs
4466
- const css$6 = ".zISxCG_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.zISxCG_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.zISxCG_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.zISxCG_installCard{background:var(--hub-bg-1);border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;gap:8px;min-width:0;padding:10px 12px;display:flex}.zISxCG_installCardHead{align-items:center;min-width:0;display:flex}.zISxCG_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.zISxCG_installHelpBtn{width:18px;height:18px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-left:6px;padding:0;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.zISxCG_installHelpBtn:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft)}.zISxCG_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.zISxCG_installRow{align-items:center;gap:8px;min-width:0;display:flex}.zISxCG_installInput{min-width:0;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;flex:auto;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.zISxCG_installInput::placeholder{color:var(--hub-text-tertiary)}.zISxCG_installInput:focus{border-color:var(--hub-brand)}.zISxCG_installInputError,.zISxCG_installInputError:focus{border-color:var(--hub-danger-text)}.zISxCG_installBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;flex-shrink:0;padding:5px 14px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,opacity .12s}.zISxCG_installBtn:hover{background:var(--hub-brand-hover)}.zISxCG_installBtn:disabled{opacity:.45;cursor:default}.zISxCG_installCardDisabled{opacity:.8}.zISxCG_channelOff{min-width:0;color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:12px;line-height:16px;display:flex}.zISxCG_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.zISxCG_channelOffBtn{color:var(--hub-warn-strong);border:1px solid var(--hub-warn-border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,color .12s}.zISxCG_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.zISxCG_installError{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;padding:5px 8px;font-size:12px;line-height:16px}.zISxCG_helpBody{flex-direction:column;gap:7px;padding:4px 2px;display:flex}.zISxCG_helpLine{align-items:baseline;gap:12px;min-width:0;font-size:12px;line-height:20px;display:flex}.zISxCG_helpCmd{color:var(--hub-text-primary);white-space:nowrap;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.zISxCG_helpNote{min-width:0;color:var(--hub-text-tertiary);font-size:11px}";
4494
+ const css$6 = ".zISxCG_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.zISxCG_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.zISxCG_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.zISxCG_installCard{background:var(--hub-bg-1);border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;gap:8px;min-width:0;padding:10px 12px;display:flex}.zISxCG_installCardHead{align-items:center;min-width:0;display:flex}.zISxCG_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.zISxCG_installHelpBtn{width:18px;height:18px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-left:6px;padding:0;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.zISxCG_installHelpBtn:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft)}.zISxCG_installInsertBtn{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;flex-shrink:0;margin-left:auto;padding:2px 9px;font-family:inherit;font-size:11px;font-weight:500;line-height:16px;transition:color .12s,border-color .12s,background .12s}.zISxCG_installInsertBtn:hover{color:var(--hub-brand);border-color:var(--hub-brand-border-soft);background:var(--hub-brand-tint)}.zISxCG_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.zISxCG_installRow{align-items:center;gap:8px;min-width:0;display:flex}.zISxCG_installInput{min-width:0;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;flex:auto;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.zISxCG_installInput::placeholder{color:var(--hub-text-tertiary)}.zISxCG_installInput:focus{border-color:var(--hub-brand)}.zISxCG_installInputError,.zISxCG_installInputError:focus{border-color:var(--hub-danger-text)}.zISxCG_installBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;flex-shrink:0;padding:5px 14px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,opacity .12s}.zISxCG_installBtn:hover{background:var(--hub-brand-hover)}.zISxCG_installBtn:disabled{opacity:.45;cursor:default}.zISxCG_installCardDisabled{opacity:.8}.zISxCG_channelOff{min-width:0;color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:12px;line-height:16px;display:flex}.zISxCG_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.zISxCG_channelOffBtn{color:var(--hub-warn-strong);border:1px solid var(--hub-warn-border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,color .12s}.zISxCG_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.zISxCG_installError{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;padding:5px 8px;font-size:12px;line-height:16px}.zISxCG_helpBody{flex-direction:column;gap:7px;padding:4px 2px;display:flex}.zISxCG_helpLine{align-items:baseline;gap:12px;min-width:0;font-size:12px;line-height:20px;display:flex}.zISxCG_helpCmd{color:var(--hub-text-primary);white-space:nowrap;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.zISxCG_helpNote{min-width:0;color:var(--hub-text-tertiary);font-size:11px}";
4467
4495
  const tagId$6 = "dsh-plugin/CustomInstallView.module.css";
4468
4496
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
4469
4497
  const tag = document.createElement("style");
@@ -4478,27 +4506,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4478
4506
  css: css$6
4479
4507
  });
4480
4508
  var CustomInstallView_module_css_default = {
4481
- "installError": "zISxCG_installError",
4482
- "installInputError": "zISxCG_installInputError",
4509
+ "installInput": "zISxCG_installInput",
4510
+ "installExample": "zISxCG_installExample",
4511
+ "desc": "zISxCG_desc",
4483
4512
  "installCards": "zISxCG_installCards",
4513
+ "installInsertBtn": "zISxCG_installInsertBtn",
4484
4514
  "helpNote": "zISxCG_helpNote",
4485
- "installBtn": "zISxCG_installBtn",
4486
- "installExample": "zISxCG_installExample",
4487
- "installCardDisabled": "zISxCG_installCardDisabled",
4515
+ "installLabel": "zISxCG_installLabel",
4488
4516
  "channelOffText": "zISxCG_channelOffText",
4489
4517
  "channelOffBtn": "zISxCG_channelOffBtn",
4490
4518
  "helpLine": "zISxCG_helpLine",
4519
+ "installCardDisabled": "zISxCG_installCardDisabled",
4491
4520
  "root": "zISxCG_root",
4492
4521
  "channelOff": "zISxCG_channelOff",
4493
- "installLabel": "zISxCG_installLabel",
4494
- "installInput": "zISxCG_installInput",
4495
- "installCardHead": "zISxCG_installCardHead",
4496
4522
  "helpBody": "zISxCG_helpBody",
4497
- "installCard": "zISxCG_installCard",
4498
- "installRow": "zISxCG_installRow",
4499
- "desc": "zISxCG_desc",
4523
+ "installCardHead": "zISxCG_installCardHead",
4500
4524
  "installHelpBtn": "zISxCG_installHelpBtn",
4501
- "helpCmd": "zISxCG_helpCmd"
4525
+ "installRow": "zISxCG_installRow",
4526
+ "installBtn": "zISxCG_installBtn",
4527
+ "helpCmd": "zISxCG_helpCmd",
4528
+ "installInputError": "zISxCG_installInputError",
4529
+ "installCard": "zISxCG_installCard",
4530
+ "installError": "zISxCG_installError"
4502
4531
  };
4503
4532
  //#endregion
4504
4533
  //#region src/client/components/views/CustomInstallView.tsx
@@ -4526,20 +4555,27 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4526
4555
  const GITHUB_BARE_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
4527
4556
  /** npm 包名(含 @scope/pkg) */
4528
4557
  const NPM_PACKAGE_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/;
4529
- /** DSH 命令行前缀(官方唯一形式 `dsh plugin --profile <name> add <target>`)—— 提取其中的安装目标。
4558
+ /** DSH 命令行前缀(官方唯一形式 `dsh plugin --profile <name> <add|update> <target>`)—— 提取其中的动作与目标。
4530
4559
  * 官方 CLI(apps/cli/src/args.ts,commander):--profile 为必填长选项(无 -p 简写,省略即报错),
4531
- * 支持 `--profile=<name>` 等号形式;命令大小写不敏感。与 server 端 installTargetOf 口径一致。 */
4532
- const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+--profile(?:\s+|=)\S+\s+add\s+(.+)$/i;
4560
+ * 支持 `--profile=<name>` 等号形式;命令大小写不敏感。update = 已安装目标覆盖更新到最新;
4561
+ * remove 不走这里(卸载由「已安装」列表的卸载按钮执行,命令框不认卸载动词)。
4562
+ * 与 server 端 installTargetOf 口径一致。 */
4563
+ const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+--profile(?:\s+|=)\S+\s+(add|update)\s+(.+)$/i;
4533
4564
  /** npm 全局安装命令(官方 README 格式,如 `npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui`)——
4534
4565
  * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 口径一致。 */
4535
4566
  const NPM_GLOBAL_CMD_RE = /^npm\s+(?:install|i)\s+(?:-g|--global)\s+(.+)$/i;
4536
4567
  /** 常规 npm/pnpm 安装命令(装进当前 profile,如 `npm install lodash`、`pnpm add @scope/pkg`)——
4537
4568
  * 提取命令后的包列表;包列表在 splitPackages 里逐个校验。 */
4538
4569
  const NPM_INSTALL_CMD_RE = /^(?:npm\s+(?:install|i)|pnpm\s+(?:add|i|install))\s+(.+)$/i;
4539
- function installTargetOf(raw) {
4570
+ /** 解析 DSH 命令:返回 { action, target };非官方命令返回 null(交给格式错误提示)。 */
4571
+ function parseDshCommand(raw) {
4540
4572
  const input = raw.trim();
4541
4573
  const match = DSH_PLUGIN_CMD_RE.exec(input);
4542
- return match !== null ? match[1].trim() : input;
4574
+ if (match === null) return null;
4575
+ return {
4576
+ action: match[1].toLowerCase(),
4577
+ target: match[2].trim()
4578
+ };
4543
4579
  }
4544
4580
  /** 空格分隔的包列表:逐个按 npm 包名语法校验 + 拒绝以 - 开头的 token(npm 会把 --xxx 当参数而非包名),
4545
4581
  * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同口径。 */
@@ -4578,9 +4614,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4578
4614
  const input = raw.trim();
4579
4615
  return GITHUB_URL_RE.test(input) || GITHUB_BARE_RE.test(input);
4580
4616
  }
4581
- function isDshCommand(raw) {
4582
- return DSH_PLUGIN_CMD_RE.test(raw.trim());
4583
- }
4584
4617
  /** 卡片标题旁的「帮助」弹窗:三块卡片各自的标题与格式清单语言包 key。 */
4585
4618
  const HELP_CARDS = {
4586
4619
  npm: {
@@ -4596,7 +4629,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4596
4629
  contentKey: "dshCmdHelp"
4597
4630
  }
4598
4631
  };
4599
- function CustomInstallView({ t, onInstallCustom, enableNpm, enableGit, enableDsh, onOpenSettings }) {
4632
+ function CustomInstallView({ t, onInstallCustom, enableNpm, enableGit, enableDsh, onOpenSettings, profile }) {
4600
4633
  /** 自定义安装:NPM 包输入与格式错误('' = 无错误) */
4601
4634
  const [npmQuery, setNpmQuery] = (0, react.useState)("");
4602
4635
  const [npmError, setNpmError] = (0, react.useState)("");
@@ -4641,14 +4674,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4641
4674
  const submitCmd = () => {
4642
4675
  const raw = cmdQuery.trim();
4643
4676
  if (!raw) return;
4644
- if (!isDshCommand(raw)) {
4677
+ const parsed = parseDshCommand(raw);
4678
+ if (parsed === null) {
4645
4679
  setCmdError(t("dshCmdInvalid"));
4646
4680
  return;
4647
4681
  }
4648
- onInstallCustom(installTargetOf(raw));
4682
+ onInstallCustom(parsed.target);
4649
4683
  setCmdQuery("");
4650
4684
  setCmdError("");
4651
4685
  };
4686
+ /** 一键插入 DSH Plugin Hub 自身的更新命令:按当前 profile 拼官方命令填进输入框,用户确认后提交 */
4687
+ const insertHubUpdate = () => {
4688
+ setCmdQuery(`dsh plugin --profile ${profile} update dsh-plugin`);
4689
+ setCmdError("");
4690
+ };
4652
4691
  return (0, react.createElement)("div", { className: CustomInstallView_module_css_default.root }, (0, react.createElement)("p", { className: CustomInstallView_module_css_default.desc }, t("customViewDesc")), (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCards }, (0, react.createElement)("div", { className: enableNpm ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("npmInstallLabel")), (0, react.createElement)("button", {
4653
4692
  type: "button",
4654
4693
  className: CustomInstallView_module_css_default.installHelpBtn,
@@ -4711,7 +4750,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4711
4750
  title: t("installHelp"),
4712
4751
  "aria-label": t("installHelp"),
4713
4752
  onClick: () => setHelpFor("cmd")
4714
- }, (0, react.createElement)(HelpIcon))), !enableDsh ? channelOffRow : [
4753
+ }, (0, react.createElement)(HelpIcon)), enableDsh ? (0, react.createElement)("button", {
4754
+ type: "button",
4755
+ className: CustomInstallView_module_css_default.installInsertBtn,
4756
+ onClick: insertHubUpdate
4757
+ }, t("dshCmdInsertHubUpdate")) : null), !enableDsh ? channelOffRow : [
4715
4758
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("dshCmdExample")),
4716
4759
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4717
4760
  className: cmdError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4771,30 +4814,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4771
4814
  css: css$5
4772
4815
  });
4773
4816
  var SettingsView_module_css_default = {
4817
+ "root": "_506LLG_root",
4818
+ "navItem": "_506LLG_navItem",
4774
4819
  "pageHeader": "_506LLG_pageHeader",
4775
- "navItemActive": "_506LLG_navItemActive",
4820
+ "settingDesc": "_506LLG_settingDesc",
4821
+ "settingRowStack": "_506LLG_settingRowStack",
4776
4822
  "controlDropdown": "_506LLG_controlDropdown",
4777
- "settingRow": "_506LLG_settingRow",
4778
- "textInput": "_506LLG_textInput",
4779
4823
  "settingLabel": "_506LLG_settingLabel",
4780
- "root": "_506LLG_root",
4824
+ "navItemActive": "_506LLG_navItemActive",
4825
+ "card": "_506LLG_card",
4826
+ "pageTitle": "_506LLG_pageTitle",
4827
+ "content": "_506LLG_content",
4828
+ "textInput": "_506LLG_textInput",
4781
4829
  "pageDesc": "_506LLG_pageDesc",
4782
- "settingRowStack": "_506LLG_settingRowStack",
4783
- "navIcon": "_506LLG_navIcon",
4784
- "sidebar": "_506LLG_sidebar",
4785
- "navItem": "_506LLG_navItem",
4786
4830
  "settingControlStack": "_506LLG_settingControlStack",
4787
- "content": "_506LLG_content",
4788
- "settingDesc": "_506LLG_settingDesc",
4789
4831
  "resetBtn": "_506LLG_resetBtn",
4790
- "card": "_506LLG_card",
4832
+ "sidebar": "_506LLG_sidebar",
4833
+ "navIcon": "_506LLG_navIcon",
4791
4834
  "settingTitle": "_506LLG_settingTitle",
4792
- "settingControl": "_506LLG_settingControl",
4793
- "pageTitle": "_506LLG_pageTitle"
4835
+ "settingRow": "_506LLG_settingRow",
4836
+ "settingControl": "_506LLG_settingControl"
4794
4837
  };
4795
4838
  //#endregion
4796
4839
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
4797
- const css$4 = ".B_Gxsq_dropdown{flex-shrink:0;position:relative}.B_Gxsq_dropdownBtn{box-sizing:border-box;border:1px solid var(--hub-border-2);height:28px;color:var(--hub-text-primary);background:var(--hub-bg-hover);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;align-items:center;gap:6px;padding:0 10px;font-size:12px;line-height:26px;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.B_Gxsq_dropdownBtn:hover{background:#80808047}.B_Gxsq_dropdownLabel{white-space:nowrap}.B_Gxsq_dropdownArrow,.B_Gxsq_dropdownArrowOpen{color:var(--hub-text-tertiary);transition:transform .12s,color .12s;display:inline-flex}.B_Gxsq_dropdownArrowOpen{color:var(--hub-text-secondary);transform:rotate(180deg)}.B_Gxsq_dropdownPanel{z-index:20;border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;flex-direction:column;gap:1px;min-width:100%;padding:4px;display:flex;position:absolute;top:calc(100% + 4px);left:0}.B_Gxsq_dropdownItem,.B_Gxsq_dropdownItemActive{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;justify-content:space-between;align-items:center;gap:12px;width:100%;padding:5px 8px;font-size:12px;line-height:16px;transition:color .12s,background .12s;display:flex}.B_Gxsq_dropdownItem{color:var(--hub-text-secondary);background:0 0}.B_Gxsq_dropdownItem:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.B_Gxsq_dropdownItemActive{color:var(--hub-brand);background:var(--hub-brand-tint);font-weight:600}.B_Gxsq_dropdownItemLabel{white-space:nowrap}.B_Gxsq_dropdownCount,.B_Gxsq_dropdownCountActive{text-align:center;border-radius:999px;min-width:16px;padding:0 5px;font-size:10px;line-height:14px}.B_Gxsq_dropdownCount{color:var(--hub-text-tertiary);background:var(--hub-bg-btn)}.B_Gxsq_dropdownCountActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}";
4840
+ const css$4 = ".B_Gxsq_dropdown{flex-shrink:0;position:relative}.B_Gxsq_dropdownFill{width:100%}.B_Gxsq_dropdownFill>.B_Gxsq_dropdownBtn{justify-content:space-between;width:100%}.B_Gxsq_dropdownBtn{box-sizing:border-box;border:1px solid var(--hub-border-2);height:28px;color:var(--hub-text-primary);background:var(--hub-bg-hover);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;align-items:center;gap:6px;padding:0 10px;font-size:12px;line-height:26px;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.B_Gxsq_dropdownBtn:hover{background:#80808047}.B_Gxsq_dropdownLabel{white-space:nowrap}.B_Gxsq_dropdownArrow,.B_Gxsq_dropdownArrowOpen{color:var(--hub-text-tertiary);transition:transform .12s,color .12s;display:inline-flex}.B_Gxsq_dropdownArrowOpen{color:var(--hub-text-secondary);transform:rotate(180deg)}.B_Gxsq_dropdownPanel{z-index:20;border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;flex-direction:column;gap:1px;min-width:100%;padding:4px;display:flex;position:absolute;top:calc(100% + 4px);left:0}.B_Gxsq_dropdownItem,.B_Gxsq_dropdownItemActive{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;justify-content:space-between;align-items:center;gap:12px;width:100%;padding:5px 8px;font-size:12px;line-height:16px;transition:color .12s,background .12s;display:flex}.B_Gxsq_dropdownItem{color:var(--hub-text-secondary);background:0 0}.B_Gxsq_dropdownItem:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.B_Gxsq_dropdownItemActive{color:var(--hub-brand);background:var(--hub-brand-tint);font-weight:600}.B_Gxsq_dropdownItemLabel{white-space:nowrap}.B_Gxsq_dropdownCount,.B_Gxsq_dropdownCountActive{text-align:center;border-radius:999px;min-width:16px;padding:0 5px;font-size:10px;line-height:14px}.B_Gxsq_dropdownCount{color:var(--hub-text-tertiary);background:var(--hub-bg-btn)}.B_Gxsq_dropdownCountActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}";
4798
4841
  const tagId$4 = "dsh-plugin/Dropdown.module.css";
4799
4842
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
4800
4843
  const tag = document.createElement("style");
@@ -4809,19 +4852,63 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4809
4852
  css: css$4
4810
4853
  });
4811
4854
  var Dropdown_module_css_default = {
4812
- "dropdownLabel": "B_Gxsq_dropdownLabel",
4855
+ "dropdownBtn": "B_Gxsq_dropdownBtn",
4856
+ "dropdownArrow": "B_Gxsq_dropdownArrow",
4813
4857
  "dropdownItem": "B_Gxsq_dropdownItem",
4814
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4858
+ "dropdownFill": "B_Gxsq_dropdownFill",
4815
4859
  "dropdown": "B_Gxsq_dropdown",
4816
- "dropdownCount": "B_Gxsq_dropdownCount",
4860
+ "dropdownLabel": "B_Gxsq_dropdownLabel",
4817
4861
  "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4818
- "dropdownBtn": "B_Gxsq_dropdownBtn",
4819
4862
  "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4863
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4820
4864
  "dropdownPanel": "B_Gxsq_dropdownPanel",
4821
- "dropdownArrow": "B_Gxsq_dropdownArrow",
4865
+ "dropdownCount": "B_Gxsq_dropdownCount",
4822
4866
  "dropdownItemLabel": "B_Gxsq_dropdownItemLabel"
4823
4867
  };
4824
4868
  //#endregion
4869
+ //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
4870
+ const css$3 = ".k-cD4G_toggle,.k-cD4G_toggleOn{cursor:pointer;border:none;border-radius:999px;flex:none;align-items:center;width:34px;height:18px;padding:0;transition:background-color .15s;display:inline-flex}.k-cD4G_toggle{background:var(--hub-bg-3);box-shadow:inset 0 0 0 1px var(--hub-border-2)}.k-cD4G_toggle:hover{background:var(--hub-bg-hover)}.k-cD4G_toggleOn{background:var(--hub-brand)}.k-cD4G_toggleOn:hover{background:var(--hub-brand-hover)}.k-cD4G_toggle:disabled,.k-cD4G_toggleOn:disabled{opacity:.5;cursor:not-allowed}.k-cD4G_knob{background:#fff;border-radius:999px;width:14px;height:14px;transition:transform .15s;display:block;transform:translate(2px);box-shadow:0 1px 2px #00000040}.k-cD4G_toggleOn .k-cD4G_knob{transform:translate(18px)}";
4871
+ const tagId$3 = "dsh-plugin/Toggle.module.css";
4872
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
4873
+ const tag = document.createElement("style");
4874
+ tag.dataset.plugin = "dsh-plugin";
4875
+ tag.dataset.pluginCss = tagId$3;
4876
+ tag.textContent = css$3;
4877
+ document.head.appendChild(tag);
4878
+ }
4879
+ const cssRegistry$3 = globalThis.__DSH_PLUGIN_CSS__ ??= [];
4880
+ if (!cssRegistry$3.some((e) => e.tagId === tagId$3)) cssRegistry$3.push({
4881
+ tagId: tagId$3,
4882
+ css: css$3
4883
+ });
4884
+ var Toggle_module_css_default = {
4885
+ "knob": "k-cD4G_knob",
4886
+ "toggle": "k-cD4G_toggle",
4887
+ "toggleOn": "k-cD4G_toggleOn"
4888
+ };
4889
+ //#endregion
4890
+ //#region src/client/components/ui/Toggle.tsx
4891
+ /**
4892
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4893
+ * Website: https://dsh-plugin.org
4894
+ * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4895
+ *
4896
+ * Compact switch used by the settings rows. Native-button based so it is
4897
+ * keyboard focusable and announces state via aria-checked; styling driven
4898
+ * by the --hub-* tokens (on = brand fill, off = neutral track).
4899
+ */
4900
+ function Toggle({ checked, onChange, title, disabled }) {
4901
+ return (0, react.createElement)("button", {
4902
+ type: "button",
4903
+ role: "switch",
4904
+ "aria-checked": checked,
4905
+ disabled,
4906
+ title,
4907
+ className: checked ? Toggle_module_css_default.toggleOn : Toggle_module_css_default.toggle,
4908
+ onClick: () => onChange(!checked)
4909
+ }, (0, react.createElement)("span", { className: Toggle_module_css_default.knob }));
4910
+ }
4911
+ //#endregion
4825
4912
  //#region src/client/components/ui/Dropdown.tsx
4826
4913
  /**
4827
4914
  * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
@@ -4881,49 +4968,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4881
4968
  }, (0, react.createElement)("span", { className: Dropdown_module_css_default.dropdownItemLabel }, o.label), typeof o.count === "number" ? (0, react.createElement)("span", { className: o.value === value ? Dropdown_module_css_default.dropdownCountActive : Dropdown_module_css_default.dropdownCount }, o.count) : null))));
4882
4969
  }
4883
4970
  //#endregion
4884
- //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
4885
- const css$3 = ".k-cD4G_toggle,.k-cD4G_toggleOn{cursor:pointer;border:none;border-radius:999px;flex:none;align-items:center;width:34px;height:18px;padding:0;transition:background-color .15s;display:inline-flex}.k-cD4G_toggle{background:var(--hub-bg-3);box-shadow:inset 0 0 0 1px var(--hub-border-2)}.k-cD4G_toggle:hover{background:var(--hub-bg-hover)}.k-cD4G_toggleOn{background:var(--hub-brand)}.k-cD4G_toggleOn:hover{background:var(--hub-brand-hover)}.k-cD4G_toggle:disabled,.k-cD4G_toggleOn:disabled{opacity:.5;cursor:not-allowed}.k-cD4G_knob{background:#fff;border-radius:999px;width:14px;height:14px;transition:transform .15s;display:block;transform:translate(2px);box-shadow:0 1px 2px #00000040}.k-cD4G_toggleOn .k-cD4G_knob{transform:translate(18px)}";
4886
- const tagId$3 = "dsh-plugin/Toggle.module.css";
4887
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
4888
- const tag = document.createElement("style");
4889
- tag.dataset.plugin = "dsh-plugin";
4890
- tag.dataset.pluginCss = tagId$3;
4891
- tag.textContent = css$3;
4892
- document.head.appendChild(tag);
4893
- }
4894
- const cssRegistry$3 = globalThis.__DSH_PLUGIN_CSS__ ??= [];
4895
- if (!cssRegistry$3.some((e) => e.tagId === tagId$3)) cssRegistry$3.push({
4896
- tagId: tagId$3,
4897
- css: css$3
4898
- });
4899
- var Toggle_module_css_default = {
4900
- "toggle": "k-cD4G_toggle",
4901
- "knob": "k-cD4G_knob",
4902
- "toggleOn": "k-cD4G_toggleOn"
4903
- };
4904
- //#endregion
4905
- //#region src/client/components/ui/Toggle.tsx
4906
- /**
4907
- * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4908
- * Website: https://dsh-plugin.org
4909
- * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4910
- *
4911
- * Compact switch used by the settings rows. Native-button based so it is
4912
- * keyboard focusable and announces state via aria-checked; styling driven
4913
- * by the --hub-* tokens (on = brand fill, off = neutral track).
4914
- */
4915
- function Toggle({ checked, onChange, title, disabled }) {
4916
- return (0, react.createElement)("button", {
4917
- type: "button",
4918
- role: "switch",
4919
- "aria-checked": checked,
4920
- disabled,
4921
- title,
4922
- className: checked ? Toggle_module_css_default.toggleOn : Toggle_module_css_default.toggle,
4923
- onClick: () => onChange(!checked)
4924
- }, (0, react.createElement)("span", { className: Toggle_module_css_default.knob }));
4925
- }
4926
- //#endregion
4927
4971
  //#region \0dsh-css:src/client/styles/DiagnosticsView.module.css.mjs
4928
4972
  const css$2 = ".k9eRya_panel{flex-direction:column;min-width:0;display:flex}.k9eRya_envRow{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:10px;padding:8px 12px;display:flex}.k9eRya_envLabel{flex:1;min-width:0}.k9eRya_envTitle{color:var(--hub-text-primary);font-size:12.5px;font-weight:500;line-height:18px}.k9eRya_envDesc{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.k9eRya_envCopyBtn{height:24px;color:var(--hub-text-secondary);background:var(--hub-bg-hover);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;padding:0 12px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}.k9eRya_envCopyBtn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}.k9eRya_envCopyBtn:disabled{opacity:.55;cursor:default}.k9eRya_head{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:10px;padding:8px 12px;display:flex}.k9eRya_headHint{min-width:0;color:var(--hub-text-tertiary);flex:1;font-size:11px;line-height:16px}.k9eRya_runBtn{height:24px;color:var(--hub-brand);background:var(--hub-brand-tint);cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:6px;flex:none;padding:0 12px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}.k9eRya_runBtn:hover:not(:disabled){color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.k9eRya_runBtn:disabled{opacity:.55;cursor:default}.k9eRya_row{box-sizing:border-box;border:none;border-bottom:1px solid var(--hub-border-1);width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;align-items:center;gap:10px;padding:9px 12px;transition:background-color .12s;display:flex}.k9eRya_row:last-of-type{border-bottom:none}.k9eRya_row:hover:not(:disabled){background:var(--hub-bg-hover)}.k9eRya_row:disabled{cursor:default}.k9eRya_name{color:var(--hub-text-primary);white-space:nowrap;flex:none;font-size:12.5px;font-weight:500;line-height:18px}.k9eRya_display{min-width:0;color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:11px;line-height:16px;overflow:hidden}.k9eRya_meta{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:16px}.k9eRya_badge{text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums;border-radius:999px;flex:none;height:17px;padding:0 8px;font-size:10.5px;line-height:17px}.k9eRya_badgeOk{color:var(--hub-success);background:var(--hub-success-tint)}.k9eRya_badgeFail{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.k9eRya_badgeRunning{color:var(--hub-text-secondary);background:var(--hub-bg-hover);animation:1s ease-in-out infinite k9eRya_diagPulse}.k9eRya_badgeIdle{color:var(--hub-text-disabled);background:var(--hub-bg-hover)}@keyframes k9eRya_diagPulse{0%,to{opacity:1}50%{opacity:.4}}.k9eRya_summary{padding:8px 12px 10px;font-size:11px;line-height:16px}.k9eRya_summaryOk{color:var(--hub-success)}.k9eRya_summaryFail{color:var(--hub-danger-text)}.k9eRya_summaryRunning{color:var(--hub-text-tertiary)}";
4929
4973
  const tagId$2 = "dsh-plugin/DiagnosticsView.module.css";
@@ -4940,29 +4984,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4940
4984
  css: css$2
4941
4985
  });
4942
4986
  var DiagnosticsView_module_css_default = {
4987
+ "badgeFail": "k9eRya_badgeFail",
4988
+ "row": "k9eRya_row",
4989
+ "badge": "k9eRya_badge",
4990
+ "summaryOk": "k9eRya_summaryOk",
4943
4991
  "summaryRunning": "k9eRya_summaryRunning",
4944
- "envDesc": "k9eRya_envDesc",
4992
+ "head": "k9eRya_head",
4993
+ "envLabel": "k9eRya_envLabel",
4945
4994
  "name": "k9eRya_name",
4946
- "row": "k9eRya_row",
4995
+ "runBtn": "k9eRya_runBtn",
4996
+ "envDesc": "k9eRya_envDesc",
4947
4997
  "meta": "k9eRya_meta",
4948
- "badge": "k9eRya_badge",
4949
- "badgeOk": "k9eRya_badgeOk",
4950
- "envRow": "k9eRya_envRow",
4998
+ "envTitle": "k9eRya_envTitle",
4951
4999
  "badgeIdle": "k9eRya_badgeIdle",
4952
- "badgeRunning": "k9eRya_badgeRunning",
4953
5000
  "summary": "k9eRya_summary",
4954
- "envTitle": "k9eRya_envTitle",
4955
- "runBtn": "k9eRya_runBtn",
5001
+ "summaryFail": "k9eRya_summaryFail",
5002
+ "panel": "k9eRya_panel",
5003
+ "badgeRunning": "k9eRya_badgeRunning",
5004
+ "display": "k9eRya_display",
4956
5005
  "diagPulse": "k9eRya_diagPulse",
4957
- "head": "k9eRya_head",
4958
5006
  "envCopyBtn": "k9eRya_envCopyBtn",
4959
- "panel": "k9eRya_panel",
4960
5007
  "headHint": "k9eRya_headHint",
4961
- "display": "k9eRya_display",
4962
- "summaryOk": "k9eRya_summaryOk",
4963
- "summaryFail": "k9eRya_summaryFail",
4964
- "badgeFail": "k9eRya_badgeFail",
4965
- "envLabel": "k9eRya_envLabel"
5008
+ "badgeOk": "k9eRya_badgeOk",
5009
+ "envRow": "k9eRya_envRow"
4966
5010
  };
4967
5011
  //#endregion
4968
5012
  //#region src/client/components/views/DiagnosticsView.tsx
@@ -4992,7 +5036,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4992
5036
  const INITIAL_ROWS = [
4993
5037
  {
4994
5038
  key: "npm",
4995
- display: "registry.npmjs.org",
5039
+ display: "",
4996
5040
  nameKey: "diagNpm",
4997
5041
  status: "idle",
4998
5042
  ms: null,
@@ -5061,7 +5105,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5061
5105
  if (ev.type === "ok" || ev.type === "fail") patchRows(ev.key, {
5062
5106
  status: ev.type === "ok" ? "ok" : "fail",
5063
5107
  ms: typeof ev.ms === "number" ? ev.ms : null,
5064
- statusCode: typeof ev.status === "number" ? ev.status : null
5108
+ statusCode: typeof ev.status === "number" ? ev.status : null,
5109
+ display: typeof ev.display === "string" ? ev.display : ""
5065
5110
  });
5066
5111
  }
5067
5112
  nl = buf.indexOf("\n");
@@ -5105,7 +5150,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5105
5150
  disabled: r.status === "running",
5106
5151
  onClick: () => run(r.key),
5107
5152
  title: t("diagRecheck")
5108
- }, (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), (0, react.createElement)("span", { className: DiagnosticsView_module_css_default.meta }, r.status === "ok" && r.ms !== null ? `${r.ms} ms` : ""), badge);
5153
+ }, (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);
5109
5154
  }), (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")));
5110
5155
  }
5111
5156
  //#endregion
@@ -5125,57 +5170,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5125
5170
  css: css$1
5126
5171
  });
5127
5172
  var LogsView_module_css_default = {
5128
- "filterBar": "_3j77BW_filterBar",
5129
- "pathDialogRow": "_3j77BW_pathDialogRow",
5130
- "more": "_3j77BW_more",
5173
+ "footCount": "_3j77BW_footCount",
5174
+ "footActions": "_3j77BW_footActions",
5131
5175
  "catBadge": "_3j77BW_catBadge",
5132
- "panel": "_3j77BW_panel",
5133
- "footFail": "_3j77BW_footFail",
5134
- "filterChipActive": "_3j77BW_filterChipActive",
5135
- "pathLabel": "_3j77BW_pathLabel",
5136
5176
  "catInstall": "_3j77BW_catInstall",
5137
- "catSettings": "_3j77BW_catSettings",
5138
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
5139
- "pathDraft": "_3j77BW_pathDraft",
5140
- "moreEnd": "_3j77BW_moreEnd",
5141
- "pathText": "_3j77BW_pathText",
5177
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
5178
+ "pathDialogHint": "_3j77BW_pathDialogHint",
5142
5179
  "badgeWarn": "_3j77BW_badgeWarn",
5180
+ "badgeDebug": "_3j77BW_badgeDebug",
5143
5181
  "catSystem": "_3j77BW_catSystem",
5144
- "empty": "_3j77BW_empty",
5145
- "message": "_3j77BW_message",
5146
- "event": "_3j77BW_event",
5147
- "head": "_3j77BW_head",
5148
- "logList": "_3j77BW_logList",
5149
- "filterChip": "_3j77BW_filterChip",
5150
- "previewRow": "_3j77BW_previewRow",
5182
+ "badge": "_3j77BW_badge",
5183
+ "linkBtn": "_3j77BW_linkBtn",
5151
5184
  "actions": "_3j77BW_actions",
5152
- "headActions": "_3j77BW_headActions",
5153
- "pathRow": "_3j77BW_pathRow",
5185
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
5186
+ "head": "_3j77BW_head",
5187
+ "more": "_3j77BW_more",
5188
+ "list": "_3j77BW_list",
5189
+ "pathDialogRow": "_3j77BW_pathDialogRow",
5154
5190
  "searchInput": "_3j77BW_searchInput",
5191
+ "filterChip": "_3j77BW_filterChip",
5192
+ "panel": "_3j77BW_panel",
5193
+ "empty": "_3j77BW_empty",
5155
5194
  "headHint": "_3j77BW_headHint",
5156
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
5195
+ "catDiagnostics": "_3j77BW_catDiagnostics",
5196
+ "clearBtn": "_3j77BW_clearBtn",
5197
+ "event": "_3j77BW_event",
5157
5198
  "footPath": "_3j77BW_footPath",
5158
- "pathDialogHint": "_3j77BW_pathDialogHint",
5159
- "footCount": "_3j77BW_footCount",
5160
- "badgeSuccess": "_3j77BW_badgeSuccess",
5161
- "badgeDebug": "_3j77BW_badgeDebug",
5162
- "linkBtn": "_3j77BW_linkBtn",
5163
- "footActions": "_3j77BW_footActions",
5199
+ "catUninstall": "_3j77BW_catUninstall",
5200
+ "catSettings": "_3j77BW_catSettings",
5201
+ "logList": "_3j77BW_logList",
5202
+ "moreEnd": "_3j77BW_moreEnd",
5203
+ "message": "_3j77BW_message",
5204
+ "pathLabel": "_3j77BW_pathLabel",
5205
+ "pathDraft": "_3j77BW_pathDraft",
5164
5206
  "btn": "_3j77BW_btn",
5207
+ "previewRow": "_3j77BW_previewRow",
5208
+ "badgeSuccess": "_3j77BW_badgeSuccess",
5209
+ "badgeInfo": "_3j77BW_badgeInfo",
5210
+ "footFail": "_3j77BW_footFail",
5165
5211
  "foot": "_3j77BW_foot",
5212
+ "catUpdate": "_3j77BW_catUpdate",
5166
5213
  "entry": "_3j77BW_entry",
5167
- "badgeError": "_3j77BW_badgeError",
5168
- "badgeInfo": "_3j77BW_badgeInfo",
5214
+ "filterChipActive": "_3j77BW_filterChipActive",
5215
+ "time": "_3j77BW_time",
5216
+ "headActions": "_3j77BW_headActions",
5217
+ "filterBar": "_3j77BW_filterBar",
5218
+ "pathText": "_3j77BW_pathText",
5169
5219
  "search": "_3j77BW_search",
5170
- "catUninstall": "_3j77BW_catUninstall",
5171
- "catUpdate": "_3j77BW_catUpdate",
5172
- "catDiagnostics": "_3j77BW_catDiagnostics",
5173
- "clearBtn": "_3j77BW_clearBtn",
5174
5220
  "pathDialog": "_3j77BW_pathDialog",
5175
- "badge": "_3j77BW_badge",
5176
- "list": "_3j77BW_list",
5177
5221
  "pathDialogReset": "_3j77BW_pathDialogReset",
5178
- "time": "_3j77BW_time"
5222
+ "badgeError": "_3j77BW_badgeError",
5223
+ "pathRow": "_3j77BW_pathRow"
5179
5224
  };
5180
5225
  //#endregion
5181
5226
  //#region src/client/components/modals/LogsModal.tsx
@@ -5746,6 +5791,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5746
5791
  * Diagnostics — live connectivity probe + environment snapshot
5747
5792
  * Logs — system log viewer + storage location
5748
5793
  */
5794
+ /** npm 镜像源预设:空串 = 未配置(跟随用户本机 npm 配置,本插件不注入任何 registry)。
5795
+ * 只提供常见国内顶级镜像下拉,不做自定义输入 —— 想用其它镜像直接在 ~/.npmrc 配置即可。 */
5796
+ const MIRROR_PRESETS = [
5797
+ {
5798
+ value: "",
5799
+ labelKey: "mirrorNone"
5800
+ },
5801
+ {
5802
+ value: "https://registry.npmjs.org",
5803
+ labelKey: "mirrorOfficial"
5804
+ },
5805
+ {
5806
+ value: "https://registry.npmmirror.com",
5807
+ labelKey: "mirrorNpmmirror"
5808
+ },
5809
+ {
5810
+ value: "https://mirrors.cloud.tencent.com/npm/",
5811
+ labelKey: "mirrorTencent"
5812
+ },
5813
+ {
5814
+ value: "https://mirrors.tuna.tsinghua.edu.cn/npm/",
5815
+ labelKey: "mirrorTsinghua"
5816
+ }
5817
+ ];
5749
5818
  /** 左侧导航:顺序即展示顺序;labelKey 是分组标题,icon 是行内小图标。 */
5750
5819
  const NAV = [
5751
5820
  {
@@ -5774,21 +5843,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5774
5843
  icon: ResetIcon
5775
5844
  }
5776
5845
  ];
5777
- /** npm 镜像源预设:空串 = 官方源;值相等即视为选中对应预设,其余进入「自定义」输入。 */
5778
- const MIRROR_PRESETS = [
5779
- {
5780
- value: "",
5781
- labelKey: "mirrorOfficial"
5782
- },
5783
- {
5784
- value: "https://registry.npmmirror.com",
5785
- labelKey: "mirrorNpmmirror"
5786
- },
5787
- {
5788
- value: "https://mirrors.cloud.tencent.com/npm/",
5789
- labelKey: "mirrorTencent"
5790
- }
5791
- ];
5792
5846
  /** 设置行:默认标签左控件右;stack=true 时控件独占一行(文本框整行显示),hairline 分隔。 */
5793
5847
  function SettingRow({ title, desc, children, stack = false }) {
5794
5848
  return (0, react.createElement)("div", { className: stack ? SettingsView_module_css_default.settingRowStack : SettingsView_module_css_default.settingRow }, (0, react.createElement)("div", { className: SettingsView_module_css_default.settingLabel }, (0, react.createElement)("div", { className: SettingsView_module_css_default.settingTitle }, title), desc ? (0, react.createElement)("div", { className: SettingsView_module_css_default.settingDesc }, desc) : null), (0, react.createElement)("div", { className: stack ? SettingsView_module_css_default.settingControlStack : SettingsView_module_css_default.settingControl }, children));
@@ -5798,13 +5852,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5798
5852
  const [section, setSection] = (0, react.useState)("updates");
5799
5853
  /** 恢复默认确认弹窗:点按钮先弹窗询问,确认后才真正 reset(不做两段式按钮) */
5800
5854
  const [resetConfirm, setResetConfirm] = (0, react.useState)(false);
5801
- const mirrorCustom = !MIRROR_PRESETS.some((p) => p.value === settings.npmRegistry);
5802
- const onMirrorChange = (value) => {
5803
- if (value === "custom") return;
5804
- update({ npmRegistry: value });
5805
- };
5806
- const onMirrorInput = (e) => update({ npmRegistry: e.target.value });
5807
5855
  const onProxyChange = (e) => update({ proxy: e.target.value });
5856
+ const onMirrorChange = (value) => update({ npmRegistry: value });
5808
5857
  /** 每个分组的页面副标题(导航标题之上再补一句说明,保持桌面设置质感) */
5809
5858
  const pageDesc = {
5810
5859
  updates: t("settingsUpdateDesc"),
@@ -5825,29 +5874,16 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5825
5874
  }), (0, react.createElement)(SettingRow, {
5826
5875
  title: t("settingsMirror"),
5827
5876
  desc: t("settingsMirrorDesc"),
5877
+ stack: true,
5828
5878
  children: (0, react.createElement)(Dropdown, {
5829
- value: mirrorCustom ? "custom" : settings.npmRegistry,
5830
- options: [...MIRROR_PRESETS.map((p) => ({
5831
- value: p.value,
5832
- label: t(p.labelKey)
5833
- })), {
5834
- value: "custom",
5835
- label: t("mirrorCustom")
5836
- }],
5879
+ value: settings.npmRegistry,
5880
+ options: MIRROR_PRESETS.map((m) => ({
5881
+ value: m.value,
5882
+ label: t(m.labelKey)
5883
+ })),
5837
5884
  onChange: onMirrorChange,
5838
5885
  title: t("settingsMirror"),
5839
- className: SettingsView_module_css_default.controlDropdown
5840
- })
5841
- }), mirrorCustom && (0, react.createElement)(SettingRow, {
5842
- title: t("mirrorCustom"),
5843
- stack: true,
5844
- children: (0, react.createElement)("input", {
5845
- className: SettingsView_module_css_default.textInput,
5846
- type: "url",
5847
- value: settings.npmRegistry,
5848
- placeholder: "https://registry.npmjs.org",
5849
- spellCheck: false,
5850
- onChange: onMirrorInput
5886
+ className: `${SettingsView_module_css_default.controlDropdown} ${Dropdown_module_css_default.dropdownFill}`
5851
5887
  })
5852
5888
  }), (0, react.createElement)(SettingRow, {
5853
5889
  title: t("settingsProxy"),
@@ -6023,7 +6059,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6023
6059
  const queue = useTaskQueue({
6024
6060
  t,
6025
6061
  refreshInstalled: catalog.refreshInstalled,
6026
- onInstallDone: (viaModal, repo, needsRestart) => {
6062
+ onInstallDone: (viaModal, repo, needsRestart, update) => {
6027
6063
  setInstallNeedsRestart(needsRestart);
6028
6064
  if (viaModal) setInstallDone(true);
6029
6065
  else setToast({
@@ -6032,6 +6068,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6032
6068
  });
6033
6069
  setNotifications(addSuccess({
6034
6070
  kind: "install",
6071
+ action: update ? "update" : "install",
6035
6072
  repo: repo ?? ""
6036
6073
  }));
6037
6074
  },
@@ -6047,7 +6084,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6047
6084
  repo: repo ?? ""
6048
6085
  }));
6049
6086
  },
6050
- onError: (message, repo, kind, command, attempts) => {
6087
+ onError: (message, repo, kind, command, attempts, update) => {
6051
6088
  const issueRepo = issueRepoOf(repo ?? "", catalog.installedItems, catalog.plugins);
6052
6089
  setErrorMsg({
6053
6090
  message,
@@ -6058,7 +6095,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6058
6095
  });
6059
6096
  setNotifications(addFailure({
6060
6097
  kind,
6061
- repo: issueRepo ?? "",
6098
+ action: update ? "update" : "install",
6099
+ repo: repo ?? "",
6062
6100
  message,
6063
6101
  command,
6064
6102
  attempts
@@ -6321,6 +6359,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6321
6359
  enableGit: hubSettings.enableGitInstall,
6322
6360
  enableDsh: hubSettings.enableDshInstall,
6323
6361
  onOpenSettings: () => setView("settings"),
6362
+ profile: env?.profile ?? "web",
6324
6363
  onInstallCustom: (raw, opts) => {
6325
6364
  const target = raw.trim();
6326
6365
  if (!target) return;
@@ -6353,7 +6392,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6353
6392
  });
6354
6393
  }
6355
6394
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
6356
- info: catalog.hubUpdateInfo ?? { version: "1.3.4" },
6395
+ info: catalog.hubUpdateInfo ?? { version: "1.3.6" },
6357
6396
  lang,
6358
6397
  t,
6359
6398
  hasUpdate: catalog.hubHasUpdate,