Gateway relay to mint a MERS MIN for a closing package
POST **************** ownership-checked (requirePackageOrg) so a steward mints only for their own tenant. The upstream reads the 7-digit MERS Org ID from the te...
Date-of-birth on lead view + create form
Adds a "Date of Birth" field under Primary Contact on /leads/view/[id] using a MUI DatePicker that opens to the year grid first (openTo=year, disableFuture, min...
Accept and gate contact date-of-birth (DOB)
Maps `dateOfBirth` in the manual-import and vendor-intake field switches with a lenient multi-format parse (ISO plus common US M/d/yyyy forms; unparseable value...
Add nullable contact date-of-birth to Lead
Adds a contact-level `dateOfBirth` (java.time.LocalDate, DATE column) to the base Lead: entity + Create/Update/LeadDTO (fromLead), copied in LeadService create/...
Author document-requirement overlay rules from the steward console
The "what documents does this loan need" rule matrix had no authoring surface. This adds a Document-requirement rules section to the Documents & Conditions scre...
Relay document-requirement overlay-rule authoring
Relays POST/GET/retire on **************** to MLOSDocService, with organizationId server-stamped from the operator session so a steward authors and lists only t...
Author conditional LLPAs from the catalog panel
Adjustments could not vary by borrower: MlosAdjustmentCondition had no writer, and the pricing engine treats an adjustment with no conditions as always-applies,...
Confirm email when reassigning a lead from the lead-view
The Assignment card now reassigns via leadsApi.reassignLead, which surfaces the server's assigneeNotified flag. On a reassignment to a new member the toast read...
Email the new owner when a single lead is reassigned
Mirrors the bulk path for the lead-view Assignment card. When PUT /leads/{id} moves a lead to a different member, that member now gets the same LEADS_ASSIGNED e...
Relay conditional-LLPA authoring
Relays POST **************** through the org-stamping write helper, so a steward authors conditional adjustments only for their own tenant.
Bulk-reassign selected leads to a team member
The grid already had multi-select checkboxes but nothing to do with a selection. Checking rows now reveals a Reassign action beside the other lead actions, gate...
Bulk-reassign endpoint, gated on REASSIGN_LEADS_MANUALLY
POST **************** moves a batch of leads onto one team member and emails that member once for the whole batch. Authorization uses REASSIGN_LEADS_MANUALLY (...
Sample variables for the LEADS_ASSIGNED template
Without a case here the admin template editor's Preview renders the new template with every placeholder blank, which reads as a broken template rather than an u...
LEADS_ASSIGNED email template; harden assignLead for bulk use
assignLead had zero callers and had never run in production. Before wiring the bulk reassignment path to it, give it the guarantees that path needs: - take org...
Add MANAGE_ORG_BRANDING (174)
Org branding endpoints (logos, colors, backgrounds, theme provisioning) were owner-or-god only, leaving no way to delegate branding without handing over ownersh...
Author eligibility matrices from the catalog panel
Without a matrix covering a scenario's occupancy and purpose, pricing returns NO_COVERAGE — so before this, only a purchase of a primary residence could be pric...
Relay eligibility-matrix authoring; rebuild picks up the SUSPENDED resume
Relays POST **************** through the existing org-stamping write helper, so a steward authors matrices only for their own tenant. This push also rebuilds a...
Rebuild the agent studio as a full-width workspace
Removing the width cap was not the fix; the layout itself needed to be designed for the space rather than tolerated in it. The studio is now three zones side b...
Author lock policies — without one, no rate can be locked at all
RateCommitmentService refuses a lock whenever the priced result carries no lockPolicyVersionId ("lock-policy version is required"), and a result only carries on...
Show how each agent is doing
Adds a performance section to the top of the agent studio: conversations, how often a person took over and what triggered it, outreach outcomes, and cost. Writ...
Per-agent scorecard
What each agent actually did: conversations, how often a person had to take over and why, outreach outcomes including the ones held back, and what it cost. Eve...
Grouped aggregate queries for the agent scorecard
Twelve @Query aggregates across sessions, messages, usage records and outbound touches, so a scorecard is a handful of grouped queries rather than loading rows ...
Edit what each model costs
Adds per-model price editing to the provider setup screen. Prices are seeded from each vendor's published list price where we know it, and blank where we do not...
Model pricing catalog, write path and backfill
Cost accounting could never work: AiModel has price columns, AiModelController reads them and ChatOrchestrationService reads them to compute costEstimate - but ...
Show the AI handoff context to the agent taking over
Renders an AI_HANDOFF system event as a card with the reason, the AI's summary, and a collapsible transcript of the conversation so far - so the borrower does n...
Proxy the public AI->human handoff route
Adds POST **************** proxied to MediaService alongside its createSupportSession sibling. Without this the handoff feature was dead on arrival: MediaServi...
Carry the AI conversation into the human thread on handoff
Creates or reuses the support session, copies the AI transcript in as one system event, routes it, and tells the visitor honestly what happens next. Confidenti...
Agent-initiated handoff to a human, with context
The AI could not previously ask for a person: escalation rules reached the model via the compiled prompt, but there was no machine-readable signal back, so the ...
Accept agent-authored outreach into an open borrower thread
The counterpart AIService's outreach dispatcher calls. Without it the whole outbound path terminated in a recorded 404 - the gate authorized a touch, the messag...
Outbound triggers, scheduler and web-chat dispatch
Makes the outreach spine actually fire. The gate, contact state, consent and audit already existed; nothing caused a touch to be evaluated. - NATS enabled for ...
Required-text editor; dedupe AI general settings; fix model toggle
Adds an editor for org-wide required opening/closing text - the compiler and columns existed but nothing could set them, so the capability was dead. Copy states...
Persist org-wide required text and apply it immediately
AiOrgSettings gained forcedPreamble/forcedFooter and SalesAgentCompiler already folds them into every agent, but the settings controller neither read nor wrote ...
Full-page AI Sales Agent studio, replacing the modals
The agent editor was a ~800px MUI Dialog whose entire surface was a 10-row textarea, on the one AI tab that used a dialog at all. It is now a dedicated route, a...
Sales-agent compiler, versioning, outreach gate; fix tool replay
Structured agent config compiles to the system prompt, freezes per published version, and gains the gate an agent must pass before initiating contact. Compiler...
Structured sales-agent config, version spine and outreach state
Replaces the single training-context blob with a structured, versionable agent model, and adds the per-contact spine an agent needs before it may initiate conta...
AI Sales Agents tab + per-channel agent assignment
Builds out /settings/ai?tab=sales-agents (was a stub): orgs create agents for their sales industry, either from a built-in template or by writing the training c...
Enrich borrower chat routing + capture subject-property state
chat-routing now returns the assigned officer's NMLS, title, photo, phone, email and whether they hold a valid license for the subject-property state, plus the ...
Assign a sales agent per channel + report LO availability
- WebChatIntegration CRUD threads salesAgentId (null clears the assignment) - lo-presence now returns the member's availabilityStatus alongside online, so the ...
Sales-agent CRUD, mortgage template, and agent-driven chat prompt
- AiSalesAgentController (/api/ai/sales-agents): org-scoped CRUD + GET /templates - SalesAgentTemplateRegistry: built-in starter templates, beginning with a m...
SalesAgent entity + per-channel agent assignment
Org-configurable AI sales agents: a named agent for a sales industry, programmed with a training context the org authors (from a template or by hand), assignabl...
Auto-provision platform-managed MLOS chat + serve site key by host
- ManagedChatIntegrationService: lazily mint the org's platform-managed SPECIFIC_AGENT WebChatIntegration on first access. KamoMLOS is first-party: org resolv...
Verify routing token, persist leadUid, reassign chat on lead move
- createSupportSession takes a signed routingToken (not preferredAgentMemberId); verified via ChatRoutingTokenCodec + cluster internal.auth.secret, enforces ...
Signed agent-routing token + lead-reassignment propagation
Foundation for making the reusable public-chat widget handle the KamoMLOS borrower->loan-officer variant securely, and for propagating lead reassignment into an...
Expose vision capability so the console can explain a missing provider
PDF rate sheets are read by the org's configured vision provider. When none is configured the AI call fails the same way a model error does, so the console had ...
Inline image vision + tier fallback that prefers stronger over weaker
Two limits made org-configured vision unusable for whole classes of caller. 1. Vision was URL-ONLY. Every caller had to stand up public, provider-fetchable ser...
Split Devices into "Phone System(s) Devices" + "Mobile Devices"
The Devices tab now has two sub-tabs. The existing PBX/softphone hardware table moves under "Phone System(s) Devices" unchanged; the new "Mobile Devices" tab M...
Org-admin endpoints for mobile device policy + enrolled devices
Backs the new "Mobile Devices" sub-tab under Settings → Features → Phone → Devices (its sibling "Phone System(s) Devices" stays on VOIPService and covers - GET...
Ingestion panel accepts spreadsheets, not just CSV
The extractor now reads .xlsx/.xls and sniffs the format from the file itself, so the picker no longer restricts to CSV and the copy says plainly what is readab...
Steward Ingestion tab + the Catalog/Identifier proxy routes that were missing
Rate-sheet ingestion existed end-to-end in the backend and none of it was reachable. This adds the one surface that walks the whole chain: upload an investor's ...
CATALOG_SOURCE assoc type for MLOS catalog source documents
Investor rate sheets / LLPA + eligibility matrices / lock policies need somewhere to live: the ingest extracts from the blob, and the published rate-sheet versi...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.