sxGet and sxPost in src/sx.js call fetch with no AbortSignal:
const res = await fetch(url, { headers: { accept: 'application/json' } });
Undici gives a connect timeout but no response timeout, so a server that accepts the connection and then says nothing hangs the promise for good.
reloadAccounts awaits that path whenever the sx key or mode on disk differs from the running one:
if (diskSxKey) await sx.configure(diskSxKey, diskSxMode);
configure goes to _ensureProxy, then provision, then sxGet. So POST /teamclaude/reload and the TUI's R key never come back. res.json() after it has no size cap either.
Narrow trigger: a configured sx.apiKey, a changed sx setting on disk, and an api.sx.org that stalls rather than fails. AbortSignal.timeout(...) on both helpers would cover it.
sxGetandsxPostinsrc/sx.jscallfetchwith noAbortSignal:Undici gives a connect timeout but no response timeout, so a server that accepts the connection and then says nothing hangs the promise for good.
reloadAccountsawaits that path whenever the sx key or mode on disk differs from the running one:configuregoes to_ensureProxy, thenprovision, thensxGet. SoPOST /teamclaude/reloadand the TUI's R key never come back.res.json()after it has no size cap either.Narrow trigger: a configured
sx.apiKey, a changed sx setting on disk, and an api.sx.org that stalls rather than fails.AbortSignal.timeout(...)on both helpers would cover it.