OConnector v1.3.1
What's New in v1.3.1
Added
- SSE connection generation — atomic generation counter ensures stale events from previous connections are filtered out at both EventBus and ViewModel layers. Prevents ghost messages when switching servers or reconnecting.
- Network recovery monitoring — automatic SSE restart when network connectivity recovers after a disconnect.
Fixed
- Startup crash when server unreachable — the SSE foreground service was started before
testConnection()confirmed the server was reachable. When the server was down, the service entered a retry loop that raced withdisconnect(). Nowconnect()only configures the HTTP/SSE clients, andstartSseService()is called only after the connection test succeeds. - DTO deserialization crash — all non-null DTO fields now have default values, and
coerceInputValues = trueis enabled on the Json instance. Server responses with missing or null fields no longer causeMissingFieldExceptionorIllegalArgumentException. - Recovery bubble false positive — the recovery heuristic no longer triggers when AI is actively working via TUI.
- Agent picker missing custom agents — agents with
hidden: null(instead offalse) are no longer filtered out. - Main thread Keystore I/O —
getPassword()now runs onDispatchers.IOinstead of the main thread, preventing ANR during EncryptedSharedPreferences initialization. - SSE client thread safety —
sseClientmarked@Volatile,sseChannelusesAtomicReferenceto prevent data races. - Foreground service crash —
SseForegroundService.start()andrestart()now catchForegroundServiceStartNotAllowedException. - NetworkMonitor SecurityException —
registerNetworkCallback()wrapped in try-catch for permission-denied edge cases. - Null intent service restart —
onStartCommandwith null intent (system restart) now callsstopSelf()and returnsSTART_NOT_STICKYto avoid stale generation state.
Full Changelog: v1.3.0...v1.3.1