Unified Chats feed across member/support/social sessions
GET /api/media/sessions/chat now accepts a `categories` filter (chat, support, social; default all) and returns one globally most-recent-first, merge of the per...
Paged queries for support + social chat sessions
feed so the unified Interaction Center Chats list can include all kinds: - SUPPORT (TYPE_ID=2): sessions where the member is the assigned agent OR the request...
Finish lead-view header actions + callbacks
- Header: split Call into Call (Work)/Call (Personal) opening the softphone (hidden when the member has no registered extension), Email opens the composer, ...
Internal endpoint to create/cancel a member's calendar event
POST /api/internal/calendar/events (X-Internal-Auth gated) resolves member -> user -> primary calendar (creating a default if needed) and creates an event. Used...
Lead callback endpoints (schedule/list/resolve)
New **************** controller + service: persists the callback, posts scheduling/outcome notes into the lead's media stream, and mirrors the callback onto the...
Add LeadCallback entity, status enum, and repository
Backs the lead-view callback feature: a lead-owned callback record (PENDING/CONTACTED/CANCELED) keyed off leadUid, with a soft reference to the mirrored EmailSe...
Create a session for group chats opened by memberIds
ChatTool ignored props.memberIds: a group open arrived with an empty userId and no sessionGuid, so the 1:1 createSession bailed early and the window never got a...
Public passthrough for email OAuth provider callback
Forward GET **************** to EmailService sessionlessly (strips auth, no redirect following), mirroring the RingCentral OAuth callback. This is the fixed pub...
Fixed public redirect + gateway-forwarded callback
Platform email OAuth (Microsoft 365 / Google / Zoho) had no valid public redirect URI: the redirect was derived from the request host, which in prod is the clus...
Gate lead contact-info by assignment + new privacy rights
Mirror the three new CRM rights. On the lead detail page, mask/lock the Primary Contact, Mailing Address and Property Address fields for leads not assigned to t...
Enforce lead contact-info privacy rights
getAllLeads now returns the lean LeadListDTO and hides unassigned leads from members without VIEW_UNASSIGNED_LEADS. getLeadById masks contact info (state preser...
Lead contact-info privacy rights + lean list DTO
Add three CRM rights (161-163): "Assigned To Others: View/Edit Lead Contact Info" and "View Unassigned Leads". Add LeadListDTO — a lean projection for the /lead...
Send membership type from the /member and /team paths
/team signups create a TEAM_MEMBER (created PROSPECT, pending admin activation); /member signups create a MEMBER. RegisterFlow takes a memberType prop supplied ...
/team creates a TEAM_MEMBER (PROSPECT), /member creates a MEMBER
Public registration now honors the memberType the register site sends (from the /member vs /team path): /team creates a TEAM_MEMBER — as PROSPECT, so an admin m...
Expose team-member work phone extension in team-members-contractors
The /leads Agent filter needs the work-phone extension to label options as "Name (ext 8080)". The extension already exists on TeamMember (getPhoneWorkExtension)...
Request-support popup shows parent-org shared topics
Point the ticket-creation topic dropdown at the new /api/support/topics/available endpoint (own-org + parent-shared topics) so child-org users can contact their...
Surface parent-org shared topics in request-support popup
Child-org users could not see their parent org's shared support topics (assignToOwnOrg=false) when requesting support, because the popup only fetched own-org to...
New child orgs inherit their parent's securityProvider
When creating a child org from kamo-internal, set the new org's securityProvider to the parent org's securityProvider (the org it's created under) instead of le...
Show account-linked notice on ?linked=1
When register links an existing account to a new org, it redirects here with ?linked=1. Show "You already have a Kamo account — we've added this organization to...
Handle account-linked response for existing users
When the entered email already belongs to an ACTIVE account, the backend links this org to it and returns ACCOUNT_LINKED. Route those users straight to sign-in ...
Wire up member/team-member create + Prospect-gate UI
- Add the missing POST proxy routes /api/security/members/create and /create-team-member (these 405'd before, so creation never reached the backend). Status...
Reuse existing users, mirror to securityProvider, gate team-member sign-in
Reuse (no duplicate accounts for the same person): - MemberCreateController now reuses an existing user by personal email case-INSENSITIVELY (was case-sensiti...
SecurityProvider membership mirror + reuse/patch groundwork
- **************** userId): mirror a user into the org's securityProvider org as a base Member (deduped; no-op when the org secures itself or the user is al...
Wire Tasks tab to real backend + delete action + live count
Adds the Next proxy routes for /leads/{id}/tasks[/{taskId}] (the tab's getTasks/ addTask/updateTask/completeTask calls were 404ing), a deleteTask action in the ...
Lead tasks REST API + real-time TASK_CHANGED
Implements the backend the /leads/view Tasks tab was already calling but that never existed: GET/POST/PUT/DELETE **************** (LeadTaskController + LeadTask...
LeadTask entity for lead follow-up tasks
Backs the /leads/view Tasks tab (previously a frontend-only stub with no persistence). LeadTask (table LEAD_TASK) mirrors the frontend TaskItem shape **********...
Real-time datagrid + live lead view with per-pane edit locks
/leads grid is now fully live over websocket (NATS→STOMP): rows add/remove/update against the active filter automatically and changed cells blink once for other...
Org-guard the /topic/leads/rt/{orgId} realtime subscription
Cross-tenant SUBSCRIBE guard for the new lead real-time topic, mirroring the existing /topic/social/feed guard: a member may only subscribe to their own org's l...
Per-pane edit-lock REST API + auto-save sweeper
Adds /api/security/leads/{id}/locks **************** backed by LeadLockService: exclusive per-pane reservation, draft-buffering heartbeats that reset a 5-min id...
Real-time NATS publishing + per-pane edit-lock entity
Publish org-scoped lead events on security.leads.rt.{orgId} (created/updated/ deleted with changed-field keys, history-appended) so the /leads grid and /leads/v...
Integrate primary tabs into the header on remaining Style A pages
Follow-up to the Style A→B sweep, covering pages that don't route through SettingsView: - /kb: KbNavBar becomes a gradient hero header with the Articles/Resour...
Relocate bottom count bars into the header across social, imports tabs
Applies the vendors-tab treatment to the sibling CRM settings surfaces so the standalone "x • y" summary bar at the bottom no longer eats page real estate: - S...
Move vendor/product count above the header actions, bottom-align Refresh + Add Vendor
Recaptures the page real estate the standalone bottom summary bar used to occupy — the "x vendors • x products" line now stacks above the action buttons in the ...
Integrate primary tabs into the page header (Style B) across Style A pages
Every gradient-hero page that rendered its primary tabs in a separate card below the header now renders them inside the gradient header itself, matching /accoun...
Back arrow in header returns to /leads
Add an optional backHref/backTooltip to SettingsView that renders a white back arrow left of the title, and wire the CRM settings page to send the member back t...
Bold 'CRM Settings:' prefix, pipe separators, hover-only underline on tab links
Preface the CRM settings tab links with a bold 'CRM Settings:' label (new **************** key), separate links with ' | ' instead of a bare space, and switch t...
Add CRM settings tab links above refresh, gated like settings menu
Render a right-aligned row of white, underlined, space-separated links to each /settings/features/crm tab above the Leads header refresh button. The links reuse...
FindByStatus finder (freshness sweep enumerates ACCEPTED requirements)
Staff vendor-doc upload endpoint satisfies third-party requirements
POST **************** (LOS write): staff upload an appraisal/title/HOI/flood doc to the loan-level image store, then satisfy the loan's THIRD_PARTY requirement ...
Cascade condition waive/delete to document requirements
waiveCondition and deleteCondition now best-effort call MLOSDocService's suppress-for-condition after a successful waive/delete, so a waived condition's require...
Notify borrower when they've submitted all documents (DOC_COMPLETE)
DOC_COMPLETE canonical template (borrower has submitted every requested document)
Daily outstanding-document reminder sweep (re-nudge borrowers, throttled)
FindBorrowerOutstandingForNudge (stale outstanding requirements for the reminder sweep)
Notify borrower when a document is accepted (DOC_ACCEPTED, per-party routed)
DOC_ACCEPTED canonical template (borrower confirmation a submitted doc cleared)
Surface 'Needs review' (borrower-submitted docs awaiting staff) as a distinct, prioritized state
A borrower's uploaded document flips the requirement to RECEIVED (awaiting lender), but the Documents column only showed 'Awaiting borrower' or a neutral 'In re...
Centralize §4.5 supersession-collapse (RequirementSupersession)
The freshness engine leaves a STALE_EXPIRED predecessor beside its fresh successor under one **************** Only the read path (ConditionClearabilityComputer)...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.