Mabadiliko
Nini kipya.
Kila kuboresha jukwaa, kama ni meli.
· kamo-shared-library
SalesAgent chombo + kwa kazi ya wakala wa kati
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), assignable to channels to drive that channel's AI. Kamo serves all industries — mortgage is just one template. - SalesAgent entity (dao/beans/ai) + SalesAgentRepository + SalesAgentDTO - WebChatIntegration.salesAgentId (nullable soft link) + DTO field
· SecurityService
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 resolved by host, the public site key is platform-owned and never managed by org admins. - PortalChatConfigController GET **************** resolve org by host, get-or-create the managed integration, return the public site key for <kamo-chat>. (The routing-token mint endpoint + chatRoutingForGuid + assignLoanOfficer chat-routing event landed in 67974fd via an interleaved push; this adds the config/provisioning side and requires shared-lib 6b161b5.)
· MediaService
Angalia ishara ya routing, endelea leadUid, reassign chat juu ya hoja ya kuongoza
- createSupportSession takes a signed routingToken (not preferredAgentMemberId); verified via ChatRoutingTokenCodec + cluster internal.auth.secret, enforces token.orgId == org, routes only when integration.assignmentMode == SPECIFIC_AGENT. Hard cut of the bare browser-supplied member-id path. - persist leadUid on SupportTicket + PublicChatVisitor (durable borrower-lead link) - ChatRoutingConsumer: on security.chat.routing.>, reassign the borrower's open ticket(s) by leadUid to the new officer (reuses assignToPreferredAgent) - lo-presence org-scoped: cross-org/unknown member -> online:false (no leak) - WebChatIntegration CRUD/bootstrap carry assignmentMode; store publicSiteKey for SPECIFIC_AGENT integrations
· kamo-shared-library
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 open chat. - WebChatAssignmentMode (TOPIC_QUEUE default / SPECIFIC_AGENT); WebChatIntegration gains assignmentMode + publicSiteKey (platform-managed key for host-resolved MLOS) - ChatRoutingTokenCodec: short-lived HMAC token over the cluster secret proving the target agent; replaces the browser-supplied preferredAgentMemberId - SupportTicket.leadUid + PublicChatVisitor.leadUid (durable borrower-lead link) + **************** - **************** -> security.chat.routing.{orgId}, emitted from lead reassign (LeadService.updateLead) and pool re-claim (acceptNextLead) - **************** managed-integration finder
· SecurityService
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 no way to distinguish "nothing is set up to read this" from "the sheet was blank". GET **************** proxies AIService's capability probe under the existing steward gate, org server-stamped, so the UI can name the actual problem and point at where to fix it.
· AIService
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 serving infrastructure — a signer, an unauthenticated serve endpoint, an ingress. A ClusterIP service could not use vision at all no matter what the org had configured. Adapters now is strict — a malformed data: URI falls back to URL handling, so an ordinary URL can never be turned into a broken inline part. Callers with a signed public URL are unaffected. 2. Tier selection only distinguished "exact match" from "everything else", so a LIGHT or untiered provider could outrank a configured HEAVY purely on priorityOrder — a MEDIUM request could quietly read a document with a model too weak for it. Ordering is now requested tier -> stronger tiers (strongest first) -> untiered -> weaker tiers. Under-serving is the failure that produces wrong answers, so over-serving is preferred to it. Tier stays a preference, never a filter, and priorityOrder still breaks ties. Shared by both vision and text selection, which had duplicated the old comparator. Also adds GET **************** resolved through the real routing path: MlosAiClient collapses every failure into an empty Optional, so "no provider configured" is otherwise indistinguishable from "the model erred" and nothing can tell a member which. This is what lets a UI say so.
· kamo-internal
Split Devices katika "Mfumo wa Simu (s) Devices" + "Mipangilio ya Simu"
Kwa sasa chombo hicho kina kurasa mbili. Vifaa vya PBX / Softphone Hatua chini ya "Mfumo wa Simu (s) Devices unchanged; tab mpya ya "Simu za Mkono" Vifaa vya simu inaruhusu admin kuweka: Sera ya Uendelezaji wa ORGANIZATION (Vifaa vya kibinafsi vinavyoruhusiwa dhidi ya usimamizi wa kampuni (iii) Kuwezesha upatikanaji wa maji safi katika Halmashauri ya Wilaya, na - A PER-MEMBER override (au "kutumia default org"), na matokeo ya ufanisi Sera iliyoonyeshwa kwa kila mwanachama, pamoja na vifaa kila mwanachama amejiandikisha (jina, jukwaa, matumizi ya mwisho, IP ya mwisho). Mwanachama wa Kampuni ManageD REQUIRED anaweza tu kufikia org kutoka kwa kampuni inayosimamiwa na kampuni. (Mmiliki wa Kifaa cha Android aliyejiandikisha) - programu inaficha org kabisa kwenye simu yoyote Kifaa kingine; vifaa vya kusimamiwa pia update kimya na kukaa mbio. Uchaguzi mdogo hutumia yake mwenyewe 'deviceView =' param hivyo kamwe hugongana na Picha zote na Wizara ya Mambo ya Ndani ya Nchi. .................................................................... Kuunganishwa na mpya [TD="width: 456"] [FONT=&](2)[/FONT][FONT=&]Bila kuathiri masharti ya kifungu kidogo. Kumbuka: maandiko mapya ni masharti halisi - orodha ya ujumbe wa intl ijayo huishi katika Kamusi ya tafsiri tofauti, kwa hivyo funguo zinapaswa kuongezwa huko katika ufuatiliaji.
· SecurityService
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 **************** org default policy + one row per ACTIVE member: their override, the effective policy, and the devices they currently have enrolled (non-revoked UserDeviceTokens: name, platform, last used, last IP, expiry). - PATCH **************** sets or clears the per-member override; null inherits the org default. Gated on MANAGE_VOIP_SETTINGS (the right that already opens the Phone settings page) plus same-org, or god mode. The org-wide default itself is written through the existing PUT /api/security/org/{id} field patch.
· kamo-internal
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 readable — including that PDFs are not, rather than letting a steward upload one and get a confusing failure.
· kamo-internal
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 sheet -> ingest it -> see exactly what the extractor read, cell by cell with its provenance -> approve/reject -> publish the approved rows as a priceable rate-sheet version. The panel is honest about what it will actually do: it previews how many approved rows have BOTH a rate and a price (only those publish) and says plainly that a half row is skipped rather than guessed. Nothing reaches the catalog before approval. Also adds the /api/security/mlos/catalog and /api/security/mlos/identifiers proxy routes. Both panels shipped without one, so every call from them 404'd at the Next layer and never reached SecurityService at all.
· kamo-shared-library
CATALOG_SOURCE assoc type for MLOS catalog source documents
Uwekezaji kiwango karatasi / LLPA + ustahiki matrices / lock sera haja ya mahali fulani kuishi: dondoo za ingest kutoka blob, na pointi za kiwango cha karatasi iliyochapishwa kurudi kama ushahidi. Hakuna aina ya assoc inayofaa - MY DOCS ni eneo la mtu mwenyewe Na ndoo ya SYSTEM WIDE ni templates za barua pepe. CATALOG SOURCE ni org-scope na kwa makusudi si deletable au overwritable: kuishi bei anataja faili hii, hivyo kubadilisha au kuondoa itakuwa kimya kuandika tena ushahidi Nyuma ya toleo lililochapishwa. Ilibadilishwa mwisho, kwa hivyo hakuna mabadiliko ya kawaida.
· SecurityService
Gateway kwa ajili ya mapitio ya mgombea + kiwango chasheet kukuza
Exposes the two new catalog promotion writes to the steward console under the existing MLOS steward gate, with organizationId server-stamped from the operator session: POST **************** POST ****************
· kamo-shared-library
MobileDevicePolicy - org default + kwa kila mwanachama override
personal phone or must be on a company-managed (Android Device Owner enrolled) device: - MobileDevicePolicy enum: PERSONAL_ALLOWED | COMPANY_MANAGED_REQUIRED. - Organization.mobileDevicePolicy — the org-wide default (NOT NULL, defaults to PERSONAL_ALLOWED so existing orgs are unaffected). - Member.mobileDevicePolicy — nullable per-member override; NULL inherits the org default, which is how the policy is configured "per member". The EFFECTIVE value per membership is what the mobile app gates on: an org whose effective policy is COMPANY_MANAGED_REQUIRED is hidden from the org switcher on a device that isn't enrolled as company-managed. Columns applied via KamoInitializer.
· SecurityService
Steward gateway for ingestion (intake + staging area were unreachable)
MLOSIngestionService had no gateway presence, so no tenant could hand a rate sheet to the extractor and the candidates it stages had no reader on any reachable surface. Adds **************** at /api/security/mlos/ingestion: multipart rate-sheet ingest relay plus the two staging reads (a source document's candidates, an investor's intake history). organizationId is SERVER-STAMPED from the operator session on every call, so a steward only ever touches their own tenant's staging area. Read timeout is 120s — a parse is CPU work, not a lookup. imgDatId stays required: it is the content-addressed provenance anchor and the intake-dedup key, so the blob is stored through the imaging pipeline first.
· kamo-internal
Steward Identifiers tab - kutatua idadi ya nje kwa mkopo wake
New Identifiers tab in the mortgage steward console: paste an external number (loan number, MERS MIN, DU/LP/GUS case file, e-sign envelope...) and resolve it back to its loan — the same gate the inbound vendor webhook router uses, so a steward can chase an unrouted callback — plus a per-loan identifier ledger and lifecycle view. Fail-closed: unknown, ambiguous, or another tenant's number all read UNRESOLVED. Wires the new /api/security/mlos/identifiers proxy. Plain-string labels (i18n follow-up).
· SecurityService
Identifier gateway — steward can resolve an external number to its loan
MLOSIdentifierService had no gateway, so the typed identifier plane (the routing gate every inbound vendor/agency/AUS/e-sign callback uses) was unreachable from the console. New MlosIdentifierClient + MlosIdentifierController **************** resolve an external number, and read a loan's identifier ledger + lifecycle events. Tenant isolation: the per-loan reads pass the operator's own org as the doc-11 §6.5 cross-org guard; /resolve carries no org downstream, so a resolution landing in ANOTHER org is reported as UNRESOLVED here rather than leaking that the number exists. god-eligible steward gate. configmap: mlos.identifier.url.
· kamo-shared-library
Value-keyed AUS case-file + e-sign envelope finders for identifier owner-delegation
Completes the owner-column lookups the MLOS identifier plane needs to route inbound callbacks: **************** (DU/LP/GUS run handle) and **************** Both org-agnostic and LIST-returning so a re-run collapses and an ambiguous cross-loan collision fails closed rather than mis-routing. Additive @Query finders; no schema.
· kamo-shared-library
Thamani-key-identity finders kwa kitambulisho mmiliki-delegation
Ndege ya kitambulisho cha MLOS inatatua muuzaji wa ndani / kurudi kwa mkopo; kwa aina za OWNED ELSEWHERE Thamani ya mamlaka inaishi kwenye safu ya OWNER. Kuongeza thamani-keyed (org-agnostic) finders kurudi LIST (Kwa hivyo mgongano mkubwa wa msalaba unashindwa kufungwa badala ya kukimbia): Kwa mfano, *** Kwa mfano, *** Picha zote na Wizara ya Mambo ya Ndani ya Nchi. .................................................................... Kuongeza @Query Finders juu ya Mabadiliko ya muundo; hakuna mabadiliko ya muundo.
· kamo-shared-library
CONDITION_ADDED / CONDITION_CLEARED canonical email templates
Kukopa-inakabiliwa nusu ya hali kitanzi: templates mbili za orodha ya generic kwa hali mpya taarifa ya mtumiaji. Imeongezwa kwa CANONICAL KEYS na rasilimali zao za json + HTML; mbegu ya huduma ya barua pepe Katika kesi ya kwanza, safisha mikono yako vizuri, tumia cream ya greasi. Copy ya generic kwa makusudi (kitu kipya / kipengee kilichokamilishwa - kufungua bandari yako) - barua pepe kamwe haiwafikii Picha zote na Wizara ya Mambo ya Ndani ya Nchi. ....................................................................
· SecurityService
Public pre-auth trial-status endpoint for login/register pill
Wa wa wa wa wa wa wa wa wa wa wa Uamuzi wa org kupitia Jina la kikoa (kwa mfano, jina la kikoa) na jina la kikoa la kikoa. * (Sauti ya Umma) Kwa hiyo kidonge inafanana na bendera ya jaribio la ndani ya programu. Kushindwa kwa InTrial: Uongo maeneo yasiyojulikana.
· kamo-register
Show TRIAL USE ONLY pill above Powered-by for trial orgs
Refactors PoweredByKamo katika stack ya safu iliyowekwa na kujifunga /api / kesi-status / {host} (proxy kwa Huduma ya Usalama wa Umma kesi-status) Endpoint), kutoa kidonge cha amber juu ya kidonge kinachotumia wakati org Akaunti ni katika kesi ya asili. kushindwa kuwa wazi.
· kamo-login
Onyesha TRIAL USE tu kidonge juu powered kwa kesi orgs
Self-fetches /api/trial-status (proxy to SecurityService public trial-status endpoint, resolved by login host) and renders an amber pill above the Powered-by pill when the org's account is in an active native trial. Fails open to hidden.
· kamo-internal
Angalia nyaraka za mtu wa tatu (loan) katika ukaguzi wa mahitaji ya msimamizi
Msaidizi anayepitia mahitaji ya THIRD PARTY (PARTY / PARTY) sasa anaweza kufungua hati ya kuridhisha. Njia mpya ya binary Next.js mito kwa kila-loan authz'd maudhui endpoint; imagingApi.viewLoanDocument blob-fetches + kufungua inline / downloads; AppRequirementView nyuso (tayari-kupangwa) satisfierImgId + mkopoFileUid; Nyaraka zinaonyesha kifungo cha View kwenye safu za tatu na satisfier. Kurejesha huduma mpya ya usalama Mwisho wa maudhui ya LOAN-doc. Mstari wa mbele (i18n follow-up).
· SecurityService
Mtazamaji wa hati ya kila mtu wa tatu (LOAN) - tathmini / kichwa / sakafu
Completes the doc-review byte path started with the vault viewer. LOAN-collection imgs (appraisal/title/flood) are refused by the generic imaging endpoints (per-loan PII lockdown), so a steward reviewing a third-party satisfier could not open it. New GET **************** gated on an LOS operator (LOS_VIEW_PIPELINE) OR a member who is a party to this loan's application, and confused-deputy anchored by LoanDocLoader's assocObjectId==loanFileUid check (a LOAN img carries its owning loan in assocObjectId). Bytes stream in-process from the imaging-loans bucket, so the loan-file gate IS the compartment (not the CONFIDENTIAL clearance). ?download=true attaches; default inline. Closes the LOAN-side residual of ****************
· kamo-internal
View/Download vault documents in the account docs tab
Inabadilisha hali / docs hatua katika kitanzi halisi cha ukaguzi. Orodha ya Wakurugenzi wa Halmashauri ya Wilaya ya Ludewa kwa sasa majibu yasiyo ya JSON (binary) ya upstream badala ya maandishi ()-kubainisha yao; MemberDocsApi.viewDocument inachukua Kwa kila chama / maudhui na kikao cha *** na kufungua inline ya blob (au downloads); AccountDocumentsTab Angalia + Download vitendo kwa hati ya kuba. Inarudisha Huduma mpya ya Usalama kwa kila sehemu ya maudhui ya mwisho. Mstari wa mbele (i18n follow-up).
· SecurityService
Per-party vault document viewer — bytes were write-only, now review-able
Pakia nyaraka za kuba zilizopakiwa (kulipa stub / Gov ID / taarifa ya benki) ziliandikwa tu: picha ya generic Watahiniwa wakataa matokeo ya mitihani (kwa mtu binafsi PII imefungwa), kwa hivyo msimamizi alikubali / aliwasilisha mahitaji Bila kufungua doc, na mkopaji hakuweza kuona tena uwasilishaji. Mwisho wa Authz Picha zote na Wizara ya Mambo ya Ndani ya Nchi walinzi: zinahitajiPartyAccess (mwanachama mwenye sifa au haki ya LOS) + hati-belongs-to-party confused-deputy Angalia, kisha utumie nates IN-PROCESS kupitia VaultDocLoader (MinIO) - hivyo lango la kila chama ni sehemu ya PII. Hakuna kiwango cha dhamana (ambayo itashindwa hata kwa mmiliki). Pakua = vifungo vya kweli; default ya mtandao. the the the the the the the*
· kamo-internal
Steward Catalog tab - mbegu kifungu cha bei + kukagua catalog
New Catalog tab katika dhamana dhamana dhamana dhamana console: mbegu mfuko wa kwanza wa bei nafuu na mwekezaji Real + Utambulisho wa bidhaa (unblocks bei), na kukagua wawekezaji wa org -> bidhaa -> matoleo ya kiwango cha karatasi. Wires mpya /api / usalama / mlos / catalog wakala kupitia catalogApi. Inafunga pengo la # 1 - kizuizi cha kweli catalog ilikuwa unseedable / unreachable, hivyo hakuna chini inaweza bei. 18 ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ). ).
· SecurityService
Catalog gateway — the missing proxy that blocked tenant pricing
Catalog ilikuwa tu MLOS imefungwa mazingira bila lango la huduma ya usalama, hivyo orodha ya mpangaji haiwezi kamwe kuwa mwandishi / mwonaji kutoka kwa huduma ya faraja na BorrowerQuote ilirudi NO CATALOG kwa kila shirika halisi (kulipa) ya kifo). mpya MlosCatalogClient + MlosCatalogController (/api/security/mlos/catalog) wakala catalog Kusoma kwa ****** + waandishi wa toleo-spine (bei-bundle mbegu, Picha zote na Wizara ya Mambo ya Ndani ya Nchi. .................................................................... org ni kutumika kwa kila kuandika kutoka kwa operator Kipindi (mteja-mteja org ni overwritten); mlango wa msimamizi wa Mungu. Picha zote na Wizara ya Mambo ya Ndani ya Nchi. ....................................................................
· kamo-internal
Mikopo ya kuuza dawati UI - terminal mtaji soko wakili screen
MikopoSaleDeskPanel katika Kituo cha Central & Hatari: orodha ya ahadi za utoaji wa wawekezaji (status filter), Kufungua ahadi [TD="width: 456"] [FONT=&](2)[/FONT][FONT=&]Bila kuathiri masharti ya kifungu kidogo (1) Mikopo, kutoa, kununua (fedha CLOSED -> FUNDED), bodi, na jozi ya ugawaji. Wires ya Kwa mfano: *** kwa njia ya capitalMarketsApi. Inabadilisha pengo la barabara Imeonekana katika ukaguzi kama skrini moja kubwa zaidi ya mawakili haipo.
· DaemonService
Watumiaji wa muda mrefu hupeleka wawekezaji kununua kwa mkopo-file FUNDED
MlosLoanFundedConsumer subscribes **************** (durable daemon-mlos-loan-funded) and forwards each purchase to SecurityService's /funded pipeline endpoint via SecurityPipelineClient, advancing the loan CLOSED -> FUNDED (terminal origination stage). Reuses the shared IdempotentEventProcessor core (dedup + nak-retry + DLQ) exactly as MlosClosingCompletedConsumer; idempotent server-side (already FUNDED = 200 noop). SecurityPipelineClient generalized (closingCompleted + funded, body key closingPackageId -> context). configmap: daemon.jobs.mlos-loan-funded enabled, max-attempts 5.

Ulimwengu wako unasubiri.
Kuanza bure katika dakika. Ongeza bidhaa wakati wowote wewe ni tayari - hakuna uhamiaji, hakuna logins mpya.
Bure milele - hakuna kadi ya mkopo inahitajika