Direkt zum Inhalt
KAMOUniverse

Changelog

Was ist neu?

Jede Verbesserung an der Plattform, wie sie geliefert wird.

  1. · SecurityService

    Relay bedingt-LLPA-Authornung

    Relays POST ************ durch den org-stamping Schreibhelfer, also ein Steward-Autoren bedingte Anpassungen nur für ihren eigenen Mieter.

  2. · kamo-internal

    Bulk-reassign ausgewählt führt zu einem Teammitglied

    Das Gitter hatte bereits mehrfach ausgewählte Kontrollkästchen, aber nichts mit einer Auswahl zu tun. Überprüfen von Zeilen zeigt nun eine Reassign-Aktion neben den anderen Lead-Aktionen, gated auf REASSIGN_LEADS_MANUALLY (der Server überprüft es erneut; das ist nur Bequemlichkeit). Verwendet checkRight anstatt checkRole, so Gott-Modus passt der Backend hasGod Bypass - checkRole nicht umgehen und würde für Gott-Nutzer divergieren. Der Dialog wählt ein Zielmitglied durch Suche, nimmt eine optionale Notiz und sagt im Vorfeld, dass das Mitglied per E-Mail gesendet wird, da das der Punkt der ist Feature. Indigo/blau statt Hot Reassign's Orange/Pink: das ist ein absichtliche Massenverwaltungsaktion, keine dringende Anrufübertragung. Die Header-Checkbox wählt jede Zeile im Client-seitigen Raster aus - Tausend für eine groß org - so wird hier auch die 250-Mütze durchgesetzt. Ansonsten die Schlagzeile "select all and reassign"-Flow würde Server-Seite scheitern, nur nachdem der Benutzer . . . aus dem gesamten Dialog, mit einem nicht übersetzten Fehler. Die Auswahl erfolgt vor dem Nachladen durch ausgewählteIdsRef: loadLeads re-wählt, was auch immer, dass ref hält, so dass es bevölkert würde erneut überprüfen Reihen haben sich gerade verschoben. Die Ergebnismeldung ist eher komponiert als eine andere-wenn-Kette, weil eine Charge sowohl teilweise als auch nicht notifiziert sein kann und die Kette nur gemeldet wird die erste.

  3. · SecurityService

    Bulk-reassign Endpunkt, gated auf REASSIGN_LEADS_MANUALLY

    POST **************** versetzt eine Charge Leads in ein Team Mitglied und E-Mails, die Mitglied einmal für die gesamte Charge. Autorisierung verwendet REASSIGN_LEADS_MANUALLY (149) - die Rechte für genau benannt dies. Das ist strenger als der Single-Lead-Pfad auf PUT /leads/{id', der prüft ASSIGN_LEADS; die Neuzuweisung von hundert Lehnen ist ein anderer Explosionsradius von der Umwidmung eines, und die beiden Rechte existieren, so dass sie getrennt gewährt werden können. Auch hier wird die nicht zugewiesene Sichtbarkeitsstufe durchgesetzt. Zuordnung IST eine Sichtbarkeit Zuschuss: sobald eine Leitung dem Anrufer zugewiesen ist, liest es sich als "meinem zugeordnet", was Hebt die nicht zugewiesene 403 und überspringt die Kontakt-Info-Maske. Ohne diese überprüfen Sie einen Anrufer, der 149 hält, aber nicht VIEW_UNASSIGNED_LEADS könnte sich selbst führen das Gitter versteckt sich vor ihnen und waschen sie in vollständig lesbare. Übersprungen führt Bericht NOT_FOUND - passend zu dem, was ihr eigenes Raster zeigt - so die Antwort kann versteckte oder fremde Leisten nicht aufzählen. Die Charge ist absichtlich nicht Alles-oder-Nichts: Jeder Zuweisungs-Lead läuft in seinen eigenen Transaktion und eine schlechte ID wird ein Sprung, weil Verwerfen neun gute Neuzuweisungen über das Zehnte ist schlimmer als die Berichterstattung, die man nicht genommen hat. Capped bei 250 pro Anruf, um sowohl die Reihensperren und die Echtzeit-Fan-out gebunden. Der Notifier löst seine Daten in einer kurzen Transaktion durch eine separate Banne und sendet danach, so dass ein ausgehender Anruf mit einem 30er-Lese-Timeout nie pins ein CRDB-Verbindung. Die Überschreitung der Bohnengrenze ist auch das, was macht @Transactional überhaupt anwenden - Selbst-Berufung würde still laufen ohne Transaktion und die LAZY Benutzervereinigung würde werfen.

  4. · EmailService

    Beispielvariablen für die LEADS_ASSIGNED Vorlage

    Ohne einen Fall hier die Vorschau des Admin-Template-Editors gibt die neue Vorlage wieder mit jedem Platzhalter leer, die sich eher als kaputte Vorlage liest ungefüllt ein. NotizenBlock ist vor-rendered HTML, weil der Renderer keine bedingte - der Absender bricht es auf "", wenn es keine Notiz.

  5. · kamo-shared-library

    LEADS_ASSIGNED E-Mail Vorlage; härten Zuweisung für den Masseneinsatz

    assignLead hatte null Anrufer und war nie in der Produktion gelaufen. Vor der Verdrahtung der Bulk Umwidung Weg zu ihm, geben Sie ihm die Garantien, dass Weg braucht: - nehmen orgId und überprüfen BOTH die Blei und der neue Empfänger gehören zu ihm, so ein Umwidmung kann nicht über Mieter zu erreichen (ausgewiesen als "nicht gefunden" statt "Verbieten", so dass der Fehler nicht verwendet werden kann, um ausländische Blei-IDs zu untersuchen) - Sperren Sie die Zeile mit findByUidForUpdate: eine manuelle Umwidmung und eine gleichzeitige Pool-Akzept Ziel der gleichen Führung und würde sonst in eine verlorene Interleave Update - die Pool-Flagge löschen, Spiegelung CreditLeadAssignmentService. Ein Vorsprung für Auto-Aufgabe bleibt sonst im Pool, nachdem sie von Hand beansprucht und wird von unter seinem neuen Besitzer herausgenommen - veröffentlichen Chat-Routing, wie updateLead bereits tut, so dass der Kreditnehmer offen live Chat folgt der Führung, anstatt mit dem vorherigen Offizier zu bleiben Außerdem fügen Sie die kanonische Vorlage LEADS_ASSIGNED hinzu. Der Schlüssel muss in sein CANONICAL_KEYS oder es kann nie ausgesät werden und kann nie selbst heilen, und jeder senden gibt eine permanente 404 zurück.

  6. · kamo-shared-library

    MANAGE_ORG_BRANDING hinzufügen (174)

    Org Branding Endpunkte (Logos, Farben, Hintergründe, Themenvorkehrungen) wurden Nur Eigentümer-oder-Gobei, so dass keine Möglichkeit, Branding zu delegieren, ohne Übergabe Eigentum der Org. Fügt das delegierbare Recht; Besitzer Kontrollen bleiben als implizite Zuschuss, damit bestehende Eigentümer weiterarbeiten, ohne dass es zugewiesen wird.

  7. · kamo-internal

    Autor förderfähige Matrizen aus dem Katalog-Panel

    Ohne eine Matrix, die die Belegung und den Zweck eines Szenarios abdeckt, gibt die Preisgestaltung NO_COVERAGE zurück. also vorher konnte nur der Kauf eines Hauptwohnsitzes bepreist werden. Die Form Autoren ein Matrix und ihre Zellen für eine gewählte Grenzform, Belegung und Zweck, mit Add/Entfernung der Zelle Reihen, neben der Lock-Politik-Form in der gleichen Tafel. Lassen Sie das Produkt unset Autoren eine Matrix pro ACTIVE Produkt des Investors, weil Der Produktumfang der Matrix ist NICHT NULL und kann "alle Produkte" nicht als eine einzelne Zeile ausdrücken.

  8. · SecurityService

    Relay förderfähig-matrix-Autorierung; Umbau nimmt den SUSPENDED Lebenslauf

    Staffeln POST **************** durch das bestehende Org-Stempelschreiben Helfer, so ein Steward Autoren Matrizen nur für ihren eigenen Mieter. Dieser Vorstoß baut sich auch gegen die Shared-lib-Änderung auf, die ein SUSPENDED-Darlehen wieder aufnehmen lässt. kamo-shared-Bibliothek hat keine eigene CI - jeder Dienst klont und baut sie aus der Quelle . damit fix diesen Dienst nur erreicht, wenn sich dieser Dienst neu aufstellt.

  9. · kamo-internal

    Das Agentenstudio als vollbreiten Arbeitsraum wieder aufbauen

    Das Entfernen der Breitenkappe war nicht die Korrektur; das Layout selbst musste gestaltet werden für den Raum, anstatt in ihm geduldet. Das Studio ist jetzt drei Zonen nebeneinander: - **Outline rail** - die Abschnitte, wobei der aktuelle beim Scrollen hervorgehoben ist (IntersectionObserver, top-gewichtet, so dass ein Abschnitt wird aktuell, wenn seine Kopfzeile erreicht, wo Aufmerksamkeit tatsächlich ist). Die von Hand geschriebenen Abschnitte sind gekennzeichnet, also Ein handgeschriebener Teil ist später ohne Öffnen eines jeden zu finden. - **Editor** - die Abschnitte selbst, Fliesen in so viele Spalten wie die viewport hält anstelle eines schmalen Bandes. - **Live conversation** - eine echte Säule auf einem breiten Display, nicht ein Streifen, der bricht den Inhalt beim Öffnen ein. Dies ist die Edit-and-Watch-Schleife im Studio existiert für: eine Anweisung ändern, die Antwortänderung sehen, ohne zu navigieren. Eine TestDrivePanel-Instanz, neu positioniert statt dupliziert - Montage zweimal würde zwei Wegwerf-Sitzungen beginnen. Unter xl fällt es unter dem Editor als eine vollbreite Reihe, anstatt eine dritte Säule auf ein Display ohne Raum zu pressen für einen, und die Schiene versteckt sich ganz auf kleinen Bildschirmen.

  10. · kamo-internal

    Autorensperren-Richtlinien - ohne einen, keine Rate kann überhaupt gesperrt werden

    RateCommitmentService lehnt eine Sperre ab, wenn das Preisergebnis keine ist lockPolicyVersionId ("lock-policy version ist erforderlich"), und ein Ergebnis trägt nur eine, wenn der Investor hat eine veröffentlichte Lock-Politik-Version. Keine Benutzeroberfläche könnte eine veröffentlichen, so Rate Sperrung war für jeden Mieter unerreichbar, während der Endpunkt selbst bereits gebaut war, org-gated und richtig verablen. Es fehlte nur die Client-Methode und dieses Formular. Das Formular nimmt die angebotenen Sperrzeiten als bestellte Liste an, weil das FIRST zum Standard, so dass es absichtlich nicht sortieren sie; Einträge, die nicht eine positive ganze sind Anzahl der Tage werden fallen gelassen, anstatt als schlechte Sperrfrist gesendet.

  11. · kamo-internal

    Zeigen, wie es jedem Agenten geht

    Fügt eine Performance-Sektion an der Spitze des Agentenstudios hinzu: Gespräche, wie oft eine Person übernahm und was es ausgelöst, Outreach Ergebnisse und Kosten. Geschrieben, so dass keine Figur in die Irre führen kann: - Null wiedergegeben als das Wort 'None', niemals 0. - Eine Aktie gibt nur dann einen Nenner ab; sonst 'Keine Gespräche noch zu vergleichen gegen'. Es gibt keine Null-Denominator-Prozentsätze. - Wenn nichts in der Zeit einen Preis hatte, wird KEINE Kostenzahl angezeigt - nur eine Erklärung, dass die Preise eingerichtet wurde, nachdem der Verkehr passiert. Teilweise Die Deckung zeigt den Betrag und wie viele Antworten fehlen. - Unterdrückte Reichweite wird als das Feature präsentiert, das es ist: 'Diese werden auf gehalten Zweck - sie sind deine Aufzeichnung, warum jemand nicht kontaktiert wurde.' - Unbekannte Enum-Codes degradieren zu lesbarem Text und nicht zu einem rohen Schlüsselpfad. Perversion-Nachricht und Handoff-Spalten wurden entfernt: die API aggregiert nicht sie pro Version, so dass diese Zellen eine fabrizierte 0 gemacht haben, als ob es war gemessen worden. Gespräche allein beantworten, was die Tabelle ist für - die gespeichert kopieren behandelt, welche Verkehr. Gespeichert in die bestehende Scrolling Studio-Dokument statt einer neuen Registerkarte, und gehalten von der Agentenliste, wo eine nackte 0 gegen jeden Agenten wäre die genaue missverstanden werden vermieden.

  12. · AIService

    Peragent Scorecard

    Was jeder Agent tatsächlich tat: Gespräche, wie oft eine Person übernehmen musste und warum, Outreach-Ergebnisse einschließlich derer, zurückgehalten, und was es gekostet hat. Jede Zahl ist eine, die die Daten tatsächlich unterstützen können. Drei Dinge sind absichtlich NICHT hier: - **Keine Tokensummen.** Sie sind echt auf dem Sync-Pfad und auf der Streaming eins (content.length()/4), so dass jede Summe ist Teil erfunden. Kosten-Antworten die gleiche Frage ehrlich, weil es null ist, anstatt zu erraten, wo die Preis ist unbekannt. - **Keine Auflösung oder Ablenkungsrate.** Nichts beobachtet, ob ein Gespräch endete gut, und "kein Handoff aufgetreten" ist kein Beweis für den Erfolg. - **Keine Pro-Version-Nachricht oder Handoff-Zählungen.** Diese werden nicht pro aggregiert. Version, und emittieren 0 für sie wäre eine Erfindung als ein Messung - der genaue Fehler dieser Bildschirm zu vermeiden. Kosten trägt eine explizite verfolgte Flagge und einen Nullbetrag statt 0, wenn nichts im Fenster war preislich, so ein Org, deren Verkehr vor der Preisgestaltung sieht 'nicht aufgezeichnet' statt eines zuversichtlichen $0.00. pricedCalls ist die Autorität eher als die Summe, so dass eine echte Null von preisgünstigen Free-Tier-Anrufe immer noch liest als verfolgt. Transcript Prosa ist abgetrennt auf VIEW_SALES_AGENT_TRANSCRIPTS zählt - die Zusammenfassung des Modells eines bestimmten Besuchers ist Konversationsinhalt, nicht ein metrisch. Agenten ohne Verkehr geben eine strukturell vollständige leere Scorecard zurück: ein Agent, der in der Liste fehlt, liest sich wie ein Fehler, ein Agent mit Nullen liest wie die Wahrheit. parseHandoffArguments wird nun mit dem Chat-Pfad geteilt, anstatt neu zu fordern, so kann der Zwang erfundener Gründe zu ANDER nicht zwischen den beiden driften. Suite ist 150 Tests, grün.

  13. · kamo-shared-library

    Gruppierte Aggregatanfragen für die Agent Scorecard

    Zwölf @Query Aggregate über Sitzungen, Nachrichten, Nutzungsaufzeichnungen und Outbound berührt, so dass eine Scorecard eine Handvoll von Gruppenanfragen ist, anstatt Zeilen zu laden in die Erinnerung. Zwei Eigenschaften werden in den Prädikaten durchgesetzt und nicht den Anrufern überlassen: - **isTest-Sitzungen sind in der Abfrage selbst ausgeschlossen.** Auf einen jungen Agenten sind die Autors eigene Testfahrten wären sonst die meisten Daten und ein Anrufer, der vergisst zu filtern erzeugt Zahlen, die real aussehen und nicht sind. - **count(costEstimate) zählt nur NON-NULL-Kosten.** Das ist, was die Scorecard unterscheiden 'nichts wurde preislich' von 'es kostete null' - zusammenbrechend die würden eine zuversichtliche $0.00 vor einem Org, dessen Verkehr einfach setzen Vor der Preisgestaltung. Outbound-Berührungen werden nach Entscheidung gruppiert und nicht nach Senden gefiltert. Die Verweigerungen sind die interessantere Hälfte: ein Agent, dessen Berührungen fast alle sind SUPPRESSED_QUIET_HOURS ist falsch konfiguriert, und das ist unsichtbar, wenn Decoder Weggeworfen.

  14. · kamo-internal

    Bearbeiten, was jedes Modell kostet

    Fügt pro Modell Preisbearbeitung auf den Provider-Setup-Bildschirm. Die Preise sind gesät aus Jeder Verkäufer veröffentlicht Listenpreis, wo wir es kennen, und leer, wo wir nicht - eine leere Mittel Kosten einfach nicht für dieses Modell verfolgt, das ist besser als eine Zahl, die selbstbewusst falsch ist. Copy sagt Menschen, die gesäten Zahlen gegen ihre eigene Rechnung zu überprüfen, anstatt sie als maßgeblich darstellen. Behebt einen Display-Bug im Test gefangen: die Trailing-Null-Trimm würde eine Preis von 10 als 1. Es streift jetzt Nullen erst nach dem Dezimalpunkt.

  15. · AIService

    Modellpreiskatalog, Schreibweg und Backfill

    Kostenrechnung könnte nie funktionieren: AiModel hat Preisspalten, AiModelController liest sie und ChatOrchestrationService liest sie, um Kosten zu berechnenEstimat - aber NICHTS schrieb sie überall hin. Modelle werden nur von Anbieter-Entdeckung erstellt, und kein Provider API liefert Preise. 140 Modelle, 0 Preis, kein Weg, durch welche könnte sich ändern. Die Säulen waren strukturell unerreichbar. Drei Teile: - ModelPricingCatalog-Samen-Verkäufer LIST-Preise bei Entdeckung, abgestimmt auf einem normalisierter Kennung mit einer Bindestrich-Grenze-Präfix-Regel, so gpt-4 kann nie behaupten gpt-4o. Nicht-Chat-Modelle (TTS, Einbettungen, Echtzeit) werden von Wiederverwendung der bestehenden Modalitäten-Check - sie rechnen ein anderes Blatt ab. - PATCH Endpunkt + UI, so dass ein Org einen Preis korrigieren oder löschen kann. Org-skopiert genau wie die bestehende DELETE. - Backfill füllt nur NULL-Säulen, pro Spalte unabhängig, und nie überschreibt, was eine Org gesetzt hat - andernfalls wären die Preise editierbar lüge. Idempotent, und verpackt, so Kostenrechnung kann nie blockieren Boot. **Ein Modell, das wir nicht sicher sind, bekommt keinen Preis statt eines erraten.** GPT-5, o3, die meisten Mistral, DeepSeek, xAI, Cohere und Meta sind absichtlich leer; OpenRouter und HuggingFace passen nie mit Design überein, da sie ihre eigenen Preise in Rechnung stellen und die Vererbung der vorgelagerten Preise wäre eine Vermutung. Ein falscher Preis produziert eine Rechnungsförmige Figur, die selbstbewusst falsch ist - der gleiche Grund Kosten ist immer noch nicht auf dem Streaming-Pfad berechnet, wo Token-Zählungen hergestellt werden. Umwandlung in die Per-1k-Spalte verwendet RoundingMode.UNNECESSARY absichtlich: ein Preis benötigen mehr als 6 Dezimal-Werfede auf Klasse-Init statt stille Lagerung ein Grund und wird leer gelassen. Suite ist 145 Tests, grün.

  16. · kamo-internal

    Zeigen Sie die KI-Handoff-Kontext auf den Agenten übernehmen

    Renderiert ein AI_HANDOFF Systemereignis als Karte mit dem Grund, der KI-Zusammenfassung, und eine zusammenklappbare Abschrift des Gesprächs so weit - so der Kreditnehmer tut nicht haben, sich zu der Person, die abholt zu erklären. Die drei degradierten Staaten sind eher explizit und sichtbar als still: Transkription nicht verfügbar, Transkript abgeschnitten und auf der Durchreise abgestreift. Ein Agent muss nie verlassen zu glauben, dass sie den vollen Kontext haben, wenn sie es nicht tun. Besucher und Agent teilen sich ein STOMP-Thema, so dass der Live-Rahmen redigiert ankommt (die AI-Zusammenfassung ist seine private Beurteilung des Besuchers und kann nicht zu ihrem Browser). Anstatt dem Agenten zu sagen, dass er neu laden soll, wird die Karte die vollständige Zeile neu gelesen. einmal aus seinem eigenen authentifizierten Endpunkt. Die erneute Lektüre wird validiert, bevor sie ist angenommen - eine Antwort, die immer noch zurückkam, wird abgelehnt, anstatt verwendet zu werden, so kann die Warnung immer nur klären, wenn Kontext wirklich gewonnen wurde. Jedes Versagen fällt zurück zur Reload-Nachricht.

  17. · APIService

    Proxy die öffentliche KI-"menschliche Handoff-Route"

    POST ************ proxiert zu MediaService hinzu neben seiner SchaffungSupportSession Geschwister. Ohne dies war die Handoff-Funktion bei der Ankunft tot: MediaService-Endpunkt erfordert X-Internal-Auth, X-Public-Chat-Org-Id und X-Public-Chat-Key-Hash, die nur dieses Gateway injiziert, so dass das Widget POST 404'd hier und nie erreicht. Fügt die gleiche bedingte *** Wache wie createSupportSession. Handoff läuft der volle Sitzungs-Erzeugung Pfad, so Proxying es nackt hätte eine Ticket-Schreibroute, die den Arbeitsnachweis umgeht, setzt ihr Geschwisterchen durch.

  18. · MediaService

    Tragen Sie die KI-Gespräch in den menschlichen Thread auf Handoff

    Erstellt oder nutzt die Support-Sitzung, kopiert das KI-Transkript in einem System Veranstaltung, Routen es, und sagt dem Besucher ehrlich, was als nächstes passiert. Vertraulichkeit wird durch das Publikum geteilt, das der erste Durchgang nach hinten bekam. Die KI-Zusammenfassung und VernunftDetail sind seine private Bewertung des Besuchers, und die volle Nutzlast erreichte den eigenen Browser des Besuchers durch zwei REST-Türen und der STOMP-Rahmen, während der Agent nichts sah. Redaktion gilt jetzt bei jedem Besucher-Vorfahrt; die beharrliche Reihe hält die volle Nutzlast für den Agenten. chat.session.{guid] ist ein einziges Thema, das beide Audienabonnenten abonnieren, also die live Frame ist geschnitten, was der Besucher sehen kann und der Agent UI liest die vollständige Zeile neu von seinem eigenen authentifizierten Endpunkt. Idempotenz ist auf aiSessionGuid, org-scoped, schlüsseliert und VOR der Erstellung überprüft alles. Keying es auf die Sitzung und Überprüfung nach der Erstellung - die offensichtliche Form - ist nutzlos, genau wenn es darauf ankommt: ein Retry, der seine Sitzung verloren Token passiert immer die Scheck und produziert ein doppeltes Ticket und einen zweiten Agenten Seite. transcriptAttached berichtet nun, was tatsächlich passiert ist. Es kam vorher zurück wahr, auch wenn der Schreibstille fehlgeschlagen war, was das Schlimmste ist Kombination: dem Besucher wird gesagt, dass ihr Kontext gestoßen ist, der Faden des Agenten ist leer, und keine Partei weiß es. Copy-on-Handoff, nicht Migration: KI-Wunden bleiben dort, wo Analytik sie liest.

  19. · AIService

    Agent-eitiierte Übergabe an einen Menschen, mit Kontext

    Die KI konnte bisher nicht nach einer Person fragen: Eskalationsregeln erreichten das Modell über die kompilierte Aufforderung, aber es gab kein maschinenlesbares Signal zurück, so dass die Modell konnte nur SAY es jemanden holen würde und nichts passierte. - Synthetisches kamo_request_human-Tool, beschrieben aus dem eigenen aktivierten Agenten Eskalationsregel-Titel, so dass das Modell sieht identische Trigger-Bedingungen in der prompt und das Werkzeug. Vor dem MCP-Depeschen abgefangen - es ist ein Signal, kein reale Tool Call - und die TOOL-Reihe, die es fortbesteht, ist das, was den Grund haltbar macht und analytik-bereit mit null neuen Spalten. - NUR angefügt, wenn der Kanal tatsächlich Live-Unterstützung aktiviert hat. Handing AI-only org ein Werkzeug, das einen Menschen, der nie ankommen kann verspricht, ist schlimmer als ohne Werkzeug: das Widget hat keine Support-Tab, so dass das Signal fallen gelassen wird und die Besucher wird auf jemanden warten gelassen, der nie gekommen ist. - Neuer interner Endpunkt gibt den Handoff-Gründung, die KI-Zusammenfassung für wer auch immer übernimmt und das USER/ASSISTANT Transkript. TOOL und SYSTEM Reihen sind ausgeschlossen - der Mensch braucht das Gespräch, nicht die Maschinerie. - reasonDetail und Zusammenfassung werden dem Browser des Besuchers bewusst vorenthalten: sie sind die private Einschätzung des Modells des Besuchers. Nur {Angefordert, Grund geht zum Client; MediaService holt die Rest-Server-Seite ab. - KI-Wende werden nie verschoben oder gelöscht. AiChatMessage bleibt das Analysesystem der Aufzeichnung; die menschliche Seite bekommt eine Kopie. Behebt auch einen latenten Fehler auf dem Weg gefunden: die Werkzeuge Block ignoriert die pro-Modell unterstütztToolUse-Flag, so dass ein Modell explizit als nicht unterstützende Werkzeuge markiert wurde immer noch schickte sie. 31 von 140 Modellen sind falsch markiert; ai_mcp_server_configs ist leerer Cluster-weit, so dass der heutige Explosionsradius Null ist. Suite ist 124 Tests, grün.

  20. · MediaService

    Akzeptieren Agenten-autorierte Reichweite in einen offenen Kreditnehmer Thread

    Der Outreach-Disermittler des Gegenstücks AIService ruft an. Ohne sie das Ganze ausgehender Pfad in einem aufgezeichneten 404 beendet - das Tor autorisierte eine Berührung, die Botschaft wurde komponiert, und es gab nirgendwo, um es zu setzen. Eigentum bleibt gespalten absichtlich: AIService entscheidet WHETHER eine Berührung kann ausgehen und schreibt den Text, dieser Dienst stellt ihn auf. Schreiben Sie diese Zeilen von AIService würde Gabel Eigentum an der Transkription an den Dienst, der weder den Chat besitzt Tabellen noch die Steckdose. Zwei Dinge, die es nicht tun wird. Es schafft nie ein Gespräch - Outreach kann wieder aufgenommen werden ein Thread der Besucher bereits geöffnet, nie zaubern ein Chat-Fenster auf jemanden, der nicht. Und es kreuzt nie orgs: ein Lead uid Auflösung zu einem anderen Org-Ticket würde einen org-Agenten in das Gespräch einer anderen org stecken, so dass die org gegen das Ticket überprüft, anstatt vom Anrufer vertraut zu werden. Die Nachricht wird dem Sitzungsmitglied zugeschrieben, genau als Besuchermeldung ist - NICHT an den zugewiesenen menschlichen Offizier. Eine KI-komponierte Botschaft als obwohl eine benannte, lizenzierte Person schrieb es ist, was eine KI-Offenlegung Regel existiert, verhindern. sicherzustellen, dass die Zuschreibung vor der NATS veröffentlichen, weil der Verbraucher verwendet DeliverPolicy.New: Publishing zuerst würde die Botschaft beharren, aber fallen Sie es aus jeder angeschlossene Kunde. Gibt sowohl id als auch messageId, so dass das Outreach Audit-Log bezieht sich auf die Nachricht und nicht auf den Thread. 404 wenn kein offener Faden existiert, so der Anrufer zeichnet einen sauberen Ausfall statt der Annahme Lieferung.

  21. · AIService

    Outbound Trigger, Planer und Web-Chat Versand

    Macht die Outreach Spine tatsächlich Feuer. Das Tor, Kontaktzustand, Zustimmung und Audit existierte bereits; nichts verursachte eine Berührung zu bewerten. - NATS für AIService über eigene k8s/configmap.yaml (jeder Java-Dienst trägt seine eigene k8s dir; KlusterServices hält nur Cluster infra). JetStream wird absichtlich OFF verlassen: NatsConfig behauptet seinen eigenen Replikationsfaktor zentral geplante Streams beim Start, und AIService abonniert nur den Kern NATS und veröffentlicht nichts, so ermöglicht es nichts gewinnen und riskieren eine zweite Service behauptet Replik zählt. - AgentOutboundConsumer abonniert security.leads.rt. LEAD_CREATED/LEAD_UPDATED. Der Verlag gibt auch Lock- und Statistik-Ereignisse aus - Kontaktaufnahme zu einer Person, weil ein Kollege nahm eine Bearbeitung Sperre auf ihre Aufzeichnung ist nicht vertretbar. Ids kommen als Strings vom Verleger an, so dass sie geparst werden als Text und nicht als "Long(). - AgentOutboundScheduler wertet Zeitauslöser unter vier Grenzen aus: org set abgeleitet von Agenten, die tatsächlich Outreach auf (capped), eine dünne gleitende Zeit-Slice so Kosten Tracks New-Lead-Rate statt Gesamt Lead-Zahlen, eine pro-tick Reihe Kappe, und eine Neubewertung Dämpfer so eine Bleiüberquerung während der ruhigen Stunden wird erneut verhandelt einmal statt jeder Tick für einen Tag. - Kompositionssaat textKomplett mit der PUBLISHED-Version kompiliert Prompt, nie der Entwurf, plus die Trigger-Intensität. Zusammensetzung Ausfall Aufzeichnungen FAILED; es gibt keine Fallback-Nachricht in Dosen. - WEB_CHAT Versand setzt nur einen vorhandenen Thread fort. Outreach kann wieder aufnehmen Konversation der Besucher geöffnet; es darf nicht zaubern ein Chat-Fenster auf jemanden der nie einen geöffnet hat. - SMS/EMAIL/SOCIAL_DM-Route zu einer aufgezeichneten FAILED, die die fehlende Konformität benennt Sanitär, so dass eine Org zeigt einen Trigger auf SMS sieht, warum in der Outreach-Log sofort, anstatt nichts passiert. 23 neue Tests; Suite ist 68 und grün.

  22. · kamo-internal

    Erforderlicher Text-Editor; dedupe KI allgemeine Einstellungen; fix Modell umschalten

    Fügt einen Editor für org-wide erforderliches Öffnen/Schlassenen Text hinzu - der Compiler und Spalten existierten, aber nichts konnte sie setzen, so dass die Fähigkeit tot war. Kopie stellt klar fest, dass Agenten es nicht entfernen können und dass Ersparnis es für jeden gilt Agent sofort, und der Toast berichtet, wie viele Agenten wurden eher wiederveröffentlicht als ein nacktes 'Saved', weil Live-Agenten einfach geändert haben, was sie sagen. Zwei bereits existierende Fehler auf dem Weg gefunden: - Der Schalter "Auto-select best available model" hat noch nie funktioniert. Das Frontend lesen data.autoSelectModel und gesendet autoSelectModel, aber das Backend kehrt zurück und erwartet autoModelEnabled - so dass das umschalten immer wahr gemacht und sein Wert war Verworfen auf jedem Speicher. Frontend-Seite behoben; es ist keine Serveränderung erforderlich. - AiGeneralSettings.tsx war toter Code, nie importiert, während eine wörtliche Inline Duplikat lebte am unteren Rand von SecurityModelsTab.tsx. Anstatt zu implementieren erforderliche Text zweimal, das Duplikat wird gelöscht und SecurityModelsTab importiert die gemeinsame Komponente. Auch ersetzt die Sales-Agenten Hilfe-Tipp, die noch gesagt, Benutzer die Funktion war in Kürze.

  23. · AIService

    Org-weit erforderlichen Text bestehen und sofort anwenden

    AiOrgSettings hat bereits erzwungenePreamble/forcedFooter und SalesAgentCompiler gewonnen faltet sie in jeden Agenten, aber der Einstellungs-Controller weder lesen noch geschrieben sie - so war die Fähigkeit tot: ein Speicher schien erfolgreich zu sein und kam zurück blank auf Reload. GET gibt nun beide Felder (einschließlich der No-Settings-Standards) und PUT zurück beharrt sie, Normalisierung leer zu null so Clearing ein Feld tatsächlich löscht es anstatt eine leere Schnur als verirrter Trennstrich einzuklappen. Erforderter Text tritt nun IMMEDIATELY in Kraft, indem er neu kompiliert und neu veröffentlicht jeder veröffentlichte Agent in der Org. Lassen Sie es auf jeden Agenten nächste veröffentlichen war billiger und ist eine Falle: ein Admin, der hinzufügt 'immer sagen, Sie sind ein automatisierter Assistent wird glauben, es ist live, und ein Agent niemand passiert, um wieder zu veröffentlichen würde unbestimmt weiter reden. Eine erforderliche Linie, die lautlos tut nicht gelten ist schlimmer als nicht bieten ein. Jeder betroffene Agent bekommt einen neuen gespeichert Kopie mit dem Warum beschriftet, und die Antwort berichtet, wie viele wurden so wiederveröffentlicht die Benutzeroberfläche kann sagen, was tatsächlich passiert ist, anstatt nur 'Saved'.

  24. · kamo-internal

    Ganzseitiges AI Sales Agent Studio, das die Modalitäten ersetzt

    Der Agent-Editor war ein 800px MUI Dialog, dessen gesamte Oberfläche eine 10-Row war textarea, auf der einen KI-Tab, die einen Dialog überhaupt verwendet. Es ist jetzt eine engagierte Route, und das Bearbeitungsmodell dahinter ist strukturiert und nicht ein Blob. - /settings/ai/sales-Agenten/neu - eine 720px-Spalte, nicht das Studio. Vorlagenkarten (die Karte IST die Industrie, also kein Industrieabbruch), dann zwei Bereiche: Name und ein Satz über das Geschäft. Ein Arbeitsmittel in weniger als einer Minute. - /settings/ai/verkaufs-agents/[id] - volle Breite, EIN Scrolling-Dokument mit klebrig Abschnitt Header, Inhalt bei 880px gedeckelt, so dass Single-Line-Eingänge nicht gestreckt werden über ein 4K-Display. Keine 240px-Nerv-Schiene: Neun Abschnitte ist ein Scroll-Spion-Job, nicht ein nav Job. - Try-it-out ist ein Header-Tipp und nicht eine permanent reservierte Spalte. leere Chat-Schale neben einem brandneuen Agenten ist Platz verschwendet, die als die liest Benutzer nicht zu füllen. - Bereitschaft ist eine geordnete, verunglaubbare Liste von dem, was helfen würde - nie ein Bruchteil. Ein Bruchteil sagt jemandem, dass er scheitert; eine Liste sagt ihnen, was sie als nächstes tun sollen. - Gesperrte Regeln machen verriegelt und unentfernbar, und nehmen einen Abschnitt über von Hand warnt, wenn es eines enthält (der Compiler stellt sie jetzt unabhängig wieder ein). - Header stellt klar fest, dass Bearbeitungen nur NEUE-Gespräche beeinflussen, weil prompt wird bei der Erstellung der Sitzung schnappt und Benutzer würden sonst zu dem Schluss kommen ihre Änderung funktionierte nicht. - outboundEnabled wird nur gesendet, wenn tatsächlich geändert: der Server 403s das Ganze PUT, wenn dieses Feld ohne MANAGE_SALES_AGENT_OUTREACH vorhanden ist, also einschließlich es in jeder Autosave würde das Studio für jeden, der dieses Recht fehlt zu brechen. Entfernt auch das doppelte Roh-Box "AI System prompt" aus dem Chat-Kanal Herausgeber. Es war ein zweiter, schwächerer Ort, um die gleiche Sache zu schreiben, ohne Versionierung, keine gesperrten Regeln und keine Geschichte - welcher Redakteur auch immer Sie passiert sind offen entschieden, was die Kunden hörten. Bestehende Aufforderungen immer noch auflösen; Kanäle mit einem jetzt eine Mitteilung, die auf Agenten zeigt. Copy trägt keinen KI-Jargon nach Design, und die Hardcoded Englisch-Industrie-Array ist ersetzt durch übersetzte Etiketten.

  25. · AIService

    Sales-Agent Compiler, Versionierung, Outreach-Gate; Tool-Wiedergabe fix

    Strukturierte Agenten-Konfigur kompiliert zur Systemaufforderung, friert pro veröffentlichtem Version, und gewinnt das Tor ein Agent muss vor der Aufnahme Kontakt passieren. Compiler - AgentConfig + SalesAgentCompiler: reine, deterministische Kompilierung von strukturierten Konfiguration in eine schnittige Eingabeaufforderung. Leer Abschnitte werden so eine Drei-Regel weggelassen Agent kompiliert nicht zu einem Dokument, das meist Überschriften ist. - Section-Level-Überschreitungen ("Schreiben Sie dieses Teil selbst") statt einer Dokumenten-Ebene Rohedit-Schalter: Ein Autor bekommt volle Ausdruckskraft auf einem Abschnitt, während jeder Andere Sektion kompiliert weiter, hält seine gesperrten Regeln und hält die Versionierung aufrecht. - Derselbe Mechanismus macht Migration byteikaisch - die Prosa eines Pre-Konfiguration wird als Ganz-Dokument-Überschreiben gespeichert und kompiliert unverändert zurück, so Migration Tag ist ein No-Op für Agenten bereits im Gespräch mit Kunden. Bewährt durch Test. - PhraseBank ist bewusst zwei Dimensionen, mit der guten Prosa auf dem TEMPLATE. Eine globale Bank, die auf jede Enum-Kombination gebunden ist, benötigt 90 handschriftliche Absätze, degeneriert in gestapelte Klauseln und würde jede Org mit dem gleichen öffnen Satz - das zerstört das, was ein Org kauft. - Sechs Vorlagen (Front-Desk und Inbound-Lead zuerst: sie sind horizontal und Abdeckung any org, dessen Vertikale nicht aufgeführt ist). Jedes Schiff gesperrt Compliance-Regeln ein Modell kann nie entfernen, überprüft durch Test. Lebenszyklus + Genehmigung - Veröffentlichen Sie Freezes {Konfiguration, kompiliertPrompt, Hasch, Modell, Provider; Rollback repunkte und stellt den Entwurf, so dass das Studio nie eine Sache zeigen kann, während der Agent dient einem anderen. - Controller ist zum ersten Mal berechtigt. Zuvor ANY authentifiziert Mitglied von any org könnte umschreiben, was diese Org zu seinen Kunden sagt. Fällt zurück auf MANAGE_AI_SETTINGS, so dass kein vorhandener Admin bei der Bereitstellung ausgesperrt ist. - Öffentlicher Chat bevorzugt die veröffentlichte Version der gefrorenen prompten Live-Zeit Schulungskontext und BriefmarkenvertriebAgentId/versionId auf der Sitzung - der Agent war dort bereits gelöst und wurde weggeworfen. - AI-assistierte Ausarbeitung: ein Satz in, überprüfbare Konfiguration aus. Gesperrte Regeln sind im Code übertragen, nie dem Modell gezeigt, so dass eine Compliance-Zeuse niemals durch Anleitung gelöscht werden. Outreach-Gate (alle 14 Regeln getestet) - Opt-out schlägt jede andere Prüfung UND wird als Grund angegeben, weil die Grund gegen eine Verweigerung aufgezeichnet ist selbst der Beweis. - SMS ohne Einwilligungsnachweis wird verweigert: unter TCPA liegt die Beweislast auf der Absender, so Fehlen eines Datensatzes ist das Fehlen einer Zustimmung. - Ruhige Stunden werden beurteilt, wo das KONTAKT ist, nicht wo das Geschäft ist. - Gescheite Sendungen geben das Touch-Budget nicht aus; unterdrückte Sendungen tun es auch nicht, oder ein Block würde in das Blockieren alles nach ihm kaskadieren. - Das Tor versagt GESCHLOSSEN - ein Outreach-Gate, dass Fehler öffnen sendet Nachrichten niemand autorisiert, das eine Versagen hier, das nicht rückgängig gemacht werden kann. Fixes auf dem Weg gefunden - Tool-Call-Historie-Wiedergabe wurde gebrochen: die TOOL-Reihe beharrte auf keinen Inhalt und die Assistant tool_use turn wurde nie durchgehalten, so dass Turn 2 einen Null-Content gesendet Blöcke. Die Bereitstellung von Werkzeugen hätte jedes Mehr-Turn-Gespräch verfehlt. - textComplete hatte kein Timeout (blockieren .get(), Pinning ein Thread auf einem langsamen Provider) und aufgezeichnet keine Nutzung, so dass jeder Helfer Anruf unsichtbar für die Abrechnung. - System-Partition in Kontextanpassung war ungedeckelt, so dass ein wortreicher Agent plus eine RAG Block könnte die ganze Geschichte verdrängen. - costEstimate ist jetzt nur auf dem Sync-Pfad bevölkert, von echten Provider-Tokens. Streaming bleibt null: es fabriziert Token als content.length()/4 und multipliziert dass durch einen realen Preis ergibt eine faktförmige Zahl, die falsch ist.

  26. · kamo-shared-library

    Strukturierte Sales-Agent-Konfiguration, Versions-Wirbel und Outreach-Staat

    Ersetzt den einzelnen Trainings-Kontext-Blob durch einen strukturierten, versionierbaren Agenten Modell, und fügt die pro-Kontakt-Rückwirbel ein Agent benötigt, bevor es initiieren kann Kontakt, anstatt nur zu antworten. - SalesAgent gewinnt configJson (jsonb-as-string, passende WebChatIntegration .designConfig), hatConfig, veröffentlicht VersionId, Publikum und OutboundEnabled. trainingContext wird als COMPILED OUTPUT beibehalten, so dass jeder bestehende Verbraucher hält die Arbeit unberührt. hatConfig ist explizit und nicht abgeleitet aus trainingContext ist leer, denn sobald es zusammengestellt ist Ausgabe ist es nie blank und jede Leerzeichenprüfung wäre unerreichbar. - SalesAgentVersion freezes {configJson, kompiliertPrompt, kompiliertHash, modelId, providerId' pro Veröffentlichung. Das Modell ist neben der Prompt gepinnt: Einfrieren Anweisungen, während das Modell Auto-Routen würde das Artefakt eine Halbwahrheit zu machen. - AiChatSession/AiUsageRecord Gewinn UmsatzAgentId + salesAgentVersionId. Zuvor "Welchen Agent hat das gehandhabt?" konnte nur beantwortet werden, indem man den Veränderlichen ging, nullable, non-FK WebChatIntegration.salesAgentId hop, so einen Kanal neu zuweisen stillschweigend neu zugeschrieben alle Geschichte. - AiOrgSettings gewinnt erzwungenPreamble/forcedFooter als NEUE ungültige Spalten eher als Wiederverwendung von StandardSystemPrompt, so Verschluss ist eine No-Op bis zu einem Admin füllt einen aus. Die Wiederverwendung des bestehenden Feldes hätte das Verhalten für jeden verändert org, die bereits eine bevölkert hatte, am Einsatztag. - AgentContactState + AgentOutboundTouch: pro Kontakt kanalunterdrücken, explizite Opt-out-Medien pro Kanal und zeitstempeln. Opt-out wird gespeichert als echte Spalten statt JSON, weil "beweisen Sie diese Zahl wurde unterdrückt auf dieses Datum" darf nicht von der JSON-Pfadextraktion abhängen. Die Touch-Log-Aufzeichnungen REFUSALS sowie sendet - ein Protokoll von Sendungen beweist, was Sie getan haben, ein Protokoll von Entscheidungen beweisen, was Sie nicht tun würden. - Rechte 168-173 aufgeteilt ************ MANAGE_AI_SETTINGS(53), die bisher nichts davon abgeschirmt.

  27. · kamo-internal

    AI Sales Agents Tab + pro Kanal Agent Zuordnung

    Baut /settings/ai?tab=sales-Agents (war ein Stub): orgs erstellen Agenten für ihre Vertriebsindustrie, entweder aus einer eingebauten Vorlage oder durch das Schreiben des Trainingskontextes selbst, dann bearbeiten/aktivieren/löschen. Chat-Kanäle (/einstellige/funktionelle/chat) können nun jeden auswählen, welcher Agent das antreibt Channel's KI, unabhängig davon, der Agent überschreibt die rohe Systemaufforderung.

  28. · SecurityService

    Enrich Kreditnehmer Chat Routing + erfassen Thema-Eigentum Staat

    Chat-Routing gibt jetzt die zugewiesene Offizier NMLS, Titel, Foto, Telefon, E-Mail und ob sie eine gültige Lizenz für den Betreff-Eigentumszustand besitzen, zuzüglich der geben Sie sich an und ob wir noch darum bitten müssen. Wiederverwendet die SAFE-Act-Karte gelöste Daten, so dass der Chat nie eine gefälschte Identität zeigen kann. Fügt POST /portal/subjekt-state hinzu: wenn die Führung noch keinen Eigentumsstaat hat, Kreditnehmer kann es aus Chat setzen; es fließt durch patchEstimate (und seine Zuordnung Pool-Wein-Eintritt) wie jede andere behauptete Tatsache, die die Lizenzlinie freischaltet.

  29. · MediaService

    Zuweisen Sie einen Vertriebsmitarbeiter pro Kanal + Bericht LO Verfügbarkeit

    - WebChatIntegration CRUD Gewinde VertriebAgentId (null kläre die Zuordnung) - lo-presence gibt jetzt die Verfügbarkeit des MitgliedsStatus neben online zurück, so dass die Widget kann einen realen Status anstelle eines nackten dot zeigen. Cross-Ordner-Sonde noch nur zurück {online:false].

  30. · AIService

    Verkaufs-Agent CRUD, Hypothekenvorlage und Agenten-gesteuerte Chat-Prompt

    - AiSalesAgentController (/api/ai/Sales-Agent-Agenten): org-scoped CRUD + GET /templates - SalesAgentTemplateRegistry: eingebaute Startervorlagen, beginnend mit einem Hypotheken-Kreditnehmer-Assistent (Compliance-bewusst: keine verbindlichen Zinssätze, nein Genehmigungsversprechen, verschiebt sich an den lizenzierten Kredit-Offizier, fragt nach Subjekt Zustand) - PublicAiChatService: Der zugeordnete Schulungskontext von SalesAgent wird zur Spitze Ebene des prompten Wasserfalls (Agent -- Integration prompt - . org -- generisch)

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