Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· kamo-internal
Wybrane przydziały masowe prowadzi do członka zespołu
Siatka miała już wiele wybranych skrzynek kontrolnych, ale nie ma nic wspólnego z wyborem. Sprawdzanie wierszy ujawnia teraz akcję Reassign obok innych akcji leadowych, zamknięte Na REASSIGN_LEADS_MANUALLY (serwer sprawdza go; jest to tylko wygoda). Używa czekRight, a nie checkRole, więc tryb godowy pasuje do backendu, który ma Bóg Obwodnij — CheckRole nie obejmie i rozejdzie się dla użytkowników boga. Okno dialogowe wybiera jeden element docelowy według wyszukiwania, przyjmuje opcjonalną notatkę i Mówi z góry, że członek zostanie wysłany e-mailem, ponieważ jest to punkt wyjścia. Funkcja. Indigo/blue zamiast pomarańczowy/różowy Hot Reassign: to jest a Celowe masowe działania administratora, a nie pilne przeniesienie połączenia. W czeku nagłówek wybiera każdy wiersz w sieci po stronie klienta — tysiące dla Duży org - więc 250 czapki jest również egzekwowane tutaj. W przeciwnym razie nagłówek "Wybierz wszystko i przypisać" przepływ awarii serwera tylko po tym, jak użytkownik miał Napełniony całym dialogiem, z nietłumaczalnym błędem. Wybór jest usuwany przez selectIdsRef przed przeładowaniem: loadLeads Ponowne wybranie tego, co ten ref trzyma, więc pozostawienie go zamieszkuje ponownie sprawdzić Krzyki po prostu się poruszały. Komunikat wynikowy jest skomponowany, a nie inny-if łańcuch, Ponieważ partia może być zarówno częściowa, jak i niezgodna z informacją, a łańcuch zgłaszany tylko Pierwszy.
· SecurityService
Punkt końcowy złudowej, ogrodzony na REASSIGN_LEADS_MANUALLY
POST - przenosi partię leadów do jednej drużyny Członek i e-maile, którego członek raz za całą partię. Autoryzacja wykorzystuje REASSIGN_LEADS_MANUALLY (149) — prawo nazwane dokładnie To. Jest to bardziej rygorystyczne niż ścieżka jednoołowiowa na PUT / ołówek / aid, która Kontrole ASSIGN_LEADS; ponowne przypisanie stu śladów to inny promień wybuchu Od ponownego przydziału jednego i tych dwóch praw istnieją, aby mogły zostać przyznane oddzielnie. Nieprzypisana poziom widoczności jest również egzekwowana. Przypisanie jest widocznością Dotacja: gdy trop jest przypisany do rozmówcy, czyta się jako "przypisany do mnie", który Wynosi nieprzypisany odczyt 403 i pomija maskę informatyczną. Bez tego Sprawdź dzwoniącego trzymającego 149, ale nie VIEW_UNASSIGNED_LEADS może samodzielnie przypisywać leady Siatka ukrywa się przed nimi i pra sobie je w w pełni czytelne. Pominięty Prowadzi raport NOT_FOUND — dopasowując się do tego, co pokazuje ich własna siatka — więc odpowiedź Nie można wyliczyć ukrytych lub zagranicznych tropów. Ta partia celowo nie jest wszystkim lub nic: każdy przypisuje bieganie w swoim własnym Transakcja i zły id stają się przeskokiem, ponieważ odrzucenie dziewięciu dobrych Przesunięcia w dziesiątej są gorsze niż zgłoszenie, którego nie wziął. Zatrzymany na 250 na połączenie, aby związać zarówno zamki w rzędzie, jak i wentylator w czasie rzeczywistym. Intifier usuwa swoje dane w krótkiej transakcji za pomocą oddzielnej fasoli i wysyła później, więc połączenie wylotowe z odczytem z 30s r. nigdy nie przypina Połączenie CRDB. Przekroczenie granicy fasoli jest również tym, co sprawia, że jest to ?Transactional Obowiązywać w ogóle – samopowodzenie byłoby po cichu prowadzone bez transakcji i LAZY stowarzyszenie użytkowników rzuca.
· EmailService
Przykładowe zmienne dla szablonu LEADS_ASSIGNED
Bez sprawy tutaj Podgląd szablonu administratora renderuje nowy szablon z każdym pustem symbolu zastępcze, który czyta się jako zepsuty szablon, a nie Niewypełniony jeden. notesBlock jest wstępnie oddany HTML, ponieważ renderer nie ma Warunki - nadawca załamuje go do "", gdy nie ma żadnej nuty.
· kamo-shared-library
LEADS_ASSIGNED szablon email; twardo przypisaćLead do użytku masowego
Przywód miał zero dzwoniący i nigdy nie prowadził produkcji. Przed okablowaniem Ścieżka zmiany podziału masowego, daje mu gwarancje, których potrzebuje ścieżka: - wziąć orgId i zweryfikować obu trop, a nowy cesjonariusz należy do niego, więc Przesada nie może dotrzeć do najemców (zgłoszonego jako „nie znaleziono” zamiast niż "Zakazany", więc błąd nie może być użyty do zbadania zagranicznych idłówców) - zablokować wiersz za pomocą findByUidForUpdate: ręczne przeładowanie i równoczesne Akceptacja basenu celuje w ten sam trop i w przeciwnym razie przeplatałaby się w przegraną Aktualizacja - wyczyść flagi basenu, odzwierciedlając CreditLeadAssignmentService. Ołów oznaczony dla Auto-alokacja, w przeciwnym razie pozostaje w basenie po tym, jak została zabrana za rękę i Wyjmuje się spod nowego właściciela - opublikować routing czatów, jak już robi aktualizacjaLead, więc pożyczkobiorca jest otwarty na żywo Czat podąża za tropem, zamiast pozostać z poprzednim oficerem Dodaj również szablon kanoniczny LEADS_ASSIGNED. Klucz musi być w CANONICAL_KEYS lub nigdy nie można go rozsiać i nigdy nie może się unieważniać, a każdy send Zwraca stałe 404.
· kamo-shared-library
Dodaj MANAGE_ORG_BRANDING (174)
Punkty końcowe Org branding (logos, kolory, tła, zaopatrzenie w tematyce) były Tylko właściciele lub-bog, nie pozostawiając możliwości delegowania marki bez przekazania Własność orgi. Dodaje prawo do delegowania; sprawdzanie przez właściciela pozostaje jako Domyślna dotacja, aby obecni właściciele nadal pracowali bez przydzielenia jej.
· kamo-internal
Autorowe matryce kwalifikacyjne z panelu katalogowego
Bez matrycy obejmującej obłożenie i cel scenariusza, zwroty cenowe NO_COVERAGE — Tak więc wcześniej można było wycenić tylko zakup pierwotnego miejsca zamieszkania. Forma autorów a Matryca i jej komórki dla wybranego rodzaju granicznego, obłożenia i przeznaczenia, z komórką dodawania / umorzenia W rzędy, obok formy polityki blokady w tym samym panelu. Pozostawienie niesprawdzających autorów produktu jedną matrycą na produkt ACTIVE inwestora, ponieważ Zakres produktu matrycy NIE jest NULL i nie może wyrażać "wszystkich produktów" jako jednego wiersza.
· SecurityService
Autoryzowanie kwalifikacyjne-matryfika do przekaźnika; przebudowa podnosi w CV SUSPENDED
Przekaźniki POST - poprzez istniejący zapis org-stamping Pomocnik, więc twórcy stewardów mają się tylko dla własnego lokatora. Ten nacisk odbudowuje się również od zmiany wspólnej lib, która pozwala na wznowienie pożyczki SUSPENDED. kamo-wspólna biblioteka nie ma własnego CI - każda usługa klonuje i buduje ją ze źródła - Tak więc poprawka dociera do tej usługi tylko wtedy, gdy ta usługa się odbudowuje.
· kamo-internal
Odbuduj studio agenta jako przestrzeń pracy o pełnej szerokości
Usuwanie nasadki szerokości nie było poprawką; sam układ musiał być zaprojektowany Za przestrzeń, a nie tolerowaną w niej. Studio jest teraz trzy strefy obok siebie: - "Koleja wyjściowa" — odcinki, z bieżącym podświetleniem podczas przewijania (IntersectionObserver, ważony w górną, więc sekcja staje się aktualna, gdy jej nagłówek Dociera tam, gdzie naprawdę jest uwaga). Sekcje napisane ręcznie są oznaczone, więc a więc rękojeść, którą można znaleźć później, nie otwierając każdej z nich. - "Editor" — same sekcje, płytki w tylu kolumnach, co viewport trzyma zamiast jednej wąskiej wstążki. - "Rozmowa na świetlna" — prawdziwa kolumna na szerokim wyświetlaczu, a nie pasku, który Zawala treść po otwarciu. To jest pętla edycji i zegarka w studio Istnieje dla: zmień instrukcję, zobacz zmianę odpowiedzi, bez nawigacji. Instancja One TestDrivePanel, przesunięty, a nie powielany - montaż Dwukrotnie rozpoczynał dwie sesje wyrzucania. Poniżej xl spada pod edytorem jako Rząd o pełnej szerokości zamiast ściskać trzecią kolumnę na wyświetlacz bez pokoju Na jeden, a szyna kryje się całkowicie na małych ekranach.
· kamo-internal
Zasady blokady autora - bez jednego, żadna stawka nie może być zablokowana
RateCommitmentService odrzuca blokadę za każdym razem, gdy wynik niesie ze sobą nie lockPolicyVersionId ("wersja lock-policy jest wymagana"), a wynik przenosi tylko jeden, jeśli Inwestor ma opublikowaną wersję polityki blokady. Brak interfejsu użytkownika może go opublikować, więc blokada stawek Był nieosiągalny dla każdego najemcy – podczas gdy sam punkt końcowy był już zbudowany, org-gated I zaprzesługuje poprawnie. Brakowało tylko metody klienta i tego formularza. Formularz przyjmuje oferowane okresy blokady jako zamówioną listę, ponieważ FIRST staje się Domyślnie, więc celowo ich nie sortuje; wpisy, które nie są pozytywną całością Liczba dni jest upuszczana, a nie wysyłana jako zły termin blokady.
· kamo-internal
Pokaż, jak radzi sobie każdy agent
Dodaje sekcję performance na górze studia agenta: rozmowy, jak Często osoba przejęła i co to spowodowało, że to spowodowało, zasięg i koszty. Pisemne tak, że żadna liczba nie może wprowadzić w błąd: - Zero renderuje jako słowo "nigdy", nigdy 0. - Udział renderuje tylko wtedy, gdy jest mianownik; w przeciwnym razie "Brak rozmów Jeszcze się nie porównać z'. Nie ma procentów zerowych. - Kiedy nic w okresie nie było ceny, nie wykazuje żadnej ceny - Wystarczy wyjaśnienie, że ceny zostały ustalone po tym, jak doszło do ruchu. Częściowy Relacja pokazuje ilość plus tego, ile odpowiedzi na to brakuje. - Tłumiony zasięg jest przedstawiany jako cecha: "Te są trzymane na Cel - to twój zapis, dlaczego nie skontaktowano się z kimś. - Nieznane kody enum degradują się do czytelnego tekstu, a nie surowej ścieżki klucza. Usunięto komunikat perwersyjny i kolumny ręczne: API nie agreguje Wszystkie one na wersję, więc te komórki renderowałyby sfabrykowane 0, jakby Zostało zmierzone. Same rozmowy odpowiadają na to, po co jest tabela - która została zapisana Kopiowanie obsługi, który ruch. Złożony w istniejący dokument scrolling study zamiast w nową kartę, i Utrzymywane z listy agentów, gdzie najnapięta 0 przeciwko każdemu agentowi byłaby dokładna Unikaj błędnego odczytania.
· AIService
Karta wyników na per-agent
Co właściwie zrobił każdy agent: rozmowy, jak często dana osoba musiała przejąć kontrolę I dlaczego, wyniki zasięgiem, w tym te, które się zatrzymali, i ile to kosztowało. Każdy numer jest jednym, który dane mogą faktycznie obsługiwać. Trzy rzeczy są celowo NIE tutaj: - "Bez sum tokenów". Są prawdziwe na ścieżce synchronizacji i są sfabrykowane na Transmisja strumieniowa jednego (content.length()/4), więc każda całość jest wymyślona. Odpowiedzi na koszty To samo pytanie uczciwie uczciwie, ponieważ jest to raczej nieważne niż zgadywać, gdzie Cena nie jest znana. - Brak rozdzielczości lub współczynniku ugięcia. - Nic nie obserwuje, czy rozmowa Dobrze się skończyło, a "nie doszło do przekazania" nie jest dowodem sukcesu. - "Brak wiadomości per-wersyjnych lub liczenia przekazów." Nie są one agregowane za jednym agregowanym na Wersja, a emitowanie 0 dla nich byłoby wytworem renderowanym jako Pomiar - dokładna awaria, której ten ekran istnieje, aby uniknąć. Koszt niesie ze sobą wyraźną śledzoną flagę i kwotę zerową, a nie 0, gdy Nic w oknie nie było wyceniane, więc org, którego ruch wyprzedza ceny, widzi "niezarejestrowane" zamiast pewnego 0.00 dolara. CenaCalls jest raczej autorytetem W porównaniu z sumą, więc prawdziwe zero od cennych darmowych połączeń nadal brzmi jak Śledzone. Prosa transskrypcji jest zamykana na VIEW_SALES_AGENT_TRANSCRIPTS oddzielnie od counts - podsumowanie konkretnego odwiedzającego model jest treścią konwersacji, a nie - Emetria. Agenci bez ruchu zwracają strukturalnie kompletną pustą kartę wyników: Agent, którego brakuje na liście, czyta się jako błąd, agent obecny z zerami czyta Tak jak prawda. parseHandoffArguments jest teraz dzielony ze ścieżką czatu, a nie ponownie wdrożony, Tak więc przymus wymyślonych powodów dla innych nie może dryfować między nimi. Apartament jest 150 testów, zielony.
· kamo-shared-library
Grupowane kwerendy zagregowane dla karty wyników agenta
Dwanaście agregatów ćwiekowych w sesjach, wiadomościach, rekordach użytkowania i wyjeździe Dotknięcia, więc karta wyników to garść grupowych zapytań, a nie ładowanie wierszy W pamięć. Dwie właściwości są egzekwowane w predykatach, a nie pozostawione dzwonionym: - "Jez" sesje testowe są wykluczone w samym zapytaniu. "Na młodym agencie Własne napędy testowe autora byłyby w przeciwnym razie większością danych i dzwoniącą, który Zapamiłty do filtrowania wytwarzają liczby, które wyglądają na prawdziwe i nie są. - "count(costEstimate) liczy tylko koszty NON-NULL. " Karta wyników odróżnia "nic nie była wyceniana" od "to koszt zero" - zapadanie się Postawiłoby to pewny 0,00 dolarów przed orgiem, którego ruch po prostu Precyzją ceny. Dotknięcia wychodzące są pogrupowane przez decyzję, a nie filtrowane do wysyłania. Ws. o. w tym, że w tym, poty o., w tym, w tym, że w tym, w tym, że w tym, w tym, w tym, w tym, w tym, w tym, w tym, że posą ot. w Odmowa jest tym ciekawsza połowa: agent, którego dotknięcia to prawie wszystkie SUPPRESSED_QUIET_HOURS jest błędnie skonfigurowany, a to jest niewidoczne, jeśli dekodatory są Odrzucony.
· kamo-internal
Edytuj to, ile kosztuje każdy model
Dodaje edycję ceny na model do ekranu konfiguracji dostawcy. Ceny są wystawione na Opublikowana cena katalogowa każdego sprzedawcy, gdzie ją znamy, i puste tam, gdzie nie - Koszt pusty nie jest śledzony dla tego modelu, który jest lepszy niż Liczba, która jest z pewnością błędna. Kopia każe ludziom sprawdzić rozstawione liczby na podstawie własnego rachunku, a nie Przedstawianie ich jako autorytatywnego. Naprawia błąd wyświetla uchwycony w recenzji: przycinanie zera ciągnące wywrzeszyłoby Cena 10 jako 1. Teraz usuwa zera dopiero po punkcie dziesiętnym.
· AIService
Modelowanie katalogu cenowego, ścieżka zapisu i zasypania
Rachunkowość kosztowa nigdy nie zadziała: AiModel ma kolumny cenowe, AiModelController Czyta je i ChatOrchestrationService czyta je w celu obliczania kosztówEstimate - ale Nic nie napisało ich nigdzie. Modele są tworzone tylko przez odkrywanie dostawców, a Ceny nota dostawcy API zwracają. 140 modeli, 0 wycenionych, bez ścieżki, przez którą Może się zmienić. Kolumny były strukturalnie nieosiągalne. Trzy części: - ModelPricingCatalog dostawca nasion LICZNIKC przy odkryciu, dopasowany do a Znormalizowany identyfikator z regułą przedrostka łącznikowego, więc gpt-4 nigdy nie może Roszczenie gpt-4o. Modele niezwiązane z czatami (TTS, osadzanie, w czasie rzeczywistym) są odrzucane przez Powtórne wykorzystanie istniejącego czeku modalności - rozliczają się z innego arkusza. - Punkt końcowy PATCH + UI więc org może skorygować lub wyczyścić cenę. Org-scoped dokładnie Podobnie jak istniejący DELETE. - Wypełnienie wypełnia tylko kolumny NULL, na kolumnę niezależnie i nigdy Nadpisuje to, co ustawiono org - w przeciwnym razie sprawi, że ceny będą edytowalne, byłoby Kłam. Idempotent, i zapakowany, więc księgowość kosztów nigdy nie może zablokować rozruchu. "Model, o którym nie jesteśmy pewni, czy nie dostaniemy ceny, a nie zgadywany". GPT-5, o3, większość Mistral, DeepSeek, xAI, Cohere i Meta są celowo puste; OpenRouter i HuggingFace nigdy nie pasują do projektu, ponieważ rozliczają własne stawki A odziedziczenie cen upstream byłoby domysłem. Niewłaściwa cena wytwarza a Liczba w kształcie faktury, która jest pewnie błędna - ten sam koszt jest nadal Nie oblicza się na ścieżce strumieniowej, gdzie liczba tokenów jest sfabrykowana. Konwersja do kolumny per-1k używa RoundingMode.UNNECSARY celowo: cena Potrzeba więcej niż 6 dziesiętnych rzuca w klasę, a nie po cichu przechowując Powód i jest pusty. Apartament jest 145 testów, zielony.
· kamo-internal
Pokaż kontekst przekazania AI agentowi przejmujemu
Renderuje zdarzenie systemowe AI_HANDOFF jako karta z powodu, podsumowaniem AI, I składany do tej pory transkrypcja rozmowy - więc pożyczkobiorca to robi Nie musisz ponownie wyjaśniać się osobie, która odbiera. Trzy zdegradowane stany są wyraźne i widoczne, a nie ciche: transkrypcja Niedostępne, transkrypt skrócony i ładunek rozebrany w tranzycie. Agent musi Nigdy nie bądźcie wiary, że mają pełny kontekst, gdy tego nie robią. Odwiedzający i agent dzielą się jednym tematem STOMP, więc rama na żywo przybywa zredagowana (the Podsumowanie AI to prywatna ocena gościa i nie może przejść do ich Przeglądarka). Zamiast mówienie agentowi, aby przeładował, karta ponownie odczytuje pełny rząd Raz z własnego uwierzytelnionego punktu końcowego. Ponowna przeczytat jest zatwierdzana, zanim zostanie włączony przyjęta - odpowiedź, która wróciła, została odrzucona, a nie została wykorzystana, a nie zastosowana, Tak więc ostrzeżenie może być jasne tylko wtedy, gdy kontekst został naprawdę zdobyty. Każda porażka Odpada do wiadomości o przeładunku.
· APIService
Proxy publiczna sztuczna inteligencja -> ludzka trasa handoff
Dodaje POST - proxied do MediaService Oprócz swojego rodzeństwa createSupsportsion. Bez tego funkcja przekazania była martwa po przyjeździe: punkt końcowy MediaService Wymaga X-Internal-Auth, X-Public-Chat-Org-Id i X-Public-Chat-Key-Hash, Które tylko ta brama wstrzykuje, więc widget jest tutaj i nigdy nie widżetuje Dotarłem do niego. Przechowywa ten sam warunkowy - strażnik, co createSupSportession. Handoff biegi Pełna ścieżka tworzenia sesji, więc proxy, tak nagie, że pozostawiłaby Trasa tworząca bilety, która omija dowód pracy, który jego rodzeństwo egzystuje.
· MediaService
Przenieś rozmowę AI do ludzkiego wątku na przekazy
Tworzy lub ponownie wykorzystuje sesję wsparcia, kopiując transkrypcję sztucznej inteligencji jako jeden system Impreza, przemierza je i szczerze mówi odwiedzającym, co dzieje się dalej. Poufność jest podzielona przez publiczność, którą pierwsza przepustka cofnie. W tym, że w tym, w tym, że w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w Podsumowanie AI i powódSzczegóły są jej prywatną oceną odwiedzającego, a także Pełna ładowność docierała do własnej przeglądarki odwiedzającego przez dwa drzwi REST i Rama STOMP, podczas gdy agent nic nie widział. Redakcja ma teraz zastosowanie w każdym Ścieżka zorientowana na odwiedzających; utrzymujący się rząd zachowuje pełny ładunek dla agenta. chat.session.'d' to jeden temat, do którego piszą się obaj odbiorcy, więc na żywo Rama jest cięta do tego, co odwiedzający może zobaczyć, a agent UI ponownie odczytuje pełny rząd Z własnego uwierzytelnionego punktu końcowego. Idempotencja jest kluczowana do aiSessionGuid, org-scoped, i sprawdzi się przed utworzeniem - Co się dzieje. Kluczowanie na sesji i sprawdzanie po stworzeniu - oczywiste Kształt - jest bezużyteczny dokładnie, gdy ma znaczenie: próba, która straciła sesję Token zawsze przechodzi kontrolę i produkuje zduplikowany bilet i drugi agent Strona. TranskrypcjaAttached teraz informuje, co tak naprawdę się stało. Wcześniej wrócił. Prawdziwie nawet wtedy, gdy pismo po cichu zawiodło, co jest najgorsze z możliwych. Kombinacja: odwiedzającemu mówi się, że ich kontekst się pojawił, wątek agenta jest Pusty, żadna partia nie wie. Kopiuj-na rękę, a nie migrację: AI zamienia się tam, gdzie odczytuje je analityka.
· AIService
Wtajemniczona przez agenta przekazanie człowiekowi, z kontekstem
Sztuczna inteligencja nie mogła wcześniej poprosić o osobę: zasady eskalacji osiągnęły model za pomocą skompilowanego monitu, ale nie było sygnału do odczytu maszynowego z powrotem, więc Model mógł tylko powiedzieć, że kogoś pobierze i nic się nie stało. - Syntetyczne narzędzie kamo_request_human, opisane z własnego urządzenia Tytuły reguł eskalacji, aby model widział identyczne warunki spustowe w - Wywołanie i narzędzie. Przechwycony przed wysyłką MCP - jest to sygnał, a nie Prawdziwe wywołanie narzędzia - a wiersz TOOL, który utrzymuje, jest tym, co sprawia, że powód jest trwały I gotowe do analizy z zerową nową kolumną. - Załączony TYLKO, gdy kanał faktycznie ma włączone wsparcie na żywo. Ręce na a Tylko na podstawie sztucznej inteligencji narzędzie, które obiecuje człowiekowi, który nigdy nie może przybyć, jest gorsze niż Brak narzędzia: widget nie ma karty Wsparcie, więc sygnał jest upuszczony i Odwiedzający czeka na kogoś, kto nigdy nie przychodził. - Nowy wewnętrzny punkt końcowy zwraca powód przekazania, podsumowanie AI dla każdego, kto Przejmuje, a następnie transkrypcja UŻYTKOWNIKA/ASSISTANT. Wiersze TOOL i SYSTEM są Wykluczony - człowiek potrzebuje rozmowy, a nie maszyny. - powódDetail and summary zostały celowo wstrzymane z przeglądarki odwiedzającego: To prywatna ocena modelu odwiedzającego. Tylko /proszono, Powód jest przesłany do klienta; MediaService pobiera resztę serwera. - Zakręty AI nigdy nie są przesuwane ani usuwane. AiChatMessage pozostaje w systemie analitycznym Zapisek; strona ludzka dostaje kopię. Naprawia również ukryty błąd znaleziony po drodze: blok narzędzi zignorował per-model Obsługuje flagę ToolUse, więc model wyraźnie oznaczony jako niepodobny do narzędzi niepodtrzymujących - Nadal je wysyłał. 31 ze 140 modeli jest oznaczonych false; ai_mcp_server_configs jest O szerokości pustego gromady, więc dzisiejszy promień wybuchu wynosi zero. Apartament jest 124 testami, zielony.
· MediaService
Zaakceptuj agent-autor-autor w wątku open pożyczkobiorcy
Rozejmy dyspozytora AIService dzwoni. Bez tego całość Ścieżka wychodząca zakończona w nagranym 404 - brama autoryzowała dotyk, Wiadomość została skomponowana i nie było gdzie go umieścić. Własność pozostaje dzielona celowo: AIService decyduje, że JESTEM, który może wydostać się dotknięcie I pisze tekst, ta usługa go umieszcza. Pisanie tych wierszy od AIService Czy może nawiązać własność transkrypcji do usługi, która nie jest właścicielem czatu Stoły ani gniazdo. Dwie rzeczy, których nie zrobi. To nigdy nie tworzy rozmowy - zasięg może zostać wznowiony Wątek, który gość już otworzył, nigdy nie wyczapił okna czatu na kogoś, kto Nie zrobił tego. I nigdy nie krzyżuje orgs: ołów rozdzielczy do innego biletu org Wsadziliby agenta jednego orga do rozmowy innego orga, więc org jest Sprawdzone na bilecie, a nie zaufany od dzwonionego. Wiadomość jest przypisywana członkowi sesji, dokładnie jako wiadomość odwiedzającego Czy jest - nie do przydzielonego ludzkiego oficera. Renderowanie wiadomości złożonej w ramach sztucznej inteligencji jako Chociaż osoba wymieniona, licencjonowana napisała, że jest to, co istnieje reguła ujawniania sztucznej inteligencji. Zapobieganie. ZapewnijSubskrypcję poprzedza publikację NATS, ponieważ konsumencki korzysta DeliverPolicy.New: publikowanie najpierw utrzymałoby wiadomość, ale wycofałoby ją z Każdy połączony klient. Zwraca zarówno id, jak i komunikatId, więc dziennik audytu zasięgu Odwołuje się do wiadomości, a nie do wątku. 404, gdy nie ma otwartej nici, Tak więc dzwoniciel rejestruje czystą awarię zamiast zakładać dostawę.
· AIService
Wyjście wyzwalacze, harmonogram i wysyłka web-chat
Sprawia, że kręgosłup faktycznie strzela. Brama, państwo kontaktu, zgoda i Audyt już istniał; nic nie spowodowało oceny dotyku. - NATS włączone dla AIService za pośrednictwem własnej k8s/configmap.yaml (każda usługa Java Posiada własny k8s dir; KlusterServices posiada tylko klaster. JetStream na żywo Celowo opuszczona jest OFF: NatsConfig twierdzi, że jest jego własnym czynnikiem replikacji przeciwko Centralnie zaopatrzone strumienie przy starcie, a AIService subskrybuje tylko rdzeń NATS i nic nie publikuje, więc umożliwienie jej niczego nie zyska i ryzykowanie sekundy Serwis zapewniający liczbę replik. - AgentOutboundKonsumer subskrybuje security.leads.rt.> i zużywa TYLKO LEAD_CREATED/LEAD_UPDATED. Wydawca emituje również wydarzenia z blokady i statystyki - Dotarcie do osoby, ponieważ kolega wziął blokadę edytową na swoim rekordzie Nie jest możliwe do obrony. Ids przybywają jako sznurki od wydawcy, więc są przeanalizowane W przeciwieństwie do tekstu niż na długo;). - AgentOutboundScheduler ocenia wyzwalacze harmonogramu w czterech granicach: zestaw org Pochodzący z czynników, które faktycznie mają zasięg (ograniczone), cienkie przesuwne Czas plastruje więc koszt toczy nową stopę ołowiu, a nie całkowite leady, a na rzęd. Nakrętka i tłumika ponownej oceny, dzięki czemu przechodzenie przez ołów w godzinach cichych jest ponownie wypróbowane Raz, zamiast każdego kleszcza przez jeden dzień. - tekst nasion składuUżycie z skomkulowaną wersją PUBLISHED, Nigdy projekt, plus intencja spustowa. Rekordy niepowodzeń składu FAILED; Nie ma żadnego w puszkowanego przekazu awaryjnego. - Wysyłka WEB_CHAT kontynuuje istniejący wątek. Zasięg może wznowić Rozmowa zwiedzającym otworzyła; może nie wywoływać na kogoś okna czatu Którzy nigdy go nie otworzyli. - SMS/EMAIL/SOCIAL_DM trasa do zarejestrowanego FAILED, nazewnictwu brakującej zgodności Wszczepianie, więc org wskazujący spust na SMS widzi, dlaczego w dzienniku zasięgów Natychmiast zamiast niczego się nie dzieje. 23 nowe testy; apartament ma 68 i zielony.
· kamo-internal
Wymagany edytor tekstu; dedupe ustawienia ogólne AI; przełącznik modelu fix
Dodaje edytora do wymaganego tekstu otwierającego/zamykającego o szerokości org - kompilator i Kolumny istniały, ale nic nie mogło ich ustawić, więc zdolność była martwa. Kopiuj stwierdza wyraźnie, że agenci nie mogą go usunąć i że oszczędzanie stosuje go do każdego. Agent natychmiast, a toast informuje, ilu agentów zostało ponownie opublikowanych. To nagie "uwalone", bo żywa agenci po prostu zmienili to, co mówią. Dwa wcześniej istniejące błędy znalezione po drodze: - Przełącznik "Autoselect best available model" nigdy nie zadziałał. Frontend Odczytuj data.autoelectModel i wysłał autoSelectModel, ale backend powróci i Spodziewa się autoModelEnabled - więc przełącznik zawsze staje się prawdziwy, a jego wartość była Odrzucony na każdy ratunek. Stała wersja frontendowa; nie jest konieczna żadna zmiana serwera. - AiGeneralSettings.tsx był martwy kod, nigdy nie importowany, podczas gdy dosłownie w linii Zduplikowanie żyło na dnie SecurityModelsTab.tsx. Zamiast wdrażać Wymagany tekst dwa razy, duplikat jest usuwany, a SecurityModelsTab importuje Współdzielony komponent. Zastępuje również agentów sprzedaży, która nadal mówi użytkownikom, że funkcja jest Przyjdzie wkrótce.
· AIService
Wytrwać wymagany tekst org i natychmiast go stosować
AiOrSettings zyskały wymuszonyPream/forcedFooter i SalesAgentCompiler już Składa je na każdego agenta, ale kontroler ustawień nie czytał ani nie pisał oni - więc zdolność była martwa: ocalenie wydawało się, że odniosło sukces i wróciło Pusty na przeładowaniu. GET zwraca teraz oba pola (w tym w przypadku niewykonania zobowiązań) i PUT Utrzymuje je, normalizując puste do zerowej, więc oczyszczenie pola faktycznie je oczyszcza Zamiast zostawiać pusty sznurek do złożenia jako bezpańskiego separatora. Wymagany tekst teraz wchodzi w życie natychmiast, poprzez rekompilowanie i ponowne publikowanie Każdy opublikowany agent w orgu. Wpuszczanie go do następnego opublikowania każdego agenta Był tańszy i jest pułapką: administrator, który dodaje "zawsze mówi, że jesteś zautomatyzowany Asystent uwierzy, że jest na żywo, a agent, którego nikt nie zna. Rozmawiał bez tego w nieskończoność. Wymagana linia, która po cichu robi Nie ma zastosowania jest gorsze niż nie oferowanie jednego. Każdy poszkodowany agent otrzymuje jedną nową uratowaną Kopia oznaczona jako dlaczego, a odpowiedź donosi, ile z nich zostało ponownie opublikowanych UI może powiedzieć, co tak naprawdę się stało, zamiast po prostu "Saved".
· kamo-internal
Pełnostronna pracownia AI Sales Agent, zastępująca modały
Redaktorem agenta był 800px MUI Dialog, którego cała powierzchnia wynosiła 10 rzędów. textarea, na jednej karcie AI, która w ogóle używała okna dialogowego. Teraz jest to dedykowany Trasa, a model edycji za nią jest ustrukturyzowany, a nie jeden blob. - /settings/ai/sales-agents/new — kolumna 720x, a nie studio. Karty szablonu (karta IS przemysł, więc nie ma rozwijania gałęzi przemysłu), następnie dwa pola: nazwa i nazwa i Jedno zdanie o biznesie. Pracownik agent w mniej niż minutę. - /settings/sales-agents/[id] — pełna szerokość, ONE dokument przewijania z lepkim Nagłówki sekcji, zawartość zamkniętą na 880px, więc wejścia jednoliniowe nie są rozciągnięte Na wyświetlaczu 4K. No 240px szyna nav: dziewięć sekcji to praca z przewijania, a nie Praca nav. - Spróbuj-it-out jest przełącznikiem nagłówka, a nie trwale zarezerwowaną kolumną. An (zacht) Pusty panewnik obok zupełnie nowego agenta to zmarnowana przestrzeń, która brzmi jak Użytkownik nie może go wypełnić. - Gotowość jest uporządkowaną, zmywalna lista tego, co pomogłoby - nigdy ułamek. Ułamek mówi komuś, że zawiodą; lista mówi im, co mają robić dalej. - Zamknięte zasady sprawiają, że są zablokowane i nieusuwalne, a następnie przejmowanie sekcji ręcznie Ostrzega, gdy zawiera jeden (komchiwator teraz ponownie dołącza je bez względu na to). - Nagłówek wyraźnie stwierdza, że edycje wpływają tylko na NOWA rozmowy, ponieważ Bąd jest migany podczas tworzenia sesji, a użytkownicy w przeciwnym razie doszliby do wniosku Ich zmiana nie zadziałała. - outboundEnabled jest wysyłany tylko wtedy, gdy faktycznie się zmienia: serwer 403s całość PUT, jeśli to pole jest obecne bez MANAGE_SALES_AGENT_OUTREACH, w tym To w każdym autosave łamałoby studio dla każdego, kto nie ma tego prawa. Usuwa również zduplikowane surowe okno "AI system prompt" z kanału czatu Wydawca. To było drugie, słabsze miejsce do pisania tego samego, bez Wersjonowanie, brak zamkniętych zasad i brak historii – niezależnie od tego, z którym wystosowałeś Open zdecydował, co usłyszeli klienci. Istniejące komunikaty wciąż determinują; kanały Używanie jednego teraz dostaje powiadomienie wskazujące na agentów. Kopiowanie nie nosi żargonu AI według projektu, a ta zakodowana angielska tablica branżowa jest Zastępione tłumaczonymi etykietami.
· AIService
Kompilator sprzedaży-agent, wersjonowanie, brama wyciągowa; powtórka narzędzia fix
Zorganizowane config agenta kompiluje się do monitu systemu, zamrożenie na opublikowane Wersja i zyskuje bramę, którą agent musi przejść przed rozpoczęciem kontaktu. Kompilator AgentConfig + SalesAgentZinteligent: czyste, deterministyczne kompilacja strukturyzowanej Konfiskata w dzielonym moncie. Puste sekcje są pominięte, więc trzyzasady Agent nie kompiluje się z dokumentem, który jest głównie nagłówkami. - Przepis na poziomie sekcji ("zapisz tę część siebie") zamiast na poziomie dokumentu Sur-editowy przełącznik: autor otrzymuje pełną ekspresję mocy w jednej sekcji, podczas gdy Inne punkty nadal kompilują się, utrzymują zablokowane zasady i kontynuują wersje. - Ten sam mechanizm sprawia, że migracja byte-identical - proza agenta przedconfig jest przechowywana jako nadpisanie dokumentu i kompilacja z powrotem w niezmieniony sposób, więc migracja Dzień jest bezopowy dla agentów, którzy już rozmawiają z klientami. Udowodnione przez test. - PhraseBank to celowo dwa wymiary, z dobrą prozą na TEMPLATE. Globalny bank kluczowany na każdej kombinacji enum potrzebuje 90 odręcznych akapitów, Degeneruje się w układane w stosy klauzul i sprawiłoby, że każdy org otworzyłby się z tym samym zdanie - które niszczy jedną rzecz, którą kupuje org. - Sześć szablonów (pierwszy z przodu i przyjazd-ołów: są poziome i okładka dowolny org, którego pion nie jest wymieniony). Każdy statek zablokował zasady zgodności a Model nigdy nie może usunąć, zweryfikowany przez test. Cykl życia + autoryzacja - Publikuj zamrożenie "config, skompilowanyPrompt, hash, model, dostawca"; roll Powtórzył i przywraca szkic, aby studio nigdy nie pokazało jednej rzeczy, podczas gdy Agent służy innemu. - Administrator po raz pierwszy jest objęty prawami. Wcześniej KAŻADOWANY Członek dowolnego orgia może przepisać to, co mówi ten org swoim klientom. Upadki z powrotem Do MANAGE_AI_SETTINGS, więc żaden istniejący administrator nie jest zablokowany na miejscu wdrożenia. - Publiczny czat preferuje zamrożony monit opublikowanej wersji zamiast live trainingSkontekst i znaczki sprzedażAgentId/versionId na sesji - agent Zostało to już rozwiązane i zostało odrzucone. - Stworzynie wspomagane sztuczną in: jedno zdanie, recenzowane konfiskaty. Zablokowane zasady są Przeniesiony kod, nigdy nie pokazany modelowi, więc linia zgodności nigdy nie może Należy usunąć przez instrukcje-fot. Brama zasięgu zasięgu (wszystkie 14 przetestowanych reguł) - Opt-out bije każdą inną czek ORAZ jest zgłaszany jako powód, ponieważ Powodem odnotowanym przeciwko odmowie jest sam dowód. - SMS bez rejestracji zgody odmawia się: w ramach TCPA ciężar dowodu spoczywa na Nadawca, więc brak rekordu to brak zgody. - Czasy ciszy są oceniane tam, gdzie jest KONTAKT, a nie tam, gdzie jest biznes. - Nieudane wysyłanie nie wydaje budżetu na dotyk; tłumione wysyłanie nie lub nie Jeden blok kaskadowy blokował wszystko po nim. - Brama zawodzi zniekształcony - brama, która otwiera błędy wysyłają wiadomości Dozwolone, jedna porażka, której nie można cofnąć. Naprawy znalezione po drodze - Powtórka historii dyżuru narzędzi została przerwana: wiersz TOOL nie utrzymywał się na żadnym poziomie treści i Zakręt narzędziowy nigdy nie był trwały, więc turn 2 wysłała zawartość null Bloki. Wychowywanie narzędzi zawiodłoby każdą wielozadaniową rozmowę. - tekstComplete nie miał timeoutu (zablokowanie .get(), przypinanie wątku na powolne Dostawca) i nie zarejestrował żadnego użycia, dzięki czemu każdy pomocnik dzwoni niewidoczny do fakturowania. - Partycja systemowa w dopasowaniu kontekstowym była nieograniczona, więc środek słowny plus RAG Blok może wypierać całą historię. - costEstimate jest teraz zamieszkany tylko na ścieżce synchronizacji, z prawdziwych tokenów dostawców. Streaming pozostaje nieważny: wytwarza tokeny jako zawartość.length()/4 i mnożenie To przez rzeczywioną cenę daje numer w kształcie faktury, który jest błędny.
· kamo-shared-library
Strukturalnego konfiskata agenta, kręgosłupa w wersji i stanu zasięgu
Zastępuje pojedynczy blok treningowo-kontekstowy z ustrukturyzowanym, wiszalnym środkiem Model i dodaje kręgosłup, którego agent potrzebuje, zanim może zainicjować Kontakt zamiast tylko odpowiadać. - SalesAgent zyskuje configJson (jsonb-as-String, pasujący do WebChatIntegration .designConfig), maConfig, opublikowanyVersionId, publiczność i outboundEnabled. Context jest zachowany jako COMPILED OUTPUT, więc każdy istniejący konsument Utrzymuje pracę nietkniętą.MamConfig jest raczej wyraźny niż wywnioskowany z TreningKontekst jest pusty, ponieważ po skompilowaniu jego wyjścia nigdy nie jest Pusty i każdy test wyblakłości byłby nieosiągalny. - SalesAgentVersion zamraża ?configJson, skompilowanyPrompt, kompililedHash, modelId, Dostawca Id- na publikację. Model jest przypięty wraz z monitem: zamrożenie Instrukcje, podczas gdy model auto-trasuje, sprawiłyby, że artefakt byłby półprawdą. - AiChatSession/AiUsageZwytywalny wzrost sprzedażyStonijId + salesAgentVersionId. Wcześniej "który agent się tym zajmował?" mógł odpowiedzieć tylko chodzeniem z mutablem, Nie-FK WebChatIntegration.saleAgentId hop, więc reasing kanału Po cichu ponownie przypisuje całą historię. - Ustawienia AiOrg zyskuje wymuszonePream/forcedFooter jako nowe kolumny strączowe niż ponowne wykorzystywanie domyślnegoSystemPrompt, więc połączenie jest no-op do momentu admin Wypełnia jednego. Ponowne wykorzystywanie istniejącego pola zmieniłoby zachowanie dla każdego Org, który miał już jeden zaludniony, w dniu rozmieszczenia. - AgentKontaktStany + AgentOutboundTouch: stłumienie międzykanałowe na kontakt, Kolumny rezygnacyjne na kanał i zgoda czasochłonniczą. Opt-out jest przechowywany Jak prawdziwe kolumny, a nie JSON, ponieważ „udowodnij, że ta liczba została stłumiona Data ta nie może zależeć od wydobycia ścieżki JSON. Rejestry dziennika dotykowego REFUSALS, jak również wysyła - dziennik wysyłań dowodzi tego, co zrobiłeś, dziennik Decyzje dowodzą tego, czego byś nie zrobił. - Prawa 168-173 split . . . MANAGE_AI_SETTINGS(53), który wcześniej nie był w stanie tego nie ogniać.
· kamo-internal
Zakładka agentów sprzedaży AI + przypisanie agenta kanału
Wymowuje /setcje/ai?tab-sales-agents (był stub): orgs create agent dla swoich Branża sprzedaży, albo z wbudowanego szablonu, albo poprzez pisanie kontekstu szkoleniowego Sami, a następnie edytować/usuwać je. Kanały czatu (/ustawienia/funkcje/chata) mogą teraz wybrać, który agent napędza ten Sztuczna inteligencja kanału, niezależnie — agent nadpisuje surowy system monit.
· SecurityService
Enrich pożyczkobiorca routing czatowy + schwytanie stanu sub-własności
Rozmowy-routing zwraca teraz NMLS przydzielonego oficera, tytuł, zdjęcie, telefon, e-mail i czy posiadają ważną licencję dla stanu nieruchomości podmiotowego, plus Państwo samo i czy nadal musimy o to prosić. Ponowne wykorzystanie karty SAFE-Act Rozwiązywane dane, aby czat nigdy nie pokazał sfabrykowanej tożsamości. Dodaje POST /portal/subject-stan: gdy ołów nie ma jeszcze stanu nieruchomości, Pożyczkobiorca może ustawić go z czatu; przepływa przez patchEstimate (i jego przydział Ponowne włączenie basenu) jak każdy inny deklarowany fakt, który odblokowuje linię licencji.
· MediaService
Przypisz agenta sprzedaży na kanał + raport LO Dostępność
- WebChatIntegration RUD wątki sprzedażAgentId (null wyczyści zadanie) - lo-presence zwraca teraz dostępność członkaStatus obok online, więc Widget może pokazać prawdziwy status zamiast nagiej kropki. Sondy Cross-org wciąż Powróć tylko "online:false".
· AIService
Agent sprzedaży CRUD, szablon hipoteczny i wywołany przez agenta czajny
- AiSalesAgentController (/api/ai/sales-agents): lub g-scoped CRUD + GET / rateplates - SalesAgentTemplateZaginięcie: wbudowane szablony startowe, zaczynające się od Asystent kredytobiorcy hipotecznego (zachowanie zgodności: brak wiążących kwotowań stóp procentowych, nie Obietnice zatwierdzania, rozbrojenie licencjonowanego urzędnika pożyczkowego, proszą o stan ten) - PublicAiChatService: przydzielone szkolenie SalesAgentKontekst staje się szczytem poziom szybkiego wodospadu (agent -> wywołaj integrację -> org -> generic)
· kamo-shared-library
Podmiot SalesAgent + przypisanie agenta kanałowego
Konfigurowalny agenci sprzedaży AI: wymieniony agent dla branży sprzedaży, zaprogramowany Z kontekstem szkoleniowym autorów org (z szablonu lub ręcznie), przy przypisywany Kanały do napędzania AI tego kanału. Kamo obsługuje wszystkie branże – kredyt hipoteczny to - tylko jeden szablon. - Podmiot SalesAgent (dao/nasy/ai) + SalesAgentRepository + SalesAgentDTO - WebChatIntegration.salesAgentId (nienależne do unieważnienia miękkiego linku) + pole DTO

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