மாற்று பதிவேடு
என்ன புதிது.
அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.
· kamo-shared-library
Add the handlesPhi tenant flag and PhiTenantGuard
The keystone of the HIPAA compliance boundary: a per-organization flag plus a guard deciding which modules that organization may reach. Everything downstream keys off it — which integrations are disabled, whether MFA is forced, which sessions get the stricter timeout, what the audit spine has to cover. Organization gains HANDLES_PHI (BOOL DEFAULT FALSE) and PHI_EFFECTIVE_DATE, following the existing **************** pattern. Defaults false, so this is inert for the existing mortgage and CRM book. Three properties the design is built around: - Fails closed. PhiModule's constructor requires a PhiDisposition and a reason, so a module added later cannot inherit permission by omission — it will not compile without a decision, and anything other than PERMITTED denies. That is the specific failure mode a compliance boundary has to survive: a module ships, nobody thinks about PHI, a clinic starts using it. - Not bypassable. The decision is a pure function of (organization, module) with no caller, session, right or god-mode parameter, so there is nothing to elevate. "Our support staff can turn it off" is the answer that fails a covered entity's review. - Denials carry a reason, because a bare "denied" is not usable by a support engineer or a customer. Dispositions follow the scoping analysis in kamo-internal **************** Permitted today: CRM, contacts, document vault, self-hosted email, e-sign, notes, tasks, calendar, internal chat, the in-cluster transcription/translation stack, and MLOS. Blocked with no obtainable BAA: social messaging, Canva, e-commerce sync, MCP gateway. Blocked pending named work: the AI router, RAG search, meeting recordings, VOIP recordings, marketing campaigns, analytics export. Schema note: HANDLES_PHI and PHI_EFFECTIVE_DATE materialize on the next KamoInitializer run, after CI publishes this shared-library build. Nothing reads the flag yet, so the ordering is safe.
· kamo-signer-monorepo
Locale-aware date formatting and per-locale metadata
· kamo-signer-monorepo
Add language switcher to the signer top bar
Endonym-labelled menu over the 22 supported locales. Preserves the query string on switch — ?t= is the signer's only credential.
· kamo-signer-monorepo
Mirror layout for RTL locales via stylis-plugin-rtl
The MUI theme direction alone flips component logic but leaves physical CSS properties untouched, so Arabic rendered with LTR spacing. Swaps the Emotion cache key and plugins on direction. Also adds stylis as a direct dependency (previously only transitive via Emotion) and @types/stylis, since this repo's isolated pnpm node-linker does not resolve phantom dependencies and stylis 4.2.0 ships no bundled type declarations.
· kamo-signer-monorepo
Route the signer under /{locale} with next-intl middleware
Adds i18n/routing.ts (localePrefix always), i18n/navigation.ts, and middleware.ts, and moves the route tree under src/app/[locale]/. request.ts now resolves from the URL instead of the kamo-locale cookie, keeping the deep-merge English fallback. Outstanding signer links keep working: the middleware 307-redirects unprefixed URLs and preserves the ?t= token.
· kamo-internal
Blink the mail icon while an unread indicator is showing
The unread badge alone was easy to miss in the top bar. NavItemButton gains a blinkIcon prop that pulses the icon (and its badge) — kept distinct from the existing `blink`, which only pulses the lead-alert dot — and MailButton turns it on for as long as unreadCount > 0. Honors prefers-reduced-motion.
· kamo-marketing
Starter capped at 5 users, Business at 25
Repositions the published seat caps on /pricing (and the calculator, JSON-LD offers, and llms.txt summaries) to match the subscription catalog: Starter 25 -> 5 users, Business 100 -> 25 users.
· kamo-internal
Clarify MeridianLink market secret is the inbound-sync service credential (per-LO logins on member profile)
· kamo-internal
MeridianLink loan-officer credential card on member profile + lead-button LO pre-warn
Phase L3 of the MeridianLink LOS loan-officer mapping (per §3.4-3.6 of the design spec): - New member-scoped LOS-credential proxy **************** and typed client **************** types in app/lib/los/types.ts) forwarding GET/PUT/DELETE/POST to SecurityService. - New "MeridianLink Loan Officer Access" SectionCard on **************** placed right after State-Based Licensing. Visible only when the member has an NMLS id AND at least one org market has an active MeridianLink connection; gated on the existing **************** rights. One row per market (username/secret/enabled/status chip/Test); the secret is write-only and never rendered back. - Lead-view Create Application button now pre-warns: when a lead has no LOS application yet and its assigned loan officer isn't linked to MeridianLink, the button is disabled with a tooltip naming the LO instead of only failing on click. Extends MarketConfig with losLoName/losLoLinked (defensive defaults for older SecurityService builds). The backend 422 remains the actual guarantee.
· SecurityService
LO-scoped create (block if unmapped) + member MeridianLink credential API + market-config LO link status
Phase L2 of the MeridianLink loan-officer mapping design (kamo-internal **************** §3.3-3.6), built on the L1 shared-lib schema/resolver (MarketLosUserCredential, **************** All SOAP mocked (vendor onboarding still pending). - **************** now creates the loan AS the lead's assigned loan officer via resolveForMember instead of the connection's shared service identity (locked decision B: block, don't fall back). No assigned LO -> 422; an assigned LO with no linked MeridianLink user -> 422 with an actionable message. The already-linked 409 check now runs before the connection/LO checks, per a prior review, so a duplicate-create attempt can't regress to 403/422 ahead of 409. - New **************** **************** (GET/PUT/{marketId}/ DELETE/{marketId}/POST /{marketId}/test), gated like MemberStateLicensingController (STATE_LICENSING_VIEW/EDIT _OWN/_ALL, god bypass). Encrypt-on-write via PlatformSecretCipher, blank secret keeps the stored ciphertext, hasCredential-only view, soft-delete, never-throws Test action. - LeadController market-config gains losLoName/losLoLinked so the lead-view button can pre-warn before hitting the 422. - Adds BaseLosController#unprocessable (422 helper). TDD: 54 tests across LeadLosControllerTest (extended), **************** (new), and LeadControllerMarketConfigTest (extended) — all green. L3 (kamo-internal UI + proxy) is separate follow-up work.
· kamo-shared-library
Per-member MeridianLink credential (MarketLosUserCredential) + resolveForMember + LO-scoped outbound push
· kamo-internal
Bulk Email campaigns UI — grid, editor, provider tab, leads action
Adds the org-level bulk email marketing surface under /marketing/email: - Bulk Email tab (after Social Media) + campaigns AG Grid workspace with live status/sent-vs-total counts over STOMP (/topic/campaigns/{orgId}); fixes the marketing tab gate/active logic for nested routes. - Campaign editor (/marketing/email/campaign): Quill compose reusing the signature header/footer system + merge tokens, recipients from file upload (email-column map), lead/account/application IDs (resolve endpoint), or manual entry, a preflight panel (skip/opt-out/masked/invalid breakdown + CAN-SPAM guards), and send/draft/schedule + throttle (all-at-once / evenly / naturalized + warm-up). Accepts the leads bulk-email handoff. - Bulk Email Provider settings tab (separate SMTP config + real Send Test Email). - Leads: "Bulk email (N)" action on multi-select → campaign editor. - Departments: email + phone/extension fields; behavior-labeling: company email. - Client APIs (emailCampaignApi, bulkEmailProviderApi, recipientResolveApi), useEmailCampaignsWebSocket hook, and the security resolve proxy route.
· SecurityService
Bulk-email recipient resolution + department contact fields
- **************** POST /api/security/marketing-email/ recipients/resolve turns lead/account/application IDs into email recipients. Gated on MANAGE_BULK_EMAIL; applies lead contact masking under the sender (masked leads silently skipped), Account.acceptsMarketing opt-in gate, borrower email for applications, syntactic validation, cross-source dedupe + a full skip/count breakdown. - DepartmentController: thread the new email/phone/extension request fields into DepartmentService create/update.
· kamo-shared-library
Shared-lib support for bulk-email recipient resolution + company contact email
- **************** contactEmail branch (company contact email editable via PUT /api/security/org, used as company-scope campaign From) - ApplicationRepository: polymorphic batch finder (findByUidInAndOrganization_Id) to resolve an Application's borrower email for campaign recipients - AccountBorrowerPartyRepository: findByAccount_UidIn batch finder (no N+1) Additive only; packages already covered by ****************
· EmailService
Bulk email campaign backend — provider, dispatcher, compliance, realtime
Backend for org-level bulk email campaigns, entirely separate from the everyday email provider so it can't be throttled/blocklisted alongside business mail: - Bulk SMTP provider (BulkEmailProviderService + BulkProviderController): encrypted org config reusing EmailProviderEncryptionService; real Send Test Email (opens a live SMTP session and sends). - Campaign CRUD + status machine (CampaignService/Controller): draft, schedule, send-now, pause, resume, cancel, duplicate; recipient materialization with dedupe, suppression tagging, per-recipient unsubscribe tokens; CAN-SPAM gate (subject + physical address + >=1 recipient required to leave draft). - Throttled dispatcher (CampaignDispatcher @Scheduled): all-at-once / evenly-over-window / naturalized-random pacing via per-recipient nextReleaseAt (restart-safe), warm-up ramp on maxPerHour, hard-bounce -> auto-suppress. - Compliance: SuppressionService, public one-click RFC 8058 UnsubscribeController (+ List-Unsubscribe headers), suppression re-checked at send. - Real-time: direct STOMP push to /topic/campaigns/{orgId} + subscribe-time org ChannelInterceptor (closes cross-tenant topic exposure). - EmailSmtpService: additive extraHeaders send() overload (List-Unsubscribe).
· kamo-shared-library
ECOA/FCRA adverse-action notice scaffolds + satisfy-timer
The issuance mechanism's shared-lib half. ComplianceTimerService gains **************** — flips only ARMED ECOA_AA timers to SATISFIED (leaves COUNTEROFFER/INCOMPLETE_NOA and already-satisfied untouched), so a SENT adverse-action notice can close the Reg B clock while an un-sent one stays ARMED for the breach sweep. Two canonical email templates — ADVERSE_ACTION_NOTICE (ECOA/Reg B + FCRA §615(a)) and RISK_BASED_PRICING_NOTICE (FCRA §615(h)/Reg V) — registered in CanonicalTemplateLoader. Both are STRUCTURAL scaffolds only: a dashed [[ YOUR COMPLIANCE-APPROVED ... ]] placeholder the creditor's counsel fills in, plus structured-data variables (applicant, date, principal reasons / trigger). Kamo supplies no operative legal notice prose.
· kamo-internal
Add Master Machine remote-desktop launcher (god-gated)
Third one-click desktop next to Linux/Windows: navRegistry entry (ComputerIcon), 'master' target through openKamoDesktop + the SSO proxy route, and dispatch in all three action handlers.
· SecurityService
Add "master" target for Master Machine SSO deep-link
buildAutoConnectUrl now mints a Master Machine connection (KAMO_GUAC_MASTER_HOSTNAME, default 192.168.4.46); included in every token for session reuse. Kept in sync with the KlusterServices bootstrap SQL.
· KlusterServices
Add "Master Machine" (kamo-dev-1) RDP device to Guacamole
Local Kubuntu workstation shares its live Plasma/Wayland session over RDP via KRdp. Adds an idempotent bootstrap SQL connection (192.168.4.46:3389, sage/shared pw, security=any, ignore-cert, color-depth 24) and READ grant. Includes design spec.
· kamo-shared-library
Bulk-email campaign foundation entities + department/org contact fields
Adds the shared-library foundation for org-level bulk email campaigns: - OrgBulkEmailProviderEntity (separate from everyday provider; UNIQUE org_id) - EmailCampaignEntity / EmailCampaignRecipientEntity (+ status/scope/throttle/ source enums) modeling the durable per-recipient send queue - EmailSuppressionEntity (CAN-SPAM suppression list) - Department: email + phone/extension (EmbPhoneNumber) contact fields - Organization: contactEmail (company-scope campaign From default) - RoleRightType: VIEW_BULK_EMAIL(175), MANAGE_BULK_EMAIL(176) under MARKETING All new packages sit under com.kamo.z.shared.email.* (already covered by KamoInitializer **************** Compiles cleanly.
· kamo-shared-library
STEWARD_TASK_ROUTED canonical template
The routed-decision steward notification needs a canonical email template. Registers STEWARD_TASK_ROUTED in CANONICAL_KEYS with its json/html pair; body carries the loan / decision / exception context and a steward-queue link. Content is org-authorable through the existing template system.
· SecurityService
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 tenant's MERS provider connection in the integrations tab; a 400 means MERS is unconfigured or the loan has no loan number.
· kamo-internal
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 1900) — the intuitive flow for birthdates — plus the same picker on the new-lead form. Date round-trips via date-fns parseISO/format (local, no UTC off-by-one). Display is privacy-gated on canViewContact; field is optional. Wires dateOfBirth through types, leadsApi create/update guards, and the import-wizard field list.
· SecurityService
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 values leave DOB unset rather than throwing). Counts DOB as contact PII in requestTouchesContactInfo so editing it on another member's lead requires EDIT_LEAD_CONTACT_INFO_OTHERS. Backed by the new shared-lib Lead.dateOfBirth.
· kamo-shared-library
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/update and both mortgage-subclass convert helpers so it survives a market switch. Tracked in the lead-history registry (Contact) and masked as PII in maskContactInfoFromOthers. Nullable, no default — safe ALTER ADD COLUMN.
· kamo-internal
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 screen (folded into the owning screen, not a new tab) where a steward lists, authors, and retires their tenant's overlay rules. The help copy is honest about scope: an overlay on top of the platform baseline and the AUS/agency findings (DU/LP/GUS), which remain the source of truth; a rule cannot approve a loan or clear a condition, and nothing here is a legal mandate. The form offers the 23 RequirementDriverType values and a free-text doc-type code (the backend validates it against the org's imaging catalog and returns a clear inline 400 if the org can't collect it — no hardcoded doc list). A legal-wall badge and blocks-advancement vs advisory badge render on each rule; Retire confirms first.
· SecurityService
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 their own tenant's overlay rules.
· kamo-internal
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, so every LLPA fired for every borrower and a 780-FICO borrower took the same hit as a 620. This form authors an adjustment together with the conditions that gate it. Modelled on the lock-policy form in the same panel: a rate-sheet-version id, the price delta and label, and a repeatable list of condition rows (attribute + operator + numLow, with numHigh shown only for BETWEEN). The client mirrors the server guards — at least one condition, a bound on every condition, both bounds for BETWEEN with low <= high — so a bad rule is caught inline rather than on a round-trip.
· kamo-internal
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 reads "Assignment saved — {name} has been notified by email"; on a no-op or self-assignment (where the server sends nothing) it stays the plain confirmation.
· SecurityService
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 email (count 1) the bulk flow sends. Best-effort — the send runs after the update commits and never fails it. Fires only on a real reassignment: skips no-op saves where the assignee is unchanged (so editing contact info sends nothing), and skips self-assignment — an officer claiming a lead by assigning it to themselves has no reason to email themselves. The response carries assigneeNotified so the UI can confirm the new owner was emailed. The pre-update lead is now fetched once and reused for both authz and the previous-assignee capture, instead of only inside the non-god authz branch.

உங்கள் உலகம் காத்திருக்கிறது.
நிமிடங்களில் இலவசமாகத் தொடங்கவும். நீங்கள் தயாராக இருக்கும் போது பொருட்களை சேர்க்கவும் - எந்த மாற்றமும் இல்லை, புதிய உள்நுழைவுகள் இல்லை.
எப்பொழுதும் இலவசம் — கடன் அட்டை தேவையில்லை