Records and replays named keystroke macros.
The phase carries exactly one active lifecycle, while replay can preserve a post-replay recording phase that is restored after the outermost replay returns normally.
Summary
Types
@type key() :: {non_neg_integer(), non_neg_integer()}
@type phase() :: :idle | {:recording, String.t(), [key()]} | {:replaying, pos_integer(), post_phase()}