Context
Agent Support is the production layer I built on top of GestureKit to run my actual SWTOR characters. Where GestureKit is the general-purpose gesture detection engine, Agent Support is the application — 7 fully tuned character profiles, a Global Cooldown manager that understands the game's timing model, special-key behaviors that go well beyond standard macro execution, and a calibration system with a live WebSocket server for hot-reloading thresholds without restarting the engine.
The Omega Gesture System
Agent Support runs the Omega detector exclusively. Omega was designed around SWTOR's combat pace: long gestures fire the moment the hold threshold is crossed rather than waiting for key release, which eliminates the quarter-second lag that made the Alpha system feel sluggish during active rotations.
The four base gesture types are quick, long, quick_toggle, and long_toggle. The toggle variants require W or Y to be held past threshold before the gesture fires, creating a second layer of bindings on every key without adding any physical keys to the mapping. Three modifier layers extend this further:
The result is up to 13 distinct gesture types per key across all layers, all resolved with zero ambiguity because each modifier state is tracked independently.
7 Character Profiles
Profiles are defined as TypeScript arrays of binding objects — `SHARED_BINDINGS` inherited by all characters plus per-character overrides — and compiled into O(1) lookup maps at startup. The seven profiles:
Every profile also configures per-key bindings for the number row (1–6), A, B, H, I, U, and all Omega modifier variants of those keys.
D Key — Four Stream Modes
The D key is not a standard gesture key. It toggles an R-stream: periodic synthetic R keypresses at configurable intervals, used to maintain continuous ability queueing in SWTOR. Four modes are defined per profile:
Toggling D on announces the mode via TTS. Toggling it off silences it. The stream runs independently of gesture detection so active key presses don't interrupt the loop.
S Key — Dual-Purpose Ability and Group Targeting
S has two distinct behaviors separated by hold duration:
C Key — Double-Tap ESCAPE
C implements hybrid quick/long detection with a double-tap intercept. A single quick tap fires the profile's C binding normally. A double tap within a 300ms window produces a synthetic ESCAPE keypress — useful for dismissing targeting cursors or closing dialogs mid-rotation without breaking hand position.
GCD Manager
SWTOR's global cooldown is exactly 1.275 seconds. The GCD manager tracks this timer in software and enforces a most-recent-wins queue:
The practical effect: you can mash a key ahead of the GCD and the system fires the ability at exactly the right tick without double-pressing or missing the window.
Calibration System with WebSocket Hot-Reload
Timing calibration is per-machine. The calibration manager runs a measurement sequence, collects hold-duration samples across the monitored key set, and applies statistical analysis (mean, standard deviation, confidence scoring) to compute per-key thresholds. Results are stored as named calibration profiles.
The calibration server runs a WebSocket server on port 8765. When a new calibration run completes, it broadcasts updated thresholds to any connected listeners — including the live gesture engine. This means you can recalibrate mid-session and have the new thresholds take effect immediately without restarting the process.
Traffic Controller and Profile Compiler
Several keys in SWTOR require modifier combinations (e.g., SHIFT+4) that coexist with unmodified versions of those same keys in other concurrent sequences. The traffic controller prevents contamination:
At load time, the profile compiler performs a pass over all bindings and identifies conundrum keys — keys that appear both with and without a specific modifier in the active profile. These are stored in a lookup set. At execution time, the traffic controller checks whether a conflicting modifier (Shift, Alt) is physically held before emitting the keypress. If the modifier is held and the key is a conundrum key, the output is delayed until the modifier is released. This check has zero overhead for non-conundrum keys.