Commit graph

24 commits

Author SHA1 Message Date
patrick-motsch
33daa8dc74 feat: handle voiceGreeting message type - TTS for bot join greeting
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 00:17:42 +01:00
patrick-motsch
5d40657aef fix: dynamic bot name in SPEECH_TEAMS prompt + phonetic name trigger
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-18 00:12:48 +01:00
patrick-motsch
070e3cbd96 fix: safe access to botAccountEmail in _isBotSpeaker - was crashing WebSocket handler on first transcript
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 23:54:18 +01:00
patrick-motsch
a27307263f fix: create SSE event queue on-demand so transcript/chat events are never silently dropped
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 23:44:12 +01:00
patrick-motsch
a3c92ae8d5 fix: load system bot credentials from DB and pass to browser bot for authenticated join
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 19:58:01 +01:00
patrick-motsch
ad254aafb1 feat: handle audioChunk messages from bot, STT via Google Cloud Speech
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 18:43:42 +01:00
patrick-motsch
de573fd834 refactor: add TransferMode, remove backgroundImageUrl and botAccount fields from config
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 18:34:24 +01:00
patrick-motsch
a67c7f8b81 feat(teamsbot): stop via AI intent (multilingual), initial session context summarization
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 10:03:21 +01:00
patrick-motsch
4186ec6188 feat(teamsbot): stop command detection, session context for AI, context summarization for long sessions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 09:29:03 +01:00
patrick-motsch
ef813a9304 feat(teamsbot): chat message handling, response channel (voice/chat/both), join mode (systemBot/anonymous/userAccount)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 00:07:42 +01:00
patrick-motsch
cc86b144ac fix(teamsbot): filter bot's own captions from AI trigger, mark bot responses in context to prevent repetition
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 22:52:02 +01:00
patrick-motsch
02dedc972d fix(teamsbot): SSE rate-limit 60/min, TTS message format for bot protocol
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 15:19:31 +01:00
patrick-motsch
ad5c9d10cd feat(teamsbot): dedicated bot account support with authenticated join
- New config fields: botAccountEmail, botAccountPassword for dedicated MSFT account
- BrowserBotConnector passes credentials + backgroundImageUrl to bot service
- Service passes config credentials to connector in joinMeeting
- Enables: full language settings, virtual background, no lobby wait
- Fallback: anonymous join when no bot account configured

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 11:56:04 +01:00
patrick-motsch
91425809c3 fix(teamsbot): AI prompt priority rules, bot-name trigger overrides cooldown
- SPEECH_TEAMS prompt: Rule 1 (bot name mentioned) now has highest priority
  and ALWAYS triggers a response, even for greetings/smalltalk
- Bot-name detection in transcript overrides cooldown timer (immediate trigger)
- Added multilingual instruction: AI responds in the language it's addressed in
- Voice interface: clean camelCase mapping (audio_content -> audioContent)
- Config save: added "config" to allowed update fields in interfaceFeatures
- Default TTS voices for common languages in connectorVoiceGoogle

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 11:48:44 +01:00
patrick-motsch
e01c6dcb95 feat(teamsbot): HTTP fallback for transcripts, debug logging for WebSocket
- HTTP POST endpoints: /bot/transcript/{sessionId} and /bot/status/{sessionId}
- Fallback for when Azure App Service blocks WebSocket upgrade
- Debug logging [WS-DEBUG] in WebSocket handler for message tracking
- Handle websocket=None in AI response pipeline (HTTP mode)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 11:05:58 +01:00
patrick-motsch
89166a8f70 feat(teamsbot): URL extraction, status mapping, voice test, improved logging
- URL extraction: _extractTeamsMeetingUrl() handles SafeLinks, invitation text, and clean URLs
- Status mapping: added in_meeting, launching, navigating to bot status map
- Voice test endpoint: POST /{instanceId}/voice/test for TTS preview
- Improved error logging in browserBotConnector (shows exception type + repr)
- Improved AI trigger logging in service (shows buffer size, cooldown state, trigger reasons)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 03:26:23 +01:00
patrick-motsch
5d987e72fe fix(teamsbot): Fix Invalid Date + pass language to browser bot
- Add getIsoTimestamp() to timeUtils for JS-compatible ISO 8601 strings
- Replace getUtcTimestamp() (epoch float) with getIsoTimestamp() for all
  teamsbot session/transcript/response timestamp fields (startedAt, endedAt,
  creationDate, lastModified, SSE event timestamps)
- Pass config.language to browser bot in join request for captions spoken language

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 01:26:27 +01:00
patrick-motsch
c7def85a4b feat(teamsbot): Replace bridge with browser bot architecture
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 00:04:39 +01:00
patrick-motsch
ae4dc9fa48 fix: skip STT fallbacks for teamsbot, run audio processing in background
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 18:17:47 +01:00
patrick-motsch
367edd83e2 fix: add missing await on speechToText and textToSpeech async calls
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 17:46:02 +01:00
patrick-motsch
d88bacc4a9 billing fix 2026-02-13 14:43:45 +01:00
patrick-motsch
92ee130c0a fix: convert timestamp to string for Pydantic v2 validation in teamsbot service
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 14:13:25 +01:00
patrick-motsch
b7e4efb3a3 teams bridge 2026-02-13 07:27:33 +01:00
patrick-motsch
edecfb002c teamsbot 2026-02-13 00:00:35 +01:00