Changelog
What's new.
Every improvement to the platform, as it ships.
· MCPGatewayService
Notes pack — search, read, create, update, journal, links, master note
What KBService really answers shapes three choices (SP05-T24). notes_search matches the query over the title, body, category and tags as the Notes wall does, because KBService's searchTerm matches titles only and it applies one filter at a time. notes_update sends only the fields that change and notes_link only the links, because re-sending the decrypted body re-saved it under the AI's name, indexed its Lexical JSON in RAG and overwrote concurrent edits. Links are put in RecordLinkKind's canonical form, and a malformed one is refused by the planner before any approval. Reads flag an unreadable note, a cut text, and give UTC instants: the UTC helper moves from ChatPack to PackSupport.
· SecurityService
Charter items on role, department and job-title CRUD; charter-only PUTs
· kamo-internal
AI voice card, outside-calls column and AI member note in phone settings
· kamo-internal
AI workstations on the Computers tab, Capacity and Platform settings
· AIService
Map a Studio config onto job-title charter items
SalesAgentCharterMapper maps a Sales Agent's AgentConfig onto job-title charter items (spec 4.7.8) for the fold-in, and the six Studio templates onto the A9 persona templates. Beyond the brief (ruling SP03-T28): long text is split at a sentence end, line break or space instead of being truncated; a whole-document override keeps its whole first paragraph in PURPOSE; BOUNDARY items are emitted locked, as the charter stores them; an over-long outreach intent or description is cut and reported in dropped.
· VOIPService
AI voice lines on FreePBX, KamoPBX and Telnyx
A refused FreePBX addExtension (status false, no GraphQL error) now fails the AI line instead of recording one that rings nothing. Telnyx number lookups send the digits Telnyx's filter accepts and match the answer exactly; the old URL-encoded '+' was encoded twice by RestTemplate and never found a number.
· kamo-internal
Usage and ROI dashboards (SP10)
D1 cost by member, capability and day (every day of the period plotted, zero where nothing was spent; capabilities named from the registry dictionary) and D2 work handled, AI cost, human-equivalent cost and savings, with the D4 assumptions dialog for MANAGE_AI_WORKFORCE holders. Both keep their period fields in every state, never ask for a period D1/D2 refuse (from after to, more than 92 days) and say why on the To field, drop an answer that arrives after a newer question, sort money and counts as numbers, and sit in the themed ag-grid wrapper. The dialog keeps what is typed as text, marks the refused field, reports a refused or failed save, and sends once per press.
· SecurityService
Member charter read and edit; nobody edits their own
S4 reads a member's effective charter, S5 its own items with whether the caller may change them, and S6 replaces them (diffed by id). A write runs in MemberCharterWriter, reading before it writes; the new stamp is read after the commit in its own transaction, so a Yugabyte read restart cannot fail a correct save. A body without charterItems is refused, not read as a clear.
· MCPGatewayService
Chat pack — conversations, unread, read, send, direct chats, mentions
Beyond the brief (SP05-T23): a mention into a support conversation is a web chat message like chat_send; only a team chat or a support conversation takes a post; mention markup through SP09's ChatMentions.markup; chat_read marks nothing in a dry run and marks best effort; MediaService's UTC times answered as fixed-width instants; a page reads oldest first; only fields MediaService sends are projected; support rows name the other side.
· KlusterServices
AI extensions route to LiveKit; one recording path on every call; outside-calls list comes from Kamo
The host patch refuses until kamo-asterisk-support's recording subroutine and managed allow-list are on the node (and the list covers the hand-edited one), verifies the loaded contexts by their header (Asterisk names a missing context in its failure text), and replaces files with one rename that keeps mode and owner.
· EmailService
Record and revoke AI call consent per phone number
· VOIPService
KamoAI internal surface guarded by its own secret
/api/voip/internal/** (SP13: AI lines, SIP credentials for LiveKit) takes KAMOAI_INTERNAL_SECRET, not the cluster secret; the cluster prefixes keep theirs. The filter matches the decoded path Spring MVC routes by, so an encoded letter (/api/voip/%69nternal/...) cannot skip either secret.
· kamo-internal
Show a posting's inherited qualifications when applying
· SecurityService
Record and revoke AI call consent per phone number
· AIService
Brief and job-description previews, voice catalogue, current brief
· kamo-internal
AI-call consent chips and dialog on lead and contact phone numbers
One load per record (useAiVoiceConsent) feeds a chip beside every phone number on the lead page and the contact panel; the chip opens a dialog that shows the consent, its history, and - for a member who may edit contact details - records or revokes it. A masked caller sees the record's state without its numbers. Ruling SP13-T36.
· MCPGatewayService
Mail pack — read, search, threads, send, reply, forward, drafts, move, flags
· SecurityService
Seven job templates and the templates endpoint
· AIService
Compile and read an AI member's operating brief (hire step BRIEF)
· kamo-internal
Pick an AI member to answer a website's chat
· VOIPService
AiVoice capability with a written reason per provider
· MCPGatewayService
Text helpers, id-safe projections and the fake Kamo services harness for packs
HtmlText lays mail HTML out the way a browser shows it (one jsoup walk: collapsed source whitespace, br, block and paragraph breaks, cells, pre); ThreadIds reproduces EmailService's v5 conversation id; Texts cuts without splitting a surrogate pair and turns every id a double cannot hold into a string (Long.MIN_VALUE included). FakeKamoServices runs a tool the way the pipeline does, with the real ArgsHash. Ruling SP05-T21.
· SecurityService
Catalogue and resolve endpoints for the charter editor
S1 GET /api/security/charter/catalog and S3 POST /api/security/charter/resolve (spec 4.8). A member draft refused by S6's edit rule answers with S6's bodies (requiredRight on MISSING_RIGHT); a department subject's ids are checked against the caller's org before the ancestor walk; an unreadable draftItems list is a CHARTER_INVALID 400 with an English error (ruling SP03-T16).
· MediaService
Dial-in PINs for Kamo Meets and the bridge's PIN resolver
· kamo-shared-library
AI call telemetry entities
AI_CALL and AI_CALL_EVENT (spec §4.2/§4.3): direction, status, outcome and event-type enums (STRING), the two entities and their repositories. AiCallStatus.LIVE is read-only, since every caller in a service shares it.
· kamo-internal
Approvals — decision form, list, Interaction Center tab and deep-link page (SP10)
The approval form (A3/A4) with wording-only edits, the Workforce hub list, the Interaction Center Approvals tab with its A2 badge, and /workforce/approvals/<id> for the SP06/SP07/SP09 deep links.
· AIService
Versioned operating briefs with an input-hash gate and a short cache
· kamo-shared-library
Meeting minutes contract — prompt, JSON parse, markdown and HTML rendering
Mirrors kamoai-voice's minutes.py exactly: caps and chunks count code points (no split emoji), Unicode white space is stripped, only JSON arrays are lists, text after the object makes an answer unparseable, action items dedupe with Locale.ROOT, and a chunk size below 1 is refused instead of looping.
· SecurityService
Write-time checks for hide markers and escalation targets
A refusal leaves a caller's transaction committable, so the member charter PUT still answers 400; a hide marker cannot target another hide marker; a malformed escalation ref is INVALID_REFERENCE; list-row counts are in section order like the detail read.
· MCPGatewayService
Org MCP servers as ext_* tools over Streamable HTTP and legacy SSE; STDIO retired
A server's own words reach a caller only inside the untrusted wrap; nothing sent is definitive (D45); the URL guard runs on every use; one session and one tool load per server however many requests race; SSE events are capped in memory; the 10-minute refresh tests servers in parallel; the transitional execute keeps its PHI boundary (ruling SP05-T13).

Your universe is waiting.
Start free in minutes. Add products whenever you are ready — no migration, no new logins.
Free forever — no credit card required