399fdeae8b
Three bugs in apps/desktop/src/plugins/hermes-bots/plugin.js: 1. register() subscribed host.state.profile / host.state.gateway listeners without capturing the unbind functions, so a plugin disable -> re-enable cycle stacked a duplicate listener per cycle that kept firing until app quit (same survives-disable class as the face clock before its onDispose hook). The unbinds are now captured and released via ctx.onDispose. 2. CreateRoutineDialog passed `key: createTarget` INSIDE the jsx() props object. The react/jsx-runtime silently ignores a `key` prop there (key is the third jsx() argument), so switching the routine owner never remounted the dialog and it kept stale per-bot form state. Moved the key to the third argument; the source-shape test now pins the correct shape and rejects the prop form. 3. beginOAuth() overwrote pollRef.current without clearing an existing interval, so a retry / double-click while a poll was live orphaned a 2s poller that ran until unmount and could flip the phase from a stale OAuth session. It now clears any live poll before starting a new one.