dsh-config-manager 0.1.49 → 0.1.50

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/lib/client.js CHANGED
@@ -541,6 +541,8 @@ const CONFIG_MANAGER_API = {
541
541
  restore: "/api/dsh-config-manager/restore",
542
542
  backupSchedule: "/api/dsh-config-manager/backup-schedule",
543
543
  backupScheduleRun: "/api/dsh-config-manager/backup-schedule/run",
544
+ backupFiles: "/api/dsh-config-manager/backup-files",
545
+ backupFilesDelete: "/api/dsh-config-manager/backup-files/delete",
544
546
  starPrompt: "/api/dsh-config-manager/star-prompt"
545
547
  };
546
548
  /** 导出请求超时(ms):与 Host 半 ROUTE_TIMEOUT_MS 对齐,防止宿主卡死时 UI 无限等待 */
@@ -806,6 +808,18 @@ var ConfigManagerApi = class {
806
808
  body: JSON.stringify({})
807
809
  }), this.t);
808
810
  }
811
+ /** 列出导出目录(exports/*.zip)下的全部备份文件(时间倒序;含来源 auto/manual)。 */
812
+ async listBackupFiles() {
813
+ return (await readJson$3(await fetch(CONFIG_MANAGER_API.backupFiles), this.t)).files;
814
+ }
815
+ /** 删除一个备份文件(危险操作:不可恢复;仅限 exports 目录内 .zip)。 */
816
+ async deleteBackupFile(name) {
817
+ return readJson$3(await fetch(CONFIG_MANAGER_API.backupFilesDelete, {
818
+ method: "POST",
819
+ headers: { "content-type": "application/json" },
820
+ body: JSON.stringify({ name })
821
+ }), this.t);
822
+ }
809
823
  };
810
824
  //#endregion
811
825
  //#region src/ui/conflict-view.ts
@@ -2326,7 +2340,8 @@ function defaultSnapshotsState() {
2326
2340
  report: null,
2327
2341
  actionError: null,
2328
2342
  error: null,
2329
- backupDraft: null
2343
+ backupDraft: null,
2344
+ importBackup: null
2330
2345
  };
2331
2346
  }
2332
2347
  function defaultState() {
@@ -2407,7 +2422,8 @@ function toSnapshotsStoreSlice(s) {
2407
2422
  report: s.report,
2408
2423
  actionError: s.actionError,
2409
2424
  error: s.error,
2410
- backupDraft: s.backupDraft
2425
+ backupDraft: s.backupDraft,
2426
+ importBackup: s.importBackup
2411
2427
  };
2412
2428
  }
2413
2429
  /**
@@ -2444,7 +2460,8 @@ function toPersistedState(state) {
2444
2460
  market: state.market,
2445
2461
  snapshots: {
2446
2462
  ...state.snapshots,
2447
- running: false
2463
+ running: false,
2464
+ importBackup: null
2448
2465
  }
2449
2466
  };
2450
2467
  }
@@ -2731,7 +2748,8 @@ var RunStore = class {
2731
2748
  snapshots: {
2732
2749
  ...defaultSnapshotsState(),
2733
2750
  ...parsed.snapshots,
2734
- running: false
2751
+ running: false,
2752
+ importBackup: null
2735
2753
  }
2736
2754
  };
2737
2755
  if (this.state.import.containerEncrypted && this.state.import.phase !== "preview" && this.state.import.phase !== "decrypt-archive") this.state.import.phase = "decrypt-archive";
@@ -3042,7 +3060,7 @@ var RunStore = class {
3042
3060
  const runStore = new RunStore();
3043
3061
  //#endregion
3044
3062
  //#region \0config-manager-css:/home/runner/work/dsh-config-manager/dsh-config-manager/src/client/config-manager.module.css.js
3045
- const css = "._367UGW_section{height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;font-size:13px;display:flex}._367UGW_sectionHeader{flex:none;align-items:center;gap:10px;display:flex}._367UGW_viewTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:1;gap:2px;display:flex}._367UGW_viewTab{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;border-radius:6px 6px 0 0;padding:7px 14px;font-size:13px}._367UGW_viewTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_viewTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_sectionBody{flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}._367UGW_viewBody{flex-direction:column;gap:12px;padding:4px 2px 16px;display:flex}._367UGW_sectionTitleBlock{flex-direction:column;gap:2px;display:flex}._367UGW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:700}._367UGW_sectionSubtitle{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}._367UGW_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:13px;font-weight:600;display:inline-flex}._367UGW_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}._367UGW_primaryButton:disabled{opacity:.5;cursor:default}._367UGW_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;display:inline-flex}._367UGW_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._367UGW_ghostButton:disabled{opacity:.45;cursor:default}._367UGW_dangerButton{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}._367UGW_dangerButton:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground)}._367UGW_dangerButton:disabled{opacity:.45;cursor:default}._367UGW_badge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.6;display:inline-block}._367UGW_badgeInfo{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_badgeOk{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_badgeWarn{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_badgeError{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:8px;padding:8px 12px;font-size:12.5px;line-height:1.5}._367UGW_banner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_banner[data-kind=error]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner[data-kind=info]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_banner[data-kind=warn]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}._367UGW_wizardCard{gap:14px}._367UGW_wizardCard ._367UGW_field{gap:8px}._367UGW_field{flex-direction:column;gap:5px;display:flex}._367UGW_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}._367UGW_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}._367UGW_input:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_input::placeholder{color:var(--dsw-alias-label-tertiary)}._367UGW_input:disabled{opacity:.55}._367UGW_select{-webkit-appearance:none;appearance:none;color:var(--dsw-alias-label-primary);background-color:var(--dsw-specific-input-major);background-image:linear-gradient(45deg, transparent 50%, var(--dsw-alias-label-secondary) 50%), linear-gradient(135deg, var(--dsw-alias-label-secondary) 50%, transparent 50%);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background-position:calc(100% - 17px) calc(50% - 1px),calc(100% - 12px) calc(50% - 1px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;border-radius:8px;outline:none;max-width:100%;padding:7px 30px 7px 10px;font-family:inherit;font-size:13px}._367UGW_select:hover:not(:disabled){border-color:var(--dsw-alias-border-l1)}._367UGW_select:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_select:disabled{opacity:.55;cursor:default}._367UGW_select option{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}._367UGW_hint{color:var(--dsw-alias-label-tertiary);font-size:11.5px;line-height:1.5}._367UGW_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}._367UGW_checkboxRow{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:flex-start;gap:8px;font-size:13px;display:flex}._367UGW_checkboxRow input{flex:none;margin-top:2px}._367UGW_radioLabel{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:6px;font-size:13px;display:inline-flex}._367UGW_secretFields{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 12px;padding-top:4px;display:grid}._367UGW_hiddenFile{display:none}._367UGW_modeTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:2px;display:flex}._367UGW_modeTab{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 12px;font-size:12.5px}._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_modeTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_modeHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}._367UGW_groupList{flex-direction:column;gap:10px;display:flex}._367UGW_groupCard{gap:8px}._367UGW_groupHeader{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}._367UGW_groupLabel{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:700}._367UGW_groupNote{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_categoryItem{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}._367UGW_categoryName{font-weight:500}._367UGW_categoryDesc{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_optionsCard{gap:8px}._367UGW_optionsHeader{color:var(--dsw-alias-label-primary);letter-spacing:.02em;margin-bottom:2px;font-size:12px;font-weight:600}._367UGW_warnList{margin:4px 0 0;padding-left:18px}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_progressBlock{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_progressMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}._367UGW_progressLabel{font-weight:600}._367UGW_progressDetail{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}._367UGW_progressBadge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;gap:2px;padding:1px 8px;font-size:11px;line-height:18px;display:inline-flex}._367UGW_progressBadgeSection{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);color:var(--dsw-alias-state-business-primary)}._367UGW_progressBadgeCount{background:color-mix(in srgb, var(--dsw-alias-state-info-primary) 14%, transparent);color:var(--dsw-alias-state-info-primary)}._367UGW_progressPercent{font-variant-numeric:tabular-nums;margin-left:auto}._367UGW_progressTrack{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;height:8px;overflow:hidden}._367UGW_progressBar{background:var(--dsw-alias-state-business-primary);border-radius:999px;height:100%;transition:width .12s linear}._367UGW_progressBarDone{background:var(--dsw-alias-state-success-primary)}._367UGW_progressIndeterminate{width:40%;animation:1s ease-in-out infinite _367UGW_dshCmIndeterminate}._367UGW_logPanel{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_logHeader{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12.5px;font-weight:600;display:flex}._367UGW_logJumpButton{font-family:var(--dsw-font-family);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:3px 8px;font-size:11px;line-height:1}._367UGW_logJumpButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_logScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:200px;padding:2px 10px 6px;overflow-y:auto}._367UGW_logLine{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);padding:1px 0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.6}._367UGW_logEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 0;font-size:11.5px}@keyframes _367UGW_dshCmIndeterminate{0%{margin-left:-40%}to{margin-left:100%}}._367UGW_reportView{flex-direction:column;gap:10px;display:flex}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_reportText{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:260px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_reportFooter{justify-content:flex-end;gap:8px;display:flex}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_rollbackBox ._367UGW_reportText{border-color:var(--dsw-alias-border-l2)}._367UGW_errorBanner{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_errorTitle{color:var(--dsw-alias-state-error-primary);font-size:13px;font-weight:700}._367UGW_errorReason{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorAction{color:var(--dsw-alias-label-secondary);font-size:12.5px}._367UGW_errorActionLabel{color:var(--dsw-alias-state-business-primary)}._367UGW_errorItem{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorFooter{justify-content:flex-end;display:flex}._367UGW_errorList{flex-direction:column;gap:4px;display:flex}._367UGW_errorLine{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-state-error-primary);border-radius:6px;margin:0;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictList{flex-direction:column;gap:10px;display:flex}._367UGW_conflictItem{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_conflictHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:600}._367UGW_severityError{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);border-radius:999px;padding:0 6px;font-size:10.5px}._367UGW_conflictDetail{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);border-radius:6px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictOptions{flex-wrap:wrap;gap:14px;display:flex}._367UGW_pathMappingList{flex-direction:column;gap:8px;display:flex}._367UGW_pathRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:10px 12px;display:grid}._367UGW_pathOld,._367UGW_pathNew{flex-direction:column;gap:4px;min-width:0;display:flex}._367UGW_pathValue{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}._367UGW_pathIssueKind{color:var(--dsw-alias-state-warn-primary);font-size:10.5px}._367UGW_secretsList{flex-direction:column;gap:10px;display:flex}._367UGW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:22px 12px;font-size:12.5px}._367UGW_spinnerWrap{align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{border:2px solid var(--dsw-alias-state-business-primary);vertical-align:-1px;border-top-color:#0000;border-radius:50%;flex:none;width:11px;height:11px;animation:.8s linear infinite _367UGW_dshCmSpin;display:inline-block}._367UGW_spinnerLabel{color:var(--dsw-alias-label-secondary);font-size:12px}@keyframes _367UGW_dshCmSpin{to{transform:rotate(360deg)}}._367UGW_snapshotList{flex-direction:column;gap:2px;display:flex}._367UGW_snapshotRowHeader,._367UGW_snapshotRow{grid-template-columns:minmax(120px,1.2fr) minmax(140px,1.6fr) 90px 56px 56px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:grid}._367UGW_snapshotRowHeader{color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);font-size:11px}._367UGW_snapshotRow{text-align:left;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px}._367UGW_snapshotRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_snapshotRow[data-active]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent)}._367UGW_warnText{color:var(--dsw-alias-state-warn-primary)}._367UGW_reportList{color:var(--dsw-alias-label-primary);flex-direction:column;gap:3px;margin:8px 0 4px;padding-left:18px;font-size:12px;display:flex}._367UGW_kindTag{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 6px;font-size:10.5px;display:inline-block}._367UGW_planScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 8px;overflow-y:auto}._367UGW_planScroll ._367UGW_reportList{margin-top:6px}._367UGW_reportScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:220px;padding:2px 10px 6px;overflow-y:auto}._367UGW_reportScroll ._367UGW_reportList{margin-top:4px}._367UGW_confirmScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_confirmScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_pullScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_pullScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_rowActions{gap:8px;margin-top:10px;display:flex}._367UGW_diffScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:240px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_aboutAuthor{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;text-decoration:none;display:inline-flex}._367UGW_aboutAuthor:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dialogMask{z-index:100;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._367UGW_dialogCard{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:min(420px,100%);max-height:80vh;box-shadow:0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);border-radius:10px;flex-direction:column;gap:10px;padding:14px;display:flex}._367UGW_dialogHeader{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:600}._367UGW_dialogBody{overscroll-behavior:contain;max-height:240px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogWide{width:min(560px,100%)}._367UGW_dialogBodyScroll{overscroll-behavior:contain;max-height:70vh;color:var(--dsw-alias-label-primary);white-space:normal;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogHeaderRow{justify-content:space-between;align-items:center;gap:10px;display:flex}._367UGW_dialogClose{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:16px;line-height:1}._367UGW_dialogClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-hover)}";
3063
+ const css = "._367UGW_section{height:100%;min-height:0;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-family);flex-direction:column;gap:10px;font-size:13px;display:flex}._367UGW_sectionHeader{flex:none;align-items:center;gap:10px;display:flex}._367UGW_viewTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:1;gap:2px;display:flex}._367UGW_viewTab{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;border-radius:6px 6px 0 0;padding:7px 14px;font-size:13px}._367UGW_viewTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_viewTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_sectionBody{flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}._367UGW_viewBody{flex-direction:column;gap:12px;padding:4px 2px 16px;display:flex}._367UGW_sectionTitleBlock{flex-direction:column;gap:2px;display:flex}._367UGW_sectionTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:700}._367UGW_sectionSubtitle{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:1.5}._367UGW_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-info-fill);cursor:pointer;white-space:nowrap;border:none;border-radius:8px;align-items:center;gap:6px;padding:6px 14px;font-size:13px;font-weight:600;display:inline-flex}._367UGW_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}._367UGW_primaryButton:disabled{opacity:.5;cursor:default}._367UGW_ghostButton{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;align-items:center;gap:6px;padding:5px 12px;font-size:12px;display:inline-flex}._367UGW_ghostButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._367UGW_ghostButton:disabled{opacity:.45;cursor:default}._367UGW_dangerButton{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:5px 12px;font-size:12px}._367UGW_dangerButton:hover:not(:disabled){background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-foreground)}._367UGW_dangerButton:disabled{opacity:.45;cursor:default}._367UGW_badge{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;line-height:1.6;display:inline-block}._367UGW_badgeInfo{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_badgeOk{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_badgeWarn{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_badgeError{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;border-radius:8px;padding:8px 12px;font-size:12.5px;line-height:1.5}._367UGW_banner[data-kind=ok]{color:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}._367UGW_banner[data-kind=error]{color:var(--dsw-alias-state-error-primary);border-color:var(--dsw-alias-state-error-primary)}._367UGW_banner[data-kind=info]{color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary)}._367UGW_banner[data-kind=warn]{color:var(--dsw-alias-state-warn-primary);border-color:var(--dsw-alias-state-warn-primary)}._367UGW_card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;flex-direction:column;flex:none;gap:10px;padding:12px;display:flex}._367UGW_wizardCard{gap:14px}._367UGW_wizardCard ._367UGW_field{gap:8px}._367UGW_field{flex-direction:column;gap:5px;display:flex}._367UGW_fieldLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600}._367UGW_input{color:var(--dsw-alias-label-primary);background:var(--dsw-specific-input-major);border:1px solid var(--dsw-alias-border-l2);resize:vertical;border-radius:8px;outline:none;padding:7px 10px;font-family:inherit;font-size:13px}._367UGW_input:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_input::placeholder{color:var(--dsw-alias-label-tertiary)}._367UGW_input:disabled{opacity:.55}._367UGW_select{-webkit-appearance:none;appearance:none;color:var(--dsw-alias-label-primary);background-color:var(--dsw-specific-input-major);background-image:linear-gradient(45deg, transparent 50%, var(--dsw-alias-label-secondary) 50%), linear-gradient(135deg, var(--dsw-alias-label-secondary) 50%, transparent 50%);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background-position:calc(100% - 17px) calc(50% - 1px),calc(100% - 12px) calc(50% - 1px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;border-radius:8px;outline:none;max-width:100%;padding:7px 30px 7px 10px;font-family:inherit;font-size:13px}._367UGW_select:hover:not(:disabled){border-color:var(--dsw-alias-border-l1)}._367UGW_select:focus{border-color:var(--dsw-alias-state-business-primary)}._367UGW_select:disabled{opacity:.55;cursor:default}._367UGW_select option{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}._367UGW_hint{color:var(--dsw-alias-label-tertiary);font-size:11.5px;line-height:1.5}._367UGW_formError{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px}._367UGW_checkboxRow{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:flex-start;gap:8px;font-size:13px;display:flex}._367UGW_checkboxRow input{flex:none;margin-top:2px}._367UGW_radioLabel{color:var(--dsw-alias-label-primary);cursor:pointer;align-items:center;gap:6px;font-size:13px;display:inline-flex}._367UGW_secretFields{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px 12px;padding-top:4px;display:grid}._367UGW_hiddenFile{display:none}._367UGW_modeTabs{border-bottom:1px solid var(--dsw-alias-border-l1);flex:none;gap:2px;display:flex}._367UGW_modeTab{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:6px 12px;font-size:12.5px}._367UGW_modeTab:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._367UGW_modeTab[data-active]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary);font-weight:600}._367UGW_modeHint{color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}._367UGW_groupList{flex-direction:column;gap:10px;display:flex}._367UGW_groupCard{gap:8px}._367UGW_groupHeader{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}._367UGW_groupLabel{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:700}._367UGW_groupNote{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_groupItems{flex-direction:column;gap:6px;display:flex}._367UGW_categoryItem{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}._367UGW_categoryName{font-weight:500}._367UGW_categoryDesc{color:var(--dsw-alias-label-tertiary);font-size:11.5px}._367UGW_optionsCard{gap:8px}._367UGW_optionsHeader{color:var(--dsw-alias-label-primary);letter-spacing:.02em;margin-bottom:2px;font-size:12px;font-weight:600}._367UGW_warnList{margin:4px 0 0;padding-left:18px}._367UGW_actionRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_progressBlock{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_progressMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}._367UGW_progressLabel{font-weight:600}._367UGW_progressDetail{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:320px;overflow:hidden}._367UGW_progressBadge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;gap:2px;padding:1px 8px;font-size:11px;line-height:18px;display:inline-flex}._367UGW_progressBadgeSection{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 14%, transparent);color:var(--dsw-alias-state-business-primary)}._367UGW_progressBadgeCount{background:color-mix(in srgb, var(--dsw-alias-state-info-primary) 14%, transparent);color:var(--dsw-alias-state-info-primary)}._367UGW_progressPercent{font-variant-numeric:tabular-nums;margin-left:auto}._367UGW_progressTrack{background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;height:8px;overflow:hidden}._367UGW_progressBar{background:var(--dsw-alias-state-business-primary);border-radius:999px;height:100%;transition:width .12s linear}._367UGW_progressBarDone{background:var(--dsw-alias-state-success-primary)}._367UGW_progressIndeterminate{width:40%;animation:1s ease-in-out infinite _367UGW_dshCmIndeterminate}._367UGW_logPanel{flex-direction:column;flex:none;gap:6px;display:flex}._367UGW_logHeader{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12.5px;font-weight:600;display:flex}._367UGW_logJumpButton{font-family:var(--dsw-font-family);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:999px;padding:3px 8px;font-size:11px;line-height:1}._367UGW_logJumpButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._367UGW_logScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:200px;padding:2px 10px 6px;overflow-y:auto}._367UGW_logLine{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);padding:1px 0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.6}._367UGW_logEmpty{color:var(--dsw-alias-label-tertiary);padding:6px 0;font-size:11.5px}@keyframes _367UGW_dshCmIndeterminate{0%{margin-left:-40%}to{margin-left:100%}}._367UGW_reportView{flex-direction:column;gap:10px;display:flex}._367UGW_statRow{flex-wrap:wrap;align-items:center;gap:6px;display:flex}._367UGW_reportText{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:260px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_reportFooter{justify-content:flex-end;gap:8px;display:flex}._367UGW_rollbackBox{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_rollbackBox ._367UGW_reportText{border-color:var(--dsw-alias-border-l2)}._367UGW_errorBanner{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_errorTitle{color:var(--dsw-alias-state-error-primary);font-size:13px;font-weight:700}._367UGW_errorReason{white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorAction{color:var(--dsw-alias-label-secondary);font-size:12.5px}._367UGW_errorActionLabel{color:var(--dsw-alias-state-business-primary)}._367UGW_errorItem{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px}._367UGW_errorFooter{justify-content:flex-end;display:flex}._367UGW_errorList{flex-direction:column;gap:4px;display:flex}._367UGW_errorLine{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-state-error-primary);border-radius:6px;margin:0;padding:6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictList{flex-direction:column;gap:10px;display:flex}._367UGW_conflictItem{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}._367UGW_conflictHead{flex-wrap:wrap;align-items:center;gap:8px;display:flex}._367UGW_conflictId{color:var(--dsw-alias-label-primary);font-size:12.5px;font-weight:600}._367UGW_severityError{color:var(--dsw-alias-state-error-primary);border:1px solid var(--dsw-alias-state-error-primary);border-radius:999px;padding:0 6px;font-size:10.5px}._367UGW_conflictDetail{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;color:var(--dsw-alias-label-secondary);border-radius:6px;margin:0;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}._367UGW_conflictOptions{flex-wrap:wrap;gap:14px;display:flex}._367UGW_pathMappingList{flex-direction:column;gap:8px;display:flex}._367UGW_pathRow{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;padding:10px 12px;display:grid}._367UGW_pathOld,._367UGW_pathNew{flex-direction:column;gap:4px;min-width:0;display:flex}._367UGW_pathValue{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;overflow:hidden}._367UGW_pathIssueKind{color:var(--dsw-alias-state-warn-primary);font-size:10.5px}._367UGW_secretsList{flex-direction:column;gap:10px;display:flex}._367UGW_empty{text-align:center;color:var(--dsw-alias-label-tertiary);padding:22px 12px;font-size:12.5px}._367UGW_spinnerWrap{align-items:center;gap:6px;display:inline-flex}._367UGW_spinner{border:2px solid var(--dsw-alias-state-business-primary);vertical-align:-1px;border-top-color:#0000;border-radius:50%;flex:none;width:11px;height:11px;animation:.8s linear infinite _367UGW_dshCmSpin;display:inline-block}._367UGW_spinnerLabel{color:var(--dsw-alias-label-secondary);font-size:12px}@keyframes _367UGW_dshCmSpin{to{transform:rotate(360deg)}}._367UGW_snapshotList{flex-direction:column;gap:2px;display:flex}._367UGW_snapshotRowHeader,._367UGW_snapshotRow{grid-template-columns:minmax(120px,1.2fr) minmax(140px,1.6fr) 90px 56px 56px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:grid}._367UGW_snapshotRowHeader{color:var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-border-l1);font-size:11px}._367UGW_snapshotRow{text-align:left;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px}._367UGW_snapshotRow:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_snapshotRow[data-active]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent)}._367UGW_backupFileList{flex-direction:column;gap:4px;display:flex}._367UGW_backupFileRow{border:1px solid var(--dsw-alias-border-l1);border-radius:6px;flex-wrap:wrap;align-items:center;gap:10px;padding:6px 10px;display:flex}._367UGW_backupFileName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:180px;font-size:12px;overflow:hidden}._367UGW_backupFileMeta{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}._367UGW_warnText{color:var(--dsw-alias-state-warn-primary)}._367UGW_reportList{color:var(--dsw-alias-label-primary);flex-direction:column;gap:3px;margin:8px 0 4px;padding-left:18px;font-size:12px;display:flex}._367UGW_kindTag{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 6px;font-size:10.5px;display:inline-block}._367UGW_planScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 8px;overflow-y:auto}._367UGW_planScroll ._367UGW_reportList{margin-top:6px}._367UGW_reportScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:220px;padding:2px 10px 6px;overflow-y:auto}._367UGW_reportScroll ._367UGW_reportList{margin-top:4px}._367UGW_confirmScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;max-height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_confirmScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_pullScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;height:280px;padding:2px 10px 6px;overflow-y:auto}._367UGW_pullScroll ._367UGW_reportList{margin-top:4px;margin-bottom:0}._367UGW_rowActions{gap:8px;margin-top:10px;display:flex}._367UGW_diffScroll{overscroll-behavior:contain;background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);white-space:pre-wrap;word-break:break-all;max-height:240px;color:var(--dsw-alias-label-primary);border-radius:8px;margin:0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.6;overflow:auto}._367UGW_aboutLinkRow{flex-wrap:wrap;align-items:center;gap:10px;display:flex}._367UGW_aboutAuthor{color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:4px 8px;font-size:13px;text-decoration:none;display:inline-flex}._367UGW_aboutAuthor:hover{background:var(--dsw-alias-interactive-bg-hover)}._367UGW_dialogMask{z-index:100;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}._367UGW_dialogCard{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:min(420px,100%);max-height:80vh;box-shadow:0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);border-radius:10px;flex-direction:column;gap:10px;padding:14px;display:flex}._367UGW_dialogHeader{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:600}._367UGW_dialogBody{overscroll-behavior:contain;max-height:240px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogWide{width:min(560px,100%)}._367UGW_dialogBodyScroll{overscroll-behavior:contain;max-height:70vh;color:var(--dsw-alias-label-primary);white-space:normal;flex-direction:column;gap:10px;font-size:13px;line-height:1.6;display:flex;overflow-y:auto}._367UGW_dialogHeaderRow{justify-content:space-between;align-items:center;gap:10px;display:flex}._367UGW_dialogClose{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:16px;line-height:1}._367UGW_dialogClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-hover)}";
3046
3064
  const tagId = "dsh-config-manager/config-manager.module.css";
3047
3065
  if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"dsh-config-manager/config-manager.module.css\"]") === null) {
3048
3066
  const tag = document.createElement("style");
@@ -3052,126 +3070,130 @@ if (typeof document !== "undefined" && document.querySelector("style[data-tag=\"
3052
3070
  document.head.appendChild(tag);
3053
3071
  }
3054
3072
  var config_manager_module_css_default = {
3055
- "progressLabel": "_367UGW_progressLabel",
3056
- "sectionHeader": "_367UGW_sectionHeader",
3057
- "dialogMask": "_367UGW_dialogMask",
3058
- "secretFields": "_367UGW_secretFields",
3059
- "badgeInfo": "_367UGW_badgeInfo",
3060
- "groupList": "_367UGW_groupList",
3073
+ "snapshotRow": "_367UGW_snapshotRow",
3074
+ "badgeOk": "_367UGW_badgeOk",
3075
+ "checkboxRow": "_367UGW_checkboxRow",
3076
+ "section": "_367UGW_section",
3077
+ "errorReason": "_367UGW_errorReason",
3078
+ "dialogCard": "_367UGW_dialogCard",
3079
+ "warnText": "_367UGW_warnText",
3080
+ "dialogWide": "_367UGW_dialogWide",
3081
+ "sectionTitleBlock": "_367UGW_sectionTitleBlock",
3082
+ "wizardCard": "_367UGW_wizardCard",
3083
+ "spinnerWrap": "_367UGW_spinnerWrap",
3084
+ "backupFileRow": "_367UGW_backupFileRow",
3061
3085
  "progressMeta": "_367UGW_progressMeta",
3086
+ "pathValue": "_367UGW_pathValue",
3087
+ "spinnerLabel": "_367UGW_spinnerLabel",
3062
3088
  "snapshotRowHeader": "_367UGW_snapshotRowHeader",
3063
- "banner": "_367UGW_banner",
3064
- "reportList": "_367UGW_reportList",
3065
- "optionsCard": "_367UGW_optionsCard",
3066
- "reportView": "_367UGW_reportView",
3067
- "reportScroll": "_367UGW_reportScroll",
3089
+ "errorAction": "_367UGW_errorAction",
3090
+ "field": "_367UGW_field",
3091
+ "dialogClose": "_367UGW_dialogClose",
3068
3092
  "errorItem": "_367UGW_errorItem",
3069
- "errorFooter": "_367UGW_errorFooter",
3070
- "errorTitle": "_367UGW_errorTitle",
3071
- "rowActions": "_367UGW_rowActions",
3072
- "actionRow": "_367UGW_actionRow",
3073
- "spinnerWrap": "_367UGW_spinnerWrap",
3074
- "badgeWarn": "_367UGW_badgeWarn",
3075
- "errorList": "_367UGW_errorList",
3076
- "groupCard": "_367UGW_groupCard",
3077
- "progressIndeterminate": "_367UGW_progressIndeterminate",
3078
- "groupNote": "_367UGW_groupNote",
3079
- "pathOld": "_367UGW_pathOld",
3080
- "hint": "_367UGW_hint",
3081
- "modeHint": "_367UGW_modeHint",
3082
- "pathMappingList": "_367UGW_pathMappingList",
3083
- "progressBar": "_367UGW_progressBar",
3084
- "reportFooter": "_367UGW_reportFooter",
3085
- "spinner": "_367UGW_spinner",
3093
+ "aboutLinkRow": "_367UGW_aboutLinkRow",
3086
3094
  "dshCmSpin": "_367UGW_dshCmSpin",
3087
- "secretsList": "_367UGW_secretsList",
3095
+ "viewBody": "_367UGW_viewBody",
3096
+ "progressBadgeCount": "_367UGW_progressBadgeCount",
3097
+ "progressBadge": "_367UGW_progressBadge",
3098
+ "select": "_367UGW_select",
3099
+ "modeHint": "_367UGW_modeHint",
3088
3100
  "logLine": "_367UGW_logLine",
3089
- "conflictHead": "_367UGW_conflictHead",
3090
- "ghostButton": "_367UGW_ghostButton",
3091
- "sectionTitle": "_367UGW_sectionTitle",
3101
+ "backupFileList": "_367UGW_backupFileList",
3102
+ "diffScroll": "_367UGW_diffScroll",
3103
+ "sectionBody": "_367UGW_sectionBody",
3092
3104
  "empty": "_367UGW_empty",
3093
- "dialogWide": "_367UGW_dialogWide",
3094
- "logPanel": "_367UGW_logPanel",
3095
- "dialogHeader": "_367UGW_dialogHeader",
3096
- "badge": "_367UGW_badge",
3097
- "pathRow": "_367UGW_pathRow",
3098
- "aboutLinkRow": "_367UGW_aboutLinkRow",
3099
- "snapshotList": "_367UGW_snapshotList",
3100
- "modeTab": "_367UGW_modeTab",
3101
- "logScroll": "_367UGW_logScroll",
3102
- "groupHeader": "_367UGW_groupHeader",
3103
- "progressBadge": "_367UGW_progressBadge",
3104
3105
  "modeTabs": "_367UGW_modeTabs",
3105
- "dialogBody": "_367UGW_dialogBody",
3106
- "statRow": "_367UGW_statRow",
3107
- "field": "_367UGW_field",
3108
- "dialogBodyScroll": "_367UGW_dialogBodyScroll",
3106
+ "progressDetail": "_367UGW_progressDetail",
3109
3107
  "radioLabel": "_367UGW_radioLabel",
3110
- "progressBadgeSection": "_367UGW_progressBadgeSection",
3111
- "progressPercent": "_367UGW_progressPercent",
3108
+ "groupHeader": "_367UGW_groupHeader",
3109
+ "errorFooter": "_367UGW_errorFooter",
3110
+ "progressIndeterminate": "_367UGW_progressIndeterminate",
3111
+ "reportText": "_367UGW_reportText",
3112
3112
  "dangerButton": "_367UGW_dangerButton",
3113
- "viewTab": "_367UGW_viewTab",
3114
- "categoryItem": "_367UGW_categoryItem",
3113
+ "backupFileName": "_367UGW_backupFileName",
3114
+ "errorList": "_367UGW_errorList",
3115
+ "logPanel": "_367UGW_logPanel",
3116
+ "logScroll": "_367UGW_logScroll",
3117
+ "sectionHeader": "_367UGW_sectionHeader",
3118
+ "kindTag": "_367UGW_kindTag",
3119
+ "primaryButton": "_367UGW_primaryButton",
3120
+ "input": "_367UGW_input",
3121
+ "viewTabs": "_367UGW_viewTabs",
3122
+ "pathRow": "_367UGW_pathRow",
3123
+ "groupList": "_367UGW_groupList",
3124
+ "conflictList": "_367UGW_conflictList",
3125
+ "aboutAuthor": "_367UGW_aboutAuthor",
3126
+ "hint": "_367UGW_hint",
3127
+ "progressLabel": "_367UGW_progressLabel",
3128
+ "planScroll": "_367UGW_planScroll",
3129
+ "card": "_367UGW_card",
3130
+ "hiddenFile": "_367UGW_hiddenFile",
3115
3131
  "conflictId": "_367UGW_conflictId",
3116
- "groupItems": "_367UGW_groupItems",
3117
- "viewBody": "_367UGW_viewBody",
3118
- "dialogClose": "_367UGW_dialogClose",
3119
- "dialogCard": "_367UGW_dialogCard",
3120
- "snapshotRow": "_367UGW_snapshotRow",
3121
- "conflictOptions": "_367UGW_conflictOptions",
3122
- "dshCmIndeterminate": "_367UGW_dshCmIndeterminate",
3123
- "optionsHeader": "_367UGW_optionsHeader",
3124
- "fieldLabel": "_367UGW_fieldLabel",
3125
- "formError": "_367UGW_formError",
3126
- "logEmpty": "_367UGW_logEmpty",
3127
- "errorBanner": "_367UGW_errorBanner",
3132
+ "groupNote": "_367UGW_groupNote",
3133
+ "sectionSubtitle": "_367UGW_sectionSubtitle",
3128
3134
  "conflictDetail": "_367UGW_conflictDetail",
3129
- "conflictList": "_367UGW_conflictList",
3130
- "pathValue": "_367UGW_pathValue",
3131
- "errorReason": "_367UGW_errorReason",
3132
- "badgeOk": "_367UGW_badgeOk",
3133
- "wizardCard": "_367UGW_wizardCard",
3135
+ "optionsCard": "_367UGW_optionsCard",
3136
+ "badgeInfo": "_367UGW_badgeInfo",
3134
3137
  "groupLabel": "_367UGW_groupLabel",
3135
- "reportText": "_367UGW_reportText",
3136
- "sectionSubtitle": "_367UGW_sectionSubtitle",
3137
- "dialogHeaderRow": "_367UGW_dialogHeaderRow",
3138
- "card": "_367UGW_card",
3139
- "viewTabs": "_367UGW_viewTabs",
3140
- "categoryName": "_367UGW_categoryName",
3141
- "kindTag": "_367UGW_kindTag",
3142
- "errorAction": "_367UGW_errorAction",
3143
- "badgeError": "_367UGW_badgeError",
3144
- "progressBarDone": "_367UGW_progressBarDone",
3145
- "sectionBody": "_367UGW_sectionBody",
3138
+ "pathNew": "_367UGW_pathNew",
3139
+ "secretsList": "_367UGW_secretsList",
3140
+ "dialogHeader": "_367UGW_dialogHeader",
3141
+ "progressPercent": "_367UGW_progressPercent",
3142
+ "conflictOptions": "_367UGW_conflictOptions",
3143
+ "conflictItem": "_367UGW_conflictItem",
3144
+ "pathMappingList": "_367UGW_pathMappingList",
3146
3145
  "progressTrack": "_367UGW_progressTrack",
3147
- "logJumpButton": "_367UGW_logJumpButton",
3148
- "categoryDesc": "_367UGW_categoryDesc",
3149
- "checkboxRow": "_367UGW_checkboxRow",
3150
- "progressDetail": "_367UGW_progressDetail",
3151
- "primaryButton": "_367UGW_primaryButton",
3152
- "errorActionLabel": "_367UGW_errorActionLabel",
3153
- "input": "_367UGW_input",
3154
- "warnText": "_367UGW_warnText",
3146
+ "snapshotList": "_367UGW_snapshotList",
3147
+ "fieldLabel": "_367UGW_fieldLabel",
3155
3148
  "logHeader": "_367UGW_logHeader",
3149
+ "statRow": "_367UGW_statRow",
3150
+ "backupFileMeta": "_367UGW_backupFileMeta",
3151
+ "progressBadgeSection": "_367UGW_progressBadgeSection",
3152
+ "actionRow": "_367UGW_actionRow",
3153
+ "banner": "_367UGW_banner",
3154
+ "dialogHeaderRow": "_367UGW_dialogHeaderRow",
3155
+ "categoryDesc": "_367UGW_categoryDesc",
3156
+ "categoryItem": "_367UGW_categoryItem",
3157
+ "groupCard": "_367UGW_groupCard",
3158
+ "badgeError": "_367UGW_badgeError",
3159
+ "pathOld": "_367UGW_pathOld",
3160
+ "dshCmIndeterminate": "_367UGW_dshCmIndeterminate",
3161
+ "reportView": "_367UGW_reportView",
3162
+ "warnList": "_367UGW_warnList",
3163
+ "badge": "_367UGW_badge",
3164
+ "sectionTitle": "_367UGW_sectionTitle",
3156
3165
  "progressBlock": "_367UGW_progressBlock",
3166
+ "reportList": "_367UGW_reportList",
3167
+ "dialogBody": "_367UGW_dialogBody",
3157
3168
  "confirmScroll": "_367UGW_confirmScroll",
3158
- "sectionTitleBlock": "_367UGW_sectionTitleBlock",
3159
- "aboutAuthor": "_367UGW_aboutAuthor",
3160
- "section": "_367UGW_section",
3161
- "errorLine": "_367UGW_errorLine",
3162
- "hiddenFile": "_367UGW_hiddenFile",
3163
- "warnList": "_367UGW_warnList",
3164
- "rollbackBox": "_367UGW_rollbackBox",
3169
+ "optionsHeader": "_367UGW_optionsHeader",
3170
+ "conflictHead": "_367UGW_conflictHead",
3165
3171
  "pullScroll": "_367UGW_pullScroll",
3166
- "diffScroll": "_367UGW_diffScroll",
3167
- "pathIssueKind": "_367UGW_pathIssueKind",
3168
- "spinnerLabel": "_367UGW_spinnerLabel",
3169
- "conflictItem": "_367UGW_conflictItem",
3172
+ "reportFooter": "_367UGW_reportFooter",
3170
3173
  "severityError": "_367UGW_severityError",
3171
- "pathNew": "_367UGW_pathNew",
3172
- "select": "_367UGW_select",
3173
- "planScroll": "_367UGW_planScroll",
3174
- "progressBadgeCount": "_367UGW_progressBadgeCount"
3174
+ "logEmpty": "_367UGW_logEmpty",
3175
+ "progressBar": "_367UGW_progressBar",
3176
+ "rowActions": "_367UGW_rowActions",
3177
+ "rollbackBox": "_367UGW_rollbackBox",
3178
+ "formError": "_367UGW_formError",
3179
+ "errorBanner": "_367UGW_errorBanner",
3180
+ "dialogMask": "_367UGW_dialogMask",
3181
+ "logJumpButton": "_367UGW_logJumpButton",
3182
+ "pathIssueKind": "_367UGW_pathIssueKind",
3183
+ "ghostButton": "_367UGW_ghostButton",
3184
+ "modeTab": "_367UGW_modeTab",
3185
+ "groupItems": "_367UGW_groupItems",
3186
+ "errorLine": "_367UGW_errorLine",
3187
+ "progressBarDone": "_367UGW_progressBarDone",
3188
+ "errorActionLabel": "_367UGW_errorActionLabel",
3189
+ "reportScroll": "_367UGW_reportScroll",
3190
+ "categoryName": "_367UGW_categoryName",
3191
+ "viewTab": "_367UGW_viewTab",
3192
+ "dialogBodyScroll": "_367UGW_dialogBodyScroll",
3193
+ "errorTitle": "_367UGW_errorTitle",
3194
+ "badgeWarn": "_367UGW_badgeWarn",
3195
+ "spinner": "_367UGW_spinner",
3196
+ "secretFields": "_367UGW_secretFields"
3175
3197
  };
3176
3198
  //#endregion
3177
3199
  //#region src/client/common/ui.tsx
@@ -4432,6 +4454,37 @@ function ImportWizardView({ api, t }) {
4432
4454
  } });
4433
4455
  if (fileInput.current !== null) fileInput.current.value = "";
4434
4456
  };
4457
+ /**
4458
+ * 一键导入(快照面板「备份文件 → 导入」):消费 runStore.snapshots.importBackup,
4459
+ * 跳过上传直接对宿主 exports 目录的 zipPath 执行 selectZip(analyze 零写入)。
4460
+ * 一次性瞬态:消费后立即清空,刷新/重挂载不会重放;与 onPickFile 共用
4461
+ * pickGeneration 竞态守卫(用户取消选择后晚到的分析结果丢弃)。
4462
+ */
4463
+ (0, react.useEffect)(() => {
4464
+ const req = runStore.getSnapshot().snapshots.importBackup;
4465
+ if (req === null) return;
4466
+ runStore.patch({ snapshots: { importBackup: null } });
4467
+ const generation = pickGeneration.current;
4468
+ runStore.patch({ import: {
4469
+ selectedFileName: req.name,
4470
+ uploading: true,
4471
+ error: null,
4472
+ decryptPassword: "",
4473
+ decryptRefs: [],
4474
+ archiveUnlocked: false,
4475
+ containerEncrypted: false
4476
+ } });
4477
+ wizard.selectZip(req.zipPath).then(() => {
4478
+ if (generation !== pickGeneration.current) return;
4479
+ runStore.syncWizard();
4480
+ }).catch((err) => {
4481
+ if (generation !== pickGeneration.current) return;
4482
+ runStore.patch({ import: { error: err instanceof Error ? err.message : String(err) } });
4483
+ runStore.syncWizard();
4484
+ }).finally(() => {
4485
+ if (generation === pickGeneration.current) runStore.patch({ import: { uploading: false } });
4486
+ });
4487
+ }, [api]);
4435
4488
  /** Compatibility → Preview */
4436
4489
  const goPreview = async () => {
4437
4490
  runStore.patch({ import: { error: null } });
@@ -5297,6 +5350,8 @@ function SnapshotsPanel({ api, t }) {
5297
5350
  const planGeneration = (0, react.useRef)(0);
5298
5351
  /** 执行恢复的二次确认弹窗开关(危险操作,DESIGN.md §8.11 场景) */
5299
5352
  const [confirmOpen, setConfirmOpen] = (0, react.useState)(false);
5353
+ /** 备份文件列表刷新信号:BackupScheduleCard「立即备份」完成后递增触发重载 */
5354
+ const [backupFilesTick, setBackupFilesTick] = (0, react.useState)(0);
5300
5355
  /**
5301
5356
  * 统一提交入口:更新 stateRef → 挂载时 setState → **总是**镜像进 runStore。
5302
5357
  * 关键:镜像不依赖 effect flush —— 异步操作(dry-run 计划/执行恢复)完成回调
@@ -5306,14 +5361,12 @@ function SnapshotsPanel({ api, t }) {
5306
5361
  const commit = (next) => {
5307
5362
  stateRef.current = next;
5308
5363
  if (mountedRef.current) setState(next);
5309
- const backupDraft = runStore.getSnapshot().snapshots.backupDraft;
5310
- runStore.patch({ snapshots: {
5311
- ...toSnapshotsStoreSlice({
5312
- ...next,
5313
- backupDraft
5314
- }),
5315
- backupDraft
5316
- } });
5364
+ const store = runStore.getSnapshot().snapshots;
5365
+ runStore.patch({ snapshots: toSnapshotsStoreSlice({
5366
+ ...next,
5367
+ backupDraft: store.backupDraft,
5368
+ importBackup: store.importBackup
5369
+ }) });
5317
5370
  };
5318
5371
  const patch = (p) => commit({
5319
5372
  ...stateRef.current,
@@ -5322,14 +5375,12 @@ function SnapshotsPanel({ api, t }) {
5322
5375
  /** 卸载时置挂载守卫 + 最后镜像一次(防止「最后一次改动后立即切 tab」时丢状态)。 */
5323
5376
  (0, react.useEffect)(() => () => {
5324
5377
  mountedRef.current = false;
5325
- const backupDraft = runStore.getSnapshot().snapshots.backupDraft;
5326
- runStore.patch({ snapshots: {
5327
- ...toSnapshotsStoreSlice({
5328
- ...stateRef.current,
5329
- backupDraft
5330
- }),
5331
- backupDraft
5332
- } });
5378
+ const store = runStore.getSnapshot().snapshots;
5379
+ runStore.patch({ snapshots: toSnapshotsStoreSlice({
5380
+ ...stateRef.current,
5381
+ backupDraft: store.backupDraft,
5382
+ importBackup: store.importBackup
5383
+ }) });
5333
5384
  }, []);
5334
5385
  const load = () => {
5335
5386
  patch({
@@ -5537,9 +5588,17 @@ function SnapshotsPanel({ api, t }) {
5537
5588
  reportLine(t("snapshots.skipped"), state.report.skipped, false)
5538
5589
  ] })
5539
5590
  ] }),
5591
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BackupFilesCard, {
5592
+ api,
5593
+ t,
5594
+ refreshTick: backupFilesTick
5595
+ }),
5540
5596
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BackupScheduleCard, {
5541
5597
  api,
5542
- t
5598
+ t,
5599
+ onBackupDone: () => {
5600
+ setBackupFilesTick((n) => n + 1);
5601
+ }
5543
5602
  }),
5544
5603
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmDialog, {
5545
5604
  open: confirmOpen,
@@ -5585,7 +5644,7 @@ function formatRunTime(iso) {
5585
5644
  * 状态自持;草稿镜像 runStore.snapshots.backupDraft(未保存修改切 tab/刷新保留),
5586
5645
  * 保存成功清草稿(宿主配置为权威)。
5587
5646
  */
5588
- function BackupScheduleCard({ api, t }) {
5647
+ function BackupScheduleCard({ api, t, onBackupDone }) {
5589
5648
  const [status, setStatus] = (0, react.useState)("loading");
5590
5649
  const [error, setError] = (0, react.useState)(null);
5591
5650
  const [draft, setDraft] = (0, react.useState)({
@@ -5662,11 +5721,13 @@ function BackupScheduleCard({ api, t }) {
5662
5721
  setFlash(null);
5663
5722
  setActionError(null);
5664
5723
  api.runBackupNow().then((res) => {
5665
- if (!mountedRef.current) return;
5666
- setSaved(res.schedule);
5667
- setLastRun(res.run.status);
5668
- setLastRunDetail(res.run.zip !== void 0 && res.run.zip !== "" ? res.run.zip : res.run.skipReason !== void 0 ? res.run.skipReason : formatRunTime(res.schedule.lastRunAt));
5669
- setRunning(false);
5724
+ if (mountedRef.current) {
5725
+ setSaved(res.schedule);
5726
+ setLastRun(res.run.status);
5727
+ setLastRunDetail(res.run.zip !== void 0 && res.run.zip !== "" ? res.run.zip : res.run.skipReason !== void 0 ? res.run.skipReason : formatRunTime(res.schedule.lastRunAt));
5728
+ setRunning(false);
5729
+ }
5730
+ onBackupDone?.();
5670
5731
  }, (err) => {
5671
5732
  if (!mountedRef.current) return;
5672
5733
  setRunning(false);
@@ -5771,6 +5832,175 @@ function BackupScheduleCard({ api, t }) {
5771
5832
  ]
5772
5833
  });
5773
5834
  }
5835
+ /**
5836
+ * 备份文件管理卡(m-backup-files):列出 exports/ 下的导出 ZIP(手动导出 + 定时备份),
5837
+ * 提供下载(复用 /download)/ 一键导入(切 Import tab + 注入 zipPath,向导直接分析)/
5838
+ * 删除(危险操作二次确认)。
5839
+ *
5840
+ * 状态组件自持(列表可随时重载,不持久化;与快照列表同级)。refreshTick 由父组件在
5841
+ * 「立即备份」完成后递增触发重载。安全:文件路径来自宿主受控 exports 目录;删除按钮
5842
+ * 恒走 ConfirmDialog(danger);导入 = 把 zipPath 交给现有导入向导(analyze 零写入,
5843
+ * 不经过上传)。
5844
+ */
5845
+ function BackupFilesCard({ api, t, refreshTick }) {
5846
+ const [status, setStatus] = (0, react.useState)("loading");
5847
+ const [error, setError] = (0, react.useState)(null);
5848
+ const [files, setFiles] = (0, react.useState)([]);
5849
+ const [deleting, setDeleting] = (0, react.useState)(false);
5850
+ const [confirmDelete, setConfirmDelete] = (0, react.useState)(null);
5851
+ const [actionError, setActionError] = (0, react.useState)(null);
5852
+ const mountedRef = (0, react.useRef)(true);
5853
+ const initialTick = (0, react.useRef)(refreshTick);
5854
+ (0, react.useEffect)(() => () => {
5855
+ mountedRef.current = false;
5856
+ }, []);
5857
+ const load = () => {
5858
+ setStatus("loading");
5859
+ setError(null);
5860
+ api.listBackupFiles().then((list) => {
5861
+ if (!mountedRef.current) return;
5862
+ setFiles(list);
5863
+ setStatus("ready");
5864
+ }, (err) => {
5865
+ if (!mountedRef.current) return;
5866
+ setStatus("error");
5867
+ setError(err instanceof Error ? err.message : String(err));
5868
+ });
5869
+ };
5870
+ (0, react.useEffect)(load, [api]);
5871
+ (0, react.useEffect)(() => {
5872
+ if (refreshTick === initialTick.current) return;
5873
+ load();
5874
+ }, [refreshTick]);
5875
+ const download = (file) => {
5876
+ setActionError(null);
5877
+ api.download(file.path, { saveDialog: true }).catch((err) => {
5878
+ if (!mountedRef.current) return;
5879
+ setActionError(err instanceof Error ? err.message : String(err));
5880
+ });
5881
+ };
5882
+ /** 一键导入:把备份文件 zipPath 交给现有导入向导(切 Import tab;向导挂载即分析) */
5883
+ const importBackup = (file) => {
5884
+ runStore.patch({
5885
+ view: "import",
5886
+ panel: null,
5887
+ snapshots: { importBackup: {
5888
+ zipPath: file.path,
5889
+ name: file.name
5890
+ } }
5891
+ });
5892
+ };
5893
+ const doDelete = () => {
5894
+ const file = confirmDelete;
5895
+ if (file === null || deleting) return;
5896
+ setDeleting(true);
5897
+ setActionError(null);
5898
+ api.deleteBackupFile(file.name).then(() => {
5899
+ setDeleting(false);
5900
+ setConfirmDelete(null);
5901
+ load();
5902
+ }, (err) => {
5903
+ setDeleting(false);
5904
+ setConfirmDelete(null);
5905
+ setActionError(err instanceof Error ? err.message : String(err));
5906
+ });
5907
+ };
5908
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
5909
+ className: config_manager_module_css_default.card,
5910
+ children: [
5911
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5912
+ className: config_manager_module_css_default.groupLabel,
5913
+ children: t("backupFiles.title")
5914
+ }),
5915
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5916
+ className: config_manager_module_css_default.hint,
5917
+ children: t("backupFiles.hint")
5918
+ }),
5919
+ status === "loading" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { label: t("backupFiles.loading") }),
5920
+ status === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Banner, {
5921
+ kind: "error",
5922
+ children: [error ?? t("common.unknownError"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
5923
+ variant: "primary",
5924
+ onClick: load,
5925
+ children: t("common.retry")
5926
+ })]
5927
+ }),
5928
+ status === "ready" && files.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Empty, { children: t("backupFiles.empty") }),
5929
+ status === "ready" && files.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5930
+ className: config_manager_module_css_default.backupFileList,
5931
+ role: "list",
5932
+ "aria-label": t("backupFiles.title"),
5933
+ children: files.map((file) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5934
+ className: config_manager_module_css_default.backupFileRow,
5935
+ role: "listitem",
5936
+ children: [
5937
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5938
+ className: config_manager_module_css_default.backupFileName,
5939
+ title: file.name,
5940
+ children: file.name
5941
+ }),
5942
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Badge, {
5943
+ kind: "info",
5944
+ children: file.source === "auto" ? t("backupFiles.source.auto") : t("backupFiles.source.manual")
5945
+ }),
5946
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5947
+ className: config_manager_module_css_default.backupFileMeta,
5948
+ children: formatBytes(file.sizeBytes)
5949
+ }),
5950
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5951
+ className: config_manager_module_css_default.backupFileMeta,
5952
+ children: new Date(file.mtimeMs).toLocaleString()
5953
+ }),
5954
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5955
+ className: config_manager_module_css_default.actionRow,
5956
+ children: [
5957
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
5958
+ disabled: deleting,
5959
+ onClick: () => {
5960
+ download(file);
5961
+ },
5962
+ children: t("backupFiles.download")
5963
+ }),
5964
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
5965
+ disabled: deleting,
5966
+ onClick: () => {
5967
+ importBackup(file);
5968
+ },
5969
+ children: t("backupFiles.import")
5970
+ }),
5971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
5972
+ variant: "danger",
5973
+ disabled: deleting,
5974
+ onClick: () => {
5975
+ setConfirmDelete(file);
5976
+ },
5977
+ children: t("backupFiles.delete")
5978
+ })
5979
+ ]
5980
+ })
5981
+ ]
5982
+ }, file.name))
5983
+ }),
5984
+ actionError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Banner, {
5985
+ kind: "error",
5986
+ children: actionError
5987
+ }),
5988
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmDialog, {
5989
+ open: confirmDelete !== null,
5990
+ title: t("backupFiles.deleteConfirmTitle"),
5991
+ message: confirmDelete !== null ? t("backupFiles.deleteConfirm", { name: confirmDelete.name }) : void 0,
5992
+ confirmLabel: t("backupFiles.delete"),
5993
+ cancelLabel: t("common.cancel"),
5994
+ danger: true,
5995
+ busy: deleting,
5996
+ onConfirm: doDelete,
5997
+ onCancel: () => {
5998
+ setConfirmDelete(null);
5999
+ }
6000
+ })
6001
+ ]
6002
+ });
6003
+ }
5774
6004
  //#endregion
5775
6005
  //#region src/client/sync/sync-api.ts
5776
6006
  /** 同步端点常量(与 Host 半 src/index.ts API 常量保持一致) */
@@ -11213,6 +11443,18 @@ const zh$2 = {
11213
11443
  "backupSchedule.status.failed": "失败",
11214
11444
  "backupSchedule.loading": "加载定时备份设置…",
11215
11445
  "backupSchedule.error": "定时备份设置加载失败",
11446
+ "backupFiles.title": "备份文件",
11447
+ "backupFiles.hint": "导出产物(手动导出与定时备份)统一在此管理:可下载到本机、直接导入恢复,或删除。定时备份自动保留最近 10 个。",
11448
+ "backupFiles.empty": "暂无备份文件。手动导出或启用定时备份后此处会列出。",
11449
+ "backupFiles.loading": "加载备份文件…",
11450
+ "backupFiles.error": "备份文件加载失败",
11451
+ "backupFiles.source.auto": "定时备份",
11452
+ "backupFiles.source.manual": "手动导出",
11453
+ "backupFiles.download": "下载",
11454
+ "backupFiles.import": "导入",
11455
+ "backupFiles.delete": "删除",
11456
+ "backupFiles.deleteConfirmTitle": "删除备份文件",
11457
+ "backupFiles.deleteConfirm": "确认删除备份文件「{name}」?此操作不可恢复。",
11216
11458
  "report.export.title": "导出完成",
11217
11459
  "report.import.title": "导入结果",
11218
11460
  "report.rollback.title": "回滚报告",
@@ -11384,6 +11626,18 @@ const en$2 = {
11384
11626
  "backupSchedule.status.failed": "Failed",
11385
11627
  "backupSchedule.loading": "Loading scheduled backup settings…",
11386
11628
  "backupSchedule.error": "Failed to load scheduled backup settings",
11629
+ "backupFiles.title": "Backup Files",
11630
+ "backupFiles.hint": "All export artifacts (manual exports and scheduled backups) are managed here: download to your machine, import to restore, or delete. Scheduled backups auto-keep the latest 10.",
11631
+ "backupFiles.empty": "No backup files yet. They appear here after a manual export or once scheduled backups are enabled.",
11632
+ "backupFiles.loading": "Loading backup files…",
11633
+ "backupFiles.error": "Failed to load backup files",
11634
+ "backupFiles.source.auto": "Scheduled",
11635
+ "backupFiles.source.manual": "Manual",
11636
+ "backupFiles.download": "Download",
11637
+ "backupFiles.import": "Import",
11638
+ "backupFiles.delete": "Delete",
11639
+ "backupFiles.deleteConfirmTitle": "Delete backup file",
11640
+ "backupFiles.deleteConfirm": "Delete backup file \"{name}\"? This cannot be undone.",
11387
11641
  "report.export.title": "Export Complete",
11388
11642
  "report.import.title": "Import Result",
11389
11643
  "report.rollback.title": "Rollback Report",