Nenda kwenye maudhui
KAMOUniverse

Mabadiliko

Nini kipya.

Kila kuboresha jukwaa, kama ni meli.

  1. · kamo-shared-library

    Confidence-gated QC box + labeled training data + gift/self-employment reconcile

    QC engine (Phase 4 core): - VerifiedFact gains first-class EXTRACTION_CONFIDENCE, DOC_TYPE_CODE, QC_STATE columns (QcState: **************** Reconciliation now applies ONLY gate-passing facts (AUTO/CONFIRMED + non-extraction); low confidence waits for review, rejected never applies, corrected is superseded. - ExtractionCorrection = append-only labeled training data (doc, field, AI value + confidence, human ground truth, action). QcReviewService captures it on every confirm/correct/reject, mints a high-confidence OPERATOR_OVERRIDE on a correction, and reconciles. VerifiedFactRepository: QC-queue + reviewed-corpus queries. Extraction widening: - gift.* → Gift row (createGift added; kind=Cash Gift, source=Relative injected from doc type; AI reads amount + donor). tax return / Schedule C → self-employed Employment (employment.isSelfEmployed flag from doc type).

  2. · SecurityService

    Extract benefit/award income (SSA, pension, child support)

    Adds extraction prompts for SSA_AWARD / PENSION / CHILD_SUP (AI reads the gross monthly amount + a label), and stamps the OtherIncomeSource id deterministically from the doc type so reconciliation lands a real OtherIncome row. Rebuilds against the shared-lib otherIncome reconciliation branch.

  3. · kamo-shared-library

    Reconcile otherIncome.* facts into OtherIncome rows

    Extends fact reconciliation with an otherIncome.* branch: award/benefit documents (Social Security, pension/retirement, child support) land a real OtherIncome row with a mapped OtherIncomeSource id + monthly amount. Idempotent on (borrower, source). The source is a deterministic mapping the extractor injects from the doc type — never an AI guess; the AI reads only the amount.

  4. · SecurityService

    Auto-classify uploads to catch wrong-document uploads

    A cheap LIGHT-tier "what is this document?" pass on the first page classifies the upload into a coarse family and compares it to the requirement's asserted type. On mismatch the extract response flags it (detectedType + typeMismatch) so the borrower is told "this looks like a bank statement" instead of a wrong file silently extracting nothing. Advisory only — extraction still runs.

  5. · SecurityService

    Extract 12-month bank statements + written VOE

    Widens vision extraction to two more borrower doc types that reuse the existing reconciliation vocabulary (zero reconciliation risk): BANK12MO reads as an asset statement (asset.*), VOE_W reads employer + gross monthly income (employment.*).

  6. · SecurityService

    Multi-page PDF document extraction (Phase 2)

    The vision path was image-URL only, so a borrower's multi-page PDF (bank statement, tax return) couldn't be read. Now: - VaultDocPublicController serves ?page=N by rendering that PDF page to PNG on the fly (via ConversionService /render-page) — provider-agnostic, since many vision providers accept only an image URL, not a raw PDF. Non-PDF/no-page requests are unchanged. Img→MinIO load factored into a shared VaultDocLoader. - DocVisionExtractionService reads a PDF page-by-page (capped at 15), merging fields across pages by keeping the highest-confidence reading of each path. A single image is still read as one page (unchanged behavior). - ConversionPageClient calls ConversionService (reuses conversion.service.url).

  7. · ConversionService

    Full-res per-page PDF render for document extraction

    Adds DocPageRenderService + POST /api/conversion/render-page (page N → PNG at 150 DPI, capped 300) and /page-count. This is the read-quality companion to the 300px thumbnail path: the borrower-document vision-extraction pipeline splits a multi-page statement/return into one legible PNG per page so any vision provider (all accept an image URL; only some accept a raw PDF) can read every page. Additive — existing conversion endpoints unchanged.

  8. · kamo-shared-library

    Capture + encrypt full SSN on the borrower application

    Hali ya maombi inahitaji jamii ya kweli ya mkopaji, sio mwisho wa 4 (mkopeshaji) Haiwezi kufanya kitu chochote na tarakimu nne). SnEncrypt ilikuwepo lakini haikuwahi Picha zote na Wizara ya Mambo ya Ndani ya Nchi. Kwa sasa: s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s . . . . . . . . .; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - Huduma ya kukopa inaandika SSN kamili iliyotolewa wakati wa kupumzika (optional-injected) SecretCipher - iliyopo katika Huduma ya Usalama, kutokuwepo / kuongeza usalama katika mazingira kama hayo KamoInitializer) na hupata kiraka cha mwisho cha 4 kinachoondoa SSN sasa huhifadhi Thamani iliyohifadhiwa badala ya kufuta 4 ya mwisho. - ssnEncrypted/itinEncrypted @Size (32) -> 256 kwa hivyo GCM-base64 ciphertext inafaa Kifungu cha 256-char (hakuna mabadiliko ya schema).

  9. · SecurityService

    Chaguo la simu = kuangalia nyuma kwenye GET / api / usalama / maelekezo

    Kichupo cha CRM cha laini hutatua nambari ya simu ya kazi kwa kuongoza. Aliongeza kuwa Maombi ya simu ya hiari ambayo huchuja orodha ya kuongoza ya org na canonical Mchezo dhidi ya PHONE PERSONAL/PHONE WORK kabla ya konda Mradi wa LeadListDTO - hakuna PII kupanua, sawa unassigned-visibility Inakua kama gridi isiyo na gridi.

  10. · kamo-internal

    Wire CRM Integration tab to real data

    Replace the mock CRM tab with a live reverse-phone-lookup panel. - Resolve the active call / dialpad number to a CRM lead via leadsApi.searchByPhone (new ?phone= filter on GET /leads). - Show the matched lead: contact, status, loan figures, assigned officer; quick actions Call / Open Lead / Log Note (media/posts) / Schedule Callback (reused CallbackDialog); recent activity from the media feed. - Fallback when no lead matches: address-book Contacts, then the internal member directory (both client-side, reusing existing data paths), shown as an identity card. - New helpers app/lib/phone.ts (canonical digit match) and app/lib/directoryLookup.ts.

  11. · EmailService

    Support "unblock forever" remote-image consent

    Adds a wildcard consent (allowAll / isAlwaysAllowed) so a member can opt to display external images in every message. Reuses the existing consent table via a reserved sentinel message-id key — no schema change. The POST /remote-image-consent endpoint accepts scope=always for this global choice.

  12. · kamo-internal

    Add "unblock forever" option for blocked external images

    The external-images gate now offers two actions: Unblock (this message, as before) and Unblock forever, which displays external images in every message going forward. Unblock forever is gated behind a confirmation dialog and persists server-side (cross-device); a broadcast un-blocks other open messages immediately.

  13. · SecurityService

    A different preferred name forks a new lead

    A genuinely different preferred name (compared case-insensitively with outer spacing trimmed) is a different person, so create a brand-new lead instead of renaming the existing one — it becomes the GUID's current lead via findLeadByGuid's uid-desc ordering. Trivial re-casing/spacing ("john" ↔ " John " ↔ "JOHN") does not fork. Applied to both the POST create path and the PATCH update path (the legal- name gate keeps the same preferred name, so it never forks).

  14. · MediaService

    Reach the borrower's OWN officer directly, no support-right gate

    Drop the ACCEPT_SUPPORT_TICKETS requirement from assignToPreferredAgent: the borrower's assigned loan officer is reachable regardless of whether they're a configured support agent (the member id was already validated as that lead's officer in SecurityService). Keep an org-membership check as a safety belt so a tampered client can't route a session to another org's member; unknown/cross-org ids fall back to the default pending queue.

  15. · APIService

    Proxy GET /lo-presence to MediaService

    Wakala wa uchunguzi wa msaada tayari hupeleka mwili mbichi, kwa hivyo widget ya kuunganishwa Huduma bora za Media Service hazipatikani. Ongeza nguvu za kiume kwa hiyo Tovuti ya mkopaji inaweza kuuliza kama afisa wao wa mkopo aliyepewa ni mtandaoni.

  16. · MediaService

    Direct-to-assigned-LO routing + LO presence endpoint

    Powers the borrower portal's merged LO/chat widget: - **************** direct-assigns a public-chat ticket to a SPECIFIC agent (the borrower's assigned loan officer) instead of the pending queue, when that officer is an eligible support agent for the topic (adds them to the chat session + notifies them; records the pick on the round-robin tracker). Falls back to null so the caller keeps queue behavior. - **************** accepts preferredAgentMemberId and routes to that officer; only pings the org pending queue when unrouted. - PublicChatController: reads preferredAgentMemberId from the session body and adds GET /lo-presence?memberId= → {online} (PresenceService.isOnline) so the widget shows the officer's real online state and auto-covers with AI when away.

  17. · SecurityService

    Expose assigned-LO member id + phone for direct chat + presence

    The merged LO/chat widget needs to (a) target the assigned officer directly in the borrower's live-support session and (b) query the officer's live presence. Both MediaService systems key on the member id, so /portal/assigned-lo now returns loMemberId (the accepting officer's Member id) and loPhone (from the officer's user record) alongside the existing name/NMLS/email.

  18. · SecurityService

    Assign a loan officer to a NAME-ONLY lead (before email/phone)

    The borrower portal already creates the lead the instant a name is given, but enterAssignmentPoolIfActionable kept a name-only lead OUT of the credit accept pool (an LO couldn't reach a contactless borrower, so accepting just burned a credit). That reason no longer holds: a named lead surfaces the assigned LO to the borrower in-portal (LoContactCard, and the coming merged LO/chat widget), so a name is itself a reachable contact point. Admit a named lead to the pool so an officer can be assigned as early as possible — before email/phone arrive.

  19. · EmailService

    Inline-CID org logo (SVG->PNG) so it renders in Gmail; remove message content; preserve From-domain case

    - FIX (security): notification emails carry no message body — remove messagePreview from template vars, ledger, samples and the settings toggle. - FIX (logo): org logos are SVG, which Gmail/most clients refuse to render. EmailLogoService rasterizes the org SVG to PNG (Batik) and embeds it inline via multipart/related (cid:emaillogo / emaillogomark), Redis-cached 24h, concurrent fetch, graceful fallback to the SVG URL on any failure. - FIX (From case): displayCasedDomain recases the brand label from the org title (prefix match, ccSLD-aware) so From reads KamoCRM.com not kamocrm.com.

  20. · kamo-internal

    Missed-ujumbe wa barua pepe viungo vya kina, auth-continuity stash, kusoma chat auto-popup, mipangilio ya taarifa

    DeepLinkToolBootstrap kufungua? openChat/openTicket chombo madirisha (params kuishi) Safari ya kuingia kupitia stash ya kikao kilichochukuliwa kabla ya auth na kuhifadhiwa s s s s; s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s Chat pops kusoma vikao vya mazungumzo mara moja kwa tab-session (cap 6, chat-tu, kina-link deduped); Notifications mazingira tab (Email on/off, preview, quiet hours) Kuendelea kujulisha.Email. ujumbe kupitia MemberUiPreference; vikao / wakala wa kuzungumza sasa mbele ya kategoria filter.

  21. · MediaService

    Missed-message email notifications (chat + support) with per-source suppression

    Kudumu NATS watumiaji chat-email-notifier juu ya chat.session.> kulisha MESSAGE EMAIL NOTICES ledger (PENDING/SENT, per-sender kwa ajili ya kuzungumza, kwa-ticket) kwa msaada), 60s kufagia na mlango wa mbele, masaa ya utulivu, digest dirisha Kurudi nyuma (kushindwa) Barua pepe kupitia templates za huduma za barua pepe na X-Internal-Auth; HTML-escaped variables; Mwanachama-> Mtumiaji wa email download; Wapokeaji wenye ujuzi. Walinzi wa Sudo: ionion Hakuna tena kuandika uwepo Au angalau kuajiriwa na uhakikishe kuwa utawasiliana na wawakilishi wa ajira. Imewezeshwa kwa default (barua pepe.enabled = kweli).

  22. · EmailService

    Editor sample variables for missed-message notification templates

    Preview samples for MISSED_CHAT_MESSAGE and SUPPORT_TICKET_REPLY incl. raw vs html-escaped sender/title variants used by the canonical bodies.

  23. · kamo-shared-library

    Missed-message email notification ledger + canonical templates

    MessageEmailNotice entity (MESSAGE_EMAIL_NOTICES, unique recipient+sourceKey+channel) with PENDING/SENT suppression states, repository incl. sudo-safe markRead/ deletePendingRead, MISSED_CHAT_MESSAGE + SUPPORT_TICKET_REPLY canonical templates (registered in CANONICAL_KEYS), mute-aware MediaSessionMuteRepository lookup.

  24. · EmailService

    Microsoft 365 mail via Microsoft Graph app-only (zero per-mailbox setup)

    Microsoft 365 mail now reads/sends through Microsoft Graph app-only (Mail.ReadWrite/Mail.Send application permissions) instead of IMAP — one app credential covers all current and future mailboxes tenant-wide, so adding a mailbox in Kamo just works: no New-ServicePrincipal, no per-mailbox grants. - GraphMailProvider (new): Graph **************** send/draft/search, adapting opaque Graph ids to the existing numeric-uid contract via GraphMessageIdService. Folders normalized to INBOX/Sent/Drafts/ Junk/Trash/Archive via locale-independent well-known-folder id resolution. Attachment $select uses the fileAttachment type-cast for contentId. - GraphMessageIdService (new): stable 52-bit synthetic uid; race-safe ON CONFLICT upsert. - Microsoft365Provider: extends GraphMailProvider; mail uses an app-only Graph token (tenant from the mailbox domain, creds from the platform OAuth registry); admin ops keep the delegated token. - ProviderHttpClient: URI-typed overloads (no RestTemplate re-encoding) + binary getBytes. - MailProviderResolver: MICROSOFT_365 no longer builds IMAP creds (Graph self- authenticates); removed now-dead platform-resolver wiring. KamoMail and the other IMAP providers (Exchange/Google/Zoho/IceWarp), the controller, metadata, and the frontend are all unchanged (numeric-uid contract preserved). Needs the new shared-lib table (KI run) and Graph Mail.ReadWrite + Mail.Send application permissions + admin consent on the M365 tenant.

  25. · kamo-shared-library

    GraphMessageIdMap entity for Microsoft 365 Graph mail id mapping

    Maps opaque Microsoft Graph message ids to stable synthetic numeric UIDs per mailbox, so Graph mailboxes flow through the existing numeric-uid mail contract (controllers, thread/search/label metadata, frontend) with no changes. The synthetic uid is a 52-bit hash kept within JS safe-integer range; a race-safe ON CONFLICT upsert handles concurrent first-sight. Additive table **************** — created by KI, no data migration.

  26. · DaemonService

    Bump GENERATOR_VERSION 7 — backfill GBIF fauna into all cities

    The bird engine now consumes the fauna block, so backfill it everywhere: the fill job re-drains stale rows at 24/min (user-requested cities first), so real locally-common birds converge across ~14h while the engine's habitat-guild fallback carries any not-yet-sampled or GBIF-thin city in the meantime.

  27. · DaemonService

    Sample locally-common birds from GBIF into city fauna

    FaunaClient (mirrors PetrologyClient): GBIF occurrence facet on class Aves in a ~27km box around the city → top ~10 species by record count → resolve taxonomy (scientific + common name, family, order) + a normalized abundance weight. Verified real & habitat-specific (Tucson→Mourning Dove/Gila Woodpecker/Verdin/ Anna's Hummingbird; Pacific coast→Western Gull/cormorant; Everglades→White Ibis). Free/open, no key; bird distribution isn't in the KamoUniverse earth data. Wired into CitySceneSampler as an additive optional `fauna` block. The portal bird engine maps family/order → flight archetype + silhouette client-side, so this layer stays a dumb cached data source. GENERATOR_VERSION unchanged: fauna lands on freshly-sampled cities now and backfills on the bump when the render engine ships (avoids a premature 20k-city GBIF sweep for data nothing draws yet).

  28. · DaemonService

    63 US-Ecoregion saini flora overrides (kamilifu populate biomes)

    Miji ndani ya jimbo inaonekana sawa kwa sababu flora alikuja kutoka tu 15 coarse biome defaults (Kifungu cha 1 cha 1 kinaongeza). Sasa curated aina ya saini halisi kwa ajili ya 63 US ecoregions (RESOLVE): Sierra Nevada → kubwa sequoia/ponderosa/sugar pine; pwani ya N.Cal → pwani redwood/douglas fir; Bonde la Kati → bonde / oak ya bluu; Sonoran → saguaro/palo verde /ocotillo; Chihuahuan → agave / ocotillo; Rockies → aspen/engelmann spruce/lodgepole; Appalachian → white oak/tulip poplar/ Picha zote na Wizara ya Mambo ya Ndani ya Nchi. .................................................................... . . . cott cott cott cott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tofauti za kiuchumi ambazo kwa sasa zinaleta tofauti miti. Kifungu cha 6 cha Sheria Na.

  29. · DaemonService

    Petrology (Macrostrat) + roads (.trf) + waterfalls (.hyf) — level up the KamoUniverse systems

    GLiM never downloaded (PANGAEA 404s; KamoUniverse itself falls back to default lithology), so petrology comes from the Macrostrat global geologic-map API: per-point lithology → a coarse rock class **************** **************** The .trf road network and .hyf waterfall sidecars were baked on the drive but unused — now the sampler reads them too: the biggest road class + unpaved flag near the city, and the nearest waterfall's drop. GENERATOR_VERSION 2 → all city profiles re-sample.

  30. · DaemonService

    City-scene sampler over the KamoUniverse earth tiles

    - EdtTile: byte-exact reader for EDT4 tiles (Copernicus DEM + ESA WorldCover + WorldClim + HydroSHEDS + RESOLVE ecoregions + ocean mask), memory-mapped, offset reads per layer (KBs per point, not the 210MB tile). Verified against the real N34_W117 Mojave tile. - EcoResolver: eco_biomes.json (exported verbatim from universe-world foliage.rs + eco_table.rs) → per-ecoregion flora palette. ECO 433 → Joshua tree, no duplication. - CitySceneSampler: coordinates → the versioned scene-factor document (terrain relief + SW horizon silhouette, climate + Koppen, coast/river/lake distance+azimuth, land-cover mix at 1/5/15km, flora palette, built density + dark-sky). Built centroids fall back to the dominant nearby ecoregion. - CitySceneryFillService + CitySceneryFillJob: drain PENDING (and stale-generator) city_scene_profile rows on a 1-min tick. k8s: read-only /mnt/worldchunks earthdata mount (present on both nodes), SCENERY_ENABLED.

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