Commit graph

128 commits

Author SHA1 Message Date
Till JS
1486277733 feat(audits): add login credentials for all monitoring tools
- GlitchTip: guest@mana.how / guestguest
- Grafana: no login needed (anonymous viewer enabled)
- Umami: admin / umami

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:17:07 +01:00
Till JS
47f4f89b3c fix: update GlitchTip guest password to meet 8-char minimum
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:06:56 +01:00
Till JS
bc5b468d9b feat(audits): add monitoring tools section with GlitchTip guest credentials
Shows GlitchTip (error tracking), Grafana (metrics), and Umami (analytics)
links with guest login credentials directly on the audits page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:04:13 +01:00
Till JS
ac9ce55128 refactor(nav): move feedback pill into user dropdown across all apps
Feedback is now a sub-item under the Konto (user) dropdown in PillNavigation
instead of a standalone pill in the nav bar. Added feedbackHref prop to
PillNavigation (defaults to /feedback) and removed feedback from nav items
in all 11 apps and shared app-routes config.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 21:00:38 +01:00
Till JS
e848fa5342 feat(mukke): display album cover art in library, playlists, and song lists
Add batch cover-url endpoint (POST /library/cover-urls) to efficiently
resolve multiple cover art presigned URLs in a single request. Integrate
cover art display across all UI surfaces: album grid, album detail header,
song list thumbnails, playlist grid, and playlist detail song list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:59:45 +01:00
Till JS
97d5b13a38 feat(versioning): add semantic versioning and changesets to all apps
Assign version numbers based on app maturity: Calendar/Contacts/Todo (1.0.0),
Chat/Picture (0.3.0), 11 beta apps (0.2.0), Context/Planta/Questions (0.1.0),
Traces (0.0.1). Set up @changesets/cli for future version management.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 16:20:18 +01:00
Till JS
01cd7e90d2 docs(audits): update chat, picture, mukke audit reports with improved scores
Reflect production readiness improvements: Chat 74→82, Picture 72→81, Mukke 71→80.
Also fix Dockerfiles to include shared-error-tracking and shared-nestjs-setup packages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:24:05 +01:00
Till JS
212ec16125 docs(audits): update scores after Swagger and accessibility improvements
- Calendar: 92 → 94 (documentation 95→98, frontend 88→90, ux 85→88)
- Contacts: 93 → 94 (documentation 88→92, frontend 88→90, ux 82→85)
- Todo: 93 → 94 (documentation 90→95, frontend 85→88, ux 82→85)
All three now have: Swagger API docs, skip-to-content, ARIA navigation labels

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:42:12 +01:00
Till JS
4c342a53e8 docs(audits): update contacts and todo scores after E2E tests
- Contacts: 91 → 93 (testing 82→88, +10 Playwright E2E tests, 150 total)
- Todo: 91 → 93 (testing 85→90, +10 Playwright E2E tests, 190 total)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:25:23 +01:00
Till JS
7d0b2dbba8 docs(audits): update scores after controller tests and i18n expansion
- Calendar: 90 → 92 (testing 82→88, 227 total tests, 17 test files)
- Contacts: 90 → 91 (testing 78→82, 140 total tests, 11 test files)
- Todo: 90 → 91 (testing 80→85, 180 total tests, 11 test files)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 12:13:13 +01:00
Till JS
66e2cdc989 docs(audits): update calendar, contacts, todo scores to 90
- Calendar: 76 → 90 (132 backend tests, error boundary, 5 languages)
- Contacts: 80 → 90 (55 backend tests, 5 languages, 123 total tests)
- Todo: 79 → 90 (109 backend tests, 5 languages, 162 total tests)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 11:27:07 +01:00
Till JS
83d0b64119 docs(devlog): add 9 missing devlogs from Feb 16 to Mar 18
Covers all working days with commits since the last devlog (Feb 15):
- 2026-02-16: LightWrite launch, PWA rollout, Stripe SEPA
- 2026-02-17: spiral-db, Planta bot, Mana Values manifest
- 2026-03-06: Manalink mobile Matrix client
- 2026-03-07: Manalink Expo SDK 55 fixes
- 2026-03-11: CD pipeline with Mac Mini self-hosted runner
- 2026-03-12: Manalink EAS Build fixes
- 2026-03-15: Traces app, Calendar production hardening
- 2026-03-17: Mukke mobile, E2E tests, pre-commit hook
- 2026-03-18: Unit test coverage for contacts and todo

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:35:46 +01:00
Till JS
8c9d01a1f6 feat(audits): add production readiness scoring system with 19 app audits
- Add audits content collection to manacore landing (Astro schema with 8 category scores)
- Create scoring methodology doc (docs/PROD_READINESS_SCORE.md)
- Add audit list page with client-side filtering (status) and sorting (score/name/date)
- Add audit detail page with score bars, metrics, and markdown content
- Write audits for all 19 apps: calendar (76), contacts (80), todo (79), chat (74),
  picture (72), mukke (71), matrix (68), manacore (65), nutriphi (63), photos (62),
  zitare (62), context (60), skilltree (58), clock (58), storage (55), presi (55),
  planta (50), manadeck (48), questions (48), traces (35)
- Default sort: score descending; filters: All/Production/Beta/Alpha
- Deployed to Cloudflare Pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:20:18 +01:00
Till JS
bd1178edf8 feat(traces): integrate traces app into monorepo with NestJS backend and AI city guides
Restructure standalone traces app into monorepo pattern with mobile + backend + shared types.
Add NestJS backend with Drizzle ORM schema for locations, cities, places, POIs, and AI guides.
Add mobile sync layer, cities tab, and guide generation UI. Fix pre-existing type errors across
mobile codebase, matrix-mana-bot (sendDirectMessage), llm-playground, and all web auth stores
(signUp call signature).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 08:12:42 +01:00
Till-JS
212f4992c1 fix(manacore-web): handle contacts API response format
The Contacts API returns { contacts: Contact[], total: number }
but the service was treating it as a direct Contact[] array.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 13:56:47 +01:00
Till-JS
1d44f918c5 fix(manacore-web): add missing packages to Dockerfile
Add shared-pwa, qr-export, and wallpaper-generator packages
to the Docker build context for manacore-web.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 13:43:08 +01:00
Till-JS
497b12c561 ♻️ refactor(shared-ui): simplify PillNavigation - remove sidebar mode
- Remove isSidebarMode and onModeChange props from PillNavigation
- Remove desktopPosition prop (always bottom now)
- Remove toolbarContent snippet support
- Simplify PillTabGroup (remove sidebar mode)
- Update navigation-simple.ts store factory
- Remove navigation position settings from GlobalSettingsSection
- Update all 12 app layouts to use simplified navigation
- Add missing @sqlite.org/sqlite-wasm dependency to calendar

BREAKING CHANGE: PillNavigation no longer supports sidebar mode.
Navigation is now always horizontal at the bottom of the screen.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 13:27:23 +01:00
Till-JS
e5109da732 feat(wallpaper-generator): add device wallpaper generation package
Add new @manacore/wallpaper-generator package for creating device
wallpapers from QR codes and images.

Features:
- 30 device presets (phones, tablets, desktops)
- 3 layout types (center, corner, pattern)
- 5 gradient presets + solid color backgrounds
- Browser (Canvas) and Node.js (Sharp) renderers
- Svelte WallpaperModal UI component

Integrations:
- @manacore/qr-export: toWallpaper() function
- @manacore/spiral-db: toWallpaper() function
- QRExportModal: "Als Wallpaper" button

Also includes the full @manacore/qr-export package which was
previously untracked.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 12:57:43 +01:00
Till-JS
352388bb78 docs(manacore): add comprehensive Mana Values manifest
- Create central MANA_VALUES.md reference document in docs/
- Expand unsere-werte.md with full values manifest for landing page
- Add table and hr styling to mission page for proper rendering

Content includes: Vision, Mission, Three Pillars (Transparency, Fairness,
Innovation), Mana Principle with cost breakdown, Guiding Principles,
Responsibility (Ecological, Social, European Independence), and Future
Perspectives.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 11:08:11 +01:00
Till-JS
d9c5554189 feat(manacore): add QR code export to my-data page
- Add @manacore/qr-export dependency to web app
- Create qr-export.ts service to collect contacts, events, todos
- Create QRExportModal.svelte with QR preview and download buttons
- Add QR-Code button to my-data settings page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 10:47:24 +01:00
Till-JS
31f3d80fd6 ✈️ feat(pwa): add PWA dependencies to all 18 web apps
Add @vite-pwa/sveltekit and @manacore/shared-pwa devDependencies
to enable unified PWA architecture across all web applications:
- Calendar, Chat, Clock, Contacts, LightWrite
- ManaCore, ManaDeck, Matrix, NutriPhi, Photos
- Picture, Planta, Presi, Questions, Skilltree
- Storage, Todo, Zitare

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-16 13:13:40 +01:00
Till-JS
14da5a28ef 📝 docs(auth): update organization endpoint documentation
- Add all new organization management endpoints to API table
- Add new Invitations section for invitation endpoints
- Update controller JSDoc with complete endpoint list
- Update last updated date
2026-02-16 12:57:29 +01:00
Till-JS
b5d7524c77 💳 feat(stripe): add SEPA Direct Debit payment option
- Add sepa_debit to payment_method_types for credit purchases
- Add sepa_debit to subscription checkout sessions
- Handle payment_intent.processing webhook for SEPA status tracking
- Add blueprint article analyzing payment options (Stripe vs LSV+/FinTS)

SEPA offers lower fees (0.8% vs 1.5%+€0.25) for DACH customers.
Payments are confirmed 3-14 days after checkout (bank processing).
2026-02-16 12:05:19 +01:00
Till-JS
bfc2737ce5 ♻️ refactor(credits): simplify credit system by removing free credits and B2B
Remove free credits system (signup bonus, daily credits) and B2B organization
credits to simplify the codebase. Credits now only come from purchases or gifts.

Changes:
- Remove freeCreditsRemaining, dailyFreeCredits, lastDailyResetAt from balances
- Remove organizationBalances and creditAllocations tables from schema
- Simplify transaction types to: purchase, usage, refund, gift
- Remove B2B endpoints from credits controller
- Remove checkDailyReset, allocateCredits, deductCredits from service
- Add redeemPendingGifts method to auto-redeem gifts on registration
- Update frontend to remove free credits display
- Add database migration for the changes
- Update all related tests to match simplified system
2026-02-16 11:54:32 +01:00
Till-JS
7747ca6a36 📝 docs(devlog): add missing devlogs for Jan 24-27 and Feb 14-15
Add 5 devlogs covering previously undocumented development days:
- 2026-01-24: Guest mode improvements for Clock & Contacts
- 2026-01-25: NutriPhi app, Prometheus monitoring, Watchtower
- 2026-01-27: Matrix self-hosting, Stats/Doc/Ollama bots
- 2026-02-14: Matrix STT bot, gift code UI, onboarding bot
- 2026-02-15: Onboarding modal polish, Calendar ViewsBar
2026-02-16 11:40:37 +01:00
Till-JS
7b2ae94474 💄 fix(onboarding): use correct elevation layer colors for modal 2026-02-16 10:48:01 +01:00
Till-JS
d7ce61565f 💄 style(onboarding): convert fullscreen to compact modal 2026-02-16 10:41:44 +01:00
Till-JS
8dad8a8302 🐛 fix(manacore-web): use runtime auth URL instead of hardcoded localhost
Added shared config.ts with getManaAuthUrl() that reads the auth URL from
window.__PUBLIC_MANA_CORE_AUTH_URL__ (injected by hooks.server.ts) instead
of hardcoded localhost:3001. Fixes API calls failing on production.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-14 12:47:40 +01:00
Till-JS
a4ef703761 feat(manacore): add gift code web UI
Add web interface for redeeming and managing gift codes:
- API service for all gift operations (create, redeem, list, cancel)
- Public preview page at /g/[code] for gift info before login
- Protected redemption flow with riddle support
- Dashboard with tabs: received gifts, created codes, create new
- Gift icon added to navigation and shared-ui
2026-02-14 12:01:24 +01:00
Till-JS
c843531595 feat(analytics): update Umami tracking IDs for all web apps
Update all 15 web apps with correct Umami website IDs:
- calendar, chat, clock, contacts, manacore, manadeck, picture, planta, todo: updated IDs
- zitare, storage, nutriphi, skilltree, photos, presi: added tracking

All IDs now match the websites configured in Umami.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-14 11:14:16 +01:00
Till-JS
40a3c89852 📝 docs(devlog): add devlogs for Feb 12 and Feb 13
- Feb 12: GDPR Self-Service, Matrix Mobile UX, Mac Mini Stability
- Feb 13: Gift Codes, Stripe Integration, Zitare Deployment

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-14 00:02:53 +01:00
Till-JS
72ee715300 feat(manacore): enhance API keys management UI 2026-02-13 23:29:41 +01:00
Till-JS
5118235e0b feat(manacore): add avatar upload frontend and onboarding wizard
- Add avatar upload to EditProfileModal with presigned URL flow
- Create onboarding wizard with 5 steps: Welcome, Profile, Apps, Credits, Complete
- Add onboarding store with localStorage persistence
- Integrate wizard into app layout (shows for new users)
- Update MANACORE-TODOS.md to mark completed tasks
2026-02-13 23:18:10 +01:00
Till-JS
d3b0f9f38d feat(manacore): add profile, subscription, and credits frontend
Profile Features:
- EditProfileModal for name changes
- ChangePasswordModal with validation
- DeleteAccountModal with email confirmation

Subscription Features:
- Full subscription page at /subscription
- Plan comparison with monthly/yearly toggle
- Stripe Checkout integration
- Billing portal access
- Invoice history display

Credits Features:
- Stripe Checkout integration for credit purchases
- Loading states and toast notifications
- Success/error handling with URL params

API Services:
- profile.ts: getProfile, updateProfile, changePassword, deleteAccount
- subscriptions.ts: getPlans, getCurrentSubscription, createCheckout, etc.
- credits.ts: added initiatePurchase method

Also includes German/English i18n translations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 22:46:25 +01:00
Till-JS
7d1b4a40d2 feat(dashboard): add StorageUsageWidget
Add new dashboard widget showing storage usage stats:
- Total storage used and file count
- Recent files list with icons
- Link to open Storage app

Backend changes:
- Add GET /api/v1/files/stats endpoint to storage backend
- Returns totalFiles, totalSize, favoriteCount, recentFiles

Frontend changes:
- Add storageService API client
- Add StorageUsageWidget component
- Add i18n translations (de/en)
- Register widget in dashboard types and container

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 22:34:10 +01:00
Till-JS
b5dde8e31d 📝 docs(dsgvo): update privacy policy and fix datenschutz link
- Fix datenschutz link to point to manacore-landing.pages.dev
- Update hosting info to reflect own infrastructure in Germany
- Add Cloudflare CDN section
- Update analytics section with Umami details (no cookies)
- Change email domain from mana.ai to mana.how
- Remove archived Memoro app section
- Update date to February 2026

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 19:37:04 +01:00
Till-JS
ab15c2367b feat(gdpr): add DSGVO improvements for self-service data page
- Add account deletion confirmation email
- Extend data export with sessions, security events, transactions
- Add DSGVO info banner with privacy policy link
- Add data retention periods section
- Add cookie info (no tracking cookies)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-13 13:43:23 +01:00
Till-JS
a373784954 💄 style(devlog): improve activity page design
- Show 90-day grid instead of 365 for better visibility
- Add month labels above the contribution grid
- Use European week start (Monday)
- Add animated hero section with gradient backgrounds
- Improve stat cards with hover effects and shadows
- Add secondary stats: Active Days, Commits/Day, Max Streak
- Make grid cells clickable to open respective devlog
- Add crown icon for top contributor
- Show percentage in contributor progress bars
- Add date badges to recent activity items
- Use glassmorphism effects and smooth animations
2026-02-13 12:21:01 +01:00
Till-JS
f4c2663122 feat(devlog): add activity grid page and extended stats
Add GitHub-style activity grid showing development contributions:
- Activity grid with color-coded commit intensity
- Total stats: commits, files changed, lines added/removed
- Contributors section with commit counts
- Recent activity list

Extended devlog schema with:
- stats: filesChanged, linesAdded, linesRemoved
- contributors: name, handle, commits per contributor
- workingHours: start/end timestamps

Updated all 9 devlogs with accurate git stats.
Added link to activity page from devlog index.
2026-02-13 12:07:23 +01:00
Till-JS
cdb6e25885 fix(admin): storage backend needs api/v1 prefix in controller
Storage backend doesn't use setGlobalPrefix, so controller
needs full path @Controller('api/v1/admin')

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:59:33 +01:00
Till-JS
177e4eea88 fix(docker): add missing shared packages to manacore-web Dockerfile
Add shared-vite-config and shared-stores packages that were missing
from the Docker build context.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:26:45 +01:00
Till-JS
9881e84ee3 feat(auth): add GDPR self-service endpoints for user data
Add /api/v1/me/data endpoints for users to view, export, and delete
their own data without admin privileges (GDPR compliance).

Backend:
- New MeModule with MeController and MeService
- GET /api/v1/me/data - view own data summary
- GET /api/v1/me/data/export - download as JSON
- DELETE /api/v1/me/data - delete all own data

Frontend:
- New /settings/my-data page with full data overview
- Export button for JSON download
- DeleteConfirmationModal with email verification
- Link from settings page to my-data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 13:20:08 +01:00
Till-JS
8b6ff0c679 feat(auth): add API key management for STT/TTS services
- Add api_keys schema in mana-core-auth with SHA-256 hashing
- Create NestJS module with CRUD endpoints and validation
- Add external auth module to STT/TTS for sk_live_ key validation
- Create web UI page at /api-keys for key management
- Support rate limiting per key with configurable limits
- Cache validation results for 5 minutes to reduce auth service load

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 02:12:05 +01:00
Till-JS
91f175c8f6 🐛 fix(deps): add missing shared-stores dependency to web apps
storage-web and manacore-web both use shared-stores but it wasn't declared
as a dependency in their package.json files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 18:19:38 +01:00
Till-JS
a2e2a5b73c feat(admin): add user data dashboard for cross-project data visualization
Add comprehensive admin dashboard to view and manage user data across all projects:

Backend:
- Add admin endpoints to Chat, Todo, Contacts, Calendar, Picture, Zitare, Presi
- Each backend exposes GET/DELETE /api/v1/admin/user-data/:userId
- Service-to-service auth via X-Service-Key header

Aggregation (mana-core-auth):
- GET /api/v1/admin/users - Paginated user list with search
- GET /api/v1/admin/users/:userId/data - Aggregated data from all backends
- DELETE /api/v1/admin/users/:userId/data - GDPR deletion across all projects

Frontend (ManaCore web):
- New User Data tab in admin navigation
- User search page at /admin/user-data
- User detail page with ProjectDataCard components
- GDPR deletion dialog with email confirmation

Presi:
- Migrate user_id from UUID to TEXT for Better Auth compatibility
- Add SQL migration script
2026-02-11 14:59:18 +01:00
Till-JS
feaf27dd14 feat(auth): implement cross-subdomain SSO for all web apps
Add Single Sign-On (SSO) support across all mana.how subdomains:

- Add trySSO() method to @manacore/shared-auth that exchanges session
  cookies for JWT tokens
- Add /api/v1/auth/session-to-token endpoint to mana-core-auth service
- Update all 15 web apps to try SSO during auth initialization

SSO Flow:
1. User logs in on any app (e.g., calendar.mana.how)
2. Session cookie is set with Domain=.mana.how
3. When visiting another app (e.g., todo.mana.how), it checks for
   local tokens first
4. If no local tokens, tries SSO via session cookie
5. Session cookie is exchanged for JWT tokens via new endpoint
6. User is automatically authenticated

Apps updated: calendar, chat, clock, contacts, manacore, manadeck,
nutriphi, picture, planta, presi, questions, skilltree, storage,
todo, zitare

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 13:17:04 +01:00
Till-JS
ff22a29723 🌐 feat(i18n): make all auth pages multilingual
Add dynamic locale support to all login, register, and forgot-password
pages across apps. Pages now use $locale from svelte-i18n instead of
hardcoded language codes.

Apps updated:
- clock: login (also consolidated to standard pattern)
- manacore: register
- manadeck: register
- nutriphi: login, register, forgot-password
- picture: register, forgot-password
- planta: login
- questions: login, register, forgot-password
- skilltree: login, register, forgot-password

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 12:54:52 +01:00
Till-JS
d703ccfd80 feat(auth): add resend verification email to registration screen
- Add prominent email verification success UI with resend button
- Show resend verification option when registration fails with "not verified" error
- Improve form spacing with space-y-4 for better visual consistency
- Add translations for resend verification in all languages (de, en, fr, it, es)
- Update all 13 app register pages to pass onResendVerification prop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 12:44:28 +01:00
Till-JS
03abacc854 🐛 fix(web-apps): fix Vite type compatibility and Svelte 5 store issues
- Simplify vite.config.ts files to avoid type incompatibility errors
  caused by different @types/node versions across the monorepo
- Add missing set() method to isSidebarMode store in matrix/web

Affected apps: calendar, chat, clock, contacts, manacore, manadeck,
matrix, nutriphi, picture, planta, presi, questions, storage, todo

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 04:00:29 +01:00
Till-JS
550083241f 🐛 fix(mana-core-auth): add explicit urlencoded body parser for OAuth token endpoint 2026-02-01 03:56:17 +01:00