Replace @xenova/transformers in-process model with HTTP calls to shared
whisper-asr-webservice container (http://whisper:9000). Converts PCM16
samples to WAV and sends to /asr endpoint. Env: WHISPER_URL.
Only inbound (IN) messages determine hasUnread in getContacts(). Telegram
read_business_message events are now parsed and processed to auto-mark
contacts as read for the entire team.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
prisma.$use middleware API was removed in Prisma 6. Switched to
$extends query hooks which is the supported approach.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CalendarEvent and FeedCard timeline entries are now handled by Prisma
middleware automatically. Document timeline entry is inlined since
WorkspaceDocument stores contactId in scope field, not on the model.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CalendarEvent and FeedCard now automatically get a ClientTimelineEntry
when created/updated with a contactId. This ensures events created by
the agent (or any other code path) appear in the contact timeline
without needing explicit upsertClientTimelineEntry calls.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Agent trace logs are now stored in-memory (pilotRunStore) and broadcast
through the existing /ws/crm-updates WebSocket channel. When a client
reconnects, it receives a pilot.catchup with all accumulated logs so the
user sees agent progress even after page reload. Three new WS event
types: pilot.trace, pilot.finished, pilot.catchup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a context scope is picked via the pipette, the picker mode now
turns off automatically since the selection is done and shows as a chip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The call wave sync watcher fired before DOM was updated (flush: 'pre'),
so ref callbacks hadn't registered host elements yet. Changed to
flush: 'post' so WaveSurfer instances are created after DOM refs exist.
Also fixed getCallItem to read from clientTimelineItems (source of truth)
instead of visibleThreadItems which could be stale.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After hiding a contact inbox, the contacts list now refetches immediately
so the hidden contact disappears reactively. When the current contact is
removed from the list, the selection jumps to the most recently active
contact (by lastContactAt) instead of the first item in the current sort.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>