- Add STT_API_KEY to matrix-mana-bot and matrix-clock-bot
- Fix STT_URL port (3020/3021 → 3026) for consistency
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add apiKey option to TranscriptionModuleOptions
- Send X-API-Key header in all STT requests when configured
- Support config via module options, stt.apiKey, or STT_API_KEY env var
- Update CLAUDE.md documentation with API key usage example
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add new ViewsBar component with same design as InputBar
- Position ViewsBar next to InputBar (left on desktop, above on mobile)
- Remove view switcher from PillNavigation prependElements
- Remove PillViewSwitcher from CalendarToolbarContent
- Clean up unused imports and code from layout
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add STT bot container config on port 4021
- Uses mana-stt service via host.docker.internal:3026
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When a bot edits its message (like timer updates), other bots were
responding to each edit as if it were a new message. This fix adds
isEditEvent() check to ignore m.replace events.
- New bot that transcribes voice messages to text
- Uses mana-stt service (Whisper/Voxtral) for transcription
- Supports German and English with auto-detection
- Commands: !language, !model, !status, !help
- Runs on port 3024
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add looksLikeMealDescription() heuristic to detect meal descriptions
- Add autoAnalyzeText() to handle automatic text analysis
- Text messages with food keywords or numbers are now auto-analyzed
- Skip greetings and questions to avoid false positives
Added documentation for the isBot() method and automatic bot message
filtering that prevents infinite loops when multiple bots share a room.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Drizzle ORM requires explicit null values for optional fields instead of
leaving them undefined. Added explicit null for organizationId,
idempotencyKey, portionNumber, and creditTransactionId.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Drizzle ORM throws "UNDEFINED_VALUE" error when inserting undefined values.
Convert dto.sourceAppId to null using nullish coalescing operator.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Better Auth generates string IDs, not UUIDs. Updated schema to match
other apps like Calendar that use text for user_id.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Prevents infinite message loops when multiple bots are in the same room.
Checks if sender has '-bot' in their Matrix user ID localpart.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Don't call $t() before i18n is loaded
- Use loading spinner instead of translated text during load
- Conditionally render title in svelte:head
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Store original room topic when timer starts
- Update room topic with timer progress every 10 seconds
- Show status icon, remaining time, percentage, and label
- Restore original topic when timer finishes or is deleted
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- Use transparent background to adapt to Element theme
- Remove min-height and centering (content starts at top)
- Reduce font sizes and spacing for compact display
- Use semi-transparent backgrounds for theme compatibility
- Add flex-wrap for narrow panels
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add matrix-onboarding-bot service that guides users through profile setup
- Extend mana-core-auth GlobalSettings with displayName, interests, onboardingCompleted fields
- Implement state machine for onboarding flow (NAME → INTERESTS → LANGUAGE → SUMMARY)
- Support commands: !start, !profile, !edit, !skip, !help
- Add German and English localization
- Integrate with mana-core-auth Settings API for profile persistence
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Updated Technology Stack to reflect gemini-2.5-flash model
- Added note about getting API key from Google AI Studio
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
NestJS matches routes in declaration order. The dynamic :code route was
matching before me/created and me/received, treating 'me' as a gift code.
Moved specific routes before the dynamic parameter route.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add REDIS_HOST, REDIS_PASSWORD for session storage
- Add MANA_CORE_AUTH_URL, MANA_CORE_SERVICE_KEY for Matrix-SSO-Link
- Add redis dependency to depends_on
- Use local image build instead of GHCR
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- !stats now shows personal stats (requires login)
- !global now shows global Umami analytics
- Update keywords and help text accordingly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Piper TTS section to mana-tts CLAUDE.md
- Document available German voices (local and cloud)
- Update matrix-tts-bot CLAUDE.md with new default voice
- Add language auto-detection documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isTokenValid() to decode JWT and check exp claim
- Refresh tokens 60 seconds before expiry (buffer)
- Auto-fetch fresh token via SSO-Link when cached token expires
- Clear invalid sessions when refresh fails
- Prevents "exp claim timestamp check failed" errors
JWT tokens from mana-core-auth expire after 15 minutes, but sessions
were cached for 7 days. Now tokens are transparently refreshed when
they expire, keeping users authenticated.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Download and configure Kerstin Piper voice (63MB, local)
- Update piper_service.py to support multiple voice models
- Set de_kerstin as default voice for TTS bot
- Update help text with new voice options
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The auto endpoint now properly routes German voices (de_thorsten, de_katja, etc.)
to Piper TTS instead of falling back to English Kokoro voices.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add editMessage() method to BaseMatrixService for Matrix message editing
- Implement live timer updates every 10 seconds using background interval
- Display progress bar using Unicode block characters (█░)
- Track active timers and update messages with current state
- Show percentage completion and remaining time
- Handle timer pause/resume/finish states
- Clean up tracking on timer completion or errors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The experimental model gemini-2.0-flash-exp no longer exists. Updated to
the stable gemini-2.5-flash model.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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
- Switch from GHCR image to local build
- Add MANA_CORE_AUTH_URL, MANA_CORE_SERVICE_KEY for SSO-Link
- Add Redis config for session storage
- Add dependencies on mana-auth and redis
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The /synthesize/piper endpoint doesn't exist - use /synthesize/auto
which automatically routes to the correct TTS backend based on voice.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add recentEmojis field to GlobalSettings in shared-theme
- Create userSettings store for Matrix app with JWT token management
- Exchange session cookie for JWT after SSO login
- Update MessageInput to use userSettings instead of localStorage
- Add recentEmojis support to mana-core-auth settings API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove !login and !logout commands from all 16+ Matrix bots
- Remove login/logout references from all help/welcome messages
- Disable password login in Synapse (password_config.enabled: false)
- System is now OIDC-only via Mana Core authentication
Users must authenticate via "Sign in with Mana Core" in Element.
Existing bot access tokens remain valid.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>