Serve a recording's transcript as timed turns
The recording metadata the Media Player and the Call Log read now carries transcriptTurns (each turn's start, end, text and speaker: one of our members by id, t...
Pick up the shared library's status follow-ups and lead key lookups (5b273d8e)
The Call Log's provider audio door refuses a line whose provider keeps no recordings
The list only offers Listen for a recording the platform stores or JustCall keeps; the door now asks the same rule before it asks any provider, so a FreePBX cal...
A Call Log for the member and their reporting line
GET /api/voip/calls/log reads PHONE_CALL_LOG by the indexed time range of the members in view (self + everyone below on the manager field, the owner sees all, t...
Let MANAGE_SAVED_TEXTS read and change saved texts
/api/voip/sms/text-templates accepts the narrow MANAGE_SAVED_TEXTS right beside MANAGE_VOIP_SETTINGS for its writes, and beside ACCESS_VOIP for its reads, so a ...
A provider's voice agent answers to the SI's call gate, by the SI's own name
A stream no longer reaches JustCall's voice agent directly. kamoai-service decides a call, and only an SI with no line of its own takes this path, to the voice ...
A landed call, text or email tells open screens
The contact tracker now announces each communication on the floor's domains, so a call the phone system reports reaches the board at once instead of on the next...
A text that may have gone is never called a refusal
Telnyx reported every ProviderException as REJECTED, and its client wraps a timeout in that type, so a timed-out text read as not sent and a stream's retry coul...
A lead calling back a shared number tells the member a stream worked for
The call rings on JustCall's side, where Kamo can't move it, so the live call signal goes to the routed member.
Streams text from the member's own number, place SI calls, and hear every reply
/internal/voip/automation sends a stream's text from the member's sole number, else the org's main line with a reply route back to the member, and places an SI ...
Feed a lead's last contact from real calls, honestly
Two capabilities say what a provider really reports: whether calls connected and how long they ran. Call evidence is built from those, so a limited provider rec...
A re-hired SI gets its old extension back when it is still free (TPSIREHIRE)
Re-provisioning a RETIRED line on the same phone server prefers the line's previous extension when nobody has taken it since; otherwise the next free one in the...
A practice's patient chart hears a patient's replies, STOP/START and delivery receipts
PatientSmsRelay posts (X-Internal-Auth, off the carrier's thread, bounded queue, never throws) to SecurityService **************** - every inbound text after de...
Refuse a phone extension past the organization's licenses
Owner rule 2026-10-22: per-user add-ons bill the licenses purchased; how many extensions may be in use is limited only by them. Before an extension is put into ...
A carrier-only organization can hold text threads again (SITP CARRIERSMS)
VOIP_CONVERSATIONS.INSTANCE_ID was NOT NULL in production, although the entity and **************** both say an org that texts through a carrier and runs no pho...
An MMS part is stored in one transaction of its own (SITP MMS)
Live check in sp00verify: the picture was fetched and its object written, then the dat's final 'published' save failed (JpaSystemException) because the backgrou...
The MMS part claim names its states as parameters, so Hibernate 6.2 can read it at boot (SITP MMS)
8eda899's deploy never rolled: Spring Data validates every @Query at startup and Hibernate 6.2 cannot interpret a nested enum's FQN literal **************** so ...
Keep the pictures and files people text in, for every provider (SITP MMS)
VOIPService stored only the words of an inbound MMS, so nobody (person or SI) could see what was texted in. Now every inbound rail reads its media and VOIPServi...
A closed god-mode window is closed here too (shared SessionPlatformFacts reader)
Seventeen VOIPService gates (CallController, the VoIP admin controllers, the SMS inventory and bulk-text controllers, DoNotContactController, RecordingAccessSer...
One's own text numbers need the Phone tab's rights, not a bare session (SITP TP11)
ACCESS_VOIP, or MANAGE_EXTENSIONS / MANAGE_VOIP_SETTINGS: the rights settings/member opens its Phone tab on, so nobody who sees the card today loses it.
The members' text-template door refuses flat {error, code, reason} (SITP TP11)
The shape every member-facing VOIPService refusal has, so the Tool Plane and the browser read the reason without unwrapping a nested object.
The softphone's own surfaces check ACCESS_VOIP, and members get a session door to text templates (SITP TP11)
- CallController (call history, own voicemail list/read/archive, queues, agent state), missed-calls-seen, the do-not-contact check and SMS send now check ACCE...
Settings β Phone β Do not block β the API, the suggestions, and STOP texts that skip the company's own lines
Owner 2026-10-15: "remove it and add it to a do-not-block list". The allowlist beside the do-not-contact list, for the organization's own numbers and staff line...
One-time backfill of the do-not-contact list from earlier opt-outs
Run once on 2026-10-15 05:07Z (yb-tserver-0, admin role), by key from the opt-out tables only (no lead, contact or member table is read): CALL from SI-call "sto...
Delete the do-not-contact backfill after its run
Ran 2026-10-15 05:07Z; a second run inserted nothing (re-runnable, ON CONFLICT). Entries added (each with its ADDED event): CALL 2 (VOICE_OPT_OUT: +194929899...
The organization's do-not-contact list β VOIPService owns it, texts check it, STOP and START write it
Owner 2026-10-15: one company-wide do-not-contact list per organization, scoped per channel ("Only that channel"). - DDL **************** (DO_NOT_CONTACT, DO_N...
Ai-lines names the number a missed call can be returned to
Each line of /ai-lines?orgId= carries callbackNumber: the SI's own line, else a number assigned to it, else its phone server's main number, else the org's only ...
Seal member VoIP credentials at rest with PlatformSecretCipher; re-seal legacy rows at boot
**************** held each member's access token, refresh token (Teams, RingCentral OAuth) and RingCentral JWT assertion exactly as the provider issued them. Ev...
/api/voip/webhook answers a form post 415 and a non-JSON body 400, never a silent 200
A form-encoded post (Twilio, Sinch, Vonage pointed at the wrong address) fell into readTree(), failed, and was answered 200, so the carrier never retried and th...
A FreePBX voicemail deleted on the PBX stops counting on the phone badge
A deleted message is just absent from its mailbox's listing, so the sync never touched its row again and it stayed unread, badged for good. A row whose mailbox ...
Marking a FreePBX voicemail heard reaches the phone server, and the badge follows at once
A FreePBX message id is mailbox/msgId, so PUT /voicemail/{id}/read never matched a route for it and the PBX was never told: the message stayed in INBOX and the ...
Decision 4 on every recording read β participants, their chain, VIEW_CALL_LOGS, a linked lead's readers, in every org (KamoCollab CP05 Task 21)
RecordingController now runs tenancy (404), then the PHI capability (403), then CallRecordingAccess through access/RecordingAccessService (403 RECORDING_NOT_PER...
The CP05 DDL for Confidential markers on calls
KamoCollab CP05 Task 5 (spec 5.1, D8, D27): recordings and phone_call_log each gain is_confidential, confidential_set_by_member_id and confidential_set_at. Hand...
A re-read call keeps the member it was first credited to
CallLogIngestService.ingest set the member (and extension) on every re-read of a settled CDR, resolved from whoever holds the extension now. When ext 7900 passe...
The JustCall contact import finishes β paced, resumable, and no longer skipping pages
Harmony Home Loans' import had never once completed (no JustCall book or integration exists for any member). Three defects: 1. One burst per tick: it read ever...
The caller lookup is V13, not V7 (SP13 already names a V7) (completes 3fab95d)
V7 β which colleague is calling from an internal extension (SP92 calls)
GET **************** (KAMOAI_INTERNAL_SECRET) answers the active member of the phone server's org that the extension is ACTIVE-ly assigned to, or 404 NO_MEMBER....
JustCall calls are credited to the agent who took them, and Sales Dialer calls sync
Checked against Harmony Home Loans' JustCall account (read-only GETs): the newest 100 of its 1,058 /calls match PHONE_CALL_LOG one for one, so the ordinary log ...
The phone badge counts voicemails in your own mailbox, not the whole phone server
The nav phone icon's voicemail line counted every unread message on the member's phone server **************** on the premise that the softphone's Voicemail tab...
A shared voicemail box tells only members who manage the phone server (SP98 T26, final review M-2)
The box's list, audio, read and delete answer only MANAGE_VOIP_SETTINGS (or a god-mode window), and Settings' picker offers only those members, but SharedVoicem...
An AI member's line has an outside-calls switch like anyone's, so one hired while new extensions were denied can be allowed (SP93 final fix)
V12 (PUT **************** no longer refuses an AI line with 409 AI_LINE. A new AI line starts as the phone server's setting for new extensions says (SP93-T5-1),...
Recordings and voicemail audio are written, not refused with a 500
The recording and voicemail audio endpoints are declared ResponseEntity<?>, because they also answer JSON, and returned a StreamingResponseBody lambda. Spring p...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
