Forget everything. The canvas is left exactly as it is.
What has been done and can be undone, newest first — the order the menu renders.
Fires on every change to the history. Returns a disposer.
What that span would touch — what drives the hover highlight and the menu's own copy.
Optionaldirection: "undo" | "redo"Redo the span running back through throughEntryId; the nearest one by default.
OptionalthroughEntryId: stringWhat has been undone and can be redone, newest first. Emptied by any new action.
Undo the span running from the newest entry through throughEntryId; the
newest entry alone by default. Lands as one dataBatchChanged.
OptionalthroughEntryId: stringthe entries actually reversed, newest first — sealed ones are passed over and are not in it.
A bounded, session-scoped history of what the canvas holds and shows: what was brought in, what was taken out, what was hidden.
Reached as
graph.history. Read it and drive it — the entry kinds are closed, so a consumer cannot record into it. Every entry names the specific elements it touched, which is what lets a sealed entry be skipped mid-span without the ones around it getting out of order.