Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· kamo-shared-library
Dodaj globalną kontrolę w zakresie aliasu-niepowtarzalnego
- zakresy przeprowadzane przez dostawcę, a także Miał rację, podczas gdy alias był rozwiązany tylko jako (security_provider_id, alias) — para za ?alias>. Gospodarz. Dwa orgi pod różnymi dostawcami mogą dzielić się jednym bez dwuznaczności. Organizacja może być teraz nazwana bezpośrednio przez swój alias, z ?org, i To spojrzenie nie ma dostawcy w zakresie. Powtarzający się alias sprawia, że Odniesienie niejednoznaczne w całej platformie, więc OrgResolutionService odrzuca ją Zamiast wybierać jednego – który pozostawia obie organizacje nieosiągalne przez alias. Żywa posiadłość zawiera już powtórki (cztery orgi udział "a-corp", dwa udziały "kia-kaha"), dlatego desolwator odmawia; to To, co jeszcze bardziej się tworzy. Wykluczenie Id pozwala organizacji zachować własny alias, podczas gdy inne dziedziny są Uratowany; Przekaż null podczas tworzenia. 1597 testami przechodzi.
· KlusterServices
Wyseksowy raport o błędzie w otwartym korzeń VS
URI obsługuje, który tworzy rozmowę w oknie RUNNING i wstępnych wypełnieniach Wejście, które jest jedynym sposobem na dotarcie do gent edytora, który już ma otwarty Zamiast zaczynać drugą obok. URI niesie ze sobą podpowiedzi i nic więcej, więc model i wysiłek przechodzą kodderProcessWrapper — opakowanie, które mapuje potalowaną enum do stałych flag I nigdy nie pobiera argv z pliku, więc podśladowany plik może wybrać inny Model i nic więcej. URI pre-spełnia, ale nie poddaje się, więc zgłoszenie jest syntetycznym zwrotem A następnie agent czeka na transkrypcję przed zgłoszeniem sukcesu. 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 Igła, której szuka, jest uciekiniewiona przez JSON: transkrypcje są JSONL, i szukają W przypadku surowych nowych linii oznaczałoby każdą dostarczoną wiadomość jako nieudaną.
· InitializerService
Tworzenie tabel systemowych Bugs
Brak ograniczeń CHECK na kolumnach ordynalnych: support_ticket_status_check jest Co się dzieje, gdy Hibernate zamraża jeden w rozmiarze enum i enum Rośnie, a systemBugStatusType ma rosnąć. Stosowany również do yb-tserver:5433 ręcznie, ponieważ ta usługa nie ma CI.
· kamo-internal
Zarządzaj domeną niestandardową z ustawień firmy
Domena była kiedyś drzwiami do organizacji: DNS musiał być Konfigurowany, zanim ktokolwiek mógł w ogóle zalogować się, dlatego /setup/dns Dotarcie z kreatora org-creation i z banera "potrzeby konfiguracji" raczej To nie z ustawień. Jest teraz opcjonalny, więc należy do reszty Znakowanie białych. Dodaje sekcję Custom Domain do Ustawienia - Niezbędne zachowanie i etykietowanie, Między informacjami o firmie a brandingiem. Pokazuje bieżącą domenę orgi, lub mówi wyraźnie, że nie ma żadnego i otwiera /setup/dns, aby dodać lub zmienić To się robi. Przycisk brzmi "Zapisz domenę" lub "Zarządzaj domeną" w zależności od Który z nich jest. Kopia prowadzi z przestrzenią roboczą, która jest już osiągalna na kamocrmm.com, Tak więc właściciel, który nigdy nie chce własnego adresu, wie, że to jest coś, co - Może to zignorować. Używa orgIdStr, a nie organizacji.id: ta dziedzina jest numerem JS i Ids int64 org przez MAX_SAFE_INTEGER, który otworzyłby DNS Strona dla innej organizacji. Przycisk jest wyłączony, dopóki nie Uderzenie zamiast nawigować z niewłaściwym id. Kopiowanie wylądowane w kamo-translation-dictionary (98ee7cb6) — CI klonuje go Niezależny w czasie budowania obrazu, więc aplikacja-pierwsza jest czerwoną kompilacją. 2921 testami i przechodzą wszystkie 8 strażników, w tym 18n.
· SecurityService
Wyślij drzewo również na punkcie końcowym aplikacji-katalog
Typy oddziałów - Dozwolone aplikacje budują swój edytor z /features/app-catalog, Nie z listy najemców, więc była to jedna powierzchnia, która mogła Nie zobacz, które aplikacje są dziećmi. Rodzic decyduje, co to za Dzieci mogą być oferowane, więc redaktor potrzebuje takiego samego kształtu. 947 testuje na zielono.
· kamo-internal
Odd owo liź aplikacji i potwierdź, co robi wyłączenie rodzica
Dzieci teraz siedzą pod swoim rodzicem na liście Aplikacje i funkcje, każdy z To jego własny przełącznik. Nesting jest wyrażany przez ORDER plus wcięcie, a nie Pojemnik zagnieżdżony, więc istniejąca karta, ruch i kod jęczy jest Nietmocne – i dziecko, którego rodzic jest filtrowany z bieżącej zakładki Nadal renderuje na najwyższym poziomie, a nie znika. Dwa zachowania, które kaskada jest konieczna: Toggleing teraz stosuje całą listę funkcji serwera zamiast przewracać Kliknięty wiersz. Umożliwienie dziecku włącza rodzica i wyłączającego Rob wyłącza każde dziecko, więc lokalna aktualizacja jednego rzędu odejdzie UI nie zgadza się z serwerem w sprawie wszystkiego, co w kaskadzie Dotknięte. Oba punkty końcowe już zwróciły pełną listę; nic nowego nie było Potrzebna jest po stronie serwera. Stara ścieżka jednorzędowa pozostaje jak opad dla SecurityService, która nie wysyła listy. Przełączenie rodzica najpierw pyta, nazywając dzieci, które będzie z nim potrzebne To się robi. To jest większe działanie niż wygląd przełączania. Drzewo pochodzi z punktu końcowego, a nie z lustra TypeScript ServiceType — te już dwukrotnie dryfowały z Javy, a także Serwer jest jedynym miejscem, które zna katalog operatora. 203 testowe pliki / 2921 testuje zielone, zbuduj czysto.
· InitializerService
Cenę dzieci handlowych i EHR, z strażą całkowitą
Żadna z map cen nie miała kontroli całkowitej, a dwa tryby awarii są Odmienne i zarówno ciche. Brakujący z KATALOG, aplikacja nigdzie się nie znajduje Matryca cenowa. Brakuje od TIERS, każdy poziom pisze is_included-false — wyraźny DENIAL, którego nieotwarte jest uprawnienie NIE ratunek, ponieważ fail-open ma zastosowanie tylko wtedy, gdy plan nie ma żadnego rzędu A to pisze jeden. Więc zapomniana aplikacja jest albo rozdawana wszystkim Albo kłódka dla wszystkich, a która zależy od szczegółów, której nikt Pamięta w tym czasie. Pięć pionów handlowych znajduje się dokładnie na poziomie POS. Nie było ich PRZEDSTAWA można handlować przed drzewem aplikacji — cokolwiek, co jest org trzymający POS Mogłoby to zrobić, może się udać – więc umieszczenie ich w innym miejscu z mocą wsteczną Opłata za możliwości, które ludzie już mają. Test pinuje, które raczej do POS To do dosłowne, więc ruchomy POS je przesuwa. EHR jest negocjowany przez przedsiębiorstwa, podobnie jak systemy inicjowania: brak ceny katalogowej, Plany tylko, nieobecne na każdym poziomie. Onboarding klienta PHI Oznacza BAA i przegląd zgodności, a nie samosługową kasę. 159 testuje zielony.
· kamo-marketing
Przestań liczyć wizyty członka we własnym związku
Członek sprawdza, czy ich własny link śledzenia działa jako najczęstszy Odwiedź dowolny kod, a jest gorszy niż bezużyteczny: zawyża liczbę Są one mierzone, jest to nie do odróżnienia od prawdziwej perspektywy u odwiedzającego Szuflada, która pozostawia je trzymające stałe ciasteczko dla odwiedzających, więc każda późniejsza wizyta Liczby znowu. Kod pokazujący trzy wizyty, wszystkie osoby, która go wybiła, Jest to rekord płatności z kłamstwem. Ta strona jest jedynym źródłem, które może odpowiedzieć na pytanie - nie ma sesji i Żaden członek, a konsola wewnętrzna nie może ustawić pliku cookie na www.apex> Wewnętrzne.apex>. Co krzyżuje tę lukę jest linkiem: dojazd z ?mrt_self1 miętami Wyłączenie, a od tego czasu przeglądarka jest wykluczone podczas każdej wizyty, czy to lub Nie ma tam parametru. Wewnętrzna zakładka Kodów Śledzenia zwiększa kontrolę, która Produkuje to połączenie. Nie bijące nie jest wystarczające, więc wykluczona wizyta DELETES odwiedzającego i źródło Ciasteczka też. Członek, który zapowiedź swojego linku przed tym, został wysłany lub kto zdecydował się Wyjście na podstawie już liczonej przeglądarki, nadal nosi GUID - a ogień beacons dla każdego, kto ma jeden. Bez usunięcia opt-outa zadziałałaby tylko Osoby, które tego nie potrzebowały. Wyłączenie to nie jest celowo w TRACKING_COOKIES: ten zestaw jest tym, co plik cookie Kontrola usuwania polityki oczyszcza i usuwa opt-OUT z identyfikatorami Po cichu zrelacjonowałby jednego gościa, który poprosił, aby nie być liczony – na Kontrola najprawdopodobniej zostanie naciśnięty przez dokładnie tę osobę. check-discount-cookie rośnie z 50 czeków do 72, pokrywając dopasowanie wartości, Potwory parametrów, wyłączenie zestawu usunięcia i dwóch niewariantów źródłowych (średniaczka musi usunąć tożsamość, beacon musi zostać ważone na miejscu, ponieważ Śródmieści działają na żądanie dokumentów, podczas gdy beacon działa na każdym poboczu klienta Nawigacja).
· kamo-internal
Widget Affiliate Sales Scoreboard
Jedna kolumna siatki szeroka i dwa rzędy wysokości: dziesięć osób w organizacji Przyciągnięcie jak najwięcej poprzez ich linki śledzące, dziś, w tym miesiącu, to Rok lub cały czas, otwierając na odwiedzających w tym miesiącu. Reorder jest cechą. Każdy inny sposób pokazywania czterech wskaźników na cztery Okna to szesnaście oddzielnych list; jest to jedna lista, która zmienia samo. Wiersze Są kluczowane przez członka i mają animację układu, więc przełączanie strojów kategorii Tędni ludzie przeszli obok siebie, zamiast oślepiać tafla - i hak Utrzymuje każdą deskę, którą zebrał, więc prasa, która wyzwala tę animację Dane do animowania na tej samej ramce. Selektory są przechowywane przeciwko PROFILu członka, a nie localStorage, więc Na pokładzie, kto jest ustawiony przy biurku, to deska, którą dostaje na laptopie. Oba Czytelnicy obniżają nierozpoznaną wartość domyślną, a nie odmawiają jej - Serwer stosuje identyczną regułę i odbija echem wstecz, co był używany, więc Preferencja napisana przez starszą budowę nigdy nie może pozostawić członka na pustym okienku. Członek spoza pierwszej dziesiątki dostaje własną linię przypięta poniżej listy, a Członek, który nie ma nic, ale dostaje go na rachubę zero. Deska, która może tylko powiedzieć "jesteś Nie na nim" jest jedna rzecz, której tablica wyników nie może zrobić z ludźmi, dla których istnieje. Motywuj. Również tutaj, ponieważ jest to ten sam problem z drugiego końca: kontrola "preview" Na karcie Kody Śledzenie, która otwiera link BEZ liczenia wizyty. Sprawdzanie gdzie twoje własne linki są najczęstszą pierwszą wizytą, jaką kiedykolwiek otrzymuje każdy kod, i Liczenie to umieszcza własne kliknięcia członka w rekord, na którym są mierzone. buildTrackingPreviewLink to prawdziwy link plus znacznik strony marketingowej Czyta jest - umowa cross-repo, więc test przypina nazwę parametru.
· MediaService
Punkt końcowy tablicy sprzedaży partnerskiej
GET - odpowiada na to Pierwsza dziesiątka organizacji dla jednego miernika nad jednym oknem, plus własne osoby dzwoniące Stojąc, gdy na nim nie ma. Liczniki na MARKETING_TRACKING_CODES nie mogą tego poprzeć: są one wszechczasowe roll-upy bez wymiaru czasu, a w sumie nie ma nic w sumie biegowej Mówi, kiedy to się stało. Okrągła prawda jest w rzędach – - za nabycie, a każda konwersja jest sama Znaczek AT na MARKETING_VISITORS. Dlatego też cały czas zgadza się z kodem Siatka: te same dane, policzyły się w ten sam sposób, a nie w drugą księgowość. Cztery decyzje warte stwierdzenia: - Nabycie jest datowane przez FIRST kontakt, a nie przez działalność. Liczenie odwiedzających, którzy Byli po prostu aktywni w oknie, aby ponownie przypisać tę samą osobę co miesiąc, Tak więc praca wykonana kiedyś poza rangą pracą wykonaną teraz, na zawsze. - Konwersje rangi według atrybutówTrackingCodeId w pojedynkę. Ta kolumna zamraża moment, w którym konto istnieje; lastTrackingCodeId porusza się i plasuje je Pozwoliłoby jednemu członowi wziąć drugą konwersję zamkniętą za pomocą dodatkowego kliknięcia. - Okno jest wycięte w kalendarzu MEMBER i porównane w UTC. "W tym miesiącu" Różni się nawet o dzień, w zależności od tego, czygo kalendarza jest pytany, a każda kolumna W tym schemacie jest wolny od offset LocalDateTime oznacza UTC. - Wszystkie cztery metryki są obliczane na żądanie, więc kategoria przełączania jest natychmiastowa Re-sorty rzędów już na ekranie, a nie na przędzalniku. Gated on AFFILIATE_SCOREBOARD_WIDGET i nic więcej – zobacz własne prawo Javadoc. Nie kupuje wiercenia: nie ma kodu id, nie ma identyfikatora gościa i nie ma członka Parametr na punkcie końcowym, a każdy punkt końcowy analityczny by-id nadal przechodzi MarketingTrackingScopeResolver bez zmian Cztery agregacje używają przecinka, a nie JOIN..ON, ponieważ żadne z nich nie Klucz zagraniczny to stowarzyszenie JPA, a formularz przecinkowy analizuje każdy Hibernate Wersja flota działa — MarketingTrackingHqlTest teraz analizuje wszystkie cztery przeciwko Realny model podmiotu na 6.2.13, i przypina akwizycję, atrybucję i najemcę Predykaty, które zawiodą po cichu, jeśli dryfują.
· kamo-shared-library
Dodaj uprawnienia do widżetu Affiliate Sales Scoreboard
Pięć praw, 234-238, w grupie MARKETING i odwieszone od VIEW_REFERRAL_CODES: Tablica numerów referencyjnych to dane dotyczące kodu śledzenia, a członek, który może Nie widzisz karty Tracking Codes nie ma na niej żadnych interesów. Widget po prawej stronie - nie VIEW_ALL_MEMBER_TRACKING — to, co ujawnia inne Liczba członków, a to jest celowe. 200/201 Bramka ANALYTICS: którego Odwiedzający, których adresy, których terminy, rozwiązywane przez członka docelowego przez Rozwiązywator zakresu. Tablica wyników ujawnia nazwę, rangę i numer jeden, Wszyscy od razu. Wymaganie prawa analityki w całym orgug, który pozostawiłby ją widoczną Tylko administratorom, którzy go posiadają, która jest raportem, a nie zarządem. Celowo NIE został rozstawiony, z tego samego powodu 200 i 201 nie są: zasieanie by nie było: Opublikuj sumę skierowania każdego istniejącego posiadacza do swoich kolegów na butach To go wysłało, co jest decyzją o ujawnieniu podjętą przez wdrożenie, a nie przez Administrator. 229/166/32/31 w skontrolowanym kształcie – wszystkie pięć dzieci to dzieci i VIEW_REFERRAL_CODES Samo jest dzieckiem VIEW_MARKETING, więc ani wiadro korzeniowe nie poruszają się.
· kamo-login
Marka i zakres ekranu logowania z ?org
login.kamocrm.com to ekran logowania dla każdej organizacji, która nie ma Pełnomocnik własny, więc nazwa hosta nie może powiedzieć, który z nich się podpisuje. robi: nazywa organizację według identyfikatora lub aliasu, wybiera branding do Malowanie i podróże z poświadczeniami jako organizacja, którą są Sprawdzone przeciwko. Wskazówka, a nie poświadczenia. Członkostwo jest sprawdzone po stronie serwera w obie strony, więc Nazwiska organizacji, której nie należysz, otrzymuje taką samą odmowę, jak nazewnictwo Fikcyjny. Najgorszym błędnym odniesieniem jest niewłaściwe logo na Publiczna strona. Branding pochodzi z SecurityService's /org/public/Eref, raczej przekazany niż ponownie wdrożono, aby zasada o tym, jakie odgadliwe odniesienie może ujawnić Zatrzyma się w jednym miejscu. Podstawa tematyczna podąża za organizacją zamiast Gospodarz, używany zgodnie z podaniem: upuszczając swoją pierwszą etykietę w sposób, w jaki ścieżka hosta To zamieniłoby acme.kamocrm.com w kamocrm.com i pomalowałby najemcę w - Marka platformy. Pierwsza farba koniecznie wykorzystuje markę gospodarza, ponieważ odniesienie Nie został jeszcze rozwiązany; KAMO_THEME_REAPPLY maluje raz. Wizyta Która nazwa żadna organizacja nie rozlicza żadnych referencji w poprzedniej wizycie W tej karcie, więc własny ekran platformy nie utrzymuje czyjegoś innego Logo.
· SecurityService
Podawaj markę org na ekranie bez sesji
Login, rejestracja i lobby spotkań malują kolory organizacji Zanim pojawi się jakakolwiek sesja. Wiedzieli, który z nazwy gospodarza, który jest To, czego organizacja bez własnej nazwy hosta nie może dostarczyć. GET /api/security/org/public/'ref' zmienia wyraźne odniesienie ?org' -- Id jako cyfry, czyli alias - w coś do malowania. Branding TYLKO: nazwa, logo, kolory, locale, host theme. Nie cechy, nie Prawa, nie domeny, nie członkowie. Pierwsza próba w tym ponownym użyciu przewidywany rekord organizacji i zapadnięcie punktu końcowego odmówiły tego, Prawidłowo -- aliasy są do odgadnięcia, więc pełny rekord za domysłem Odprawa wylicza konfigurację każdej organizacji. To, co zostało, jest To, co widzi już każda strona logowania tej organizacji i a Testuje nazwy pól wyłączonych indywidualnie, więc oddanie jednego z powrotem musi być Celowe. Poczytaj tylko. Lodówka /org/domena/-host-auto-provisions aplikacja jest w aplikacji Efekt uboczny; punkt końcowy osiągalny przez zgadywanie nie może pisać. Nieznane odniesienie 404, podobnie jak niejednoznaczny alias -- byPublicRef Już odmawia jednego nazewga, a to przypina, że odmowa Dosięga dzwoniący jako "nie takiej organizacji", a nie jako czyjaś. Branding. Oddzwonił wraca do platformy. themeDomain ma taką samą wartość, jaką jest powłoka i używanie tematów, Tak więc ekran pre-sesji odczytuje markę org z folderu, który był W rzeczywistości napisany do -- ’alias.kamocrm.com dla org bez domeny. 947 przeszedł testy.
· MediaService
Odmowa spotkania z nagraniem dla najemcy, który obsługuje PHI
Podział zdolności sprawił, że ServiceType.MEET jest dozwolony — konferencja na żywo Na samodzielnym Meet nigdy nie opuszcza klastra — podczas gdy MEETING_RECORDING Nie blokowano, ponieważ ten rurociąg umieszcza całą transkrypcję na Wielododajny router AI, a następnie wysyła e-mail do każdego uczestnika Wliczając w to gości zewnętrznych. Jest to nieodwołalna kopia stron trzecich. Strażnik siedzi w prywatnym spożywczym() obu publicznych punktach wejścia lejek Przejdzie, więc odmawia, zanim jakiekolwiek byty dotrą do MinIO, i ponownie na szczycie z runSummaryPipeline, która jest publiczna i Async. 200 testów na zielono.
· VOIPService
Zablokowana zdolność przewyższa teraz prawą i tryb Boga
PhiPlaybackAutoryzatorz gated PHI odbierz odtwarzanie na VIEW_CALL_LOGS. To było Cały czek, ponieważ ServiceType.VOIP zmapował się do zablokowanego Moduł VOIP_RECOCORDING, więc najemca PHI nie mógł mieć systemu telefonicznego Cała ta klasa nigdy nie biegł za jednym. Podział zdolności sprawił, że sam VOIP był dozwolony – obsługa połączeń jest In-cluster — podczas gdy VOIP_RECORDING pozostał BLOCKED_PENDING_WORK z powodów To się nie zmieniło: odtwarzanie nie sprawdza odprawy, transkrypcje Jeżdżę w metadanych, a nie ma ścieżki retencji lub usuwania. W lewo w pojedynkę Byłoby to proste osłabienie: dzierżawca PHI mógłby umożliwić System telefoniczny i, z jednym prawym, odtwórz wszystko. Tak więc PhiCapabilityGuard działa PIERWSZE, a jego odmowa jest ostateczna. To nie wymaga Parametr dzwoniący, więc dla najemcy PHI nie podnosi go - i nie Przejrzyj aktywną sesję boga, która jest własnością, która ma największe znaczenie. - Jest już to. - " Trzy testy zakodowały stary kontrakt i są przepisywane raczej niż Usunięto, każde nagranie, dlaczego oczekiwanie się odwróciło. Komunikat o odmowie głosowej nie obwinia już brakującego prawa, które Zazwyczaj nie jest to już powód. 152 testy na zielono.
· SecurityService
Podawaj drzewo aplikacji i napraw niestrzeżony automatyczny .
CechaController wysyła teraz rodzica / dzieci / rodzeństwo na każdego serializowanego Aplikacja, dzięki której klient może sprawić, że dzieci zagnieżdżą się pod swoim rodzicem. Posiadał Zamiast celowo odbijać się w TypeScript: zwierciadła ServiceType Już dwukrotnie dryfował z Jawy, a druga kopia drzewa By być jeszcze jedną rzeczą do dryfowania. Dla kaskady nie było potrzebne żadne nowe kształty reakcji — / włączone i / nie można go wyłączyć Już ponownie sprawdź całą listę funkcji, więc pojawiają się zmiany knock-on Bez tego, że klient nie pogodzi. Obie pętle automatycznego udostępniania pomijają teraz dziecko, którego rodzica robi platforma Nie oferuje, ponieważ włączFeature kaskaduje rodzic i inaczej Włączenie rodzica, którego nikt nie opublikował. Pętla kontrolera organizacji miała NO PHI check, podczas gdy FeatureController's Komprocentował się, na publicznym, nieuwierzytelnionym punkcie końcowym. Dla najemcy PHI Pierwszy zablokowany moduł rzucił, otaczający haczyk zarejestrował ostrzeżenie, i Skuteczne Cechy cicho spadły z powrotem do surowych rzędów bez zastosowanego modelu Projekcja. Teraz prosi, a nie łapie, dokładnie tak, jak funkcje Lista to robi. /api/bezpieczeństwo/ehr zarejestrowane. Prefiksy handlowe pozostają odwzorowane do POS: Roszownik jest właściwą gruboziarnistą bramą i ;) Już rafinuje na rynek. 938 testuje na zielono.
· kamo-internal
Odzwierciedlać sześć aplikacji dla dzieci handlowych i powstrzymać dryfowanie luster
Oba lustra TS są teraz GENERATED z ServiceType.java, a nie ręczny. Swój źle dryfowali z Jawy i od siebie: Nieaktualna "integracja RG" i "Falls back to parent Organization SMTP" Wykop Java w 2026-08, POS oznaczony PLANOWANIE w ServiceType.ts Podczas gdy AppType.ts powiedział COMPLETED i różne opisy dla tego samego Aplikacja w każdym pliku. Warto wiedzieć przed ich zaufaniem: displayName i opis tutaj Zapoznawane przez nic. Każdy konsument wykorzystuje te stałe tylko dla tożsamości – Mecze has has hasing with id, appServiceIcons key on name. Kopiowanie pochodzi z GET /api/security/features, który honoruje PLATFORM_APP_CATALOG nadpisuje Lustra nie widzą. Ciągi są zsynchronizowane, więc czytelnik nie jest wprowadzany w błąd, A nagłówek pliku mówi, aby nie zaczynać ich renderować. Drzewo rodzicowe/dziecko nie jest celowo odzwierciedlone - cechy Punkt końcowy wysyła rodzica/dzieci/rodzice na aplikację, a drugą kopię Kształt byłby jeszcze jedną rzeczą do dryfowania. Również: ikona na nowy pion, zamiast pożyczać rodzica Storefront i getters organizacji, w tym isEhr.
· kamo-internal
Jeden pasek dowia, trzy razy szeroka, w dół każdej rozmowy
Bar obok wiadomości był 8px w czacie członowym i SMS, 6px w biletach wsparcia i Społeczny, a na czacie AI to było nic: ta lista zadeklarowała „szerokość” Oprócz jego zasad::-webkit-scrollbar, a od Chrome 121 nieopoczątny "szerokość" lub "scrollbar-color" sprawia, że przeglądarka odrzuca cały blok -webkit- - więc poprosił o 12px i Dostał platformę hairline. globals.css dokumentów, które rządzą dla przewijania strony; nic Wymusił go, a czat AI po cichu był po złej stronie. Cała piątka czyta teraz jedną stałą CHAT_SCROLLBAR: rynnę 24px - trzy razy więcej niż czat członków Stara szerokość — z kciukiem wstawionym 6px po obu stronach przezroczystą granicą, więc pasek tak szeroki Nadal czyta się jako pigułka w korycie, a nie płyta spawana do krawędzi okna. The AI chat's Standardowe właściwości przenoszą się do „wsparcia nie selektoruje(:-webkit-scrollbar)", czyli gdzie jest to, gdzie Globals.css umieszcza je i jedyne miejsce, w którym Firefox odczytuje je bez kosztowania Chrome swoich reguł. Test jest na poziomie źródłowym, ponieważ przedmiotem jest arkusz stylów, a jsdom implementuje paski do przewijania: Przypina, że nie ma okna, które ma swój pasek z dosłownego, a żaden z nich nie wyznacza standardu Nieruchomość znów niestrzeżona.
· InitializerService
Rozszerzyć rynkowe dziadkowie do zapleczy z drzewa aplikacji
DziadekIteringGatedMarkets już chodził po aktywnych rynkach org, GetRequiredService() i włączono brakującą aplikację - to było po prostu Ograniczone do isGated() pionów, tj. MORTGAGE i PERSONAL_LOANS. A teraz Że każdy CommerceType nazywa własną aplikację dla dzieci, ograniczenie zniknęło, Tak więc te same nasiona pętli RETAIL / RENTAL / SERWIS / SZKCRTRUKCJA / Prochury rzędów. Nie potrzeba nowej migracji. Również nasiona RETAIL dla orgs, które utrzymują POS bez żadnych rynków, które miały Pracując w handlu przed drzewem, ponieważ sprzedaż detaliczna nie potrzebowała własnej aplikacji. Orgi najwyższego poziomu nie są już pomijane i to jest rozwiązanie, które ma znaczenie. Zwolnienie było słuszne, gdy to tylko przyniosło dwie aplikacje pożyczkowe – a Platforma-operator orgia nie powinna po cichu pozyskiwać MLOS – ale jest to błędne W przypadku drzewa aplikacji, ponieważ jest AppEffictivelyEnabled wymaga OrgFeature ROW i nie ma wyłączenia na najwyższym poziomie. Pierwszy bieg odnotował sukces podczas Opuszczenie KamoCRM, która prowadzi aktywne rynki RETAIL i SUBSCRIPTION, z Nie ma dla obu rzędów; straciłoby to oba z /commerce na następnym Rozmieszczanie SecurityService. Złapany przez zapytanie bazy danych, a nie przez czytanie Dziennik. Umożliwienie teraz kaskaduje dziecko swojemu rodzicowi, więc zasiewanie dziecka również Gwarantuje rząd POS. RUN przeciwko prod 2026-08-24. Zweryfikowano: każdy aktywny commerce_markets row Teraz ma aktywne dziecko OrgFeature rząd, zero braku.
· SecurityService
Sprawdzenie uprawnień każdego pionu, a nie tylko ogrodzonych dwóch
Każdy CommerceType nazywa teraz własną aplikację dla dzieci w ramach POS, więc isGated() zwarcie, które machały detalicznym, wynajmem, usługą, subskrypcjami A zamówienia od razu minęły. Te rynki są teraz sprawdzane W stosunku do ich własnej aplikacji — co jest punktem: można sprzedać pion, a Wyłączony, sam. Zależy od uruchomienia zapasu KamoInitializer.
· kamo-internal
Wyszukiwanie paska narzędzi jest glifem, który otwiera się na pole
Czat członka przewoził stałe pole wyszukiwania przez górną część okna – szerokość Cały pasek narzędzi, wydany na kontrolce, która jest pusta prawie przez cały czas i używana w seriach. To się dzieje. Jest teraz powiększacz 28px, który otwiera się na pole w kliknięciu, a pasek narzędzi odczytuje jako cztery Liny i powietrze. Pomysł, który jest zbudowany wokół: lupa nigdy się nie porusza i nigdy nie jest wymieniana. Upadły, Pigułka ma 28px, a ikona znajduje się w jego centrum, 14px od lewej krawędzi; otwarta, pigułka ma 6px Wyściółka przed ikoną 16px, która ponownie umieszcza centrum ikony na 14px. Pigułka rośnie w związku z tym Zza glif, który utrzymuje się w miejscu, a sterowanie odczytuje się raczej jako jeden obiekt otwierający się Dwa państwa przecinają krzyży. Szeroka sprężyny z niewielkim przekroczeniem po otwarciu i żadnemu Po drodze zamkniętej; zastępca śledzi wzrost o 60 ms, więc tekst pojawia się w pudełku, które Ma już na to miejsce; czysta kontrola pojawia się tylko raz, gdy jest coś do oczyszczenia. Zamknięcie zawsze usuwa zapytanie, a pole nie może być odsunięte, gdy jest ono następujące: Zawalony lupa wciąż filtrujący rozmowę byłoby oknem o tym, co to jest Pokazywanie. Rozmyjenie pozostawia go otwartym z tekstem w nim, a bezpańskie kliknięcie na glif skupia pole Zamiast odrzucać poszukiwania. Zmniejszony ruch jest honorowany przez cały czas, glif przenosi pierścień ostrości dla karty, a także Kliknij, a dystans 50px, którego potrzebne jest stare pudełko, zniknęło z nim.
· kamo-shared-library
Każda pionowa nazwa własnej aplikacji dla dzieci
Wymagana usługa staje się sumą teraz, gdy każdy pion ma aplikację dla dzieci w nie. ServiceType.POS, który usuwa "null oznacza, że sam POS jest wystarczający" Specjalny przypadek i isGated() z nim. Każdy pion można teraz włączyć, Licencjonowane i klasyfikowane przez PHI niezależnie – co pozwala na leczenie Praktykuj handel w ogóle, ponieważ RETAIL pozostaje zablokowany dla najemcy PHI Podczas gdy reszta handlu nie robi. HEALTHCARE(ServiceType.EHR) jest tym, co sprawia, że EHR pojawia się na - gdy aplikacja jest w to zajęta, bez nowego łazika Kod: assertCommerceTyAllowed, getAllpardCommerceTypes, the dozwolony punkt końcowy za obydwoma zbieraczami rynku, - i filtr rynku filtrują wszystkie Już teraz rozwiązuj poprzez getRequiredService(). NIE PUSHED do czasu uruchomienia zaplecza KamoInitializer. ZapewnićCommerceTypeAllowed Czytania odbierzquiredService() bezpośrednio, więc w momencie, gdy SecurityService to widzi Każdy org z rynkiem detalicznym lub wynajem potrzebuje dziecka OrgFeature row, które robi Jeszcze nie było.
· MediaService
Niech konfiskata publiczna będzie rozwiązana przez org id, nie tylko przez gospodarza
Wózek boczny spotyka org, aby zdecydować, czy gość Potrzebne jest hasło do spotkania. Zapytany przez nazwę hosta, która na wspólnym spotkaniu Rezje hosta dla organizacji platformy - więc najemca, który wymaga Hasło miałoby to po cichu upuszczone dla każdego gościa Dołączenie przez link. Gość nie ma sesji, więc jedyną rzeczą, która nazywa swojego najemcy, jest pokój, Który teraz niesie znak org. Oba publiczne punkty końcowe akceptują zatem Wyraźny orgId i wrócić do odnośnika domeny, gdy nie jest podany, więc Nic, o co prosi gospodarza, nie zmienia się. Ids przybywają jako cyfry i są przetłaczane jako długie: są po minione 2 "53", więc jeden Przeznaczony przez podwójne nazwy innej organizacji. 200 egzaminów przechodzi.
· kamo-shared-library
Funkcja kaskadowa włącz / nie można w nie doręki na drzewie aplikacji
Umożliwienie dziecku umożliwia rodzicowi; wyłączenie rodzica wyłącza każdego Dziecko; wyłączenie ostatniego dziecka nie wyłącza rodzica. Umożliwienie rodzicowi Zostawia dzieci same, więc rodzic włączony celowo bez Dzieci zostają. Kaskada jest napędzana wydarzeniami i celowo nie ma pojednania Zamiataj. Jest to niań rzemiosła: stale egzekwowany "rodzic z Nie ma włączonych dzieci "wariant wyłączyłby handel na każdy Istniejące org w momencie, gdy został wysłany, ponieważ żadne rzędy potomne nie istnieją, dopóki nie Zasytowanie KamoInitializer działa. Dziecko zapewnia ochronę PHI na module rodzica, a także na własnym, Przed jakimkolwiek napisem – w przeciwnym razie dozwolone dziecko pod zablokowanym rodzicem Albo utknąłby, albo po cichu włączyłby zablokowanego rodzica.
· kamo-shared-library
Dodaj PhiCapabilityGuard do kontroli możliwości w zakresie czasu połączenia
PhiTenantGuard działa w czasie funkcjonalnym i nigdzie indziej - trzy połączenia Strony, wszystkie w FeatureService. Teraz, gdy PhiModule jest zbożowy, a aplikacja, której rdzeń jest dozwolony, może nadal zawierać zdolność, która nie jest, I włączenie kontroli czasu nie widzi różnicy. Ten sam celowy podpis jak PhiTenantGuard: czysta funkcja (status, moduł) bez dzwoniącego, parametru prawego lub trybu boskiego, więc jest Nic do podniesienia. Klasa ławy, a nie stereotyp – wspólna-lib Komponent potrzebujący nieskanowanego repozytorium ma usługi w trybie awaryjnym cztery Czas; każda usługa zużycie deklaruje swoją własną fasę. UWAGA: MEETING_RECORDING i VOIP_RECORDING są teraz niezwiązane z żadnym SerwisType, ale jeszcze nie strzeżony na swoich stronach telefonicznych - to jest następny Dotowanie dotknięcia MediaService i VOIPService. Jest to obojętne w produkcji W międzyczasie, ponieważ każdy org obecnie ma obsługęPhi-false, ale połączenie Miejsca muszą wylądować, zanim jakikolwiek najemca zostanie oznaczony.
· kamo-shared-library
Podziel PhiModule od aplikacji-zakorzenione w aplikacji do zakorzenionych w zdolnościach
POS zmapował się na ECOMMERCE_SYNC (BLOCKED_NO_BAA) i cały handel Powierzchnia zwisa z POS, więc orgia z uchwytamiPhi-true nie mogła się przełączać Handel w ogóle — bez rynku, bez /handu i bez klinicznego wertykania Zbudowany na nim. Dziesięć adapterów synchronizacji detalicznych to rzecz, która opuszcza Granica, nie handel kręgosłup. POS teraz mapuje do COMMERCE_CORE (dopuszcza) i ECOMMERCE_SYNC w dół Do dziecka RETAIL. Ta sama korekta dla MEET (konferencja na żywo vs the Rurociąg podsumowujący, który wysyła transkrypcje do wnioskowania zewnętrznego) i VOIP (telefona vs przechowywane nagrania i transkrypcje). ZAMIAMY ZROKOWANIE i VOIP_RECORDING nie ma teraz żadnego programu ServiceType: są to możliwości Jest dostępny tylko za pomocą kodu, a javadoc PhiModule teraz stwierdza regułę Tak stała MUSI być sprawdzona przez PhiCapabilityGuard na jego wezwanie Strona. Przeklasyfikowanie aplikacji zgodnie z dopuszczalnymi bez pilnowania możliwości Wewnątrz odczytuje się jako zgodne, jednocześnie nic nie egzekwowając. AI_ASSISTANT i RAG_SEARCH celowo pozostają zablokowane: KlusterServices Ma osadzenia, szepty-asr i tłumaczenie, ale nie ma generatywnych LLM, i RAG dzieli jedną kolekcję Qdrant izolowaną przez filtr ładunku. Rozłam To byłaby papierowa zmiana. Dwa testy zakodowały model zgrabowane w aplikacji i są aktualizowane, a nie Przedłużone: PhiServiceTypeMappingMappingTest zablokowano aplikację, oraz FunkcjaServicePhiGateTest, którego zablokowane przykładowe przemieszczanie się z VOIP do RETAIL — VOIP nie można już odmowywać w czasie.
· kamo-internal
Ziemia wewnątrz nowo utworzonego org zamiast w konfiguracji DNS
Stworzenie orgi skierował twórcę do /setup/dns, a powód był prawdziwy: Wejście oznaczało przekierowanie OTK na wewnętrzne. Org nie ma DNS, więc host był nieosiągalny. Konfiguracja DNS była więc Cena otwarcia rzeczy, którą właśnie zrobiłeś -- dokładnie ściana, która to Praca usuwa się. Powołanie tworzenia już powraca jednorazowy klucz; kreator po prostu nigdzie nie miał - Na to, żeby go wydać. Obecnie wydaje go na obecne pochodzenie, gdzie sesja Nazywa się org, więc nie ma gospodarza, na który można czekać. Domena jest nadal warta posiadania, a ustawienia są tam, gdzie obecnie mieszka: Opcjonalny etap białej etykiety zamiast drzwi. Ostrzeżenia o znakach marki są Przeprowadzany w obie strony, a jeśli żaden klucz nie powróci, orgia nadal istnieje, Tak więc czarodziej ląduje na widoku majątku, a nie zawodzi. Sprawdzanie-nawigacja z klientem poprawnie oznaczyło window.location.href. Jego własny Nazwy docstring /validate z jednorazowym kluczem jako prawdziwy związany z sesją Skocz, więc jest to dopuszczone do tego powodu, a nie prac nad tym... Router utrzymałby sesję Star twórcy, co jest dokładnie tym, co jest właśnie Jest on zastępowany. 2857 testów i wszyscy 7 strażników przechodzi.
· kamo-shared-library
Daj ServiceType dwupoziomowe drzewo rodzicowe / dziecko
Sześć dzieci handlowych w nowych idach 26-31, przewody do POS w statycznym bloku Wzór RoleRightType (stała enum nie może odwołyść się do innego z Własne argumenty konstruktorów). MLOS i LOS reparent bez zmiany id, Ponieważ ORG_FEATURES utrzymuje id za pośrednictwem ServiceTypeConverter i ruch Przydzieli się każdy istniejący rząd. Kopia POS staje się "Liniami Biznesu" teraz, gdy rodzice pożyczają i Dokumentacja pacjenta; stała nazwa pozostaje POS, ponieważ - utrzymuje nazwy jako ciągi znaków. Jego stare Opis przenosi się do RETAIL, gdzie jest dokładny i już sprawdzony ServiceTypeCustomerCopyTest. Nowe stałe są wysyłane PLANNING/disabled, więc FeatureController.list's Pętla automatycznego przewidywania nie może ich włączyć dla każdego orgi. PhiServiceTppingMappingTest nie przejdzie przez projekt, aż do następnego zatplanowania map Nowe stałe; oba lądują w jednym pchnięciu.
· kamo-internal
Wykonaj org bez domeny do wejścia
Wejście orgu oznaczało nawigację do :-) Bez domeny, którą adres URL jest renderowany jako dosłowny Tak więc Enter został wyłączony, a właściciele Zamiast tego zostały przekierowane do /setup/dns - DNS był drzwiami, a nie Opcja białej etykiety. Przestrzeń robocza otwiera się teraz na początkach CURRENT, gdy nie ma zwyczaju na żywo Gospodarz, a sesja nazywa org. Najemca z działającą domeną niestandardową Nadal otwiera się na własnego gospodarza, więc nic się nie zmienia dla nikogo oznaczonym białym. Niedokończona domena niestandardowa jest traktowana jak żadna domena: HOST nie może Służyć jeszcze, co nie jest tym samym, co org jest nieosiągalny. Może Wprowadzanie docelowoC, więc klucze do rzeczy, która zawsze była prawdziwa Warunkiem wstępnym - członkostwem użytecznym - a nie w domenie. PotrzebaDomainSetup i orgStatus celowo zgłaszają niedokończone Domena: nie jest już barierą, ale nadal jest kimś wyjątkowym Zadanie, a widok osiedla jest tam, gdzie to zostanie zauważone. Powłoka musiała również przestać pytać nazwę gospodarza, w której org jest. Korześcijanie Układ rozebrany "wewnętrzny" i spojrzał gospodarzem w górę, który odpowiada "kto jest właścicielem To imię" - to samo pytanie, w którym "którego przestrzenią roboczą jestem ja" tylko podczas gdy Każdy lokator miał swojego gospodarza. Na platformie hosta zwraca Właściciel platformy, więc członek wchodzący do orgi bez domeny zostałby pokazany Marka, cechy i prawa KamoCRM Inc. Teraz najpierw pyta o sesję via /api/org/current i spada z powrotem do gospodarza, gdy nie ma sesji, Co utrzymuje podpisane renderowanie pocisku. Plik cookie jest tym, co tworzy To jest osiągalne w ogóle - sessionStorage jest niewidoczny dla żądania dokumentu. 2857 testów i wszystkie 7 skryptów straży.
· SecurityService
Pozwól muszle wyjąć swój org z sesji, a nie gospodarza
Układ korzeniowy kamo-internal odczytuje nagłówek hosta, paski "wewnętrzne". Pozyskiwanie /org/domena/a to>. Na gospodarzu obsługującego jednego najemcę, który jest taki sam Pytanie jak "który jest ja"; na wspólnym gospodarzu jest to inne pytanie Z niewłaściwą odpowiedzią - zwraca każdego, kto jest właścicielem gospodarza, więc członka, który Wprowadzony do wprowadzenia orgi bez domeny otrzymałby markę KamoCRM Inc., funkcje Flagi i flagi. Dodaje G /api/security/org/current, zwracając przewidywany rekord dla Organizacja SESJA dzwoniącego jest w toku. Układ może do niego dotrzeć, ponieważ Istnieje już nagłówek Cookie i plik cookie, więc serwer Może zobaczyć sesję, mimo że sessionStorage jest niewidoczne dla dokumentu Proście. Nie przyjmuje żadnego parametru, celowo. Pierwszy projekt zaakceptował identyfikator lub alias I poprawnie odrzuciła to: ten kształt Czyni to rekord org, który jest wyliczalny, odgadując alias, a aliasy są Zgadwalne. Sesja już wie, w którym org jest, więc parametr Można zapytać tylko o inną. Wraz z sesją rozwiązaną Zapadka przechodzi samodzielnie, a nie wymaga podstawowego wejścia. Projekcja jest ekstrahowana, a nie kopiowana. Dwa punkty końcowe zwracają dwa Kształty tego samego rekordu to awaria, której warto zapobiec - klient Nie wiadomo, który trzyma, a oni dryfują za pierwszym razem, gdy tylko jeden jest Zaktualizowano. 928 egzaminów przechodzi.

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