Expose database backup inventory and schedule execution evidence while keeping scheduled backups due after unchanged settings saves. - Display backup files, empty and error states, and automatic schedule details in Settings. - Reconcile the shared backup routine at engine startup and retain its next run when settings are unchanged. - Add API, localization, documentation, and regression coverage for backup status and scheduling. Files changed: .changeset/fn-9040-database-backups-visibility.md | 7 ++ docs/dashboard-guide.md | 2 +- docs/settings-reference.md | 4 + .../src/__tests__/backup-schedule-status.test.ts | 124 +++++++++++++++++++++ .../core/src/automation/global-routine-store.ts | 31 +++++- packages/core/src/backup/backup.ts | 95 ++++++++++++++-- packages/core/src/index.gate.ts | 4 +- packages/core/src/index.ts | 4 +- .../app/api/agents/agent-import-generation.ts | 14 +++ packages/dashboard/app/api/legacy.ts | 1 + .../dashboard/app/components/SettingsModal.tsx | 12 +- .../__tests__/SettingsModal.test-harness.tsx | 7 +- .../__tests__/SettingsModalNodeRouting.test.tsx | 2 +- .../components/__tests__/settings-mobile.test.tsx | 2 +- .../settings/sections/DatabaseBackupsSection.css | 24 ++++ .../settings/sections/DatabaseBackupsSection.tsx | 67 ++++++----- .../__tests__/DatabaseBackupsSection.test.tsx | 45 ++++++++ .../register-system-maintenance-routes.test.ts | 47 +++++++- .../routes/register-system-maintenance-routes.ts | 46 ++++++-- .../src/__tests__/in-process-runtime.pg.test.ts | 15 ++- packages/engine/src/runtimes/in-process-runtime.ts | 13 +++ packages/i18n/locales/en/app.json | 17 ++- packages/i18n/locales/es/app.json | 17 ++- packages/i18n/locales/fr/app.json | 17 ++- packages/i18n/locales/ko/app.json | 17 ++- packages/i18n/locales/pt-BR/app.json | 17 ++- packages/i18n/locales/zh-CN/app.json | 17 ++- packages/i18n/locales/zh-TW/app.json | 17 ++- packages/i18n/src/resources.d.ts | 28 ++++- 29 files changed, 623 insertions(+), 90 deletions(-) Fusion-Task-Id: FN-9040 Fusion-Task-Lineage: 29a803a2-0784-4a99-b7cb-2f67d105254b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
25 lines
1.6 KiB
CSS
25 lines
1.6 KiB
CSS
.backup-schedule {
|
|
margin: var(--space-md) 0;
|
|
padding: var(--space-md);
|
|
border: var(--btn-border-width) solid var(--border);
|
|
border-radius: var(--radius-md);
|
|
background: color-mix(in srgb, var(--surface) 85%, transparent);
|
|
}
|
|
|
|
.backup-schedule h5 { margin: 0 0 var(--space-sm); }
|
|
.backup-schedule dl { display: grid; gap: var(--space-xs); margin: 0; }
|
|
.backup-schedule dl div { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: var(--space-sm); }
|
|
.backup-schedule dt, .backup-schedule dd { margin: 0; }
|
|
.backup-schedule dt { color: var(--text-muted); }
|
|
.backup-schedule-error, .backup-list-error { color: var(--color-error); }
|
|
.backup-list { display: flex; flex-direction: column; gap: var(--space-xs); margin: var(--space-sm) 0 0; padding: 0; list-style: none; }
|
|
.backup-list li { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: var(--space-sm); align-items: center; padding: var(--space-sm) 0; border-top: var(--btn-border-width) solid color-mix(in srgb, var(--border) 80%, transparent); }
|
|
.backup-list li code { min-width: 0; color: var(--text); font-family: var(--font-mono); font-size: var(--font-size-xs); overflow-wrap: anywhere; }
|
|
.backup-list time, .backup-size { color: var(--text-muted); font-family: var(--font-mono); font-size: var(--font-size-xs); white-space: nowrap; }
|
|
|
|
@media (max-width: 768px) {
|
|
.backup-schedule dl div { grid-template-columns: 1fr; gap: 0; }
|
|
.backup-list { max-height: calc(var(--space-xl) * 9 + var(--space-md)); overflow-y: auto; -webkit-overflow-scrolling: touch; }
|
|
.backup-list li { grid-template-columns: 1fr; gap: var(--space-xs); }
|
|
}
|