From b40ada9b33333e5ab401d5b3424ff2e9e677a46a Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 4 Oct 2026 23:07:12 +0800 Subject: [PATCH 1/2] fix: install catalog GitHub release packages without root fallback Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- client/client.js | 820 +++++++++--------- client/client.js.map | 2 +- lib/http/routes.js | 23 +- lib/services/install/preflight.js | 6 + lib/services/install/release-target.js | 13 + lib/services/profile/profile.js | 4 + .../services/install/release-target.d.ts | 5 + src/client/logic/install-command.ts | 14 +- src/server/http/routes.ts | 23 +- src/server/services/install/preflight.ts | 5 + src/server/services/install/release-target.ts | 12 + src/server/services/profile/profile.ts | 3 + tests/release-target.test.ts | 91 ++ 13 files changed, 602 insertions(+), 419 deletions(-) create mode 100644 lib/services/install/release-target.js create mode 100644 lib/types/services/install/release-target.d.ts create mode 100644 src/server/services/install/release-target.ts create mode 100644 tests/release-target.test.ts diff --git a/client/client.js b/client/client.js index bd2c59e..271b784 100644 --- a/client/client.js +++ b/client/client.js @@ -687,7 +687,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { }; //#endregion //#region \0dsh-css:src/client/styles/Header.module.css.mjs - const css$11 = ".qikqja_root{min-width:0;height:100%;color:var(--hub-text-primary);flex-direction:column;gap:8px;display:flex}.qikqja_header{flex-direction:column;gap:2px;padding:2px 2px 0;display:flex}.qikqja_headerRight{flex-shrink:0;align-items:center;gap:2px;margin-left:auto;display:inline-flex}.qikqja_langBtn{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;padding:0 8px;font-size:12px;font-weight:600;transition:color .15s,background-color .15s;display:inline-flex}.qikqja_langBtn:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.qikqja_githubLink{color:var(--hub-text-tertiary);cursor:pointer;border-radius:6px;flex-shrink:0;align-items:center;padding:3px;text-decoration:none;transition:color .15s,background-color .15s;display:inline-flex}.qikqja_githubLink:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.qikqja_githubIcon{flex-shrink:0;display:block}.qikqja_aboutBtn{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;padding:0 8px;font-size:12px;font-weight:600;line-height:1;transition:color .15s,background-color .15s;display:inline-flex}.qikqja_aboutBtn:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.qikqja_headerTitleRow{align-items:center;gap:8px;min-width:0;display:flex}.qikqja_brandTitle{min-width:0;color:inherit;cursor:pointer;align-items:center;gap:10px;text-decoration:none;display:flex}.qikqja_taglineLink{min-width:0;max-width:100%;color:inherit;cursor:pointer;align-self:flex-start;text-decoration:none}.qikqja_title{margin:0;font-size:14px;font-weight:600;line-height:20px}.qikqja_version{color:var(--hub-text-secondary)}.qikqja_versionBtn{height:20px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:0 6px;font-size:12px;font-weight:600;line-height:1;transition:color .12s;display:inline-flex}.qikqja_versionBtn:hover{color:var(--hub-text-secondary)}.qikqja_hubUpdateBadge{letter-spacing:.02em;color:#fff;background:var(--hub-danger);-webkit-user-select:none;user-select:none;border-radius:999px;flex-shrink:0;align-items:center;height:18px;padding:0 7px;font-size:11px;font-weight:700;line-height:1;transition:background .12s,box-shadow .12s,transform .12s;display:inline-flex;box-shadow:0 1px 4px #d1242f66}.qikqja_hubUpdateBadge:hover{background:var(--hub-danger-hover);transform:translateY(-1px);box-shadow:0 2px 8px #d1242f80}.qikqja_logoIcon{flex-shrink:0;display:block}.qikqja_copyIcon{flex-shrink:0}.qikqja_tagline{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;line-height:18px;overflow:hidden}.qikqja_controls{border-bottom:1px solid var(--hub-border-1);flex-shrink:0;align-items:center;gap:8px;padding:0 2px 8px;display:flex}.qikqja_resultCount{font-variant-numeric:tabular-nums;text-align:center;min-width:5ch}.qikqja_resultSeg{color:var(--hub-text-tertiary);white-space:nowrap;-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:baseline;font-size:12px;line-height:18px;display:inline-flex}.qikqja_sortGroup{flex-shrink:0;align-items:center;gap:8px;margin-left:auto;display:inline-flex}.qikqja_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}.qikqja_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}.qikqja_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}.qikqja_segBtn svg{flex-shrink:0;display:block}.qikqja_segBtn+.qikqja_segBtn{border-left:1px solid var(--hub-border-2)}.qikqja_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.qikqja_segBtnActive,.qikqja_segBtnActive:hover{color:#fff;background:var(--hub-brand)}.qikqja_adBanner{border:1px solid var(--hub-purple-border);background:linear-gradient(90deg, var(--hub-purple-1) 0%, var(--hub-purple-2) 100%);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;box-shadow:0 2px 10px var(--hub-purple-shadow);border-radius:8px;align-items:center;gap:8px;padding:7px 12px;text-decoration:none;transition:filter .15s,box-shadow .15s;display:flex}.qikqja_adBanner:hover{filter:brightness(1.1);box-shadow:0 4px 16px var(--hub-purple-shadow-strong)}.qikqja_adBadge{letter-spacing:.04em;color:#fff;white-space:nowrap;background:#ffffff29;border:1px solid #ffffff8c;border-radius:4px;flex-shrink:0;padding:3px 6px;font-size:10px;font-weight:700;line-height:1}.qikqja_adText{text-overflow:ellipsis;white-space:nowrap;color:#fff;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.qikqja_adArrow{color:#fff;flex-shrink:0;margin-left:auto;font-size:13px}.qikqja_searchRow{align-items:center;gap:6px;padding:0 2px;display:flex}.qikqja_search{min-width:0;height:28px;color:inherit;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}.qikqja_search::placeholder{color:var(--hub-text-tertiary)}.qikqja_search:focus{border-color:var(--hub-brand)}.qikqja_tabs{border-bottom:1px solid var(--hub-border-1);flex-wrap:wrap;align-items:center;gap:6px;padding:2px 2px 8px;display:flex}.qikqja_tab,.qikqja_tabActive{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:3px 10px;font-size:12px;line-height:18px;transition:color .12s,background .12s;display:inline-flex}.qikqja_tab{color:var(--hub-text-secondary);background:0 0}.qikqja_tab:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.qikqja_tabActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}.qikqja_tabCount{text-align:center;min-width:16px;color:var(--hub-text-tertiary);background:var(--hub-bg-btn);border-radius:999px;padding:0 5px;font-size:10px;line-height:14px}.qikqja_tabActive .qikqja_tabCount{color:var(--hub-text-on-fill);background:var(--hub-bg-on-fill)}.qikqja_tabsRow{flex-shrink:0;align-items:center;gap:10px;display:flex}.qikqja_tabsRow>:first-child{flex:auto;min-width:0}"; + const css$11 = ".K2rbRG_root{min-width:0;height:100%;color:var(--hub-text-primary);flex-direction:column;gap:8px;display:flex}.K2rbRG_header{flex-direction:column;gap:2px;padding:2px 2px 0;display:flex}.K2rbRG_headerRight{flex-shrink:0;align-items:center;gap:2px;margin-left:auto;display:inline-flex}.K2rbRG_langBtn{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;padding:0 8px;font-size:12px;font-weight:600;transition:color .15s,background-color .15s;display:inline-flex}.K2rbRG_langBtn:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.K2rbRG_githubLink{color:var(--hub-text-tertiary);cursor:pointer;border-radius:6px;flex-shrink:0;align-items:center;padding:3px;text-decoration:none;transition:color .15s,background-color .15s;display:inline-flex}.K2rbRG_githubLink:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.K2rbRG_githubIcon{flex-shrink:0;display:block}.K2rbRG_aboutBtn{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;padding:0 8px;font-size:12px;font-weight:600;line-height:1;transition:color .15s,background-color .15s;display:inline-flex}.K2rbRG_aboutBtn:hover{color:var(--hub-purple-1);background-color:var(--hub-purple-tint)}.K2rbRG_headerTitleRow{align-items:center;gap:8px;min-width:0;display:flex}.K2rbRG_brandTitle{min-width:0;color:inherit;cursor:pointer;align-items:center;gap:10px;text-decoration:none;display:flex}.K2rbRG_taglineLink{min-width:0;max-width:100%;color:inherit;cursor:pointer;align-self:flex-start;text-decoration:none}.K2rbRG_title{margin:0;font-size:14px;font-weight:600;line-height:20px}.K2rbRG_version{color:var(--hub-text-secondary)}.K2rbRG_versionBtn{height:20px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:0 6px;font-size:12px;font-weight:600;line-height:1;transition:color .12s;display:inline-flex}.K2rbRG_versionBtn:hover{color:var(--hub-text-secondary)}.K2rbRG_hubUpdateBadge{letter-spacing:.02em;color:#fff;background:var(--hub-danger);-webkit-user-select:none;user-select:none;border-radius:999px;flex-shrink:0;align-items:center;height:18px;padding:0 7px;font-size:11px;font-weight:700;line-height:1;transition:background .12s,box-shadow .12s,transform .12s;display:inline-flex;box-shadow:0 1px 4px #d1242f66}.K2rbRG_hubUpdateBadge:hover{background:var(--hub-danger-hover);transform:translateY(-1px);box-shadow:0 2px 8px #d1242f80}.K2rbRG_logoIcon{flex-shrink:0;display:block}.K2rbRG_copyIcon{flex-shrink:0}.K2rbRG_tagline{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;line-height:18px;overflow:hidden}.K2rbRG_controls{border-bottom:1px solid var(--hub-border-1);flex-shrink:0;align-items:center;gap:8px;padding:0 2px 8px;display:flex}.K2rbRG_resultCount{font-variant-numeric:tabular-nums;text-align:center;min-width:5ch}.K2rbRG_resultSeg{color:var(--hub-text-tertiary);white-space:nowrap;-webkit-user-select:none;user-select:none;flex-shrink:0;align-items:baseline;font-size:12px;line-height:18px;display:inline-flex}.K2rbRG_sortGroup{flex-shrink:0;align-items:center;gap:8px;margin-left:auto;display:inline-flex}.K2rbRG_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}.K2rbRG_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}.K2rbRG_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}.K2rbRG_segBtn svg{flex-shrink:0;display:block}.K2rbRG_segBtn+.K2rbRG_segBtn{border-left:1px solid var(--hub-border-2)}.K2rbRG_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.K2rbRG_segBtnActive,.K2rbRG_segBtnActive:hover{color:#fff;background:var(--hub-brand)}.K2rbRG_adBanner{border:1px solid var(--hub-purple-border);background:linear-gradient(90deg, var(--hub-purple-1) 0%, var(--hub-purple-2) 100%);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;box-shadow:0 2px 10px var(--hub-purple-shadow);border-radius:8px;align-items:center;gap:8px;padding:7px 12px;text-decoration:none;transition:filter .15s,box-shadow .15s;display:flex}.K2rbRG_adBanner:hover{filter:brightness(1.1);box-shadow:0 4px 16px var(--hub-purple-shadow-strong)}.K2rbRG_adBadge{letter-spacing:.04em;color:#fff;white-space:nowrap;background:#ffffff29;border:1px solid #ffffff8c;border-radius:4px;flex-shrink:0;padding:3px 6px;font-size:10px;font-weight:700;line-height:1}.K2rbRG_adText{text-overflow:ellipsis;white-space:nowrap;color:#fff;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.K2rbRG_adArrow{color:#fff;flex-shrink:0;margin-left:auto;font-size:13px}.K2rbRG_searchRow{align-items:center;gap:6px;padding:0 2px;display:flex}.K2rbRG_search{min-width:0;height:28px;color:inherit;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}.K2rbRG_search::placeholder{color:var(--hub-text-tertiary)}.K2rbRG_search:focus{border-color:var(--hub-brand)}.K2rbRG_tabs{border-bottom:1px solid var(--hub-border-1);flex-wrap:wrap;align-items:center;gap:6px;padding:2px 2px 8px;display:flex}.K2rbRG_tab,.K2rbRG_tabActive{cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:3px 10px;font-size:12px;line-height:18px;transition:color .12s,background .12s;display:inline-flex}.K2rbRG_tab{color:var(--hub-text-secondary);background:0 0}.K2rbRG_tab:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.K2rbRG_tabActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}.K2rbRG_tabCount{text-align:center;min-width:16px;color:var(--hub-text-tertiary);background:var(--hub-bg-btn);border-radius:999px;padding:0 5px;font-size:10px;line-height:14px}.K2rbRG_tabActive .K2rbRG_tabCount{color:var(--hub-text-on-fill);background:var(--hub-bg-on-fill)}.K2rbRG_tabsRow{flex-shrink:0;align-items:center;gap:10px;display:flex}.K2rbRG_tabsRow>:first-child{flex:auto;min-width:0}"; const tagId$11 = "dsh-plugin/Header.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) { const tag = document.createElement("style"); @@ -702,46 +702,46 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$11 }); var Header_module_css_default = { - "langBtn": "qikqja_langBtn", - "segBtnActive": "qikqja_segBtnActive", - "headerTitleRow": "qikqja_headerTitleRow", - "version": "qikqja_version", - "root": "qikqja_root", - "tabs": "qikqja_tabs", - "tab": "qikqja_tab", - "tabsRow": "qikqja_tabsRow", - "copyIcon": "qikqja_copyIcon", - "brandTitle": "qikqja_brandTitle", - "githubLink": "qikqja_githubLink", - "aboutBtn": "qikqja_aboutBtn", - "sortGroup": "qikqja_sortGroup", - "githubIcon": "qikqja_githubIcon", - "versionBtn": "qikqja_versionBtn", - "adBadge": "qikqja_adBadge", - "logoIcon": "qikqja_logoIcon", - "tabActive": "qikqja_tabActive", - "hubUpdateBadge": "qikqja_hubUpdateBadge", - "adText": "qikqja_adText", - "resultSeg": "qikqja_resultSeg", - "taglineLink": "qikqja_taglineLink", - "controls": "qikqja_controls", - "resultCount": "qikqja_resultCount", - "segBtn": "qikqja_segBtn", - "segLabel": "qikqja_segLabel", - "tabCount": "qikqja_tabCount", - "tagline": "qikqja_tagline", - "headerRight": "qikqja_headerRight", - "segGroup": "qikqja_segGroup", - "adBanner": "qikqja_adBanner", - "searchRow": "qikqja_searchRow", - "title": "qikqja_title", - "adArrow": "qikqja_adArrow", - "search": "qikqja_search", - "header": "qikqja_header" + "title": "K2rbRG_title", + "segBtn": "K2rbRG_segBtn", + "adText": "K2rbRG_adText", + "segBtnActive": "K2rbRG_segBtnActive", + "logoIcon": "K2rbRG_logoIcon", + "adArrow": "K2rbRG_adArrow", + "version": "K2rbRG_version", + "adBadge": "K2rbRG_adBadge", + "githubLink": "K2rbRG_githubLink", + "brandTitle": "K2rbRG_brandTitle", + "segGroup": "K2rbRG_segGroup", + "adBanner": "K2rbRG_adBanner", + "search": "K2rbRG_search", + "headerRight": "K2rbRG_headerRight", + "versionBtn": "K2rbRG_versionBtn", + "controls": "K2rbRG_controls", + "langBtn": "K2rbRG_langBtn", + "sortGroup": "K2rbRG_sortGroup", + "aboutBtn": "K2rbRG_aboutBtn", + "tabCount": "K2rbRG_tabCount", + "copyIcon": "K2rbRG_copyIcon", + "taglineLink": "K2rbRG_taglineLink", + "tagline": "K2rbRG_tagline", + "root": "K2rbRG_root", + "hubUpdateBadge": "K2rbRG_hubUpdateBadge", + "header": "K2rbRG_header", + "githubIcon": "K2rbRG_githubIcon", + "resultCount": "K2rbRG_resultCount", + "headerTitleRow": "K2rbRG_headerTitleRow", + "segLabel": "K2rbRG_segLabel", + "searchRow": "K2rbRG_searchRow", + "resultSeg": "K2rbRG_resultSeg", + "tabsRow": "K2rbRG_tabsRow", + "tabs": "K2rbRG_tabs", + "tabActive": "K2rbRG_tabActive", + "tab": "K2rbRG_tab" }; //#endregion //#region \0dsh-css:src/client/styles/Modal.module.css.mjs - const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:540px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:720px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_helpModal{width:760px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:820px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_confirmIconWrap{justify-content:center;padding:2px 0 6px;display:flex}.BiQ1zG_confirmIcon{background:var(--hub-brand);border-radius:50%;flex:none;justify-content:center;align-items:center;width:48px;height:48px;display:inline-flex;box-shadow:0 4px 12px #4f6ef747}.BiQ1zG_confirmIconDanger{background:var(--hub-danger);box-shadow:0 4px 12px #d1242f4d}.BiQ1zG_dangerConfirm{color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:background-color .12s,border-color .12s}.BiQ1zG_dangerConfirm:hover:not(:disabled){background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}.BiQ1zG_dangerConfirm:disabled{opacity:.55;cursor:default}.BiQ1zG_confirmPrimary{color:#fff;background:var(--hub-brand);border:1px solid var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;flex:none;height:28px;padding:0 14px;font-size:12px;font-weight:600;transition:filter .12s}.BiQ1zG_confirmPrimary:hover:not(:disabled){filter:brightness(1.08)}.BiQ1zG_confirmPrimary:disabled{opacity:.55;cursor:default}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_noticeIgnore{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:5px;flex-shrink:0;margin-left:2px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px;transition:color .12s,border-color .12s,background .12s}.BiQ1zG_noticeIgnore:hover{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_failDiagBtn{box-sizing:border-box;text-align:center;width:100%;color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:8px;margin-top:8px;padding:5px 16px;font-size:13px;font-weight:600;line-height:18px;transition:background .12s,box-shadow .12s;display:block}.BiQ1zG_failDiagBtn:hover{background:var(--hub-btn-hover);box-shadow:0 3px 10px #0000001f}.BiQ1zG_failNetworkTarget{word-break:break-all;color:var(--hub-danger);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:13px;font-weight:700;line-height:20px}.BiQ1zG_aboutModal{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutContent img[width=\"100\"]{object-fit:contain;width:100px;height:100px;max-height:100px}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:620px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:580px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}"; + const css$10 = ".cFdCKW_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out cFdCKW_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.cFdCKW_modal,.cFdCKW_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:540px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out cFdCKW_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.cFdCKW_errorModal{width:720px;max-width:calc(100vw - 48px)}.cFdCKW_modalWide{width:640px;max-width:calc(100vw - 48px)}.cFdCKW_helpModal{width:760px;max-width:calc(100vw - 48px)}.cFdCKW_logModal{width:820px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.cFdCKW_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.cFdCKW_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.cFdCKW_modalTitleBusy{color:var(--hub-brand)}.cFdCKW_modalTitleQueued{color:var(--hub-warning)}.cFdCKW_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}.cFdCKW_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.cFdCKW_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.cFdCKW_confirmIconWrap{justify-content:center;padding:2px 0 6px;display:flex}.cFdCKW_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}.cFdCKW_confirmIconDanger{background:var(--hub-danger);box-shadow:0 4px 12px #d1242f4d}.cFdCKW_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}.cFdCKW_dangerConfirm:hover:not(:disabled){background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}.cFdCKW_dangerConfirm:disabled{opacity:.55;cursor:default}.cFdCKW_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}.cFdCKW_confirmPrimary:hover:not(:disabled){filter:brightness(1.08)}.cFdCKW_confirmPrimary:disabled{opacity:.55;cursor:default}.cFdCKW_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.cFdCKW_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}.cFdCKW_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.cFdCKW_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}.cFdCKW_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.cFdCKW_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.cFdCKW_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.cFdCKW_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}.cFdCKW_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.cFdCKW_linkIcon{flex-shrink:0}.cFdCKW_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}.cFdCKW_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.cFdCKW_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.cFdCKW_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}.cFdCKW_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.cFdCKW_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.cFdCKW_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.cFdCKW_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 cFdCKW_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes cFdCKW_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.cFdCKW_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.cFdCKW_queueSection{flex-direction:column;gap:6px;display:flex}.cFdCKW_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.cFdCKW_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.cFdCKW_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.cFdCKW_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}.cFdCKW_queueRow:hover{background:var(--hub-brand-tint)}.cFdCKW_queueRowHead{align-items:center;gap:10px;display:flex}.cFdCKW_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}.cFdCKW_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.cFdCKW_queueRowBody{align-items:center;gap:8px;display:flex}.cFdCKW_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.cFdCKW_queueRowTrack{flex:1;min-width:0}.cFdCKW_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.cFdCKW_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}.cFdCKW_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.cFdCKW_stripCancel:disabled{opacity:.45;cursor:default}.cFdCKW_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}.cFdCKW_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.cFdCKW_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}.cFdCKW_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}.cFdCKW_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.cFdCKW_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.cFdCKW_modalCancel,.cFdCKW_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}.cFdCKW_modalCancel:hover,.cFdCKW_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.cFdCKW_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}.cFdCKW_modalInstall:hover{background:var(--hub-btn-hover)}.cFdCKW_modalCopy:disabled,.cFdCKW_modalInstall:disabled,.cFdCKW_modalCancel:disabled,.cFdCKW_modalClose:disabled,.cFdCKW_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.cFdCKW_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}.cFdCKW_uninstallConfirm:hover{background:var(--hub-danger-hover)}.cFdCKW_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.cFdCKW_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}.cFdCKW_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.cFdCKW_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.cFdCKW_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.cFdCKW_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.cFdCKW_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}.cFdCKW_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.cFdCKW_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}.cFdCKW_restartNow:hover{background:var(--hub-btn-hover)}.cFdCKW_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.cFdCKW_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}.cFdCKW_restartNowWarning:hover{background:var(--hub-warning-hover)}.cFdCKW_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.cFdCKW_result .cFdCKW_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.cFdCKW_result .cFdCKW_modalActions .cFdCKW_restartLater,.cFdCKW_result .cFdCKW_modalActions .cFdCKW_restartNow,.cFdCKW_result .cFdCKW_modalActions .cFdCKW_restartNowWarning{min-width:100px}.cFdCKW_progress{margin:10px 0 2px}.cFdCKW_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.cFdCKW_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.cFdCKW_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.cFdCKW_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.cFdCKW_progressFillFail{background:var(--hub-danger)}@keyframes cFdCKW_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes cFdCKW_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.cFdCKW_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.cFdCKW_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}.cFdCKW_failHead{align-items:center;gap:8px;min-width:0;display:flex}.cFdCKW_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.cFdCKW_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}.cFdCKW_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.cFdCKW_noticeBadgeOk,.cFdCKW_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}.cFdCKW_noticeBadgeOk{background:var(--hub-success)}.cFdCKW_noticeBadgeFail{background:var(--hub-danger)}.cFdCKW_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.cFdCKW_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.cFdCKW_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.cFdCKW_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.cFdCKW_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.cFdCKW_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.cFdCKW_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.cFdCKW_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}.cFdCKW_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.cFdCKW_noticeRowOk .cFdCKW_noticeRemove{margin-left:0}.cFdCKW_noticeRowOk .cFdCKW_noticeTime{margin-left:auto}.cFdCKW_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.cFdCKW_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.cFdCKW_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}.cFdCKW_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}.cFdCKW_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.cFdCKW_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}.cFdCKW_noticeIgnore:hover{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.cFdCKW_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.cFdCKW_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.cFdCKW_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.cFdCKW_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}.cFdCKW_failRepo:hover{text-decoration:underline}.cFdCKW_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}.cFdCKW_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.cFdCKW_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.cFdCKW_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}.cFdCKW_failClear:hover{color:#fff;background:var(--hub-danger)}.cFdCKW_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}.cFdCKW_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.cFdCKW_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}.cFdCKW_failDiagBtn{box-sizing:border-box;text-align:center;width:100%;color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:8px;margin-top:8px;padding:5px 16px;font-size:13px;font-weight:600;line-height:18px;transition:background .12s,box-shadow .12s;display:block}.cFdCKW_failDiagBtn:hover{background:var(--hub-btn-hover);box-shadow:0 3px 10px #0000001f}.cFdCKW_failNetworkTarget{word-break:break-all;color:var(--hub-danger);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:13px;font-weight:700;line-height:20px}.cFdCKW_aboutModal{width:560px;max-width:calc(100vw - 48px)}.cFdCKW_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}.cFdCKW_aboutContent>:first-child{margin-top:0}.cFdCKW_aboutContent>:last-child{margin-bottom:0}.cFdCKW_aboutContent h2,.cFdCKW_aboutContent h3,.cFdCKW_aboutContent h4,.cFdCKW_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.cFdCKW_aboutContent h2{font-size:14px}.cFdCKW_aboutContent p{margin:4px 0}.cFdCKW_aboutContent ul,.cFdCKW_aboutContent ol{margin:4px 0;padding-left:18px}.cFdCKW_aboutContent li{margin:2px 0}.cFdCKW_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}.cFdCKW_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}.cFdCKW_aboutContent pre code{background:0 0;border-radius:0;padding:0}.cFdCKW_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}.cFdCKW_aboutContent a{color:var(--hub-brand);text-decoration:none}.cFdCKW_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.cFdCKW_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.cFdCKW_aboutContent img[width=\"100\"]{object-fit:contain;width:100px;height:100px;max-height:100px}.cFdCKW_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.cFdCKW_hubUpdateModal{width:620px;max-width:calc(100vw - 48px)}.cFdCKW_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.cFdCKW_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.cFdCKW_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}.cFdCKW_hubUpdateNotes>:first-child{margin-top:0}.cFdCKW_hubUpdateNotes>:last-child{margin-bottom:0}.cFdCKW_hubUpdateNotes h2,.cFdCKW_hubUpdateNotes h3,.cFdCKW_hubUpdateNotes h4,.cFdCKW_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.cFdCKW_hubUpdateNotes h2{font-size:14px}.cFdCKW_hubUpdateNotes p{margin:4px 0}.cFdCKW_hubUpdateNotes ul,.cFdCKW_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.cFdCKW_hubUpdateNotes li{margin:2px 0}.cFdCKW_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}.cFdCKW_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}.cFdCKW_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.cFdCKW_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}.cFdCKW_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.cFdCKW_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.cFdCKW_detailModal{width:580px;max-width:calc(100vw - 48px)}.cFdCKW_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}.cFdCKW_detailGrid{flex-direction:column;gap:6px;display:flex}.cFdCKW_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.cFdCKW_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.cFdCKW_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}.cFdCKW_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.cFdCKW_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.cFdCKW_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.cFdCKW_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}.cFdCKW_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.cFdCKW_detailStars{color:#b45309;font-weight:600}.cFdCKW_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}.cFdCKW_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.cFdCKW_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.cFdCKW_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.cFdCKW_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}.cFdCKW_detailPathBtn svg{width:15px;height:15px}.cFdCKW_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.cFdCKW_detailStatusRunning,.cFdCKW_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.cFdCKW_detailStatusRunning{background:var(--hub-success)}.cFdCKW_detailStatusPending{background:var(--hub-warning)}.cFdCKW_detailStatusText{font-weight:500}"; const tagId$10 = "dsh-plugin/Modal.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) { const tag = document.createElement("style"); @@ -756,143 +756,157 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$10 }); var Modal_module_css_default = { - "uninstallConfirm": "BiQ1zG_uninstallConfirm", - "progress": "BiQ1zG_progress", - "linkIcon": "BiQ1zG_linkIcon", - "failList": "BiQ1zG_failList", - "helpModal": "BiQ1zG_helpModal", - "detailPathActions": "BiQ1zG_detailPathActions", - "failRow": "BiQ1zG_failRow", - "confirmIconDanger": "BiQ1zG_confirmIconDanger", - "failBigIssue": "BiQ1zG_failBigIssue", - "overlayIn": "BiQ1zG_overlayIn", - "pendingRowStatus": "BiQ1zG_pendingRowStatus", - "cliOnlyHint": "BiQ1zG_cliOnlyHint", - "resultCheckIcon": "BiQ1zG_resultCheckIcon", - "restartLater": "BiQ1zG_restartLater", - "detailLink": "BiQ1zG_detailLink", - "detailStatusPending": "BiQ1zG_detailStatusPending", - "queueRowPct": "BiQ1zG_queueRowPct", - "modal": "BiQ1zG_modal", - "modalHead": "BiQ1zG_modalHead", - "queueRowDesc": "BiQ1zG_queueRowDesc", - "noticeRowMain": "BiQ1zG_noticeRowMain", - "queueRowStatus": "BiQ1zG_queueRowStatus", - "failDiagBtn": "BiQ1zG_failDiagBtn", - "queueSection": "BiQ1zG_queueSection", - "modalWide": "BiQ1zG_modalWide", - "errorCopySoft": "BiQ1zG_errorCopySoft", - "aboutMeta": "BiQ1zG_aboutMeta", - "stripCancel": "BiQ1zG_stripCancel", - "noticeFoot": "BiQ1zG_noticeFoot", - "detailLabel": "BiQ1zG_detailLabel", - "progressFillFail": "BiQ1zG_progressFillFail", - "noticeBadgeOk": "BiQ1zG_noticeBadgeOk", - "failCopy": "BiQ1zG_failCopy", - "errorModal": "BiQ1zG_errorModal", - "aboutModal": "BiQ1zG_aboutModal", - "toast": "BiQ1zG_toast", - "modalCloseIcon": "BiQ1zG_modalCloseIcon", - "noticeMain": "BiQ1zG_noticeMain", - "modalClose": "BiQ1zG_modalClose", - "noticeVersion": "BiQ1zG_noticeVersion", - "noticeUpdateGo": "BiQ1zG_noticeUpdateGo", - "noticeRemove": "BiQ1zG_noticeRemove", - "modalTitleBusy": "BiQ1zG_modalTitleBusy", - "modalDesc": "BiQ1zG_modalDesc", - "resultCheck": "BiQ1zG_resultCheck", - "trustHint": "BiQ1zG_trustHint", - "modalTitleQueued": "BiQ1zG_modalTitleQueued", - "detailRow": "BiQ1zG_detailRow", - "toastIn": "BiQ1zG_toastIn", - "queueRow": "BiQ1zG_queueRow", - "noticeTextOk": "BiQ1zG_noticeTextOk", - "failedCopyHint": "BiQ1zG_failedCopyHint", - "modalLink": "BiQ1zG_modalLink", - "noticeTime": "BiQ1zG_noticeTime", - "noticeBadgeFail": "BiQ1zG_noticeBadgeFail", - "detailMono": "BiQ1zG_detailMono", - "detailPathBtn": "BiQ1zG_detailPathBtn", - "overlay": "BiQ1zG_overlay", - "noticeTextFail": "BiQ1zG_noticeTextFail", - "modalIn": "BiQ1zG_modalIn", - "progressFill": "BiQ1zG_progressFill", - "failKindInstall": "BiQ1zG_failKindInstall", - "restartNowWarning": "BiQ1zG_restartNowWarning", - "queuedHint": "BiQ1zG_queuedHint", - "result": "BiQ1zG_result", - "modalCmd": "BiQ1zG_modalCmd", - "noticeIgnore": "BiQ1zG_noticeIgnore", - "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem", - "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon", - "modalActions": "BiQ1zG_modalActions", - "hubUpdateNotes": "BiQ1zG_hubUpdateNotes", - "resultRestarting": "BiQ1zG_resultRestarting", - "detailGrid": "BiQ1zG_detailGrid", - "detailArrow": "BiQ1zG_detailArrow", - "resultTitle": "BiQ1zG_resultTitle", - "toastFail": "BiQ1zG_toastFail", - "detailPath": "BiQ1zG_detailPath", - "queueRowHead": "BiQ1zG_queueRowHead", - "failPrepareHint": "BiQ1zG_failPrepareHint", - "modalInstall": "BiQ1zG_modalInstall", - "detailStatusRunning": "BiQ1zG_detailStatusRunning", - "errorHint": "BiQ1zG_errorHint", - "modalLabel": "BiQ1zG_modalLabel", - "queueSectionTitle": "BiQ1zG_queueSectionTitle", - "confirmIconWrap": "BiQ1zG_confirmIconWrap", - "noticeRowUpdate": "BiQ1zG_noticeRowUpdate", - "noticeList": "BiQ1zG_noticeList", - "noticeHead": "BiQ1zG_noticeHead", - "queueRowTarget": "BiQ1zG_queueRowTarget", - "modalTitle": "BiQ1zG_modalTitle", - "failHead": "BiQ1zG_failHead", - "failKind": "BiQ1zG_failKind", - "detailPathText": "BiQ1zG_detailPathText", - "failRepo": "BiQ1zG_failRepo", - "detailModal": "BiQ1zG_detailModal", - "modalCmdText": "BiQ1zG_modalCmdText", - "confirmIcon": "BiQ1zG_confirmIcon", - "modalCmdCopy": "BiQ1zG_modalCmdCopy", - "hubUpdateModal": "BiQ1zG_hubUpdateModal", - "progressText": "BiQ1zG_progressText", - "confirmPrimary": "BiQ1zG_confirmPrimary", - "failEmpty": "BiQ1zG_failEmpty", - "modalBody": "BiQ1zG_modalBody", - "hubUpdateMeta": "BiQ1zG_hubUpdateMeta", - "failClear": "BiQ1zG_failClear", - "modalValue": "BiQ1zG_modalValue", - "pendingRowActions": "BiQ1zG_pendingRowActions", - "noticeRow": "BiQ1zG_noticeRow", - "failNetworkTarget": "BiQ1zG_failNetworkTarget", - "detailValue": "BiQ1zG_detailValue", - "detailDim": "BiQ1zG_detailDim", - "errorBox": "BiQ1zG_errorBox", - "modalCancel": "BiQ1zG_modalCancel", - "dangerConfirm": "BiQ1zG_dangerConfirm", - "queueRowBody": "BiQ1zG_queueRowBody", - "restartNow": "BiQ1zG_restartNow", - "progressTrack": "BiQ1zG_progressTrack", - "failKindUninstall": "BiQ1zG_failKindUninstall", - "modalRow": "BiQ1zG_modalRow", - "detailUpdateHint": "BiQ1zG_detailUpdateHint", - "modalCopy": "BiQ1zG_modalCopy", - "logModal": "BiQ1zG_logModal", - "errorTitle": "BiQ1zG_errorTitle", - "detailStars": "BiQ1zG_detailStars", - "detailStatusText": "BiQ1zG_detailStatusText", - "resultDesc": "BiQ1zG_resultDesc", - "aboutContent": "BiQ1zG_aboutContent", - "queueRowTrack": "BiQ1zG_queueRowTrack", - "progressHead": "BiQ1zG_progressHead", - "noticeRowOk": "BiQ1zG_noticeRowOk" + "detailDim": "cFdCKW_detailDim", + "progressFillFail": "cFdCKW_progressFillFail", + "errorCopySoft": "cFdCKW_errorCopySoft", + "resultCheckIcon": "cFdCKW_resultCheckIcon", + "failRow": "cFdCKW_failRow", + "aboutMeta": "cFdCKW_aboutMeta", + "detailGrid": "cFdCKW_detailGrid", + "confirmPrimary": "cFdCKW_confirmPrimary", + "detailUpdateHint": "cFdCKW_detailUpdateHint", + "failBigIssue": "cFdCKW_failBigIssue", + "modalCancel": "cFdCKW_modalCancel", + "hubUpdateMetaItem": "cFdCKW_hubUpdateMetaItem", + "detailValue": "cFdCKW_detailValue", + "modalValue": "cFdCKW_modalValue", + "trustHint": "cFdCKW_trustHint", + "noticeVersion": "cFdCKW_noticeVersion", + "detailPath": "cFdCKW_detailPath", + "modalLink": "cFdCKW_modalLink", + "modalTitle": "cFdCKW_modalTitle", + "queuedHint": "cFdCKW_queuedHint", + "aboutModal": "cFdCKW_aboutModal", + "detailStars": "cFdCKW_detailStars", + "modalCopy": "cFdCKW_modalCopy", + "progressFill": "cFdCKW_progressFill", + "logModal": "cFdCKW_logModal", + "toastFail": "cFdCKW_toastFail", + "queueRowHead": "cFdCKW_queueRowHead", + "errorModal": "cFdCKW_errorModal", + "confirmIconDanger": "cFdCKW_confirmIconDanger", + "dangerConfirm": "cFdCKW_dangerConfirm", + "noticeFoot": "cFdCKW_noticeFoot", + "progressText": "cFdCKW_progressText", + "detailRow": "cFdCKW_detailRow", + "noticeTime": "cFdCKW_noticeTime", + "noticeBadgeFail": "cFdCKW_noticeBadgeFail", + "modalClose": "cFdCKW_modalClose", + "noticeRow": "cFdCKW_noticeRow", + "confirmIcon": "cFdCKW_confirmIcon", + "modalHead": "cFdCKW_modalHead", + "detailStatusPending": "cFdCKW_detailStatusPending", + "helpModal": "cFdCKW_helpModal", + "detailMono": "cFdCKW_detailMono", + "modalCmdCopy": "cFdCKW_modalCmdCopy", + "detailArrow": "cFdCKW_detailArrow", + "queueRowTrack": "cFdCKW_queueRowTrack", + "queueRow": "cFdCKW_queueRow", + "noticeTextOk": "cFdCKW_noticeTextOk", + "failClear": "cFdCKW_failClear", + "detailModal": "cFdCKW_detailModal", + "noticeRowMain": "cFdCKW_noticeRowMain", + "modalBody": "cFdCKW_modalBody", + "queueSection": "cFdCKW_queueSection", + "restartLater": "cFdCKW_restartLater", + "restartNow": "cFdCKW_restartNow", + "failList": "cFdCKW_failList", + "modalRow": "cFdCKW_modalRow", + "aboutContent": "cFdCKW_aboutContent", + "failKind": "cFdCKW_failKind", + "noticeMain": "cFdCKW_noticeMain", + "failCopy": "cFdCKW_failCopy", + "failRepo": "cFdCKW_failRepo", + "noticeList": "cFdCKW_noticeList", + "queueRowBody": "cFdCKW_queueRowBody", + "modalDesc": "cFdCKW_modalDesc", + "failHead": "cFdCKW_failHead", + "failKindUninstall": "cFdCKW_failKindUninstall", + "queueSectionTitle": "cFdCKW_queueSectionTitle", + "overlayIn": "cFdCKW_overlayIn", + "failPrepareHint": "cFdCKW_failPrepareHint", + "modal": "cFdCKW_modal", + "modalCmdText": "cFdCKW_modalCmdText", + "detailLabel": "cFdCKW_detailLabel", + "errorHint": "cFdCKW_errorHint", + "stripCancel": "cFdCKW_stripCancel", + "detailPathText": "cFdCKW_detailPathText", + "hubUpdateModal": "cFdCKW_hubUpdateModal", + "failedCopyHint": "cFdCKW_failedCopyHint", + "uninstallConfirm": "cFdCKW_uninstallConfirm", + "modalCmd": "cFdCKW_modalCmd", + "failKindInstall": "cFdCKW_failKindInstall", + "failNetworkTarget": "cFdCKW_failNetworkTarget", + "progressHead": "cFdCKW_progressHead", + "hubUpdateMeta": "cFdCKW_hubUpdateMeta", + "hubUpdateNotes": "cFdCKW_hubUpdateNotes", + "detailLink": "cFdCKW_detailLink", + "detailPathActions": "cFdCKW_detailPathActions", + "toast": "cFdCKW_toast", + "resultTitle": "cFdCKW_resultTitle", + "detailStatusText": "cFdCKW_detailStatusText", + "failDiagBtn": "cFdCKW_failDiagBtn", + "errorBox": "cFdCKW_errorBox", + "resultRestarting": "cFdCKW_resultRestarting", + "failEmpty": "cFdCKW_failEmpty", + "noticeUpdateGo": "cFdCKW_noticeUpdateGo", + "noticeTextFail": "cFdCKW_noticeTextFail", + "modalWide": "cFdCKW_modalWide", + "linkIcon": "cFdCKW_linkIcon", + "noticeBadgeIcon": "cFdCKW_noticeBadgeIcon", + "restartNowWarning": "cFdCKW_restartNowWarning", + "modalLabel": "cFdCKW_modalLabel", + "queueRowDesc": "cFdCKW_queueRowDesc", + "detailStatusRunning": "cFdCKW_detailStatusRunning", + "noticeRowOk": "cFdCKW_noticeRowOk", + "progress": "cFdCKW_progress", + "cliOnlyHint": "cFdCKW_cliOnlyHint", + "modalTitleQueued": "cFdCKW_modalTitleQueued", + "noticeHead": "cFdCKW_noticeHead", + "result": "cFdCKW_result", + "pendingRowStatus": "cFdCKW_pendingRowStatus", + "resultDesc": "cFdCKW_resultDesc", + "noticeRowUpdate": "cFdCKW_noticeRowUpdate", + "noticeRemove": "cFdCKW_noticeRemove", + "modalInstall": "cFdCKW_modalInstall", + "modalIn": "cFdCKW_modalIn", + "queueRowStatus": "cFdCKW_queueRowStatus", + "overlay": "cFdCKW_overlay", + "noticeBadgeOk": "cFdCKW_noticeBadgeOk", + "toastIn": "cFdCKW_toastIn", + "confirmIconWrap": "cFdCKW_confirmIconWrap", + "resultCheck": "cFdCKW_resultCheck", + "progressTrack": "cFdCKW_progressTrack", + "queueRowTarget": "cFdCKW_queueRowTarget", + "modalTitleBusy": "cFdCKW_modalTitleBusy", + "modalActions": "cFdCKW_modalActions", + "queueRowPct": "cFdCKW_queueRowPct", + "pendingRowActions": "cFdCKW_pendingRowActions", + "noticeIgnore": "cFdCKW_noticeIgnore", + "modalCloseIcon": "cFdCKW_modalCloseIcon", + "errorTitle": "cFdCKW_errorTitle", + "detailPathBtn": "cFdCKW_detailPathBtn" }; //#endregion + //#region src/server/services/install/release-target.ts + /** Safe prebuilt GitHub release targets for the existing catalog command contract. */ + function githubReleaseTarget(value) { + const input = value.trim(); + const raw = /^dsh\s+plugin\s+--profile(?:\s+|=)\S+\s+(?:add|update)\s+(.+)$/i.exec(input)?.[1] ?? input; + const target = raw.startsWith("\"") && raw.endsWith("\"") ? raw.slice(1, -1) : raw; + const match = /^https:\/\/github\.com\/([A-Za-z0-9._-]+)\/([A-Za-z0-9._-]+)\/releases\/download\/([A-Za-z0-9._+-]+)\/([A-Za-z0-9._+-]+\.tgz)$/.exec(target); + if (match === null || match.slice(1).some((part) => part === "." || part === "..")) return null; + return { + target, + repo: `${match[1]}/${match[2]}` + }; + } + //#endregion //#region src/client/logic/install-command.ts /** * 安装通道决策(用户无感知):目录探测到 npm 包名 → 用 npm 包名安装 - * (走 npm registry tarball,更快、与 GitHub 网络无关);无 npm 包名 → git 直装。 - * 返回值 target 即传给后端 /install 的安装目标(npm 包名 或 owner/repo)。 + * (走 npm registry tarball,更快、与 GitHub 网络无关);其次使用同仓库的权威 release 包命令,最后 git 直装。 + * 返回值 target 即传给后端 /install 的安装目标(npm 包名、release URL 或 owner/repo)。 */ function installTargetOf(p) { const pkg = (p.source?.npmPackage ?? "").trim(); @@ -901,6 +915,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { target: pkg, via: "npm" }; + const release = githubReleaseTarget(p.install?.githubCommand ?? ""); + if (release?.repo.toLowerCase() === repo.toLowerCase()) return { + target: release.target, + via: "release" + }; return { target: repo, via: "github" @@ -911,6 +930,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { * 常规插件无目录命令时按通道回退生成:npm 显示包名,git 显示显式 HTTPS URL。 */ function installCommandOf(p, withProfile = false) { const { target, via } = installTargetOf(p); + if (via === "release") return `dsh plugin${withProfile ? " --profile web" : ""} add ${target}`; if (via === "npm") { const cmd = p.install?.command; if (cmd) return cmd; @@ -923,6 +943,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { /** Normalize a task/install target to its owner/repo display identity. */ function repoFromInstallTarget(value) { const input = value.trim(); + const release = githubReleaseTarget(input); + if (release !== null) return release.repo; if (/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(input)) return input; for (const pattern of [ /^github:([^/]+)\/([^/]+)$/i, @@ -3593,9 +3615,19 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { * 客户端按接口返回渲染,不内置固定文案。 * 图片(反馈群二维码)经 renderMarkdown 的 ![](url) 语法嵌入,居中、最大高度受控。 */ + /** + * 反馈群二维码 URL 恒定(每次换码都是同名覆盖,文件名不变),浏览器 / CDN 会按 + * URL 缓存旧图。这里在渲染前给二维码 URL 实时拼一个新的时间戳,强制每次打开 + * 「关注我们」都回源拉取最新图片,无需重新构建 / 部署接口中心。 + * 匹配规则与 renderMarkdown 的二维码识别保持一致(dsh-plugin-user-group-qr 前缀)。 + */ + function bustQrCache(md, ts) { + return md.replace(/(!\[[^\]]*\]\()([^)\s]*dsh-plugin-user-group-qr[^)\s]*)/g, (_m, pre, url) => `${pre}${String(url).split("?")[0]}?v=${ts}`); + } function AboutModal({ info, lang, t, onClose }) { const contentRaw = info ? typeof info.content === "string" ? info.content : info.content && typeof info.content === "object" ? lang === "en" ? info.content.en ?? info.content.zh ?? "" : info.content.zh ?? info.content.en ?? "" : "" : ""; - const contentHtml = contentRaw.trim() ? renderMarkdown(contentRaw) : null; + const qrTs = (0, react.useMemo)(() => Date.now(), []); + const contentHtml = contentRaw.trim() ? renderMarkdown(bustQrCache(contentRaw, qrTs)) : null; let updated = null; if (info?.updatedAt) { const d = new Date(info.updatedAt); @@ -4180,7 +4212,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/List.module.css.mjs - const css$9 = "._3XaZHa_body{flex-direction:column;flex:1;min-height:0;display:flex}._3XaZHa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}._3XaZHa_moreSentinel{flex-shrink:0;height:1px}._3XaZHa_card{border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}._3XaZHa_card:hover{border-color:var(--hub-brand);background:var(--hub-bg-2)}._3XaZHa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}._3XaZHa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}._3XaZHa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}._3XaZHa_categoryBadge,._3XaZHa_verified,._3XaZHa_versionBadge,._3XaZHa_updateBadge{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_categoryBadge{color:var(--hub-brand);border-color:var(--hub-border-ghost)}._3XaZHa_verified{color:var(--hub-success);border-color:var(--hub-success-border)}._3XaZHa_versionBadge{color:var(--hub-text-secondary);border-color:var(--hub-border-input)}._3XaZHa_updateBadge{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._3XaZHa_desc{color:var(--hub-text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}._3XaZHa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}._3XaZHa_topic{color:var(--hub-text-tertiary);background:var(--hub-bg-3);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}._3XaZHa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}._3XaZHa_star{color:var(--hub-warn);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_fork{color:var(--hub-text-tertiary);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_date{color:var(--hub-text-tertiary);white-space:nowrap;font-size:10px;line-height:14px}._3XaZHa_installBtn,._3XaZHa_installBtnCopied,._3XaZHa_installBtnInstalled,._3XaZHa_installBtnUpdate,._3XaZHa_uninstallBtn,._3XaZHa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}._3XaZHa_installBtnInstalled{color:var(--hub-success);background:var(--hub-success-tint);cursor:default;-webkit-user-select:none;user-select:none;border:none}._3XaZHa_installBtnUpdate{color:#fff;background:var(--hub-warn);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtnUpdate:hover{background:var(--hub-warn-strong)}._3XaZHa_uninstallBtn{color:var(--hub-danger);background:var(--hub-danger-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_uninstallBtn:hover{color:#fff;background:var(--hub-danger-hover)}body[data-ds-dark-theme] ._3XaZHa_uninstallBtn{color:#fff;background:var(--hub-danger)}body[data-ds-dark-theme] ._3XaZHa_uninstallBtn:hover{background:var(--hub-danger-hover)}._3XaZHa_installBtn{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtn:hover{background:var(--hub-btn-hover)}._3XaZHa_detailBtn{color:var(--hub-text-secondary);-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;text-decoration:none;display:inline-flex}._3XaZHa_detailBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_actions{align-items:center;gap:6px;display:flex}._3XaZHa_installBtnCopied{color:var(--hub-success);background:var(--hub-success-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_state{text-align:center;min-height:160px;color:var(--hub-text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}._3XaZHa_stateTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600}._3XaZHa_stateDesc{max-width:420px}._3XaZHa_retryBtn{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:4px 12px;font-size:12px;line-height:18px}._3XaZHa_retryBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_stateActions{align-items:center;gap:8px;margin-top:4px;display:flex}._3XaZHa_diagBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:4px 12px;font-size:12px;line-height:18px}._3XaZHa_diagBtn:hover{background:var(--hub-brand-hover)}._3XaZHa_footer{border-top:1px solid var(--hub-border-1);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:6px 4px 0;display:flex}._3XaZHa_footLink{color:var(--hub-brand);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}._3XaZHa_footLink:hover{text-decoration:underline}"; + const css$9 = ".I6e0IG_body{flex-direction:column;flex:1;min-height:0;display:flex}.I6e0IG_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}.I6e0IG_moreSentinel{flex-shrink:0;height:1px}.I6e0IG_card{border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}.I6e0IG_card:hover{border-color:var(--hub-brand);background:var(--hub-bg-2)}.I6e0IG_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}.I6e0IG_cardHead{align-items:center;gap:6px;min-width:0;display:flex}.I6e0IG_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.I6e0IG_categoryBadge,.I6e0IG_verified,.I6e0IG_versionBadge,.I6e0IG_updateBadge{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.I6e0IG_categoryBadge{color:var(--hub-brand);border-color:var(--hub-border-ghost)}.I6e0IG_verified{color:var(--hub-success);border-color:var(--hub-success-border)}.I6e0IG_versionBadge{color:var(--hub-text-secondary);border-color:var(--hub-border-input)}.I6e0IG_updateBadge{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.I6e0IG_desc{color:var(--hub-text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.I6e0IG_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}.I6e0IG_topic{color:var(--hub-text-tertiary);background:var(--hub-bg-3);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.I6e0IG_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}.I6e0IG_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}.I6e0IG_star{color:var(--hub-warn);white-space:nowrap;font-size:11px;line-height:16px}.I6e0IG_fork{color:var(--hub-text-tertiary);white-space:nowrap;font-size:11px;line-height:16px}.I6e0IG_date{color:var(--hub-text-tertiary);white-space:nowrap;font-size:10px;line-height:14px}.I6e0IG_installBtn,.I6e0IG_installBtnCopied,.I6e0IG_installBtnInstalled,.I6e0IG_installBtnUpdate,.I6e0IG_uninstallBtn,.I6e0IG_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}.I6e0IG_installBtnInstalled{color:var(--hub-success);background:var(--hub-success-tint);cursor:default;-webkit-user-select:none;user-select:none;border:none}.I6e0IG_installBtnUpdate{color:#fff;background:var(--hub-warn);-webkit-user-select:none;user-select:none;border:none;font-weight:500}.I6e0IG_installBtnUpdate:hover{background:var(--hub-warn-strong)}.I6e0IG_uninstallBtn{color:var(--hub-danger);background:var(--hub-danger-tint);-webkit-user-select:none;user-select:none;border:none}.I6e0IG_uninstallBtn:hover{color:#fff;background:var(--hub-danger-hover)}body[data-ds-dark-theme] .I6e0IG_uninstallBtn{color:#fff;background:var(--hub-danger)}body[data-ds-dark-theme] .I6e0IG_uninstallBtn:hover{background:var(--hub-danger-hover)}.I6e0IG_installBtn{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);-webkit-user-select:none;user-select:none;border:none;font-weight:500}.I6e0IG_installBtn:hover{background:var(--hub-btn-hover)}.I6e0IG_detailBtn{color:var(--hub-text-secondary);-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;text-decoration:none;display:inline-flex}.I6e0IG_detailBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.I6e0IG_actions{align-items:center;gap:6px;display:flex}.I6e0IG_installBtnCopied{color:var(--hub-success);background:var(--hub-success-tint);-webkit-user-select:none;user-select:none;border:none}.I6e0IG_state{text-align:center;min-height:160px;color:var(--hub-text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}.I6e0IG_stateTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600}.I6e0IG_stateDesc{max-width:420px}.I6e0IG_retryBtn{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:4px 12px;font-size:12px;line-height:18px}.I6e0IG_retryBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.I6e0IG_stateActions{align-items:center;gap:8px;margin-top:4px;display:flex}.I6e0IG_diagBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:4px 12px;font-size:12px;line-height:18px}.I6e0IG_diagBtn:hover{background:var(--hub-brand-hover)}.I6e0IG_footer{border-top:1px solid var(--hub-border-1);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:6px 4px 0;display:flex}.I6e0IG_footLink{color:var(--hub-brand);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}.I6e0IG_footLink:hover{text-decoration:underline}"; const tagId$9 = "dsh-plugin/List.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$9) + "]") === null) { const tag = document.createElement("style"); @@ -4195,40 +4227,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$9 }); var List_module_css_default = { - "cardTitle": "_3XaZHa_cardTitle", - "cardMain": "_3XaZHa_cardMain", - "moreSentinel": "_3XaZHa_moreSentinel", - "installBtnUpdate": "_3XaZHa_installBtnUpdate", - "fork": "_3XaZHa_fork", - "topic": "_3XaZHa_topic", - "list": "_3XaZHa_list", - "stats": "_3XaZHa_stats", - "topics": "_3XaZHa_topics", - "installBtn": "_3XaZHa_installBtn", - "retryBtn": "_3XaZHa_retryBtn", - "versionBadge": "_3XaZHa_versionBadge", - "installBtnInstalled": "_3XaZHa_installBtnInstalled", - "date": "_3XaZHa_date", - "cardHead": "_3XaZHa_cardHead", - "desc": "_3XaZHa_desc", - "state": "_3XaZHa_state", - "cardSide": "_3XaZHa_cardSide", - "verified": "_3XaZHa_verified", - "stateTitle": "_3XaZHa_stateTitle", - "categoryBadge": "_3XaZHa_categoryBadge", - "actions": "_3XaZHa_actions", - "star": "_3XaZHa_star", - "updateBadge": "_3XaZHa_updateBadge", - "footer": "_3XaZHa_footer", - "diagBtn": "_3XaZHa_diagBtn", - "stateActions": "_3XaZHa_stateActions", - "card": "_3XaZHa_card", - "footLink": "_3XaZHa_footLink", - "installBtnCopied": "_3XaZHa_installBtnCopied", - "stateDesc": "_3XaZHa_stateDesc", - "detailBtn": "_3XaZHa_detailBtn", - "body": "_3XaZHa_body", - "uninstallBtn": "_3XaZHa_uninstallBtn" + "body": "I6e0IG_body", + "cardTitle": "I6e0IG_cardTitle", + "installBtnUpdate": "I6e0IG_installBtnUpdate", + "date": "I6e0IG_date", + "stateTitle": "I6e0IG_stateTitle", + "cardSide": "I6e0IG_cardSide", + "versionBadge": "I6e0IG_versionBadge", + "stateDesc": "I6e0IG_stateDesc", + "card": "I6e0IG_card", + "topics": "I6e0IG_topics", + "installBtnCopied": "I6e0IG_installBtnCopied", + "state": "I6e0IG_state", + "topic": "I6e0IG_topic", + "diagBtn": "I6e0IG_diagBtn", + "detailBtn": "I6e0IG_detailBtn", + "updateBadge": "I6e0IG_updateBadge", + "installBtn": "I6e0IG_installBtn", + "cardMain": "I6e0IG_cardMain", + "star": "I6e0IG_star", + "verified": "I6e0IG_verified", + "cardHead": "I6e0IG_cardHead", + "footLink": "I6e0IG_footLink", + "list": "I6e0IG_list", + "moreSentinel": "I6e0IG_moreSentinel", + "desc": "I6e0IG_desc", + "retryBtn": "I6e0IG_retryBtn", + "installBtnInstalled": "I6e0IG_installBtnInstalled", + "stats": "I6e0IG_stats", + "actions": "I6e0IG_actions", + "fork": "I6e0IG_fork", + "uninstallBtn": "I6e0IG_uninstallBtn", + "stateActions": "I6e0IG_stateActions", + "categoryBadge": "I6e0IG_categoryBadge", + "footer": "I6e0IG_footer" }; //#endregion //#region src/client/hooks/useIncrementalList.ts @@ -4420,7 +4452,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/SectionTabs.module.css.mjs - const css$8 = "._7tvizq_root{border-bottom:1px solid var(--hub-border-1);flex-shrink:0;align-items:stretch;gap:28px;padding:0 2px;display:flex}._7tvizq_tab,._7tvizq_tabActive{cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;gap:7px;height:38px;padding:0 4px;font-size:14px;line-height:38px;transition:color .12s;display:inline-flex;position:relative}._7tvizq_tab{color:var(--hub-text-secondary)}._7tvizq_tab:hover{color:var(--hub-text-primary)}._7tvizq_tabActive{color:var(--hub-text-primary);font-weight:600}._7tvizq_tabIcon{flex-shrink:0;align-items:center;line-height:1;display:inline-flex}._7tvizq_tabActive:after{content:\"\";background:var(--hub-brand);border-radius:1px;height:2px;position:absolute;bottom:-1px;left:0;right:0}._7tvizq_tabCount,._7tvizq_tabCountActive{text-align:center;border-radius:999px;min-width:18px;padding:0 6px;font-size:11px;line-height:16px}._7tvizq_tabCount{color:var(--hub-text-tertiary);background:var(--hub-bg-btn)}._7tvizq_tabActive ._7tvizq_tabCountActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}._7tvizq_noticeBtn{box-sizing:border-box;height:26px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:6px;flex-shrink:0;align-self:center;align-items:center;gap:5px;margin-left:auto;padding:0 8px;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex;position:relative}._7tvizq_noticeBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover);border-color:var(--hub-border-2)}._7tvizq_noticeIcon{align-items:center;line-height:1;display:inline-flex}._7tvizq_noticeCount{text-align:center;color:#fff;background:var(--hub-danger);border-radius:999px;min-width:17px;height:17px;padding:0 5px;font-size:11px;font-weight:600;line-height:17px;box-shadow:0 1px 3px #d1242f59}"; + const css$8 = "._4aDYyW_root{border-bottom:1px solid var(--hub-border-1);flex-shrink:0;align-items:stretch;gap:28px;padding:0 2px;display:flex}._4aDYyW_tab,._4aDYyW_tabActive{cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;gap:7px;height:38px;padding:0 4px;font-size:14px;line-height:38px;transition:color .12s;display:inline-flex;position:relative}._4aDYyW_tab{color:var(--hub-text-secondary)}._4aDYyW_tab:hover{color:var(--hub-text-primary)}._4aDYyW_tabActive{color:var(--hub-text-primary);font-weight:600}._4aDYyW_tabIcon{flex-shrink:0;align-items:center;line-height:1;display:inline-flex}._4aDYyW_tabActive:after{content:\"\";background:var(--hub-brand);border-radius:1px;height:2px;position:absolute;bottom:-1px;left:0;right:0}._4aDYyW_tabCount,._4aDYyW_tabCountActive{text-align:center;border-radius:999px;min-width:18px;padding:0 6px;font-size:11px;line-height:16px}._4aDYyW_tabCount{color:var(--hub-text-tertiary);background:var(--hub-bg-btn)}._4aDYyW_tabActive ._4aDYyW_tabCountActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}._4aDYyW_noticeBtn{box-sizing:border-box;height:26px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:6px;flex-shrink:0;align-self:center;align-items:center;gap:5px;margin-left:auto;padding:0 8px;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex;position:relative}._4aDYyW_noticeBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover);border-color:var(--hub-border-2)}._4aDYyW_noticeIcon{align-items:center;line-height:1;display:inline-flex}._4aDYyW_noticeCount{text-align:center;color:#fff;background:var(--hub-danger);border-radius:999px;min-width:17px;height:17px;padding:0 5px;font-size:11px;font-weight:600;line-height:17px;box-shadow:0 1px 3px #d1242f59}"; const tagId$8 = "dsh-plugin/SectionTabs.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) { const tag = document.createElement("style"); @@ -4435,15 +4467,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$8 }); var SectionTabs_module_css_default = { - "root": "_7tvizq_root", - "tab": "_7tvizq_tab", - "tabCount": "_7tvizq_tabCount", - "tabCountActive": "_7tvizq_tabCountActive", - "noticeIcon": "_7tvizq_noticeIcon", - "noticeCount": "_7tvizq_noticeCount", - "tabActive": "_7tvizq_tabActive", - "tabIcon": "_7tvizq_tabIcon", - "noticeBtn": "_7tvizq_noticeBtn" + "noticeIcon": "_4aDYyW_noticeIcon", + "tabIcon": "_4aDYyW_tabIcon", + "noticeCount": "_4aDYyW_noticeCount", + "root": "_4aDYyW_root", + "tab": "_4aDYyW_tab", + "tabActive": "_4aDYyW_tabActive", + "noticeBtn": "_4aDYyW_noticeBtn", + "tabCount": "_4aDYyW_tabCount", + "tabCountActive": "_4aDYyW_tabCountActive" }; //#endregion //#region src/client/components/layout/SectionTabs.tsx @@ -4505,7 +4537,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/InstalledView.module.css.mjs - const css$7 = "._1nXeGW_root{flex-direction:column;gap:8px;min-width:0;display:flex}._1nXeGW_toolbar{border-bottom:1px solid var(--hub-border-1);flex-direction:column;flex-shrink:0;gap:8px;padding:0 2px 10px;display:flex}._1nXeGW_searchWrap{width:100%;min-width:0;height:28px}._1nXeGW_searchInput{width:100%;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}._1nXeGW_searchInput::placeholder{color:var(--hub-text-tertiary)}._1nXeGW_searchInput:focus{border-color:var(--hub-brand)}._1nXeGW_segRow{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}._1nXeGW_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}._1nXeGW_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}._1nXeGW_segBtn svg{flex-shrink:0;display:block}._1nXeGW_segBtn+._1nXeGW_segBtn{border-left:1px solid var(--hub-border-2)}._1nXeGW_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._1nXeGW_segBtnActive,._1nXeGW_segBtnActive:hover{color:#fff;background:var(--hub-brand)}._1nXeGW_empty{color:var(--hub-text-tertiary);text-align:center;border:1px dashed var(--hub-border-2);border-radius:8px;flex-direction:column;align-items:center;gap:4px;padding:36px 12px;font-size:12px;line-height:18px;display:flex}._1nXeGW_emptyTitle{color:var(--hub-text-secondary);font-size:13px;font-weight:600}._1nXeGW_emptyDesc{color:var(--hub-text-tertiary)}._1nXeGW_list{border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex;overflow:hidden}._1nXeGW_row{background:var(--hub-bg-1);cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:8px 10px;transition:background .12s;display:flex}._1nXeGW_row+._1nXeGW_row{border-top:1px solid var(--hub-border-1)}._1nXeGW_row:hover{background:var(--hub-bg-2)}._1nXeGW_rowTitleLine{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_rowDesc{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;padding-left:16px;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_statusDot{background:var(--hub-success);border-radius:50%;flex-shrink:0;width:8px;height:8px}._1nXeGW_statusDot._1nXeGW_statusPending{background:var(--hub-warning)}._1nXeGW_statusDot._1nXeGW_statusInactive{background:var(--hub-text-tertiary)}._1nXeGW_rowMain{flex:auto;align-items:baseline;gap:6px;min-width:0;display:flex}._1nXeGW_rowTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}._1nXeGW_versionBadge{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px}._1nXeGW_updateBadge{color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_rowSourceTag{box-sizing:border-box;text-align:center;white-space:nowrap;text-overflow:ellipsis;border-radius:4px;flex-shrink:0;width:60px;padding:0 4px;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}._1nXeGW_rowSourceTagHub{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft)}._1nXeGW_rowSourceTagManual{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border)}._1nXeGW_exampleBadge{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_exampleRow{align-items:center;min-width:0;padding-left:16px;display:flex}._1nXeGW_rowMeta{align-items:center;gap:8px;min-width:0;padding-left:16px;display:flex;overflow:hidden}._1nXeGW_rowRepo{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_rowCategory{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}._1nXeGW_rowActions{flex-shrink:0;align-items:center;gap:4px;display:flex}._1nXeGW_rowDetail{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:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowDetail:hover{color:var(--hub-text-primary);border-color:var(--hub-border-ghost);background:var(--hub-bg-hover)}._1nXeGW_rowRestart{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowRestart:hover{color:#fff;background:var(--hub-warning);border-color:var(--hub-warning)}._1nXeGW_rowUpdate{color:#fff;background:var(--hub-warn);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s}._1nXeGW_rowUpdate:hover{background:var(--hub-warn-strong)}._1nXeGW_rowUninstall{color:var(--hub-danger);border:1px solid var(--hub-danger-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowUninstall:hover,body[data-ds-dark-theme] ._1nXeGW_rowUninstall{color:#fff;background:var(--hub-danger);border-color:var(--hub-danger)}body[data-ds-dark-theme] ._1nXeGW_rowUninstall:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}"; + const css$7 = ".rgh3Nq_root{flex-direction:column;gap:8px;min-width:0;display:flex}.rgh3Nq_toolbar{border-bottom:1px solid var(--hub-border-1);flex-direction:column;flex-shrink:0;gap:8px;padding:0 2px 10px;display:flex}.rgh3Nq_searchWrap{width:100%;min-width:0;height:28px}.rgh3Nq_searchInput{width:100%;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.rgh3Nq_searchInput::placeholder{color:var(--hub-text-tertiary)}.rgh3Nq_searchInput:focus{border-color:var(--hub-brand)}.rgh3Nq_segRow{align-items:center;gap:8px;min-width:0;display:flex}.rgh3Nq_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}.rgh3Nq_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}.rgh3Nq_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}.rgh3Nq_segBtn svg{flex-shrink:0;display:block}.rgh3Nq_segBtn+.rgh3Nq_segBtn{border-left:1px solid var(--hub-border-2)}.rgh3Nq_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.rgh3Nq_segBtnActive,.rgh3Nq_segBtnActive:hover{color:#fff;background:var(--hub-brand)}.rgh3Nq_empty{color:var(--hub-text-tertiary);text-align:center;border:1px dashed var(--hub-border-2);border-radius:8px;flex-direction:column;align-items:center;gap:4px;padding:36px 12px;font-size:12px;line-height:18px;display:flex}.rgh3Nq_emptyTitle{color:var(--hub-text-secondary);font-size:13px;font-weight:600}.rgh3Nq_emptyDesc{color:var(--hub-text-tertiary)}.rgh3Nq_list{border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex;overflow:hidden}.rgh3Nq_row{background:var(--hub-bg-1);cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:8px 10px;transition:background .12s;display:flex}.rgh3Nq_row+.rgh3Nq_row{border-top:1px solid var(--hub-border-1)}.rgh3Nq_row:hover{background:var(--hub-bg-2)}.rgh3Nq_rowTitleLine{align-items:center;gap:8px;min-width:0;display:flex}.rgh3Nq_rowDesc{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;padding-left:16px;font-size:11px;line-height:16px;overflow:hidden}.rgh3Nq_statusDot{background:var(--hub-success);border-radius:50%;flex-shrink:0;width:8px;height:8px}.rgh3Nq_statusDot.rgh3Nq_statusPending{background:var(--hub-warning)}.rgh3Nq_statusDot.rgh3Nq_statusInactive{background:var(--hub-text-tertiary)}.rgh3Nq_rowMain{flex:auto;align-items:baseline;gap:6px;min-width:0;display:flex}.rgh3Nq_rowTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}.rgh3Nq_versionBadge{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px}.rgh3Nq_updateBadge{color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}.rgh3Nq_rowSourceTag{box-sizing:border-box;text-align:center;white-space:nowrap;text-overflow:ellipsis;border-radius:4px;flex-shrink:0;width:60px;padding:0 4px;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}.rgh3Nq_rowSourceTagHub{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft)}.rgh3Nq_rowSourceTagManual{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border)}.rgh3Nq_exampleBadge{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}.rgh3Nq_exampleRow{align-items:center;min-width:0;padding-left:16px;display:flex}.rgh3Nq_rowMeta{align-items:center;gap:8px;min-width:0;padding-left:16px;display:flex;overflow:hidden}.rgh3Nq_rowRepo{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px;overflow:hidden}.rgh3Nq_rowCategory{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}.rgh3Nq_rowActions{flex-shrink:0;align-items:center;gap:4px;display:flex}.rgh3Nq_rowDetail{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:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}.rgh3Nq_rowDetail:hover{color:var(--hub-text-primary);border-color:var(--hub-border-ghost);background:var(--hub-bg-hover)}.rgh3Nq_rowRestart{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:color .12s,background .12s,border-color .12s}.rgh3Nq_rowRestart:hover{color:#fff;background:var(--hub-warning);border-color:var(--hub-warning)}.rgh3Nq_rowUpdate{color:#fff;background:var(--hub-warn);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s}.rgh3Nq_rowUpdate:hover{background:var(--hub-warn-strong)}.rgh3Nq_rowUninstall{color:var(--hub-danger);border:1px solid var(--hub-danger-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}.rgh3Nq_rowUninstall:hover,body[data-ds-dark-theme] .rgh3Nq_rowUninstall{color:#fff;background:var(--hub-danger);border-color:var(--hub-danger)}body[data-ds-dark-theme] .rgh3Nq_rowUninstall:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}"; const tagId$7 = "dsh-plugin/InstalledView.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) { const tag = document.createElement("style"); @@ -4520,42 +4552,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$7 }); var InstalledView_module_css_default = { - "searchInput": "_1nXeGW_searchInput", - "segBtnActive": "_1nXeGW_segBtnActive", - "exampleRow": "_1nXeGW_exampleRow", - "rowUpdate": "_1nXeGW_rowUpdate", - "statusInactive": "_1nXeGW_statusInactive", - "rowSourceTag": "_1nXeGW_rowSourceTag", - "versionBadge": "_1nXeGW_versionBadge", - "list": "_1nXeGW_list", - "rowRepo": "_1nXeGW_rowRepo", - "segRow": "_1nXeGW_segRow", - "rowDetail": "_1nXeGW_rowDetail", - "statusDot": "_1nXeGW_statusDot", - "rowCategory": "_1nXeGW_rowCategory", - "searchWrap": "_1nXeGW_searchWrap", - "statusPending": "_1nXeGW_statusPending", - "emptyTitle": "_1nXeGW_emptyTitle", - "root": "_1nXeGW_root", - "rowMain": "_1nXeGW_rowMain", - "rowSourceTagManual": "_1nXeGW_rowSourceTagManual", - "row": "_1nXeGW_row", - "segGroup": "_1nXeGW_segGroup", - "segLabel": "_1nXeGW_segLabel", - "segBtn": "_1nXeGW_segBtn", - "rowTitleLine": "_1nXeGW_rowTitleLine", - "empty": "_1nXeGW_empty", - "rowDesc": "_1nXeGW_rowDesc", - "rowTitle": "_1nXeGW_rowTitle", - "updateBadge": "_1nXeGW_updateBadge", - "rowMeta": "_1nXeGW_rowMeta", - "rowActions": "_1nXeGW_rowActions", - "rowUninstall": "_1nXeGW_rowUninstall", - "rowSourceTagHub": "_1nXeGW_rowSourceTagHub", - "exampleBadge": "_1nXeGW_exampleBadge", - "rowRestart": "_1nXeGW_rowRestart", - "toolbar": "_1nXeGW_toolbar", - "emptyDesc": "_1nXeGW_emptyDesc" + "rowDetail": "rgh3Nq_rowDetail", + "segRow": "rgh3Nq_segRow", + "segBtn": "rgh3Nq_segBtn", + "segGroup": "rgh3Nq_segGroup", + "searchWrap": "rgh3Nq_searchWrap", + "emptyDesc": "rgh3Nq_emptyDesc", + "rowActions": "rgh3Nq_rowActions", + "segBtnActive": "rgh3Nq_segBtnActive", + "rowRepo": "rgh3Nq_rowRepo", + "empty": "rgh3Nq_empty", + "rowDesc": "rgh3Nq_rowDesc", + "statusPending": "rgh3Nq_statusPending", + "list": "rgh3Nq_list", + "root": "rgh3Nq_root", + "statusInactive": "rgh3Nq_statusInactive", + "emptyTitle": "rgh3Nq_emptyTitle", + "searchInput": "rgh3Nq_searchInput", + "row": "rgh3Nq_row", + "exampleBadge": "rgh3Nq_exampleBadge", + "rowTitleLine": "rgh3Nq_rowTitleLine", + "rowMain": "rgh3Nq_rowMain", + "segLabel": "rgh3Nq_segLabel", + "rowTitle": "rgh3Nq_rowTitle", + "updateBadge": "rgh3Nq_updateBadge", + "rowMeta": "rgh3Nq_rowMeta", + "statusDot": "rgh3Nq_statusDot", + "toolbar": "rgh3Nq_toolbar", + "exampleRow": "rgh3Nq_exampleRow", + "rowRestart": "rgh3Nq_rowRestart", + "rowUpdate": "rgh3Nq_rowUpdate", + "rowSourceTagManual": "rgh3Nq_rowSourceTagManual", + "rowCategory": "rgh3Nq_rowCategory", + "rowSourceTagHub": "rgh3Nq_rowSourceTagHub", + "rowSourceTag": "rgh3Nq_rowSourceTag", + "versionBadge": "rgh3Nq_versionBadge", + "rowUninstall": "rgh3Nq_rowUninstall" }; //#endregion //#region src/client/components/views/InstalledView.tsx @@ -4786,7 +4818,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/CustomInstallView.module.css.mjs - 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}"; + const css$6 = ".K8xGBq_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.K8xGBq_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.K8xGBq_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.K8xGBq_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}.K8xGBq_installCardHead{align-items:center;min-width:0;display:flex}.K8xGBq_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.K8xGBq_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}.K8xGBq_installHelpBtn:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft)}.K8xGBq_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}.K8xGBq_installInsertBtn:hover{color:var(--hub-brand);border-color:var(--hub-brand-border-soft);background:var(--hub-brand-tint)}.K8xGBq_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.K8xGBq_installRow{align-items:center;gap:8px;min-width:0;display:flex}.K8xGBq_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}.K8xGBq_installInput::placeholder{color:var(--hub-text-tertiary)}.K8xGBq_installInput:focus{border-color:var(--hub-brand)}.K8xGBq_installInputError,.K8xGBq_installInputError:focus{border-color:var(--hub-danger-text)}.K8xGBq_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}.K8xGBq_installBtn:hover{background:var(--hub-brand-hover)}.K8xGBq_installBtn:disabled{opacity:.45;cursor:default}.K8xGBq_installCardDisabled{opacity:.8}.K8xGBq_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}.K8xGBq_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.K8xGBq_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}.K8xGBq_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.K8xGBq_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}.K8xGBq_helpBody{flex-direction:column;gap:7px;padding:4px 2px;display:flex}.K8xGBq_helpLine{align-items:baseline;gap:12px;min-width:0;font-size:12px;line-height:20px;display:flex}.K8xGBq_helpCmd{color:var(--hub-text-primary);white-space:nowrap;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.K8xGBq_helpNote{min-width:0;color:var(--hub-text-tertiary);font-size:11px}"; const tagId$6 = "dsh-plugin/CustomInstallView.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) { const tag = document.createElement("style"); @@ -4801,28 +4833,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$6 }); var CustomInstallView_module_css_default = { - "installError": "zISxCG_installError", - "desc": "zISxCG_desc", - "installHelpBtn": "zISxCG_installHelpBtn", - "helpBody": "zISxCG_helpBody", - "installInput": "zISxCG_installInput", - "installCard": "zISxCG_installCard", - "channelOffText": "zISxCG_channelOffText", - "installCardDisabled": "zISxCG_installCardDisabled", - "helpLine": "zISxCG_helpLine", - "installExample": "zISxCG_installExample", - "helpNote": "zISxCG_helpNote", - "helpCmd": "zISxCG_helpCmd", - "installLabel": "zISxCG_installLabel", - "installInputError": "zISxCG_installInputError", - "installCardHead": "zISxCG_installCardHead", - "installCards": "zISxCG_installCards", - "installInsertBtn": "zISxCG_installInsertBtn", - "installBtn": "zISxCG_installBtn", - "root": "zISxCG_root", - "installRow": "zISxCG_installRow", - "channelOffBtn": "zISxCG_channelOffBtn", - "channelOff": "zISxCG_channelOff" + "helpLine": "K8xGBq_helpLine", + "installRow": "K8xGBq_installRow", + "desc": "K8xGBq_desc", + "installLabel": "K8xGBq_installLabel", + "installCardDisabled": "K8xGBq_installCardDisabled", + "installCard": "K8xGBq_installCard", + "channelOffBtn": "K8xGBq_channelOffBtn", + "helpNote": "K8xGBq_helpNote", + "root": "K8xGBq_root", + "installInput": "K8xGBq_installInput", + "channelOffText": "K8xGBq_channelOffText", + "helpBody": "K8xGBq_helpBody", + "installInsertBtn": "K8xGBq_installInsertBtn", + "installExample": "K8xGBq_installExample", + "installError": "K8xGBq_installError", + "installCardHead": "K8xGBq_installCardHead", + "helpCmd": "K8xGBq_helpCmd", + "channelOff": "K8xGBq_channelOff", + "installHelpBtn": "K8xGBq_installHelpBtn", + "installBtn": "K8xGBq_installBtn", + "installCards": "K8xGBq_installCards", + "installInputError": "K8xGBq_installInputError" }; //#endregion //#region src/client/components/views/CustomInstallView.tsx @@ -5097,7 +5129,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/SettingsView.module.css.mjs - const css$5 = "._506LLG_root{flex:1;align-items:stretch;min-width:0;min-height:0;display:flex}._506LLG_sidebar{border-right:1px solid var(--hub-border-1);flex-direction:column;flex:none;gap:2px;padding:8px 6px;display:flex;overflow-y:auto}._506LLG_navItem,._506LLG_navItemActive{box-sizing:border-box;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:7px;align-items:center;gap:8px;width:100%;padding:7px 10px;font-size:12.5px;line-height:18px;transition:color .12s,background-color .12s;display:flex}._506LLG_navItem{color:var(--hub-text-secondary);background:0 0}._506LLG_navItem:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._506LLG_navItemActive{color:var(--hub-brand);background:var(--hub-brand-tint);font-weight:600}._506LLG_navIcon{flex:none;display:inline-flex}._506LLG_content{flex-direction:column;flex:1;min-width:0;min-height:0;padding:14px 16px 18px;display:flex;overflow-y:auto}._506LLG_pageHeader{margin-bottom:12px}._506LLG_pageTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}._506LLG_pageDesc{color:var(--hub-text-tertiary);margin-top:3px;font-size:11.5px;line-height:16px}._506LLG_card{border:1px solid var(--hub-border-1);background:var(--hub-bg-1);border-radius:8px;flex-direction:column;min-width:0;display:flex}._506LLG_settingRow{border-bottom:1px solid var(--hub-border-1);justify-content:space-between;align-items:center;gap:16px;min-width:0;padding:10px 12px;display:flex}._506LLG_settingRow:last-child{border-bottom:none}._506LLG_settingLabel{flex:1;min-width:0}._506LLG_settingTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:12.5px;font-weight:500;line-height:18px;overflow:hidden}._506LLG_settingDesc{color:var(--hub-text-tertiary);margin-top:2px;font-size:11px;line-height:15px}._506LLG_settingControl{flex:none;align-items:center;display:flex}._506LLG_settingRowStack{border-bottom:1px solid var(--hub-border-1);flex-direction:column;align-items:stretch;gap:8px;min-width:0;padding:10px 12px;display:flex}._506LLG_settingRowStack:last-child{border-bottom:none}._506LLG_settingControlStack{align-items:center;display:flex}._506LLG_settingControlStack ._506LLG_textInput{width:100%}._506LLG_proxyControl{flex-direction:column;align-items:stretch;gap:5px;width:100%;display:flex}._506LLG_proxyHint{color:var(--hub-text-disabled);font-size:11px;line-height:1.4}._506LLG_proxyHintOk{color:var(--hub-success)}._506LLG_proxyHintFail{color:var(--hub-warning)}._506LLG_controlDropdown{min-width:180px}._506LLG_textInput{width:240px;height:28px;color:var(--hub-text-primary);background:var(--hub-bg-1);border:1px solid var(--hub-border-input);border-radius:6px;outline:none;padding:0 9px;font-family:inherit;font-size:12px;transition:border-color .15s}._506LLG_textInput:focus{border-color:var(--hub-brand-border)}._506LLG_textInput::placeholder{color:var(--hub-text-disabled)}._506LLG_resetBtn{cursor:pointer;height:28px;color:var(--hub-danger-text);border:1px solid var(--hub-danger-border);background:0 0;border-radius:6px;flex:none;padding:0 14px;font-size:12px;font-weight:500;transition:background-color .15s,border-color .15s,color .15s}._506LLG_resetBtn:hover{background:var(--hub-danger-tint);border-color:var(--hub-danger-text)}"; + const css$5 = "._2fGiMq_root{flex:1;align-items:stretch;min-width:0;min-height:0;display:flex}._2fGiMq_sidebar{border-right:1px solid var(--hub-border-1);flex-direction:column;flex:none;gap:2px;padding:8px 6px;display:flex;overflow-y:auto}._2fGiMq_navItem,._2fGiMq_navItemActive{box-sizing:border-box;text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:7px;align-items:center;gap:8px;width:100%;padding:7px 10px;font-size:12.5px;line-height:18px;transition:color .12s,background-color .12s;display:flex}._2fGiMq_navItem{color:var(--hub-text-secondary);background:0 0}._2fGiMq_navItem:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._2fGiMq_navItemActive{color:var(--hub-brand);background:var(--hub-brand-tint);font-weight:600}._2fGiMq_navIcon{flex:none;display:inline-flex}._2fGiMq_content{flex-direction:column;flex:1;min-width:0;min-height:0;padding:14px 16px 18px;display:flex;overflow-y:auto}._2fGiMq_pageHeader{margin-bottom:12px}._2fGiMq_pageTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}._2fGiMq_pageDesc{color:var(--hub-text-tertiary);margin-top:3px;font-size:11.5px;line-height:16px}._2fGiMq_card{border:1px solid var(--hub-border-1);background:var(--hub-bg-1);border-radius:8px;flex-direction:column;min-width:0;display:flex}._2fGiMq_settingRow{border-bottom:1px solid var(--hub-border-1);justify-content:space-between;align-items:center;gap:16px;min-width:0;padding:10px 12px;display:flex}._2fGiMq_settingRow:last-child{border-bottom:none}._2fGiMq_settingLabel{flex:1;min-width:0}._2fGiMq_settingTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;font-size:12.5px;font-weight:500;line-height:18px;overflow:hidden}._2fGiMq_settingDesc{color:var(--hub-text-tertiary);margin-top:2px;font-size:11px;line-height:15px}._2fGiMq_settingControl{flex:none;align-items:center;display:flex}._2fGiMq_settingRowStack{border-bottom:1px solid var(--hub-border-1);flex-direction:column;align-items:stretch;gap:8px;min-width:0;padding:10px 12px;display:flex}._2fGiMq_settingRowStack:last-child{border-bottom:none}._2fGiMq_settingControlStack{align-items:center;display:flex}._2fGiMq_settingControlStack ._2fGiMq_textInput{width:100%}._2fGiMq_proxyControl{flex-direction:column;align-items:stretch;gap:5px;width:100%;display:flex}._2fGiMq_proxyHint{color:var(--hub-text-disabled);font-size:11px;line-height:1.4}._2fGiMq_proxyHintOk{color:var(--hub-success)}._2fGiMq_proxyHintFail{color:var(--hub-warning)}._2fGiMq_controlDropdown{min-width:180px}._2fGiMq_textInput{width:240px;height:28px;color:var(--hub-text-primary);background:var(--hub-bg-1);border:1px solid var(--hub-border-input);border-radius:6px;outline:none;padding:0 9px;font-family:inherit;font-size:12px;transition:border-color .15s}._2fGiMq_textInput:focus{border-color:var(--hub-brand-border)}._2fGiMq_textInput::placeholder{color:var(--hub-text-disabled)}._2fGiMq_resetBtn{cursor:pointer;height:28px;color:var(--hub-danger-text);border:1px solid var(--hub-danger-border);background:0 0;border-radius:6px;flex:none;padding:0 14px;font-size:12px;font-weight:500;transition:background-color .15s,border-color .15s,color .15s}._2fGiMq_resetBtn:hover{background:var(--hub-danger-tint);border-color:var(--hub-danger-text)}"; const tagId$5 = "dsh-plugin/SettingsView.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) { const tag = document.createElement("style"); @@ -5112,34 +5144,34 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$5 }); var SettingsView_module_css_default = { - "navIcon": "_506LLG_navIcon", - "controlDropdown": "_506LLG_controlDropdown", - "proxyControl": "_506LLG_proxyControl", - "settingTitle": "_506LLG_settingTitle", - "pageHeader": "_506LLG_pageHeader", - "settingRow": "_506LLG_settingRow", - "card": "_506LLG_card", - "pageTitle": "_506LLG_pageTitle", - "resetBtn": "_506LLG_resetBtn", - "textInput": "_506LLG_textInput", - "settingLabel": "_506LLG_settingLabel", - "proxyHint": "_506LLG_proxyHint", - "settingControlStack": "_506LLG_settingControlStack", - "content": "_506LLG_content", - "navItem": "_506LLG_navItem", - "root": "_506LLG_root", - "settingDesc": "_506LLG_settingDesc", - "sidebar": "_506LLG_sidebar", - "pageDesc": "_506LLG_pageDesc", - "settingControl": "_506LLG_settingControl", - "navItemActive": "_506LLG_navItemActive", - "settingRowStack": "_506LLG_settingRowStack", - "proxyHintOk": "_506LLG_proxyHintOk", - "proxyHintFail": "_506LLG_proxyHintFail" + "proxyHintOk": "_2fGiMq_proxyHintOk", + "resetBtn": "_2fGiMq_resetBtn", + "navItem": "_2fGiMq_navItem", + "root": "_2fGiMq_root", + "textInput": "_2fGiMq_textInput", + "settingRowStack": "_2fGiMq_settingRowStack", + "pageDesc": "_2fGiMq_pageDesc", + "settingTitle": "_2fGiMq_settingTitle", + "settingControl": "_2fGiMq_settingControl", + "proxyHint": "_2fGiMq_proxyHint", + "proxyHintFail": "_2fGiMq_proxyHintFail", + "navItemActive": "_2fGiMq_navItemActive", + "content": "_2fGiMq_content", + "pageTitle": "_2fGiMq_pageTitle", + "card": "_2fGiMq_card", + "settingLabel": "_2fGiMq_settingLabel", + "settingDesc": "_2fGiMq_settingDesc", + "pageHeader": "_2fGiMq_pageHeader", + "navIcon": "_2fGiMq_navIcon", + "settingControlStack": "_2fGiMq_settingControlStack", + "sidebar": "_2fGiMq_sidebar", + "controlDropdown": "_2fGiMq_controlDropdown", + "proxyControl": "_2fGiMq_proxyControl", + "settingRow": "_2fGiMq_settingRow" }; //#endregion //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs - 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)}"; + const css$4 = ".yFw3ZG_dropdown{flex-shrink:0;position:relative}.yFw3ZG_dropdownFill{width:100%}.yFw3ZG_dropdownFill>.yFw3ZG_dropdownBtn{justify-content:space-between;width:100%}.yFw3ZG_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}.yFw3ZG_dropdownBtn:hover{background:#80808047}.yFw3ZG_dropdownLabel{white-space:nowrap}.yFw3ZG_dropdownArrow,.yFw3ZG_dropdownArrowOpen{color:var(--hub-text-tertiary);transition:transform .12s,color .12s;display:inline-flex}.yFw3ZG_dropdownArrowOpen{color:var(--hub-text-secondary);transform:rotate(180deg)}.yFw3ZG_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}.yFw3ZG_dropdownItem,.yFw3ZG_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}.yFw3ZG_dropdownItem{color:var(--hub-text-secondary);background:0 0}.yFw3ZG_dropdownItem:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.yFw3ZG_dropdownItemActive{color:var(--hub-brand);background:var(--hub-brand-tint);font-weight:600}.yFw3ZG_dropdownItemLabel{white-space:nowrap}.yFw3ZG_dropdownCount,.yFw3ZG_dropdownCountActive{text-align:center;border-radius:999px;min-width:16px;padding:0 5px;font-size:10px;line-height:14px}.yFw3ZG_dropdownCount{color:var(--hub-text-tertiary);background:var(--hub-bg-btn)}.yFw3ZG_dropdownCountActive{color:var(--hub-text-on-fill);background:var(--hub-btn-fill)}"; const tagId$4 = "dsh-plugin/Dropdown.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) { const tag = document.createElement("style"); @@ -5154,22 +5186,22 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$4 }); var Dropdown_module_css_default = { - "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen", - "dropdownArrow": "B_Gxsq_dropdownArrow", - "dropdownItemActive": "B_Gxsq_dropdownItemActive", - "dropdownItemLabel": "B_Gxsq_dropdownItemLabel", - "dropdownCount": "B_Gxsq_dropdownCount", - "dropdownCountActive": "B_Gxsq_dropdownCountActive", - "dropdownItem": "B_Gxsq_dropdownItem", - "dropdownFill": "B_Gxsq_dropdownFill", - "dropdownBtn": "B_Gxsq_dropdownBtn", - "dropdownLabel": "B_Gxsq_dropdownLabel", - "dropdown": "B_Gxsq_dropdown", - "dropdownPanel": "B_Gxsq_dropdownPanel" + "dropdownItem": "yFw3ZG_dropdownItem", + "dropdownBtn": "yFw3ZG_dropdownBtn", + "dropdownItemActive": "yFw3ZG_dropdownItemActive", + "dropdownItemLabel": "yFw3ZG_dropdownItemLabel", + "dropdownCountActive": "yFw3ZG_dropdownCountActive", + "dropdownLabel": "yFw3ZG_dropdownLabel", + "dropdownFill": "yFw3ZG_dropdownFill", + "dropdown": "yFw3ZG_dropdown", + "dropdownArrowOpen": "yFw3ZG_dropdownArrowOpen", + "dropdownArrow": "yFw3ZG_dropdownArrow", + "dropdownPanel": "yFw3ZG_dropdownPanel", + "dropdownCount": "yFw3ZG_dropdownCount" }; //#endregion //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs - 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)}"; + const css$3 = "._3cemya_toggle,._3cemya_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}._3cemya_toggle{background:var(--hub-bg-3);box-shadow:inset 0 0 0 1px var(--hub-border-2)}._3cemya_toggle:hover{background:var(--hub-bg-hover)}._3cemya_toggleOn{background:var(--hub-brand)}._3cemya_toggleOn:hover{background:var(--hub-brand-hover)}._3cemya_toggle:disabled,._3cemya_toggleOn:disabled{opacity:.5;cursor:not-allowed}._3cemya_knob{background:#fff;border-radius:999px;width:14px;height:14px;transition:transform .15s;display:block;transform:translate(2px);box-shadow:0 1px 2px #00000040}._3cemya_toggleOn ._3cemya_knob{transform:translate(18px)}"; const tagId$3 = "dsh-plugin/Toggle.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) { const tag = document.createElement("style"); @@ -5184,9 +5216,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$3 }); var Toggle_module_css_default = { - "knob": "k-cD4G_knob", - "toggle": "k-cD4G_toggle", - "toggleOn": "k-cD4G_toggleOn" + "knob": "_3cemya_knob", + "toggle": "_3cemya_toggle", + "toggleOn": "_3cemya_toggleOn" }; //#endregion //#region src/client/components/ui/Toggle.tsx @@ -5271,7 +5303,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/DiagnosticsView.module.css.mjs - 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)}"; + const css$2 = ".GmCCEa_panel{flex-direction:column;min-width:0;display:flex}.GmCCEa_envRow{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:10px;padding:8px 12px;display:flex}.GmCCEa_envLabel{flex:1;min-width:0}.GmCCEa_envTitle{color:var(--hub-text-primary);font-size:12.5px;font-weight:500;line-height:18px}.GmCCEa_envDesc{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.GmCCEa_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}.GmCCEa_envCopyBtn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}.GmCCEa_envCopyBtn:disabled{opacity:.55;cursor:default}.GmCCEa_head{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:10px;padding:8px 12px;display:flex}.GmCCEa_headHint{min-width:0;color:var(--hub-text-tertiary);flex:1;font-size:11px;line-height:16px}.GmCCEa_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}.GmCCEa_runBtn:hover:not(:disabled){color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.GmCCEa_runBtn:disabled{opacity:.55;cursor:default}.GmCCEa_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}.GmCCEa_row:last-of-type{border-bottom:none}.GmCCEa_row:hover:not(:disabled){background:var(--hub-bg-hover)}.GmCCEa_row:disabled{cursor:default}.GmCCEa_name{color:var(--hub-text-primary);white-space:nowrap;flex:none;font-size:12.5px;font-weight:500;line-height:18px}.GmCCEa_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}.GmCCEa_meta{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:16px}.GmCCEa_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}.GmCCEa_badgeOk{color:var(--hub-success);background:var(--hub-success-tint)}.GmCCEa_badgeFail{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.GmCCEa_badgeRunning{color:var(--hub-text-secondary);background:var(--hub-bg-hover);animation:1s ease-in-out infinite GmCCEa_diagPulse}.GmCCEa_badgeIdle{color:var(--hub-text-disabled);background:var(--hub-bg-hover)}@keyframes GmCCEa_diagPulse{0%,to{opacity:1}50%{opacity:.4}}.GmCCEa_summary{padding:8px 12px 10px;font-size:11px;line-height:16px}.GmCCEa_summaryOk{color:var(--hub-success)}.GmCCEa_summaryFail{color:var(--hub-danger-text)}.GmCCEa_summaryRunning{color:var(--hub-text-tertiary)}"; const tagId$2 = "dsh-plugin/DiagnosticsView.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) { const tag = document.createElement("style"); @@ -5286,29 +5318,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$2 }); var DiagnosticsView_module_css_default = { - "envCopyBtn": "k9eRya_envCopyBtn", - "badgeOk": "k9eRya_badgeOk", - "diagPulse": "k9eRya_diagPulse", - "envRow": "k9eRya_envRow", - "head": "k9eRya_head", - "meta": "k9eRya_meta", - "envDesc": "k9eRya_envDesc", - "row": "k9eRya_row", - "badge": "k9eRya_badge", - "summary": "k9eRya_summary", - "badgeFail": "k9eRya_badgeFail", - "name": "k9eRya_name", - "summaryFail": "k9eRya_summaryFail", - "display": "k9eRya_display", - "badgeIdle": "k9eRya_badgeIdle", - "summaryOk": "k9eRya_summaryOk", - "panel": "k9eRya_panel", - "badgeRunning": "k9eRya_badgeRunning", - "envLabel": "k9eRya_envLabel", - "summaryRunning": "k9eRya_summaryRunning", - "envTitle": "k9eRya_envTitle", - "runBtn": "k9eRya_runBtn", - "headHint": "k9eRya_headHint" + "badgeOk": "GmCCEa_badgeOk", + "envTitle": "GmCCEa_envTitle", + "badge": "GmCCEa_badge", + "name": "GmCCEa_name", + "display": "GmCCEa_display", + "badgeRunning": "GmCCEa_badgeRunning", + "head": "GmCCEa_head", + "badgeIdle": "GmCCEa_badgeIdle", + "summary": "GmCCEa_summary", + "envCopyBtn": "GmCCEa_envCopyBtn", + "runBtn": "GmCCEa_runBtn", + "summaryFail": "GmCCEa_summaryFail", + "summaryRunning": "GmCCEa_summaryRunning", + "envLabel": "GmCCEa_envLabel", + "envRow": "GmCCEa_envRow", + "row": "GmCCEa_row", + "meta": "GmCCEa_meta", + "headHint": "GmCCEa_headHint", + "badgeFail": "GmCCEa_badgeFail", + "envDesc": "GmCCEa_envDesc", + "diagPulse": "GmCCEa_diagPulse", + "summaryOk": "GmCCEa_summaryOk", + "panel": "GmCCEa_panel" }; //#endregion //#region src/client/components/views/DiagnosticsView.tsx @@ -5471,7 +5503,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { } //#endregion //#region \0dsh-css:src/client/styles/LogsView.module.css.mjs - const css$1 = "._3j77BW_panel{flex-direction:column;min-width:0;display:flex}._3j77BW_head{border-bottom:1px solid var(--hub-border-1);flex-direction:column;align-items:stretch;gap:6px;padding:8px 12px;display:flex}._3j77BW_headHint{min-width:0;color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._3j77BW_actions{flex:none;justify-content:flex-start;align-items:center;gap:6px;display:flex}._3j77BW_btn{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 10px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._3j77BW_btn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}._3j77BW_btn:disabled{opacity:.55;cursor:default}._3j77BW_headActions{flex:1;justify-content:flex-end;margin-right:4px;display:flex}._3j77BW_clearBtn{height:22px;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:6px;flex:none;padding:0 10px;font-size:11px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._3j77BW_clearBtn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}._3j77BW_clearBtn:disabled{opacity:.55;cursor:default}._3j77BW_list{flex-direction:column;max-height:340px;display:flex;overflow-y:auto}._3j77BW_entry{align-items:baseline;gap:8px;min-width:0;padding:5px 12px;font-size:11px;line-height:16px;display:flex}._3j77BW_entry:hover{background:var(--hub-bg-hover)}._3j77BW_time{font-variant-numeric:tabular-nums;color:var(--hub-text-tertiary);white-space:nowrap;flex:none}._3j77BW_event{color:var(--hub-text-tertiary);white-space:nowrap;flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px}._3j77BW_message{min-width:0;color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}._3j77BW_pathRow{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:8px;padding:6px 12px;display:flex}._3j77BW_pathLabel{color:var(--hub-text-tertiary);flex:none;font-size:11px;line-height:16px}._3j77BW_pathText{min-width:0;color:var(--hub-text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;line-height:16px;overflow:hidden}._3j77BW_footFail{color:var(--hub-danger-text);flex:none;font-size:11px;line-height:16px}._3j77BW_pathDialog{flex-direction:column;gap:10px;display:flex}._3j77BW_pathDialogDesc{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._3j77BW_pathDialogRow{align-items:center;gap:6px;display:flex}._3j77BW_pathDialogReset{justify-content:space-between;align-items:center;gap:8px;display:flex}._3j77BW_pathDialogHint{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._3j77BW_linkBtn{color:var(--hub-brand);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-size:11.5px;font-weight:500;line-height:16px}._3j77BW_linkBtn:hover{text-decoration:underline}._3j77BW_pathDraft{min-width:0;height:26px;color:var(--hub-text-primary);background:var(--hub-bg-1);border:1px solid var(--hub-border-input);border-radius:6px;outline:none;flex:1;padding:0 9px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;transition:border-color .12s}._3j77BW_pathDraft:focus{border-color:var(--hub-brand-border)}._3j77BW_pathDraft::placeholder{color:var(--hub-text-disabled)}._3j77BW_pathDialogFoot{justify-content:flex-end;gap:6px;display:flex}._3j77BW_previewRow{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;width:100%;padding:0;display:block}._3j77BW_filterBar{flex-wrap:wrap;align-items:center;gap:6px;padding:2px 0 0;display:flex}._3j77BW_filterChip{height:22px;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:11px;flex:none;padding:0 10px;font-size:11px;line-height:20px;transition:color .12s,background-color .12s,border-color .12s}._3j77BW_filterChip:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3j77BW_filterChipActive,._3j77BW_filterChipActive:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft);font-weight:500}._3j77BW_filterChipActive:hover{background:var(--hub-brand-tint-strong);border-color:var(--hub-brand-border)}._3j77BW_search{flex:1;min-width:140px}._3j77BW_searchInput{width:100%;height:24px;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;outline:none;padding:0 8px;font-size:11px;line-height:16px;transition:border-color .12s,background-color .12s}._3j77BW_searchInput:focus{border-color:var(--hub-brand);background:var(--hub-bg-1)}._3j77BW_searchInput::placeholder{color:var(--hub-text-tertiary)}._3j77BW_logList{flex-direction:column;flex:auto;min-height:0;padding:4px 0 6px;display:flex;overflow-y:auto}._3j77BW_more{height:26px;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;flex:none;align-self:center;margin:10px 0 4px;padding:0 18px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._3j77BW_more:hover:not(:disabled){color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}._3j77BW_more:disabled{opacity:.55;cursor:default}._3j77BW_moreEnd{text-align:center;color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;padding:12px 0 4px;font-size:11px;line-height:16px}._3j77BW_foot{border-top:1px solid var(--hub-border-1);align-items:center;gap:8px;padding:8px 12px;display:flex}._3j77BW_footPath{min-width:0;color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;line-height:16px;overflow:hidden}._3j77BW_footCount{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:16px}._3j77BW_footActions{flex:none;align-items:center;gap:6px;display:inline-flex}._3j77BW_badge{letter-spacing:.3px;flex:none;font-size:10px;font-weight:600}._3j77BW_badgeSuccess{color:var(--hub-success)}._3j77BW_badgeError{color:var(--hub-danger-text)}._3j77BW_badgeWarn{color:var(--hub-warning)}._3j77BW_badgeInfo{color:var(--hub-text-secondary)}._3j77BW_badgeDebug{color:var(--hub-text-tertiary)}._3j77BW_catBadge{border:1px solid #0000;border-radius:4px;flex:none;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}._3j77BW_catInstall{color:var(--hub-brand);border-color:var(--hub-brand-border-soft);background:var(--hub-brand-tint)}._3j77BW_catUninstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}._3j77BW_catUpdate{color:var(--hub-warning);border-color:var(--hub-warning-border);background:var(--hub-warning-tint)}._3j77BW_catDiagnostics{color:var(--hub-success);border-color:var(--hub-success-border);background:var(--hub-success-tint)}._3j77BW_catSettings{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._3j77BW_catSystem{color:var(--hub-text-secondary);border-color:var(--hub-border-2);background:var(--hub-bg-hover)}._3j77BW_empty{text-align:center;color:var(--hub-text-tertiary);padding:28px 12px;font-size:11.5px}"; + const css$1 = "._1oLtEa_panel{flex-direction:column;min-width:0;display:flex}._1oLtEa_head{border-bottom:1px solid var(--hub-border-1);flex-direction:column;align-items:stretch;gap:6px;padding:8px 12px;display:flex}._1oLtEa_headHint{min-width:0;color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._1oLtEa_actions{flex:none;justify-content:flex-start;align-items:center;gap:6px;display:flex}._1oLtEa_btn{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 10px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._1oLtEa_btn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}._1oLtEa_btn:disabled{opacity:.55;cursor:default}._1oLtEa_headActions{flex:1;justify-content:flex-end;margin-right:4px;display:flex}._1oLtEa_clearBtn{height:22px;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:6px;flex:none;padding:0 10px;font-size:11px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._1oLtEa_clearBtn:hover:not(:disabled){color:var(--hub-text-primary);background:var(--hub-bg-2)}._1oLtEa_clearBtn:disabled{opacity:.55;cursor:default}._1oLtEa_list{flex-direction:column;max-height:340px;display:flex;overflow-y:auto}._1oLtEa_entry{align-items:baseline;gap:8px;min-width:0;padding:5px 12px;font-size:11px;line-height:16px;display:flex}._1oLtEa_entry:hover{background:var(--hub-bg-hover)}._1oLtEa_time{font-variant-numeric:tabular-nums;color:var(--hub-text-tertiary);white-space:nowrap;flex:none}._1oLtEa_event{color:var(--hub-text-tertiary);white-space:nowrap;flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px}._1oLtEa_message{min-width:0;color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}._1oLtEa_pathRow{border-bottom:1px solid var(--hub-border-1);align-items:center;gap:8px;padding:6px 12px;display:flex}._1oLtEa_pathLabel{color:var(--hub-text-tertiary);flex:none;font-size:11px;line-height:16px}._1oLtEa_pathText{min-width:0;color:var(--hub-text-secondary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;line-height:16px;overflow:hidden}._1oLtEa_footFail{color:var(--hub-danger-text);flex:none;font-size:11px;line-height:16px}._1oLtEa_pathDialog{flex-direction:column;gap:10px;display:flex}._1oLtEa_pathDialogDesc{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._1oLtEa_pathDialogRow{align-items:center;gap:6px;display:flex}._1oLtEa_pathDialogReset{justify-content:space-between;align-items:center;gap:8px;display:flex}._1oLtEa_pathDialogHint{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}._1oLtEa_linkBtn{color:var(--hub-brand);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-size:11.5px;font-weight:500;line-height:16px}._1oLtEa_linkBtn:hover{text-decoration:underline}._1oLtEa_pathDraft{min-width:0;height:26px;color:var(--hub-text-primary);background:var(--hub-bg-1);border:1px solid var(--hub-border-input);border-radius:6px;outline:none;flex:1;padding:0 9px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;transition:border-color .12s}._1oLtEa_pathDraft:focus{border-color:var(--hub-brand-border)}._1oLtEa_pathDraft::placeholder{color:var(--hub-text-disabled)}._1oLtEa_pathDialogFoot{justify-content:flex-end;gap:6px;display:flex}._1oLtEa_previewRow{text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;width:100%;padding:0;display:block}._1oLtEa_filterBar{flex-wrap:wrap;align-items:center;gap:6px;padding:2px 0 0;display:flex}._1oLtEa_filterChip{height:22px;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:11px;flex:none;padding:0 10px;font-size:11px;line-height:20px;transition:color .12s,background-color .12s,border-color .12s}._1oLtEa_filterChip:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._1oLtEa_filterChipActive,._1oLtEa_filterChipActive:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft);font-weight:500}._1oLtEa_filterChipActive:hover{background:var(--hub-brand-tint-strong);border-color:var(--hub-brand-border)}._1oLtEa_search{flex:1;min-width:140px}._1oLtEa_searchInput{width:100%;height:24px;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;outline:none;padding:0 8px;font-size:11px;line-height:16px;transition:border-color .12s,background-color .12s}._1oLtEa_searchInput:focus{border-color:var(--hub-brand);background:var(--hub-bg-1)}._1oLtEa_searchInput::placeholder{color:var(--hub-text-tertiary)}._1oLtEa_logList{flex-direction:column;flex:auto;min-height:0;padding:4px 0 6px;display:flex;overflow-y:auto}._1oLtEa_more{height:26px;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;flex:none;align-self:center;margin:10px 0 4px;padding:0 18px;font-size:11.5px;font-weight:500;transition:color .12s,background-color .12s,border-color .12s}._1oLtEa_more:hover:not(:disabled){color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}._1oLtEa_more:disabled{opacity:.55;cursor:default}._1oLtEa_moreEnd{text-align:center;color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;padding:12px 0 4px;font-size:11px;line-height:16px}._1oLtEa_foot{border-top:1px solid var(--hub-border-1);align-items:center;gap:8px;padding:8px 12px;display:flex}._1oLtEa_footPath{min-width:0;color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;line-height:16px;overflow:hidden}._1oLtEa_footCount{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:11px;line-height:16px}._1oLtEa_footActions{flex:none;align-items:center;gap:6px;display:inline-flex}._1oLtEa_badge{letter-spacing:.3px;flex:none;font-size:10px;font-weight:600}._1oLtEa_badgeSuccess{color:var(--hub-success)}._1oLtEa_badgeError{color:var(--hub-danger-text)}._1oLtEa_badgeWarn{color:var(--hub-warning)}._1oLtEa_badgeInfo{color:var(--hub-text-secondary)}._1oLtEa_badgeDebug{color:var(--hub-text-tertiary)}._1oLtEa_catBadge{border:1px solid #0000;border-radius:4px;flex:none;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}._1oLtEa_catInstall{color:var(--hub-brand);border-color:var(--hub-brand-border-soft);background:var(--hub-brand-tint)}._1oLtEa_catUninstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}._1oLtEa_catUpdate{color:var(--hub-warning);border-color:var(--hub-warning-border);background:var(--hub-warning-tint)}._1oLtEa_catDiagnostics{color:var(--hub-success);border-color:var(--hub-success-border);background:var(--hub-success-tint)}._1oLtEa_catSettings{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._1oLtEa_catSystem{color:var(--hub-text-secondary);border-color:var(--hub-border-2);background:var(--hub-bg-hover)}._1oLtEa_empty{text-align:center;color:var(--hub-text-tertiary);padding:28px 12px;font-size:11.5px}"; const tagId$1 = "dsh-plugin/LogsView.module.css"; if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) { const tag = document.createElement("style"); @@ -5486,57 +5518,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => { css: css$1 }); var LogsView_module_css_default = { - "head": "_3j77BW_head", - "footFail": "_3j77BW_footFail", - "linkBtn": "_3j77BW_linkBtn", - "badgeInfo": "_3j77BW_badgeInfo", - "filterChipActive": "_3j77BW_filterChipActive", - "catDiagnostics": "_3j77BW_catDiagnostics", - "catSettings": "_3j77BW_catSettings", - "clearBtn": "_3j77BW_clearBtn", - "filterChip": "_3j77BW_filterChip", - "time": "_3j77BW_time", - "badgeWarn": "_3j77BW_badgeWarn", - "catInstall": "_3j77BW_catInstall", - "catUpdate": "_3j77BW_catUpdate", - "catSystem": "_3j77BW_catSystem", - "headActions": "_3j77BW_headActions", - "pathDialog": "_3j77BW_pathDialog", - "pathRow": "_3j77BW_pathRow", - "footPath": "_3j77BW_footPath", - "moreEnd": "_3j77BW_moreEnd", - "event": "_3j77BW_event", - "headHint": "_3j77BW_headHint", - "pathDialogFoot": "_3j77BW_pathDialogFoot", - "btn": "_3j77BW_btn", - "empty": "_3j77BW_empty", - "search": "_3j77BW_search", - "searchInput": "_3j77BW_searchInput", - "filterBar": "_3j77BW_filterBar", - "pathDialogReset": "_3j77BW_pathDialogReset", - "badgeError": "_3j77BW_badgeError", - "pathDraft": "_3j77BW_pathDraft", - "pathDialogHint": "_3j77BW_pathDialogHint", - "catBadge": "_3j77BW_catBadge", - "badgeDebug": "_3j77BW_badgeDebug", - "panel": "_3j77BW_panel", - "pathDialogDesc": "_3j77BW_pathDialogDesc", - "logList": "_3j77BW_logList", - "more": "_3j77BW_more", - "foot": "_3j77BW_foot", - "footCount": "_3j77BW_footCount", - "message": "_3j77BW_message", - "badge": "_3j77BW_badge", - "badgeSuccess": "_3j77BW_badgeSuccess", - "list": "_3j77BW_list", - "entry": "_3j77BW_entry", - "footActions": "_3j77BW_footActions", - "pathLabel": "_3j77BW_pathLabel", - "pathDialogRow": "_3j77BW_pathDialogRow", - "actions": "_3j77BW_actions", - "catUninstall": "_3j77BW_catUninstall", - "pathText": "_3j77BW_pathText", - "previewRow": "_3j77BW_previewRow" + "pathDialogFoot": "_1oLtEa_pathDialogFoot", + "head": "_1oLtEa_head", + "moreEnd": "_1oLtEa_moreEnd", + "pathLabel": "_1oLtEa_pathLabel", + "catInstall": "_1oLtEa_catInstall", + "catDiagnostics": "_1oLtEa_catDiagnostics", + "catSystem": "_1oLtEa_catSystem", + "message": "_1oLtEa_message", + "empty": "_1oLtEa_empty", + "previewRow": "_1oLtEa_previewRow", + "footPath": "_1oLtEa_footPath", + "badge": "_1oLtEa_badge", + "pathDialogDesc": "_1oLtEa_pathDialogDesc", + "list": "_1oLtEa_list", + "footActions": "_1oLtEa_footActions", + "searchInput": "_1oLtEa_searchInput", + "logList": "_1oLtEa_logList", + "btn": "_1oLtEa_btn", + "filterChipActive": "_1oLtEa_filterChipActive", + "footFail": "_1oLtEa_footFail", + "catUninstall": "_1oLtEa_catUninstall", + "pathDialogRow": "_1oLtEa_pathDialogRow", + "pathDialogReset": "_1oLtEa_pathDialogReset", + "catSettings": "_1oLtEa_catSettings", + "pathDraft": "_1oLtEa_pathDraft", + "filterBar": "_1oLtEa_filterBar", + "entry": "_1oLtEa_entry", + "pathText": "_1oLtEa_pathText", + "time": "_1oLtEa_time", + "search": "_1oLtEa_search", + "badgeSuccess": "_1oLtEa_badgeSuccess", + "headActions": "_1oLtEa_headActions", + "clearBtn": "_1oLtEa_clearBtn", + "badgeError": "_1oLtEa_badgeError", + "badgeWarn": "_1oLtEa_badgeWarn", + "badgeDebug": "_1oLtEa_badgeDebug", + "pathDialog": "_1oLtEa_pathDialog", + "footCount": "_1oLtEa_footCount", + "catUpdate": "_1oLtEa_catUpdate", + "panel": "_1oLtEa_panel", + "actions": "_1oLtEa_actions", + "pathRow": "_1oLtEa_pathRow", + "headHint": "_1oLtEa_headHint", + "filterChip": "_1oLtEa_filterChip", + "event": "_1oLtEa_event", + "foot": "_1oLtEa_foot", + "catBadge": "_1oLtEa_catBadge", + "linkBtn": "_1oLtEa_linkBtn", + "badgeInfo": "_1oLtEa_badgeInfo", + "pathDialogHint": "_1oLtEa_pathDialogHint", + "more": "_1oLtEa_more" }; //#endregion //#region src/client/components/modals/LogsModal.tsx diff --git a/client/client.js.map b/client/client.js.map index 5874be4..c00d7f2 100644 --- a/client/client.js.map +++ b/client/client.js.map @@ -1 +1 @@ -{"version":3,"file":"client.js","names":["SORT_DEFAULT_DIR","useState","useRef","useMemo","useState","useState","useCallback","useState","useRef","h","modalStyles","headerStyles","h","styles","h","styles","h","styles","h","styles","h","styles","h","styles","h","styles","useState","h","Fragment","styles","h","styles","SegBtn","h","styles","Fragment","useState","useRef","h","styles","useRef","h","styles","h","Fragment","h","styles","h","styles","useState","useMemo","useState","h","styles","modal","h","styles","useState","useRef","h","styles","useState","useRef","useCallback","h","styles","h","view","useState","useRef","useCallback","styles","useState","h","styles","view","useState","useRef","useCallback","h","styles","h","styles","useState","useRef","dropdownStyles","modalStyles","useState","useRef","h","styles","modalStyles","h"],"sources":["../src/client/locales.ts","../src/client/logic/install-command.ts","../src/client/logic/constants.ts","../src/client/logic/ensure-plugin-css.ts","../src/client/data/host.ts","../src/client/logic/normalize.ts","../src/client/data/catalog.ts","../src/client/data/hub.ts","../src/client/logic/installed.ts","../src/client/hooks/useCatalog.ts","../src/client/logic/failures.ts","../src/client/logic/urls.ts","../src/client/hooks/useLanguage.ts","../src/client/hooks/useSettings.ts","../src/client/hooks/useTaskQueue.ts","../src/client/components/ui/icons.tsx","../src/client/components/modals/ProgressView.tsx","../src/client/components/modals/modals.tsx","../src/client/logic/renderMarkdown.ts","../src/client/components/modals/AboutModal.tsx","../src/client/components/modals/HubUpdateModal.tsx","../src/client/logic/format.ts","../src/client/components/modals/InstalledDetailModal.tsx","../src/client/components/modals/ConfirmDialog.tsx","../src/client/components/modals/NotificationsModal.tsx","../src/client/components/layout/CatalogHeader.tsx","../src/client/components/layout/CategoryTabs.tsx","../src/client/components/layout/CatalogControls.tsx","../src/client/hooks/useIncrementalList.ts","../src/client/components/catalog/PluginCard.tsx","../src/client/components/catalog/CatalogList.tsx","../src/client/components/views/MarketView.tsx","../src/client/components/layout/SectionTabs.tsx","../src/client/components/views/InstalledView.tsx","../src/client/components/views/CustomInstallView.tsx","../src/client/components/ui/Toggle.tsx","../src/client/components/ui/Dropdown.tsx","../src/client/components/views/DiagnosticsView.tsx","../src/client/components/modals/LogsModal.tsx","../src/client/components/modals/LogsPathModal.tsx","../src/client/components/views/LogsView.tsx","../src/client/components/views/SettingsView.tsx","../src/client/components/PluginHubSection.tsx","../src/client/index.tsx"],"sourcesContent":["/**\n * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.\n * Website: https://dsh-plugin.org\n * GitHub: https://github.com/dshplugin/dsh-plugin-hub\n *\n * zh/en dictionaries for the DSH Plugin Hub settings section.\n */\nexport const zh = {\n nav: '插件市场',\n title: 'DSH Plugin Hub',\n // 收录/精选数量由组件从官网 /api/stats.json 实时拉取填充({total}/{verified}),不写死\n tagline: 'DSH Plugin 插件市场:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装',\n adBadge: '推荐',\n // 紫色广告横幅:突出数量(显眼)+ 更新节奏,与 tagline 职责分开、不重复\n ad: 'DSH Plugin 插件市场:收录 {total} 款插件,{verified} 款人工精选验证,每日更新',\n search: '搜索插件名称、描述、标签…',\n all: '全部',\n sortStars: 'Star',\n sortForks: 'Fork',\n sortUpdated: '最近更新',\n sortNewest: '最新收录',\n sortAria: '插件排序方式',\n openHint: '打开 dsh-plugin.org',\n toggleLangHint: '切换界面语言',\n fork: 'Fork',\n loading: '正在加载插件数据…',\n failed: '插件数据加载失败',\n // 目录拉不出来时的精准提示:按「是否配置了代理」区分,引导排查网络 / 代理\n failedDescNoProxy: '你的网络似乎不通,无法获取插件目录数据。请检查网络连接后重试;或点击右上角按钮在浏览器中打开插件市场。',\n failedDescProxy: '你的网络似乎不通,或设置里的 HTTP 代理地址不可达,无法获取插件目录数据。请检查代理设置与网络连接后重试;或点击右上角按钮在浏览器中打开插件市场。',\n retry: '重试',\n install: '安装',\n // AI 识别可能需要命令行辅助的插件(webInstallable=false):仍可尝试一键安装,失败时复制命令去 dsh 终端\n cliOnlyHint: '此插件可能需命令行辅助,失败时复制上方命令到 dsh 终端',\n failedCopyHint: '安装失败。请复制上方安装命令到 dsh 终端手动执行(原生依赖构建脚本可能需要人工放行,如 pnpm approve-builds)',\n toastCopied: '安装命令已复制,去 dsh 终端粘贴即可安装',\n installed: '已安装',\n // 一级导航:插件市场 / 已安装 / 自定义安装 / 设置\n viewMarket: '插件市场',\n viewInstalled: '已安装',\n viewCustom: '自定义安装',\n viewSettings: '设置',\n viewMarketHint: '浏览与发现插件',\n viewInstalledHint: '管理已安装插件',\n viewCustomHint: '手动安装 NPM 包或 GitHub 源码',\n viewSettingsHint: '网络通道与偏好设置',\n // 已安装视图\n installedEmpty: '还没有安装插件',\n installedEmptyDesc: '可以去「自定义安装」,手动安装 NPM 包或 GitHub 源码',\n npmInstallLabel: 'NPM 包 / 命令',\n npmInstallPlaceholder: 'npm install <包名> 或直接输包名',\n npmInstallExample: '支持原生命令:npm install lodash、npm i lodash、pnpm add @scope/pkg',\n npmInstallExample2: '全局安装 CLI:npm install -g @scope/cli;或直接输入包名 lodash',\n npmInstallInvalid: '请输入 npm 包名(如 lodash、@scope/pkg),或原生安装命令(如 npm install lodash、npm i lodash、pnpm add @scope/pkg、npm install -g @scope/cli)',\n gitInstallLabel: 'GitHub 源码',\n gitInstallPlaceholder: '输入仓库地址',\n gitInstallExample: '例如:owner/repo 或 https://github.com/owner/repo',\n gitInstallInvalid: '请输入 GitHub 仓库地址,例如:owner/repo 或 https://github.com/owner/repo',\n dshCmdLabel: 'DeepSeek Harness 命令',\n dshCmdPlaceholder: '粘贴官方 dsh plugin 命令',\n dshCmdInsertHubUpdate: '插入更新命令',\n dshCmdExample: '例如:dsh plugin --profile web add github:owner/repo,或 dsh plugin --profile web update dsh-plugin',\n dshCmdInvalid: '请输入官方 dsh plugin 命令(--profile 必填,支持 add / update)。例如:dsh plugin --profile web update dsh-plugin',\n installHelp: '帮助',\n helpModalTitle: '支持的命令格式',\n npmInstallHelp: 'lodash、@scope/pkg\\t直接输入包名\\nnpm install lodash\\nnpm i lodash\\npnpm add @scope/pkg\\npnpm i @scope/pkg\\nnpm install -g @scope/cli\\t全局安装 CLI 工具,不进「已安装」列表',\n gitInstallHelp: 'owner/repo\\nhttps://github.com/owner/repo\\ngithub:owner/repo\\ngit+https://github.com/owner/repo.git\\ngit@github.com:owner/repo.git',\n dshCmdHelp: 'dsh plugin --profile web add <目标>\\t安装\\ndsh plugin --profile web update <目标>\\t更新已安装目标到最新版本\\ndsh plugin --profile=web add <目标>\\ndsh plugin --profile=web update <目标>\\n\\t--profile 必填,官方 CLI 无 -p 简写;<目标> 可为 npm 包名或 github:owner/repo;卸载请用「已安装」列表',\n globalNpmHint: '将全局安装 CLI 工具(npm install -g),不会出现在「已安装」列表,无需重启宿主',\n installCliBtn: '安装',\n // 安装通道关闭(安全信任开关关掉后,对应卡片禁用并引导去设置打开)\n channelDisabledHint: '该安装通道已关闭,请在「设置 → 安全信任」中打开开关',\n goToSettings: '前往设置',\n // 自定义安装视图:独立一级导航,说明文字\n customViewDesc: '手动安装目录外的 NPM 包、GitHub 源码,或粘贴官方 dsh plugin 命令。装完的条目会出现在「已安装」列表,并标记为自定义安装。',\n customLabel: '自定义安装',\n installedSearch: '搜索已安装的插件…',\n installedFilterCatalog: '目录插件',\n hubInstall: '插件市场',\n hubInstallHint: '来自插件市场收录的目录插件',\n manualInstall: '手动安装',\n manualInstallHint: '非目录收录,通过命令行手动安装',\n filterByLabel: '来源',\n sortByLabel: '排序',\n sortName: '名称',\n sortInstalledAt: '最近',\n detailTitle: '插件详情',\n detailCategory: '分类',\n detailStats: '仓库统计',\n statusLabel: '安装状态',\n statusRunning: '运行中',\n statusPending: '待重启',\n exampleLabel: 'DeepSeek Harness 内置示例项目',\n exampleHint: 'DeepSeek Harness 内置示例项目:不是插件市场的 dsh 插件,宿主不会加载它,无需重启',\n restart: '重启',\n installedVersionLabel: '已安装版本',\n catalogLatest: '目录最新',\n installPath: '安装路径',\n copyPath: '复制路径',\n openFolder: '在文件夹中显示',\n openFolderFail: '无法打开文件夹,请复制路径手动打开',\n revealFolder: '在 Finder 中显示',\n installedAtLabel: '安装时间',\n lastUpdatedLabel: '最后更新',\n detailCatalog: '查看详情',\n packageName: '包名',\n versionUpHint: '发现新版本 v{from} → v{to},点击「更新」原位覆盖重装',\n // 设置视图:更新与通道 / 安全与信任 / 诊断 / 系统日志\n settingsUpdate: '更新设置',\n settingsUpdateDesc: '更新检查方式与安装走到的网络通道',\n settingsCheckOnStart: '启动时检查更新',\n settingsCheckOnStartDesc: '打开插件市场时检查已安装插件是否有新版,发现更新会提示',\n settingsProxy: 'HTTP 代理',\n settingsProxyDesc: 'npm / git / 目录数据请求统一走该代理;留空直连',\n // 代理连通性实时探测:输入停笔后提示检测结果(不通仍可保存,先填地址后开代理也合法)\n proxyCheckChecking: '正在测试该代理地址…',\n proxyCheckOk: '测试可达,安装与目录请求将统一走该代理',\n proxyCheckFail: '此地址测试不通,仍可保存;请确认代理已开启、地址与端口无误',\n // 失败细分原因:Windows Schannel 必须取到证书吊销信息,取不到即中断握手 —— 不是代理地址不通\n proxyCheckRevocation: '证书吊销检查受阻(Windows Schannel 取不到 CRL/OCSP),握手被中断;属本机 TLS 环境问题,非代理地址不通',\n settingsMirror: 'npm 镜像源',\n settingsMirrorDesc: '默认跟随本机 npm 配置;官方源慢可换国内镜像',\n mirrorNone: '未配置(跟随本机 npm 配置)',\n mirrorOfficial: '官方源 registry.npmjs.org',\n mirrorNpmmirror: '阿里云 npmmirror',\n mirrorTencent: '腾讯云镜像',\n mirrorTsinghua: '清华大学 TUNA 镜像',\n settingsSecurity: '安全信任',\n settingsSecurityDesc: '命令行安装的三个通道开关:NPM 包、GitHub 源码与 DSH 命令',\n settingsEnableNpm: '启用 NPM 安装',\n settingsEnableNpmDesc: '允许通过命令行安装 npm 包;关闭后输入包名安装会被拦截',\n settingsEnableGit: '启用 GitHub 源码安装',\n settingsEnableGitDesc: '允许通过命令行安装 GitHub 源码;关闭后输入仓库地址安装会被拦截',\n settingsEnableDsh: '启用 DSH 命令安装',\n settingsEnableDshDesc: '允许通过命令行粘贴 dsh plugin 命令安装;关闭后命令输入会被禁用',\n settingsDiagnostics: '系统诊断',\n settingsDiagnosticsDesc: '检测 npm 源 / GitHub / 目录站点等安装通道的连通状态',\n settingsLogs: '系统日志',\n settingsLogsDesc: '本地记录的安装 / 卸载 / 设置变更与诊断结果,可导出全文排查问题',\n logsHeadHint: '记录安装、卸载、设置变更与诊断结果,保留最近 2000 条',\n logsRefresh: '刷新日志',\n logsExport: '导出日志',\n logsLoading: '正在读取日志…',\n logsEmpty: '暂无日志记录',\n logsLoadFail: '读取日志失败,请稍后重试',\n // 系统日志查看器弹窗:内置窗口分页加载,按类别 × 级别筛选\n logModalTitle: '日志查看器',\n logViewerOpen: '打开日志查看器',\n logViewerDesc: '内置窗口直接查看本地日志,按类型与级别筛选,可定位安装 / 卸载 / 更新时的不兼容点',\n logPathLabel: '日志文件',\n logOpenFile: '打开文件',\n logOpenFileTip: '在系统文件管理器中定位日志文件',\n logOpenFileFail: '打开失败,请在文件管理器中手动定位',\n logClearAll: '清空所有日志',\n logClearConfirmTitle: '清空所有日志?',\n logClearConfirmDesc: '将删除全部日志记录,且不可恢复。',\n logClearing: '正在清空…',\n logClearAllTip: '清空全部日志记录',\n logClearFailed: '清空失败,请重试',\n logPathSettingTitle: '日志存放位置',\n logPathSettingDesc: '默认存于宿主配置目录,可填目录或 .log 文件路径改存别处',\n logPathPlaceholder: '留空恢复默认',\n logPathReset: '恢复默认',\n logPathResetHint: '文本框显示当前生效位置',\n logPathSave: '保存',\n logPathSaving: '保存中…',\n logPathSaved: '已保存,新日志将写入该位置',\n logPathSaveFail: '保存失败:该位置不可写或不可用',\n logPathChange: '修改',\n logPathBrowse: '选择目录…',\n logPathBrowseFail: '选择目录不可用,请手动输入路径',\n logCatAll: '全部类型',\n logCatInstall: '安装',\n logCatUninstall: '卸载',\n logCatUpdate: '更新',\n logCatDiagnostics: '诊断',\n logCatSettings: '设置',\n logCatSystem: '系统',\n logLvAll: '全部级别',\n logLvError: '错误',\n logLvWarn: '警告',\n logLvSuccess: '成功',\n logLvInfo: '信息',\n logLvDebug: '调试',\n logSearchPlaceholder: '搜索事件或描述…',\n logLoadMore: '加载更多',\n logNoMore: '已加载全部,共 {n} 条',\n logCount: '共 {n} 条',\n logEmptyFilter: '没有符合条件的日志',\n settingsDiagFail: '不可达',\n // 系统诊断通道列表:一键全量诊断 + 一行一个,可点重测\n diagNpm: 'npm 源',\n // 诊断页 npm 行:未配置镜像时的展示(探测目标仍为官方源,代表本机无配置时的回退)\n diagNpmUnset: '未配置(跟随本机 npm 配置)',\n diagGithub: 'GitHub',\n diagCatalog: '目录站点',\n diagCatalogTarget: '插件市场',\n diagProxy: 'HTTP 代理',\n diagOk: 'OK',\n diagChecking: '检测中…',\n diagIdle: '未检测',\n diagRecheck: '点击重测该通道',\n diagRunAll: '立即诊断',\n diagHeadHint: '共 {n} 个通道,点击任意一行可单独重测',\n diagSummaryRunning: '正在检测通道…',\n diagSummaryOk: '全部通道正常',\n diagSummaryFail: '存在不可达通道,点击对应行可重测',\n // 失败细分原因:Windows Schannel 必须取到证书吊销信息才能握手,取不到即中断(易被误当成网络不通)\n diagFailRevocation: '证书校验受阻',\n diagFailRevocationHint: '系统 curl 取不到证书吊销信息(Windows Schannel 必需 CRL/OCSP),TLS 握手被中断 —— 这不是网络不通,npm/git 可能照常可用。升级 curl 到 7.70+ 可自动按「尽力而为」处理,或换一个能访问吊销服务的网络。',\n settingsEnvSnapshot: '系统版本',\n settingsEnvSnapshotDesc: '复制宿主版本与系统信息,提交 Issue 时粘贴到正文便于复现',\n settingsEnvCopy: '复制',\n // 恢复默认:一级菜单 + 独立设置卡片\n settingsReset: '恢复默认',\n settingsResetDesc: '更新策略、镜像源、代理与安全限制一次性恢复为出厂默认值',\n settingsResetDetail: '恢复更新策略、镜像源、代理与安全限制为出厂默认值',\n settingsResetRun: '恢复默认',\n settingsResetConfirm: '确认恢复',\n settingsResetConfirmDetail: '确定要恢复默认设置吗?更新策略、镜像源、代理与安全限制将全部回到出厂默认值。',\n // 更新通知(通知中心条目标题)\n updateNoticeTitle: '发现新版本',\n updateNoticeGo: '去更新',\n ignoreUpdateRun: '忽略本次更新',\n ignoreUpdateConfirmTitle: '忽略本次更新?',\n ignoreUpdateConfirmDetail: '忽略后本次版本不再提醒;待插件发布下一个新版本时,会再次通知你。',\n ignoreUpdateConfirm: '确认忽略',\n uninstall: '卸载',\n uninstalling: '卸载中…',\n uninstallTitle: '确认卸载?',\n uninstallDesc: '将从当前环境卸载该插件。',\n uninstallDone: '卸载成功',\n uninstallFail: '卸载失败,请稍后重试',\n uninstallResultTitle: '卸载完成',\n uninstallResultDesc: '插件已从当前环境移除。',\n confirmTitle: '确认安装',\n confirmDesc: '安装前请前往插件仓库仔细阅读源码,确认可信后再安装',\n confirmPlugin: '插件',\n confirmSource: '来源',\n confirmCommand: '安装命令',\n copyInstallCommand: '复制安装命令',\n copyCmdLabel: '复制',\n copyUninstallCommand: '复制卸载命令',\n cancelUninstall: '取消卸载',\n uninstallConfirm: '确认卸载',\n installNow: '直接安装',\n installing: '安装中…',\n installDone: '安装成功',\n // 更新成功(通知中心区分安装/更新):更新 = 已安装目标覆盖重装到最新,与首次安装不同语义\n updateDone: '更新成功',\n installResultTitle: '插件安装成功',\n installResultDesc: '',\n // 更新语义:已安装插件点「更新」走同一条 add 命令原位覆盖重装,弹窗文案区分安装/更新\n confirmUpdateTitle: '确认更新',\n updateNow: '直接更新',\n updating: '更新中…',\n queuedUpdateTitle: '已加入更新排队',\n updateResultTitle: '更新完成',\n updateResultDesc: '插件已更新到最新版本。',\n installFail: '安装失败',\n requestTimeout: '请求超时:无法访问 GitHub 或网络不稳定,请稍后重试',\n confirmCancel: '取消',\n doneBtn: '完成',\n // 结果视图:部分插件需重启后才挂载,提供「立即重启 / 稍后重启」选择\n restartNow: '立即重启',\n restartLater: '稍后重启',\n restarting: '正在重启…',\n restartHint: '重启会中断正在进行的安装/卸载任务,其进度将丢失。部分插件(如插件市场、顶层 bundle)需重启后才会生效。',\n done: '完成',\n // 待重启:装完没重启的插件常驻提醒,直到宿主真正重启\n restartPendingHint: '安装成功,重启后生效',\n restartPendingHintUninstall: '卸载成功,重启后移除',\n sectionPendingRestart: '待重启',\n sectionInProgress: '进行中',\n // 通知中心:安装/卸载任务成败的持久记录(工具栏铃铛入口按钮打开)\n notifications: '通知',\n notificationsHint: '查看安装/卸载/更新通知',\n notificationsDesc: '安装、卸载任务与更新提醒都会记录在这里,即使错过提示也能随时回来查看。',\n notificationsEmpty: '暂无通知记录',\n notificationsClear: '清空通知',\n notificationsClearConfirmTitle: '清空所有通知?',\n notificationsClearConfirmDesc: '将删除全部通知记录,且不可恢复。',\n removeNotification: '删除这条通知',\n removeNotificationConfirmTitle: '删除这条通知?',\n removeNotificationConfirmDesc: '该通知将被移除,且不可恢复。',\n // 串行队列:安装/卸载弹窗内可后台关闭,排队任务自动串行执行\n queuedTitle: '已加入安装排队',\n queuedUninstallTitle: '已加入卸载排队',\n queuedHint: '已加入排队,前序任务完成后将自动开始,可关闭本窗口继续浏览。',\n cancelTask: '取消任务',\n cancelling: '正在取消…',\n errorTitle: '操作失败',\n errorTitleInstall: '安装失败',\n errorTitleUninstall: '卸载失败',\n // 更新失败(通知中心区分安装/更新):更新目标覆盖重装失败,与首次安装失败不同语义\n errorTitleUpdate: '更新失败',\n errorPlugin: '插件',\n errorClose: '知道了',\n errorCopy: '复制错误信息',\n errCopied: '错误信息已复制',\n failCopy: '复制完整错误信息',\n failIssueHint: '带着错误日志去作者仓库一键提交 Issue(正文含官网收录链接)',\n failIssueBig: '一键提交 BUG 到 GitHub Issue 为开源作贡献',\n // prepare 构建脚本实际执行失败(git 分发缺子模块/构建产物):插件打包分发问题,应提 Issue\n failPrepareHint: '该插件安装时的构建脚本执行失败(git 分发常缺失子模块或构建产物),属插件打包分发问题。请向作者仓库提交 Issue 反馈。',\n // 安装前预检 / 装后校验拦截([packaging]):git 分发缺构建产物、入口文件不存在 = 插件未适配官方默认安装方式\n failPackagingHint: '该插件不支持官方默认安装方式:其 git 分发缺少构建产物(package.json 声明的入口文件在仓库中不存在),说明作者未适配官方安装流程。请到作者仓库提交 Issue 反馈,请其提交构建产物或发布 npm 版。',\n // 原生依赖构建脚本被 pnpm 默认拦截(如 node-pty 的 ERR_PNPM_IGNORED_BUILDS):只影响带原生模块的插件,属插件依赖打包问题,应提 Issue\n failIgnoredBuild: '该插件或其依赖需要执行构建脚本,被 pnpm 的安全白名单(allowBuilds)默认拦截导致安装失败(如原生模块 node-pty、或 git 安装时插件的 prepare 脚本)—— 其他插件不受影响,属该插件的依赖/打包问题。建议向作者仓库一键反馈,请作者改用预编译版本(如 node-pty-prebuilt-multiarch)或移除安装期构建。',\n // npm arborist 内部崩溃(edgesOut)+ 本机 npm 版本过低:npm 自身已知缺陷,不是插件问题,升级 npm 即可\n failNpmTooLow: '怀疑本机 npm 版本过低:npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest',\n failNpmTooLowV: '本机 npm 版本过低(当前 v{v}):npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest',\n // 安装前连通性预检 / 安装日志里的连接失败([network] / git fetch 超时 / DNS / TLS):本机网络或代理问题,不是插件问题,不引导提 Issue\n failNetworkHint: '安装前检测到网络不通:无法连接到安装源(可能是断网、DNS 解析失败、被防火墙拦截,或代理配置有问题)。这不是插件本身的问题 —— 请检查网络连接,或到「设置」里确认 HTTP 代理配置,再到「系统诊断」运行一次连通性检测,然后重试。',\n // 网络失败弹窗里的「无法访问 …」醒目行:直接告诉用户具体哪个地址连不上({url} 为提取的不可达地址)\n failNetworkRegistryHint: '你的 npm/pnpm 源(registry)被配置为 {host},插件包需从该源下载但失败了。这通常是内网/自定义源没有同步该包(或需要内网认证)—— 请把 npm/pnpm 的 registry 指回官方源 https://registry.npmjs.org(或确认此源可访问该包)后重试。',\n failNetworkTarget: '无法访问 {url} —— 你的网络连接不通',\n // 「去系统诊断」直达按钮:网络不通提示下方的品牌实底按钮,跳到设置 → 系统诊断跑连通性检测\n failNetworkRunDiag: '去系统诊断检测网络',\n // 请求来源没通过本地 hub 服务校验(服务端 403 untrusted origin):请求根本没进安装流程,\n // 与插件无关 —— 引导从本机地址重新打开市场,不引导提 Issue\n failOriginRejectedHint: '这次安装请求没有通过插件市场的来源校验,被本地服务直接拒绝,所以安装根本没有开始 —— 与插件本身无关。通常是因为市场页面不是从本机地址打开的(比如用了局域网 IP),或宿主页面的来源未被识别。请从本机的插件市场地址(localhost)重新打开页面后重试;桌面端用户重启一次宿主即可。',\n failDshMissingHint: '系统找不到 dsh 命令(dsh 未加入系统 PATH),无法调用安装器执行安装。请确认 DeepSeek Harness 已正确安装、dsh 已加入 PATH(或重新安装),然后重试。这不是插件本身的问题。',\n failGitMissingHint: '系统找不到 git 命令(Git 未安装或未加入系统 PATH),无法从 GitHub 源安装插件。请先安装 Git(如 git-scm.com/downloads)或把 git 加入 PATH,重启 DSH 后重试。这不是插件本身的问题。',\n failPnpmMissingHint: '安装器找到了 dsh,但系统里没有 pnpm 命令(dsh 用它来管理 profile 插件)。请先安装 pnpm(如 npm install -g pnpm),确认 pnpm 已加入 PATH 后重试。这不是插件本身的问题。',\n failNpmMissingHint: '系统找不到 npm 命令(npm 未安装或未加入系统 PATH),无法执行全局安装。请先安装 Node.js(自带 npm),确认 npm 已加入 PATH 后重试。这不是插件本身的问题。',\n failPnpmStoreHint: '安装器调用 pnpm 时报「store 位置不匹配」(ERR_PNPM_UNEXPECTED_STORE):你的 profile 目录里旧插件依赖是用另一个大版本的 pnpm 生成的,当前 pnpm 出于安全不认旧目录,导致任何插件装进该 profile 都会失败。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml(可先到「系统日志」或 ~/.dsh/profiles//hub.log 查看完整报错),再重新安装。这不是插件本身的问题。',\n failPnpmUnusedPatchHint: '安装器调用 pnpm 时报「有些补丁没有被使用」(ERR_PNPM_UNUSED_PATCH):你的 profile 里留着一条指向旧版本 dsh-plugin 的补丁声明(例如 dsh-plugin@1.4.2),而本次安装解析到的版本已经不是它,pnpm 出于安全直接中止整次安装,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/)的 pnpm-workspace.yaml(pnpm 11 及以上)或 package.json 的 pnpm.patchedDependencies(pnpm 10)里删除该 dsh-plugin 补丁条目后重试。',\n // 404 依赖:点名 registry 上不存在的那个包(取不到包名时跳过这行),再给删除条目的指引\n failPnpmMissingDepTarget: '{pkg} 在 npm registry 上不存在(404)',\n failPnpmMissingDepHint: '安装器调用 pnpm 时报「包不存在」(ERR_PNPM_FETCH_404):你的 profile 里留着一条指向 registry 上未发布包的依赖,pnpm 每次解析依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/)的 package.json 里删除该依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件)后重试。',\n failFileLockedHint: '安装过程中 pnpm 无法替换 profile 里的文件:有程序正占用着它(Windows 常见报错 os error 32「另一个程序正在使用此文件」)。通常是 DeepSeek Harness 自身或杀毒软件的实时扫描持有文件句柄。这不是插件本身的问题——请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试。',\n failAccessDeniedHint: '安装过程中 pnpm 写入 profile 里的文件被系统拒绝访问(Windows 常见报错 os error 5「拒绝访问」,英文为 Access is denied;Node 下的 EPERM / EACCES 同理)。常见原因是该文件或目录正被其他进程占用、文件带只读属性、目录权限受限,或杀毒软件实时防护拦截了写入——这与「文件正被占用」(os error 32)同属本机文件系统问题,任何插件装进该目录都会一样失败,不是插件本身的问题。请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试;若仍然失败,请检查 profile 目录及其文件是否被设为只读,并以管理员身份重新运行。',\n failFsUnavailableHint: '安装过程中 pnpm 无法把文件写进本机磁盘(这类报错与装哪个插件无关,任何插件装在同一目录都会失败,不是插件本身的问题)。请按报错对号入座:① 磁盘空间不足(ENOSPC / no space left on device,Windows 为 os error 112)——请清理 profile 所在磁盘的剩余空间后重试;② 磁盘或挂载点只读、带写保护(EROFS / read-only file system,Windows 为 os error 19)——请确认 profile 目录所在磁盘可写(外接盘/U 盘、带写保护的移动盘或只读挂载的分区都会触发),必要时把插件目录换到系统盘的可写位置;③ 进程可用的文件句柄被耗尽(EMFILE / ENFILE / too many open files)——请关闭占用大量文件的程序并重启 DeepSeek Harness 后重试。',\n failPnpmWorkspaceHint: '安装器调用 pnpm 时报「不能把依赖装到 workspace 根目录」(ERR_PNPM_ADDING_TO_ROOT):你的 profile 目录被 pnpm 视为 workspace 根目录,而本次安装命令没有声明在根目录操作,pnpm 直接拒绝执行,因此任何插件装进来都会失败。这不是插件本身的问题——可在 profile 目录(~/.dsh/profiles/)的 .npmrc 里加一行 ignore-workspace-root-check=true 后重试,或把 DeepSeek Harness 升级到最新版再试。',\n failPnpmPolicyHint: '安装器调用 pnpm 时被其供应链安全策略拦截——装任何插件都会撞墙,不是插件本身的问题。分两种情况处理:① 提示「Minimum release age」(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION):包发布还不满 24 小时,pnpm 11 出于安全会拒收这种刚发布的新包。可在 pnpm 配置(pnpm-workspace.yaml)里加 minimumReleaseAge: 0 豁免,或等满 24 小时后重试。② 提示「untrusted origin」(ERR_PNPM_UNTRUSTED_ORIGIN):依赖来源不被本机 pnpm 信任,通常是该 profile 里之前用 github: 或非官方 npm 源装过插件,锁文件记录了不受信任的来源。请删除该 profile 目录下的 node_modules 与 pnpm-lock.yaml 后重新安装(可先到「系统日志」或 ~/.dsh/profiles//hub.log 查看完整报错)。',\n // 自定义安装三卡片入口的渠道名(报错/日志溯源:本次安装从哪个入口发起)\n installChannelNpm: 'NPM 包',\n installChannelGit: 'GitHub 源码',\n installChannelDsh: 'DSH 命令',\n // 报错/通知中心的入口溯源行:前缀在错误正文顶部,精准指出自定义安装是从哪张卡片发起的\n installEntryLine: '安装入口:{c}。',\n reportIssue: '去插件仓库提交 Issue',\n detail: '打开详情',\n noResult: '没有找到匹配的插件',\n noResultDesc: '换个关键词试试,或前往网站浏览全部插件。',\n today: '今天更新',\n daysAgo: '更新于 {days} 天前',\n monthsAgo: '更新于 {months} 个月前',\n yearsAgo: '更新于 {years} 年前',\n pluginsTotal: '结果 {n} 条插件',\n // 分类按钮不带数量,选中分类后在列表头部显示筛选结果数\n filterResults: '结果 {n} 条插件',\n more: '还有 {n} 个插件,去网站查看全部',\n browseAll: '浏览全部 {n} 个插件',\n verified: '已验证',\n // 版本与更新:有 release 比版本号;无 release 的仓库比仓库最近更新时间(有新提交即提示更新)\n version: '版本',\n update: '可更新',\n updateAvailable: '有更新',\n updateAvailableHint: '检测到更新:有版本号的仓库比对版本号,无版本号的仓库比对仓库最近更新时间',\n hubUpdateHint: '检测到 DSH Plugin Hub 新版本,点击查看更新内容并更新',\n hubUpdateTitle: 'DSH Plugin Hub 有新版本',\n hubUpdateDesc: 'v{version} 已发布,点击下方按钮即可更新,完成后需重启宿主生效。',\n hubUpdatePublished: '发布于',\n hubUpdateNotes: '更新记录',\n hubUpdateLater: '稍后再说',\n versionHint: '查看版本信息与更新记录',\n hubCurrentTitle: '当前版本',\n hubCurrentDesc: '你正在使用 v{version},已是最新版本。',\n hubUpToDate: '已是最新版本',\n // 头部「关注我们」弹窗:平台介绍 + 用户反馈群二维码(内容由 Worker /about Markdown 推送,非写死)\n followUs: '关注我们',\n aboutTitle: '关注我们',\n aboutDesc: '了解 DSH Plugin Hub 是做什么的,加入用户反馈群随时交流。',\n aboutEmpty: '内容暂未发布,敬请期待。',\n aboutUpdated: '更新于',\n empty: '该分类暂无插件',\n dataFrom: '数据源 api.dsh-plugin.org · 每日人工更新',\n}\n\nexport const en = {\n nav: 'Plugin Hub',\n title: 'DSH Plugin Hub',\n // Plugin counts are filled from the live /api/stats.json ({total}/{verified}), never hardcoded\n tagline: 'DSH Plugin Hub: a human-verified, free marketplace for DeepSeek Harness plugins',\n adBadge: 'Featured',\n ad: 'DSH Plugin Hub: {total} plugins indexed, {verified} human-verified, updated daily',\n search: 'Search plugins by name, description, tags…',\n all: 'All',\n sortStars: 'Stars',\n sortForks: 'Forks',\n sortUpdated: 'Recently updated',\n sortNewest: 'Newest added',\n sortAria: 'Plugin sort order',\n openHint: 'Open dsh-plugin.org',\n toggleLangHint: 'Switch language',\n githubHint: 'View source on GitHub',\n fork: 'Fork',\n loading: 'Loading plugin data…',\n failed: 'Failed to load plugin data',\n // Precise hints when the catalog cannot load: distinguished by whether a proxy is configured\n failedDescNoProxy: 'Your network seems unreachable, so the plugin catalog could not be loaded. Please check your connection and retry; or open the hub in your browser with the button above.',\n failedDescProxy: 'Your network seems unreachable, or the HTTP proxy in Settings is unreachable, so the plugin catalog could not be loaded. Please check the proxy address and your connection, then retry; or open the hub in your browser with the button above.',\n retry: 'Retry',\n install: 'Install',\n // AI-flagged plugins that may need command-line help (webInstallable=false): one-click install still allowed,\n // on failure the user is guided to copy the command into the dsh terminal\n cliOnlyHint: 'This plugin may need command-line help; if it fails, copy the command above and run it in your dsh terminal',\n failedCopyHint: 'Install failed. Copy the command above and run it manually in your dsh terminal (native build scripts may need manual approval, e.g. pnpm approve-builds)',\n toastCopied: 'Install command copied — paste it in your dsh terminal',\n installed: 'Installed',\n // Primary navigation: Market / Installed / Custom / Settings\n viewMarket: 'Market',\n viewInstalled: 'Installed',\n viewCustom: 'Custom',\n viewSettings: 'Settings',\n viewMarketHint: 'Browse and discover plugins',\n viewInstalledHint: 'Manage installed plugins',\n viewCustomHint: 'Install npm packages or GitHub sources manually',\n viewSettingsHint: 'Network sources and preferences',\n // Installed view\n installedEmpty: 'No plugins installed yet',\n installedEmptyDesc: 'Go to Custom to add an npm package or GitHub source manually',\n npmInstallLabel: 'npm package / command',\n npmInstallPlaceholder: 'npm install or a bare package name',\n npmInstallExample: 'Native commands: npm install lodash, npm i lodash, pnpm add @scope/pkg',\n npmInstallExample2: 'Global CLI: npm install -g @scope/cli; or just type a package name like lodash',\n npmInstallInvalid: 'Enter an npm package name (e.g. lodash, @scope/pkg), or a native install command (e.g. npm install lodash, npm i lodash, pnpm add @scope/pkg, npm install -g @scope/cli)',\n gitInstallLabel: 'GitHub source',\n gitInstallPlaceholder: 'Repository address',\n gitInstallExample: 'e.g. owner/repo or https://github.com/owner/repo',\n gitInstallInvalid: 'Enter a GitHub repository address, e.g. owner/repo or https://github.com/owner/repo',\n dshCmdLabel: 'DeepSeek Harness command',\n dshCmdPlaceholder: 'Paste an official dsh plugin command',\n dshCmdInsertHubUpdate: 'Insert update command',\n dshCmdExample: 'e.g. dsh plugin --profile web add github:owner/repo, or dsh plugin --profile web update dsh-plugin',\n dshCmdInvalid: 'Paste an official dsh plugin command (--profile required, add / update), e.g. dsh plugin --profile web update dsh-plugin',\n installHelp: 'Help',\n helpModalTitle: 'Supported command formats',\n npmInstallHelp: 'lodash or @scope/pkg\\tjust type the package name\\nnpm install lodash\\nnpm i lodash\\npnpm add @scope/pkg\\npnpm i @scope/pkg\\nnpm install -g @scope/cli\\tinstalls the CLI globally, not shown in Installed',\n gitInstallHelp: 'owner/repo\\nhttps://github.com/owner/repo\\ngithub:owner/repo\\ngit+https://github.com/owner/repo.git\\ngit@github.com:owner/repo.git',\n dshCmdHelp: 'dsh plugin --profile web add \\tinstall\\ndsh plugin --profile web update \\tupdate an installed target to the latest version\\ndsh plugin --profile=web add \\ndsh plugin --profile=web update \\n\\t--profile is required and there is no -p shorthand; can be an npm package or github:owner/repo; uninstall from the Installed list',\n globalNpmHint: 'This installs CLI tools globally (npm install -g). They won\\'t appear in Installed and no host restart is needed.',\n installCliBtn: 'Install',\n // Install channel disabled (security-trust toggle off → card disabled, guides to settings)\n channelDisabledHint: 'This install channel is disabled — enable it in Settings → Security & Trust',\n goToSettings: 'Go to Settings',\n // Custom install view: standalone top-level section, description text\n customViewDesc: 'Manually install an npm package, a GitHub source, or paste an official dsh plugin command. Finished installs appear in Installed, marked as custom.',\n customLabel: 'Custom install',\n installedSearch: 'Search installed plugins…',\n installedFilterCatalog: 'Catalog',\n hubInstall: 'Hub',\n hubInstallHint: 'From the plugin hub catalog',\n manualInstall: 'Manual',\n manualInstallHint: 'Not from the catalog — installed via the command line',\n filterByLabel: 'Source',\n sortByLabel: 'Sort',\n sortName: 'Name',\n sortInstalledAt: 'Recent',\n detailTitle: 'Plugin details',\n detailCategory: 'Category',\n detailStats: 'Repo stats',\n statusLabel: 'Status',\n statusRunning: 'Running',\n statusPending: 'Restart pending',\n exampleLabel: 'DeepSeek Harness built-in example',\n exampleHint: 'DeepSeek Harness built-in example — not a marketplace dsh plugin, the host does not load it, no restart needed',\n restart: 'Restart',\n installedVersionLabel: 'Installed version',\n catalogLatest: 'latest in catalog',\n installPath: 'Install path',\n copyPath: 'Copy path',\n openFolder: 'Show in folder',\n openFolderFail: 'Could not open the folder — copy the path instead',\n revealFolder: 'Show in Finder',\n installedAtLabel: 'Installed at',\n lastUpdatedLabel: 'Last updated',\n detailCatalog: 'View details',\n packageName: 'Package',\n versionUpHint: 'v{from} → v{to} available — Update reinstalls in place',\n // Settings view: Updates & Sources / Security & Trust / Diagnostics / System Logs\n settingsUpdate: 'Update Settings',\n settingsUpdateDesc: 'Update checks and the network channels used for installs',\n settingsCheckOnStart: 'Check for updates on startup',\n settingsCheckOnStartDesc: 'Check installed plugins for new versions when the hub opens; you will be notified when updates are found',\n settingsAutoInstall: 'Auto-install updates',\n settingsAutoInstallDesc: 'Install detected updates in the background without asking (a host restart applies them)',\n settingsProxy: 'HTTP proxy',\n settingsProxyDesc: 'Route npm, git and catalog requests through this proxy; leave empty to connect directly',\n // Live proxy reachability probe: reported after the user stops typing (an unreachable\n // address can still be saved — users may fill it in before actually starting the proxy)\n proxyCheckChecking: 'Testing this proxy address…',\n proxyCheckOk: 'Reachable — installs and catalog requests will route through it',\n proxyCheckFail: 'Unreachable, but you can still save it; make sure the proxy is running and the address and port are correct',\n // Failure reason: Windows Schannel aborts the handshake when revocation info (CRL/OCSP) is unreachable — not a bad proxy address\n proxyCheckRevocation: 'Certificate revocation check blocked (Windows Schannel could not fetch CRL/OCSP), so the handshake was aborted — a local TLS issue, not a bad proxy address',\n settingsMirror: 'npm mirror',\n settingsMirrorDesc: 'Unset by default — follows local npm config; pick a domestic mirror if slow',\n mirrorNone: 'Unset (follow local npm config)',\n mirrorOfficial: 'Official registry.npmjs.org',\n mirrorNpmmirror: 'Alibaba npmmirror',\n mirrorTencent: 'Tencent Cloud mirror',\n mirrorTsinghua: 'Tsinghua TUNA mirror',\n settingsSecurity: 'Security & Trust',\n settingsSecurityDesc: 'Toggles for the three command-line install channels: npm packages, GitHub sources and DSH commands',\n settingsEnableNpm: 'Enable npm installs',\n settingsEnableNpmDesc: 'Allow installing npm packages from the command line; turning this off rejects package-name installs',\n settingsEnableGit: 'Enable GitHub source installs',\n settingsEnableGitDesc: 'Allow installing from GitHub sources on the command line; turning this off rejects repository-address installs',\n settingsEnableDsh: 'Enable DSH command installs',\n settingsEnableDshDesc: 'Allow pasting a dsh plugin command to install; turning this off disables the command input',\n settingsDiagnostics: 'System Diagnostics',\n settingsDiagnosticsDesc: 'Check the connectivity of install channels: npm registry, GitHub and the catalog site',\n settingsLogs: 'System Logs',\n settingsLogsDesc: 'Local record of installs / uninstalls, settings changes and diagnostics — export the full log to troubleshoot',\n logsHeadHint: 'Records installs, uninstalls, settings changes and diagnostics; keeps the latest 2,000 entries',\n logsRefresh: 'Refresh log',\n logsExport: 'Export log',\n logsLoading: 'Reading log…',\n logsEmpty: 'No log entries yet',\n logsLoadFail: 'Failed to read the log; try again later',\n // Log-viewer dialog: a built-in window that loads the log in pages, filterable by type × level\n logModalTitle: 'Log viewer',\n logViewerOpen: 'Open log viewer',\n logViewerDesc: 'View the local log in a built-in window; filter by type and level to pinpoint install / uninstall / update incompatibilities',\n logPathLabel: 'Log file',\n logOpenFile: 'Reveal',\n logOpenFileTip: 'Reveal the log file in your system file manager',\n logOpenFileFail: 'Could not open; locate the file manually',\n logClearAll: 'Clear all logs',\n logClearConfirmTitle: 'Clear all logs?',\n logClearConfirmDesc: 'All log entries will be deleted. This cannot be undone.',\n logClearing: 'Clearing…',\n logClearAllTip: 'Delete all log entries',\n logClearFailed: 'Failed to clear; try again',\n logPathSettingTitle: 'Log Location',\n logPathSettingDesc: 'Stored in the host config directory by default — set a directory or a .log file path to store elsewhere',\n logPathPlaceholder: 'Leave empty for default',\n logPathReset: 'Reset to default',\n logPathResetHint: 'The field shows the location currently in use',\n logPathSave: 'Save',\n logPathSaving: 'Saving…',\n logPathSaved: 'Saved — new logs will be written there',\n logPathSaveFail: 'Could not save: the location is not writable',\n logPathChange: 'Change',\n logPathBrowse: 'Browse…',\n logPathBrowseFail: 'Folder picker unavailable — type the path manually',\n logCatAll: 'All types',\n logCatInstall: 'Install',\n logCatUninstall: 'Uninstall',\n logCatUpdate: 'Update',\n logCatDiagnostics: 'Diagnostics',\n logCatSettings: 'Settings',\n logCatSystem: 'System',\n logLvAll: 'All levels',\n logLvError: 'Error',\n logLvWarn: 'Warn',\n logLvSuccess: 'Success',\n logLvInfo: 'Info',\n logLvDebug: 'Debug',\n logSearchPlaceholder: 'Search event or message…',\n logLoadMore: 'Load more',\n logNoMore: 'All loaded · {n} total',\n logCount: '{n} entries',\n logEmptyFilter: 'No matching log entries',\n settingsDiagFail: 'Unreachable',\n // System diagnostics channel list: one-click full check + one row per channel, click to re-probe\n diagNpm: 'npm registry',\n // Diagnostics npm row: shown when no mirror is configured (probe still targets the official registry, the fallback)\n diagNpmUnset: 'Unset (follow local npm config)',\n diagGithub: 'GitHub',\n diagCatalog: 'Catalog site',\n diagCatalogTarget: 'Plugin marketplace',\n diagProxy: 'HTTP proxy',\n diagOk: 'OK',\n diagChecking: 'Checking…',\n diagIdle: 'Not checked',\n diagRecheck: 'Click to re-check this channel',\n diagRunAll: 'Run diagnostics',\n diagHeadHint: '{n} channels — click any row to re-check it alone',\n diagSummaryRunning: 'Checking channels…',\n diagSummaryOk: 'All channels reachable',\n diagSummaryFail: 'Unreachable channel(s) — click a row to re-check',\n // Failure reason: Windows Schannel aborts the handshake when revocation info (CRL/OCSP) is unreachable (easily mistaken for a network outage)\n diagFailRevocation: 'Cert check blocked',\n diagFailRevocationHint: 'The system curl cannot fetch certificate revocation info (CRL/OCSP, required by Windows Schannel), so the TLS handshake is aborted — this is not a network outage, and npm/git may still work. curl 7.70+ downgrades the check to best-effort, or switch to a network that can reach the revocation service.',\n settingsEnvSnapshot: 'System version',\n settingsEnvSnapshotDesc: 'Copy host version and system info for pasting into issue reports',\n settingsEnvCopy: 'Copy',\n // Restore defaults: first-level menu + its own settings card\n settingsReset: 'Restore Defaults',\n settingsResetDesc: 'Restore update policy, npm mirror, proxy and security restrictions to factory defaults in one go',\n settingsResetDetail: 'Reset update policy, npm mirror, proxy and security restrictions to factory defaults',\n settingsResetRun: 'Restore Defaults',\n settingsResetConfirm: 'Restore Defaults',\n settingsResetConfirmDetail: 'Reset all settings to factory defaults? Update policy, npm mirror, proxy and security restrictions will be cleared.',\n // Update notice (notification center item title)\n updateNoticeTitle: 'Update available',\n updateNoticeGo: 'Update',\n ignoreUpdateRun: 'Ignore this update',\n ignoreUpdateConfirmTitle: 'Ignore this update?',\n ignoreUpdateConfirmDetail: 'This version will no longer notify you. You will be alerted again when the next version is released.',\n ignoreUpdateConfirm: 'Ignore',\n uninstall: 'Uninstall',\n uninstalling: 'Removing…',\n uninstallTitle: 'Confirm uninstall?',\n uninstallDesc: 'The plugin will be removed from this environment.',\n uninstallDone: 'Uninstalled',\n uninstallFail: 'Removal failed — try again',\n uninstallResultTitle: 'Removed',\n uninstallResultDesc: 'The plugin has been removed from this environment.',\n confirmTitle: 'Confirm install',\n confirmDesc: 'Review the plugin repository source code carefully before installing.',\n confirmPlugin: 'Plugin',\n confirmSource: 'Source',\n confirmCommand: 'Command',\n copyInstallCommand: 'Copy install command',\n copyCmdLabel: 'Copy',\n copyUninstallCommand: 'Copy uninstall command',\n cancelUninstall: 'Cancel uninstall',\n uninstallConfirm: 'Confirm uninstall',\n installNow: 'Install',\n installing: 'Installing…',\n installDone: 'Installed',\n // Updated (notification center distinguishes install/update): update = in-place reinstall to latest\n updateDone: 'Updated',\n installResultTitle: 'Plugin installed successfully',\n installResultDesc: '',\n // Update semantics: the \"update\" action re-runs add in place — copy differentiates install vs update\n confirmUpdateTitle: 'Confirm update',\n updateNow: 'Update',\n updating: 'Updating…',\n queuedUpdateTitle: 'Queued for update…',\n updateResultTitle: 'Updated',\n updateResultDesc: 'The plugin has been updated to the latest version.',\n installFail: 'Install failed — copy the command instead',\n requestTimeout: 'Request timed out: GitHub may be unreachable or the network is unstable — try again later',\n confirmCancel: 'Cancel',\n doneBtn: 'Done',\n // Result view: some plugins need a restart to mount — offer restart now / later\n restartNow: 'Restart now',\n restartLater: 'Later',\n restarting: 'Restarting…',\n restartHint: 'Restarting interrupts any in-progress install / uninstall task — its progress will be lost. Some plugins (such as plugin markets / top-level bundles) only take effect after a restart.',\n done: 'Done',\n restartPendingHint: 'Installed — takes effect after restart',\n restartPendingHintUninstall: 'Removed — cleaned up after restart',\n sectionPendingRestart: 'Pending restart',\n sectionInProgress: 'In progress',\n // 通知中心:安装/卸载任务成败的持久记录(工具栏铃铛入口按钮打开)\n notifications: 'Notifications',\n notificationsHint: 'View install/remove/update notifications',\n notificationsDesc: 'Every install, remove and update notice is logged here — even if you missed the prompt, you can always check back.',\n notificationsEmpty: 'No notifications yet',\n notificationsClear: 'Clear notifications',\n notificationsClearConfirmTitle: 'Clear all notifications?',\n notificationsClearConfirmDesc: 'All notification records will be deleted. This cannot be undone.',\n removeNotification: 'Remove this notification',\n removeNotificationConfirmTitle: 'Remove this notification?',\n removeNotificationConfirmDesc: 'This notification will be removed. This cannot be undone.',\n queuedTitle: 'Queued…',\n queuedUninstallTitle: 'Queued for removal…',\n queuedHint: 'Queued — starts automatically after earlier tasks finish. You may close this window.',\n cancelTask: 'Cancel task',\n cancel: 'Cancel',\n cancelling: 'Cancelling…',\n errorTitle: 'Operation failed',\n errorTitleInstall: 'Install failed',\n errorTitleUninstall: 'Removal failed',\n // Update failed (notification center distinguishes install/update): update target reinstall failed\n errorTitleUpdate: 'Update failed',\n errorPlugin: 'Plugin',\n errorClose: 'Got it',\n errorCopy: 'Copy error',\n errCopied: 'Error copied',\n failCopy: 'Copy full log',\n failIssueHint: 'Open a pre-filled issue on the author repo with this error log (includes catalog links)',\n failIssueBig: 'Report this bug to GitHub — contribute to open source',\n // prepare script actually failed (git tarball misses submodules/build output): a packaging issue of the plugin itself — file an issue\n failPrepareHint: 'This plugin failed while running its build scripts during install (git tarballs often miss submodules or build output). This is a packaging issue of the plugin itself — please report it to the author repository.',\n // Pre-install / post-install guard hit ([packaging]): git distribution lacks build output, entry file missing = not adapted to the official default install method\n failPackagingHint: 'This plugin does not support the official default install method: its git distribution lacks the build output (the entry file declared in package.json is not in the repository), so it has not been adapted to the official install flow. Please file an Issue on the author\\'s repo asking for committed build output or an npm release.',\n // native-module build scripts ignored by pnpm by default (e.g. node-pty, ERR_PNPM_IGNORED_BUILDS): only affects plugins with native deps — a dependency/packaging issue of the plugin itself, file an issue\n failIgnoredBuild: 'This plugin (or its dependencies) needs to run build scripts, which pnpm blocks by default via its allowBuilds allowlist, so the install fails (e.g. native modules like node-pty, or the plugin\\'s own prepare script on git installs) — other plugins are unaffected. This is a dependency/packaging issue of the plugin itself. Please report it to the author repository and ask the author to ship a prebuilt variant (e.g. node-pty-prebuilt-multiarch) or drop install-time builds.',\n failNpmTooLow: 'Your local npm may be too old: npm crashed internally while resolving the plugin\\'s dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest',\n failNpmTooLowV: 'Your local npm is too old (v{v}): npm crashed internally while resolving the plugin\\'s dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest',\n // Pre-install connectivity probe / connection failure in the install log ([network] / git fetch timeout / DNS / TLS): a local network or proxy issue, not a plugin issue — no issue link\n failNetworkHint: 'The network could not be reached before install: the install source is unreachable (offline, DNS failure, firewall block, or a misconfigured proxy). This is not a problem with the plugin itself — please check your connection, confirm the HTTP proxy in Settings, run a connectivity check under System Diagnostics, then retry.',\n // Prominent \"cannot reach …\" line in the network-failure dialog: shows the exact unreachable address ({url})\n failNetworkRegistryHint: 'Your npm/pnpm registry is set to {host}, and the package tarball could not be downloaded from it. This usually means a private/internal mirror that has not synced the package (or requires intranet auth) — point the registry back to https://registry.npmjs.org (or make sure this source can serve the package), then retry.',\n failNetworkTarget: 'Cannot reach {url} — your network connection is down',\n // Diagnostics shortcut button under the network-down hint: jumps to Settings → System Diagnostics\n failNetworkRunDiag: 'Run a network diagnostic',\n // The request origin did not pass the local hub service check (403 untrusted origin): the request\n // never reached the install flow — nothing to do with the plugin, so point at the local address\n // and do not offer an issue link\n failOriginRejectedHint: 'This install request did not pass the marketplace origin check and was rejected by the local service, so the install never started — this is not about the plugin itself. It usually means the marketplace page was not opened from a local address (for example a LAN IP), or the host page origin was not recognized. Reopen the marketplace from localhost and retry; on the desktop app, restart the host once.',\n failDshMissingHint: 'The dsh command could not be found (it is not on the system PATH), so the installer could not run. Please make sure DeepSeek Harness is installed correctly and dsh is on your PATH (or reinstall it), then retry. This is not a problem with the plugin itself.',\n failGitMissingHint: 'The git command could not be found (Git is not installed or not on the system PATH), so GitHub-source plugins cannot be installed. Please install Git (e.g. from git-scm.com/downloads) or add git to your PATH, restart DSH, then retry. This is not a problem with the plugin itself.',\n failPnpmMissingHint: 'The installer found dsh, but pnpm is missing on this machine (dsh uses it to manage profile plugins). Please install pnpm first (e.g. npm install -g pnpm), make sure it is on your PATH, then retry. This is not a problem with the plugin itself.',\n failNpmMissingHint: 'The npm command could not be found (npm is not installed or not on the system PATH), so a global install cannot run. Please install Node.js (which bundles npm), make sure npm is on your PATH, then retry. This is not a problem with the plugin itself.',\n failPnpmStoreHint: 'pnpm reported an unexpected store location (ERR_PNPM_UNEXPECTED_STORE): the profile directory was previously set up with a different major version of pnpm, and the current pnpm refuses to reuse it — no plugin can be installed into that profile. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles//hub.log for the full output), then reinstall. This is not a problem with the plugin itself.',\n failPnpmUnusedPatchHint: 'pnpm reported that some patches were not used (ERR_PNPM_UNUSED_PATCH): your profile still holds a patch entry for an older dsh-plugin version (for example dsh-plugin@1.4.2), while this install resolved a different version, so pnpm aborts the whole install for safety — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dsh-plugin patch entry from pnpm-workspace.yaml (pnpm 11+) or from pnpm.patchedDependencies in package.json (pnpm 10) inside the profile directory (~/.dsh/profiles/), then retry.',\n // Missing dependency: name the package that 404'd (the line is skipped when it cannot be parsed),\n // then give the removal instructions\n failPnpmMissingDepTarget: '{pkg} was not found on the npm registry (404)',\n failPnpmMissingDepHint: 'pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): your profile keeps a dependency on a package that was never published, and pnpm hits it every time it resolves dependencies — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dependency from package.json inside the profile directory (~/.dsh/profiles/) — along with its entry in pnpm-lock.yaml, or the lockfile itself — then retry.',\n failFileLockedHint: 'During install, pnpm could not replace a file inside the profile because another program is holding it (on Windows this shows as os error 32, \"the process cannot access the file because it is being used by another process\"). Usually DeepSeek Harness itself or a real-time antivirus scan holds the handle. This is not a problem with the plugin itself — fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry.',\n failAccessDeniedHint: 'During install, Windows denied pnpm access to a file inside the profile (this shows as os error 5, \"Access is denied\"; on Node the equivalent codes are EPERM / EACCES). Typical causes: the file or directory is held by another process, the file is marked read-only, the directory permissions are restricted, or a real-time antivirus scan blocked the write. This is the same class of local file-system problem as a locked file (os error 32) — no plugin can be installed into that directory, so it is not a problem with the plugin itself. Fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry. If it still fails, check whether the profile directory or its files are read-only and run as administrator.',\n failFsUnavailableHint: 'During install, pnpm could not write files to the local disk — this has nothing to do with which plugin you are installing: any plugin installed into the same directory would fail the same way, so it is not a problem with the plugin itself. Match the error you see: ① Out of space (ENOSPC / no space left on device, os error 112 on Windows) — free up space on the drive that holds the profile and retry. ② Read-only or write-protected volume (EROFS / read-only file system, os error 19 on Windows) — make sure the drive holding the profile directory is writable (external or USB drives, write-protected media, and read-only mounts all trigger this); move the plugin directory to a writable location on the system drive if needed. ③ File handles exhausted (EMFILE / ENFILE / too many open files) — close programs that hold many files open, restart DeepSeek Harness, then retry.',\n failPnpmWorkspaceHint: 'pnpm refused to add the dependency to the workspace root (ERR_PNPM_ADDING_TO_ROOT): the profile directory is treated as a pnpm workspace root, and this install command did not declare that it operates at the root, so pnpm rejected it outright — no plugin can be installed into that profile. This is not a problem with the plugin itself. Add `ignore-workspace-root-check=true` to the `.npmrc` inside the profile directory (~/.dsh/profiles/) and retry, or upgrade DeepSeek Harness and try again.',\n failPnpmPolicyHint: 'The installer was blocked by pnpm supply-chain security policy — every plugin install would hit the same wall, so this is not a problem with the plugin itself. Two cases: ① \"Minimum release age\" (ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION): the package was published less than 24 hours ago, and pnpm 11 refuses freshly-published packages for safety. Add minimumReleaseAge: 0 to your pnpm config (pnpm-workspace.yaml) to opt out, or wait until the 24 hours have passed and retry. ② \"untrusted origin\" (ERR_PNPM_UNTRUSTED_ORIGIN): a dependency source is not trusted by this machine, usually because plugins were previously installed via github: or a non-official npm registry, so the lockfile records an untrusted source. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles//hub.log for the full output), then reinstall.',\n // Custom install entry channel names (the three cards) — used in error/log traceability\n installChannelNpm: 'NPM package',\n installChannelGit: 'GitHub source',\n installChannelDsh: 'DSH command',\n // Entry traceability line prefixed at the top of the error text: which card initiated this install\n installEntryLine: 'Install entry: {c}.',\n reportIssue: 'Report an Issue to the plugin repo',\n detail: 'Open details',\n noResult: 'No plugins match your search',\n noResultDesc: 'Try another keyword, or browse all plugins on the website.',\n today: 'updated today',\n daysAgo: 'updated {days}d ago',\n monthsAgo: 'updated {months}mo ago',\n yearsAgo: 'updated {years}y ago',\n pluginsTotal: 'Results: {n} plugins',\n // Category chips carry no counts; the filtered result count shows in the list header\n filterResults: 'Results: {n} plugins',\n more: '{n} more on the website',\n browseAll: 'Browse all {n} plugins',\n verified: 'Verified',\n // Version & updates: repos with a release are compared by tag; repos without one by last push time (new commits → update)\n version: 'Version',\n update: 'Update',\n updateAvailable: 'Update available',\n updateAvailableHint: 'An update was detected: repos with a release are compared by tag, repos without one by last push time',\n hubUpdateHint: 'A new DSH Plugin Hub version is available — click to view the changelog and update',\n hubUpdateTitle: 'A new DSH Plugin Hub version is available',\n hubUpdateDesc: 'v{version} has been released — click below to update, then restart the host to apply it.',\n hubUpdatePublished: 'Published',\n hubUpdateNotes: \"What's new\",\n hubUpdateLater: 'Later',\n versionHint: 'View version info and changelog',\n hubCurrentTitle: 'Current version',\n hubCurrentDesc: 'You are on v{version} — this is the latest version.',\n hubUpToDate: 'Up to date',\n // Header \"Follow us\" modal: platform intro + user feedback group QR (content pushed via Worker /about Markdown)\n followUs: 'Follow us',\n aboutTitle: 'Follow us',\n aboutDesc: 'Learn what DSH Plugin Hub does and join our user feedback group.',\n aboutEmpty: 'Content not published yet — stay tuned.',\n aboutUpdated: 'Updated',\n empty: 'No plugins in this category yet',\n dataFrom: 'Data from api.dsh-plugin.org · curated daily',\n}\n","/**\n * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.\n * Website: https://dsh-plugin.org\n * GitHub: https://github.com/dshplugin/dsh-plugin-hub\n *\n * Install target/command helpers: decide the install channel (npm package\n * vs explicit-HTTPS GitHub), build the display command and normalize a raw\n * install spec back to its owner/repo identity.\n */\nimport type { HubPlugin } from '../types.ts'\n\n/**\n * 安装通道决策(用户无感知):目录探测到 npm 包名 → 用 npm 包名安装\n * (走 npm registry tarball,更快、与 GitHub 网络无关);无 npm 包名 → git 直装。\n * 返回值 target 即传给后端 /install 的安装目标(npm 包名 或 owner/repo)。\n */\nexport function installTargetOf(p: HubPlugin): { target: string; via: 'npm' | 'github' } {\n const pkg = (p.source?.npmPackage ?? '').trim()\n const repo = (p.source?.repo ?? '').trim()\n if (pkg && repo) return { target: pkg, via: 'npm' }\n return { target: repo, via: 'github' }\n}\n\n/** 展示用安装命令(复制/弹窗):目录下发的权威命令优先(CLI-only 插件如 dsh-tui\n * 需专属 profile(--profile dsh-tui),无法从 repo/npm 包名推断,必须用官方命令);\n * 常规插件无目录命令时按通道回退生成:npm 显示包名,git 显示显式 HTTPS URL。 */\nexport function installCommandOf(p: HubPlugin, withProfile = false): string {\n const { target, via } = installTargetOf(p)\n if (via === 'npm') {\n const cmd = p.install?.command\n if (cmd) return cmd\n } else {\n const cmd = p.install?.githubCommand\n if (cmd) return cmd\n }\n return via === 'npm'\n ? `dsh plugin${withProfile ? ' --profile web' : ''} add ${target}`\n : `dsh plugin${withProfile ? ' --profile web' : ''} add git+https://github.com/${target}.git`\n}\n\n/** Normalize a task/install target to its owner/repo display identity. */\nexport function repoFromInstallTarget(value: string): string {\n const input = value.trim()\n if (/^[A-Za-z0-9._-]+\\/[A-Za-z0-9._-]+$/.test(input)) return input\n const patterns = [\n /^github:([^/]+)\\/([^/]+)$/i,\n /^(?:git\\+)?https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:[?#].*)?$/i,\n /^(?:git\\+)?ssh:\\/\\/(?:git@)?github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:[?#].*)?$/i,\n /^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?(?:[?#].*)?$/i,\n ]\n for (const pattern of patterns) {\n const match = pattern.exec(input)\n if (match !== null) return `${match[1]}/${match[2]}`\n }\n return value\n}\n","/**\n * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.\n * Website: https://dsh-plugin.org\n * GitHub: https://github.com/dshplugin/dsh-plugin-hub\n *\n * Constants: site URLs, category metadata and sort keys. Pure data — no\n * side effects, no network — so every consumer shares one definition.\n */\nimport type { LocaleId } from '../types.ts'\n\n/** 插件市场官网地址。 */\nexport const SITE_URL = 'https://dsh-plugin.org/'\n\n/** 插件市场源码仓库:头部右上角 GitHub 图标的跳转地址 */\nexport const GITHUB_URL = 'https://github.com/dshplugin/dsh-plugin-hub'\n\n/** Hub 自身在目录数据里的仓库标识:头部版本号旁的「可更新」徽标按它定位自己。 */\nexport const HUB_REPO = 'dshplugin/dsh-plugin-hub'\n\n/**\n * Hub 自我更新版本控制(接口中心 Pages:api.dsh-plugin.org,静态 JSON 发布)。\n * 发新版 = 在 api-center 的 releases/ 写发版记录 + 重新部署,hub.json 随之更新,\n * 所有已装用户的「可更新」徽标即可见,不经过主站目录数据管道。\n * 响应:{ version: string | null, publishedAt: string | null, notes: string | {zh,en} | null }\n */\nexport const HUB_UPDATE_URL = 'https://api.dsh-plugin.org/hub.json'\n\n/** 接口中心「关注我们」内容(静态 JSON,由 api-center 的 about.md 构建生成,Markdown)。 */\nexport const HUB_ABOUT_URL = 'https://api.dsh-plugin.org/about.json'\n\n/** 构建时由 tsdown 从 package.json 注入的插件版本号(见 tsdown.config.ts define)。 */\ndeclare const __PLUGIN_VERSION__: string\n\n/**\n * 插件当前版本号,供头部标题展示「DSH Plugin Hub v0.1.1」。\n * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;\n * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。\n */\nexport const PLUGIN_VERSION: string =\n typeof __PLUGIN_VERSION__ === 'string' ? __PLUGIN_VERSION__ : ''\n\nexport const CATEGORY_ORDER = [\n 'interface', 'session', 'memory', 'tools', 'agent', 'workflow',\n 'integration', 'model', 'dev', 'knowledge', 'fun',\n]\n\n/** 分类标签按界面语言取词;未知 key 原样返回。 */\nexport function categoryLabel(\n map: Record,\n key: string,\n lang: LocaleId,\n): string {\n return map[key]?.[lang] ?? key\n}\n\nexport const CATEGORY_LABELS: Record = {\n interface: { zh: '界面与体验', en: 'UI & Experience' },\n session: { zh: '会话与消息', en: 'Sessions & Messages' },\n memory: { zh: '记忆与上下文', en: 'Memory & Context' },\n tools: { zh: '工具与能力', en: 'Tools & Capabilities' },\n agent: { zh: '技能与智能体', en: 'Skills & Agents' },\n workflow: { zh: '工作流与自动化', en: 'Workflow & Automation' },\n integration: { zh: '集成与连接', en: 'Integrations & Connections' },\n model: { zh: '模型与推理', en: 'Models & Reasoning' },\n dev: { zh: '开发与运维', en: 'Development & Operations' },\n knowledge: { zh: '数据与知识', en: 'Data & Knowledge' },\n fun: { zh: '娱乐', en: 'Entertainment' },\n}\n\n/** 分类 Tab 的紧凑标签(英文模式空间受限时使用)。 */\nexport const CATEGORY_SHORT_LABELS: Record = {\n interface: { zh: '界面体验', en: 'UI Exp' },\n session: { zh: '会话消息', en: 'Sessions' },\n memory: { zh: '记忆上下文', en: 'Memory' },\n tools: { zh: '工具能力', en: 'Tools' },\n agent: { zh: '技能智能体', en: 'Agents' },\n workflow: { zh: '工作流', en: 'Workflow' },\n integration: { zh: '集成连接', en: 'Integrations' },\n model: { zh: '模型推理', en: 'Models' },\n dev: { zh: '开发运维', en: 'Dev' },\n knowledge: { zh: '数据知识', en: 'Knowledge' },\n fun: { zh: '娱乐', en: 'Fun' },\n}\n\nexport const SORTS = ['sortStars', 'sortForks', 'sortUpdated', 'sortNewest'] as const\nexport type SortKey = (typeof SORTS)[number]\n","/**\n * Self-heal missing plugin CSS tags.\n *\n * CSS injection is a one-shot side effect of the bundle factory (guarded by\n * \"tag already present\"). When the host restarts the page survives, but the\n * host HMR chain may remove the