Can anyone speculate on at least the class of algorithms they are using?
Actions can "do" and "undo" themselves against the document trivially. Then to save space, you compress adjacent actions into single actions (e.g. add('a', 0) and add('b', 1) compress to add("ab", 0)).
Algorithmically it shouldn't be complicated. Maybe they just keep history of what happened in the environment and reproduce it. Maybe they even have some checkpoints saved so that there is no need to reconstruct it from the beginning every time. And maybe they can compress events. Instead of: (type a),(type s),(type k) they have just (type ask) and in case you want better granularity they have it recorded somewhere.