Wire-Konvention für authenticated Account-Endpoints (changeEmail,
changePassword, deleteAccount) geklärt. Server-seitig wurde in
mana-auth Better Auths bearer-Plugin aktiviert (requireSignature:
false), das Session-Tokens zu Session-Cookies konvertiert. Native-
Apps senden daher jetzt den Session-Token (refreshToken-Feldwert)
statt des JWT als Authorization: Bearer für diese drei Endpoints.
Der JWT bleibt für app-eigene Backends (memoro-api, cardecky-api,
manaspur-api) der richtige Authorization-Header — die Trennung ist
nur für mana-auth interne Endpoints.
currentSessionToken() als public Helper hinzu (symmetrisch zu
currentAccessToken).
38/38 Tests grün.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 1 aus dem Native-Auth-Vollausbau-Plan (Option A, siehe
mana/docs/MANA_SWIFT.md). 7 neue AuthClient-Methoden für die
Account-Reise: register, forgotPassword, resetPassword,
resendVerification, changeEmail, changePassword, deleteAccount.
AuthError jetzt mit 19 präzisen Cases gespiegelt aus
AuthErrorCode in mana-auth/lib/auth-errors.ts, plus
AuthError.classify() als public Helper und Equatable-Conformance.
AuthClient.lastError ergänzt — strukturierter Fehler für
ManaAuthUI das den .emailNotVerified-Gate programmatisch braucht.
signIn und refreshAccessToken auf neue Klassifikation umgestellt.
Breaking: AuthError.serverError hat zusätzliches code:-Argument.
Apps (cards-native, memoro-native) sind bereits angepasst.
38/38 Tests grün (26 neu): AuthErrorClassifyTests deckt jeden
ErrorCode + Status-Heuristik + Retry-After ab, AuthClientAccountTests
deckt jede neue Methode via URLProtocol-Mock ab.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
URL.appending(path:) behandelt das ? in Query-Strings als Pfad-
Component und URL-encoded es zu %3F. Server-Route-Matching scheiterte
mit 404 für alle Endpoints mit Query-Parametern.
Symptom in cards-native v0.8.x: alle Card-Counts und Due-Counts auf 0,
DeckDetailView Cards-Liste leer mit "Server-Fehler (404)" auf
/api/v1/cards?deck_id=X.
Fix: String-Konkatenation baseURL.absoluteString + path. Caller
liefert path inkl. führendem / und optionaler Query. URLRequest
parsed das Resultat korrekt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>