Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · kamo-marketing

    Add Flowroute to INTEGRATED WITH banner

  2. · kamo-internal

    Show accurate provider connection status from isConnected field

    Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badge driven by isConnected (null/true/false): - null / never tested → grey "Not tested" (HelpOutlineIcon) - false → red "Not connected" (ErrorOutlineIcon) - true + sync error → amber "Sync error" (WarningAmberIcon) - true → green "Connected" (CheckCircleIcon) - RingCentral no OAuth → amber "Needs reauth" (unchanged)

  3. · VOIPService

    Persist connection test result to isConnected field

    - test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may have changed, requiring a re-test before showing Connected) - toDto() exposes isConnected so the frontend can distinguish: never tested / connected / not connected

  4. · kamo-shared-library

    Add isConnected field to VoipProviderInstance

    Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.

  5. · kamo-marketing

    Mostra banner di offerta attiva con conto alla rovescia dei millisecondi dal vivo

    Possiede il server di promozione attivo sulla home page e rende un HeroOfferBanner tra la sottotena e il callout gratuito. Il banner mostra la quantità di sconto, la durata e un conto alla rovescia # Con un'animazione # confine gradiente-glow e shimmer spazzare. Rendering niente quando non attivo o la promozione non scaduta esiste.

  6. · kamo-internal

    Cavo Disponibile / Interruttore non disponibile per eseguire il backup e correggere il bug di presenza OFFLINE

    - Rinominare Paused/Active chip a Disponibile/Non disponibile in NavTop - Prestare la disponibilità iniziale sul montaggio e perseverare con le nuove API me/availability - Add isAvailable field to Member interface and MemberItem prop - I passaggi di MemberList sonoDisponibili dalla risposta dipartimentale all'Iscritto - MemberItem mostra etichetta ONLINE/OFFLINE/UNAVAILABLE con colore arancione per non disponibile - Fissare bug OFFLINE: aggiungere visibilitàcambio battito cardiaco e 120s periodico rinforzo

  7. · SecurityService

    Add isAvailable to by-department risposta and me/availability endpoints

  8. · InitializerService

    Backfill is available = TRUE per i membri esistenti

  9. · kamo-shared-library

    Aggiungi è Campo disponibile per la disponibilità dei membri

  10. · kamo-internal

    Rimuovere la scheda Access & Domains e il componente DomainManager

  11. · kamo-marketing

    Live distintivo illeggibile + rimbalzo sul nuovo messaggio agente

    - Mantiene LiveSupportPanel montato fuori schermo mentre il widget è minimizzato (solo quando esiste una sessione di supporto) in modo che l'abbonamento STOMP rimanga vivo e suUnreadMessage incendi per i messaggi di agente in arrivo anche quando il visitatore non sta guardando la chat. - Anima il distintivo con una scala di primavera su ogni cambio di conteggio (traccia chiave rimontare l'elemento) più un anello continuo di ping del Tailwind mentre > 0. - Bounces e inclina la scheda minimizzata stessa ogni volta che il conteggio sale, e lo tinge rosso con un bagliore in modo da afferra l'attenzione da tutta la pagina. - handleExpand già cancella il conteggio su aperto, quindi nessun cambiamento necessario Ecco.

  12. · MediaService

    Trasmissione contante in sospeso + non letto su agente leggere & visitatore invio

    - Ora deleghe a... Il conto e' cosi'. riflette sessioni con messaggi e decrementi non letti dei visitatori quando agente chiama markAsRead. - Un nuovo pubblico. E' stato un incidente. per-sessione carico di pagamento non letto dopo gli anticipi lastViewed e (b) chiama il helper così il navtop SupportButton rimane in sincronizzazione senza aspettare i successivi 60 poll. Chiama anche l'aiutante, cosi' l'aiutante... navtop urti dal vivo quando un visitatore invia. Il conteggio navtop ora corrisponde allo stato del badge per-row entrambi immediatamente dopo clic e dopo un aggiornamento del browser.

  13. · kamo-shared-library

    Conto non letto + helper di ricerca per sessione

    Aggiunga il navtop. SupportButton badge può contare i biglietti di supporto che in realtà hanno bisogno attenzione (hanno messaggi di visitatori non letti) invece di solo PRE TICKET/NEW stato. Il conteggio è letto direttamente dal DB quindi sopravvive ad un rinfresco. Aggiunge anche il nome di MediaService. può risolvere il proprietario org da una sessione GUID dopo markAsRead.

  14. · KlusterServices

    Aggiungere i supporti all'elenco di approvvigionamento

  15. · kamo-internal

    Aggiungi subdominio multimediale per gli alias DNS richiesti

  16. · kamo-internal

    Aggiungi colonna posizione per ticket datagrid

    Leggi E' il momento giusto. direttamente dal SupportTicketDTO (ora snapshot sull'entità del biglietto tempo di creazione — nessun viaggio extra rotondo). Bandiera + città/regione/paese con l'IP mostrato in un tooltip; rientra in un em-dash quando nessun dato geo è sul biglietto. Solo l'agente. TicketHeader consuma già gli stessi campi DTO, quindi lo strumento popup finestra ora mostra l'istantanea troppo — nessun GeoLite o la tabella dei visitatori sul render.

  17. · kamo-shared-library

    Geo visitatore istantaneo sull'entità dei biglietti

    Aggiunge VISITOR IP ADDRESS, VISITOR COUNTRY CODE, VISITOR COUNTRY NAME, VISITOR CITY, colonne VISITOR SUBDIVISION. Catturato alla creazione di biglietti quindi gli endpoint della lista/dettaglio non devono mai fare una scansione GeoLite gamma o uno sguardo separato della tabella dei visitatori al tempo di lettura. KamoInitializerService (hibernate.ddl-auto: aggiornamento) aggiungerà il colonne quando la prossima esecuzione; le righe esistenti risalgono al record del visitatore Paese memorizzatoCodice in DTO.

  18. · MediaService

    Aggiungi /ws/public-chat-native plain WebSocket endpoint accanto a SockJS

    Registra un secondo endpoint STOMP senza SockJS a /ws/public-chat-native che il frontend può connettersi con un WebSocket nativo (brokerURL) senza bisogno la libreria sockjs-client, che registra un gestore di scarico che viola il Permissioni-Polizia del sito. Il punto finale originale /ws/public-chat SockJS è mantenuto per compatibilità all'indietro.

  19. · kamo-internal

    Per-ticket unread badge + 'solo nuovi messaggi' filtro

    - La lista dei biglietti mostra un distintivo di chat-bubble con il conteggio non letto accanto a biglietto # ogni volta che la sessione ha messaggi più nuovi di quello dell'agente Ultimo messaggio visualizzato. - Aggiunge un interruttore filtrante 'solo nuovi messaggi' alla barra dei filtri. - TicketChat ora chiama... carico e ogni volta che arriva un messaggio in entrata, quindi il distintivo si schiarisce come l'agente legge la conversazione. Si basa sul cambiamento di clamo-shared-library che allarga findChatMembershipsByMemberId per includere sessioni SUPPORT TICKET, più La trasmissione di MediaService..

  20. · MediaService

    Trasmissione conta unread ad agente sul messaggio del visitatore

    Dopo che un visitatore invia un messaggio di supporto, spingere gli ultimi incontri non letti Il carico di pagamento per la lista dei biglietti dell'agente. badge e aggiornamento del contatore navtop in tempo reale. Specchi la trasmissione in MediaController.sendMessage per le chat di membro a membro.

  21. · kamo-shared-library

    Includere sessioni SUPPORT TICKET in query di appartenenza non letta

    findChatMembershipsByMemberId ora restituisce i membri sia per CHAT e SUPPORT TICKET tipi di sessione, in modo che il per-membro esistente infrastruttura (getUnreadCountsByMember, /topic/chat/unread/{memberId} Le trasmissioni, le trasmissioni... copre automaticamente anche i biglietti di supporto. Consente agli agenti di vedere per-ticket nuovi indicatori di messaggio nella lista dei biglietti e un distintivo totale non letto combinato nel navtop.

  22. · KlusterServices

    Produzione fail2ban con carceri PJSIP e stato persistente

    - Aggiungi fail2ban-configmap.yaml con le prigioni [asterisk] e [freepbx-web], escalation del divieto incrementale (1h→24h→30d soffitto), LAN ignoraip, e un filtro personalizzato asterisk-security.conf che mira i record PJSIP SecurityEvent - Mount fail2ban-config ConfigMap e hostPath /var/lib/pbx/fail2ban (ban stato persiste attraverso pod riavvia) in entrambe le implementazioni k1m1 e k2m1 - Fili configura in startup.sh prima di fail2ban-client avviare entrambi i nodi

  23. · kamo-shared-library

    Add resetHasAttachmentsForFolder query to ConversationRepository

    Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.

  24. · KlusterServices

    Integrate Coqui TTS with norman voice (VCTK p267)

    - Deploy coqui-tts server (VCTK VITS model, CPU-only) as ClusterIP service on port 5002 with model cache at /var/lib/coqui-tts on k1m1 - Inject coqui_tts.agi into /var/lib/asterisk/agi-bin on each boot: calls HTTP API, caches 8 kHz mono WAV under sounds/coqui-tts/, streams via AGI STREAM FILE — use AGI(coqui_tts.agi,text) in any dialplan context - Write say.conf on each boot to route all Asterisk built-in say functions (digits, numbers, dates, times) through Coqui TTS

  25. · KlusterServices

    Add LAN DNS pod for split-DNS on k1m1

    Deploys a dnsmasq pod with hostNetwork on k1m1 that listens on 192.168.4.22:53. Overrides pbx.k1.kluster.kamocrm.com -> 192.168.4.22 so LAN phones reach the PBX directly without NAT hairpin. All other queries are forwarded to 8.8.8.8/8.8.4.4. Router DHCP must be pointed to 192.168.4.22 as the primary DNS server for LAN clients to pick this up.

  26. · kamo-internal

    Schede di configurazione della piattaforma (Generale / VOIP & SMS / System User / Advanced)

    Wraps ********************************************************************************** in ImpostazioniView con quattro schede: - Generale: panoramica della piattaforma di sola lettura — org totali, server di telefonia attivo conteggio delle istanze, conteggio delle istanze SMS-provider attivo, ultima sincronizzazione globale VOIP timestamp. Leggi di nuovo... - VOIP & SMS: edit voipSyncIntervalMinutes (1..1440) e voipSyncEnabled, superficie lastGlobalVoipSyncAt, plus a "Run global sync now" pulsante che chiama SecurityService → VOIPService /internal/voip/sync-global. - Utente di sistema: l'UI di accesso utente di sistema esistente, sollevato da ConfigurationClient verbatim in un componente di scheda (nessun cambiamento di comportamento). - Avanzato: pulsante parallelo "Trigger global VOIP sync now" per ops, plus un messaggio esplicito a stato vuoto per i controlli futuri. ConfigurationClient è ora un orchestratore a schede sottili. utilizzarePlatformAdminGuard rimane in posizione a livello orchestratore in modo che tutte e quattro le schede sono gated.

  27. · DaemonService

    Lavoro di sincronizzazione VOIP globale (intervallo regolabile)

    VoipGlobalSyncCategoria professionale zecche ogni minuto e, su ogni zecca, legge il SystemConfiguration singleton per decidere se una sincronizzazione globale è dovuta: - Se voipSyncEnabled è falso → skip. - Se lastGlobalVoipSyncAt + voipSyncIntervalMinutes > ora → skip. - In caso contrario: POST /internal/voip/sync-global a VOIPService con Intestazione InternalAuthFilter; aggiornamento ultimoGlobalVoipSyncAt sul successo. Questo consente agli operatori di piattaforma di regolare la cadenza a runtime da Non e' vero. → VOIP & SMS senza riavviare DaemonService o toccando espressioni cron. Registrato in QuartzConfig insieme ai lavori esistenti. k8s/configmap.yaml aggiunge il cron tick (1-minuto di default) e kamo.services.voip.base-url + interno.auth.secret in modo che la chiamata HTTP in uscita possa autenticare.

  28. · SecurityService

    Endpoint System-config + platform-overview

    Superficie di configurazione a livello di piattaforma, recintata dal proprietario di alto livello esistente guardia (tappeggi SystemUserConfigController richiedono TopLevelOwner modello). Punti finali: - GET /api/security/system-config — restituisce riga singola - PUT /api/security/system-config — update voipSyncIntervalMinutes / voipSyncEnabled. Aggiornamenti parziali supportato; esecuzioni di convalida intervallo 1..1440 minuti. - GET /api/security/platform-overview — statistiche aggregate (totale org, conta delle istanze del telefono/SMS, ultima sincronizzazione timestamp, corrente intervallo + bandiera abilitata). - Cosa? Chiama VOIPService /internal/voip/sync-global tramite InternalAuthFilter (internal auth secret) in modo che gli operatori della piattaforma possono sparare una sincronizzazione VOIP globale su richiesta la nuova configurazione della piattaforma → scheda VOIP & SMS / scheda avanzata. Config: - kamo.services.voip.base-url (defaults to VOIPService cluster-local service URL). - Riutilizza interna.auth.secret.

  29. · VOIPService

    Per-instance controller delle risorse + org aggregato + sincronizzazione interna

    CRUD (estensione / utenti / dispositivi / segreteria): - VoipExtensionsController a... - VoipUsersController a /api/voip/instances/{id}/users - VoipDevicesController a... - VoipVoicemailController all'indirizzo. - Ogni GET accetta ?refresh=true per forzare-fetch dal fornitore e aggiornare la cache; altrimenti serve dalla cache locale per l'interfaccia utente snappy. - Ogni percorso di scrittura chiama il fornitore e aggiorna la cache locale in modo che l'aggregato le viste rimangono coerenti senza aspettare la prossima sincronizzazione programmata. - Voicemail GET /{vmId}/audio trasmette l'audio grezzo dal fornitore via StreamingResponseBody in modo che l'interfaccia utente possa <audio src=...> direttamente. Org-aggregate (VoipOrgAggregateController a /api/voip/org): - /estensione, /users, /dispositivi, /voicemails restituisce righe in ogni caso con {instanceId, istanzaName} pillole. L'interfaccia utente li rende aggregati schede in /settings/features/phone. - /health run checkHealth() su ogni istanza attiva in parallelo per-instance (tramite i conteggi cacheti di SystemSyncService), restituisce l'istanzaHealthDto[]. - POST /sync esegue instanceSyncService contro ogni istanza attiva corrente. Attiva il pulsante "Sync this org now" nell'interfaccia utente. Sincronizzazione interna (VoipInternalSyncController): - POST /internal/voip/sync-global loops tutte le istanze attive piattaforma-wide. Chiamato dal lavoro al quarzo di DaemonService. Protetto dall'esistente InternalAuthFilter in VOIPService. Costruisce il verde.

  30. · VOIPService

    Multi-instance provider refactor + full FreePBX + Flowroute SMS

    Core model change: one org → many VoipProviderInstances (was: one per org). Every provider API call is now instance-scoped. PhoneProvider interface: - New methods for extension/user/device CRUD + voicemail audio/transcription. - New capability flags (extensionManagement, userManagement, deviceManagement, voicemailTranscription). Defaults throw **************** (HTTP 501) so stub providers don't break. Frontend checks getCapabilities() to hide/disable actions per provider. - ProviderException (HTTP 502) for external-dependency failures. PhoneProviderFactory: - getInstance(UUID) / **************** replace legacy getProvider(Long orgId); getPrimaryForOrg(Long) kept for legacy call sites (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth tokens now scoped by (orgId, provider, instanceId) so one org can authenticate multiple independent RingCentral deployments. - FreePBX construction reads config_json → {baseUrl, clientId, clientSecret, ignoreSslErrors} and instantiates a dedicated FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor takes instanceId for log context. - New methods: listExtensions / createExtension / updateExtension / deleteExtension; listUsers / createUser / updateUser / deleteUser (RC models both as type=User extensions); listDevices / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (streams attachment content) and fetchVoicemailTranscription. FreePBX (FreePBXProvider) — full implementation replaces placeholder: - Client-credentials OAuth2 token caching via FreePBXTokenCache (~1h TTL, auto-refresh on 401, per-instance). - FreePBXGraphQLClient: GraphQL + REST transports with optional skip-SSL-verification for self-signed on-prem PBXes. - Extensions, User Manager users, Endpoint Manager devices, voicemail list/mark-read/delete + audio stream, CDR call history, SIP credentials derived from the extension's pjsip secret, health via fetchAsteriskInfo. - SMS explicitly unsupported (capability sms=false) — FreePBX doesn't handle carrier SMS. Flowroute SMS (FlowrouteTextProvider): - Messages v2.1 API with HTTP Basic (accessKey, secretKey). - Health probe hits GET /numbers?limit=1. - Registered with BulkTextProviderFactory via new FLOWROUTE enum value. Controllers: - VoipInstanceController (renamed from ProviderConfigController) — full CRUD at /api/voip/instances with per-instance test/sync. Secrets redacted in GET responses ('***'); merge-update lets UI round-trip redacted fields without clobbering stored credentials. - BulkTextInstanceController (renamed from BulkTextConfigController) — mirror CRUD at /api/bulktext/instances with test / test-send / send. - OAuthController rewritten for instance-scoped OAuth: start, callback, status, disconnect all take instanceId. - SmsController resolves instance from member.instanceId → org primary, attaches to upserted conversations. - CallController / CapabilitiesController / SipController fall back to the org's primary active instance for legacy single-instance endpoints. Services: - InstanceSyncService: pull-through cache sync — extensions/users/devices/ voicemails copied from provider to local tables, missing rows soft-marked UNKNOWN. Each sub-step wrapped so one unsupported capability doesn't fail the entire sync (e.g. FreePBX no-SMS + has-extensions). - VoipMessageService: all conversation/message paths propagate instanceId. Tests: pre-existing VoipProviderConfig-specific tests removed (covered the renamed types; rewriting is out of scope per design spec §10 — no TDD infrastructure is being added in this refactor). Builds green with updated kamo-shared-library.

Il tuo universo ti sta aspettando.

Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.

Gratis per sempre — nessuna carta di credito richiesta