coding-tool-x 3.8.5 → 3.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/web/assets/{AgentsDrawer-BG6P3DX-.js → AgentsDrawer-Db9wAyaZ.js} +1 -1
- package/dist/web/assets/{Analytics--z_FmL5P.js → Analytics-C4gMzv7g.js} +1 -1
- package/dist/web/assets/{AssetPathField-CrJtRKHy.js → AssetPathField-Bd_nMFu3.js} +1 -1
- package/dist/web/assets/{ChatHistoryDrawer-BiuEryJj.js → ChatHistoryDrawer-CwzJHyNP.js} +1 -1
- package/dist/web/assets/{CollapseItem-BAYEsL_Q.js → CollapseItem-CTCfSiue.js} +1 -1
- package/dist/web/assets/{CommandsDrawer-YJ-U7BXN.js → CommandsDrawer-vDghB1U9.js} +1 -1
- package/dist/web/assets/{ConfigExportDrawer-Ce_hAknW.js → ConfigExportDrawer-C-XDvlHc.js} +1 -1
- package/dist/web/assets/{ConfigTemplates-Bvr1NN6K.js → ConfigTemplates-CYY8XRED.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesDrawer-BjIeHfF-.js → ConfigTemplatesDrawer-CbsJp76X.js} +1 -1
- package/dist/web/assets/{ConfigTemplatesPanel-AV00tm_D.js → ConfigTemplatesPanel-liMSTh7s.js} +1 -1
- package/dist/web/assets/{FavoritesDrawer-Cz95o4CD.js → FavoritesDrawer-D6QSiYaL.js} +1 -1
- package/dist/web/assets/{GatewayConvertDrawer-DLlbMz27.js → GatewayConvertDrawer-RvET6iNG.js} +1 -1
- package/dist/web/assets/{Home-D7CCOFQC.js → Home-P8eseZcf.js} +1 -1
- package/dist/web/assets/{MarkdownEditor-rEZ-c72L.js → MarkdownEditor-CYmLGYju.js} +1 -1
- package/dist/web/assets/{McpDrawer-DfoCyxU2.js → McpDrawer-Ch3bkKIq.js} +1 -1
- package/dist/web/assets/{McpFormDrawer-SKu8HNUR.js → McpFormDrawer-BcTlgSpN.js} +1 -1
- package/dist/web/assets/{PluginManager-BbeK-3rV.js → PluginManager-Dh2o0xkZ.js} +1 -1
- package/dist/web/assets/{PluginsDrawer-CWVJ7yjS.js → PluginsDrawer-deKQ5u3I.js} +1 -1
- package/dist/web/assets/{PluginsPanel-Cm2N3StG.js → PluginsPanel-BofsgQgj.js} +1 -1
- package/dist/web/assets/{ProjectList-CsjnsNPv.js → ProjectList-DhSWJHTA.js} +1 -1
- package/dist/web/assets/{PromptsDrawer-EGd3djFa.js → PromptsDrawer-Cfb2FeeU.js} +1 -1
- package/dist/web/assets/{RecentSessionsDrawer-D1vtoLAs.js → RecentSessionsDrawer-3eXamJhr.js} +1 -1
- package/dist/web/assets/{SessionCard-BgLg49U3.js → SessionCard-CW0eHURI.js} +1 -1
- package/dist/web/assets/{SessionList-TRiTklWk.js → SessionList-DQfyDGWU.js} +1 -1
- package/dist/web/assets/SettingsDrawer-Dw5NUgHC.css +1 -0
- package/dist/web/assets/SettingsDrawer-u_vwUuPS.js +1 -0
- package/dist/web/assets/{SkillManager-BTjTUbHq.js → SkillManager-DHMprJLA.js} +1 -1
- package/dist/web/assets/{SkillsDrawer-pN0hbkK3.js → SkillsDrawer-CkF3BpyC.js} +1 -1
- package/dist/web/assets/{SkillsPanel-gmBWEoiF.js → SkillsPanel-DWE4pFGx.js} +1 -1
- package/dist/web/assets/{SpeedTestDrawer-DcNzuVJk.js → SpeedTestDrawer-BgfG1Ked.js} +1 -1
- package/dist/web/assets/{Upload-v5rV0qTT.js → Upload-CNwaGOws.js} +1 -1
- package/dist/web/assets/{WorkspaceDrawer-DxmicM4U.js → WorkspaceDrawer-Br5CeCzL.js} +1 -1
- package/dist/web/assets/{WorkspaceManager-CJHCjARN.js → WorkspaceManager-B2O8-qIw.js} +1 -1
- package/dist/web/assets/{WorkspacePanel-D8_Zq-du.js → WorkspacePanel-5oDKit3c.js} +1 -1
- package/dist/web/assets/{index-DnEocV0M.js → index-BMAUPq5K.js} +2 -2
- package/dist/web/assets/{index-C0EHRym0.css → index-Bi1MQHYX.css} +1 -1
- package/dist/web/assets/{useResponsiveDrawer-B3uojyvV.js → useResponsiveDrawer-jbmqZuJs.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/commands/daemon.js +10 -0
- package/src/platforms/channel-auth-registry.js +3 -0
- package/src/platforms/channel-auth-service.js +33 -8
- package/src/platforms/native-oauth-adapters.js +11 -1
- package/src/platforms/notification-hooks.js +55 -5
- package/src/platforms/oauth-credentials-service.js +170 -41
- package/src/server/services/channel-balance.js +122 -4
- package/src/server/services/network-access.js +11 -1
- package/src/server/services/session-history-index.js +106 -11
- package/dist/web/assets/SettingsDrawer-d5liXjHq.css +0 -1
- package/dist/web/assets/SettingsDrawer-rz2WejGY.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
.header-button[data-v-b515354d]{border:1px solid var(--border-primary);background:var(--bg-elevated);cursor:pointer;border-radius:999px;outline:none;justify-content:center;align-items:center;width:40px;height:40px;padding:0;transition:all .2s;display:inline-flex;box-shadow:0 10px 24px #0f171d14}.header-button[data-v-b515354d] .n-icon{color:var(--text-tertiary);transition:all .2s}.header-button[data-v-b515354d]:hover:not(.disabled){background:color-mix(in srgb, var(--bg-elevated) 90%, var(--primary-color) 10%);border-color:#18a0583d;box-shadow:0 14px 30px #0f171d1f}.header-button[data-v-b515354d]:hover:not(.disabled) .n-icon{color:var(--primary-color,#18a058)}.header-button[data-v-b515354d]:active:not(.disabled){transform:scale(.95)}.header-button.active[data-v-b515354d]{background:linear-gradient(135deg,#18a05824,#18a0580f);border-color:#18a05852}.header-button.active[data-v-b515354d] .n-icon{color:#18a058!important}.header-button.disabled[data-v-b515354d]{cursor:not-allowed;opacity:.5}[data-theme=dark] .header-button[data-v-b515354d]{box-shadow:none;background:#0d171eeb;border-color:#364c56e6}[data-theme=dark] .header-button[data-v-b515354d]:hover:not(.disabled){background:#14222afa;border-color:#18a05847;box-shadow:0 0 0 1px #18a05814}.modal-header[data-v-7ea71ef7]{align-items:center;gap:10px;display:flex}.warning-icon[data-v-7ea71ef7]{color:#f59e0b}.header-title[data-v-7ea71ef7]{color:var(--text-primary);font-size:16px;font-weight:600}.modal-content[data-v-7ea71ef7]{padding:4px 0}.desc-text[data-v-7ea71ef7]{color:var(--text-secondary);margin:0 0 16px;font-size:13px;line-height:1.6}.conflict-list[data-v-7ea71ef7]{background:var(--bg-tertiary);border-radius:6px;padding:12px}.list-header[data-v-7ea71ef7]{border-bottom:1px solid var(--border-primary);align-items:center;gap:12px;margin-bottom:10px;padding-bottom:10px;display:flex}.selected-hint[data-v-7ea71ef7]{color:var(--text-tertiary);font-size:12px}.conflict-items[data-v-7ea71ef7]{flex-direction:column;gap:8px;display:flex}.conflict-item[data-v-7ea71ef7]{background:var(--bg-secondary);cursor:pointer;border:1px solid #0000;border-radius:6px;align-items:flex-start;gap:10px;padding:10px 12px;transition:all .15s;display:flex}.conflict-item[data-v-7ea71ef7]:hover{background:#18a05805;border-color:#18a05866}.conflict-item.selected[data-v-7ea71ef7]{background:#18a0580f;border-color:#18a058}.item-content[data-v-7ea71ef7]{flex:1;min-width:0}.item-header[data-v-7ea71ef7]{align-items:center;gap:8px;margin-bottom:4px;display:flex}.var-name[data-v-7ea71ef7]{color:var(--text-primary);background:var(--bg-tertiary);border-radius:4px;padding:2px 6px;font-size:13px;font-weight:600}.var-value[data-v-7ea71ef7]{color:var(--text-secondary);word-break:break-all;margin-bottom:4px;font-family:SF Mono,Monaco,monospace;font-size:12px}.var-source[data-v-7ea71ef7]{color:var(--text-tertiary);font-size:11px}.source-label[data-v-7ea71ef7]{color:var(--text-quaternary)}.modal-footer[data-v-7ea71ef7]{justify-content:flex-end;gap:8px;display:flex}.process-env-alert[data-v-7ea71ef7]{margin-bottom:16px}.alert-content[data-v-7ea71ef7]{font-size:12px;line-height:1.6}.alert-title[data-v-7ea71ef7]{margin:0 0 8px;font-weight:500}.alert-list[data-v-7ea71ef7]{margin:0;padding-left:20px}.alert-list li[data-v-7ea71ef7]{margin:4px 0}.alert-list code[data-v-7ea71ef7]{background:var(--bg-tertiary);color:#18a058;border-radius:4px;padding:2px 6px;font-family:SF Mono,Monaco,monospace;font-size:11px}.alert-hint[data-v-7ea71ef7]{color:var(--text-tertiary);margin:8px 0 0;font-size:11px}.channel-card[data-v-51007f34]{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;transition:all .2s}.channel-card[data-v-51007f34]:hover{border-color:var(--border-secondary)}.channel-header[data-v-51007f34]{border-bottom:1px solid var(--border-primary);justify-content:space-between;align-items:center;gap:8px;padding:12px 16px;display:flex}.channel-title[data-v-51007f34]{flex:auto;align-items:center;gap:6px;min-width:0;margin-right:0;display:flex}.channel-name[data-v-51007f34]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.channel-title[data-v-51007f34] .n-tag{flex-shrink:0;padding:0 5px;font-size:11px}.collapse-btn[data-v-51007f34]{flex-shrink:0}.collapse-btn .n-icon.collapsed[data-v-51007f34]{transform:rotate(-90deg)}.channel-actions[data-v-51007f34]{flex-wrap:nowrap;flex:none;justify-content:flex-end;align-items:center;gap:4px;max-width:100%;margin-left:auto;display:flex}.channel-actions[data-v-51007f34] .n-button{min-width:0;height:22px;padding:0 5px;font-size:11px}.channel-actions[data-v-51007f34] .n-button__content{gap:2px}.channel-actions[data-v-51007f34] .n-button__icon{margin:0}.apply-btn[data-v-51007f34]{display:none}.channel-card:hover .apply-btn[data-v-51007f34]{display:inline-flex}.test-result[data-v-51007f34]{border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);padding:10px 16px}.test-result.success[data-v-51007f34]{background:#18a0580f;border-left:3px solid #18a058}.test-result.failed[data-v-51007f34]{background:#f56c6c0f;border-left:3px solid #f56c6c}.test-result-header[data-v-51007f34]{align-items:center;gap:12px;display:flex}.test-result-status[data-v-51007f34]{align-items:center;gap:6px;font-size:13px;font-weight:500;display:flex}.test-result.success .test-result-status[data-v-51007f34]{color:#18a058}.test-result.failed .test-result-status[data-v-51007f34]{color:#f56c6c}.test-result-info[data-v-51007f34]{flex:1;align-items:center;gap:10px;display:flex}.test-result-info .latency[data-v-51007f34]{color:var(--text-primary);background:var(--bg-tertiary);border-radius:4px;padding:2px 8px;font-family:SF Mono,Monaco,monospace;font-size:13px;font-weight:600}.test-result-info .status-code[data-v-51007f34]{color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace;font-size:11px}.test-result-error[data-v-51007f34]{color:#f56c6c;word-break:break-word;background:#f56c6c14;border-radius:4px;margin-top:8px;padding:8px 10px;font-size:12px;line-height:1.4}.channel-info[data-v-51007f34]{padding:12px 16px}.info-main[data-v-51007f34]{flex-direction:column;gap:8px;display:flex}.info-row[data-v-51007f34]{align-items:center;gap:12px;display:flex}.info-row .label[data-v-51007f34]{min-width:80px;font-size:13px}.info-row .value[data-v-51007f34]{flex:1;font-size:13px}.info-row .value.mono[data-v-51007f34]{font-family:SF Mono,Monaco,monospace}.info-footer[data-v-51007f34]{border-top:1px solid var(--border-primary);justify-content:space-between;align-items:center;margin-top:12px;padding-top:8px;display:flex}.footer-spacer[data-v-51007f34]{flex:1}.channel-meta[data-v-51007f34]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12px;font-size:12px;display:flex}.balance-meta-tag[data-v-51007f34]{cursor:pointer;flex-shrink:0;max-width:140px}.balance-meta-tag[data-v-51007f34] .n-tag__content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.meta-item[data-v-51007f34]{color:var(--text-tertiary);white-space:nowrap}.meta-value[data-v-51007f34]{color:var(--text-secondary);font-weight:500}.meta-active[data-v-51007f34]{color:#18a058}@media (width<=1024px){.channel-header[data-v-51007f34],.channel-info[data-v-51007f34]{padding:10px 12px}.channel-actions[data-v-51007f34]{gap:6px}.info-row[data-v-51007f34]{gap:8px}.info-row .label[data-v-51007f34]{min-width:70px;font-size:12px}.info-row .value[data-v-51007f34]{font-size:12px}.channel-meta[data-v-51007f34]{gap:12px}}@media (width<=768px){.channel-header[data-v-51007f34]{flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px}.channel-title[data-v-51007f34]{margin-right:0}.channel-actions[data-v-51007f34]{justify-content:space-between}.channel-actions[data-v-51007f34] .n-button{padding:0 8px;font-size:12px}.channel-info[data-v-51007f34]{padding:8px 10px}.info-row[data-v-51007f34]{flex-direction:column;align-items:flex-start;gap:4px}.info-row .label[data-v-51007f34]{min-width:auto}.info-footer[data-v-51007f34]{flex-direction:column;align-items:flex-start;gap:8px;margin-top:8px}.channel-meta[data-v-51007f34]{justify-content:flex-start;align-self:stretch;gap:8px 12px}}@media (width<=640px){.channel-card[data-v-51007f34]{border-radius:6px}.channel-header[data-v-51007f34]{padding:6px 8px}.channel-name[data-v-51007f34]{min-width:0;font-size:12px}.channel-title[data-v-51007f34]{min-width:0}.channel-title[data-v-51007f34] .n-tag{font-size:10px}.channel-info[data-v-51007f34]{padding:6px 8px}.info-row .label[data-v-51007f34],.info-row .value[data-v-51007f34]{font-size:11px}.channel-actions[data-v-51007f34] .n-button{height:24px;padding:0 6px;font-size:11px}.channel-meta[data-v-51007f34]{font-size:11px}}@media (width<=480px){.channel-header[data-v-51007f34],.channel-info[data-v-51007f34]{padding:4px 6px}.channel-actions[data-v-51007f34]{gap:4px}.channel-actions[data-v-51007f34] .n-button{min-width:0;height:22px;padding:0 4px;font-size:10px}}.model-redirect-editor[data-v-8ebdcad0]{width:100%}.redirect-row[data-v-8ebdcad0]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.redirect-input[data-v-8ebdcad0]{flex:1;min-width:0}.redirect-arrow[data-v-8ebdcad0]{flex-shrink:0;justify-content:center;align-items:center;width:24px;display:flex}.add-btn[data-v-8ebdcad0]{width:100%;margin-top:4px}.channel-auth-section[data-v-298fd343]{gap:10px;width:100%;display:grid}.oauth-content[data-v-298fd343],.oauth-quota[data-v-298fd343]{gap:8px;display:grid}.oauth-meta[data-v-298fd343]{color:var(--text-color-3)}.oauth-quota[data-v-298fd343]{grid-template-columns:repeat(3,auto);align-items:center}.loading-container{justify-content:center;align-items:center;padding:80px 0;display:flex}.empty-state{justify-content:center;align-items:center;min-height:200px;display:flex}.model-catalog-control{flex-wrap:wrap;align-items:center;gap:6px 8px;margin:-3px 0 10px;font-size:12px;line-height:1.45;display:flex}.model-catalog-status{color:var(--n-text-color-3)}.model-catalog-status.is-loading{color:var(--n-info-color,var(--n-text-color-3))}.model-catalog-status.is-error{color:var(--n-error-color,#d03050)}.channels-list{flex-direction:column;gap:10px;display:flex;position:relative;overflow:hidden}.channel-card{border:1px solid var(--n-divider-color);background:var(--bg-secondary);border-left:3px solid #18a058;border-radius:6px;padding:10px 12px;transition:all .2s;box-shadow:0 1px 2px #0000000a}.channel-card.active{border-color:var(--n-primary-color);background:var(--n-primary-color-suppl,#18a05814);box-shadow:0 2px 8px #18a0581a}.channel-card:hover{border-color:var(--n-border-color);box-shadow:0 2px 8px #00000014}.channel-card.disabled{opacity:.6;border-left-color:#909399}.channel-card.status-frozen{background:linear-gradient(90deg,#d0305014 0%,#0000 100%);border-left-color:#d03050}.channel-card.status-checking{background:linear-gradient(90deg,#f0a02014 0%,#0000 100%);border-left-color:#f0a020}.channel-card.collapsed .channel-info{display:none}.channel-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.channel-title{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.channel-name{color:var(--n-text-color);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.channel-actions{flex-shrink:0;align-items:center;gap:6px;display:flex}.channel-actions .apply-btn{opacity:0;transition:opacity .2s}.channel-card:hover .channel-actions .apply-btn{opacity:1}.channel-actions .n-switch{margin-left:2px}.channel-info{border-top:1px dashed var(--n-border-color);margin-top:8px;padding-top:8px}.info-main{flex-direction:column;gap:4px;display:flex}.info-row{align-items:center;gap:8px;display:flex}.label{color:var(--n-text-color-3);flex-shrink:0;width:56px;font-size:11px}.value{color:var(--n-text-color-2);word-break:break-word;flex:1;font-size:12px}.value.mono{font-family:IBM Plex Mono,SFMono-Regular,Consolas,monospace}.info-footer{border-top:1px dashed var(--n-border-color);align-items:center;gap:8px;margin-top:6px;padding-top:6px;display:flex}.footer-spacer{flex:1}.channel-meta{flex-shrink:0;gap:12px;display:flex}.meta-item{color:var(--n-text-color-3);white-space:nowrap;font-size:11px}.meta-value{color:#18a058;font-weight:600}.meta-value.meta-active{color:#f0a020;animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.collapse-btn{align-items:center;padding:0;display:flex}.collapse-btn .n-icon{transition:transform .2s}.collapse-btn .n-icon.collapsed{transform:rotate(-90deg)}.dialog-footer{justify-content:flex-end;gap:8px;display:flex}.channel-form{padding:0}.form-section{background:var(--n-color);border:1px solid var(--n-border-color);border-radius:6px;margin-bottom:10px;padding:12px}.form-section:last-child{margin-bottom:0}.section-title{color:var(--n-text-color);border-bottom:1px solid var(--n-border-color);align-items:center;gap:6px;margin-bottom:10px;padding-bottom:6px;font-size:12px;font-weight:600;display:flex}.section-desc{color:var(--n-text-color-3);font-size:11px;font-weight:400}.form-section.collapsible{background:var(--n-color-hover)}.channel-form .n-radio-group{width:100%}.channel-form .n-radio-group .n-space{gap:16px;width:100%;display:flex}.channel-form .n-radio{border:1px solid var(--n-border-color);border-radius:6px;flex:1;justify-content:center;padding:8px 16px;transition:all .2s;display:flex}.channel-form .n-radio:hover,.channel-form .n-radio.n-radio--checked{border-color:var(--n-primary-color);background:var(--n-primary-color-suppl,#18a05814)}.channel-form .n-form-item{margin-bottom:10px}.channel-form .n-form-item:last-child{margin-bottom:0}.channel-form .n-form-item-label{padding-bottom:0;font-size:12px}.auth-provider-status{flex-direction:column;justify-content:center;gap:6px;width:100%;min-height:28px;display:flex}.auth-provider-tags{min-height:24px}.auth-provider-message{color:var(--n-text-color-3);font-size:12px;line-height:1.45}.auth-provider-message.warning{color:#c97a00}.model-definitions-editor[data-v-95ee536c]{width:100%}.model-definitions-toolbar[data-v-95ee536c]{align-items:center;gap:10px;margin-bottom:8px;display:flex}.proxy-logs[data-v-b403c421]{background:#fff;border-top:1px solid #e5e7eb;flex-direction:column;height:100%;display:flex}[data-theme=dark] .proxy-logs[data-v-b403c421]{background:var(--bg-secondary);border-top:1px solid var(--border-primary)}.logs-header[data-v-b403c421]{border-bottom:1px solid #e5e7eb;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}[data-theme=dark] .logs-header[data-v-b403c421]{border-bottom:1px solid var(--border-primary)}.header-left[data-v-b403c421]{align-items:center;gap:12px;display:flex}.title[data-v-b403c421]{color:#18181b;margin:0;font-size:14px;font-weight:600}[data-theme=dark] .title[data-v-b403c421]{color:var(--text-primary)}.today-stats[data-v-b403c421]{align-items:center;gap:6px;display:flex}.today-stats[data-v-b403c421] .n-tag{padding:2px 8px;font-size:11px;font-weight:600}.logs-table[data-v-b403c421]{flex-direction:column;flex:1;display:flex;overflow:hidden}.table-header[data-v-b403c421]{color:#6b7280;white-space:nowrap;background:#f9fafb;border-bottom:1px solid #e5e7eb;flex-shrink:0;padding:8px 12px;font-size:11px;font-weight:600;display:flex}[data-theme=dark] .table-header[data-v-b403c421]{border-bottom:1px solid var(--border-primary);color:var(--text-tertiary);background:#ffffff05}.table-body[data-v-b403c421]{flex:1;min-height:0;padding-bottom:40px;scroll-padding-bottom:40px;overflow:hidden auto}.table-row[data-v-b403c421]{cursor:pointer;border-bottom:1px solid #f3f4f6;padding:8px 12px;font-size:12px;transition:background-color .2s;display:flex;position:relative}[data-theme=dark] .table-row[data-v-b403c421]{border-bottom:1px solid #ffffff0a}.table-row[data-v-b403c421]:hover{background:#f9fafb}[data-theme=dark] .table-row[data-v-b403c421]:hover{background:#ffffff0a}.table-row.new-log[data-v-b403c421],.action-row.new-log[data-v-b403c421]{border-left:3px solid #18a058;padding-left:9px;animation:4.5s cubic-bezier(.25,.46,.45,.94) forwards newLogPulse-b403c421}@keyframes newLogPulse-b403c421{0%{background:linear-gradient(90deg,#18a05826 0%,#18a0580f 100%);box-shadow:0 0 8px #18a05833}5%{background:linear-gradient(90deg,#18a0582e 0%,#18a05814 100%);box-shadow:0 0 12px 1px #18a05840}15%{background:linear-gradient(90deg,#18a05829 0%,#18a05812 100%);box-shadow:0 0 10px 1px #18a05833}30%{background:linear-gradient(90deg,#18a0581f 0%,#18a0580d 100%);box-shadow:0 0 6px #18a05826}50%{background:linear-gradient(90deg,#18a05814 0%,#18a05808 100%);box-shadow:0 0 4px #18a0581a}70%{background:linear-gradient(90deg,#18a0580a 0%,#18a05804 100%);box-shadow:0 0 2px #18a0580f}85%{background:linear-gradient(90deg,#18a05805 0%,#18a05802 100%);box-shadow:0 0 1px #18a05808}to{background:0 0;border-left-color:#0000;box-shadow:0 0 #18a05800}}[data-theme=dark] .table-row.new-log[data-v-b403c421],[data-theme=dark] .action-row.new-log[data-v-b403c421]{animation:4.5s cubic-bezier(.25,.46,.45,.94) forwards newLogPulseDark-b403c421}@keyframes newLogPulseDark-b403c421{0%{background:linear-gradient(90deg,#18a05833 0%,#18a05814 100%);box-shadow:0 0 10px #18a05840}5%{background:linear-gradient(90deg,#18a0583d 0%,#18a0581a 100%);box-shadow:0 0 14px 2px #18a0584d}15%{background:linear-gradient(90deg,#18a05836 0%,#18a05817 100%);box-shadow:0 0 12px 1px #18a05840}30%{background:linear-gradient(90deg,#18a05829 0%,#18a05812 100%);box-shadow:0 0 8px 1px #18a0582e}50%{background:linear-gradient(90deg,#18a0581c 0%,#18a0580b 100%);box-shadow:0 0 5px #18a0581f}70%{background:linear-gradient(90deg,#18a0580f 0%,#18a05806 100%);box-shadow:0 0 3px #18a05814}85%{background:linear-gradient(90deg,#18a05808 0%,#18a05803 100%);box-shadow:0 0 1px #18a0580a}to{background:0 0;border-left-color:#0000;box-shadow:0 0 #18a05800}}.table-row-content[data-v-b403c421]{width:100%;display:flex}.action-row[data-v-b403c421]{color:#166534;background:#f0fdf4;border-bottom:1px solid #f3f4f6;border-left:3px solid #18a058;align-items:center;padding:10px 12px;font-size:13px;display:flex}[data-theme=dark] .action-row[data-v-b403c421]{color:#4ade80;background:#18a0581f;border-bottom:1px solid #ffffff0a}.error-row[data-v-b403c421]{color:#b42318;background:#fef2f2;border-bottom:1px solid #f3f4f6;border-left:3px solid #d03050;align-items:center;padding:10px 12px;font-size:13px;display:flex}[data-theme=dark] .error-row[data-v-b403c421]{color:#fda4af;background:#d030501f;border-bottom:1px solid #ffffff0a}.action-message[data-v-b403c421]{flex:1;font-weight:500}.action-time[data-v-b403c421]{color:#6b7280;margin-left:12px;margin-right:22px;font-family:monospace;font-size:11px}[data-theme=dark] .action-time[data-v-b403c421]{color:var(--text-tertiary)}.col[data-v-b403c421]{white-space:nowrap;text-overflow:ellipsis;align-items:center;display:flex;overflow:hidden}.col-channel-claude[data-v-b403c421]{flex:80px;min-width:0;overflow:hidden}.col-token-claude[data-v-b403c421]{flex:0 0 68px;justify-content:center;min-width:0}.col-time-claude[data-v-b403c421]{flex:0 0 85px;justify-content:flex-end;min-width:85px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-codex[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-codex[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-codex[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-gemini[data-v-b403c421]{flex:80px;min-width:0;overflow:hidden}.col-token-gemini[data-v-b403c421]{flex:0 0 68px;justify-content:center;min-width:0}.col-time-gemini[data-v-b403c421]{flex:0 0 85px;justify-content:flex-end;min-width:85px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-opencode[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-opencode[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-opencode[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-omp[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-omp[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-omp[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel[data-v-b403c421]{min-width:0;overflow:hidden}.col-channel .n-tag[data-v-b403c421]{text-overflow:ellipsis;max-width:100%;overflow:hidden}.col-token[data-v-b403c421]{justify-content:center;min-width:0}.col-time[data-v-b403c421]{justify-content:flex-end;font-family:monospace;font-size:11px}.empty-state[data-v-b403c421]{text-align:center;color:#9ca3af;padding:40px 16px;font-size:13px}[data-theme=dark] .empty-state[data-v-b403c421]{color:var(--text-tertiary)}.logs-footer[data-v-b403c421]{color:#6b7280;border-top:1px solid #e5e7eb;justify-content:space-between;align-items:center;padding:8px 16px;font-size:12px;display:flex}[data-theme=dark] .logs-footer[data-v-b403c421]{border-top:1px solid var(--border-primary);color:var(--text-tertiary)}.status[data-v-b403c421]{color:#ef4444;align-items:center;gap:4px;display:flex}.status.connected[data-v-b403c421]{color:#10b981}[data-theme=dark] .status.connected[data-v-b403c421]{color:#4ade80}.count[data-v-b403c421]{color:#6b7280}[data-theme=dark] .count[data-v-b403c421]{color:var(--text-tertiary)}@media (width<=1024px){.logs-header[data-v-b403c421]{padding:10px 12px}.header-left[data-v-b403c421]{gap:8px}.title[data-v-b403c421]{font-size:13px}.today-stats[data-v-b403c421] .n-tag{padding:1px 6px;font-size:10px}.table-header[data-v-b403c421]{padding:6px 10px;font-size:10px}.table-row[data-v-b403c421]{padding:6px 10px}.logs-footer[data-v-b403c421]{padding:6px 12px;font-size:11px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421]{flex:0 0 75px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421]{flex:0 0 55px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421]{flex:0 0 80px;min-width:80px}.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 65px}.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 48px}.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 75px;min-width:75px}}@media (width<=768px){.logs-header[data-v-b403c421]{flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px}.header-left[data-v-b403c421]{justify-content:space-between}.title[data-v-b403c421]{font-size:12px}.today-stats[data-v-b403c421] .n-tag{padding:1px 4px;font-size:9px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:4px 8px;font-size:10px}.table-row-content[data-v-b403c421]{font-size:10px}.action-row[data-v-b403c421]{padding:8px 10px;font-size:11px}.action-message[data-v-b403c421]{font-size:11px}.action-time[data-v-b403c421]{margin-right:12px;font-size:9px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 60px}.col-channel[data-v-b403c421] .n-tag{height:18px;padding:0 4px;font-size:9px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 40px;font-size:9px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 65px;min-width:65px;font-size:9px}.logs-footer[data-v-b403c421]{padding:4px 10px;font-size:10px}}@media (width<=640px){.logs-header[data-v-b403c421]{gap:6px;padding:6px 8px}.header-left[data-v-b403c421]{flex-wrap:wrap;gap:4px}.title[data-v-b403c421]{font-size:11px}.today-stats[data-v-b403c421]{gap:4px}.today-stats[data-v-b403c421] .n-tag{height:16px;padding:0 3px;font-size:8px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:3px 6px;font-size:9px}.table-row-content[data-v-b403c421]{font-size:9px}.action-row[data-v-b403c421]{padding:6px 8px;font-size:10px}.action-message[data-v-b403c421]{font-size:10px}.action-time[data-v-b403c421]{margin-left:8px;margin-right:8px;font-size:8px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 50px}.col-channel[data-v-b403c421] .n-tag{height:16px;padding:0 3px;font-size:8px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 32px;font-size:8px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 55px;min-width:55px;font-size:8px}.logs-footer[data-v-b403c421]{padding:3px 8px;font-size:9px}.status[data-v-b403c421],.count[data-v-b403c421]{font-size:9px}}@media (width<=480px){.logs-header[data-v-b403c421]{padding:4px 6px}.title[data-v-b403c421]{font-size:10px}.today-stats[data-v-b403c421] .n-tag{height:14px;font-size:7px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:2px 4px;font-size:8px}.action-row[data-v-b403c421]{padding:4px 6px;font-size:9px}.action-row[data-v-b403c421] .n-icon{margin-right:4px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 45px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 28px;font-size:7px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 48px;min-width:48px;font-size:7px}.logs-footer[data-v-b403c421]{padding:2px 6px;font-size:8px}}.right-panel[data-v-8cdfe9a9]{background:var(--bg-primary);border-left:1px solid var(--border-primary);flex-direction:column;width:480px;min-width:480px;height:100%;display:flex}.toolbar-section[data-v-8cdfe9a9]{background:var(--bg-secondary);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;padding:10px 14px;display:flex}.toolbar-left[data-v-8cdfe9a9]{align-items:center;gap:8px;display:flex}.toolbar-label[data-v-8cdfe9a9]{margin-right:2px;font-size:12px}.toolbar-right[data-v-8cdfe9a9]{align-items:center;gap:2px;display:flex}.toolbar-btn[data-v-8cdfe9a9]{--toolbar-button-text:var(--text-secondary);border-radius:4px;transition:transform .18s cubic-bezier(.4,0,.2,1);--n-text-color:var(--toolbar-button-text)!important;--n-text-color-hover:var(--toolbar-button-text)!important;--n-text-color-pressed:var(--toolbar-button-text)!important;--n-text-color-focus:var(--toolbar-button-text)!important;--n-color-hover:transparent!important;--n-color-pressed:transparent!important;--n-color-focus:transparent!important;color:var(--toolbar-button-text)!important;padding:5px!important}.toolbar-btn[data-v-8cdfe9a9] .n-button__content,.toolbar-btn[data-v-8cdfe9a9] .n-button__icon{color:var(--toolbar-button-text)!important}.toolbar-btn[data-v-8cdfe9a9]:hover,.toolbar-btn[data-v-8cdfe9a9]:focus,.toolbar-btn[data-v-8cdfe9a9]:focus-visible,.toolbar-btn[data-v-8cdfe9a9]:active{background:0 0;transform:translateY(-1px);color:var(--toolbar-button-text)!important}.toolbar-btn[data-v-8cdfe9a9]:active{transform:translateY(0)}.toolbar-divider[data-v-8cdfe9a9]{background:var(--border-primary);width:1px;height:16px;margin:0 4px}.oauth-banner[data-v-8cdfe9a9]{color:#2080f0;background:#2080f014;border-bottom:1px solid #2080f033;flex-shrink:0;align-items:center;gap:6px;padding:6px 14px;font-size:12px;display:flex}.oauth-banner span[data-v-8cdfe9a9]{flex:1}.channels-section[data-v-8cdfe9a9]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.channels-section.full-height[data-v-8cdfe9a9]{flex:1}.panel-header[data-v-8cdfe9a9]{background:var(--bg-secondary);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.header-title[data-v-8cdfe9a9]{align-items:baseline;gap:8px;min-width:0;display:flex}.header-title h3[data-v-8cdfe9a9]{color:var(--text-primary);margin:0;font-size:13px;font-weight:600}.header-hint[data-v-8cdfe9a9]{font-size:11px}.header-actions[data-v-8cdfe9a9]{flex-shrink:0;align-items:center;gap:8px;display:flex}.channels-scroll-area[data-v-8cdfe9a9]{flex:1;min-height:0;padding:12px;overflow-y:auto}.logs-section[data-v-8cdfe9a9]{flex:0 0 340px;min-height:340px;max-height:340px;overflow:hidden}.logs-section.full-height[data-v-8cdfe9a9]{flex:1;min-height:0;max-height:none}@media (width<=1024px){.right-panel[data-v-8cdfe9a9]{width:420px;min-width:420px}.logs-section[data-v-8cdfe9a9]{flex:0 0 300px;min-height:300px;max-height:300px}}@media (width<=768px){.right-panel[data-v-8cdfe9a9]{width:100%;min-width:100%}.toolbar-section[data-v-8cdfe9a9]{padding:8px 12px}.toolbar-label[data-v-8cdfe9a9]{font-size:11px}.logs-section[data-v-8cdfe9a9]{flex:0 0 260px;min-height:260px;max-height:260px}}@media (height<=600px){.right-panel[data-v-8cdfe9a9]{overflow-y:auto}.channels-section[data-v-8cdfe9a9]{flex:0 0 360px;min-height:360px}.logs-section[data-v-8cdfe9a9]{flex:0 0 260px}}.layout[data-v-1b46cda2]{background:var(--bg-primary);flex-direction:column;height:100vh;display:flex}.header[data-v-1b46cda2]{background:var(--gradient-header);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;height:74px;padding:10px 22px;display:flex;box-shadow:inset 0 1px #ffffff57}.header-actions[data-v-1b46cda2]{background:color-mix(in srgb, var(--bg-primary) 82%, transparent);border:1px solid var(--border-primary);border-radius:999px;align-items:center;gap:8px;padding:6px 10px;display:flex;box-shadow:0 14px 34px #0f171d14}.more-menu-trigger[data-v-1b46cda2]{display:flex}.header-divider[data-v-1b46cda2]{background:#95a7af59;width:1px;height:24px;margin:0 2px}.env-warning-btn[data-v-1b46cda2]{cursor:pointer;background:#f59e0b1a;border-radius:4px;align-items:center;gap:4px;padding:4px 8px;transition:background .2s;display:flex}.env-warning-btn[data-v-1b46cda2]:hover{background:#f59e0b2e}.env-warning-icon[data-v-1b46cda2]{color:#f59e0b}.env-warning-count[data-v-1b46cda2]{color:#f59e0b;font-size:11px;font-weight:600}.logo-section[data-v-1b46cda2]{cursor:pointer;color:inherit;border-radius:18px;align-items:center;gap:14px;margin-left:-8px;padding:8px 14px;text-decoration:none;transition:background .2s;display:flex}.logo-section[data-v-1b46cda2]:hover{background:var(--hover-bg)}.logo-wrapper[data-v-1b46cda2]{background:linear-gradient(135deg,#18a0582e,#18a0580d);border-radius:14px;justify-content:center;align-items:center;width:40px;height:40px;display:flex;box-shadow:0 10px 24px #0f171d14}.logo-image[data-v-1b46cda2]{object-fit:contain;width:22px;height:22px}.title-group[data-v-1b46cda2]{flex-direction:column;gap:1px;display:flex}.title-main[data-v-1b46cda2]{color:var(--brand-title-color);margin:0;font-size:18px;font-weight:700;line-height:1.2}.title-sub[data-v-1b46cda2]{color:var(--text-tertiary);font-size:11px}.nav-tabs[data-v-1b46cda2]{background:color-mix(in srgb, var(--bg-primary) 86%, transparent);border:1px solid var(--border-primary);border-radius:999px;align-items:center;gap:6px;margin-left:28px;padding:6px 8px;display:flex;box-shadow:0 14px 36px #0f171d14}.nav-tab[data-v-1b46cda2]{cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:8px 14px;transition:background .2s;display:flex;position:relative}.nav-tab[data-v-1b46cda2]:hover{background:var(--hover-bg)}.nav-tab.active[data-v-1b46cda2]{background:var(--primary-color-soft)}.nav-tab.active[data-v-1b46cda2]:after{content:"";border-radius:inherit;background:0 0;border:1px solid #18a05838;position:absolute;inset:0}.nav-icon[data-v-1b46cda2]{color:var(--text-tertiary)}.nav-tab:hover .nav-icon[data-v-1b46cda2],.nav-tab.active .nav-icon[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.nav-label[data-v-1b46cda2]{color:var(--text-secondary);font-size:13px;font-weight:500}.nav-tab:hover .nav-label[data-v-1b46cda2],.nav-tab.active .nav-label[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.nav-tab.active .nav-label[data-v-1b46cda2]{font-weight:600}.main-container[data-v-1b46cda2]{flex:1;height:calc(100vh - 74px);min-height:0;display:flex;overflow:hidden}.global-loading-overlay[data-v-1b46cda2]{background:var(--bg-overlay);z-index:1000;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.left-content[data-v-1b46cda2]{flex:1;min-width:0;height:100%;overflow:hidden}.favorites-button-wrapper[data-v-1b46cda2]{position:relative}.favorites-badge[data-v-1b46cda2]{color:#fff;pointer-events:none;background:#ff4d4f;border-radius:7px;justify-content:center;align-items:center;min-width:14px;height:14px;padding:0 3px;font-size:9px;font-weight:600;display:flex;position:absolute;top:-3px;right:-3px}.help-content[data-v-1b46cda2]{max-height:70vh;overflow-y:auto}.help-section[data-v-1b46cda2]{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:8px;margin-bottom:20px;padding:16px}.help-section[data-v-1b46cda2]:last-child{margin-bottom:0}.help-section h4[data-v-1b46cda2]{color:var(--text-primary);border-bottom:1px solid var(--border-primary);margin:0 0 12px;padding-bottom:10px;font-size:15px;font-weight:600}.help-section p[data-v-1b46cda2]{color:var(--text-secondary);margin:0 0 10px;font-size:13px;line-height:1.7}.help-section ul[data-v-1b46cda2]{margin:8px 0 0;padding-left:20px}.help-section li[data-v-1b46cda2]{color:var(--text-secondary);margin-bottom:4px;font-size:13px;line-height:1.8}.help-section li strong[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.command-list[data-v-1b46cda2]{flex-direction:column;gap:8px;display:flex}.command-item[data-v-1b46cda2]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:6px;align-items:center;gap:12px;padding:10px 12px;display:flex}.command-item code[data-v-1b46cda2]{min-width:140px;color:var(--primary-color,#18a058);background:#18a0581a;border-radius:4px;padding:4px 10px;font-family:monospace;font-size:12px;font-weight:600}.command-item span[data-v-1b46cda2]{color:var(--text-secondary);font-size:13px}.help-section kbd[data-v-1b46cda2]{color:var(--text-primary);background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:3px;margin:0 2px;padding:2px 6px;font-family:monospace;font-size:11px;font-weight:600;display:inline-block}.link-list[data-v-1b46cda2]{flex-wrap:wrap;gap:12px;display:flex}.link-list a[data-v-1b46cda2]{color:var(--primary-color,#18a058);background:#18a05814;border-radius:4px;padding:6px 10px;font-size:13px;text-decoration:none}.link-list a[data-v-1b46cda2]:hover{background:#18a05826}.panel-security-auth[data-v-1b46cda2]{flex-direction:column;gap:12px;display:flex}.panel-security-error[data-v-1b46cda2]{color:#d03050;font-size:12px}.panel-security-hint[data-v-1b46cda2]{font-size:12px;line-height:1.6}.header-actions[data-v-1b46cda2],.nav-tabs[data-v-1b46cda2]{-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}[data-theme=dark] .header[data-v-1b46cda2]{border-bottom-color:#2b424aeb;box-shadow:inset 0 -1px #ffffff08}[data-theme=dark] .header-actions[data-v-1b46cda2],[data-theme=dark] .nav-tabs[data-v-1b46cda2]{background:#0c151bdb;border-color:#364c56e6;box-shadow:0 14px 32px #00000042}[data-theme=dark] .logo-section[data-v-1b46cda2]:hover{background:#ffffff0d}@media (width<=1024px){.header[data-v-1b46cda2]{height:68px;padding:10px 16px}.main-container[data-v-1b46cda2]{height:calc(100vh - 68px)}.nav-tabs[data-v-1b46cda2]{margin-left:16px;padding:5px 6px}.title-sub[data-v-1b46cda2]{display:none}}@media (width<=768px){.header[data-v-1b46cda2]{height:60px;padding:8px 12px}.main-container[data-v-1b46cda2]{height:calc(100vh - 60px)}.logo-wrapper[data-v-1b46cda2]{width:28px;height:28px}.logo-image[data-v-1b46cda2]{width:18px;height:18px}.title-main[data-v-1b46cda2]{font-size:14px}.title-sub[data-v-1b46cda2]{display:none}.nav-tabs[data-v-1b46cda2]{gap:2px;margin-left:10px;padding:4px 5px}.nav-tab[data-v-1b46cda2]{gap:4px;padding:6px 10px}.nav-label[data-v-1b46cda2]{font-size:12px}.header-actions[data-v-1b46cda2]{gap:2px}}@media (width<=640px){.header[data-v-1b46cda2]{height:54px;padding:6px 8px}.main-container[data-v-1b46cda2]{height:calc(100vh - 54px)}.title-group[data-v-1b46cda2]{display:none}.nav-tabs[data-v-1b46cda2]{flex:1;justify-content:center;margin-left:8px}.nav-tab[data-v-1b46cda2]{flex-direction:column;gap:2px;padding:4px 6px}.nav-label[data-v-1b46cda2]{font-size:10px}}.asset-panel{background:var(--bg-primary);flex-direction:column;flex:1;height:100%;min-height:0;display:flex}.asset-panel-header,.asset-drawer-toolbar{border-bottom:1px solid var(--border-primary);background:var(--bg-primary);justify-content:space-between;align-items:center;gap:16px;padding:14px 18px;display:flex}.asset-drawer-toolbar{background:var(--bg-secondary);justify-content:flex-end;padding:10px 12px}.asset-title-group,.asset-title-row,.asset-action-row,.asset-filter-bar,.asset-summary,.asset-meta,.asset-tags,.asset-card-actions{align-items:center;display:flex}.asset-title-group{gap:10px;min-width:0}.asset-heading{min-width:0}.asset-title-row{gap:8px;min-width:0}.asset-title{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:650;line-height:1.25;overflow:hidden}.asset-subtitle{color:var(--text-tertiary);margin-top:3px;font-size:12px;line-height:1.35}.asset-platform-pill{border:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-tertiary);border-radius:999px;flex-shrink:0;padding:2px 7px;font-size:11px;font-weight:500;line-height:1.4}.asset-action-row{flex-shrink:0;gap:6px}.asset-action-row .n-button{font-size:12px}.asset-summary{border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);gap:8px;padding:10px 18px}.asset-panel.in-drawer .asset-summary{padding:10px 12px}.asset-summary-item{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:999px;align-items:baseline;gap:6px;min-width:0;padding:4px 8px;display:inline-flex}.asset-summary-label{color:var(--text-tertiary);font-size:11px}.asset-summary-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:12px;font-weight:650}.asset-filter-bar{border-bottom:1px solid var(--border-primary);background:var(--bg-primary);gap:10px;padding:12px 18px}.asset-panel.in-drawer .asset-filter-bar{padding:10px 12px}.asset-search{flex:1;min-width:160px}.asset-filter{flex-shrink:0;width:116px}.asset-panel-content{flex:1;min-height:0;padding:16px 18px;overflow-y:auto}.asset-panel.in-drawer .asset-panel-content{padding:12px}.asset-panel-content .n-spin-container{min-height:220px}.asset-empty{justify-content:center;align-items:center;min-height:220px;display:flex}.asset-list{flex-direction:column;gap:10px;display:flex}.asset-footer{border-top:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-tertiary);align-items:center;gap:6px;padding:9px 18px;font-size:11px;display:flex}.asset-panel.in-drawer .asset-footer{padding:8px 12px}.asset-info-icon{color:var(--text-quaternary)}.asset-card{border:1px solid var(--border-primary);background:var(--bg-primary);cursor:pointer;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:14px;min-height:96px;padding:14px;transition:border-color .16s ease-out,background-color .16s ease-out,box-shadow .16s ease-out;display:flex}.asset-card:hover{border-color:var(--border-secondary);background:var(--bg-secondary);box-shadow:var(--shadow-sm)}.asset-card.is-installed,.asset-card.is-managed,.asset-card.is-project{background:linear-gradient(0deg, oklch(62% .15 151/.045), oklch(62% .15 151/.045)), var(--bg-primary)}.asset-card.is-disabled,.asset-card.is-protected{background:var(--bg-secondary)}.asset-card-main{flex:1;min-width:0}.asset-card-top{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.asset-card-title-stack{min-width:0}.asset-card-title-row{align-items:center;gap:7px;min-width:0;display:flex}.asset-status-dot{background:var(--text-quaternary);border-radius:999px;flex:none;width:7px;height:7px}.asset-status-dot.active{background:var(--primary-color);box-shadow:0 0 0 3px oklch(62% .15 151/.1)}.asset-status-dot.warning{background:oklch(68% .14 78);box-shadow:0 0 0 3px oklch(68% .14 78/.1)}.asset-name{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:650;line-height:1.35;overflow:hidden}.asset-name.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-tags{flex-wrap:wrap;gap:5px;margin-top:6px}.asset-description{color:var(--text-secondary);text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-top:9px;font-size:12px;line-height:1.5;display:-webkit-box;overflow:hidden}.asset-meta{color:var(--text-tertiary);flex-wrap:wrap;gap:8px;margin-top:9px;font-size:11px}.asset-meta-item{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:4px;min-width:0;max-width:100%;display:inline-flex;overflow:hidden}.asset-meta-item.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-link{color:var(--primary-color);flex-shrink:0;text-decoration:none}.asset-link:hover{text-decoration:underline}.asset-card-actions{flex-shrink:0;gap:5px}.asset-platform-strip{align-items:center;gap:5px;margin-left:6px;display:flex}.asset-platform-icon{border:1px solid var(--border-primary);background:var(--bg-secondary);width:24px;height:24px;color:var(--text-tertiary);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;transition:border-color .16s ease-out,color .16s ease-out,background-color .16s ease-out;display:inline-flex}.asset-platform-icon:hover{border-color:var(--border-secondary);color:var(--text-secondary)}.asset-platform-icon.active{color:var(--primary-color);background:oklch(62% .15 151/.1);border-color:oklch(62% .15 151/.34)}.asset-detail-drawer-header{width:100%}.asset-detail-identity{align-items:center;gap:12px;min-width:0;display:flex}.asset-detail-icon{color:var(--primary-color);flex-shrink:0}.asset-detail-heading{flex-direction:column;gap:4px;min-width:0;display:flex}.asset-detail-name{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:650;line-height:1.25;overflow:hidden}.asset-detail-name.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-detail-meta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.asset-detail-subtle{min-width:0;color:var(--text-tertiary);align-items:center;gap:4px;font-size:12px;display:inline-flex}.asset-detail-body{flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.asset-detail-container{flex-direction:column;gap:22px;min-height:0;display:flex}.asset-detail-info-section{flex-direction:column;gap:10px;display:flex}.asset-detail-section-title{color:var(--text-primary);margin:0;font-size:14px;font-weight:650}.asset-detail-description{color:var(--text-secondary);margin:0;font-size:13px;line-height:1.65}.asset-detail-list{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;overflow:hidden}.asset-detail-row{border-bottom:1px solid var(--border-primary);grid-template-columns:104px minmax(0,1fr);gap:12px;padding:10px 12px;font-size:13px;display:grid}.asset-detail-row:last-child{border-bottom:0}.asset-detail-label{color:var(--text-tertiary)}.asset-detail-value{overflow-wrap:anywhere;min-width:0;color:var(--text-secondary)}.asset-detail-value.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace);font-size:12px}.asset-detail-box{border:1px solid var(--border-primary);background:var(--bg-secondary);min-width:0;color:var(--text-secondary);border-radius:8px;align-items:center;gap:8px;padding:12px;font-size:13px;display:flex}.asset-detail-box code,.asset-detail-code{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-detail-box code{overflow-wrap:anywhere;color:var(--text-secondary);font-size:12px}.asset-detail-path-box{align-items:flex-start}.asset-detail-path-icon{flex:none;margin-top:1px}.asset-detail-path-text{flex:1;min-width:0;line-height:1.5}.asset-detail-path-copy{color:var(--text-tertiary);flex:none;margin:-4px -4px -4px 4px}.asset-detail-path-copy:hover{color:var(--text-primary)}.asset-detail-link{overflow-wrap:anywhere;min-width:0;color:var(--primary-color);text-decoration:none}.asset-detail-link:hover{text-decoration:underline}.asset-detail-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.asset-detail-content{border:1px solid var(--border-primary);background:var(--bg-secondary);min-height:0;color:var(--text-secondary);overflow-wrap:anywhere;border-radius:8px;flex:1;padding:18px;font-size:13px;line-height:1.7;overflow:auto}.asset-detail-content h1,.asset-detail-content h2,.asset-detail-content h3,.asset-detail-content h4,.asset-detail-content h5,.asset-detail-content h6{color:var(--text-primary);margin:22px 0 10px;font-weight:650;line-height:1.35}.asset-detail-content h1:first-child,.asset-detail-content h2:first-child,.asset-detail-content h3:first-child{margin-top:0}.asset-detail-content h1{border-bottom:1px solid var(--border-primary);padding-bottom:10px;font-size:20px}.asset-detail-content h2{border-bottom:1px solid var(--border-primary);padding-bottom:7px;font-size:17px}.asset-detail-content h3{font-size:15px}.asset-detail-content h4{font-size:14px}.asset-detail-content h5,.asset-detail-content h6{color:var(--text-secondary);font-size:13px}.asset-detail-content p{margin:10px 0}.asset-detail-content strong{color:var(--text-primary);font-weight:650}.asset-detail-content code{border:1px solid var(--border-primary);background:var(--bg-tertiary);font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace);border-radius:5px;padding:2px 6px;font-size:12px}.asset-detail-content pre{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;margin:14px 0;padding:14px;line-height:1.65;overflow-x:auto}.asset-detail-content pre code{color:var(--text-secondary);background:0 0;border:0;padding:0;font-size:12px}.asset-detail-content ul,.asset-detail-content ol{margin:10px 0;padding-left:24px}.asset-detail-content li{margin:5px 0}.asset-detail-content li>p{margin:6px 0}.asset-detail-content a{color:var(--primary-color);text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.asset-detail-content a:hover{color:var(--primary-color-hover,var(--primary-color))}.asset-detail-content blockquote{border-left:1px solid var(--border-secondary);background:var(--bg-primary);color:var(--text-tertiary);border-radius:0 8px 8px 0;margin:14px 0;padding:10px 12px}.asset-detail-content blockquote>:first-child{margin-top:0}.asset-detail-content blockquote>:last-child{margin-bottom:0}.asset-detail-content table{border-collapse:collapse;width:max-content;max-width:100%;margin:14px 0;font-size:12px;display:block;overflow-x:auto}.asset-detail-content th,.asset-detail-content td{border:1px solid var(--border-primary);text-align:left;vertical-align:top;padding:8px 10px}.asset-detail-content th{background:var(--bg-tertiary);color:var(--text-primary);font-weight:650}.asset-detail-content img{border-radius:8px;max-width:100%;height:auto;margin:14px auto;display:block}.asset-detail-content hr{background:var(--border-primary);border:0;height:1px;margin:20px 0}.asset-detail-code{border:1px solid var(--border-primary);background:var(--bg-secondary);min-height:0;color:var(--text-secondary);white-space:pre-wrap;word-break:break-word;border-radius:8px;flex:1;margin:0;padding:16px;font-size:12px;line-height:1.65;overflow:auto}.asset-detail-loading,.asset-detail-empty,.asset-detail-error{color:var(--text-tertiary);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:16px;padding:64px 24px;display:flex}.asset-detail-empty-icon,.asset-detail-error-icon{color:var(--text-quaternary)}.asset-detail-error-icon{color:oklch(56% .18 26)}.asset-detail-tabs{flex:1;height:100%;min-height:0}.asset-detail-tabs .n-tabs-pane-wrapper{flex:1;min-height:0;padding-top:16px;overflow:hidden}.asset-detail-tabs .n-tab-pane{flex-direction:column;height:100%;min-height:0;display:flex;overflow:auto}@media (width<=720px){.asset-panel-header{flex-direction:column;align-items:flex-start}.asset-action-row,.asset-filter-bar,.asset-card-top{width:100%}.asset-action-row,.asset-summary{flex-wrap:wrap}.asset-filter-bar{flex-direction:column;align-items:stretch}.asset-filter{width:100%}.asset-card{flex-direction:column}.asset-card-actions{flex-wrap:wrap;align-self:flex-start}}:root{--bg-primary:#fff;--bg-secondary:#f4f7f8;--bg-tertiary:#edf3f1;--bg-elevated:#fff;--bg-overlay:#ffffffeb;--text-primary:#122025;--text-secondary:#58717d;--text-tertiary:#738995;--text-quaternary:#95a7af;--border-primary:#d8e1de;--border-secondary:#c3d0cb;--hover-bg:#18a05814;--active-bg:#18a0581f;--shadow-sm:0 8px 20px #0f171d0f;--shadow-md:0 18px 42px #0f171d1a;--shadow-lg:0 30px 70px #0f171d24;--font-mono:"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace;--gradient-header:linear-gradient(135deg, #f8fbfc 0%, #eef6f3 52%, #e9f7f1 100%);--gradient-bg:linear-gradient(180deg, #f4f7f8 0%, #eef4f2 100%);--gradient-card:linear-gradient(145deg, #fffffffa 0%, #f7faf8fa 100%);--primary-color:#18a058;--primary-color-soft:#18a0581f;--brand-title-color:#0d8f55}[data-theme=dark]{--bg-primary:#0a1116;--bg-secondary:#101920;--bg-tertiary:#16222a;--bg-elevated:#1a2831;--bg-overlay:#0a1116f0;--text-primary:#e7eef0;--text-secondary:#a8bbc0;--text-tertiary:#82969d;--text-quaternary:#667b83;--border-primary:#263740;--border-secondary:#334852;--hover-bg:#ffffff14;--active-bg:#ffffff1f;--shadow-sm:0 10px 24px #0000003d;--shadow-md:0 22px 52px #0000004d;--shadow-lg:0 36px 76px #0000005c;--font-mono:"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace;--gradient-header:linear-gradient(135deg, #0b1419 0%, #101b22 58%, #0d171d 100%);--gradient-bg:linear-gradient(180deg, #0a1116 0%, #0d151b 56%, #091016 100%);--gradient-card:linear-gradient(145deg, #121b22fa 0%, #0c151bfa 100%);--primary-color:#18a058;--primary-color-soft:#18a05829;--brand-title-color:#37d08c}body{background:var(--bg-primary);color:var(--text-primary);margin:0;padding:0;font-family:SF Pro Display,SF Pro Text,Segoe UI Variable Display,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;transition:background-color .3s,color .3s}#app{background:var(--bg-primary);min-height:100vh}*{scrollbar-width:thin;scrollbar-color:#18a05847 transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:#18a05847;border-radius:3px;transition:background-color .2s}::-webkit-scrollbar-thumb:hover{background-color:#18a05880}[data-theme=dark] ::-webkit-scrollbar-thumb{background-color:#18a05866}[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background-color:#18a05899}
|
|
1
|
+
.header-button[data-v-b515354d]{border:1px solid var(--border-primary);background:var(--bg-elevated);cursor:pointer;border-radius:999px;outline:none;justify-content:center;align-items:center;width:40px;height:40px;padding:0;transition:all .2s;display:inline-flex;box-shadow:0 10px 24px #0f171d14}.header-button[data-v-b515354d] .n-icon{color:var(--text-tertiary);transition:all .2s}.header-button[data-v-b515354d]:hover:not(.disabled){background:color-mix(in srgb, var(--bg-elevated) 90%, var(--primary-color) 10%);border-color:#18a0583d;box-shadow:0 14px 30px #0f171d1f}.header-button[data-v-b515354d]:hover:not(.disabled) .n-icon{color:var(--primary-color,#18a058)}.header-button[data-v-b515354d]:active:not(.disabled){transform:scale(.95)}.header-button.active[data-v-b515354d]{background:linear-gradient(135deg,#18a05824,#18a0580f);border-color:#18a05852}.header-button.active[data-v-b515354d] .n-icon{color:#18a058!important}.header-button.disabled[data-v-b515354d]{cursor:not-allowed;opacity:.5}[data-theme=dark] .header-button[data-v-b515354d]{box-shadow:none;background:#0d171eeb;border-color:#364c56e6}[data-theme=dark] .header-button[data-v-b515354d]:hover:not(.disabled){background:#14222afa;border-color:#18a05847;box-shadow:0 0 0 1px #18a05814}.modal-header[data-v-7ea71ef7]{align-items:center;gap:10px;display:flex}.warning-icon[data-v-7ea71ef7]{color:#f59e0b}.header-title[data-v-7ea71ef7]{color:var(--text-primary);font-size:16px;font-weight:600}.modal-content[data-v-7ea71ef7]{padding:4px 0}.desc-text[data-v-7ea71ef7]{color:var(--text-secondary);margin:0 0 16px;font-size:13px;line-height:1.6}.conflict-list[data-v-7ea71ef7]{background:var(--bg-tertiary);border-radius:6px;padding:12px}.list-header[data-v-7ea71ef7]{border-bottom:1px solid var(--border-primary);align-items:center;gap:12px;margin-bottom:10px;padding-bottom:10px;display:flex}.selected-hint[data-v-7ea71ef7]{color:var(--text-tertiary);font-size:12px}.conflict-items[data-v-7ea71ef7]{flex-direction:column;gap:8px;display:flex}.conflict-item[data-v-7ea71ef7]{background:var(--bg-secondary);cursor:pointer;border:1px solid #0000;border-radius:6px;align-items:flex-start;gap:10px;padding:10px 12px;transition:all .15s;display:flex}.conflict-item[data-v-7ea71ef7]:hover{background:#18a05805;border-color:#18a05866}.conflict-item.selected[data-v-7ea71ef7]{background:#18a0580f;border-color:#18a058}.item-content[data-v-7ea71ef7]{flex:1;min-width:0}.item-header[data-v-7ea71ef7]{align-items:center;gap:8px;margin-bottom:4px;display:flex}.var-name[data-v-7ea71ef7]{color:var(--text-primary);background:var(--bg-tertiary);border-radius:4px;padding:2px 6px;font-size:13px;font-weight:600}.var-value[data-v-7ea71ef7]{color:var(--text-secondary);word-break:break-all;margin-bottom:4px;font-family:SF Mono,Monaco,monospace;font-size:12px}.var-source[data-v-7ea71ef7]{color:var(--text-tertiary);font-size:11px}.source-label[data-v-7ea71ef7]{color:var(--text-quaternary)}.modal-footer[data-v-7ea71ef7]{justify-content:flex-end;gap:8px;display:flex}.process-env-alert[data-v-7ea71ef7]{margin-bottom:16px}.alert-content[data-v-7ea71ef7]{font-size:12px;line-height:1.6}.alert-title[data-v-7ea71ef7]{margin:0 0 8px;font-weight:500}.alert-list[data-v-7ea71ef7]{margin:0;padding-left:20px}.alert-list li[data-v-7ea71ef7]{margin:4px 0}.alert-list code[data-v-7ea71ef7]{background:var(--bg-tertiary);color:#18a058;border-radius:4px;padding:2px 6px;font-family:SF Mono,Monaco,monospace;font-size:11px}.alert-hint[data-v-7ea71ef7]{color:var(--text-tertiary);margin:8px 0 0;font-size:11px}.channel-card[data-v-88bb1df0]{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;transition:all .2s}.channel-card[data-v-88bb1df0]:hover{border-color:var(--border-secondary)}.channel-header[data-v-88bb1df0]{border-bottom:1px solid var(--border-primary);justify-content:space-between;align-items:center;gap:8px;padding:12px 16px;display:flex}.channel-title[data-v-88bb1df0]{flex:auto;align-items:center;gap:6px;min-width:0;margin-right:0;display:flex}.channel-name[data-v-88bb1df0]{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.channel-title[data-v-88bb1df0] .n-tag{flex-shrink:0;padding:0 5px;font-size:11px}.collapse-btn[data-v-88bb1df0]{flex-shrink:0}.collapse-btn .n-icon.collapsed[data-v-88bb1df0]{transform:rotate(-90deg)}.channel-actions[data-v-88bb1df0]{flex-wrap:nowrap;flex:none;justify-content:flex-end;align-items:center;gap:4px;max-width:100%;margin-left:auto;display:flex}.channel-actions[data-v-88bb1df0] .n-button{min-width:0;height:22px;padding:0 5px;font-size:11px}.channel-actions[data-v-88bb1df0] .n-button__content{gap:2px}.channel-actions[data-v-88bb1df0] .n-button__icon{margin:0}.apply-btn[data-v-88bb1df0]{display:none}.channel-card:hover .apply-btn[data-v-88bb1df0]{display:inline-flex}.test-result[data-v-88bb1df0]{border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);padding:10px 16px}.test-result.success[data-v-88bb1df0]{background:#18a0580f;border-left:3px solid #18a058}.test-result.failed[data-v-88bb1df0]{background:#f56c6c0f;border-left:3px solid #f56c6c}.test-result-header[data-v-88bb1df0]{align-items:center;gap:12px;display:flex}.test-result-status[data-v-88bb1df0]{align-items:center;gap:6px;font-size:13px;font-weight:500;display:flex}.test-result.success .test-result-status[data-v-88bb1df0]{color:#18a058}.test-result.failed .test-result-status[data-v-88bb1df0]{color:#f56c6c}.test-result-info[data-v-88bb1df0]{flex:1;align-items:center;gap:10px;display:flex}.test-result-info .latency[data-v-88bb1df0]{color:var(--text-primary);background:var(--bg-tertiary);border-radius:4px;padding:2px 8px;font-family:SF Mono,Monaco,monospace;font-size:13px;font-weight:600}.test-result-info .status-code[data-v-88bb1df0]{color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace;font-size:11px}.test-result-error[data-v-88bb1df0]{color:#f56c6c;word-break:break-word;background:#f56c6c14;border-radius:4px;margin-top:8px;padding:8px 10px;font-size:12px;line-height:1.4}.channel-info[data-v-88bb1df0]{padding:12px 16px}.info-main[data-v-88bb1df0]{flex-direction:column;gap:8px;display:flex}.info-row[data-v-88bb1df0]{align-items:center;gap:12px;display:flex}.info-row .label[data-v-88bb1df0]{min-width:80px;font-size:13px}.info-row .value[data-v-88bb1df0]{flex:1;font-size:13px}.info-row .value.mono[data-v-88bb1df0]{font-family:SF Mono,Monaco,monospace}.info-footer[data-v-88bb1df0]{border-top:1px solid var(--border-primary);justify-content:space-between;align-items:center;margin-top:12px;padding-top:8px;display:flex}.footer-spacer[data-v-88bb1df0]{flex:1}.channel-meta[data-v-88bb1df0]{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12px;font-size:12px;display:flex}.balance-meta-tag[data-v-88bb1df0]{cursor:pointer;flex-shrink:0;max-width:140px}.balance-meta-tag[data-v-88bb1df0] .n-tag__content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.meta-item[data-v-88bb1df0]{color:var(--text-tertiary);white-space:nowrap}.meta-value[data-v-88bb1df0]{color:var(--text-secondary);font-weight:500}.meta-active[data-v-88bb1df0]{color:#18a058}@media (width<=1024px){.channel-header[data-v-88bb1df0],.channel-info[data-v-88bb1df0]{padding:10px 12px}.channel-actions[data-v-88bb1df0]{gap:6px}.info-row[data-v-88bb1df0]{gap:8px}.info-row .label[data-v-88bb1df0]{min-width:70px;font-size:12px}.info-row .value[data-v-88bb1df0]{font-size:12px}.channel-meta[data-v-88bb1df0]{gap:12px}}@media (width<=768px){.channel-header[data-v-88bb1df0]{flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px}.channel-title[data-v-88bb1df0]{margin-right:0}.channel-actions[data-v-88bb1df0]{justify-content:space-between}.channel-actions[data-v-88bb1df0] .n-button{padding:0 8px;font-size:12px}.channel-info[data-v-88bb1df0]{padding:8px 10px}.info-row[data-v-88bb1df0]{flex-direction:column;align-items:flex-start;gap:4px}.info-row .label[data-v-88bb1df0]{min-width:auto}.info-footer[data-v-88bb1df0]{flex-direction:column;align-items:flex-start;gap:8px;margin-top:8px}.channel-meta[data-v-88bb1df0]{justify-content:flex-start;align-self:stretch;gap:8px 12px}}@media (width<=640px){.channel-card[data-v-88bb1df0]{border-radius:6px}.channel-header[data-v-88bb1df0]{padding:6px 8px}.channel-name[data-v-88bb1df0]{min-width:0;font-size:12px}.channel-title[data-v-88bb1df0]{min-width:0}.channel-title[data-v-88bb1df0] .n-tag{font-size:10px}.channel-info[data-v-88bb1df0]{padding:6px 8px}.info-row .label[data-v-88bb1df0],.info-row .value[data-v-88bb1df0]{font-size:11px}.channel-actions[data-v-88bb1df0] .n-button{height:24px;padding:0 6px;font-size:11px}.channel-meta[data-v-88bb1df0]{font-size:11px}}@media (width<=480px){.channel-header[data-v-88bb1df0],.channel-info[data-v-88bb1df0]{padding:4px 6px}.channel-actions[data-v-88bb1df0]{gap:4px}.channel-actions[data-v-88bb1df0] .n-button{min-width:0;height:22px;padding:0 4px;font-size:10px}}.model-redirect-editor[data-v-8ebdcad0]{width:100%}.redirect-row[data-v-8ebdcad0]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.redirect-input[data-v-8ebdcad0]{flex:1;min-width:0}.redirect-arrow[data-v-8ebdcad0]{flex-shrink:0;justify-content:center;align-items:center;width:24px;display:flex}.add-btn[data-v-8ebdcad0]{width:100%;margin-top:4px}.channel-auth-section[data-v-8fcf77d4]{gap:10px;width:100%;display:grid}.oauth-content[data-v-8fcf77d4],.oauth-quota[data-v-8fcf77d4]{gap:8px;display:grid}.oauth-meta[data-v-8fcf77d4]{color:var(--text-color-3)}.oauth-quota[data-v-8fcf77d4]{grid-template-columns:repeat(3,auto);align-items:center}.loading-container{justify-content:center;align-items:center;padding:80px 0;display:flex}.empty-state{justify-content:center;align-items:center;min-height:200px;display:flex}.model-catalog-control{flex-wrap:wrap;align-items:center;gap:6px 8px;margin:-3px 0 10px;font-size:12px;line-height:1.45;display:flex}.model-catalog-status{color:var(--n-text-color-3)}.model-catalog-status.is-loading{color:var(--n-info-color,var(--n-text-color-3))}.model-catalog-status.is-error{color:var(--n-error-color,#d03050)}.channels-list{flex-direction:column;gap:10px;display:flex;position:relative;overflow:hidden}.channel-card{border:1px solid var(--n-divider-color);background:var(--bg-secondary);border-left:3px solid #18a058;border-radius:6px;padding:10px 12px;transition:all .2s;box-shadow:0 1px 2px #0000000a}.channel-card.active{border-color:var(--n-primary-color);background:var(--n-primary-color-suppl,#18a05814);box-shadow:0 2px 8px #18a0581a}.channel-card:hover{border-color:var(--n-border-color);box-shadow:0 2px 8px #00000014}.channel-card.disabled{opacity:.6;border-left-color:#909399}.channel-card.status-frozen{background:linear-gradient(90deg,#d0305014 0%,#0000 100%);border-left-color:#d03050}.channel-card.status-checking{background:linear-gradient(90deg,#f0a02014 0%,#0000 100%);border-left-color:#f0a020}.channel-card.collapsed .channel-info{display:none}.channel-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.channel-title{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.channel-name{color:var(--n-text-color);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;overflow:hidden}.channel-actions{flex-shrink:0;align-items:center;gap:6px;display:flex}.channel-actions .apply-btn{opacity:0;transition:opacity .2s}.channel-card:hover .channel-actions .apply-btn{opacity:1}.channel-actions .n-switch{margin-left:2px}.channel-info{border-top:1px dashed var(--n-border-color);margin-top:8px;padding-top:8px}.info-main{flex-direction:column;gap:4px;display:flex}.info-row{align-items:center;gap:8px;display:flex}.label{color:var(--n-text-color-3);flex-shrink:0;width:56px;font-size:11px}.value{color:var(--n-text-color-2);word-break:break-word;flex:1;font-size:12px}.value.mono{font-family:IBM Plex Mono,SFMono-Regular,Consolas,monospace}.info-footer{border-top:1px dashed var(--n-border-color);align-items:center;gap:8px;margin-top:6px;padding-top:6px;display:flex}.footer-spacer{flex:1}.channel-meta{flex-shrink:0;gap:12px;display:flex}.meta-item{color:var(--n-text-color-3);white-space:nowrap;font-size:11px}.meta-value{color:#18a058;font-weight:600}.meta-value.meta-active{color:#f0a020;animation:1.5s ease-in-out infinite pulse}@keyframes pulse{0%,to{opacity:1}50%{opacity:.6}}.collapse-btn{align-items:center;padding:0;display:flex}.collapse-btn .n-icon{transition:transform .2s}.collapse-btn .n-icon.collapsed{transform:rotate(-90deg)}.dialog-footer{justify-content:flex-end;gap:8px;display:flex}.channel-form{padding:0}.form-section{background:var(--n-color);border:1px solid var(--n-border-color);border-radius:6px;margin-bottom:10px;padding:12px}.form-section:last-child{margin-bottom:0}.section-title{color:var(--n-text-color);border-bottom:1px solid var(--n-border-color);align-items:center;gap:6px;margin-bottom:10px;padding-bottom:6px;font-size:12px;font-weight:600;display:flex}.section-desc{color:var(--n-text-color-3);font-size:11px;font-weight:400}.form-section.collapsible{background:var(--n-color-hover)}.channel-form .n-radio-group{width:100%}.channel-form .n-radio-group .n-space{gap:16px;width:100%;display:flex}.channel-form .n-radio{border:1px solid var(--n-border-color);border-radius:6px;flex:1;justify-content:center;padding:8px 16px;transition:all .2s;display:flex}.channel-form .n-radio:hover,.channel-form .n-radio.n-radio--checked{border-color:var(--n-primary-color);background:var(--n-primary-color-suppl,#18a05814)}.channel-form .n-form-item{margin-bottom:10px}.channel-form .n-form-item:last-child{margin-bottom:0}.channel-form .n-form-item-label{padding-bottom:0;font-size:12px}.auth-provider-status{flex-direction:column;justify-content:center;gap:6px;width:100%;min-height:28px;display:flex}.auth-provider-tags{min-height:24px}.auth-provider-message{color:var(--n-text-color-3);font-size:12px;line-height:1.45}.auth-provider-message.warning{color:#c97a00}.model-definitions-editor[data-v-95ee536c]{width:100%}.model-definitions-toolbar[data-v-95ee536c]{align-items:center;gap:10px;margin-bottom:8px;display:flex}.proxy-logs[data-v-b403c421]{background:#fff;border-top:1px solid #e5e7eb;flex-direction:column;height:100%;display:flex}[data-theme=dark] .proxy-logs[data-v-b403c421]{background:var(--bg-secondary);border-top:1px solid var(--border-primary)}.logs-header[data-v-b403c421]{border-bottom:1px solid #e5e7eb;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}[data-theme=dark] .logs-header[data-v-b403c421]{border-bottom:1px solid var(--border-primary)}.header-left[data-v-b403c421]{align-items:center;gap:12px;display:flex}.title[data-v-b403c421]{color:#18181b;margin:0;font-size:14px;font-weight:600}[data-theme=dark] .title[data-v-b403c421]{color:var(--text-primary)}.today-stats[data-v-b403c421]{align-items:center;gap:6px;display:flex}.today-stats[data-v-b403c421] .n-tag{padding:2px 8px;font-size:11px;font-weight:600}.logs-table[data-v-b403c421]{flex-direction:column;flex:1;display:flex;overflow:hidden}.table-header[data-v-b403c421]{color:#6b7280;white-space:nowrap;background:#f9fafb;border-bottom:1px solid #e5e7eb;flex-shrink:0;padding:8px 12px;font-size:11px;font-weight:600;display:flex}[data-theme=dark] .table-header[data-v-b403c421]{border-bottom:1px solid var(--border-primary);color:var(--text-tertiary);background:#ffffff05}.table-body[data-v-b403c421]{flex:1;min-height:0;padding-bottom:40px;scroll-padding-bottom:40px;overflow:hidden auto}.table-row[data-v-b403c421]{cursor:pointer;border-bottom:1px solid #f3f4f6;padding:8px 12px;font-size:12px;transition:background-color .2s;display:flex;position:relative}[data-theme=dark] .table-row[data-v-b403c421]{border-bottom:1px solid #ffffff0a}.table-row[data-v-b403c421]:hover{background:#f9fafb}[data-theme=dark] .table-row[data-v-b403c421]:hover{background:#ffffff0a}.table-row.new-log[data-v-b403c421],.action-row.new-log[data-v-b403c421]{border-left:3px solid #18a058;padding-left:9px;animation:4.5s cubic-bezier(.25,.46,.45,.94) forwards newLogPulse-b403c421}@keyframes newLogPulse-b403c421{0%{background:linear-gradient(90deg,#18a05826 0%,#18a0580f 100%);box-shadow:0 0 8px #18a05833}5%{background:linear-gradient(90deg,#18a0582e 0%,#18a05814 100%);box-shadow:0 0 12px 1px #18a05840}15%{background:linear-gradient(90deg,#18a05829 0%,#18a05812 100%);box-shadow:0 0 10px 1px #18a05833}30%{background:linear-gradient(90deg,#18a0581f 0%,#18a0580d 100%);box-shadow:0 0 6px #18a05826}50%{background:linear-gradient(90deg,#18a05814 0%,#18a05808 100%);box-shadow:0 0 4px #18a0581a}70%{background:linear-gradient(90deg,#18a0580a 0%,#18a05804 100%);box-shadow:0 0 2px #18a0580f}85%{background:linear-gradient(90deg,#18a05805 0%,#18a05802 100%);box-shadow:0 0 1px #18a05808}to{background:0 0;border-left-color:#0000;box-shadow:0 0 #18a05800}}[data-theme=dark] .table-row.new-log[data-v-b403c421],[data-theme=dark] .action-row.new-log[data-v-b403c421]{animation:4.5s cubic-bezier(.25,.46,.45,.94) forwards newLogPulseDark-b403c421}@keyframes newLogPulseDark-b403c421{0%{background:linear-gradient(90deg,#18a05833 0%,#18a05814 100%);box-shadow:0 0 10px #18a05840}5%{background:linear-gradient(90deg,#18a0583d 0%,#18a0581a 100%);box-shadow:0 0 14px 2px #18a0584d}15%{background:linear-gradient(90deg,#18a05836 0%,#18a05817 100%);box-shadow:0 0 12px 1px #18a05840}30%{background:linear-gradient(90deg,#18a05829 0%,#18a05812 100%);box-shadow:0 0 8px 1px #18a0582e}50%{background:linear-gradient(90deg,#18a0581c 0%,#18a0580b 100%);box-shadow:0 0 5px #18a0581f}70%{background:linear-gradient(90deg,#18a0580f 0%,#18a05806 100%);box-shadow:0 0 3px #18a05814}85%{background:linear-gradient(90deg,#18a05808 0%,#18a05803 100%);box-shadow:0 0 1px #18a0580a}to{background:0 0;border-left-color:#0000;box-shadow:0 0 #18a05800}}.table-row-content[data-v-b403c421]{width:100%;display:flex}.action-row[data-v-b403c421]{color:#166534;background:#f0fdf4;border-bottom:1px solid #f3f4f6;border-left:3px solid #18a058;align-items:center;padding:10px 12px;font-size:13px;display:flex}[data-theme=dark] .action-row[data-v-b403c421]{color:#4ade80;background:#18a0581f;border-bottom:1px solid #ffffff0a}.error-row[data-v-b403c421]{color:#b42318;background:#fef2f2;border-bottom:1px solid #f3f4f6;border-left:3px solid #d03050;align-items:center;padding:10px 12px;font-size:13px;display:flex}[data-theme=dark] .error-row[data-v-b403c421]{color:#fda4af;background:#d030501f;border-bottom:1px solid #ffffff0a}.action-message[data-v-b403c421]{flex:1;font-weight:500}.action-time[data-v-b403c421]{color:#6b7280;margin-left:12px;margin-right:22px;font-family:monospace;font-size:11px}[data-theme=dark] .action-time[data-v-b403c421]{color:var(--text-tertiary)}.col[data-v-b403c421]{white-space:nowrap;text-overflow:ellipsis;align-items:center;display:flex;overflow:hidden}.col-channel-claude[data-v-b403c421]{flex:80px;min-width:0;overflow:hidden}.col-token-claude[data-v-b403c421]{flex:0 0 68px;justify-content:center;min-width:0}.col-time-claude[data-v-b403c421]{flex:0 0 85px;justify-content:flex-end;min-width:85px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-codex[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-codex[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-codex[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-gemini[data-v-b403c421]{flex:80px;min-width:0;overflow:hidden}.col-token-gemini[data-v-b403c421]{flex:0 0 68px;justify-content:center;min-width:0}.col-time-gemini[data-v-b403c421]{flex:0 0 85px;justify-content:flex-end;min-width:85px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-opencode[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-opencode[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-opencode[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel-omp[data-v-b403c421]{flex:65px;min-width:0;overflow:hidden}.col-token-omp[data-v-b403c421]{flex:0 0 58px;justify-content:center;min-width:0}.col-time-omp[data-v-b403c421]{flex:0 0 80px;justify-content:flex-end;min-width:80px;padding-left:10px;padding-right:6px;font-family:monospace;font-size:11px}.col-channel[data-v-b403c421]{min-width:0;overflow:hidden}.col-channel .n-tag[data-v-b403c421]{text-overflow:ellipsis;max-width:100%;overflow:hidden}.col-token[data-v-b403c421]{justify-content:center;min-width:0}.col-time[data-v-b403c421]{justify-content:flex-end;font-family:monospace;font-size:11px}.empty-state[data-v-b403c421]{text-align:center;color:#9ca3af;padding:40px 16px;font-size:13px}[data-theme=dark] .empty-state[data-v-b403c421]{color:var(--text-tertiary)}.logs-footer[data-v-b403c421]{color:#6b7280;border-top:1px solid #e5e7eb;justify-content:space-between;align-items:center;padding:8px 16px;font-size:12px;display:flex}[data-theme=dark] .logs-footer[data-v-b403c421]{border-top:1px solid var(--border-primary);color:var(--text-tertiary)}.status[data-v-b403c421]{color:#ef4444;align-items:center;gap:4px;display:flex}.status.connected[data-v-b403c421]{color:#10b981}[data-theme=dark] .status.connected[data-v-b403c421]{color:#4ade80}.count[data-v-b403c421]{color:#6b7280}[data-theme=dark] .count[data-v-b403c421]{color:var(--text-tertiary)}@media (width<=1024px){.logs-header[data-v-b403c421]{padding:10px 12px}.header-left[data-v-b403c421]{gap:8px}.title[data-v-b403c421]{font-size:13px}.today-stats[data-v-b403c421] .n-tag{padding:1px 6px;font-size:10px}.table-header[data-v-b403c421]{padding:6px 10px;font-size:10px}.table-row[data-v-b403c421]{padding:6px 10px}.logs-footer[data-v-b403c421]{padding:6px 12px;font-size:11px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421]{flex:0 0 75px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421]{flex:0 0 55px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421]{flex:0 0 80px;min-width:80px}.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 65px}.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 48px}.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 75px;min-width:75px}}@media (width<=768px){.logs-header[data-v-b403c421]{flex-direction:column;align-items:stretch;gap:8px;padding:8px 10px}.header-left[data-v-b403c421]{justify-content:space-between}.title[data-v-b403c421]{font-size:12px}.today-stats[data-v-b403c421] .n-tag{padding:1px 4px;font-size:9px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:4px 8px;font-size:10px}.table-row-content[data-v-b403c421]{font-size:10px}.action-row[data-v-b403c421]{padding:8px 10px;font-size:11px}.action-message[data-v-b403c421]{font-size:11px}.action-time[data-v-b403c421]{margin-right:12px;font-size:9px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 60px}.col-channel[data-v-b403c421] .n-tag{height:18px;padding:0 4px;font-size:9px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 40px;font-size:9px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 65px;min-width:65px;font-size:9px}.logs-footer[data-v-b403c421]{padding:4px 10px;font-size:10px}}@media (width<=640px){.logs-header[data-v-b403c421]{gap:6px;padding:6px 8px}.header-left[data-v-b403c421]{flex-wrap:wrap;gap:4px}.title[data-v-b403c421]{font-size:11px}.today-stats[data-v-b403c421]{gap:4px}.today-stats[data-v-b403c421] .n-tag{height:16px;padding:0 3px;font-size:8px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:3px 6px;font-size:9px}.table-row-content[data-v-b403c421]{font-size:9px}.action-row[data-v-b403c421]{padding:6px 8px;font-size:10px}.action-message[data-v-b403c421]{font-size:10px}.action-time[data-v-b403c421]{margin-left:8px;margin-right:8px;font-size:8px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 50px}.col-channel[data-v-b403c421] .n-tag{height:16px;padding:0 3px;font-size:8px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 32px;font-size:8px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 55px;min-width:55px;font-size:8px}.logs-footer[data-v-b403c421]{padding:3px 8px;font-size:9px}.status[data-v-b403c421],.count[data-v-b403c421]{font-size:9px}}@media (width<=480px){.logs-header[data-v-b403c421]{padding:4px 6px}.title[data-v-b403c421]{font-size:10px}.today-stats[data-v-b403c421] .n-tag{height:14px;font-size:7px}.table-header[data-v-b403c421],.table-row[data-v-b403c421]{padding:2px 4px;font-size:8px}.action-row[data-v-b403c421]{padding:4px 6px;font-size:9px}.action-row[data-v-b403c421] .n-icon{margin-right:4px}.col-channel-claude[data-v-b403c421],.col-channel-gemini[data-v-b403c421],.col-channel-codex[data-v-b403c421],.col-channel-opencode[data-v-b403c421],.col-channel-omp[data-v-b403c421]{flex:0 0 45px}.col-token-claude[data-v-b403c421],.col-token-gemini[data-v-b403c421],.col-token-codex[data-v-b403c421],.col-token-opencode[data-v-b403c421],.col-token-omp[data-v-b403c421]{flex:0 0 28px;font-size:7px}.col-time-claude[data-v-b403c421],.col-time-gemini[data-v-b403c421],.col-time-codex[data-v-b403c421],.col-time-opencode[data-v-b403c421],.col-time-omp[data-v-b403c421]{flex:0 0 48px;min-width:48px;font-size:7px}.logs-footer[data-v-b403c421]{padding:2px 6px;font-size:8px}}.right-panel[data-v-8cdfe9a9]{background:var(--bg-primary);border-left:1px solid var(--border-primary);flex-direction:column;width:480px;min-width:480px;height:100%;display:flex}.toolbar-section[data-v-8cdfe9a9]{background:var(--bg-secondary);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;padding:10px 14px;display:flex}.toolbar-left[data-v-8cdfe9a9]{align-items:center;gap:8px;display:flex}.toolbar-label[data-v-8cdfe9a9]{margin-right:2px;font-size:12px}.toolbar-right[data-v-8cdfe9a9]{align-items:center;gap:2px;display:flex}.toolbar-btn[data-v-8cdfe9a9]{--toolbar-button-text:var(--text-secondary);border-radius:4px;transition:transform .18s cubic-bezier(.4,0,.2,1);--n-text-color:var(--toolbar-button-text)!important;--n-text-color-hover:var(--toolbar-button-text)!important;--n-text-color-pressed:var(--toolbar-button-text)!important;--n-text-color-focus:var(--toolbar-button-text)!important;--n-color-hover:transparent!important;--n-color-pressed:transparent!important;--n-color-focus:transparent!important;color:var(--toolbar-button-text)!important;padding:5px!important}.toolbar-btn[data-v-8cdfe9a9] .n-button__content,.toolbar-btn[data-v-8cdfe9a9] .n-button__icon{color:var(--toolbar-button-text)!important}.toolbar-btn[data-v-8cdfe9a9]:hover,.toolbar-btn[data-v-8cdfe9a9]:focus,.toolbar-btn[data-v-8cdfe9a9]:focus-visible,.toolbar-btn[data-v-8cdfe9a9]:active{background:0 0;transform:translateY(-1px);color:var(--toolbar-button-text)!important}.toolbar-btn[data-v-8cdfe9a9]:active{transform:translateY(0)}.toolbar-divider[data-v-8cdfe9a9]{background:var(--border-primary);width:1px;height:16px;margin:0 4px}.oauth-banner[data-v-8cdfe9a9]{color:#2080f0;background:#2080f014;border-bottom:1px solid #2080f033;flex-shrink:0;align-items:center;gap:6px;padding:6px 14px;font-size:12px;display:flex}.oauth-banner span[data-v-8cdfe9a9]{flex:1}.channels-section[data-v-8cdfe9a9]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.channels-section.full-height[data-v-8cdfe9a9]{flex:1}.panel-header[data-v-8cdfe9a9]{background:var(--bg-secondary);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.header-title[data-v-8cdfe9a9]{align-items:baseline;gap:8px;min-width:0;display:flex}.header-title h3[data-v-8cdfe9a9]{color:var(--text-primary);margin:0;font-size:13px;font-weight:600}.header-hint[data-v-8cdfe9a9]{font-size:11px}.header-actions[data-v-8cdfe9a9]{flex-shrink:0;align-items:center;gap:8px;display:flex}.channels-scroll-area[data-v-8cdfe9a9]{flex:1;min-height:0;padding:12px;overflow-y:auto}.logs-section[data-v-8cdfe9a9]{flex:0 0 340px;min-height:340px;max-height:340px;overflow:hidden}.logs-section.full-height[data-v-8cdfe9a9]{flex:1;min-height:0;max-height:none}@media (width<=1024px){.right-panel[data-v-8cdfe9a9]{width:420px;min-width:420px}.logs-section[data-v-8cdfe9a9]{flex:0 0 300px;min-height:300px;max-height:300px}}@media (width<=768px){.right-panel[data-v-8cdfe9a9]{width:100%;min-width:100%}.toolbar-section[data-v-8cdfe9a9]{padding:8px 12px}.toolbar-label[data-v-8cdfe9a9]{font-size:11px}.logs-section[data-v-8cdfe9a9]{flex:0 0 260px;min-height:260px;max-height:260px}}@media (height<=600px){.right-panel[data-v-8cdfe9a9]{overflow-y:auto}.channels-section[data-v-8cdfe9a9]{flex:0 0 360px;min-height:360px}.logs-section[data-v-8cdfe9a9]{flex:0 0 260px}}.layout[data-v-1b46cda2]{background:var(--bg-primary);flex-direction:column;height:100vh;display:flex}.header[data-v-1b46cda2]{background:var(--gradient-header);border-bottom:1px solid var(--border-primary);flex-shrink:0;justify-content:space-between;align-items:center;height:74px;padding:10px 22px;display:flex;box-shadow:inset 0 1px #ffffff57}.header-actions[data-v-1b46cda2]{background:color-mix(in srgb, var(--bg-primary) 82%, transparent);border:1px solid var(--border-primary);border-radius:999px;align-items:center;gap:8px;padding:6px 10px;display:flex;box-shadow:0 14px 34px #0f171d14}.more-menu-trigger[data-v-1b46cda2]{display:flex}.header-divider[data-v-1b46cda2]{background:#95a7af59;width:1px;height:24px;margin:0 2px}.env-warning-btn[data-v-1b46cda2]{cursor:pointer;background:#f59e0b1a;border-radius:4px;align-items:center;gap:4px;padding:4px 8px;transition:background .2s;display:flex}.env-warning-btn[data-v-1b46cda2]:hover{background:#f59e0b2e}.env-warning-icon[data-v-1b46cda2]{color:#f59e0b}.env-warning-count[data-v-1b46cda2]{color:#f59e0b;font-size:11px;font-weight:600}.logo-section[data-v-1b46cda2]{cursor:pointer;color:inherit;border-radius:18px;align-items:center;gap:14px;margin-left:-8px;padding:8px 14px;text-decoration:none;transition:background .2s;display:flex}.logo-section[data-v-1b46cda2]:hover{background:var(--hover-bg)}.logo-wrapper[data-v-1b46cda2]{background:linear-gradient(135deg,#18a0582e,#18a0580d);border-radius:14px;justify-content:center;align-items:center;width:40px;height:40px;display:flex;box-shadow:0 10px 24px #0f171d14}.logo-image[data-v-1b46cda2]{object-fit:contain;width:22px;height:22px}.title-group[data-v-1b46cda2]{flex-direction:column;gap:1px;display:flex}.title-main[data-v-1b46cda2]{color:var(--brand-title-color);margin:0;font-size:18px;font-weight:700;line-height:1.2}.title-sub[data-v-1b46cda2]{color:var(--text-tertiary);font-size:11px}.nav-tabs[data-v-1b46cda2]{background:color-mix(in srgb, var(--bg-primary) 86%, transparent);border:1px solid var(--border-primary);border-radius:999px;align-items:center;gap:6px;margin-left:28px;padding:6px 8px;display:flex;box-shadow:0 14px 36px #0f171d14}.nav-tab[data-v-1b46cda2]{cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:8px 14px;transition:background .2s;display:flex;position:relative}.nav-tab[data-v-1b46cda2]:hover{background:var(--hover-bg)}.nav-tab.active[data-v-1b46cda2]{background:var(--primary-color-soft)}.nav-tab.active[data-v-1b46cda2]:after{content:"";border-radius:inherit;background:0 0;border:1px solid #18a05838;position:absolute;inset:0}.nav-icon[data-v-1b46cda2]{color:var(--text-tertiary)}.nav-tab:hover .nav-icon[data-v-1b46cda2],.nav-tab.active .nav-icon[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.nav-label[data-v-1b46cda2]{color:var(--text-secondary);font-size:13px;font-weight:500}.nav-tab:hover .nav-label[data-v-1b46cda2],.nav-tab.active .nav-label[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.nav-tab.active .nav-label[data-v-1b46cda2]{font-weight:600}.main-container[data-v-1b46cda2]{flex:1;height:calc(100vh - 74px);min-height:0;display:flex;overflow:hidden}.global-loading-overlay[data-v-1b46cda2]{background:var(--bg-overlay);z-index:1000;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.left-content[data-v-1b46cda2]{flex:1;min-width:0;height:100%;overflow:hidden}.favorites-button-wrapper[data-v-1b46cda2]{position:relative}.favorites-badge[data-v-1b46cda2]{color:#fff;pointer-events:none;background:#ff4d4f;border-radius:7px;justify-content:center;align-items:center;min-width:14px;height:14px;padding:0 3px;font-size:9px;font-weight:600;display:flex;position:absolute;top:-3px;right:-3px}.help-content[data-v-1b46cda2]{max-height:70vh;overflow-y:auto}.help-section[data-v-1b46cda2]{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:8px;margin-bottom:20px;padding:16px}.help-section[data-v-1b46cda2]:last-child{margin-bottom:0}.help-section h4[data-v-1b46cda2]{color:var(--text-primary);border-bottom:1px solid var(--border-primary);margin:0 0 12px;padding-bottom:10px;font-size:15px;font-weight:600}.help-section p[data-v-1b46cda2]{color:var(--text-secondary);margin:0 0 10px;font-size:13px;line-height:1.7}.help-section ul[data-v-1b46cda2]{margin:8px 0 0;padding-left:20px}.help-section li[data-v-1b46cda2]{color:var(--text-secondary);margin-bottom:4px;font-size:13px;line-height:1.8}.help-section li strong[data-v-1b46cda2]{color:var(--primary-color,#18a058)}.command-list[data-v-1b46cda2]{flex-direction:column;gap:8px;display:flex}.command-item[data-v-1b46cda2]{background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:6px;align-items:center;gap:12px;padding:10px 12px;display:flex}.command-item code[data-v-1b46cda2]{min-width:140px;color:var(--primary-color,#18a058);background:#18a0581a;border-radius:4px;padding:4px 10px;font-family:monospace;font-size:12px;font-weight:600}.command-item span[data-v-1b46cda2]{color:var(--text-secondary);font-size:13px}.help-section kbd[data-v-1b46cda2]{color:var(--text-primary);background:var(--bg-primary);border:1px solid var(--border-primary);border-radius:3px;margin:0 2px;padding:2px 6px;font-family:monospace;font-size:11px;font-weight:600;display:inline-block}.link-list[data-v-1b46cda2]{flex-wrap:wrap;gap:12px;display:flex}.link-list a[data-v-1b46cda2]{color:var(--primary-color,#18a058);background:#18a05814;border-radius:4px;padding:6px 10px;font-size:13px;text-decoration:none}.link-list a[data-v-1b46cda2]:hover{background:#18a05826}.panel-security-auth[data-v-1b46cda2]{flex-direction:column;gap:12px;display:flex}.panel-security-error[data-v-1b46cda2]{color:#d03050;font-size:12px}.panel-security-hint[data-v-1b46cda2]{font-size:12px;line-height:1.6}.header-actions[data-v-1b46cda2],.nav-tabs[data-v-1b46cda2]{-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}[data-theme=dark] .header[data-v-1b46cda2]{border-bottom-color:#2b424aeb;box-shadow:inset 0 -1px #ffffff08}[data-theme=dark] .header-actions[data-v-1b46cda2],[data-theme=dark] .nav-tabs[data-v-1b46cda2]{background:#0c151bdb;border-color:#364c56e6;box-shadow:0 14px 32px #00000042}[data-theme=dark] .logo-section[data-v-1b46cda2]:hover{background:#ffffff0d}@media (width<=1024px){.header[data-v-1b46cda2]{height:68px;padding:10px 16px}.main-container[data-v-1b46cda2]{height:calc(100vh - 68px)}.nav-tabs[data-v-1b46cda2]{margin-left:16px;padding:5px 6px}.title-sub[data-v-1b46cda2]{display:none}}@media (width<=768px){.header[data-v-1b46cda2]{height:60px;padding:8px 12px}.main-container[data-v-1b46cda2]{height:calc(100vh - 60px)}.logo-wrapper[data-v-1b46cda2]{width:28px;height:28px}.logo-image[data-v-1b46cda2]{width:18px;height:18px}.title-main[data-v-1b46cda2]{font-size:14px}.title-sub[data-v-1b46cda2]{display:none}.nav-tabs[data-v-1b46cda2]{gap:2px;margin-left:10px;padding:4px 5px}.nav-tab[data-v-1b46cda2]{gap:4px;padding:6px 10px}.nav-label[data-v-1b46cda2]{font-size:12px}.header-actions[data-v-1b46cda2]{gap:2px}}@media (width<=640px){.header[data-v-1b46cda2]{height:54px;padding:6px 8px}.main-container[data-v-1b46cda2]{height:calc(100vh - 54px)}.title-group[data-v-1b46cda2]{display:none}.nav-tabs[data-v-1b46cda2]{flex:1;justify-content:center;margin-left:8px}.nav-tab[data-v-1b46cda2]{flex-direction:column;gap:2px;padding:4px 6px}.nav-label[data-v-1b46cda2]{font-size:10px}}.asset-panel{background:var(--bg-primary);flex-direction:column;flex:1;height:100%;min-height:0;display:flex}.asset-panel-header,.asset-drawer-toolbar{border-bottom:1px solid var(--border-primary);background:var(--bg-primary);justify-content:space-between;align-items:center;gap:16px;padding:14px 18px;display:flex}.asset-drawer-toolbar{background:var(--bg-secondary);justify-content:flex-end;padding:10px 12px}.asset-title-group,.asset-title-row,.asset-action-row,.asset-filter-bar,.asset-summary,.asset-meta,.asset-tags,.asset-card-actions{align-items:center;display:flex}.asset-title-group{gap:10px;min-width:0}.asset-heading{min-width:0}.asset-title-row{gap:8px;min-width:0}.asset-title{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:650;line-height:1.25;overflow:hidden}.asset-subtitle{color:var(--text-tertiary);margin-top:3px;font-size:12px;line-height:1.35}.asset-platform-pill{border:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-tertiary);border-radius:999px;flex-shrink:0;padding:2px 7px;font-size:11px;font-weight:500;line-height:1.4}.asset-action-row{flex-shrink:0;gap:6px}.asset-action-row .n-button{font-size:12px}.asset-summary{border-bottom:1px solid var(--border-primary);background:var(--bg-secondary);gap:8px;padding:10px 18px}.asset-panel.in-drawer .asset-summary{padding:10px 12px}.asset-summary-item{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:999px;align-items:baseline;gap:6px;min-width:0;padding:4px 8px;display:inline-flex}.asset-summary-label{color:var(--text-tertiary);font-size:11px}.asset-summary-value{color:var(--text-primary);font-variant-numeric:tabular-nums;font-size:12px;font-weight:650}.asset-filter-bar{border-bottom:1px solid var(--border-primary);background:var(--bg-primary);gap:10px;padding:12px 18px}.asset-panel.in-drawer .asset-filter-bar{padding:10px 12px}.asset-search{flex:1;min-width:160px}.asset-filter{flex-shrink:0;width:116px}.asset-panel-content{flex:1;min-height:0;padding:16px 18px;overflow-y:auto}.asset-panel.in-drawer .asset-panel-content{padding:12px}.asset-panel-content .n-spin-container{min-height:220px}.asset-empty{justify-content:center;align-items:center;min-height:220px;display:flex}.asset-list{flex-direction:column;gap:10px;display:flex}.asset-footer{border-top:1px solid var(--border-primary);background:var(--bg-secondary);color:var(--text-tertiary);align-items:center;gap:6px;padding:9px 18px;font-size:11px;display:flex}.asset-panel.in-drawer .asset-footer{padding:8px 12px}.asset-info-icon{color:var(--text-quaternary)}.asset-card{border:1px solid var(--border-primary);background:var(--bg-primary);cursor:pointer;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:14px;min-height:96px;padding:14px;transition:border-color .16s ease-out,background-color .16s ease-out,box-shadow .16s ease-out;display:flex}.asset-card:hover{border-color:var(--border-secondary);background:var(--bg-secondary);box-shadow:var(--shadow-sm)}.asset-card.is-installed,.asset-card.is-managed,.asset-card.is-project{background:linear-gradient(0deg, oklch(62% .15 151/.045), oklch(62% .15 151/.045)), var(--bg-primary)}.asset-card.is-disabled,.asset-card.is-protected{background:var(--bg-secondary)}.asset-card-main{flex:1;min-width:0}.asset-card-top{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.asset-card-title-stack{min-width:0}.asset-card-title-row{align-items:center;gap:7px;min-width:0;display:flex}.asset-status-dot{background:var(--text-quaternary);border-radius:999px;flex:none;width:7px;height:7px}.asset-status-dot.active{background:var(--primary-color);box-shadow:0 0 0 3px oklch(62% .15 151/.1)}.asset-status-dot.warning{background:oklch(68% .14 78);box-shadow:0 0 0 3px oklch(68% .14 78/.1)}.asset-name{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:650;line-height:1.35;overflow:hidden}.asset-name.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-tags{flex-wrap:wrap;gap:5px;margin-top:6px}.asset-description{color:var(--text-secondary);text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-top:9px;font-size:12px;line-height:1.5;display:-webkit-box;overflow:hidden}.asset-meta{color:var(--text-tertiary);flex-wrap:wrap;gap:8px;margin-top:9px;font-size:11px}.asset-meta-item{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:4px;min-width:0;max-width:100%;display:inline-flex;overflow:hidden}.asset-meta-item.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-link{color:var(--primary-color);flex-shrink:0;text-decoration:none}.asset-link:hover{text-decoration:underline}.asset-card-actions{flex-shrink:0;gap:5px}.asset-platform-strip{align-items:center;gap:5px;margin-left:6px;display:flex}.asset-platform-icon{border:1px solid var(--border-primary);background:var(--bg-secondary);width:24px;height:24px;color:var(--text-tertiary);cursor:pointer;border-radius:6px;justify-content:center;align-items:center;transition:border-color .16s ease-out,color .16s ease-out,background-color .16s ease-out;display:inline-flex}.asset-platform-icon:hover{border-color:var(--border-secondary);color:var(--text-secondary)}.asset-platform-icon.active{color:var(--primary-color);background:oklch(62% .15 151/.1);border-color:oklch(62% .15 151/.34)}.asset-detail-drawer-header{width:100%}.asset-detail-identity{align-items:center;gap:12px;min-width:0;display:flex}.asset-detail-icon{color:var(--primary-color);flex-shrink:0}.asset-detail-heading{flex-direction:column;gap:4px;min-width:0;display:flex}.asset-detail-name{color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:650;line-height:1.25;overflow:hidden}.asset-detail-name.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-detail-meta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.asset-detail-subtle{min-width:0;color:var(--text-tertiary);align-items:center;gap:4px;font-size:12px;display:inline-flex}.asset-detail-body{flex-direction:column;height:100%;min-height:0;display:flex;overflow:hidden}.asset-detail-container{flex-direction:column;gap:22px;min-height:0;display:flex}.asset-detail-info-section{flex-direction:column;gap:10px;display:flex}.asset-detail-section-title{color:var(--text-primary);margin:0;font-size:14px;font-weight:650}.asset-detail-description{color:var(--text-secondary);margin:0;font-size:13px;line-height:1.65}.asset-detail-list{border:1px solid var(--border-primary);background:var(--bg-secondary);border-radius:8px;overflow:hidden}.asset-detail-row{border-bottom:1px solid var(--border-primary);grid-template-columns:104px minmax(0,1fr);gap:12px;padding:10px 12px;font-size:13px;display:grid}.asset-detail-row:last-child{border-bottom:0}.asset-detail-label{color:var(--text-tertiary)}.asset-detail-value{overflow-wrap:anywhere;min-width:0;color:var(--text-secondary)}.asset-detail-value.mono{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace);font-size:12px}.asset-detail-box{border:1px solid var(--border-primary);background:var(--bg-secondary);min-width:0;color:var(--text-secondary);border-radius:8px;align-items:center;gap:8px;padding:12px;font-size:13px;display:flex}.asset-detail-box code,.asset-detail-code{font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace)}.asset-detail-box code{overflow-wrap:anywhere;color:var(--text-secondary);font-size:12px}.asset-detail-path-box{align-items:flex-start}.asset-detail-path-icon{flex:none;margin-top:1px}.asset-detail-path-text{flex:1;min-width:0;line-height:1.5}.asset-detail-path-copy{color:var(--text-tertiary);flex:none;margin:-4px -4px -4px 4px}.asset-detail-path-copy:hover{color:var(--text-primary)}.asset-detail-link{overflow-wrap:anywhere;min-width:0;color:var(--primary-color);text-decoration:none}.asset-detail-link:hover{text-decoration:underline}.asset-detail-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.asset-detail-content{border:1px solid var(--border-primary);background:var(--bg-secondary);min-height:0;color:var(--text-secondary);overflow-wrap:anywhere;border-radius:8px;flex:1;padding:18px;font-size:13px;line-height:1.7;overflow:auto}.asset-detail-content h1,.asset-detail-content h2,.asset-detail-content h3,.asset-detail-content h4,.asset-detail-content h5,.asset-detail-content h6{color:var(--text-primary);margin:22px 0 10px;font-weight:650;line-height:1.35}.asset-detail-content h1:first-child,.asset-detail-content h2:first-child,.asset-detail-content h3:first-child{margin-top:0}.asset-detail-content h1{border-bottom:1px solid var(--border-primary);padding-bottom:10px;font-size:20px}.asset-detail-content h2{border-bottom:1px solid var(--border-primary);padding-bottom:7px;font-size:17px}.asset-detail-content h3{font-size:15px}.asset-detail-content h4{font-size:14px}.asset-detail-content h5,.asset-detail-content h6{color:var(--text-secondary);font-size:13px}.asset-detail-content p{margin:10px 0}.asset-detail-content strong{color:var(--text-primary);font-weight:650}.asset-detail-content code{border:1px solid var(--border-primary);background:var(--bg-tertiary);font-family:var(--font-mono,"SF Mono", "JetBrains Mono", "Cascadia Code", monospace);border-radius:5px;padding:2px 6px;font-size:12px}.asset-detail-content pre{border:1px solid var(--border-primary);background:var(--bg-primary);border-radius:8px;margin:14px 0;padding:14px;line-height:1.65;overflow-x:auto}.asset-detail-content pre code{color:var(--text-secondary);background:0 0;border:0;padding:0;font-size:12px}.asset-detail-content ul,.asset-detail-content ol{margin:10px 0;padding-left:24px}.asset-detail-content li{margin:5px 0}.asset-detail-content li>p{margin:6px 0}.asset-detail-content a{color:var(--primary-color);text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.asset-detail-content a:hover{color:var(--primary-color-hover,var(--primary-color))}.asset-detail-content blockquote{border-left:1px solid var(--border-secondary);background:var(--bg-primary);color:var(--text-tertiary);border-radius:0 8px 8px 0;margin:14px 0;padding:10px 12px}.asset-detail-content blockquote>:first-child{margin-top:0}.asset-detail-content blockquote>:last-child{margin-bottom:0}.asset-detail-content table{border-collapse:collapse;width:max-content;max-width:100%;margin:14px 0;font-size:12px;display:block;overflow-x:auto}.asset-detail-content th,.asset-detail-content td{border:1px solid var(--border-primary);text-align:left;vertical-align:top;padding:8px 10px}.asset-detail-content th{background:var(--bg-tertiary);color:var(--text-primary);font-weight:650}.asset-detail-content img{border-radius:8px;max-width:100%;height:auto;margin:14px auto;display:block}.asset-detail-content hr{background:var(--border-primary);border:0;height:1px;margin:20px 0}.asset-detail-code{border:1px solid var(--border-primary);background:var(--bg-secondary);min-height:0;color:var(--text-secondary);white-space:pre-wrap;word-break:break-word;border-radius:8px;flex:1;margin:0;padding:16px;font-size:12px;line-height:1.65;overflow:auto}.asset-detail-loading,.asset-detail-empty,.asset-detail-error{color:var(--text-tertiary);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:16px;padding:64px 24px;display:flex}.asset-detail-empty-icon,.asset-detail-error-icon{color:var(--text-quaternary)}.asset-detail-error-icon{color:oklch(56% .18 26)}.asset-detail-tabs{flex:1;height:100%;min-height:0}.asset-detail-tabs .n-tabs-pane-wrapper{flex:1;min-height:0;padding-top:16px;overflow:hidden}.asset-detail-tabs .n-tab-pane{flex-direction:column;height:100%;min-height:0;display:flex;overflow:auto}@media (width<=720px){.asset-panel-header{flex-direction:column;align-items:flex-start}.asset-action-row,.asset-filter-bar,.asset-card-top{width:100%}.asset-action-row,.asset-summary{flex-wrap:wrap}.asset-filter-bar{flex-direction:column;align-items:stretch}.asset-filter{width:100%}.asset-card{flex-direction:column}.asset-card-actions{flex-wrap:wrap;align-self:flex-start}}:root{--bg-primary:#fff;--bg-secondary:#f4f7f8;--bg-tertiary:#edf3f1;--bg-elevated:#fff;--bg-overlay:#ffffffeb;--text-primary:#122025;--text-secondary:#58717d;--text-tertiary:#738995;--text-quaternary:#95a7af;--border-primary:#d8e1de;--border-secondary:#c3d0cb;--hover-bg:#18a05814;--active-bg:#18a0581f;--shadow-sm:0 8px 20px #0f171d0f;--shadow-md:0 18px 42px #0f171d1a;--shadow-lg:0 30px 70px #0f171d24;--font-mono:"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace;--gradient-header:linear-gradient(135deg, #f8fbfc 0%, #eef6f3 52%, #e9f7f1 100%);--gradient-bg:linear-gradient(180deg, #f4f7f8 0%, #eef4f2 100%);--gradient-card:linear-gradient(145deg, #fffffffa 0%, #f7faf8fa 100%);--primary-color:#18a058;--primary-color-soft:#18a0581f;--brand-title-color:#0d8f55}[data-theme=dark]{--bg-primary:#0a1116;--bg-secondary:#101920;--bg-tertiary:#16222a;--bg-elevated:#1a2831;--bg-overlay:#0a1116f0;--text-primary:#e7eef0;--text-secondary:#a8bbc0;--text-tertiary:#82969d;--text-quaternary:#667b83;--border-primary:#263740;--border-secondary:#334852;--hover-bg:#ffffff14;--active-bg:#ffffff1f;--shadow-sm:0 10px 24px #0000003d;--shadow-md:0 22px 52px #0000004d;--shadow-lg:0 36px 76px #0000005c;--font-mono:"SF Mono", "JetBrains Mono", "Cascadia Code", "Fira Code", monospace;--gradient-header:linear-gradient(135deg, #0b1419 0%, #101b22 58%, #0d171d 100%);--gradient-bg:linear-gradient(180deg, #0a1116 0%, #0d151b 56%, #091016 100%);--gradient-card:linear-gradient(145deg, #121b22fa 0%, #0c151bfa 100%);--primary-color:#18a058;--primary-color-soft:#18a05829;--brand-title-color:#37d08c}body{background:var(--bg-primary);color:var(--text-primary);margin:0;padding:0;font-family:SF Pro Display,SF Pro Text,Segoe UI Variable Display,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;transition:background-color .3s,color .3s}#app{background:var(--bg-primary);min-height:100vh}*{scrollbar-width:thin;scrollbar-color:#18a05847 transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:#18a05847;border-radius:3px;transition:background-color .2s}::-webkit-scrollbar-thumb:hover{background-color:#18a05880}[data-theme=dark] ::-webkit-scrollbar-thumb{background-color:#18a05866}[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background-color:#18a05899}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,I as t,It as n,Jt as r,N as o,Nt as i,Qt as a,Rt as s,Tt as l,Ut as d,Wt as c,Zt as u,gn as h,gt as m,hn as v,ht as b,jt as f,kt as p,qt as g,vn as w,w as y,y as z,yn as $,zt as x}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as S,F as k,G as C,H as E,M as B,N as F,Q as M,V as R,Z as H,b as O,dt as A,f as T,l as W,st as D,tt as N,z as P}from"./vue-vendor-BqZbbXHA.js";import{n as U,t as j}from"./use-lock-html-scroll-DXIqmUW4.js";import{J as L}from"./index-DnEocV0M.js";var I=S({name:"NDrawerContent",inheritAttrs:!1,props:{blockScroll:Boolean,show:{type:Boolean,default:void 0},displayDirective:{type:String,required:!0},placement:{type:String,required:!0},contentClass:String,contentStyle:[Object,String],nativeScrollbar:{type:Boolean,required:!0},scrollbarProps:Object,trapFocus:{type:Boolean,default:!0},autoFocus:{type:Boolean,default:!0},showMask:{type:[Boolean,String],required:!0},maxWidth:Number,maxHeight:Number,minWidth:Number,minHeight:Number,resizable:Boolean,onClickoutside:Function,onAfterLeave:Function,onAfterEnter:Function,onEsc:Function},setup(e){const n=D(!!e.show),o=D(null),i=F(r);let a=0,s="",l=null;const u=D(!1),h=D(!1),v=O(()=>"top"===e.placement||"bottom"===e.placement),{mergedClsPrefixRef:b,mergedRtlRef:f}=m(e),p=t("Drawer",f,b),w=S,{doUpdateHeight:y,doUpdateWidth:z}=i;function $(t){var n,r;if(h.value)if(v.value){let r=(null===(n=o.value)||void 0===n?void 0:n.offsetHeight)||0;const i=a-t.clientY;r+="bottom"===e.placement?i:-i,r=(t=>{const{maxHeight:n}=e;if(n&&t>n)return n;const{minHeight:r}=e;return r&&t<r?r:t})(r),y(r),a=t.clientY}else{let n=(null===(r=o.value)||void 0===r?void 0:r.offsetWidth)||0;const i=a-t.clientX;n+="right"===e.placement?i:-i,n=(t=>{const{maxWidth:n}=e;if(n&&t>n)return n;const{minWidth:r}=e;return r&&t<r?r:t})(n),z(n),a=t.clientX}}function S(){h.value&&(a=0,h.value=!1,document.body.style.cursor=s,document.body.removeEventListener("mousemove",$),document.body.removeEventListener("mouseup",S),document.body.removeEventListener("mouseleave",w))}M(()=>{e.show&&(n.value=!0)}),H(()=>e.show,e=>{e||S()}),P(()=>{S()});const k=O(()=>{const{show:t}=e,n=[[T,t]];return e.showMask||n.push([x,e.onClickoutside,void 0,{capture:!0}]),n});return j(O(()=>e.blockScroll&&n.value)),C(g,o),C(d,null),C(c,null),{bodyRef:o,rtlEnabled:p,mergedClsPrefix:i.mergedClsPrefixRef,isMounted:i.isMountedRef,mergedTheme:i.mergedThemeRef,displayed:n,transitionName:O(()=>({right:"slide-in-from-right-transition",left:"slide-in-from-left-transition",top:"slide-in-from-top-transition",bottom:"slide-in-from-bottom-transition"}[e.placement])),handleAfterLeave:function(){var t;n.value=!1,null===(t=e.onAfterLeave)||void 0===t||t.call(e)},bodyDirectives:k,handleMousedownResizeTrigger:e=>{h.value=!0,a=v.value?e.clientY:e.clientX,s=document.body.style.cursor,document.body.style.cursor=v.value?"ns-resize":"ew-resize",document.body.addEventListener("mousemove",$),document.body.addEventListener("mouseleave",w),document.body.addEventListener("mouseup",S)},handleMouseenterResizeTrigger:()=>{null!==l&&(window.clearTimeout(l),l=null),h.value?u.value=!0:l=window.setTimeout(()=>{u.value=!0},300)},handleMouseleaveResizeTrigger:()=>{null!==l&&(window.clearTimeout(l),l=null),u.value=!1},isDragging:h,isHoverOnResizeTrigger:u}},render(){const{$slots:e,mergedClsPrefix:t}=this;return"show"===this.displayDirective||this.displayed||this.show?N(B("div",{role:"none"},B(i,{disabled:!this.showMask||!this.trapFocus,active:this.show,autoFocus:this.autoFocus,onEsc:this.onEsc},{default:()=>B(W,{name:this.transitionName,appear:this.isMounted,onAfterEnter:this.onAfterEnter,onAfterLeave:this.handleAfterLeave},{default:()=>N(B("div",k(this.$attrs,{role:"dialog",ref:"bodyRef","aria-modal":"true",class:[`${t}-drawer`,this.rtlEnabled&&`${t}-drawer--rtl`,`${t}-drawer--${this.placement}-placement`,this.isDragging&&`${t}-drawer--unselectable`,this.nativeScrollbar&&`${t}-drawer--native-scrollbar`]}),[this.resizable?B("div",{class:[`${t}-drawer__resize-trigger`,(this.isDragging||this.isHoverOnResizeTrigger)&&`${t}-drawer__resize-trigger--hover`],onMouseenter:this.handleMouseenterResizeTrigger,onMouseleave:this.handleMouseleaveResizeTrigger,onMousedown:this.handleMousedownResizeTrigger}):null,this.nativeScrollbar?B("div",{class:[`${t}-drawer-content-wrapper`,this.contentClass],style:this.contentStyle,role:"none"},e):B(z,Object.assign({},this.scrollbarProps,{contentStyle:this.contentStyle,contentClass:[`${t}-drawer-content-wrapper`,this.contentClass],theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar}),e)]),this.bodyDirectives)})})),[[T,"if"===this.displayDirective||this.displayed||this.show]]):null}}),{cubicBezierEaseIn:X,cubicBezierEaseOut:Y}=e;var{cubicBezierEaseIn:_,cubicBezierEaseOut:q}=e;var{cubicBezierEaseIn:V,cubicBezierEaseOut:J}=e;var{cubicBezierEaseIn:Q,cubicBezierEaseOut:Z}=e;var G=v([h("drawer","\n word-break: break-word;\n line-height: var(--n-line-height);\n position: absolute;\n pointer-events: all;\n box-shadow: var(--n-box-shadow);\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n background-color: var(--n-color);\n color: var(--n-text-color);\n box-sizing: border-box;\n ",[function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-right"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${V}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${J}`}),v(`&.${n}-transition-enter-to`,{transform:"translateX(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateX(100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateX(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateX(100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-left"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${_}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${q}`}),v(`&.${n}-transition-enter-to`,{transform:"translateX(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateX(-100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateX(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateX(-100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-top"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${Q}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${Z}`}),v(`&.${n}-transition-enter-to`,{transform:"translateY(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateY(-100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateY(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateY(-100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-bottom"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${X}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${Y}`}),v(`&.${n}-transition-enter-to`,{transform:"translateY(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateY(100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateY(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateY(100%)"})]}(),$("unselectable","\n user-select: none; \n -webkit-user-select: none;\n "),$("native-scrollbar",[h("drawer-content-wrapper","\n overflow: auto;\n height: 100%;\n ")]),w("resize-trigger","\n position: absolute;\n background-color: #0000;\n transition: background-color .3s var(--n-bezier);\n ",[$("hover","\n background-color: var(--n-resize-trigger-color-hover);\n ")]),h("drawer-content-wrapper","\n box-sizing: border-box;\n "),h("drawer-content","\n height: 100%;\n display: flex;\n flex-direction: column;\n ",[$("native-scrollbar",[h("drawer-body-content-wrapper","\n height: 100%;\n overflow: auto;\n ")]),h("drawer-body","\n flex: 1 0 0;\n overflow: hidden;\n "),h("drawer-body-content-wrapper","\n box-sizing: border-box;\n padding: var(--n-body-padding);\n "),h("drawer-header","\n font-weight: var(--n-title-font-weight);\n line-height: 1;\n font-size: var(--n-title-font-size);\n color: var(--n-title-text-color);\n padding: var(--n-header-padding);\n transition: border .3s var(--n-bezier);\n border-bottom: 1px solid var(--n-divider-color);\n border-bottom: var(--n-header-border-bottom);\n display: flex;\n justify-content: space-between;\n align-items: center;\n ",[w("main","\n flex: 1;\n "),w("close","\n margin-left: 6px;\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n ")]),h("drawer-footer","\n display: flex;\n justify-content: flex-end;\n border-top: var(--n-footer-border-top);\n transition: border .3s var(--n-bezier);\n padding: var(--n-footer-padding);\n ")]),$("right-placement","\n top: 0;\n bottom: 0;\n right: 0;\n border-top-left-radius: var(--n-border-radius);\n border-bottom-left-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 3px;\n height: 100%;\n top: 0;\n left: 0;\n transform: translateX(-1.5px);\n cursor: ew-resize;\n ")]),$("left-placement","\n top: 0;\n bottom: 0;\n left: 0;\n border-top-right-radius: var(--n-border-radius);\n border-bottom-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 3px;\n height: 100%;\n top: 0;\n right: 0;\n transform: translateX(1.5px);\n cursor: ew-resize;\n ")]),$("top-placement","\n top: 0;\n left: 0;\n right: 0;\n border-bottom-left-radius: var(--n-border-radius);\n border-bottom-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 100%;\n height: 3px;\n bottom: 0;\n left: 0;\n transform: translateY(1.5px);\n cursor: ns-resize;\n ")]),$("bottom-placement","\n left: 0;\n bottom: 0;\n right: 0;\n border-top-left-radius: var(--n-border-radius);\n border-top-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 100%;\n height: 3px;\n top: 0;\n left: 0;\n transform: translateY(-1.5px);\n cursor: ns-resize;\n ")])]),v("body",[v(">",[h("drawer-container","\n position: fixed;\n ")])]),h("drawer-container","\n position: relative;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n pointer-events: none;\n ",[v("> *","\n pointer-events: all;\n ")]),h("drawer-mask","\n background-color: rgba(0, 0, 0, .3);\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n ",[$("invisible","\n background-color: rgba(0, 0, 0, 0)\n "),y({enterDuration:"0.2s",leaveDuration:"0.2s",enterCubicBezier:"var(--n-bezier-in)",leaveCubicBezier:"var(--n-bezier-out)"})])]),K=S({name:"Drawer",inheritAttrs:!1,props:Object.assign(Object.assign({},o.props),{show:Boolean,width:[Number,String],height:[Number,String],placement:{type:String,default:"right"},maskClosable:{type:Boolean,default:!0},showMask:{type:[Boolean,String],default:!0},to:[String,Object],displayDirective:{type:String,default:"if"},nativeScrollbar:{type:Boolean,default:!0},zIndex:Number,onMaskClick:Function,scrollbarProps:Object,contentClass:String,contentStyle:[Object,String],trapFocus:{type:Boolean,default:!0},onEsc:Function,autoFocus:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},blockScroll:{type:Boolean,default:!0},maxWidth:Number,maxHeight:Number,minWidth:Number,minHeight:Number,resizable:Boolean,defaultWidth:{type:[Number,String],default:251},defaultHeight:{type:[Number,String],default:251},onUpdateWidth:[Function,Array],onUpdateHeight:[Function,Array],"onUpdate:width":[Function,Array],"onUpdate:height":[Function,Array],"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],onAfterEnter:Function,onAfterLeave:Function,drawerStyle:[String,Object],drawerClass:String,target:null,onShow:Function,onHide:Function}),setup(e){const{mergedClsPrefixRef:t,namespaceRef:n,inlineThemeDisabled:i}=m(e),s=u(),d=o("Drawer","-drawer",G,L,e,t),c=D(e.defaultWidth),h=D(e.defaultHeight),v=a(A(e,"width"),c),g=a(A(e,"height"),h),w=O(()=>{const{placement:t}=e;return"top"===t||"bottom"===t?"":f(v.value)}),y=O(()=>{const{placement:t}=e;return"left"===t||"right"===t?"":f(g.value)}),z=O(()=>[{width:w.value,height:y.value},e.drawerStyle||""]);function $(t){const{onMaskClick:n,maskClosable:r}=e;r&&S(!1),n&&n(t)}const x=U();function S(t){const{onHide:n,onUpdateShow:r,"onUpdate:show":o}=e;r&&l(r,t),o&&l(o,t),n&&!t&&l(n,t)}C(r,{isMountedRef:s,mergedThemeRef:d,mergedClsPrefixRef:t,doUpdateShow:S,doUpdateHeight:t=>{const{onUpdateHeight:n,"onUpdate:width":r}=e;n&&l(n,t),r&&l(r,t),h.value=t},doUpdateWidth:t=>{const{onUpdateWidth:n,"onUpdate:width":r}=e;n&&l(n,t),r&&l(r,t),c.value=t}});const k=O(()=>{const{common:{cubicBezierEaseInOut:e,cubicBezierEaseIn:t,cubicBezierEaseOut:n},self:{color:r,textColor:o,boxShadow:i,lineHeight:a,headerPadding:s,footerPadding:l,borderRadius:c,bodyPadding:u,titleFontSize:h,titleTextColor:m,titleFontWeight:v,headerBorderBottom:b,footerBorderTop:f,closeIconColor:p,closeIconColorHover:g,closeIconColorPressed:w,closeColorHover:y,closeColorPressed:z,closeIconSize:$,closeSize:x,closeBorderRadius:S,resizableTriggerColorHover:k}}=d.value;return{"--n-line-height":a,"--n-color":r,"--n-border-radius":c,"--n-text-color":o,"--n-box-shadow":i,"--n-bezier":e,"--n-bezier-out":n,"--n-bezier-in":t,"--n-header-padding":s,"--n-body-padding":u,"--n-footer-padding":l,"--n-title-text-color":m,"--n-title-font-size":h,"--n-title-font-weight":v,"--n-header-border-bottom":b,"--n-footer-border-top":f,"--n-close-icon-color":p,"--n-close-icon-color-hover":g,"--n-close-icon-color-pressed":w,"--n-close-size":x,"--n-close-color-hover":y,"--n-close-color-pressed":z,"--n-close-icon-size":$,"--n-close-border-radius":S,"--n-resize-trigger-color-hover":k}}),E=i?b("drawer",void 0,k,e):void 0;return{mergedClsPrefix:t,namespace:n,mergedBodyStyle:z,handleOutsideClick:function(e){$(e)},handleMaskClick:$,handleEsc:function(t){var n;null===(n=e.onEsc)||void 0===n||n.call(e),e.show&&e.closeOnEsc&&p(t)&&(x.value||S(!1))},mergedTheme:d,cssVars:i?void 0:k,themeClass:null==E?void 0:E.themeClass,onRender:null==E?void 0:E.onRender,isMounted:s}},render(){const{mergedClsPrefix:e}=this;return B(n,{to:this.to,show:this.show},{default:()=>{var t;return null===(t=this.onRender)||void 0===t||t.call(this),N(B("div",{class:[`${e}-drawer-container`,this.namespace,this.themeClass],style:this.cssVars,role:"none"},this.showMask?B(W,{name:"fade-in-transition",appear:this.isMounted},{default:()=>this.show?B("div",{"aria-hidden":!0,class:[`${e}-drawer-mask`,"transparent"===this.showMask&&`${e}-drawer-mask--invisible`],onClick:this.handleMaskClick}):null}):null,B(I,Object.assign({},this.$attrs,{class:[this.drawerClass,this.$attrs.class],style:[this.mergedBodyStyle,this.$attrs.style],blockScroll:this.blockScroll,contentStyle:this.contentStyle,contentClass:this.contentClass,placement:this.placement,scrollbarProps:this.scrollbarProps,show:this.show,displayDirective:this.displayDirective,nativeScrollbar:this.nativeScrollbar,onAfterEnter:this.onAfterEnter,onAfterLeave:this.onAfterLeave,trapFocus:this.trapFocus,autoFocus:this.autoFocus,resizable:this.resizable,maxHeight:this.maxHeight,minHeight:this.minHeight,maxWidth:this.maxWidth,minWidth:this.minWidth,showMask:this.showMask,onEsc:this.handleEsc,onClickoutside:this.handleOutsideClick}),this.$slots)),[[s,{zIndex:this.zIndex,enabled:this.show}]])}})}});function ee(e=520,t=null){const n=D("undefined"!=typeof window?window.innerWidth:1200),r=()=>{n.value=window.innerWidth};R(()=>{window.addEventListener("resize",r)}),E(()=>{window.removeEventListener("resize",r)});const o=O(()=>n.value<640),i=O(()=>n.value>=640&&n.value<1024);return{drawerWidth:O(()=>{if(n.value<640)return"100%";if(n.value<768)return Math.min(.95*n.value,e);if(n.value<1024){const r=t||e;return Math.min(.85*n.value,r)}return e}),isMobile:o,isTablet:i,windowWidth:n}}export{K as n,ee as t};
|
|
1
|
+
import{F as e,I as t,It as n,Jt as r,N as o,Nt as i,Qt as a,Rt as s,Tt as l,Ut as d,Wt as c,Zt as u,gn as h,gt as m,hn as v,ht as b,jt as f,kt as p,qt as g,vn as w,w as y,y as z,yn as $,zt as x}from"./_plugin-vue_export-helper-BeLZJZij.js";import{A as S,F as k,G as C,H as E,M as B,N as F,Q as M,V as R,Z as H,b as O,dt as A,f as T,l as W,st as D,tt as N,z as P}from"./vue-vendor-BqZbbXHA.js";import{n as U,t as j}from"./use-lock-html-scroll-DXIqmUW4.js";import{J as L}from"./index-BMAUPq5K.js";var I=S({name:"NDrawerContent",inheritAttrs:!1,props:{blockScroll:Boolean,show:{type:Boolean,default:void 0},displayDirective:{type:String,required:!0},placement:{type:String,required:!0},contentClass:String,contentStyle:[Object,String],nativeScrollbar:{type:Boolean,required:!0},scrollbarProps:Object,trapFocus:{type:Boolean,default:!0},autoFocus:{type:Boolean,default:!0},showMask:{type:[Boolean,String],required:!0},maxWidth:Number,maxHeight:Number,minWidth:Number,minHeight:Number,resizable:Boolean,onClickoutside:Function,onAfterLeave:Function,onAfterEnter:Function,onEsc:Function},setup(e){const n=D(!!e.show),o=D(null),i=F(r);let a=0,s="",l=null;const u=D(!1),h=D(!1),v=O(()=>"top"===e.placement||"bottom"===e.placement),{mergedClsPrefixRef:b,mergedRtlRef:f}=m(e),p=t("Drawer",f,b),w=S,{doUpdateHeight:y,doUpdateWidth:z}=i;function $(t){var n,r;if(h.value)if(v.value){let r=(null===(n=o.value)||void 0===n?void 0:n.offsetHeight)||0;const i=a-t.clientY;r+="bottom"===e.placement?i:-i,r=(t=>{const{maxHeight:n}=e;if(n&&t>n)return n;const{minHeight:r}=e;return r&&t<r?r:t})(r),y(r),a=t.clientY}else{let n=(null===(r=o.value)||void 0===r?void 0:r.offsetWidth)||0;const i=a-t.clientX;n+="right"===e.placement?i:-i,n=(t=>{const{maxWidth:n}=e;if(n&&t>n)return n;const{minWidth:r}=e;return r&&t<r?r:t})(n),z(n),a=t.clientX}}function S(){h.value&&(a=0,h.value=!1,document.body.style.cursor=s,document.body.removeEventListener("mousemove",$),document.body.removeEventListener("mouseup",S),document.body.removeEventListener("mouseleave",w))}M(()=>{e.show&&(n.value=!0)}),H(()=>e.show,e=>{e||S()}),P(()=>{S()});const k=O(()=>{const{show:t}=e,n=[[T,t]];return e.showMask||n.push([x,e.onClickoutside,void 0,{capture:!0}]),n});return j(O(()=>e.blockScroll&&n.value)),C(g,o),C(d,null),C(c,null),{bodyRef:o,rtlEnabled:p,mergedClsPrefix:i.mergedClsPrefixRef,isMounted:i.isMountedRef,mergedTheme:i.mergedThemeRef,displayed:n,transitionName:O(()=>({right:"slide-in-from-right-transition",left:"slide-in-from-left-transition",top:"slide-in-from-top-transition",bottom:"slide-in-from-bottom-transition"}[e.placement])),handleAfterLeave:function(){var t;n.value=!1,null===(t=e.onAfterLeave)||void 0===t||t.call(e)},bodyDirectives:k,handleMousedownResizeTrigger:e=>{h.value=!0,a=v.value?e.clientY:e.clientX,s=document.body.style.cursor,document.body.style.cursor=v.value?"ns-resize":"ew-resize",document.body.addEventListener("mousemove",$),document.body.addEventListener("mouseleave",w),document.body.addEventListener("mouseup",S)},handleMouseenterResizeTrigger:()=>{null!==l&&(window.clearTimeout(l),l=null),h.value?u.value=!0:l=window.setTimeout(()=>{u.value=!0},300)},handleMouseleaveResizeTrigger:()=>{null!==l&&(window.clearTimeout(l),l=null),u.value=!1},isDragging:h,isHoverOnResizeTrigger:u}},render(){const{$slots:e,mergedClsPrefix:t}=this;return"show"===this.displayDirective||this.displayed||this.show?N(B("div",{role:"none"},B(i,{disabled:!this.showMask||!this.trapFocus,active:this.show,autoFocus:this.autoFocus,onEsc:this.onEsc},{default:()=>B(W,{name:this.transitionName,appear:this.isMounted,onAfterEnter:this.onAfterEnter,onAfterLeave:this.handleAfterLeave},{default:()=>N(B("div",k(this.$attrs,{role:"dialog",ref:"bodyRef","aria-modal":"true",class:[`${t}-drawer`,this.rtlEnabled&&`${t}-drawer--rtl`,`${t}-drawer--${this.placement}-placement`,this.isDragging&&`${t}-drawer--unselectable`,this.nativeScrollbar&&`${t}-drawer--native-scrollbar`]}),[this.resizable?B("div",{class:[`${t}-drawer__resize-trigger`,(this.isDragging||this.isHoverOnResizeTrigger)&&`${t}-drawer__resize-trigger--hover`],onMouseenter:this.handleMouseenterResizeTrigger,onMouseleave:this.handleMouseleaveResizeTrigger,onMousedown:this.handleMousedownResizeTrigger}):null,this.nativeScrollbar?B("div",{class:[`${t}-drawer-content-wrapper`,this.contentClass],style:this.contentStyle,role:"none"},e):B(z,Object.assign({},this.scrollbarProps,{contentStyle:this.contentStyle,contentClass:[`${t}-drawer-content-wrapper`,this.contentClass],theme:this.mergedTheme.peers.Scrollbar,themeOverrides:this.mergedTheme.peerOverrides.Scrollbar}),e)]),this.bodyDirectives)})})),[[T,"if"===this.displayDirective||this.displayed||this.show]]):null}}),{cubicBezierEaseIn:X,cubicBezierEaseOut:Y}=e;var{cubicBezierEaseIn:_,cubicBezierEaseOut:q}=e;var{cubicBezierEaseIn:V,cubicBezierEaseOut:J}=e;var{cubicBezierEaseIn:Q,cubicBezierEaseOut:Z}=e;var G=v([h("drawer","\n word-break: break-word;\n line-height: var(--n-line-height);\n position: absolute;\n pointer-events: all;\n box-shadow: var(--n-box-shadow);\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n background-color: var(--n-color);\n color: var(--n-text-color);\n box-sizing: border-box;\n ",[function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-right"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${V}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${J}`}),v(`&.${n}-transition-enter-to`,{transform:"translateX(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateX(100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateX(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateX(100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-left"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${_}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${q}`}),v(`&.${n}-transition-enter-to`,{transform:"translateX(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateX(-100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateX(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateX(-100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-top"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${Q}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${Z}`}),v(`&.${n}-transition-enter-to`,{transform:"translateY(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateY(-100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateY(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateY(-100%)"})]}(),function({duration:e="0.3s",leaveDuration:t="0.2s",name:n="slide-in-from-bottom"}={}){return[v(`&.${n}-transition-leave-active`,{transition:`transform ${t} ${X}`}),v(`&.${n}-transition-enter-active`,{transition:`transform ${e} ${Y}`}),v(`&.${n}-transition-enter-to`,{transform:"translateY(0)"}),v(`&.${n}-transition-enter-from`,{transform:"translateY(100%)"}),v(`&.${n}-transition-leave-from`,{transform:"translateY(0)"}),v(`&.${n}-transition-leave-to`,{transform:"translateY(100%)"})]}(),$("unselectable","\n user-select: none; \n -webkit-user-select: none;\n "),$("native-scrollbar",[h("drawer-content-wrapper","\n overflow: auto;\n height: 100%;\n ")]),w("resize-trigger","\n position: absolute;\n background-color: #0000;\n transition: background-color .3s var(--n-bezier);\n ",[$("hover","\n background-color: var(--n-resize-trigger-color-hover);\n ")]),h("drawer-content-wrapper","\n box-sizing: border-box;\n "),h("drawer-content","\n height: 100%;\n display: flex;\n flex-direction: column;\n ",[$("native-scrollbar",[h("drawer-body-content-wrapper","\n height: 100%;\n overflow: auto;\n ")]),h("drawer-body","\n flex: 1 0 0;\n overflow: hidden;\n "),h("drawer-body-content-wrapper","\n box-sizing: border-box;\n padding: var(--n-body-padding);\n "),h("drawer-header","\n font-weight: var(--n-title-font-weight);\n line-height: 1;\n font-size: var(--n-title-font-size);\n color: var(--n-title-text-color);\n padding: var(--n-header-padding);\n transition: border .3s var(--n-bezier);\n border-bottom: 1px solid var(--n-divider-color);\n border-bottom: var(--n-header-border-bottom);\n display: flex;\n justify-content: space-between;\n align-items: center;\n ",[w("main","\n flex: 1;\n "),w("close","\n margin-left: 6px;\n transition:\n background-color .3s var(--n-bezier),\n color .3s var(--n-bezier);\n ")]),h("drawer-footer","\n display: flex;\n justify-content: flex-end;\n border-top: var(--n-footer-border-top);\n transition: border .3s var(--n-bezier);\n padding: var(--n-footer-padding);\n ")]),$("right-placement","\n top: 0;\n bottom: 0;\n right: 0;\n border-top-left-radius: var(--n-border-radius);\n border-bottom-left-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 3px;\n height: 100%;\n top: 0;\n left: 0;\n transform: translateX(-1.5px);\n cursor: ew-resize;\n ")]),$("left-placement","\n top: 0;\n bottom: 0;\n left: 0;\n border-top-right-radius: var(--n-border-radius);\n border-bottom-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 3px;\n height: 100%;\n top: 0;\n right: 0;\n transform: translateX(1.5px);\n cursor: ew-resize;\n ")]),$("top-placement","\n top: 0;\n left: 0;\n right: 0;\n border-bottom-left-radius: var(--n-border-radius);\n border-bottom-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 100%;\n height: 3px;\n bottom: 0;\n left: 0;\n transform: translateY(1.5px);\n cursor: ns-resize;\n ")]),$("bottom-placement","\n left: 0;\n bottom: 0;\n right: 0;\n border-top-left-radius: var(--n-border-radius);\n border-top-right-radius: var(--n-border-radius);\n ",[w("resize-trigger","\n width: 100%;\n height: 3px;\n top: 0;\n left: 0;\n transform: translateY(-1.5px);\n cursor: ns-resize;\n ")])]),v("body",[v(">",[h("drawer-container","\n position: fixed;\n ")])]),h("drawer-container","\n position: relative;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n pointer-events: none;\n ",[v("> *","\n pointer-events: all;\n ")]),h("drawer-mask","\n background-color: rgba(0, 0, 0, .3);\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n ",[$("invisible","\n background-color: rgba(0, 0, 0, 0)\n "),y({enterDuration:"0.2s",leaveDuration:"0.2s",enterCubicBezier:"var(--n-bezier-in)",leaveCubicBezier:"var(--n-bezier-out)"})])]),K=S({name:"Drawer",inheritAttrs:!1,props:Object.assign(Object.assign({},o.props),{show:Boolean,width:[Number,String],height:[Number,String],placement:{type:String,default:"right"},maskClosable:{type:Boolean,default:!0},showMask:{type:[Boolean,String],default:!0},to:[String,Object],displayDirective:{type:String,default:"if"},nativeScrollbar:{type:Boolean,default:!0},zIndex:Number,onMaskClick:Function,scrollbarProps:Object,contentClass:String,contentStyle:[Object,String],trapFocus:{type:Boolean,default:!0},onEsc:Function,autoFocus:{type:Boolean,default:!0},closeOnEsc:{type:Boolean,default:!0},blockScroll:{type:Boolean,default:!0},maxWidth:Number,maxHeight:Number,minWidth:Number,minHeight:Number,resizable:Boolean,defaultWidth:{type:[Number,String],default:251},defaultHeight:{type:[Number,String],default:251},onUpdateWidth:[Function,Array],onUpdateHeight:[Function,Array],"onUpdate:width":[Function,Array],"onUpdate:height":[Function,Array],"onUpdate:show":[Function,Array],onUpdateShow:[Function,Array],onAfterEnter:Function,onAfterLeave:Function,drawerStyle:[String,Object],drawerClass:String,target:null,onShow:Function,onHide:Function}),setup(e){const{mergedClsPrefixRef:t,namespaceRef:n,inlineThemeDisabled:i}=m(e),s=u(),d=o("Drawer","-drawer",G,L,e,t),c=D(e.defaultWidth),h=D(e.defaultHeight),v=a(A(e,"width"),c),g=a(A(e,"height"),h),w=O(()=>{const{placement:t}=e;return"top"===t||"bottom"===t?"":f(v.value)}),y=O(()=>{const{placement:t}=e;return"left"===t||"right"===t?"":f(g.value)}),z=O(()=>[{width:w.value,height:y.value},e.drawerStyle||""]);function $(t){const{onMaskClick:n,maskClosable:r}=e;r&&S(!1),n&&n(t)}const x=U();function S(t){const{onHide:n,onUpdateShow:r,"onUpdate:show":o}=e;r&&l(r,t),o&&l(o,t),n&&!t&&l(n,t)}C(r,{isMountedRef:s,mergedThemeRef:d,mergedClsPrefixRef:t,doUpdateShow:S,doUpdateHeight:t=>{const{onUpdateHeight:n,"onUpdate:width":r}=e;n&&l(n,t),r&&l(r,t),h.value=t},doUpdateWidth:t=>{const{onUpdateWidth:n,"onUpdate:width":r}=e;n&&l(n,t),r&&l(r,t),c.value=t}});const k=O(()=>{const{common:{cubicBezierEaseInOut:e,cubicBezierEaseIn:t,cubicBezierEaseOut:n},self:{color:r,textColor:o,boxShadow:i,lineHeight:a,headerPadding:s,footerPadding:l,borderRadius:c,bodyPadding:u,titleFontSize:h,titleTextColor:m,titleFontWeight:v,headerBorderBottom:b,footerBorderTop:f,closeIconColor:p,closeIconColorHover:g,closeIconColorPressed:w,closeColorHover:y,closeColorPressed:z,closeIconSize:$,closeSize:x,closeBorderRadius:S,resizableTriggerColorHover:k}}=d.value;return{"--n-line-height":a,"--n-color":r,"--n-border-radius":c,"--n-text-color":o,"--n-box-shadow":i,"--n-bezier":e,"--n-bezier-out":n,"--n-bezier-in":t,"--n-header-padding":s,"--n-body-padding":u,"--n-footer-padding":l,"--n-title-text-color":m,"--n-title-font-size":h,"--n-title-font-weight":v,"--n-header-border-bottom":b,"--n-footer-border-top":f,"--n-close-icon-color":p,"--n-close-icon-color-hover":g,"--n-close-icon-color-pressed":w,"--n-close-size":x,"--n-close-color-hover":y,"--n-close-color-pressed":z,"--n-close-icon-size":$,"--n-close-border-radius":S,"--n-resize-trigger-color-hover":k}}),E=i?b("drawer",void 0,k,e):void 0;return{mergedClsPrefix:t,namespace:n,mergedBodyStyle:z,handleOutsideClick:function(e){$(e)},handleMaskClick:$,handleEsc:function(t){var n;null===(n=e.onEsc)||void 0===n||n.call(e),e.show&&e.closeOnEsc&&p(t)&&(x.value||S(!1))},mergedTheme:d,cssVars:i?void 0:k,themeClass:null==E?void 0:E.themeClass,onRender:null==E?void 0:E.onRender,isMounted:s}},render(){const{mergedClsPrefix:e}=this;return B(n,{to:this.to,show:this.show},{default:()=>{var t;return null===(t=this.onRender)||void 0===t||t.call(this),N(B("div",{class:[`${e}-drawer-container`,this.namespace,this.themeClass],style:this.cssVars,role:"none"},this.showMask?B(W,{name:"fade-in-transition",appear:this.isMounted},{default:()=>this.show?B("div",{"aria-hidden":!0,class:[`${e}-drawer-mask`,"transparent"===this.showMask&&`${e}-drawer-mask--invisible`],onClick:this.handleMaskClick}):null}):null,B(I,Object.assign({},this.$attrs,{class:[this.drawerClass,this.$attrs.class],style:[this.mergedBodyStyle,this.$attrs.style],blockScroll:this.blockScroll,contentStyle:this.contentStyle,contentClass:this.contentClass,placement:this.placement,scrollbarProps:this.scrollbarProps,show:this.show,displayDirective:this.displayDirective,nativeScrollbar:this.nativeScrollbar,onAfterEnter:this.onAfterEnter,onAfterLeave:this.onAfterLeave,trapFocus:this.trapFocus,autoFocus:this.autoFocus,resizable:this.resizable,maxHeight:this.maxHeight,minHeight:this.minHeight,maxWidth:this.maxWidth,minWidth:this.minWidth,showMask:this.showMask,onEsc:this.handleEsc,onClickoutside:this.handleOutsideClick}),this.$slots)),[[s,{zIndex:this.zIndex,enabled:this.show}]])}})}});function ee(e=520,t=null){const n=D("undefined"!=typeof window?window.innerWidth:1200),r=()=>{n.value=window.innerWidth};R(()=>{window.addEventListener("resize",r)}),E(()=>{window.removeEventListener("resize",r)});const o=O(()=>n.value<640),i=O(()=>n.value>=640&&n.value<1024);return{drawerWidth:O(()=>{if(n.value<640)return"100%";if(n.value<768)return Math.min(.95*n.value,e);if(n.value<1024){const r=t||e;return Math.min(.85*n.value,r)}return e}),isMobile:o,isTablet:i,windowWidth:n}}export{K as n,ee as t};
|
package/dist/web/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" href="/favicon.ico">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
7
|
<title>coding-tool-x · AI 编程工作台</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-BMAUPq5K.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/vue-vendor-BqZbbXHA.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-BeLZJZij.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/vendors-D0c_0KLP.js">
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/use-message-DoLM8C1C.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/use-lock-html-scroll-DXIqmUW4.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/light-Cp0t7v32.js">
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Bi1MQHYX.css">
|
|
20
20
|
</head>
|
|
21
21
|
<body>
|
|
22
22
|
<div id="app"></div>
|
package/package.json
CHANGED
package/src/commands/daemon.js
CHANGED
|
@@ -382,11 +382,18 @@ async function stopAllManagedInstances(existingProcess, config = loadConfig()) {
|
|
|
382
382
|
}
|
|
383
383
|
|
|
384
384
|
const cleanup = await cleanupManagedPorts(config, { timeoutMs: 3000 });
|
|
385
|
+
let lockCleanup = { removed: [], retained: [] };
|
|
386
|
+
try {
|
|
387
|
+
lockCleanup = require('../server/services/session-history-index').cleanupStaleInventoryLocks();
|
|
388
|
+
} catch (error) {
|
|
389
|
+
warnings.push(`清理 session-history 锁失败: ${error.message}`);
|
|
390
|
+
}
|
|
385
391
|
|
|
386
392
|
return {
|
|
387
393
|
hadPM2Process,
|
|
388
394
|
pm2Status: status,
|
|
389
395
|
cleanup,
|
|
396
|
+
lockCleanup,
|
|
390
397
|
warnings
|
|
391
398
|
};
|
|
392
399
|
}
|
|
@@ -409,6 +416,9 @@ function printStopResult(result) {
|
|
|
409
416
|
printPortToolIssue(cleanup.toolIssue);
|
|
410
417
|
console.log(chalk.yellow('[TIP] 请检查是否有外部进程仍占用这些端口\n'));
|
|
411
418
|
}
|
|
419
|
+
if (cleanup.lockCleanup?.removed?.length > 0) {
|
|
420
|
+
console.log(chalk.gray(`[CLEANUP] 已清理残留 session-history 锁: ${cleanup.lockCleanup.removed.length}`));
|
|
421
|
+
}
|
|
412
422
|
warnings.forEach((warning) => {
|
|
413
423
|
console.log(chalk.yellow(`[WARN] ${warning}`));
|
|
414
424
|
});
|
|
@@ -114,16 +114,19 @@ function scanOmp() {
|
|
|
114
114
|
const adapters = Object.freeze({
|
|
115
115
|
claude: {
|
|
116
116
|
scan: () => scanNative('claude'),
|
|
117
|
+
usage: (ref) => oauthStore.fetchCredentialUsage('claude', ref.credentialId),
|
|
117
118
|
quota: (ref) => oauthStore.fetchCredentialUsage('claude', ref.credentialId),
|
|
118
119
|
channelServicePath: './drivers/claude/channels-implementation'
|
|
119
120
|
},
|
|
120
121
|
codex: {
|
|
121
122
|
scan: () => scanNative('codex'),
|
|
123
|
+
usage: (ref) => oauthStore.fetchCredentialUsage('codex', ref.credentialId),
|
|
122
124
|
quota: (ref) => oauthStore.fetchCredentialUsage('codex', ref.credentialId),
|
|
123
125
|
channelServicePath: './drivers/codex/channels-implementation'
|
|
124
126
|
},
|
|
125
127
|
gemini: {
|
|
126
128
|
scan: () => scanNative('gemini'),
|
|
129
|
+
usage: (ref) => oauthStore.fetchCredentialUsage('gemini', ref.credentialId),
|
|
127
130
|
quota: (ref) => oauthStore.fetchCredentialUsage('gemini', ref.credentialId),
|
|
128
131
|
channelServicePath: './drivers/gemini/channels-implementation'
|
|
129
132
|
},
|
|
@@ -15,14 +15,38 @@ function matchChannel(channel, candidate) {
|
|
|
15
15
|
if (!channel || channel.authMode !== 'oauth') return false;
|
|
16
16
|
const ref = safeRef(channel.authRef);
|
|
17
17
|
const next = safeRef(candidate.authRef);
|
|
18
|
-
if (ref.credentialId && next.credentialId
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
if (ref.credentialId && next.credentialId && ref.credentialId === next.credentialId) return true;
|
|
19
|
+
if ((ref.accountId || ref.identityKey) && (next.accountId || next.identityKey)) {
|
|
20
|
+
const sameProvider = !ref.providerId || !next.providerId || ref.providerId === next.providerId;
|
|
21
|
+
return sameProvider && (ref.accountId || ref.identityKey) === (next.accountId || next.identityKey);
|
|
22
22
|
}
|
|
23
|
+
if (ref.accountEmail && next.accountEmail) return ref.accountEmail === next.accountEmail;
|
|
23
24
|
return false;
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
function resolveChannelAuthRef(adapter, channel) {
|
|
28
|
+
const current = safeRef(channel?.authRef);
|
|
29
|
+
let scanned;
|
|
30
|
+
try {
|
|
31
|
+
scanned = adapter.scan();
|
|
32
|
+
} catch {
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const candidates = Array.isArray(scanned?.candidates) ? scanned.candidates : [];
|
|
37
|
+
const matched = candidates.find(candidate => matchChannel(channel, candidate));
|
|
38
|
+
if (matched) return safeRef(matched.authRef);
|
|
39
|
+
|
|
40
|
+
// A channel created before OAuth credentials were synced can have no stable
|
|
41
|
+
// reference. Only auto-select when the local scan found exactly one account.
|
|
42
|
+
if (!current.credentialId && !current.providerId && !current.accountId
|
|
43
|
+
&& !current.identityKey && !current.accountEmail && candidates.length === 1) {
|
|
44
|
+
return safeRef(candidates[0].authRef);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return current;
|
|
48
|
+
}
|
|
49
|
+
|
|
26
50
|
function getChannel(platform, channelId) {
|
|
27
51
|
if (!channelId) return null;
|
|
28
52
|
const adapter = getAdapter(platform);
|
|
@@ -51,12 +75,12 @@ async function fetchChannelAuthQuota(platform, channelId, { refresh = false } =
|
|
|
51
75
|
const channel = getChannel(platform, channelId);
|
|
52
76
|
if (!channel) return { quota: null, status: 'unavailable', checkedAt: checkedAt(), warning: 'Channel not found' };
|
|
53
77
|
if (channel.authMode !== 'oauth') return { quota: null, status: 'unsupported', checkedAt: checkedAt(), warning: 'Channel is not OAuth' };
|
|
54
|
-
const ref =
|
|
55
|
-
const cacheKey = `${adapter.adapterId}:${ref.credentialId || ref.providerId}:${ref.accountId || ref.identityKey}`;
|
|
78
|
+
const ref = resolveChannelAuthRef(adapter, channel);
|
|
79
|
+
const cacheKey = `${adapter.adapterId}:${channelId}:${ref.credentialId || ref.providerId}:${ref.accountId || ref.identityKey || ref.accountEmail}`;
|
|
56
80
|
const cached = quotaCache.get(cacheKey);
|
|
57
81
|
if (!refresh && cached && Date.now() - cached.checkedAtMs < QUOTA_TTL_MS) return cached.value;
|
|
58
82
|
try {
|
|
59
|
-
const usage = await adapter.quota(ref);
|
|
83
|
+
const usage = await (adapter.usage || adapter.quota)(ref);
|
|
60
84
|
const result = {
|
|
61
85
|
...(usage?.quota ? usage : {
|
|
62
86
|
quota: null,
|
|
@@ -78,5 +102,6 @@ module.exports = {
|
|
|
78
102
|
fetchChannelAuthQuota,
|
|
79
103
|
listChannelAuthPlatforms,
|
|
80
104
|
safeRef,
|
|
81
|
-
matchChannel
|
|
105
|
+
matchChannel,
|
|
106
|
+
resolveChannelAuthRef
|
|
82
107
|
};
|
|
@@ -321,12 +321,22 @@ function parseCodexAuthPayload(raw) {
|
|
|
321
321
|
const idTokenPayload = decodeJwtPayload(tokens.id_token);
|
|
322
322
|
const accessTokenPayload = decodeJwtPayload(tokens.access_token);
|
|
323
323
|
const exp = Number(idTokenPayload?.exp || accessTokenPayload?.exp || 0) || null;
|
|
324
|
+
const accountId = tokens.account_id
|
|
325
|
+
|| idTokenPayload?.chatgpt_account_id
|
|
326
|
+
|| accessTokenPayload?.chatgpt_account_id
|
|
327
|
+
|| idTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
|
|
328
|
+
|| accessTokenPayload?.['https://api.openai.com/auth.chatgpt_account_id']
|
|
329
|
+
|| idTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
|
|
330
|
+
|| accessTokenPayload?.['https://api.openai.com/auth']?.chatgpt_account_id
|
|
331
|
+
|| idTokenPayload?.organizations?.[0]?.id
|
|
332
|
+
|| accessTokenPayload?.organizations?.[0]?.id
|
|
333
|
+
|| '';
|
|
324
334
|
return {
|
|
325
335
|
authMode: String(auth.auth_mode || 'chatgpt').trim() || 'chatgpt',
|
|
326
336
|
accessToken: String(tokens.access_token || '').trim(),
|
|
327
337
|
refreshToken: String(tokens.refresh_token || '').trim() || '',
|
|
328
338
|
idToken: String(tokens.id_token || '').trim() || '',
|
|
329
|
-
accountId: String(
|
|
339
|
+
accountId: String(accountId).trim(),
|
|
330
340
|
accountEmail: String(idTokenPayload?.email || '').trim() || '',
|
|
331
341
|
expiresAt: exp ? exp * 1000 : null,
|
|
332
342
|
lastRefresh: auth.last_refresh || null,
|
|
@@ -393,6 +393,20 @@ function createHttpsProxyAgent(proxyUrl) {
|
|
|
393
393
|
const REMOTE_PROVIDERS = ${JSON.stringify(enabledProviders)}
|
|
394
394
|
const CONFIG_FILE = ${JSON.stringify(PATHS.configFile)}
|
|
395
395
|
|
|
396
|
+
function isCliPlatformEnabled(source) {
|
|
397
|
+
try {
|
|
398
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'))
|
|
399
|
+
const configuredPlatforms = config?.enabledCliPlatforms
|
|
400
|
+
if (!Array.isArray(configuredPlatforms)) return true
|
|
401
|
+
const normalizedSource = String(source || '').trim().toLowerCase()
|
|
402
|
+
return configuredPlatforms.some((platform) => (
|
|
403
|
+
String(platform || '').trim().toLowerCase() === normalizedSource
|
|
404
|
+
))
|
|
405
|
+
} catch (error) {
|
|
406
|
+
return true
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
396
410
|
function createClientId(prefix = 'coding-tool') {
|
|
397
411
|
const randomPart = typeof crypto.randomUUID === 'function'
|
|
398
412
|
? crypto.randomUUID().replace(/-/g, '').slice(0, 16)
|
|
@@ -826,6 +840,7 @@ async function sendRemoteNotifications(message, source, eventType) {
|
|
|
826
840
|
|
|
827
841
|
(async () => {
|
|
828
842
|
const source = readArg('--source') || 'claude'
|
|
843
|
+
if (!isCliPlatformEnabled(source)) return
|
|
829
844
|
const mode = readArg('--mode') || readArg('--cc-notify-type') || 'notification'
|
|
830
845
|
const eventType = readArg('--event-type') || ''
|
|
831
846
|
const payload = readOptionalPayload()
|
|
@@ -1085,6 +1100,27 @@ function getHookPlatformEntries(catalog = getPlatformCatalog()) {
|
|
|
1085
1100
|
return entries;
|
|
1086
1101
|
}
|
|
1087
1102
|
|
|
1103
|
+
function getChannelPlatformKeys(catalog = getPlatformCatalog()) {
|
|
1104
|
+
const manifests = typeof catalog?.list === 'function'
|
|
1105
|
+
? catalog.list({ capability: 'channels' })
|
|
1106
|
+
: [];
|
|
1107
|
+
return new Set(manifests
|
|
1108
|
+
.map(manifest => String(manifest?.key || '').trim().toLowerCase())
|
|
1109
|
+
.filter(Boolean));
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
function isConfiguredCliPlatformEnabled(key, uiConfig, catalog) {
|
|
1113
|
+
const channelPlatformKeys = getChannelPlatformKeys(catalog);
|
|
1114
|
+
const normalizedKey = String(key || '').trim().toLowerCase();
|
|
1115
|
+
if (!channelPlatformKeys.has(normalizedKey)) return true;
|
|
1116
|
+
|
|
1117
|
+
const configuredPlatforms = uiConfig?.enabledCliPlatforms;
|
|
1118
|
+
if (!Array.isArray(configuredPlatforms)) return true;
|
|
1119
|
+
return configuredPlatforms.some(platform => (
|
|
1120
|
+
String(platform || '').trim().toLowerCase() === normalizedKey
|
|
1121
|
+
));
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1088
1124
|
function toPublicHookDefinition({ manifest, definition }) {
|
|
1089
1125
|
return {
|
|
1090
1126
|
key: manifest.key,
|
|
@@ -1097,13 +1133,21 @@ function toPublicHookDefinition({ manifest, definition }) {
|
|
|
1097
1133
|
}
|
|
1098
1134
|
|
|
1099
1135
|
function getNotificationSettings({ catalog } = {}) {
|
|
1100
|
-
const
|
|
1136
|
+
const resolvedCatalog = catalog || getPlatformCatalog();
|
|
1137
|
+
const entries = getHookPlatformEntries(resolvedCatalog);
|
|
1101
1138
|
const uiConfig = loadUIConfig();
|
|
1102
1139
|
const remoteNotifications = getRemoteNotificationsConfig(uiConfig);
|
|
1103
1140
|
const platforms = {};
|
|
1104
1141
|
const platformDefinitions = [];
|
|
1105
1142
|
for (const entry of entries) {
|
|
1106
|
-
|
|
1143
|
+
const hooks = entry.driver.getHooks();
|
|
1144
|
+
platforms[entry.manifest.key] = isConfiguredCliPlatformEnabled(
|
|
1145
|
+
entry.manifest.key,
|
|
1146
|
+
uiConfig,
|
|
1147
|
+
resolvedCatalog
|
|
1148
|
+
)
|
|
1149
|
+
? hooks
|
|
1150
|
+
: { ...hooks, enabled: false };
|
|
1107
1151
|
platformDefinitions.push(toPublicHookDefinition(entry));
|
|
1108
1152
|
}
|
|
1109
1153
|
const claudeStatus = platforms.claude || { enabled: false, type: 'notification' };
|
|
@@ -1186,7 +1230,9 @@ function saveNotificationSettings(input = {}, { catalog } = {}) {
|
|
|
1186
1230
|
? input.remoteNotifications
|
|
1187
1231
|
: {}
|
|
1188
1232
|
);
|
|
1189
|
-
const
|
|
1233
|
+
const resolvedCatalog = catalog || getPlatformCatalog();
|
|
1234
|
+
const entries = getHookPlatformEntries(resolvedCatalog);
|
|
1235
|
+
const uiConfig = loadUIConfig();
|
|
1190
1236
|
const inputPlatforms = input.platforms && typeof input.platforms === 'object' && !Array.isArray(input.platforms)
|
|
1191
1237
|
? input.platforms
|
|
1192
1238
|
: {};
|
|
@@ -1199,7 +1245,10 @@ function saveNotificationSettings(input = {}, { catalog } = {}) {
|
|
|
1199
1245
|
: key === 'claude'
|
|
1200
1246
|
? input.stopHook
|
|
1201
1247
|
: undefined;
|
|
1202
|
-
|
|
1248
|
+
const normalized = normalizePlatformInput(platformInput);
|
|
1249
|
+
return [key, isConfiguredCliPlatformEnabled(key, uiConfig, resolvedCatalog)
|
|
1250
|
+
? normalized
|
|
1251
|
+
: { ...normalized, enabled: false }];
|
|
1203
1252
|
}));
|
|
1204
1253
|
|
|
1205
1254
|
const claudeEntry = entries.find(entry => entry.manifest.key === 'claude');
|
|
@@ -1213,7 +1262,7 @@ function saveNotificationSettings(input = {}, { catalog } = {}) {
|
|
|
1213
1262
|
if (hasManagedPlatform) writeNotifyScript(remoteNotifications);
|
|
1214
1263
|
else removeNotifyScript();
|
|
1215
1264
|
|
|
1216
|
-
return getNotificationSettings({ catalog });
|
|
1265
|
+
return getNotificationSettings({ catalog: resolvedCatalog });
|
|
1217
1266
|
}
|
|
1218
1267
|
|
|
1219
1268
|
function parseNotifyTypeMarker(command) {
|
|
@@ -1528,6 +1577,7 @@ module.exports = {
|
|
|
1528
1577
|
validateRemoteProviderConfig,
|
|
1529
1578
|
_test: {
|
|
1530
1579
|
getHookPlatformEntries,
|
|
1580
|
+
isConfiguredCliPlatformEnabled,
|
|
1531
1581
|
toPublicHookDefinition,
|
|
1532
1582
|
applyClaudeDisablePreference,
|
|
1533
1583
|
getManagedCommandType,
|