Files
ComfyAssets-ComfyUI_PromptM…/tools/vendor/frontend-coverage-baseline.json
T
Vito 4040007264 fix(workspace): keep open pages valid across a restart and recover a changed source (#430) (#434)
The gallery root scope and the Images listing cursor were keyed with a
per-process random key, so every ComfyUI restart made an open tab's
scopes answer 409 source-changed (blank Tag image preview, a Generate
that did nothing) and its cursors fail Load more.

- utils/workspace_keys.py: one random secret in workspace-scope.key
  beside the database (owner-only, never config.json or the database),
  two derived keys; per-process fallback with a warning. Move library
  copies it.
- Cursor v2 binds the listing scope in its MAC instead of sending an
  unkeyed hash of the root paths; an unverifiable cursor answers 400
  cursor-stale and Images offers Refresh instead of a dead Retry.
- POST /prompt_manager/images/rescope maps a stale target to its
  current root only when the held scope was issued for it.
- Images finds a renumbered file again from the inspector, the viewer
  and the Tag image dialog (the dialog stays open, draft kept); nothing
  else is kept by an old root_index:path key.
- Tag image dialog: a state that blocks Save shows its reason above the
  actions with Refresh, disabled actions look disabled, and an empty
  preview says "Preview unavailable" (D147).
2026-10-28 23:06:36 +00:00

663 lines
12 KiB
JSON

{
"admin.js": {
"lines": 47,
"branches": 64,
"functions": 50,
"statements": 47
},
"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": 91,
"statements": 97
},
"gallery-settings.js": {
"lines": 98,
"branches": 94,
"functions": 98,
"statements": 98
},
"gallery.js": {
"lines": 54,
"branches": 72,
"functions": 57,
"statements": 54
},
"html-escape.js": {
"lines": 98,
"branches": 98,
"functions": 98,
"statements": 98
},
"image-helpers.js": {
"lines": 96,
"branches": 92,
"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
},
"save-to-library.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": 92,
"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
},
"text-links.js": {
"lines": 98,
"branches": 98,
"functions": 98,
"statements": 98
},
"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": 90,
"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/collections.mjs": {
"lines": 98,
"branches": 95,
"functions": 95,
"statements": 98
},
"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": 89,
"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-multiselect.mjs": {
"lines": 98,
"branches": 98,
"functions": 98,
"statements": 98
},
"workspace/images-selection.mjs": {
"lines": 98,
"branches": 93,
"functions": 98,
"statements": 98
},
"workspace/images-source-recovery.mjs": {
"lines": 98,
"branches": 98,
"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": 87,
"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": 95,
"branches": 87,
"functions": 91,
"statements": 95
},
"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-diagnostics.mjs": {
"lines": 95,
"branches": 87,
"functions": 94,
"statements": 95
},
"workspace/system-integrations.mjs": {
"lines": 97,
"branches": 90,
"functions": 92,
"statements": 97
},
"workspace/system-maintenance.mjs": {
"lines": 93,
"branches": 81,
"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-tagging.mjs": {
"lines": 98,
"branches": 94,
"functions": 95,
"statements": 98
},
"workspace/system-thumbnails.mjs": {
"lines": 98,
"branches": 95,
"functions": 83,
"statements": 98
},
"workspace/system.mjs": {
"lines": 98,
"branches": 92,
"functions": 98,
"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": 89,
"functions": 95,
"statements": 98
},
"workspace/vocabulary-state.mjs": {
"lines": 98,
"branches": 96,
"functions": 98,
"statements": 98
},
"workspace/vocabulary.mjs": {
"lines": 98,
"branches": 91,
"functions": 98,
"statements": 98
},
"workspace/workspace-dialogs.mjs": {
"lines": 97,
"branches": 95,
"functions": 98,
"statements": 97
}
}