Przejdź do treści
KAMOUniverse

Changelog

Co nowego.

Każde ulepszenie platformy, jak to wysyła.

  1. · kamo-marketing

    Dodaj Flowroute do INTEGRATED WITH banner

  2. · kamo-internal

    Pokaż dokładny status połączenia dostawcy z pola isConnected

    Zastępuje starą logikę, która pokazała "Connected" dla każdego dostawcy bez synchronizacji Błąd (w tym zupełnie nowe dostawcy, którzy nigdy nie zostali przetestowani). Nowa odznaka trzystanowa napędzana przez isConnected (null/prawdziwe/fałszywe): - null / nigdy nie testowany - szary "Nie przetestowany" (HelpOutlineIcon) - false - czerwony "Nie połączony" (ErrorOutlineIcon) - true + błąd synchronizacji - bursztynowy "Błąd synchronizacji" (OgienaAmberIcon) - true - zielony "Connected" (CheckCircleIcon) - RingCentral no OAuth - bursztyn "Needs reauth" (niezmieniony)

  3. · VOIPService

    Wynik testu połączenia Persist do pola jest połączone

    - test() punkty końcowe oszczędzają i jestte na fałszywe do DB po każdym kontrolie stanu zdrowia - update() resetuje się i jest podłączony do zerowy, gdy konfigJson się zmienia (zmieniałości mogą Zmieniły się, wymagając ponownego przetestowania przed pokazem Connected) - toDto() ujawnia się na połączeniu, dzięki czemu frontend może się wyróżnić: nigdy nie testowany / Podłączony / nie podłączony

  4. · kamo-shared-library

    Dodaj pole i połączone do VoipProviderIntance

    Nullable Boolean: null - nigdy nie przetestowany, prawdziwy - ostatni test zdał, fałszywy - nie powiodło się. Wymaga migracji schematu usługi KamoInitial do dodania kolumny IS_CONNECTED.

  5. · kamo-marketing

    Pokaż aktywną ofertę baner z odliczanie milsekundowe na żywo

    Oświadcza aktywny serwer promocyjny na stronie głównej i renderuje HeroOfferBanner między podpozycją a free-forever callout. Baner pokazuje kwotę rabatu, czas trwania i odliczanie na żywo - w wieku 50ms) z animacją Gragraient-poświata granica i migotanie. Nic nie chwieje, gdy nie działa Istnieje lub niewygasła promocja.

  6. · kamo-internal

    Przewód dostępny / Niedostępny przełącznik na backend i napraw błąd obecności OFFLINE

    - Zmień nazwę układu napędowego/Active na dostępny/Niedostępne w NavTop - Poświęć początkową dostępność na górze i utrzymać przełączanie za pomocą nowego mnie / API dostępności - Dodaj pole Dostępne do interfejsu użytkownika i MemberItem prop - Przepustki MemberList są dostępne od odpowiedzi na departament do MemberItem - MemberItem pokazuje etykietę ONLINE/OFFLINE/UNAVAILILABLE z pomarańczowym kolorem dla niedostępnych - Napraw błąd OFFLINE: dodaj bije serce zmień widomienia i okresowe masowe re-fetch

  7. · SecurityService

    Dodaj jestDostępny do odpowiedzi na przydział i punkty końcowe mnie/dostępności

  8. · InitializerService

    Backfill is_available - PRAWDA dla istniejących członków

  9. · kamo-shared-library

    Dodaj pole jestDostępne dla przełącznika dostępności członków

  10. · kamo-internal

    Usuwanie karty Access & Domainager i komponent DomainManager

  11. · kamo-marketing

    Przechowyna odznaka na żywo + odbicie na nowej wiadomości agenta

    - Utrzymuje LiveSupportPanel zamontowany poza ekranem, gdy widżet jest zminimalizowany (tylko wtedy, gdy istnieje sesja wsparcia), więc subskrypcja STOMP pozostaje Żyjący i onUnreadMessage strzela do przychodzącego agenta, nawet gdy Odwiedzający nie patrzy na pogawędkę. - Animuję odznakę z wiosenną skalą na każdą zmianę liczby (kluczowa sztuczka ponownie zamontowa element) plus ciągły pierścień do pingowania Tailwind podczas > 0. - Odbija i przechyla się samą zminimizowaną kartę za każdym razem, gdy liczenie wzrasta, I zapobieżczy go na czerwono z blasku, aby przyciągnąć uwagę z drugiej strony. - obsługaExpand już oczyszcza liczenie na otwarcie, więc nie potrzeba zmiany - Tam.

  12. · MediaService

    Transmisja oczekująca na liczenie + nieprzeczytana na agenta czytaj i wysyłanie gości

    - teraz delegaci do - tak więc hliba Odzwierciedla sesje z nieprzeczytanymi wiadomościami odwiedzających i przykrewami, gdy Agent wywołuje MarkACzytaj. - Nowy publiczny pomocnik. - Teraz (a) ponownie nadawca agenta Przeczytany ładunek na sesję po ostatnich przegłosowanych zaliczkach i (b) wywołaj: Pomocnik, aby navtop SupportButton pozostał w synchronizacji bez czekania Kolejny sondaż z lat 60. - - dzwoni również do pomocnika, więc Navtop bumps żyje, gdy gość wysyła. Liczba navtop pasuje teraz do stanu odznaki na rzędy, obaj natychmiast Po kliknięciu i po odświeżeniu przeglądarki.

  13. · kamo-shared-library

    Liczba niereadów + pomocnik lookup przezsesyjne

    Dodaje - tak na płytka navtop Odznaka SupportButton może liczyć bilety wsparcia, które faktycznie potrzebują Uwaga (mieć nieczytane wiadomości odwiedzające) zamiast po prostu PRE_TICKET/NEW Status. Liczb jest odczytywane prosto z DB, aby przetrwać odświeżenie. Dodaje również: więc MediaService Może rozwiązać właściciela orgi z sesji GUID po markAsRead.

  14. · KlusterServices

    Dodaj media do listy zaopatrzenia subdomena cert

  15. · kamo-internal

    Dodaj subdomena multimedialną do wymaganych aliasów DNS

  16. · kamo-internal

    Dodaj kolumnę lokalizacji do sprzedaży danych

    Czytam :-) Od razu SupportTicketDTO (teraz migawka na kasie biletowej Czas tworzenia - bez dodatkowej podróży w obie strony). Flaga + miasto/region/kraj z IP pokazanym w podporze narzędziowym; spada z powrotem do em-dash, gdy nie ma danych geo Jest na bilecie. Tylko widok z agenta. TicketHeader już zużywa te same pola DTO, więc narzędzie popup Okno teraz pokazuje migawkę również - nie czyta się GeoLite lub miejscowych Na render.

  17. · kamo-shared-library

    Migawka odwiedzająca geo jednostka biletowy

    VISITOR_IP_ADDRESS, VISITOR_COUNTRY_CODE, VISITOR_COUNTRY_NAME, Kolumny VISITOR_CITY, VISITOR_SUBDIVISION. Uchwycony na liście biletów Tak więc punkty końcowe listy / detale nigdy nie muszą wykonywać skanowania geolisty lub Oddzielne spojrzenie na stół dla odwiedzających w czasie czytania. Firma KamoInitializerService (hibernate.ddl-auto: update) Kolumny po następnym uruchomieniu; istniejące wiersze spadają z powrotem do rekordu odwiedzającego Przechowany krajNiod w toDTO.

  18. · MediaService

    Dodaj /ws/public-chat-native zwykły punkt końcowy WebSocket wraz z SockJS

    Rejestruje drugi punkt końcowy STOMP bez SockJS na /ws/public-chat-native-native, więc Aby frontend mógł łączyć się z natywnym WebSocket (brokerURL) bez konieczności Biblioteka sockjs-klient, która rejestruje uchwyt rozładunku, który narusza Strona jest wsparcie-polityka. Oryginalny /ws/public-chat SockJS jest zachowany Dla kompatybilności wstecznej.

  19. · kamo-internal

    Odznaka nieprzeczytana napis + filtr "Tylko nowe wiadomości"

    - Lista biletów pokazuje odznakę chat-bubble z nieprzeczytaną liczbą obok Bilet - za każdym razem, gdy sesja ma wiadomości nowsze niż wiadomości agenta Ostatnia oglądana wiadomość. - Dodaje przełącznik filtra "Nowe wiadomości tylko" do paska filtracyjnego. - TicketChat teraz dzwoni - na wstępie Załadunek i za każdym razem, gdy pojawia się komunikat przychodzący, więc odznaka oczyszcza się jako Agent czyta rozmowę. Oczywij się na zmianie biblioteki kamo-wspólniowej, która się rozszerza ZnajdźChatMembershipsBymberId w celu włączenia Sesji WSPARCIE_TICKET, plus Transmisja MediaService w języku .

  20. · MediaService

    Transmisja nieprzeczytanych lilii agenta na wiadomość odwiedzającego

    Po tym, jak odwiedzający wyśle wiadomość pomocy technicznej, przesuń najnowsze nieprzeczytane konta ładowność do - więc lista biletów agenta Odznaka i navtop w czasie rzeczywistym aktualizują blat. Lustroje w transmisji w MediaController.sendSessage dla czatów członkowskich.

  21. · kamo-shared-library

    Załóż sesje SUPPORT_TICKET w nieczytanym zapytaniu

    ZnajdźChatMembershipsByMemberId zwraca teraz członkostwo zarówno dla CHAT, jak i CHAT Typy sesji SUPPORT_TICKET, więc istniejące na członka nieprzeczytane Infrastruktura (getUnreadCountsByMember, /topic/chat/unread/?memberId Transmisje, GET - automatycznie obejmuje Bilety na wsparcie też. Pozwól agentom zobaczyć wskaźniki nowych wiadomości na bilet na liście biletów i łączną całkowitą nieodczytaną odznakę w navtop.

  22. · KlusterServices

    Produkcja fail2ban z więzieniami PJSIP i uporczywym państwem

    - Dodać fail2ban-configmap.yaml z więzieniami [asterisk] i [freepbx-webx], Stopniowa eskalacja zakazu (1 h-24h x 30d sufit), zignorowanie sieci LAN i a) Niestandardowy filtr asterisk-security.conf targetowanie filtrów PJSIP SecurityEvent rekordy - Mocowanie fail2ban-config ConfigMap i hostPath /var/lib/pbx/fail2ban (ban Stan utrzymuje się w ponownych startach w kapsułach) zarówno w wdrożeniu k1m1, jak i k2m1 - Wire configs in startup.sh przed fail2ban-client start na obu węzłach

  23. · kamo-shared-library

    Dodaj resetHasAttachmentsForFolder query to ConversationRepository

    Umożliwia synchronizację, aby zresetować flagi has_attachments przed ponownym indeksowaniem Prawizacja MIME może odbudować pole z rzeczywistych danych załączników.

  24. · KlusterServices

    Zintegruj Coqui TTS z głosem norman (VCTK p267)

    - Wdrażaj serwer coqui-tts (model VCTK VITS, CPU-only) jako usługa ClusterIP na porcie 5002 z modelową pamięcią podręczną w /var/lib/coqui-ttts na k1m1 - Wstrzyknąć coqui_tts.agi do /var/lib/asterisk/agi-bin na każdym uruchomieniu: Wywołuje HTTP API, pamięć podręczną 8 kHz mono WAV pod dźwiękami/coqui-tts/, strumienie Za pośrednictwem AGI STREAM FILE — użyj AGI(coqui_tts.agi, tekst) w dowolnym kontekście dialplanu - Napisz say.conf na każdym uruchomieniu, aby pokierować wszystkie funkcje Asterisk (digitarzy, liczby, daty, godziny) poprzez Coqui TTS

  25. · KlusterServices

    Dodaj LAN DNS kapsułki do split-DNS na k1m1

    Rozmieszcza dnsmasq pod z hostNetwork na k1m1, który słucha 192.168.4.22:53. Nadpisy pbx.k1.kluster.kamocrmm.com -> 192.168.4.22 Tak więc telefony LAN docierają do PBX bezpośrednio bez spinki do włosów NAT. Wszystkie inne Zapytania są przesłane na 8.8.8.8/8.8.4.4. Router DHCP należy wskazać na 192.168.4.22 jako główny serwer DNS Klientom z sieci LAN, aby to odebrać.

  26. · kamo-internal

    Zakładki konfiguracji platformy (General / VOIP & SMS / System User / Advanced)

    Owijanie w SettingsView z czterema zakładkami: - Ogólne: przegląd platformy tylko do odczytu — total orgs, aktywny phone-server Liczba instancji, liczba aktywnych wiadomości SMS-dostawca, ostatnia globalna synchronizacja VOIP - Nacisk czasu. Czytaj więcej od nowego ;) - VOIP & SMS: edit voipSyncIntervalMinutes (1.1440) i voipSyncEnabled, Powierzchnia lastGlobalVoipSnncAt, plus przycisk "Uciekaj globalną synchronizację teraz", który VOIPService /internal/voip/sync-global. - Użytkownik systemu: istniejący dostęp użytkownika systemu zapewnia interfejs użytkownika, zdjął KonfiguracjaKlient dosłowny w komponent zakładki (brak zmiany zachowania). - Zaawansowany: równoległy przycisk "Trigger global VOIP teraz" dla ops, plus Wyraźna wiadomość o pustym stanie dla przyszłych kontroli. KonfiguracjaKlient jest teraz cienką orkiestratorką. usePlatformAdminGuard Pozostaje na miejscu na poziomie orkiestratora, więc wszystkie cztery zakładki są zamknięte.

  27. · DaemonService

    Globalne zadanie synchronizacji VOIP (admin-tunable interval)

    VoipGlobalSyncJob tyka co minutę, a na każdym klepie czyta SystemKonfiguracja singleton, aby zdecydować, czy synchronizacja globalna jest należna: - Jeśli voipSyncEnabled jest fałszywy - pomiń. - Jeśli lastGlobalVoipSyncAt + voipSyncIntervalMinutes > teraz - pomiń. - W przeciwnym razie: POST /internal/voip/sync-global do VOIPService z Nagłówek InternalAuthFilter; zaktualizuj ostatniGlobalVoipSyncAt o sukcesie. Dzięki tym operatorom platform dostosowuje kadencję w czasie pracy z VOIP & SMS bez ponownego uruchomienia DaemonService Albo dotykających wyrażeń cron. Zarejestrowany w QuartzConfig wraz z istniejącymi zadaniami. k8s/configmap.yaml Dodaj cron tick (1-minute default) i kamo.services.voip.base-url + Internal.auth.secret, więc wychodzące połączenie HTTP może uwierzytelnić.

  28. · SecurityService

    System-config + punkty końcowe widoku platformy

    Powierzchnia konfiguracji o szerokości platformy, ogrodzony przez istniejącego właściciela najwyższego poziomu osłony (mecze SystemUserConfigController wymaga wzoruTopLevelOwner). Punkty końcowe: - GET /api/security/system-config — zwraca wiersz singleton - PUT /api/security/system-config — aktualizacja voipSyncIntervalMinutes / voipSyncEnabled. Częściowe aktualizacje Poparte; walidacja egzekwuje Przedział 1..1440 minut. - GET /api/security/platform-overview — statystyki zagregowane (total orgs, Liczy się aktywny telefon/SMS instance, Ostatni znacznik czasu synchronizacji, prąd Interwał + włączona flaga). - POST ;) Połączenia VOIPService /wewne/voip/sync-global przez InternalAuthFilter (wewnętrzny Auth secret), dzięki czemu operatorzy platform mogą wystrzelić globalną synchronizację VOIP na żądanie Nowa konfiguracja platformy - karta VOIP & SMS / Advanced. Config: - kamo.services.voip.base-url (domyślnie do VOIPService-Local URL usługi). - Ponowne wykorzystanie istniejącego Internal.auth.secret.

  29. · VOIPService

    Kontrolery zasobów na instancja + orgregacja + synchronizacja wewnętrzna

    Zasób na instancyjny CRUD (rozszerzenia / użytkownicy / urządzenia / poczta głosowa): - VoipExtensionsController na - VoipUsersController at /api/voip/instances/users/users - VoipDevicesController na - VoipVoicemailController na . - Każdy GET akceptuje „refresh-true, aby wymusić od dostawcy i odświeżyć pamięć podręczną;” W przeciwnym razie służy z lokalnej pamięci podręcznej dla snappy UI. - Każda ścieżka pisania wywołuje dostawcę i wstawia lokalną pamięć podręczną, więc zagregowana Widoki pozostają spójne bez czekania na kolejną zaplanowaną synchronizację. - Poczta głosowa GET /-vmId/audio przesyła surowy dźwięk od dostawcy za pośrednictwem StreamingResponseBody więc UI może "audio src"...> to bezpośrednio. Org-agregat (VoipOrggatAggregate Kontroler pod adresem /api/voip/org): - /wygłady, /użytatory, /urządzenia, /voicemails wracają wiersze w każdym przypadku Z "instancjąId, instanceName" pigułki. UI renderuje je do zagregowanych Zakładki w /settings/features/phone. - /serie w zakresie zdrowia kontrolnego() na każdym aktywnym przypadku w równoległej natężeniu (przez buszkowaną liczbę InstanceSyncService), zwraca InstanceHealthDto[]. - POST / synchronizacja działa InstanceSyncSyncSService przeciwko każdej aktywnej instancji Aktualny org. Widnieje przycisk "Sync this org now w interfejsie użytkownika". Synchronizacja wewnętrzna (VoipInternalSyncController): - POST /internal/voip/sync-global pętle na wszystkie aktywne instancje w całej. Nazywany planowaną pracą DaemonService Quartz. Chronione przez istniejące InternalAuthFilter w VOIPService. Buduje zieleń.

  30. · VOIPService

    Wieloinstancyjny refaktor refaktor i pełnopłatny FreePBX + Flowroute SMS

    Zmiana modelu podstawowego: jeden org - wiele VoipProviderInstances (było: jeden na org). Każdy dostawca API jest teraz identyfikowany na instancji. Interfejs PhoneProvider: - Nowe metody rozszerzenia/użytnika/urządzenia CRUD + poczta głosowa audio/napis. - Nowe flagi możliwości (extensionManagement, userManagement, urządzenieManagement, voicemailTranscription). Domyślny rzut ;) (HTTP 501) więc dostawcy nie pękają. Kontrole przedni do uzyskaniaCapaable() Ukrywanie/niemożnionych działań na jednego dostawcę. - ProviderException (HTTP 502) w przypadku awarii niezależności zewnętrznej. TelefonProviderFactory: - getInstance(UUID) / ? Zamień dziedzictwo getProvider(Long orgId); getPrimaryForOrg (Long) zachowany dla starszych witryn połączeń (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth tokeny teraz dostępne (orgId, dostawca, instanceId) tak jeden Org może uwierzytelniać wiele niezależnych wdrożeń RingCentral. - Konstrukcja FreePBX odczytuje config_json ? ?baseUrl, clientId, clientSecret, clientSecret, IgnorujSslErrors i instancja tworzy dedykowany FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor bierze instanceId dla kontekstu dziennika. - Nowe metody: listaRozszerzenia / createExtension / updateExtension / deleteExtension; listUsers / createUser / updateUser / deleteUser (modele RRC Oba jako rozszerzenia typu-Użytkownicy); listaUrządzenia / createDevice / updateUrządzenie / UsuńDevice; fetVoicemailAudio (ukończenie treści załączników) i Pobierz fetVoicemailTranscription. FreePBX (FreePBXProvider) — pełne implementacje zastępują symbole zastępcze: - Cregentialentials OAuth2 token buforowanie za pośrednictwem FreePBXTokenCache (1h TTL, Auto-refresh na 401, per-instancja). - FreePBXGraphQLClient: GraphQL + REST transporty z opcjonalnym Weryfikacja skip-SSL dla samodzielnego podpisu PBX. - Rozszerzenia, użytkownicy Menedżera użytkowników, urządzenia Endpoint Manager, poczta głosowa Lista/mark-read/delete + strumień audio, historia połączeń CDR, dane uwierzytelniające SIP Wywodzący się z sekretu pjsip extension, zdrowie za pośrednictwem fetchAsteriskInfo. - SMS wyraźnie nieobsługiwane (capability sms-false) — FreePBX nie obsługuje Stelażowy SMS. Flowroute SMS (FlowrouteTextProvider): - Wiadomości v2.1 API z HTTP Basic (accessKey, secretKey). - Sonda zdrowia uderza w GET / liczba? limit 1. - Zarejestrowana w BulkTextProviderFactory poprzez nową wartość FLOWROUTE enum. Kontrolerzy: - VoipInstanceController (odnośny od ProviderConfigController) — pełne CRUD na /api/voip/instancje z testem perinsstancyjnym/sync. Tajemnice zredagowane w GET Odpowiedzi („'); merge-update let I UI-trip redagowane pola bez Klobbering przechowywane poświadczenia. - BulkTextInstanceController (nazwany z BulkTextConfigController) — lustro CRUD at /api/bulktext/instancje z testem / test-send / send. - OAuthController przepisany na przykład na przykład OAuth: start, callback, status, Rozłączenie wszystkich bierze przykładId. - SmsController rozwiązuje instancję z member.instanceId ? primary, attaches Aby rozsponować rozmowy. - CallController / CapabilitiesNadzły Kontroler / SipController wraca do org Główny aktywny przykład dla dziedzicznych punktów końcowych jednoinstancyjnych. Usługi: - InstanceSyncSService: pull-through cache synchronizacja — rozszerzenia/urządzenia/ Poczty głosowe skopiowane z dostawcy do lokalnych stołów, brakujące rzędy oznaczone w miękkim rzędami UNKNOWN. Każdy podetap owinięty, więc jedna nieobsługiwana zdolność nie zawodzi Cała synchronizacja (np. FreePBX no-SMS + masowo-rozszerzenia). - VoipMessageService: wszystkie ścieżki konwersacji/przestrzeń propagują instanceId. Testy: wcześniej istniejące testy specyficzne dla VoipProviderConfig usunięte (zakryte Rodzaje nazwane; przepisywanie jest poza zakresem specyfikacji projektowej 10 - brak TDD W tej refaktorce dobudowana jest infrastruktura). Buduje zieleń dzięki zaktualizowanemu kamo-shared-libiry.

Twój wszechświat czeka.

Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.

Bezpłatne na zawsze — nie wymaga karty kredytowej