New Features (2026-06-19) — Timed Input Macros
Replay recorded input with timing fidelity, and author press-hold-release combos with a small declarative DSL. Pure standard library; full stack. Both dispatch through an injectable sink and sleep, so they unit-test deterministically with a fake clock and a recording sink.
Timed timeline replay
from je_auto_control import replay_timeline
events = [{"op": "move", "x": 10, "y": 10, "delta_ms": 0},
{"op": "click", "x": 10, "y": 10, "delta_ms": 120},
{"op": "key", "key": "a", "delta_ms": 80}]
replay_timeline(events, speed=2.0) # plays twice as fast; gaps clampable
Each event’s delta_ms gap is honored, divided by speed (and clamped
to [min_gap, max_gap]). Event op is one of move / click /
scroll / press / release / key. Exposed as
AC_replay_timeline / ac_replay_timeline.
Input-sequence DSL
from je_auto_control import run_sequence
run_sequence([
{"op": "press", "key": "ctrl"},
{"op": "repeat", "times": 3, "steps": [{"op": "key", "key": "a"}]},
{"op": "wait", "ms": 50},
{"op": "release", "key": "ctrl"},
])
A declarative mini-language for press-hold-release chords and repeated
input: action ops (press / release / key / click / move
/ scroll) plus control ops {op: wait, ms} and
{op: repeat, times, steps:[...]}. Returns the flattened executed log.
Exposed as AC_input_sequence / ac_input_sequence.