* feat(system): back up, restore and export natively System > Backup & export replaces its hand-off with the concept's section on the S8 backend: Back up downloads the verified copy and the status line shows only what GET /backup/status reports (D103); Review restore stages a chosen file and shows the server's review in the shared review dialog, Cancel discards the stage and Restore runs the Database restore job, after which the open views reload (D105); Export JSON plus the components and saved-pairs exports (D103); Import / inspect opens the shared Import & inspect dialog; the safety-backup policy saves through the Save row and scheduled backups offer Manual only (D104). Overview's Backup status row reads the same status. Refs #326 * test(system): compare Backup & export with the concept system-backups-concept.spec compares the section, the Restore preview and the Import & inspect dialog with the concept in both themes at 1600 and 390 wide, mapping only D103, D104, D105 (and D15/D55 for the shared Import dialog), and proves a renamed label, a removed row, a lost danger mark and swapped tokens are noticed. A review's grid values now wrap anywhere (D105), so a long backup file name keeps the concept's two equal columns at phone width. Refs #326 * docs(testing): Backup & export contract (D103-D105) Refs #326 * test(coverage): raise the frontend floors S9 measured system-backups.mjs gets its measured floor in place of the provisional one; admin.js, activity-scan.mjs and maintenance-review.mjs branches go up. Refs #326 * fix(system): keep a refused or handed-back restore review usable A Restore refused as busy now opens the same review again with Discard / Restore, and a restore job whose leases did not drain hands its review back (scope.review_kept) to the page that started it, which reopens it; every other path that abandons a token after Restore sends its DELETE, so held reviews can no longer lock restore out. The kept-review line says where the review is, and a full review store says what to do (I1). applyPlan resolves with its outcome and its job tracking now has failing-before proof (N5). Also: the safety-backup toggle says what the policy does (D104, M2); the restore picker has no type filter so safety backups can be chosen (M3); "Export all prompts JSON" names what /export holds (N1); small snapshots show KB (N3); the duplicated holding and save helpers are shared (N4); a dismissal test covers Cancel, x, Escape, a replacing dialog and leaving (M1). Refs #326 * test(coverage): raise the system-backups branch floor Refs #326
621 lines
12 KiB
JSON
621 lines
12 KiB
JSON
{
|
|
"admin.js": {
|
|
"lines": 32,
|
|
"branches": 61,
|
|
"functions": 27,
|
|
"statements": 32
|
|
},
|
|
"api-client.js": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"cache-ownership.js": {
|
|
"lines": 94,
|
|
"branches": 89,
|
|
"functions": 98,
|
|
"statements": 94
|
|
},
|
|
"classic-node.js": {
|
|
"lines": 98,
|
|
"branches": 79,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"comfy-metadata.js": {
|
|
"lines": 97,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"data-actions.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"focused-node.js": {
|
|
"lines": 97,
|
|
"branches": 87,
|
|
"functions": 90,
|
|
"statements": 97
|
|
},
|
|
"gallery-settings.js": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"gallery.js": {
|
|
"lines": 45,
|
|
"branches": 66,
|
|
"functions": 48,
|
|
"statements": 45
|
|
},
|
|
"html-escape.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"image-helpers.js": {
|
|
"lines": 96,
|
|
"branches": 91,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"list-state.js": {
|
|
"lines": 98,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"metadata-autocomplete.js": {
|
|
"lines": 98,
|
|
"branches": 82,
|
|
"functions": 85,
|
|
"statements": 98
|
|
},
|
|
"png-metadata.js": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"prompt-bridge-adapter.js": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"prompt-bridge-host.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"prompt-library.js": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"prompt-list-sort.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"scan-progress.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"shared/toolkit/core.js": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"shared/toolkit/prompt-bridge.js": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"shared/toolkit/suggestions.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"sse-stream.js": {
|
|
"lines": 98,
|
|
"branches": 90,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"tag-autocomplete.js": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"tags-page.js": {
|
|
"lines": 57,
|
|
"branches": 48,
|
|
"functions": 56,
|
|
"statements": 57
|
|
},
|
|
"theme-bridge.js": {
|
|
"lines": 90,
|
|
"branches": 53,
|
|
"functions": 98,
|
|
"statements": 90
|
|
},
|
|
"view-router.js": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/activity-job-view.mjs": {
|
|
"lines": 97,
|
|
"branches": 87,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/activity-kinds.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/activity-scan.mjs": {
|
|
"lines": 96,
|
|
"branches": 87,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/activity-store.mjs": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/activity.mjs": {
|
|
"lines": 96,
|
|
"branches": 91,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/file-inspector.mjs": {
|
|
"lines": 96,
|
|
"branches": 93,
|
|
"functions": 93,
|
|
"statements": 96
|
|
},
|
|
"workspace/heading.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/history-media.mjs": {
|
|
"lines": 98,
|
|
"branches": 86,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/history-state.mjs": {
|
|
"lines": 97,
|
|
"branches": 91,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/history.mjs": {
|
|
"lines": 97,
|
|
"branches": 87,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/icons.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/image-card.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/image-layout.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/image-tagging-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/image-tagging.mjs": {
|
|
"lines": 97,
|
|
"branches": 92,
|
|
"functions": 88,
|
|
"statements": 97
|
|
},
|
|
"workspace/images-category.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-export.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-favorites.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 85,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-selection.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-tagging-bulk.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 86,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-tagging-review.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images-tagging.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/images.mjs": {
|
|
"lines": 97,
|
|
"branches": 89,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/index.mjs": {
|
|
"lines": 98,
|
|
"branches": 97,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/inspect.mjs": {
|
|
"lines": 98,
|
|
"branches": 92,
|
|
"functions": 93,
|
|
"statements": 98
|
|
},
|
|
"workspace/inspection-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/library-editor-state.mjs": {
|
|
"lines": 96,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/library-editor.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 92,
|
|
"statements": 98
|
|
},
|
|
"workspace/library-layout.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/library-location.mjs": {
|
|
"lines": 94,
|
|
"branches": 91,
|
|
"functions": 93,
|
|
"statements": 94
|
|
},
|
|
"workspace/library-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/library.mjs": {
|
|
"lines": 96,
|
|
"branches": 85,
|
|
"functions": 96,
|
|
"statements": 96
|
|
},
|
|
"workspace/local-inspection.mjs": {
|
|
"lines": 98,
|
|
"branches": 91,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/local-parameters.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/local-projection.mjs": {
|
|
"lines": 97,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/local-resolver-stages.mjs": {
|
|
"lines": 95,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 95
|
|
},
|
|
"workspace/local-resolver-support.mjs": {
|
|
"lines": 96,
|
|
"branches": 81,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/local-resolver.mjs": {
|
|
"lines": 96,
|
|
"branches": 86,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/local-semantics.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/local-session.mjs": {
|
|
"lines": 98,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/local-video.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/maintenance-review.mjs": {
|
|
"lines": 94,
|
|
"branches": 86,
|
|
"functions": 90,
|
|
"statements": 94
|
|
},
|
|
"workspace/media-viewer.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/plural.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/preferences.mjs": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/prompt-blocks.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/prompt-inspector.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/prompt-sender.mjs": {
|
|
"lines": 98,
|
|
"branches": 91,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/py-json.mjs": {
|
|
"lines": 97,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 97
|
|
},
|
|
"workspace/recorded-run.mjs": {
|
|
"lines": 95,
|
|
"branches": 83,
|
|
"functions": 80,
|
|
"statements": 95
|
|
},
|
|
"workspace/review-state.mjs": {
|
|
"lines": 96,
|
|
"branches": 84,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/review.mjs": {
|
|
"lines": 98,
|
|
"branches": 89,
|
|
"functions": 93,
|
|
"statements": 98
|
|
},
|
|
"workspace/saved-views.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 95,
|
|
"statements": 98
|
|
},
|
|
"workspace/state.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/system-appearance.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/system-backups.mjs": {
|
|
"lines": 95,
|
|
"branches": 88,
|
|
"functions": 94,
|
|
"statements": 95
|
|
},
|
|
"workspace/system-controls.mjs": {
|
|
"lines": 98,
|
|
"branches": 89,
|
|
"functions": 89,
|
|
"statements": 98
|
|
},
|
|
"workspace/system-integrations.mjs": {
|
|
"lines": 96,
|
|
"branches": 88,
|
|
"functions": 91,
|
|
"statements": 96
|
|
},
|
|
"workspace/system-maintenance.mjs": {
|
|
"lines": 93,
|
|
"branches": 80,
|
|
"functions": 92,
|
|
"statements": 93
|
|
},
|
|
"workspace/system-overview.mjs": {
|
|
"lines": 96,
|
|
"branches": 92,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/system-sources.mjs": {
|
|
"lines": 98,
|
|
"branches": 88,
|
|
"functions": 95,
|
|
"statements": 98
|
|
},
|
|
"workspace/system-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 94,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/system-thumbnails.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 83,
|
|
"statements": 98
|
|
},
|
|
"workspace/system.mjs": {
|
|
"lines": 98,
|
|
"branches": 92,
|
|
"functions": 86,
|
|
"statements": 98
|
|
},
|
|
"workspace/theme.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/thumbnail-review.mjs": {
|
|
"lines": 98,
|
|
"branches": 93,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/thumbnail-support.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/toast.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/toolbar.mjs": {
|
|
"lines": 96,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 96
|
|
},
|
|
"workspace/topbar.mjs": {
|
|
"lines": 98,
|
|
"branches": 98,
|
|
"functions": 83,
|
|
"statements": 98
|
|
},
|
|
"workspace/viewer-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 95,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/vocabulary-dialog.mjs": {
|
|
"lines": 98,
|
|
"branches": 88,
|
|
"functions": 95,
|
|
"statements": 98
|
|
},
|
|
"workspace/vocabulary-state.mjs": {
|
|
"lines": 98,
|
|
"branches": 96,
|
|
"functions": 98,
|
|
"statements": 98
|
|
},
|
|
"workspace/vocabulary.mjs": {
|
|
"lines": 98,
|
|
"branches": 91,
|
|
"functions": 93,
|
|
"statements": 98
|
|
},
|
|
"workspace/workspace-dialogs.mjs": {
|
|
"lines": 97,
|
|
"branches": 95,
|
|
"functions": 98,
|
|
"statements": 97
|
|
}
|
|
}
|