v1.6.0 — Magic-Link OTP + Settings v3 + Stripe Portal stopgap
1.6.0 — 2026-05-19
Minor — Magic-Link OTP + Settings v3 inline-merge + Stripe-portal stopgap. Adds passwordless email login as a third auth method alongside passkey + password. Settings v3 sprint lands the capability registry, tier audit, show-all-grayed pattern, Account pages, and inline merge of Advanced into the LLM main page. The broken control.lynox.cloud/checkout/account CTA in Account+Billing is replaced with a Stripe-hosted Customer Portal link + support@ fallback (full engine→CP→Stripe SSO deferred — see PRD-STRIPE-PORTAL-SSO.md v3). Light-mode theme ships. Plus a session-cookie hardening pass (SameSite=Lax + OTP stale-session guards) and a http_request hang-fix that previously could lock a session.
Added
- Magic-link OTP auth (#472, pro #149) — Email-driven passwordless login alongside passkey + password. HMAC token mint/verify/consume with nonce-replay protection, 15-min TTL. Staging-E2E proven on
meridian-demovia Mailpit. - Light mode (#476) — Web-UI theme switcher; persists to user prefs.
- Settings v3 sprint (#471) —
ModelCapabilityregistry as single source of truth for tier/context-window display. Tier-awareness audit across all settings pages. Show-all-grayed pattern for managed-blocked sections. Account pages (Appearance, Security, Limits, Updates) split out from monolithicSystemSettings. Advanced merged inline into the LLM main page. - Stripe-portal URL forwarding (pro #151) —
MANAGED_STRIPE_PORTAL_LOGIN_URLfrom CP env now flows to every managed instance's.envasLYNOX_STRIPE_PORTAL_LOGIN_URL. Engine/api/configsurfaces it understripe_portal_login_urlfor the Account+Billing CTA. Prefix-guarded tohttps://billing.stripe.com/.
Fixed
- Broken
control.lynox.cloud/checkout/accountCTA (#478) — Account+Billing now opens the Stripe-hosted Customer Portal login URL when configured, falls back tomailto:support@lynox.aiotherwise. /auth/magicauth-gate hole (#477) — Magic-link callback route exempted from the session-cookie auth gate (was 401-blocking the pre-login token verification).- LLM defaults dropdown (#479) —
effort_level,thinking_mode,experienceselects now show aDefaultoption matching the model's actual default instead of forcing a choice between "Schnell" / "Deaktiviert". - Settings sub-view back-links (#479) —
← Back to settingsadded on Account Appearance, Workspace Security, Workspace Limits, Workspace Updates (were dead-ends). - Tool taxonomy (#479) —
capture_process+promote_processmoved from System to Orchestration (the_processregex was incorrectly bucketing workflow tools as System). - OTP stale-session bypass (#469) — Guarded OTP actions against requests with stale session cookies;
SameSite=Laxmigration tightens cross-site request scope. http_requesthang unsticks session (#470) — Wall-clock cap + takeover + cancel for hung HTTP requests.managed_blockedprediction (#466) — UI predicts managed-blocked state from tier instead of waiting for runtime 403. Fixes context-window display drift on managed.ask_secretmanaged-vs-cancel (#465) — Distinguish CP-rejected secret writes (managed-blocked) from user-cancel inask_secret.
Security
- Managed secret allowlist inverted (#468) — Default user-writable on managed; narrow deny-list (
LYNOX_*,MANAGED_*,MAIL_ACCOUNT_*,WHATSAPP_*,GOOGLE_OAUTH_*,SMTP_*,IMAP_*) is admin-only. Realises the core promise: customers connect any API without filing a support ticket. - OAuth2 fail-loud — OAuth flow errors now surface immediately rather than silent-fail.
- Engine-managed Bearer auth — Stricter Bearer-token verification across managed surfaces.