ComfyUI's sidebar container uses z-index: 10. The timeline was at the
same level and lost in the stacking order. Bump timeline to z-index
1000 and set z-index 20 on the canvas parent so it forms a stacking
context above the sidebar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use node count shortcut, element-wise widget comparison, link length
and boundary checks, and skip-when-flagged guards to eliminate most
serialization work in the common case.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each snapshot now detects what kind of change it represents (node add,
node remove, connection, parameter, move, mixed) and displays a distinct
colored icon on the timeline. Sidebar meta line shows the change type.
Existing snapshots without change data gracefully fall back to a faded
"unknown" dot.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track active (white ring) and current (green dot) snapshots on timeline
- Auto-capture "Current" state before swapping so user can navigate back
- Add "Snapshot" button to timeline bar for quick manual captures
- Register Ctrl+S / Cmd+S shortcut for manual snapshots
- Clear active/current markers on new captures and workflow switches
- Return record.id from captureSnapshot (backward-compatible truthy value)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add SaveSnapshot node to features list and architecture diagram,
update storage label from IndexedDB to Server Storage, add
maxNodeSnapshots setting to the table, and document the
node-triggered capture flow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce a SaveSnapshot custom node that triggers snapshot captures
via WebSocket. Node-triggered snapshots are visually distinct in the
sidebar (purple left border + "Node" badge) and managed with their
own independent rolling limit (maxNodeSnapshots setting), separate
from auto/manual snapshot pruning. Node snapshots skip hash-dedup
so repeated queue runs always capture.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Missed one occurrence of the old API in swapSnapshot() — the workflow
passed to loadGraphData was always undefined, making Swap behave
like Restore (new tab instead of in-place replacement).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
app.workflowManager doesn't exist in the modern Vue-based frontend.
The active workflow is accessed via the Pinia store at
app.extensionManager.workflow.activeWorkflow. Also replaces the
non-existent addEventListener("changeWorkflow") with Pinia's
$onAction watching for "openWorkflow" actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Snapshots are now stored as individual JSON files on the server under
data/snapshots/, making them persistent across browsers and resilient
to browser data loss. Existing IndexedDB data is auto-migrated on
first load.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ComfyUI activeWorkflow object doesn't have a .name property. It uses
.key (path minus workflows/ prefix) and .filename (no extension). The old
code always fell through to "default", making all snapshots share one key.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a workflow selector to the sidebar so users can browse and recover
snapshots from any workflow in the database, including renamed or deleted
ones. Includes amber viewing banner, take-snapshot guard, and lazy-loaded
workflow picker with counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Locked snapshots survive auto-pruning and "Clear All". Each snapshot
gets a padlock toggle; deleting a locked snapshot requires confirmation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-capture workflow snapshots with per-workflow hash map, promise-based
restore lock, custom naming, search/filter, theme-aware CSS, toast
notifications, and native confirm/prompt dialogs. Includes README with
SVG/PNG assets, MIT license, and ComfyUI registry publish action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>