0.1.87 — portal Settings parity + editor bug fixes

Portal: Settings parity with editor

  • Added _ApiKeySection widget (masked prefix, rotate/generate with one-time plaintext reveal + copy, MCP endpoint display).
  • Added _SecuritySection widget grouping API key, password change, and email change into a Card.
  • Added password-change dialog with identity-code verification gate.
  • Added email-change dialog (three-step: identity code → new email → confirmation code).
  • Added config-file export/import via .nchron archive format.
  • Implemented 5 new NotechondriaClient methods (sendIdentityCode, rotateApiKey, changePassword, changeEmailRequest, changeEmailConfirm).
  • Extracted NotechondriaClient abstract interface + HandshakeResult into client_base.dart to stay under 1000-line ceiling.

Editor: Bug fixes

  • Bug 1 — local drafts filter not discarding public notes. _loadInitialData hardcoded scope: 'personal' when fetching notes, which repopulated _learnerNotes with cloud data while the user had the filter set to "Local drafts only". Fixed by using the current _learnerSearchScope and skipping the backend fetch when scope is 'local'.

  • Bug 2 — horizontal card image height. Capped the cover image to 200 px in the horizontal (≥600 px) layout by replacing IntrinsicHeight + CrossAxisAlignment.stretch with CrossAxisAlignment.start + SizedBox(height: 200) on the cover.

  • Bug 3 — default Inbox not loaded for local (anonymous) users. Two fixes: (a) the remote-default deduplication in _loadInitialData is now gated on authentication so anonymous API responses don't remove the local Inbox from _localCourses; (b) _ensureStarterWorkspace auto-selects the local Inbox when found from a prior session and the user is not authenticated.

Files

 M frontend/editor_app/lib/core/initial_data.dart
 M frontend/editor_app/lib/core/local_starter.dart
 M frontend/editor_app/lib/modules/learner.dart
 M frontend/portal_app/lib/app_shell.dart
 M frontend/portal_app/lib/core/client.dart
 M frontend/portal_app/lib/main.dart
 M frontend/portal_app/lib/modules/settings.dart
 A frontend/portal_app/lib/core/client_base.dart
 A frontend/portal_app/lib/core/local_archive_io.dart
 A frontend/portal_app/lib/modules/settings_dialogs.dart
 A frontend/portal_app/lib/modules/settings_sections.dart