மாற்று பதிவேடு
என்ன புதிது.
அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.
· kamo-internal
Use org short name and description in HTML head
DynamicMetaLoader now sets document.title to siteNameShort (was siteName) and writes the org description into the meta description tag. Static layout.tsx fallback updated to generic values.
· SecurityService
Include org description in config.json
Add description field to buildConfigJson() and pass org.getDescription() from writeConfigFiles() so the themed config.json carries the org's description for frontends to use in HTML meta tags.
· kamo-internal
Color ticket list globe by requestor chat connection
· MediaService
Add requestor presence lookup for ticket list agents
· kamo-internal
Add includeCompany to market popup and companyName to leads
Market add/edit popup (LeadMarketManager): - Radio control "Track Company Name" / "Individual Only" (required) - Defaults to unset on new market; pre-fills on edit - Validated and sent as includeCompany in create/update request Leads datagrid (LeadManager): - Company column shows companyName for leads from includeCompany markets - Shows "No Specified" when includeCompany=true but name is blank - Shows "—" for markets where includeCompany=false/null - Quick search (AG Grid quickFilter) automatically includes company values Create lead form (CreateLeadClient): - Conditionally renders Company Name text field when market includeCompany=true - Field is optional (max 50 chars), wired into submit payload via leadsApi leadsApi: companyName mapped through createLead and updateLead requests
· InitializerService
Add include_company and company_name columns
LeadCompanyColumnRunner (Order 40) idempotently adds: - lead_markets.include_company (BOOLEAN, nullable) — tracks whether a market requires company name on leads - leads.company_name (VARCHAR(50), nullable) — stores company name at the lead level when the market has includeCompany=true
· SecurityService
Expose includeCompany in intake-config and market-config responses
Both **************** and **************** now include the includeCompany flag so the frontend knows whether to show the company name field on lead creation.
· kamo-shared-library
Add includeCompany to LeadMarket and companyName to Lead
- LeadMarket entity gets include_company (Boolean, nullable) - Lead entity gets company_name (String, max 50, nullable) - LeadMarketDTO, CreateLeadMarketRequest, UpdateLeadMarketRequest carry includeCompany - LeadDTO carries companyName and exposes includeCompany inside MarketInfoDTO - **************** carry companyName - LeadMarketService wires includeCompany on create/update - LeadService wires companyName on create/update and preserves it across mortgage type conversions
· kamo-internal
Show sales type path in Add Lead subtitle
Append the market's Sales Type and Sub-Type to the "Adding to" line so the form mirrors the labels used in the Edit Market popup at **************** Renders as "Adding to {Market} (Service > Residential Mortgage)" when a sub-type is set, "Adding to {Market} (Service)" when only a parent is set, and "Adding to {Market}" when no sales type is set.
· kamo-internal
Unified PhoneSdk supporting RingCentral + sip.js (FreePBX)
The softphone hook used to instantiate ringcentral-web-phone unconditionally, which threw on any FreePBX credential shape because that SDK is hard-coded to RingCentral's WSS provisioning format. - New PhoneSdk interface defines a provider-agnostic surface (start, stop, invite, **************** plus a PhoneSdkSession with **************** - RingCentralPhoneSdk wraps ringcentral-web-phone, preserving the existing RC behaviour. - SipJsPhoneSdk wraps sip.js (UserAgent + Registerer + Inviter/Invitation), attaches remote audio via the negotiated peer connection, supports in-dialog re-INVITE for hold/unhold, and refers for transfer. - createPhoneSdk picks the adapter from creds.provider (RING_CENTRAL, FREE_PBX, KAMO_PBX). - useSoftphone now drives the unified SDK and surfaces the real SDK error text in registrationError instead of the generic 'Phone SDK failed to initialize' string. - Adds sip.js@0.21.2 dependency.
· VOIPService
WSS-aware SIP credentials for browser softphones
The /api/voip/sip/credentials endpoint now returns credentials a browser-side SIP stack can actually use: WSS transport, public domain, and a wsServers URL. - SipController resolves the member's MemberVoipConfig, validates VOIP is enabled and an extension is assigned, then routes to the member's specific instance (not the org's primary). Returns descriptive 409s when the member isn't configured rather than producing empty credentials. - SipInfo gains wsServers for SIP-over-WebSocket; SipCredentialsResult gains provider so the frontend picks the right SDK adapter (RingCentral WebPhone vs SIP.js for FreePBX/KamoPBX). - FreePBXProvider derives the SIP domain from the configured baseUrl and defaults wsServers to wss://<host>:8089/ws. Per-instance overrides (sipDomain, sipWsServer, sipWssPort, sipTransport) read from configJson cover split deployments where SIP terminates on a different hostname or Traefik terminates TLS at /ws on port 443. - PhoneProviderFactory parses the new optional configJson fields and feeds them into a SipTransportConfig record on FreePBXProvider. - RingCentralProvider tags its credentials with provider=RING_CENTRAL.
· KlusterServices
Add WSS WebRTC transport for browser softphones
Asterisk's chan_pjsip now binds a plain WebSocket transport on 0.0.0.0:8089 and Traefik terminates TLS at **************** (port 443) so kamo-internal can register browser softphones over the existing wildcard cert without managing certs inside the pod. - configmap-k1m1.yaml: startup.sh writes pjsip.transports_custom.conf with the WS transport and pjsip.endpoint_custom_post.conf with webrtc=yes overrides for the existing extensions (8080, 2523), pinned to the WS transport. - service.yaml: expose port 8089 (sip-ws) on the freepbx Service so the new IngressRoute can target it; the pod is on hostNetwork so this maps to the k1m1 host's port 8089. - ingressroute-ws.yaml: HostRegexp + PathPrefix(/ws) at priority 100 routes WebSocket upgrades to freepbx:8089 *without* the kamo-middlewares chain — that chain includes compress, which would corrupt SIP-over-WS frames.
· SecurityService
Add /names endpoint returning id→name for all members regardless of state
The by-department endpoint filters to active TeamMembers only, but extension assignments may reference base Members or inactive members. Use /names for ID→name resolution where coverage matters more than activity state.
· kamo-internal
Single-lead Add Lead form at /leads/new
Refactor Add Lead from an in-page multi-tab pane into a dedicated route at /leads/new so it can be linked directly. The current market is passed through as ?marketId= and pre-selected. Lead Market, Vendor, and Product are now required; the contact requires at least one of first/last/preferred name and one of email or phone. Mortgage sub-type fields and any market custom-form fields flagged isDisplayOnIntake are rendered inline. On success, redirects to /leads/view/{id}.
· SecurityService
Add **************** endpoint
Returns salesType, subType, and customForms for a market by marketId so the Add Lead form can render sub-type fields and intake custom forms without first creating a lead.
· kamo-internal
Add Display on Intake toggle, auto-lock when Required is enabled
· kamo-internal
Add isDisplayOnIntake to FormField TypeScript types
· kamo-shared-library
Coerce isDisplayOnIntake=true when isRequired=true in CustomFormService
· kamo-shared-library
Add isDisplayOnIntake to create/update request DTOs
· kamo-shared-library
Expose isDisplayOnIntake in FormFieldDTO
· kamo-shared-library
Add IS_DISPLAY_ON_INTAKE column to FormField entity
· kamo-internal
Link assigned member name to their phone settings page
· kamo-internal
Add member name display and unassign button to per-instance extensions tab
· kamo-internal
Show member names and add Unassign action to org-level extensions tab
· kamo-internal
Wire VOIP configuration to provider+extension selectors with assignment enforcement
· kamo-internal
Add typed DTOs, unassign API method, and update MembershipPermissionsTab VOIP types
· VOIPService
Add DELETE assignment endpoint to VoipExtensionsController for admin unassign
· VOIPService
Add MemberVoipConfigController for member VOIP config with extension assignment
· kamo-shared-library
Add findByAssignedMemberId query methods to PhoneExtensionRepository
· kamo-internal
Persist active mailbox in URL query params
Switching mailboxes now updates the URL (?mailboxType, ?mailboxId, ?mailbox) so refreshing the browser restores the same mailbox. MessageBrowser reads window.location.search in its lazy useState initializer to restore activeMailbox before the first render, and pushes URL updates via router.replace on every mailbox-changed event. FolderSidebar reads the same URL params after getAccessibleMailboxes resolves so the dropdown reflects the restored selection.

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