mmmexplorer

OBSERVED MMM COMMIT #280

Add undo and redo

mmm-observation:sha256:a84677b31a42cb9efad848559fee82a117a6da28b5347abd641d0b881cd6e73c

Signed revision

Revision ID
mmm-revision:sha256:9071aeb63e3f3ff5ab1563af143e45c42641956f03395673463840dc74f4a802
Backend
Git
Issued
2026-08-29 06:25:47 UTC
Manifest
mmm-manifest:sha256:6c62b61b92ebce5f375a662c7dd4d838dd24138a61d1fe6395be5e5e63891c01

CANONICAL RECORD VIEW

Revision payload

{
  "backend": {
    "author": {
      "email": "drschwabe@fastmail.com",
      "name": "Derrick Schwabe",
      "time": 1787984747
    },
    "commit": "git:sha1:26518795fca299b777976f242d8127d41014e5a1",
    "committer": {
      "email": "drschwabe@fastmail.com",
      "name": "Derrick Schwabe",
      "time": 1787984747
    },
    "manifest": "mmm-manifest:sha256:6c62b61b92ebce5f375a662c7dd4d838dd24138a61d1fe6395be5e5e63891c01",
    "message": "Add undo and redo\n\nCTRL+Z undoes, CTRL+Y and CTRL+SHIFT+Z redo. Moves, deletes, pastes, resizes\nand property edits all step back.\n\nHistory records a snapshot of state.nodes on every render/nodes where the\ndocument differs from the last one. Everything that changes anything already\nfires that event, so no module has to describe how to reverse itself, and\nanything added later is undoable without knowing history exists.\n\nSnapshots are cloneDeep, which is cheap even for meshes full of inline\nbase64: JS strings are immutable, so cloning an object holding one copies a\nreference. A snapshot costs one object per node; history caps at 50 steps.\n\nVolatile fields — selected, processing, template — are excluded from the\ncomparison, so clicking between nodes never becomes an undo step. A restoring\nflag stops a restore recording itself, and history resets on load so undo\ncannot reach into a mesh that is no longer open.\n\nThe canvas colour is not covered: it lives on state, not in state.nodes.",
    "objectFormat": "sha1",
    "parents": [
      "git:sha1:1fb7a422d60eb5b07fa402cfea5badb3b46df745"
    ],
    "ref": "refs/heads/master",
    "summary": "Add undo and redo",
    "tree": "git:sha1:25d567b811f13f8f546666eda10e64e83b602864",
    "type": "git"
  },
  "issuedAt": "2026-08-29T07:25:37.165Z",
  "previous": "mmm-revision:sha256:618fc65cfc305afe47838e6f517dbbbbe8d8a9e385917c32d4dc1ee0e6bd2998",
  "project": "mmm1np06566gf6u8fpyj84u2emf25l98qad36700d2nlep6jzqdknp8qkyd3xu",
  "protocol": "mmm/0-alpha",
  "sequence": 19,
  "type": "mmm/revision"
}