Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-internal
FFA quick-toggle on /leads/available + live sync; hide available count
- /leads/available: manager-only icon button (Public/PublicOff) next to Inject Test Lead to toggle a vendor/product's free-for-all mode, with a lightweight confirm dialog and a state-aware tooltip. Removes the numeric 'ready' count — availability is denoted by the pulsing row + an enabled Accept button. - Live sync via a new onVendorProduct WS event **************** the available page refetches and the CRM Vendors & Products settings page patches the FFA chip in place, so multiple managers stay in sync without refreshing.
· SecurityService
Live FFA toggle — quick endpoint + broadcast on product updates
- PATCH **************** (MANAGE_CREDITS): toggle a product's free-for-all flag from the Leads-Available shortcut; publishes vendor-product + availability. - **************** → **************** (relayed to **************** - **************** now broadcasts the same event so the CRM Vendors & Products page reflects FFA changes live for other managers.
· kamo-internal
Meta OAuth Connect button + 24h window composer state + fix double-Tooltip
- SocialConnectionsManager: wire the Connect button (creates OAuth draft, hands off to MediaService Meta OAuth start), surface the OAuth redirect result, hide Save for OAuth-new - SocialChat: 24h messaging-window composer state for Meta providers (banner + disabled input) - SocialChatWindow: pass provider to SocialChat; remove redundant outer Tooltip around LanguageSelector
· SecurityService
Warn when a social connection lacks vendorProduct/market (lead created but not pooled)
· MediaService
M4 Meta adapters + OAuth + 24h window + M2 hardening
- Meta adapters (Messenger/Instagram): fix invalid _caption send (caption now a follow-up message), bytes-upload via Graph Attachment Upload API, URI encode fix in MetaGraphClient - Telegram adapter: multipart bytes upload for outbound images (providers cannot fetch the auth-gated /imaging/proxy URL) - SocialCredsResolver: populate creds.extra appSecret/verifyToken for Meta from social.meta.* - MetaOAuthController: Facebook/Instagram OAuth connect (start+callback), encrypts page token - MediaController outbound: image bytes-upload (M2b) + 24h messaging-window gating (M4c) - SocialReconciliationSweep: re-publish social.lead.new for orphaned conversations (M2a durability) - config: social.meta.* + social.reconcile.* + optional social-meta secret
· SecurityService
SecurityService read-proxy for MLOS Governance
One controller/client pair fronting MLOSGovernanceService's five reads (both its steward-feedback and pull-through-policy modules share /api/governance). organizationId resolved from the OTK session, never the browser. Tenant guards: org-injected passthrough for the two by-org reads; flat top-level-org fail-closed (404) for the single active-policy read; per-row post-filter for the by-decision feedback trail + policy version history (drop foreign rows, re-count), with a downstream-404 normalized to an empty 200 so unknown/foreign/empty are indistinguishable (no cross-org AiDecision existence oracle). Adds mlos.governance.url.
· kamo-internal
Governance console — steward-feedback flywheel + pull-through policy
Fifth and final MORTGAGE steward screen, read-path B. Signature Steward-Feedback Flywheel (AI decides → steward corrects → becomes truth → model recalibrates), rotation bound to correction velocity, fully data-backed from the steward-feedback by-org read. Verdict-mix donut + Reg-B reason spectrum, corrections feed with append-only decision-trail drawer, and pull-through policy governance (org grain map → active knob-board with the two orthogonal hedge axes → WORM version-history spine with knob-diff). One documentsApi/governanceApi over the single /api/governance base. Review-hardened: enum labels via next-intl, per-surface error degradation, WCAG-AA contrast, sandbox test-partition note, ICU-plural version counts. Pairs with SecurityService MlosGovernanceController (org-injected passthrough for by-org reads; flat-top-level-org fail-closed for active-policy; per-row post-filter with 404-normalization for by-decision + history, closing the cross-org oracle).
· kamo-internal
Steward section tone constants + section simplification
(Uncommitted MLOS steward work present on the shared dev mount, committed to keep the tree clean; compiles cleanly. Not part of the lead-alert change.)
· kamo-internal
Single-market orgs adopt the market's title/description in nav + pipeline header
When an org has exactly one configured commerce market, the Commerce nav item uses that market's TITLE and the /commerce pipeline header uses the market's TITLE and DESCRIPTION. Zero or multiple markets fall back to the generic Commerce labeling.
· kamo-internal
M3 frontend — Social Media settings tab (connection CRUD) + social chat popup **************** + SocialAgentContext backend-push + leads Communications Chat sub-tab + auto-open-on-lead-access + reusable LanguageSelector source-language override. NOTE: i18n keys must be added to kamo-translation-dictionary (messages/ is gitignored/generated)
· SecurityService
M3 SecurityService — SocialConnectionController (encrypted-at-rest connection CRUD, MANAGE_CRM_SETTINGS-gated) + SocialConversationController (lead->social-session lookup); social-enc-key envFrom
· MediaService
M3 MediaService — SocialCredsResolver decrypts secretCiphertext (encrypted-at-rest); translate source-language override (PATCH endpoint + MessageTranslationService overload, source-keyed cache); social-enc-key envFrom
· kamo-shared-library
M3 secret store — **************** (encrypted-at-rest) + SocialSecretCipher (AES-GCM wrapper); widen MediaObjMsgTranslation unique to include SOURCE_LANGUAGE_ID (source-override cache correctness)
· kamo-internal
Documents steward screen — condition clearance matrix + eClose drive-loop
Third MORTGAGE steward screen, read-path B. Signature Condition Clearance Matrix renders the doc-system 1-obligation/N-satisfier model: each locked LoanCondition is a reference-counted clearance row with the distinctive 'whose court' (waitingOn) axis, clearing green only when zero requirements are open. Org-scoped eClose pipeline strip drills a package into its loan; the drawer shows the ESIGN→RON→ENOTE→EVAULT→MERS drive-loop aggregated from artifacts + the MERS ledger. Fronts two proxies (doc + doc-orchestration) via one documentsApi. Review-hardened: MERS panel crossfade on loan switch, WCAG-AA metadata contrast, own legal-wall KPI tile, org-load KPI gating, drive-loop unrouted-artifact gate, pre-line drive-loop tooltips.
· SecurityService
SecurityService read-proxy for MLOS Documents (doc + doc-orchestration)
Two browser-facing read-proxy controller/client pairs fronting MLOSDocService (/api/docs) and MLOSDocOrchestrationService (/api/doc-orchestration) for the Documents steward screen. organizationId resolved from the OTK session, never from the browser. Tenant guards: org-injected passthrough for the loan requirements + borrower-actionable catalog + closing-package list; flat top-level-org fail-closed (404) for the by-id template extension + closing package; org post-filter for the loan MERS ledger. by-MIN ledger and the org-blind package branch are deliberately not exposed. Adds parseLong to MlosBaseController + mlos.doc/doc-orchestration URLs to the configmap.
· SecurityService
M2 SecurityService — social.lead.new consumer (core NATS) creates POOLED lead with SEPARATE comment stream + SocialRemoteUserLead mapping; SocialMediaClient internal member-add; LeadAcceptController hook adds accepting rep to social conversation + triggers popup
· APIService
APIService public webhook edge — POST/GET /api/social/webhook/{token} verify+forward (raw body + provider signature headers) to MediaService with X-Internal-Auth
· MediaService
M2 MediaService — Telegram adapter + creds resolver; inbound webhook edge + JetStream consumer; SocialMessageService (SOCIAL session/message, SOCIAL_VISITOR relay); internal member-add + social.agent STOMP relay; outbound send via adapter in afterCommit; social-secrets envFrom
· kamo-shared-library
Add **************** (JetStream publish without expectedStream) so services can publish to a stream other than their configured one (social.* -> SOCIAL_MESSAGES)
· KlusterServices
Provision SOCIAL_MESSAGES JetStream stream (social.inbound.>, social.lead.>) R1 for social-media inbound pipeline
· kamo-internal
Pricing Review steward screen (rate ladder + LLPA waterfall), live
Third steward tab, on the shipped MLOSPricingService reads via the new SecurityService proxy (+ the new org-scoped runs read). Org run inventory with a run selector, the rate ladder (eligible rungs ranked with best-execution + par flags, ineligible rows with adverse-action reasons), and a detail drawer whose signature viz is the LLPA price waterfall: base price -> each adjustment line (stack order) -> margin -> offered final, reconciling. KPI strip + honest "coming soon" strip. - New **************** + route handler + eligibility tone map; extends the console kit + shared mlosGet. - Wired into MortgageStewardSection (replaces the Pricing placeholder).
· SecurityService
Pricing review read proxy (rate ladder + LLPA decomposition)
MlosPricingController @ /api/security/mlos/pricing + MlosPricingClient to MLOSPricingService (/api/pricing). Reuses MlosBaseController. runs inventory injects the operator org (server-filtered); by-id run/adjustments fail-closed on the body's top-level organizationId; results-by-status (no org field) is gated via the org-bearing run detail. configmap: mlos.pricing.url.
· kamo-internal
Archive-not-delete markets, market-only pipeline, drag reorder
Settings › Engagement Types: - Archive markets (type "ARCHIVE" to confirm) instead of deleting; Active/Archived sub-tabs; restore from Archived. Market detail Delete → Archive/Restore. - Dedicated drag-to-reorder mode (framer-motion) sets market order, which drives the pipeline tab order. Manual Display Order field removed (auto-append on create). Pipeline (/commerce): - Hide Dashboard + Engagements tabs; the first market opens by default. - With a single market, omit the tab bar and run it full-bleed. - "New" action moved to the page header, right-aligned. - Remove now-orphaned PipelineDashboardTab / PipelineEngagementsTab. Markets are archived (isActive=false), never hard-deleted; archived markets are hidden from the pipeline.
· SecurityService
?status filter on markets list; remove redundant DELETE
GET /api/security/commerce-markets now takes an optional status=active|archived|all (default active) so the settings Archived tab can load archived markets. Drop the DELETE /{id} endpoint — it was a soft-delete (isActive=false), redundant with PATCH /{id}/active. Markets are archived, never hard-deleted.
· kamo-shared-library
Archived-market queries; drop redundant hard-delete
Add findArchivedByOrganizationId + findAllByOrganizationIdOrdered and the matching **************** service methods so Commerce settings can surface an Archived view. Remove deleteMarket — it only set isActive=false, redundant with the isActive PATCH. Markets are archived, never hard-deleted.
· kamo-shared-library
M1 foundation — provider SPI + normalized DTOs, 6 entities **************** repos, registry, MediaSessionType.SOCIAL, translation source-language column
· kamo-internal
Underwriting Review steward screen (agency AUS + non-QM), live
Second steward tab, on the shipped MLOSUnderwritingService reads via the new SecurityService proxy. Agency AUS runs inventory (DU/LP/GUS + decision) with a detail drawer (finding, conditions, waivers, validations fetched in parallel), and the non-QM internal-rules decisions table. KPI strip + honest "coming soon" strip (income calc / large deposits / fraud / guideline exceptions). - New **************** + route handler; extends the console kit (ConsoleShell, KpiTile, StatusPill, tables, drawer, motion). - Extract a shared mlosGet helper (app/lib/mlos/http.ts); refactor the capital-markets client onto it (removes duplication). - AUS decision / outcome / waiver / validation tone maps in tones.ts. - Wired into MortgageStewardSection (replaces the Underwriting placeholder).
· SecurityService
Underwriting review read proxy (agency AUS + non-QM internal rules)
MlosUnderwritingController @ /api/security/mlos/underwriting + MlosUnderwritingClient to MLOSUnderwritingService (/api/underwriting, X-Internal-Auth). Reuses MlosBaseController (operator/org gate, MLOS-named, no LOS right). Injects the operator's own organizationId into the org-scoped reads; the by-id detail/waivers/validations reads fail-closed against cross-org access. configmap: mlos.underwriting.url.
· kamo-internal
Wire Capital & Risk Command Center to the live read-path
Replace the fixture layer with the real end-to-end read-path: browser -> **************** route handler -> APIService -> SecurityService MlosCapitalMarketsController -> MLOSCapitalMarketsService. organizationId is resolved server-side from the operator session; never sent from the browser. - New **************** route handler (GET-only). - capitalMarketsApi swapped from fixtures to live (***/OTK, retry); fixtures deleted. - Correct the funding-probability semantics: p5/p50/p95 are probability quantiles (0..1), not dollars — the fan now plots a 0-100% probability axis (p5-p95 band, p50 median, blended P(fund) diamond) with expected funding ($) as the magnitude; the segment table shows p-columns as percentages. BorrowerStrategy enum corrected **************** - Drawer hides the AI-decision rationale panel until a lock commits through the RCE engine (decisions[] populate then).
· SecurityService
Capital-markets steward read proxy for the Command Center
Add an MLOS-named, read-only proxy that lets the kamo-internal Capital & Risk Command Center reach MLOSCapitalMarketsService without exposing the internal network or secret to the browser: - MlosBaseController: self-contained OTK-session helpers (org + operator/god gate). Does NOT extend the hard-money LOS base and introduces no LOS-named right — MLOS is a distinct system. - MlosCapitalMarketsController @ **************** resolves the operator org from the session, gates on operator (god-mode), injects the operator's own organizationId into the org-scoped MLOS reads (never a client value), and fail-closes the composite by-id reads against cross-org access. - MlosCapitalMarketsClient: RestTemplate to kamomloscapitalmarkets-service with the shared X-Internal-Auth secret (organizationId passed as query param). - configmap: mlos.capital-markets.url (env-overridable). Reuses the already-wired internal.auth.secret. Reached via APIService's blanket /api/security/** relay.

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