v3+
UCS Server - changelog
All notable changes to this project will be documented in this file.
[5.16.2] - 2026-10-23β
π Bug Fixesβ
- Add name parameter to attachment Content-Type for older mail clients
- Some clients (old Outlook, Lotus Notes, ...) read the attachment name only from the deprecated Content-Type name parameter and show nameless/generic attachments otherwise. Non-ASCII names are sent there as RFC 2047 encoded-words, since those clients don't understand RFC 2231.
- Split postgres initialization and create/upgrade to after install/transaction
[5.16.1] - 2026-10-22β
βοΈ Miscellaneous Tasksβ
- Use .python-version as source of truth
[5.16.0] - 2026-10-21β
π Featuresβ
- UAuth credentials, lookup and impersonation API via NATS
-
- auth.credentials verifies username and password without creating session
-
- auth.lookup checks user authenticated by uAuth is active and returns apps
- auth.impersonate tells uAuth whether its user may impersonate another one
- password verification of sessions.login split to reusable verify()
- password of auth.credentials is masked in request log
- install uAuth login.d/50_ucs.yaml and lookup.yaml
[5.15.3] - 2026-10-21β
π Bug Fixesβ
- Create /var/lib/tftp on Ubuntu too
[5.15.2] - 2026-10-21β
π Bug Fixesβ
- Create /run/postgresql before restarting PostgreSQL on RHEL
- The restart failed with "could not create lock file /var/run/postgresql/.s.PGSQL.5432.lock". The directory comes from tmpfiles.d, which systemd's rpm file trigger applies only after all %posttrans scriptlets, so after-transaction.sh now creates it with systemd-tmpfiles first.
[5.15.1] - 2026-10-21β
π Bug Fixesβ
- Restart PostgreSQL and create database after the dnf transaction
- On RHEL "systemctl restart postgresql" failed inside the dnf transaction. The restart and create.sh move to the packager's after_transaction hook (rpm %posttrans, end of postinst on deb), which also starts ucs.service again now that the database exists. Hook messages use pkg_log/pkg_warn.
Needs the packager with after_transaction and pkg_log (insoft/deploy).
[5.15.0] - 2026-10-20β
π Featuresβ
- Added username to structure.enums user list
π Bug Fixesβ
- Dialer lost lead clid_number when outbound has no numbers
βοΈ Miscellaneous Tasksβ
- Moved to INSOFT Python 3.14
[5.14.8] - 2026-10-19β
π Bug Fixesβ
- Libmysql client has different versions in Ubuntu noble and resolute
[5.14.7] - 2026-10-19β
π Bug Fixesβ
- Typo in package.yaml tftp path
[5.14.6] - 2026-10-19β
π Bug Fixesβ
- Upgrade to aiobp 3.0.1
[5.14.5] - 2026-10-19β
π Bug Fixesβ
- Hold aiobp < 3.0.0
[5.14.4] - 2026-10-17β
π Bug Fixesβ
- (dispatch) Only force call.connect for a leg ucs-ami already reported up
βοΈ Miscellaneous Tasksβ
- Switched to new build system
[5.14.3] - 2026-10-14β
π Bug Fixesβ
- Handle Decimal encoded timestamp in Brainless
- Fallback to context if trunk peer name differs
[5.14.2] - 2026-10-13β
π Bug Fixesβ
- Use configured log level for console and file
[5.14.1] - 2026-10-12β
π Bug Fixesβ
- Store called number instead of "ringing" for short calls
- Avoid issuing multiple call.connected event for dialer calls
- (queue) Park ucs-ari agent events until ucs-ami announces the channel
[5.14.0] - 2026-10-11β
π Featuresβ
- (email) Add Message-ID header to outgoing e-mails
- Outgoing e-mails currently carry no Message-ID, so a downstream bounce/DSN can't be reliably matched back to the originating e-mail record. Embed our e-mail DB id in a generated Message-ID (<email-id-{id}@{hostname}>, preferring the public hostname when configured) so future bounce-handling can look up the right record. This is groundwork only; bounce/DSN parsing is not implemented yet.
- Added optional team ID limit to queues.agentsLogout and added queues.agentsLogin
π Bug Fixesβ
- (email) Encode non-ASCII attachment filenames per RFC 2231
- Content-Disposition was built manually as an f-string with the filename wrapped in email.header.Header. Since that whole string was passed as a single opaque header value, Python's generator RFC 2047 encoded the entire "attachment; filename=..." value as one blob when the filename contained non-ASCII characters (e.g. Czech diacritics). RFC 2047 encoded-words are invalid inside structured headers like Content-Disposition, so mail clients couldn't parse out the attachment disposition or filename at all, leaving the attachment unnamed.
Use add_header's filename= keyword instead, which lets the email module apply correct RFC 2231 parameter encoding (filename*=utf-8''...) to just the filename, leaving the rest of the header intact and parseable.
- Use UUID in email Message-ID
- (email) Add Cc header to outgoing queued e-mails
- CC recipients were delivered (they are part of the SMTP envelope) but the message had no Cc header, so they looked like BCC to everyone and were dropped on reply-all. BCC recipients stay envelope-only.
- (email) Add Cc header to outgoing queued e-mails
- CC recipients were delivered (they are part of the SMTP envelope) but the message had no Cc header, so they looked like BCC to everyone and were dropped on reply-all. BCC recipients stay envelope-only.
- (status) Don't re-hang up an already finalized call on late setCall (duplicate CDR/RTCP)
- (mobile) Skip a call push the device has no token for instead of a KeyError
- (call) Raise dial control timeout above the dispatch ringing delay
- (call) Keep the 10s control timeout for dial only, answer/hangup back to 4s
- (call) Finish call.hangup on the line's cancel, a dispatch call never names it in the final hangup
[5.13.0] - 2026-09-24β
π Featuresβ
- Added SIPREC shadow calls
[5.12.3] - 2026-09-24β
π Bug Fixesβ
- (queue) Pair auto-answered agent legs without a phantom dialplan call
[5.12.2] - 2026-09-22β
π Bug Fixesβ
- Return leads in selected outbound campaign only in API
[5.12.1] - 2026-09-20β
π Bug Fixesβ
- Issue event on agent stats reset to synchronize Brainless
[5.12.0] - 2026-09-20β
π Featuresβ
- Allow tag in outgoing email sanitizer
π Bug Fixesβ
- Synchronize agent first and last login/ready and logout times to BrainlessDB
[5.11.2] - 2026-09-18β
π Bug Fixesβ
- (brainless) Stamp last_interaction at first login of the day so leastrecent ignores status flips
[5.11.1] - 2026-09-18β
π Bug Fixesβ
- (brainless) Stamp last_interaction at login so leastrecent ignores AUX/ACW flips
[5.11.0] - 2026-09-16β
π Featuresβ
- Added SIP trunk DID source support for To and P-Called-Party-ID headers
π Bug Fixesβ
- Task queue removal
βοΈ Miscellaneous Tasksβ
- Upgraded aiobp to v2.1
[5.10.3] - 2026-09-13β
π Bug Fixesβ
- Allow call transfers to not READY agents too
[5.10.2] - 2026-09-11β
π Bug Fixesβ
- Don't indicate ringing for dialplan applications
- Search in multiple number leads
- (yealink) Hang up SIP-T21P E2 via Asterisk, its CANCEL key toggles mute
- Honor dispatch workspace abandoned outbound queue for direct phone calls too
[5.10.1] - 2026-09-11β
π Bug Fixesβ
- Forward offline for logged-in user in dispatch workspace
βοΈ Miscellaneous Tasksβ
- Remove stale uPhone softphones on startup
[5.10.0] - 2026-09-10β
π Featuresβ
- Added uCRM, tag and template view permissions to ACL
[5.9.0] - 2026-09-07β
π Featuresβ
- (dispatch) Configurable ringing of calls with no agent assigned
- Added working_time indicator to outbound queue status
π Bug Fixesβ
- (booking) _set_agent_peer no-op guard
- (dispatch) Drop RingMode import that broke UCS start-up
- (agents) Stamp last_interaction when a call leaves the agent, not at final hangup
- (email) Reassing incoming e-mail when replying on reply
[5.8.1] - 2026-09-01β
π Bug Fixesβ
- Removed accidentaly added reporting plugin
[5.8.0] - 2026-09-01β
π Featuresβ
- Added full-text search to e-mails
π Bug Fixesβ
- Resolve current_peer on mobility login, reconcile stale values, only assign agent's own line
[5.7.5] - 2026-08-25β
π Bug Fixesβ
- Use dialed legs count instead of call state for CANCEL logic
- Issue EVENT_CALL_CANCEL when agent doesn't answer call from queue
- Force EVENT_CALL_CANCEL on external agent phones in PSTN
- Typo in Channel dispatchPendingEvents -> dispatchPendingQueueEvents
[5.7.4] - 2026-08-25β
π Bug Fixesβ
- Don't release agents with external calls into booking with reconcile
[5.7.3] - 2026-08-24β
π Bug Fixesβ
- Handle multiple call blind transfers via queues
βοΈ Miscellaneous Tasksβ
- Moved PostgreSQL indexing logic to sql module
[5.7.2] - 2026-08-23β
π Bug Fixesβ
- (nats) Catch OSError, not the undefined OSerror, and do not block the loop while retrying
βοΈ Miscellaneous Tasksβ
- Changed INSOFT kiosk deploy directory (for BeFree)
[5.7.1] - 2026-08-23β
π Bug Fixesβ
- (call) Refuse a transfer to a busy agent instead of dropping the customer
- (nats) Stop doubling every UCS API call after a NATS reconnect
[5.7.0] - 2026-08-22β
π Featuresβ
- (softphone) Added device into user mobility events
π Bug Fixesβ
- Update brainlessdb
[5.6.6] - 2026-08-20β
π Bug Fixesβ
- (bridge) Don't register the semi-attended transfer transport as a dialed destination
- (call) Fall back to the default outgoing filter when the extension has none
- (bridge) Drop the destroyed-channel guard superseded by the ari single-publish fix
[5.6.5] - 2026-08-19β
π Bug Fixesβ
- (call) Survive semiattended transfers whose destination is not the Dial app
[5.6.4] - 2026-08-18β
π Bug Fixesβ
- (provisioning) Update version of settings when deleting template user
- (call) Set proper user_id on call when dialing user's external number
[5.6.3] - 2026-08-15β
π Bug Fixesβ
- Upgrade braunlessdb
[5.6.2] - 2026-08-15β
π Bug Fixesβ
- (brainless) Restore agent answered-stats update in UCS (revert 1baaddd6)
[5.6.1] - 2026-08-15β
π Bug Fixesβ
- (call) Exclude hung up calls immediately from API call.current
- (email) Don't reassign original e-mail agent on reply
- (brainless) Move agent answered calls stats update to ARI
- (emal) Change queue and agent in reply when changed original message
[5.6.0] - 2026-08-12β
π Featuresβ
- (dispatch) Added abandoned calls to outbound campaign feature
βοΈ Miscellaneous Tasksβ
- (email) Unify e-mail reply and forward template usage
[5.5.0] - 2026-08-11β
π Featuresβ
- (email) Allow additional replies to e-mails
π Bug Fixesβ
- (brainless) Resync device lines into the bucket on device.line.* events instead of only at startup
[5.4.1] - 2026-08-06β
π Bug Fixesβ
- (call) Set last dialed channel on broadcast queue connect to have connected as B side instead of last rang channel
[5.4.0] - 2026-08-06β
π Featuresβ
- (email) Added configurable number of automatically assigned emails
- (phone) Added configurable offline forward if no agent is associated
π Bug Fixesβ
- (email) Fix sanitizer configuration so href is not stripped from anchor...
- (call) Don't hangup call on blind transfer, cancel it and reset connected information
π Refactorβ
- (ai) Keep id/uniqueid out of stored transcription
[5.3.11] - 2026-08-04β
π Bug Fixesβ
- (stats) Ignore non-agent changes in agent first login time
- (call) Generate event for semiattended call transfers from ARI queues
[5.3.10] - 2026-07-31β
π Bug Fixesβ
- (status) Emit terminal call.hangup for blind-transferer and detach them from a call continuing to an external destination
[5.3.9] - 2026-07-30β
π Bug Fixesβ
- (callcontrol) Link blind-transfer-into-queue Local caller to its bridge peer so queue events pair and agents see the call
[5.3.8] - 2026-07-28β
π Bug Fixesβ
- (nats) Handle race condition when UCS AMI starts after UCS server
[5.3.7] - 2026-07-24β
π Bug Fixesβ
- (email) Fix sanitizer configuration so href is not stripped from anchor elements in outgoing emails
- (email) Allow links in outgoing emails
- (email) Prefer html multipart alternative
- (booking) Release immediate reservations and periodically reconcile agent peer state so a missed event can't starve a READY agent
π Refactorβ
- (email) Avoid reusing queue variable
- (email) Rename reused variables
- (email) Use where_ prefix for assignEmail filter variables
- (email) Rename reused variables
- (crm) Remove dead None initializations
- (email) Rename reused variables
- (email) Remove Any from agent_status typing
- (email) Remove Any from updateNumbers
π¨ Stylingβ
- Apply ruff formatting
- (email) Apply ruff formatting
βοΈ Miscellaneous Tasksβ
- (ruff) Ignore B904, we don't use raise from
[5.3.6] - 2026-07-17β
π Bug Fixesβ
- (brainless) Map SQL penalty to KV priority in user.queue updates so supervisor priority changes reach ari
- (config) Include suspended in queue agents select so queue settings saves don't wipe suspension from the KV
[5.3.5] - 2026-07-16β
π Bug Fixesβ
- (brainless) Sync runtime agent suspend/resume into the inbound KV so ari stops ringing suspended agents
[5.3.4] - 2026-07-16β
π Bug Fixesβ
- (brainless) Stamp last_interaction at call hangup instead of connect so leastrecent orders by reliable, final, end-of-call data
[5.3.3] - 2026-07-15β
π Bug Fixesβ
- (status) Surface ringing of Stasis-blind-transferred calls to the target operator (link orphan Local pair via bridge, guard same-call setCall, ignore hold/unhold from transferred-away channels)
- (status) Repair Local pair mislinked to its own dial target instead of creating a degenerate self-call
[5.3.2] - 2026-07-14β
π Bug Fixesβ
- (provisioning) Import ORIG_CALLER/LAST_EXTENSION from transferer on blind transfer of Stasis calls
- Add missing newline
π Refactorβ
- (queue) Add type hints to queue.py
π§ͺ Testingβ
- Enable pytest unit tests for ucs modules
- Add tests for email
βοΈ Miscellaneous Tasksβ
- Replace ruff select ALL with a curated rule set
- (agent) Add type hints to EmailQueueAgent
- (email) Add type hints to Email state attributes
- (email) Annotate local collections in Email
- (email) Annotate normalize_attachments return and stats_stored
- (email) Annotate load() where dict
- (mypy) Add override for untyped ucs_data
- (ruff) Enable W rules to catch missing EOF newline
[5.3.1] - 2026-07-14β
π Bug Fixesβ
- (agents) Call agents booking in run method so we don't override thread start method
[5.3.0] - 2026-07-13β
π Featuresβ
- (phone) Make complete provisioning for INSOFT kiosk
π Bug Fixesβ
- (email) Unpack multiple values in email attachment sender
- Added external number handling into agent booking
- Booking start order fix
- Trigger call.connected when dispatch channel joins
- (dispatch) Emit call.connected when agent joins dispatch bridge
- (email) Read attachment fields by key instead of unpacking dict
- (transfer) Normalize external targets for blind/consult transfer so they route via filter-internal
βοΈ Miscellaneous Tasksβ
- Add email sender typing to enhance type safety
- (email) Correct attachment types in outgoing message
- Add dev dependency group
- Move mypy config into pyproject.toml
- Fix deprecated ruff lint config
[5.2.0] - 2026-06-25β
π Featuresβ
- (queues) Added agent reservation for multichannel
- (queues) Return peer and line_id in successful agent reservation
π Bug Fixesβ
- (sync) Fixed logging of IDP synchronization
- (uphone) Activate and deactivate uPhone for INSOFT kiosk device ID too
- (mobility) Always issue all currently associated lines in UM login event
βοΈ Miscellaneous Tasksβ
- (queues) Accept agent ID as argument in reservation
[5.1.0] - 2026-06-16β
π Featuresβ
- (phone) Added INSOFT kiosk device provisioning
π Bug Fixesβ
- (nats) Subscribe to all events in main thread
- (inbound) Handle inbound queue agent external phones in PSTN
- (email) Discard empty blockquotes from messages
[5.0.5] - 2026-06-15β
π Bug Fixesβ
- (ai) Make workflow_logical_id optional for OSL voicebot
βοΈ Miscellaneous Tasksβ
- (calls) Be verbose about inbound queue events
[5.0.4] - 2026-06-14β
π Bug Fixesβ
- (queues) Calculate properly threshold wait and ring time for inbound to outbound abandoned calls
- (mobility) Make user primary extension sticky on device line
π Refactorβ
- (api-call) Guard waiting for event with checking whether event is none to prevent type error