Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-marketing
Flowroute zu INTEGRATED MIT Banner hinzufügen
· kamo-internal
Genauer Provider-Verbindungsstatus von isConnected anzeigen
Erändert die alte Logik, die "Connected" für jeden Anbieter ohne Synchronisation zeigte Fehler (einschließlich brandneuer Anbieter, die nie getestet wurden). Neue Drei-Staaten-Plakette gefahren von ist Connected (null/true/false): - null / nie getestet . grau "Nicht getestet" (HelpOutlineIcon) - false - red "Nicht verbunden" (ErrorOutlineIcon) - true + Sync Error - amber "Sync error" (WarningAmberIcon) - true . green "Connected" (CheckCircleIcon) - RingCentral no OAuth - Amber "Needs reauth" (unverändert)
· VOIPService
Bestehendes Verbindungstestergebnis zu isConnected
- test() Endpoint saves isConnected=true/false to DB nach jedem Gesundheitscheck - update() Resets ist zum Nullen verbunden, wenn sich configJson ändert (Krehentials können haben sich geändert und erfordert einen erneuten Test, bevor Connected gezeigt wird) - toDto() setzt ist angeschlossen, so dass das Frontend unterscheiden kann: nie getestet / verbunden / nicht verbunden
· kamo-shared-library
Hinzufügen istConnected-Feld zu VoipProviderInstance
Nullable Boolean: null = nie getestet, true = letzte Prüfung bestanden, falsch = gescheitert. Erfordert KamoInitializerService Schemas Migration, um IS_CONNECTED Spalte hinzuzufügen.
· kamo-marketing
Aktives Angebot Banner mit Live-Millisekunden-Countdown anzeigen
holt sich die aktive Promotion-Server-Seite auf der Startseite und macht eine HeroOfferBanner zwischen der Unterzeile und dem Free-Forever Callout. Das Banner zeigt den Rabattbetrag, die Dauer und einen Live-Countdown ************ bei 50ms) mit einem animierten Gradient-Glow-Glüh-Glühde und Schimmer fegen. Rendert nichts, wenn keine Aktivität oder nicht abgelaufene Promotion existiert.
· kamo-internal
Wire Verfügbar/Unverfügbare Schalter auf Backend und beheben OFFLINE Präsenz Bug
- Umbenennen Paused/Aktiv-Chip in NavTop verfügbar/Nichtverfügbarkeit - Erste Verfügbarkeit auf mount und persist toggles über neue me/verfügbarkeit API abrufen - Hinzufügen ist Averable Feld der Member-Schnittstelle und MemberItem-Requisite - MemberList-Pässe ist verfügbar von der dienstlichen Antwort auf MemberItem - MemberItem zeigt ONLINE/OFFLINE/UNAVAILABLE Etikett mit orangefarbener Farbe für nicht verfügbar - Fix OFFLINE Bug: fügen Sichtbarkeitswechsel Herzschlag und 120s periodische Bulk Re-Fetch
· SecurityService
Hinzufügen istAntwort für die Abteilung und die Endpunkte für mich/verfügbarkeit
· InitializerService
Backfill is_ available = TRUE für bestehende Mitglieder
· kamo-shared-library
Hinzufügen ist verfügbares Feld für Mitgliederverfügbarkeit toggle
· kamo-internal
Zugriffs- & Domains-Register und DomainManager-Komponente entfernen
· kamo-marketing
Live ungelesene Abzeichen + Bounce auf neue Agenten-Nachricht
- Hält LiveSupportPanel aus dem Off montiert, während das Widget minimiert wird (nur wenn eine Support-Sitzung existiert), so dass das STOMP-Abonnement bleibt alive und onUnreadMessage Brände für eingehende Agent Nachrichten auch wenn der Besucher schaut nicht auf den Chat. - Animiert das Abzeichen mit einer Federskala bei jedem Zählerwechsel (Schlüsseltrick Das Element montiert das Element wieder und dazu einen kontinuierlichen Tailwind-Pingring, während der 0. - Bounces und Kieft die minimierte Registerkarte selbst, wenn die Anzahl steigt, und färbt es rot mit einem Leuchten, so dass es die Aufmerksamkeit von der ganzen Seite ergreift. - handleExpand räumt bereits die Zählung auf offen, so dass keine Änderung erforderlich dort.
· MediaService
Ausstrahlung anstehende Zählung + ungelesen auf Agent lesen & Besucher senden
- **************** jetzt delegiert ************ so zählen reflektiert Sitzungen mit ungelesenen Besuchermeldungen und Abnahmen, wenn die Agent ruft markAsRead. - Neue öffentliche **************** Helfer. - **************** jetzt (a) sendet die Agenten pro Sitzung ungelesene Nutzlast nach LastViewed Vorschüsse und (b) ruft die helper so das navtop SupportButton bleibt synchron, ohne zu warten die nächste 60er-Umfrage. - **************** ruft auch den Helfer so an navtop Beulen live, wenn ein Besucher sendet. Die nivelliert nun mit dem pro-row Abzeichen-Zustand, beide sofort nach Klick und nach einem Browser aktualisieren.
· kamo-shared-library
Ungelesene Zählung + Lookup-by-Session-Hilfe
Fügt ************ so das navtop SupportButton-Abzeichen kann Support-Tickets zählen, die tatsächlich brauchen Aufmerksamkeit (ungelesene Besuchernachrichten) statt nur PRE_TICKET/NEW Status. Die Zählung wird direkt von der DB gelesen, so dass es eine Auffrischung überlebt. Fügt auch ************ so MediaService hinzu kann den org-Besitzer von einer Session GUID nach markAsRead auflösen.
· KlusterServices
Medien zur Subdomain-Cert-Medien-Regelung hinzufügen
· kamo-internal
Medien-Subdomain zu den benötigten DNS-Alias hinzufügen
· kamo-internal
Orts-Spalte zu Ticket Datagrid hinzufügen
Liest ************ direkt aus dem SupportTicketDTO (jetzt Schnappschüsse auf der Ticket-Entität zu Erstellungszeit - keine Extra-Rundreise). Renders Flagge + Stadt/Region/Land mit der IP in einem Tooltip gezeigt; fällt zurück auf eine em-dash, wenn keine Geodaten ist auf dem Ticket. Agentenansicht nur. TicketHeader verbraucht bereits die gleichen DTO-Felder, also das Popup-Tool Fenster zeigt jetzt auch den Schnappschuss zu - keine GeoLite oder Besucher-Table lesen auf rendern.
· kamo-shared-library
Snapshot Besucher Geo auf Ticket-Entität
VISITOR_IP_ADDRESS, VISITOR_COUNTRY_CODE, VISITOR_COUNTRY_NAME, VISITOR_CITY, VISITOR_SUBDIVISION Spalten. Gefangen bei der Ticket-Erstellung so die Liste/detail Endpunkte nie einen GeoLite Bereich Scan zu tun oder eine separate Besucher-Tisch-Lookup zur Lesezeit. KamoInitializerService (hibernate.ddl-auto: update) wird die Spalten beim nächsten Lauf; vorhandene Zeilen fallen auf die Besucherrekord zurück gespeicherte countryCode in toDTO.
· MediaService
Fügen Sie /ws/public-chat-native plain WebSocket Endpoint neben SockJS hinzu
Registriert einen zweiten STOMP Endpunkt ohne SockJS bei /ws/public-chat-native so dass sich das Frontend ohne Notwendigkeit mit einem nativen WebSocket (brokerURL) verbinden kann die sockjs-client Bibliothek, die einen Entladen-Handler registriert, der gegen die Website's Permissions-Policy. Der ursprüngliche /ws/public-chat SockJS Endpoint wird beibehalten für Abwärtskompatibilität.
· kamo-internal
Pro-Ticket ungelesener Abzeichen + 'Nur neue Nachrichten' Filter
- Ticketliste zeigt eine Chat-Bubble-Plakette mit der ungelesenen Zählung neben Ticket# wann immer die Sitzung Nachrichten hat, die neuer sind als die des Agenten zuletzt angesehene Nachricht. - Fügt einen 'Nur Nachrichten' Filterschalter in die Filterleiste ein. - TicketChat ruft jetzt ************ auf initial Laden und wann immer eine eingehende Nachricht ankommt, so dass die Plakette klätet als der Agent liest das Gespräch. Verlässt sich auf die Kamo-Shared-Bibliothek Veränderung, die sich ausweitet findChatMembershipsByMemberId, um SUPPORT_TICKET-Sitzungen einzubeziehen, plus die MediaService Sendung in ************
· MediaService
Sendung ungelesen zählt zu Agent auf Besucher-Nachricht
Nachdem ein Besucher eine Support-Nachricht sendet, schieben Sie die neuesten ungelesenen Zähler Nutzlast für ************ so die Ticket-Liste des Agenten Abzeichen und nist Kontra-Update in Echtzeit. Spiegelt die Sendung in MediaController.sendMessage für Mitglieder-zu-Mitglieder-Chats.
· kamo-shared-library
SUPPORT_TICKET-Sitzungen in ungelesene Mitgliedschaftsfrage einschließen
findChatMembershipsByMemberId gibt jetzt Mitgliedschaften für CHAT und SUPPORT_TICKET Sitzungstypen, also die bestehende ungelesige Zahl pro Mitglied Infrastruktur (getUnreadCountsByMember, /topic/chat/ungeeles/{memberId' Sendungen, GET ************ Support-Tickets auch. Lassen Sie Agenten sehen pro Ticket neue-Nachricht-Indikatoren in der Ticketliste und eine kombinierte ungelesene Abzeichen im nektiven nektiven.
· KlusterServices
Produktion scheitert2ban mit PJSIP-Gefängnchen und anhaltendem Zustand
- Fügen Sie fail2ban-configmap.yaml mit [asterisk] und [freepbx-web] Gefängnissen hinzu, schrittweise Verbot Eskalation (1h-24h-30d Decke), LAN-Akignop, und ein Benutzerdefinierte asterisk-security.conf Filter Targeting PJSIP SecurityEvent Datensätze - Mount fail2ban-config ConfigMap und hostPath /var/lib/pbx/fail2ban (Verbot Zustand besteht über Pod Restarts) in beiden k1m1 und k2m1 Einsätze - Wire configs in startup.sh vor fail2ban-client Start auf beiden Knoten
· kamo-shared-library
ResetHasAttachmentsForFolder Abfrage zu ConversationRepository hinzufügen
Ermöglicht Synchronisierung, um abgestandene has_attachments Flaggen vor der Re-Indexierung zurücksetzen Eine korrigierte MIME-Erkennung kann das Feld aus den tatsächlichen Anhangsdaten wieder aufbauen.
· KlusterServices
Integrieren Coqui TTS mit Norman-Stimme (VCTK p267)
- Einsatz von coqui-tts Server (VCTK VITS-Modell, CPU-only) als ClusterIP-Dienst am Port 5002 mit Modell-Cache bei /var/lib/coqui-tts auf k1m1 - coqui_tts.agi in /var/lib/asterisk/agi-bin auf jeden Start einwerfen: Aufruf von HTTP API, caches 8 kHz mono WAV unter sounds/coqui-tts/, streams via AGI STREAM FILE - AGI(coqui_tts.agi,text) in jedem Wählplankontext verwenden - Schreibe say.conf auf jedem Boot, um alle Asterisk-Einbaufunktionen zu routen (Zahlungen, Zahlen, Daten, Zeiten) durch Coqui TTS
· KlusterServices
LAN DNS pod für split-DNS auf k1m1 hinzufügen
Entstellt ein dnsmasq pod mit hostNetwork auf k1m1, das auf hört 192.168.4.22:53. Überrepostet pbx.k1.kluster.kamocrm.com - 192.168.4.22 So erreichen LAN-Telefone die Telefonanlage direkt ohne NAT-Haarna. Alle anderen Abfragen werden an 8.8.8.8.8.8.4.4 weitergeleitet. Router DHCP muss auf 192.168.4.22 als primärer DNS-Server hingewiesen werden für LAN-Clients diese abholen.
· kamo-internal
Plattform-Konfigurations-Tabs (Allgemein / VOIP & SMS / System User / Advanced)
Wraps ************ in EinstellungenAnsicht mit vier Registerkarten: - Allgemein: Nur lesbare Plattformübersicht - total orgs, active phone-server Instanzenzählung, aktive SMS-Provider-Instanzen, letzte globale VOIP-Synchronisierung Zeitstempel. Lesen Sie von neu ************ - VOIP & SMS: voipSyncIntervalMinutes (1..1440) und voipSyncEnabled bearbeiten, surface lastGlobalVoipSyncAt, plus ein "Run global sync now"-Button, ruft SecurityService . VOIPService /internal/voip/sync-global auf. - Systembenutzer: vorhandener Systembenutzerzugriff gewährt UI, abgehoben KonfigurationClient wörtlich in eine Registerkarte Komponente (keine Verhaltensänderung). - Fortgeschritten: parallel "Trigger global VOIP sync now"-Button für Ops, plus eine explizite Leerzustandsbotschaft für zukünftige Kontrollen. ConfigurationClient ist jetzt ein dünner Tab Orchestrator. verwenden Sie PlattformAdminGuard bleibt an Ort und Stelle auf der Orchesterleitung Ebene, so dass alle vier Register sind gated.
· DaemonService
Globaler VOIP-Sync-Job (admin-tunable interval)
VoipGlobalSyncJob tickt jede Minute und, auf jeder Zecke, liest die SystemKonfiguration Singleton zu entscheiden, ob eine globale Synchronisierung fällig ist: - Wenn voipSyncEnabled falsch ist, überspringen. - Wenn zuletzt GlobalVoipSyncAt + voipSyncIntervalMinutes - jetzt - überspringen. - Ansonsten: POST /internal/voip/sync-global zu VOIPService mit dem InternalAuthFilter Header; Update lastGlobalVoipSyncAt auf Erfolg. Damit können Plattformbetreiber die Trittdauer zur Laufzeit anpassen ************ - VOIP & SMS ohne Neustart von DaemonService oder berühren Cron-Ausdrücke. Registriert in QuartzConfig neben den bestehenden Jobs. k8s/configmap.yaml fügt die tick cron (1-Minute-Standard) und kamo.services.voip.base-url + internal.auth.secret, damit sich der ausgehende HTTP-Aufruf authentifizieren kann.
· SecurityService
System-config + Plattform-Übersicht Endpoints
Plattformweite Konfigurationsfläche, gated by the bestehende Top-Level-Besitzer guard (passt SystemUserConfigController's requireTopLevelOwner Muster). Endpunkte: - GET /api/security/system-config - zurücks Singleton-Reihe - PUT /api/security/system-config . Update voipSyncIntervalMinutes / voipSyncEnabled. Teilaktualisierungen unterstützt; Validierung erzwingt Intervall 1.1440 Minuten. - GET /api/security/Plattform-Übersicht - aggregierte Statistiken (Gesamtorgen, aktive Telefon/SMS-Instanz zählt, letzter Sync-Zeitstempel, aktuell Intervall + aktivierte Flagge). - POST **************** Anrufe VOIPService /internal/voip/sync-global via InternalAuthFilter (intern auth secret) so Plattform-Betreiber können eine globale VOIP-Synchronisation auf Anfrage von die neue Plattform-Konfiguration - VOIP & SMS-Registerkarte / Fortgeschrittene Registerkarte. Config: - kamo.services.voip.base-url (Standards zu VOIPService Cluster-Lok-Lok-Service URL). - Wiederverwendung vorhanden intern.auth.secret.
· VOIPService
Per-Instance-Ressourcensteuerung + org aggregieren + interne Synchronisation
Per-Instanz-Ressource CRUD (Erweiterungen / Benutzer / Geräte / Voicemail): - VoipExtensionsController bei ************ - VoipUsersController bei /api/voip/instances/ - VoipDevicesController bei **************** - VoipVoicemailController bei ************ - Jedes GET akzeptiert ?refresh=true, um vom Anbieter Kraft zu holen und den Cache aufzufrischen; anderweitig aus dem lokalen Cache für bissige Benutzeroberfläche. - Jeder Schreibpfad ruft Anbieter UND upserts lokalen Cache, so dass die aggregierte Die Ansichten bleiben konsistent, ohne auf den nächsten geplanten Synchronisation zu warten. - Voicemail GET /{vmId'/audio streamt das Roh-Audio vom Provider über StreamingResponseBody, so dass die Benutzeroberfläche <audio src=...] direkt. Org-Aggregat (VoipOrgAggregateController bei /api/voip/org): - /extensions, /users, /devices, /voicemails Rückgabereihen in jeder Instanz mit {instanceId, instanceName] Pillen. UI macht diese in die aggregierte tabs in /settings/features/phone. - /health läuft checkHealth() auf jeder aktiven Instanz parallel pro Instanz (via InstanceSyncService's cached counts), liefert InstanceHealthDto[]. - POST /sync läuft InstanceSyncService gegen jede aktive Instanz der aktuelle Org. Macht die Pächter-Level-Taste "Sync this org now"-Taste in der Benutzeroberfläche. Interne Synchronisation (VoipInternalSyncController): - POST /internal/voip/sync-global loops alle aktiven Instanzen plattformweit. Genannt von DaemonServices geplantem Quarz-Job. Geschützt durch die bestehenden InternalAuthFilter in VOIPService. Baut grün.
· VOIPService
Multi-Instance Provider Refaktor + full FreePBX + Flowroute SMS
Kernmodellwechsel: eine oder eine oder andere VoipProvidInstances (war: eins pro Org). Jeder Provider-API-Aufruf ist jetzt instanziell. PhoneProvider-Schnittstelle: - Neue Methoden für Erweiterung/Benutzer/Gerät CRUD + Voicemail Audio/Transkription. - Neue Fähigkeitsflaggen (ExtensionManagement, userManagement, device Management, VoicemailTranscription). Standard werfen **************** (HTTP 501) so stub Anbieter nicht brechen. Frontend Checks getCapabilities() um Aktionen pro Provider zu verstecken/deaktivieren. - ProviderException (HTTP 502) für externe Abhängigkeiten Ausfälle. PhoneProviderFactory: - getInstance(UUID) / ************ ersetzen getProvider(Long orgId); getPrimaryForOrg(Long) für Legacy Call Sites gehalten (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth Tokens jetzt von (orgId, Anbieter, InstanzId) so eins org kann mehrere unabhängige RingCentral-Einsätze authentifizieren. - FreePBX Konstruktion liest config_json . {baseUrl, clientId, clientSecret, ignorierenSslErrors" und instantiates einen dedizierten FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor nimmt InstanzId für Logkontext. - Neue Methoden: listExtensions / createExtension / updateExtension / updateExtension / deleteExtension; listUser / erstellen Benutzer / updateUser / deleteUser (RC-Modelle beide als type=User-Erweiterungen); listDevices / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (Streams Anhang Inhalt) und fetchVoicemailTranscription. FreePBX (FreePBXProvider) - Die vollständige Implementierung ersetzt Platzhalter: - Client-credentials OAuth2 Token Caching via FreePBXTokenCache (ca. 1h TTL, auto-refresh on 401, pro Instanz). - FreePBXGraphQLClient: GraphQL + REST Transporte mit optional überspringen-SSL-Verifikation für selbstsignierte on-prem PBXes. - Erweiterungen, User Manager Benutzer, Endpoint Manager Geräte, Voicemail list/mark-read/dete + audio stream, CDR Call History, SIP Anmeldeinformationen abgeleitet aus der Erweiterung pjsip Geheimnis, Gesundheit über fetchAsteriskInfo. - SMS explizit nicht unterstützt (Fähigkeit sms=false) - FreePBX nicht handhaben Träger SMS. Flowroute SMS (FlowrouteTextProvider): - Nachrichten v2.1 API mit HTTP Basic (accessKey, secretKey). - Gesundheitssonde trifft GET /numbers?limit=1. - Registriert mit BulkTextProviderFactory über neue FLOWROUTE enum value. Controller: - VoipInstanceController (umbenannt von ProviderConfigController) - voll CRUD bei /api/voip/instanzen mit pro-instanz Test/Sync. Geheimnisse in GET redigiert Antworten ('***'); merge-update lässt UI Round-Trip redacted Felder ohne Clobbering gespeicherte Anmeldeinformationen. - BulkTextInstanceController (umbenannt von BulkTextConfigController) - Spiegel CRUD bei /api/bulktext/instanzen mit Test-Send / senden. - OAuthController umgeschrieben für z.B. OAuth: Start, Rückruf, Status, trennen alle InstanzId. - SmsController löst Instanz von member.instanceId - org primär, beitiert zu upserted Gespräche. - CallController / CapabilitiesController / SipController greifen auf die org's zurück primäre aktive Instanz für Legacy-Endpunkte. Dienstleistungen: - InstanceSyncService: Pull-Through-Cache-Sync . Erweiterungen/Benutzer/Geräte/ Voicemails von Anbieter zu lokalen Tabellen kopiert, fehlende Zeilen weich markiert UNKNOWN. Jeder Unterschritt verpackt, so dass eine nicht unterstützte Fähigkeit nicht verfehlt die gesamte Synchronisation (z. FreePBX no-SMS + hat-Erweiterungen). - VoipMessageService: Alle Konversations-/Nachrichtpfade propagieren InstanzId. Tests: Vorhandene VoipProviderConfig-spezifische Tests entfernt (bedeckt die Umbenannte Typen; Umschreiben ist abgefasst pro Design-Spezifikation 10 - kein TDD In diesem Refaktor wird die Infrastruktur hinzugefügt). Baut grün mit aktualisierten Kamo-Shared-Bibliothek.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich