b779fbf423
Exports createBudgetedLoop (+types) through the plugin SDK and migrates the Bots plugin's face-animation clock onto it. The hand-rolled clock only checked document.hidden; via the shared loop it now also pauses while the window is minimized or unfocused, matching every other desktop render loop. - sdk/index.ts: export createBudgetedLoop/BudgetedLoop/BudgetedLoopOptions from @/lib/budgeted-loop with plugin-facing guidance - hermes-bots/plugin.js: startFaceClock delegates scheduling to the SDK loop when present (fps 15, idleWhen = no visible faces); paint body, IO-based visibility tracking, and the 1Hz rescan are shared; the hand-rolled rAF path remains as a feature-detected fallback for older desktops, per the plugin's established SkillsView/McpTab pattern - tests: new SDK-path case (fps/idleWhen wiring, visibility wake, re-entry wake, dispose-on-stop) driven through an injected fake loop; verified to fail with the SDK branch removed; existing fallback-path tests unchanged