Changelog#
All notable changes to HMS Sovereign are documented here. Dates are in YYYY-MM-DD format.
2026-03-23#
Node.js SDK — v0.1.0 (initial release)#
Zero-dependency SDK using native fetch (Node 20+)
Typed resources for all API endpoints: assistants, calls, numbers, campaigns, SIP trunks, voices, usage, BYOK, tool templates, analysis templates, domains, organizations
Auto-pagination with for await...of on calls and usage
Webhook HMAC-SHA256 signature verification
Outbound calls with 3 config modes (reference, hybrid, transient)
Real-time call control (inject context, say, transfer, end)
Typed errors: AuthenticationError, NotFoundError, RateLimitError, InsufficientCreditsError
Debug mode for request/response logging
CI on Node 20 + 22, npm publish on GitHub Release
API#
New /v1/assistants endpoint — successor to the deprecated /v1/agents endpoint. Full CRUD support (list, get, create, update, delete) with the same capabilities.
Enforced snake_case response keys across all v1 API endpoints. Affected: tool-templates, analysis-templates, domains/sync. This is a breaking change if you consumed the previous camelCase keys (toolTemplates, analysisTemplates, selectedDomainId).
Dashboard#
Two-factor authentication (2FA) — TOTP-based MFA with security settings section
Whitelabel enterprise upsell — access gating and plan-based feature visibility
2026-03-17#
Dashboard#
Phone number ordering portal — order Dutch 085 numbers directly from the dashboard via Telnyx integration, with order tracking and pool management
Documentation overhaul — renamed "agents" to "assistants" across all docs, restructured guides, added sitemap
Agent#
Web call metadata passthrough — custom metadata from assistant_override is now included in all webhook payloads (status-update, tool-calls, end-of-call-report) at message.assistant.metadata
2026-03-10 — Provider expansion#
Agent#
Mistral STT (Voxtral) — added as speech-to-text provider (non-streaming). Streaming support pending upstream LiveKit plugin.
Inworld TTS — added as BYOK text-to-speech provider with per-voice language selection
GDPR-safe email notifications — notification emails now respect GDPR mode settings
Dashboard#
Mistral STT support — language selector and save logic for Voxtral configuration
Inworld TTS support — voice selection in agent configuration
Resend as BYOK provider — managed accounts can now bring their own Resend API key
Instant agent setup improvements — auto-generated analysis templates, notification email field, auto-link phone number to agent on creation
Developer mode toggle in settings
2026-03-09 — Infrastructure#
Agent#
Zero-downtime blue/green deployment — rolling deploys with drain timeout and restart-loop protection. Two systemd services (hms-agent-blue, hms-agent-green) replace the old single hms-agent service.
Per-call provider usage tracking — STT, LLM, and TTS usage metrics tracked via LiveKit UsageCollector for cost attribution
2026-03-04 — Web calls#
Agent#
Web calls (browser-based WebRTC) — users can now speak to an AI assistant directly from their browser. No phone number required. Calls appear in the dashboard with direction: "web".
Public web calls API (POST /v1/web-calls) — embeddable in any app. Supports all 3 config modes (reference, hybrid, transient). Returns a short-lived LiveKit JWT for browser connection.
White-label web calls — server_url field with rtc.* subdomain support for custom domains
Live transcription — real-time STT and TTS transcripts published via LiveKit text streams (lk.transcription topic), enabled by default
Multilingual turn detection — improved interruption handling and language-aware turn detection in the voice pipeline
Higher concurrency — idle worker pool increased from 5 to 50
Security#
Call control API routed through TLS via L4 Caddy proxy
2026-03-02 — Internationalization fixes#
Agent#
Language-aware summaries — post-call summaries now use the conversation language instead of defaulting to English
Language-aware analysis — structured post-call analysis respects the STT language setting
Language-aware transfers — transfer messages are generated in the conversation language
Async tool calls fixed — truly fire-and-forget using asyncio.create_task, no longer blocking the conversation
2026-02-25#
Agent#
Webhook URL override for hybrid/transient agents — agents with inline webhook config now correctly use their own webhook URL instead of the saved agent's
Per-tool URL extraction fix — tool-specific webhook URLs in OpenAI-format tool definitions are now correctly extracted
2026-02-12#
Agent#
Telnyx SIP trunk IP whitelist — added Telnyx IP ranges for inbound trunk authentication
Config error call logging — calls that fail due to configuration errors are now logged to the calls table with end_reason: "config_error"
2026-02-10 — Hetzner migration#
Infrastructure#
Orchestrator migrated to Hetzner — LiveKit, agent, and Piper moved from DigitalOcean to Hetzner CPX31 in Germany for lower latency and EU data residency
Self-hosted Supabase on Hetzner CPX41 — full stack (DB, Auth, REST, Realtime, Storage, Edge Functions) with daily backups
Recording URL signing — fixed for self-hosted Supabase S3-compatible storage
2026-02-08#
Agent#
xAI Grok as text LLM provider — uses the existing xai_secret_id BYOK key. Separate from xAI Realtime (speech-to-speech).
Configurable silence timeout — default reduced from 22s to 8s, configurable per-agent via silence_timeout_seconds
2026-02-05#
Agent#
Mistral AI as LLM provider — added with dedicated plugin for proper tool format support
GDPR mode — agent-level toggle for data retention control. When enabled, transcripts and recordings are not stored.
Modified at 2026-03-23 15:09:25