SIGN IN SIGN UP

feat(workspace): canvas undo/redo (Cmd+Z / Cmd+Shift+Z + toolbar buttons)

Hand-rolled past/future snapshot stacks in the flow store: every mutator
commits a pre-mutation snapshot (add/remove/expand/compose/connect/
disconnect/drag-start/reconnect), while form edits coalesce per focus
session via a focusin generation counter (flow-history.ts).

Programmatic node.data writes must stay out of history or they re-fire
after every undo and break the chain (clearing the redo stack each time).
All such writes now pass { history: false }:

- pluginModel default normalization (node-plugin-model-select)
- feature mirror on mount (use-abi-execution)
- mount-time picker defaults in six nodes (text-gen-image,
  image-gen-video-compose, video-image-gen-video-move,
  speech-image-gen-video, music-cover, music-extract) via new
  form.set/form.patch history opts (use-abi-form)

UI: undo/redo buttons top-left of the canvas (localized en/zh/ja/ko),
keyboard shortcuts skip editable targets so native text-input undo wins.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
T
tong-io committed
917ecf36eea71d41edde6b805aef4f7caebfc3b5
Parent: 338b613