Hi there,
I think the simplest way would be to create an 'Undo' object that contains both the Action and the Result, and put them into a stack when the result is returned from the server. If you want to undo something, send the top Result back to the server, and push the Undo object onto the onto the 'Redo' stack. If you want to redo it, just send the Action back to the server. Fairly straightforward.
As far as intercepting them goes, the simplest is probably to create a custom DispatchAsync implementation that caches the Actions/Results for you automatically. Perhaps providing some kind of marker to distinguish 'Undoable' actions. Probably an 'UndoableAction' and 'UndoableResult' superclass would be simplest, given GWT's restrictions with interfaces...
Regards,
David