Mergi la conținut
KAMOUniverse

Jurnal de schimbări

Ce e nou.

Fiecare îmbunătățire a platformei, pe măsură ce se livrează.

  1. · kamo-shared-library

    Adaugă un control global al pseudo-unicității

    ************Scopuri de furnizor, și că a avut dreptate în timp ce un alias a fost doar vreodată rezolvat ca (security provider id, alias) gazda. Două orgi în cadrul unor furnizori diferiți ar putea împărtăși una fără ambiguitate. O organizație poate fi acum numită direct prin aliasul său, cu ?org=, și Această căutare nu are nici un furnizor la domeniul de aplicare de. Un alias repetat face referinta ambiguu platforma la scara larga, asa ca OrgResolutionService refuza Mai degrabă decât să culegeţi unul care lasă ambele organizaţii inaccesibile de alias. Proprietatea live conține deja repetări (patru orgs parts "acme-corp," două părţi "kia-kaha"), motiv pentru care soluţionarul refuză; acest lucru este ceea ce se oprește mai mult fiind create. ExcludeId permite unei organizații să-și păstreze propriul alias în timp ce alte domenii sunt salvat; trece nul atunci când creați. 1597 teste trec.

  2. · KlusterServices

    Trimite un raport de eroare în Codul VS deschis al salviei

    URI handler care creează o conversație într-o fereastră RUNNING și pre-fill-uri intrarea, care este singura modalitate de a ajunge la salvie editor deja a deschis În loc de a începe un al doilea lângă ea. URI poartă un prompt și nimic altceva, astfel încât modelul și efortul trece prin coderProcessWrapper și nu ia niciodată argv din fișier, astfel încât un fișier falsificat poate alege un alt model şi nimic mai mult. URI pre-fills, dar nu prezintă, astfel încât depunerea este o revenire sintetică şi apoi agentul aşteaptă o transcriere înainte de a raporta succesul. ă Acul pe care îl caută este escapadat de JSON: transcrierile sunt JSONL şi caută pentru liniile noi brute ar marca fiecare mesaj livrat ca fiind eșuat.

  3. · InitializerService

    Creează tabele bugs de sistem

    Nu există restricții de verificare a coloanelor ordinale: support ticket status check is Ce se întâmplă atunci când Hibernate îngheaţă unul la dimensiunea unui enum şi enum atunci crește, și SystemBugStatusType este de așteptat să crească. Aplicat la yb-tserver:5433 de asemenea manual, deoarece acest serviciu nu are CI.

  4. · kamo-internal

    Gestionează un domeniu personalizat din setările companiei

    Un domeniu folosit pentru a fi poarta într-o organizație: DNS trebuia să fie Configurat înainte ca cineva să poată semna, de aceea /setup/dns a fost ajuns de la vrăjitorul de creaţie de orgi şi de la un banner "needs setup" decât din setări. Este opţional acum, deci aparţine restului etichetă albă. Adaugă o secțiune de domeniu personalizat la setări → Essential → Comportament & Etichetare, între Compania Info și Branding. Arată domeniul curent al org-ului, sau spune clar că nu există unul, și deschide / configurare / dns pentru a adăuga sau schimba Ea. Butonul citeste "Seteaza un domeniu" sau "domeniul Manage" in functie de care dintre ele este. Copia duce cu spațiul de lucru fiind deja accesibile la kamocrm.com, Deci un proprietar care nu-şi vrea niciodată propria adresă ştie că e ceva ce ei nu ştiu. poate ignora. Folosește orgIdStr mai degrabă decât organizație.id: acest domeniu este un număr JS și truncates int64 org ids trecut MAX SAFE INTEGER, care ar deschide DNS pagina pentru o organizaţie diferită. Butonul este dezactivat până când rezolvă mai degrabă decât navigarea cu un ID greșit. Copie aterizat în kamo-translation-dictionary primul (98ee7cb6) nepinted at image-build time, so app- first is a rosu built. 2921 teste și toate cele 8 gardieni trece, i18n incluse.

  5. · SecurityService

    Trimite copacul si pe criteriul final al app-catalogului

    Tipuri de ramură → Aplicații permise își construiește editorul din /fetures/app-catalog, Nu de la chiriaș caracteristici de listare, așa că a fost singura suprafață care ar putea nu văd ce aplicații sunt copii din care. Un părinte decide ce Copiii pot fi chiar oferite, astfel încât editorul are nevoie de aceeași formă. 947 de teste verzi.

  6. · kamo-internal

    Predați arborele aplicației, și confirmați ceea ce un părinte switch-off ia

    Copiii stau acum sub părinţii lor în lista Aplicaţii & Caracteristici, fiecare cu Propriul său comutator. Cuiburile se exprimă prin ordin plus o liniuță mai degrabă decât o container cu cuiburi, astfel încât cardul existent, mișcare și codul de trecere este neatinsă şi un copil al cărui părinte este filtrat din fila curentă Încă redă la nivel superior decât să dispară. Două comportamente cascada a făcut necesar: Comutarea aplică acum întreaga listă de caracteristici a serverului în loc de flipping rândul clic. Activarea unui copil își activează părintele și dezactivează o părinte oprește fiecare copil, astfel încât o actualizare locală un singur rând ar pleca UI nu este de acord cu serverul despre orice altceva cascada Atins. Ambele criterii au returnat deja lista completă; nimic nou nu a fost nevoie de server-side. Vechea cale de un singur rând rămâne ca o rezervă pentru o Securitatea Serviciul care nu trimite nicio listă. Schimbarea unui părinte cere în primul rând, numirea copiilor va lua cu Ea. Aceasta este o acțiune mai mare decât aspectul comuta. Copacul vine din obiectivul caracteristicilor mai degrabă decât o oglindă TypeScript de ServiceType serverul este singurul loc care cunoaște catalogul operatorului. 203 fişiere de testare / 2921 teste verde, construi curat.

  7. · InitializerService

    Price the commerce children and the EHR, with a totality guard

    Nici harta prețurilor nu a avut un control de totalitate, iar cele două moduri de eșec sunt diferite şi tăcute. Lipsește de la CATALOG, o aplicație aterizează nicăieri pe matricea de tarifare. Lipsește de la TIERS, fiecare nivel scrie este includet= NE SALVARE, deoarece eșuarea se aplică numai atunci când un plan nu are niciun rând Şi asta scrie una. Deci o aplicaţie uitată este dată ori tuturor sau blocat pentru toată lumea, și care unul depinde de un detaliu nimeni îşi aminteşte atunci. Cele cinci verticale comerciale stau exact pe treaptă POS. Ei nu au fost separat purchasable înainte de arborele aplicației ar putea face, ar putea face astfel încât punerea lor oriunde altundeva ar fi retroactiv taxa pentru capacitatea de oameni au deja. Un test de pini care la POS mai degrabă decât la literalmente, astfel încât în mișcare POS le mișcă. EHR este negociat de întreprinderi ca sistemele de origine: nici un preț listă, Doar planuri, absente de la fiecare nivel. La bordul unui client PHI înseamnă o BAA și o revizuire a conformității, nu o verificare autoservire. 159 de teste verzi.

  8. · kamo-marketing

    Nu mai număra vizitele unui membru la propria legătură

    Un membru care verifică dacă propriul link de urmărire funcţionează este cel mai frecvent primul vizita orice cod devine vreodată, și este mai rău decât inutil: umflă numărul Acestea sunt măsurate pe, este imposibil de distins dintr-o perspectivă reală în vizitator Sertar, şi îi lasă să aibă o prăjitură permanent vizitator astfel încât fiecare vizită mai târziu Contează din nou. Un cod care arată trei vizite, toate acestea persoana care l-a bătut, este o înregistrare de plată cu o minciună în ea. Acest site este singura origine care poate răspunde la întrebarea nici un membru, iar consola internă nu poate seta un cookie pe www. <apex> de la Intern. Ce traversează acel decalaj este o legătură: sosirea cu ?mrt self=1 ments excluderea și de atunci pe browser este exclusă la fiecare vizită, fie Nu parametrul este acolo. Fila Coduri de urmărire internă crește controlul că produce acea legătură. Nu este suficient menting, astfel încât o vizită exclusă DELETEES vizitator și sursă Şi prăjiturile. Un membru care a vizionat link-ul lor înainte de această expediere, sau care a optat pe un browser deja numărat, este încă transportă un GUID pentru oricine are una. Fără ștergere opt-out ar fi lucrat doar vreodată pentru oameni care nu au nevoie de ea. Excluderea nu este în mod deliberat în TRACKING COOKIES: care set este ceea ce cookie Politica de ștergere a controlului șterge, și ștergerea o opt-out cu identificatorii ar re-înscrie în tăcere un vizitator care a cerut să nu fie luate în considerare pe controlul cel mai probabil să fie presat de exact acea persoană. Check-diconte-cookie crește de la 50 de controale la 72, acoperind valoarea de potrivire, ortografia parametrilor, excluderea setată prin ștergere și cele două variabile sursă (middleware trebuie să şteargă identitatea, baliza trebuie să scape la nivel local, deoarece Middleware ruleaza pe cereri de documente in timp ce baliza ruleaza pe fiecare client-side navigare).

  9. · kamo-internal

    The Afiliate Sales Scoreboard widget

    O coloană de grilă lată și două rânduri înalte: cele zece persoane din organizație Aducerea cel mai mult prin link-urile lor de urmărire, peste astăzi, în această lună, acest Anul sau tot timpul, deschiderea pe vizitatori în această lună. Reordonarea este caracteristica. Orice alt mod de a arăta patru metri peste patru Ferestrele sunt 16 liste separate; aceasta este o listă care se rearanjează singură. Rânduri sunt tastate de membru și transporta o animație de aspect, astfel încât trecerea diapozitive categorie aceleași persoane trecut unii pe lângă alții, mai degrabă decât golirea pană și cârlig tine fiecare bord a adus, astfel încât presa care declanseaza ca animatie are date de animat la același cadru. Selectoare sunt stocate împotriva PROFILULUI membru, nu localStorage, astfel încât Cineva se află la biroul lor. E placa pe care o au pe laptop. Ambele cititorii descresc o valoare nerecunoscută la implicit, mai degrabă decât refuzând-o serverul aplică regula identică și redă ceea ce a folosit, astfel încât o Preferința scrisă de o clădire mai veche nu poate lăsa niciodată un membru pe un geam gol. Un membru din afara primilor zece devine propria linie fixat sub lista, și o membru cu nimic încă devine la gradul zero. Un consiliu care poate spune doar "eşti nu pe ea" este singurul lucru pe care un tabel de bord nu trebuie să facă oamenilor care există pentru a motivaţie. De asemenea, aici, deoarece este aceeași problemă de la celălalt capăt: un control "previzualizare" pe fila de coduri de urmărire care deschide un link FĂRĂ numărarea vizitei. Verificarea În cazul în care propriile terenuri link-ul este cea mai frecventa prima vizita orice cod devine vreodată, și numărarea pune propriile clicuri ale membrului în înregistrarea pe care sunt măsurate. ConstruieșteTracking PreviewLink este link-ul real plus marker site-ul de marketing citeste un contract cross-repo, asa ca testul pins numele parametrului.

  10. · MediaService

    Obiectivul tabloului de bord privind vânzările afiliate

    GET ************* răspunde la asta Primii zece ai organizaţiei pentru un metru peste o singură fereastră, plus cei ai apelantului în picioare atunci când acestea nu sunt pe ea. Contorii de pe METODA TRACKING CODES nu pot susține acest lucru: sunt toate timpurile roll-up-uri fără dimensiune temporală, și nu există nimic într-un total de rulare că Spune când s-a întâmplat ceva. Adevărul cu ferestre este în rândurile *************** pentru achiziţie, şi fiecare conversie proprie * AT timbru pe VIZITORI DE PUNERE PE PIAŢĂ. Care este, de asemenea, de ce All Time este de acord cu codul grilă: aceleaşi date, luate la fel, nu o a doua evidenţă contabilă. Patru decizii care merită declarate: - Achizitia este datata de primul contact, nu de activitate. Numărarea vizitatorilor care au fost doar active în fereastra ar re-credita aceeași persoană în fiecare lună, Aşa că munca făcută o dată ar fi fost mai importantă decât munca făcută acum, pentru totdeauna. - Conversii rang de atribuitTrackingCodeId singur. Acea coloană îngheaţă moment un cont există; lastTrackingCodeId continuă să se miște, și clasarea pe ea ar lăsa un membru să ia convertirea închisă a altuia cu un clic în plus. - Fereastra este tăiată în calendarul membrilor şi comparată în UTC. "Luna asta" diferă de până la o zi, în funcție de al cărui calendar este cerut, și fiecare coloană în această schemă este un localDateTime fără compensare însemnând UTC. - Toate cele patru măsurători sunt calculate pe cerere, deci schimbarea categoriei este un moment re-sort de rânduri deja pe ecran, mai degrabă decât un spinner. Gated on AFFILIATE SCOREBOARD WIDGET and nothing else Javadoc. Acesta cumpără nici un burghiu-jos: nu există nici un cod id, nici un ID vizitator și nici un membru parametrul de evaluare a obiectivului final și fiecare criteriu de evaluare a analizei prin id încă trece prin MarketingTrackingScopeRezolvator neschimbat. Cele patru agregari folosesc comma-join mai degrabă decât să adere..ON pentru că nici Cheia străină este o asociere JPA și forma de virgulă parses pe fiecare hibernat versiune flota ruleaza modelul de entitate reală la 6.2.13 și blochează achiziția, atribuirea și chiriașul Predicate care nu reușesc în tăcere în cazul în care derivă.

  11. · kamo-shared-library

    Adăugați drepturile de control al tabloului de bord aferent vânzărilor

    Cinci drepturi, 234-238, în grupul DE PUNERE PE PIAŢĂ şi a atârnat pe AviZ REFERRAL CODES: un clasament al numerelor de trimitere este datele de urmărire-cod, și un membru care poate nu vedeți fila de coduri de urmărire nu are nici o afacere pe ea. Widget dreapta totalul membrilor, și că este deliberat. 200/201 poarta ANALITICS: a cărui vizitatori, ale căror adrese, ale căror cronologie, a rezolvat per membru țintă de către Rezolvator. Un tablou de bord dezvăluie un nume, un rang și un număr, Toată lumea deodată. Cercetând dreptul de analiză la scară largă org ar lăsa vizibil numai administratorilor care dețin unul, care este un raport mai degrabă decât un consiliu. NEînsămânțat deliberat, din același motiv 200 și 201 nu sunt: însămânțarea ar publică toate sesizările deţinătorilor existenţi, în total, către colegii lor din oficiu care a expediat-o, care este o decizie de divulgare luată de o trimitere mai degrabă decât de un administrator. 22916/32/31, în forma auditată, toți cei cinci sunt copii și AVE REFERRAL CODES este ea însăşi un copil al MARKETING, astfel încât nici o găleată rădăcină se mişcă.

  12. · kamo-login

    Marca și domeniul de aplicare ecranul de sign-in cu ?org=

    login.kamocrm.com este ecranul de sign-in pentru fiecare organizație care nu are gazda proprie, astfel încât numele gazdei nu poate spune în care se semnează. ?org= face: numele organizației prin id sau alias, selectează branding la vopsea, și călătorește cu acreditările ca organizația ei sunt Verificat împotriva. Un indiciu, nu o acreditare. Calitatea de membru este dovedit server-side fie un fel, așa Numeşte o organizaţie pentru care nu ai dreptul să obţii acelaşi refuz ca şi numirea. una fictivă. Cel mai rău o referință greșită atinge logo-ul greșit pe o pagină publică. Marcarea vine de la serviciul de securitate /org/public/{ref}, transmis mai degrabă decât repunerea în aplicare, astfel încât regula cu privire la ceea ce o referință credibilă poate expune Stai într-un singur loc. Baza tematică urmează apoi organizația în loc de gazda, utilizată ca dată: renunţarea la prima etichetă la calea gazdei nu ar transforma acme.kamocrm.com în kamocrm.com și vopsea un chiriaș în branding platforma lui. Prima vopsea foloseste in mod necesar branding gazdei, deoarece referinta nu a fost încă rezolvată; KAMO THEME repply revops o dată ce a avut. O vizită că numele nici o organizație șterge orice referință o vizită anterioară înregistrată în această filă, astfel încât ecranul propriu platformei nu păstrează altcuiva logo.

  13. · SecurityService

    Servește brandingul unei orgi pe un ecran fără sesiune

    Login, înregistrare și lobby-ul întâlnire vopsea culorile unei organizații înainte de orice sesiune există. Ştiau care din numele gazdei. Exact ceea ce o organizație fără un nume de gazdă proprie nu poate furniza. GET /api/security/org/public/{ref} transformă o referință explicită ?org= -- ID-ul ca cifre, sau alias - în ceva de pictat. Branding DOAR: nume, logo, culori, local, gazda tematica. Nu caracteristici, nu drepturi, nu domenii, nu membri. Prima încercare de acest lucru a reutilizat Inregistrarea organizatiei proiectate si cutia finala a refuzat-o, Corect - pseudonime sunt ghicite, astfel încât un record complet în spatele unui ghicit referinţa enumeră configuraţia fiecărei organizaţii. Ce a mai rămas este Ceea ce oricine deschide pagina de sign-in organizației deja vede, și un numele de testare câmpurile excluse individual, astfel încât punerea unuia înapoi trebuie să fie deliberat. Citit numai. Fratele /org/domeniu/{host} auto-provizionează caracteristicile aplicației ca o reacţii adverse; un obiectiv care poate fi atins prin presupunere nu trebuie să fie scris. O referinţă necunoscută 404 şi la fel şi un alias ambiguu -- de PublicRef Deja refuză o denumire mai multe orgi, și acest pini că refuzul ajunge la apelant ca "nu o astfel de organizație" mai degrabă decât ca altcuiva Marcare. Apelantul se întoarce la platforma proprie. temaDomeniu are aceeaşi valoare ca şi folia şi utilizarea tematicii de furnizor; Deci, un ecran de pre-sesiune citește branding orga din dosarul a fost de fapt, scris la - {alias}.kamocrm.com pentru un org fără domeniu. 947 teste trec.

  14. · MediaService

    Refuză înregistrarea întâlnirii unui chiriaş care se ocupă de PHI

    Împărţirea capacităţilor a făcut ca ServiceType.MEET să permită o conferinţă live pe auto-hosted Meet nu părăsește clusterul a rămas blocat, pentru că această conductă postează întreaga transcriere la multi-ofert router AI și apoi e-mailuri rezultatul pentru fiecare participant inclusiv oaspeții externi. Aceasta este o copie terţă de nerenumit. Paznicul stă în ingerarea privată () ambele puncte publice de intrare pâlnie prin, astfel încât refuză înainte de orice octeți ajunge la MinIO, și din nou la partea de sus of runSummaryPipeline, which is public and @Async. 200 de teste verzi.

  15. · VOIPService

    Capacitatea blocată depăşeşte acum poziţia dreaptă, şi modul Dumnezeu

    PhiPlaybackAuthorizer poartă PHI apel redare pe view CALL LOGS. Asta a fost. întregul cec deoarece ServiceType.VOIP cartografiat la blocat Modulul VOIP RECORDING, astfel încât un chiriaș PHI nu a putut avea sistemul telefonic la Toate şi această clasă nu a fugit pentru unul. Diversificarea capacității a făcut ca VOIP în sine să fie permisă. În timp ce VOIP RECORDING a rămas blocat PEND WORK din motive care nu s-au schimbat: redarea nu efectuează verificarea clearance-ului, transcrieri plimbare în metadate, și nu există nici o cale de reținere sau ștergere. Lăsat singur care ar fi fost o slăbire directă: un chiriaș PHI ar putea permite Sistemul telefonic şi, cu un drept acordat, redaţi totul. Deci, PhiCapability Gardianul conduce primul şi refuzul e definitiv. Este nevoie de nu parametru apelant, astfel încât pentru un chiriaș PHI nu-l ridică nici un drept Face o sesiune de Dumnezeu activ, care este proprietatea care contează cel mai mult. Acum e momentul. Nu-ţi face griji. Trei teste au codificat vechiul contract și sunt rescrise mai degrabă decât șterse, fiecare înregistrare de ce așteptările răsturnat. Mesajul de refuz al căsuţei vocale nu mai dă vina pe dreptul lipsă, care De obicei nu mai este motivul. 152 de teste verzi.

  16. · SecurityService

    Serveşte arborele aplicaţiei şi repară auto-enable-ul nepăzit

    CaracteristiciController trimite acum părinte/copii/parent pe fiecare serie aplicație astfel încât clientul poate face copii cuiburi sub părinții lor. Servit mai degrabă decât oglindite în TypeScript în scop: oglinzile de tip service au alunecat din Java de două ori deja și o a doua copie a copacului ar să mai fie un lucru de pierdut. Nu a fost necesară nicio nouă formă de răspuns pentru axul Deja re-serializa întreaga listă de caracteristici, astfel încât modificările knock-on ajunge fără ca clientul să împace ceva. Ambele bucle auto-productie acum sări peste un copil al cărui părinte platforma nu nu oferă, deoarece permiteFeature cascads părintele pe și ar altfel Porneşte un părinte pe care nu l-a publicat nimeni. bucla OrganizationController a avut nici o verificare PHI în timp ce FeatureController Echivalentul a făcut-o, pe un obiectiv public neautentic. Pentru un chiriaş PHI Primul modul blocat aruncat, captura din jur logat un avertisment, și caracteristici eficiente cazut in tacere inapoi la randuri brute fara model aplicat Proiecţie. Acum cere mai degrabă decât capturi, exact ca caracteristicile Listarea nu. /api/security/ehr înregistrat. Prefixele de comerț rămân cartografiate la POS: Parintele este poarta dreapta si ***************** rafinează deja pe piață. 938 de teste verzi.

  17. · kamo-internal

    Oglindeşte cele şase aplicaţii comerciale pentru copii şi opreşte oglinzile care plutesc

    Ambele oglinzi TS sunt acum GENERATE din ServiceType.java mai degrabă decât întreţinute manual. S-au îndepărtat rău de Java şi unul de celălalt: vechi "Integrare RAG" și "Falls înapoi la organizația-mamă SMTP" copie care Java eliminat în 2026-08, POS marcat Planificare în ServiceType.ts în timp ce AppType.ts a spus complet, și descrieri diferite pentru aceeași aplicație în fiecare fișier. Merită să știi înainte de a avea încredere în ei: Afișare Nume și descriere aici sunt citit de nimic. Fiecare consumator foloseste aceste constante doar pentru identitate. hasFeature() meciuri pe ID, tastele appServiceIcons pe nume. Copy vine de la GET /api/security/fetures, which onores PLATFORM APP CATALOG suprascrie oglinzile nu pot vedea. Corzile sunt sincronizate astfel încât un cititor nu este indus în eroare, şi antetul de fişiere spune să nu începi să le faci. Arborele parinte/copil nu este in mod deliberat oglindit Obiectivul final trimite părinte/copii/parent per aplicație și o a doua copie a aplicației forma ar fi un lucru mai mult pentru a deriva. De asemenea: o pictogramă pe verticală nouă, mai degrabă decât împrumutarea părinţilor magazin, și Getters organizație, inclusiv IsEhr.

  18. · kamo-internal

    O bară de defilare, de trei ori mai largă, în fiecare conversaţie

    Barul de lângă mesaje a fost 8px în chat și SMS-ul membru, 6px în bilete de sprijin și social, și în Al chat-ul a fost nimic, la toate: că lista a declarat în afara regulilor sale:-webkit-scrollbar, și de la Chrome 121 a non- Am linia de par a platformei. globals.css documente care se pronunţă pentru scroller pagină; nimic l-au pus în aplicare, și conversația AI a fost în liniște pe partea greșită a acesteia. Toate cele cinci citiți acum un CHAT SCROLLBAR constant: un 24px jgheab lățime veche Încă mai citeşte ca o pastilă într-un jgheab mai degrabă decât ca o lespede sudată până la marginea ferestrei. chat-ul AI Proprietățile standard se deplasează în: Globals.css le pune și singurul loc Firefox le citește fără a costa Chrome regulile sale. Testul este de nivel sursă, deoarece subiectul este o foaie de stil și jsdom nu implementează bare de defilare: Înţeapă că nici o fereastră nu-şi măsoară bara de la literal, şi că niciunul nu stabileşte standardul. proprietatea nepăzită din nou.

  19. · InitializerService

    Extinde bunicul pieței în backfill-ul de copac aplicației

    bunicul există GatedMarkets deja a mers pe piețele active ale fiecărei org, rezolva getRequiredService () şi a activat aplicaţia lipsă se limitează la IsGated () verticals, adică MORTAGE și Personal LOANS. Acum că fiecare tip de comerţ îşi numeşte propria aplicaţie pentru copii restricţia a dispărut, deci aceleasi seminte de bucla RETAIL / RENTAL / SERVICE / SUBSCRIEREA / Rânduri de asigurare. Nu era necesară nicio nouă migrare. De asemenea, semințe RETAIL pentru orgi care dețin POS fără piețe la toate, care au avut munca comercială înainte de copac, deoarece vânzarea cu amănuntul nu avea nevoie de o aplicație proprie. Orgile de nivel superior nu mai sunt sarite, si asta este fix care conteaza. Exceptarea a avut dreptate atunci când acest lucru a acordat doar cele două aplicații de creditare a platforma-operator org nu ar trebui să dobândească în tăcere MLOS pentru arborele aplicației, deoarece esteAppEfficientlyEnabled necesită o OrgFeature ROW și nu are o scutire la nivel înalt. Primul termen a raportat succesul în timp ce părăsirea KAMoCRM, care rulează piețe active RETAIL și SUBSCRIPTION, cu nu există rânduri pentru niciunul; ar fi pierdut ambele de la /commerce pe următorul Securitatea Echipaj. Prins prin interogarea bazei de date, nu prin citirea jurnalul. permite acum feature cascads un copil la părintele său, astfel însămânțarea unui copil, de asemenea, garantează rândul POS. RUN împotriva prod 2026-08-24. Verificat: fiecare rând activ de comerț piețe Acum are un copil activ OrgFeature rând, zero lipsă.

  20. · SecurityService

    Dreptul de a verifica fiecare verticală, nu doar poarta două

    Fiecare tip de comerț acum numește propria aplicație pentru copii în conformitate cu POS, astfel încât isGated() scurtcircuit care flutura vânzarea cu amănuntul, închirieri, servicii, abonamente şi achiziţiile au dispărut. Aceste piețe sunt acum verificate împotriva propriei lor aplicații, care este punctul: o verticală poate fi vândută și Oprit, pe cont propriu. Depinde dacă KamoInitializer-ul va fugi.

  21. · kamo-internal

    Căutarea barei de instrumente este o glifă care se deschide într-un câmp

    Member chat-ul a purtat o cutie de căutare permanentă pe partea de sus a ferestrei întreaga bară de unelte, cheltuită pe un control care este gol aproape tot timpul și folosită în explozii. Acesta este acum o mărire 28px care se deschide în câmp pe clic, iar bara de instrumente citește ca patru Glife şi aer. Ideea este construita in jurul: maritorul nu se misca niciodata si nu este schimbat niciodata. Se prăbuşeşte pilula este 28px și pictograma stă la centrul său, 14px de la marginea stângă; deschis, pilula are 6px de Padding înainte de o pictogramă 16px, care pune centrul pictograma la 14px din nou. Pastila crește prin urmare Din spatele unei glife care ţine nemişcată, iar controlul arată ca un obiect care se deschide mai degrabă mai mult de două state. Latimea izvoarelor cu un pic de depasire pe drum deschis si nici unul pe cale de închidere; ocupantul trasee creșterea cu 60ms astfel încât textul ajunge într-o cutie care Are deja loc pentru ea; izvoarele de control clare în doar o dată există ceva pentru a șterge. Închiderea șterge întotdeauna interogarea, iar câmpul nu poate fi închis în timp ce deține una: a Magnificul prăbuşit încă filtrează conversaţia ar fi fereastra situată despre ceea ce este Arată. Ceaţă lasă deschis cu text în ea, şi un clic rătăcit pe glifă se concentrează câmpul în loc să renunţe la căutare. Mișcarea redusă este onorată pe tot parcursul, gliful poartă inelul de focalizare pentru un Tab, precum și o Faceți clic pe, și 50px distanțier cutia veche necesară este plecat cu ea.

  22. · kamo-shared-library

    Fiecare verticală își numește propria aplicație pentru copii

    serviciul necesar devine total acum că fiecare verticală are o aplicație pentru copii sub ServiceType.POS, care elimină "null înseamnă POS singur este suficient" caz special și isGated() cu acesta. Fiecare verticală poate fi acum pornită, licențiat și PHI-clasificat în mod independent, care este ceea ce permite un medic practica de utilizare a comerțului, la toate, deoarece RETAIL rămâne blocat pentru un chiriaș PHI în timp ce restul comerţului nu. HELKARE (ServiceType.EHR) este ceea ce face ca EHR să apară la *************** atunci când aplicaţia este pornită, fără să aibă loc un nou joc Cod: afirmaCommerceTypeAlowed,getAlowedCommerceTypes, the criteriile de evaluare a tipurilor permise în spatele ambelor părți interesate; *************** şi lista de piaţă filtrează tot deja rezolva prin getRequiredService(). NU PUSHED până când KamoInitializer a alerga. afirmă CommerceTypeAlowed citeste getRequiredService () direct, astfel încât în momentul în care Serviciul de Securitate vede acest lucru fiecare org cu o piață de vânzare cu amănuntul sau de închiriere are nevoie de un copil OrgFeature rând ea nu Încă nu.

  23. · MediaService

    Configurarea publică să fie abordată de către org id, nu numai de către gazdă

    Meet sidecar se uită în sus orga întâlni config pentru a decide dacă un oaspete Are nevoie de o parolă de întâlnire. A întrebat pe nume gazdă, care la întâlnirea comună gazda soluţionează organizaţia platformei -- un chiriaş care necesită parola ar fi avut această cerință scăzut în tăcere pentru fiecare oaspete aderarea prin link. Un oaspete nu are şedinţă, aşa că singurul lucru care-şi numeşte chiriaşul este camera, care acum poartă un semn de org. Prin urmare, ambele obiective publice acceptă orgId explicit și cad înapoi la căutarea domeniu atunci când nu este dat, așa Nimic din ce cere gazda astăzi nu se schimbă. Id-urile ajung ca cifre și sunt parsed ca o lungă: acestea sunt trecut 2^53, astfel încât unul Tradus printr-un nume dublu o organizaţie diferită. 200 de teste trec.

  24. · kamo-shared-library

    Funcția Cascade permite/dezactivează peste arborele aplicației

    Activarea unui copil permite părintelui său; dezactivarea unui părinte dezactivează fiecare copil; dezactivarea ultimul copil dezactivează părintele. Activarea unui părinte lasă copiii în pace, astfel încât un părinte a pornit în mod deliberat cu nu Copiii rămân. Cascada este determinată de evenimente și nu există în mod deliberat nici o reconciliere matura. Aceasta este o proprietate de siguranţă: un părinte permanent înfiinţat "Invariantul ar opri comerţul pentru fiecare org existent în momentul în care acest transport, pentru că nu există rânduri pentru copii până la KamoInitializer rulează. Un copil afirmă garda PHI pe modulul părintelui său, precum și pe propriul său, înainte de orice scrie ar fi fie blocați sau ar comuta în tăcere părintele blocat pe.

  25. · kamo-shared-library

    Adaugă PhiCapabilityGuard pentru verificarea capacității apel-time

    PhiTenantGuard ruleaza la timpul de functionare-enable si nicaieri altundeva site-uri, toate în Serviciul de caracteristici. Acum, că PhiModule este grained capacitate, o aplicația a cărei bază este permisă poate conține încă o capacitate care nu este, şi verificarea timpului nu poate vedea diferenţa. Aceeaşi semnătură deliberată ca PhiTenantGuard: o funcţie pură a (status, modul) cu nici un apelant, dreapta sau modul Dumnezeu parametru, astfel încât există Nimic de ridicat. Clasă simplă, mai degrabă decât un stereotip. @Componentul care are nevoie de un depozit neecranat are patru servicii crash-looped ori; fiecare serviciu consumatoare declară propria @Bean. NOTĂ: ÎNTÂLNIREA RECORDAREA ȘI VOIP RECORDAREA SUNT ACUM ELIBERATE ServiceType, dar nu încă păzit la site-urile lor de apel, care este următorul comite atinge MediaService și VOIPService. Acest lucru este inert în producție Între timp, pentru că fiecare org are în prezent mânerePhi=fals, dar apelul site-urile trebuie să aterizeze înainte de orice chiriaș este marcat.

  26. · kamo-shared-library

    Split PhiModule de la app-grained la grained capability

    POS mapped to ECOMMERCE SYNC (BLOCKED NO BAA) și întregul comerț suprafața atârnă de POS, astfel încât o org cu mânereFhi=adevărat nu a putut comuta comerț pe toate construit pe ea. Cele zece adaptoare de sincronizare de vânzare cu amănuntul sunt lucrul care lasă limita, nu coloana comercială. Hărţile POS către COMMERCE CORE (permis) şi ECOMMERCE SYNC pentru copilul RETAIL. Aceeași corecție pentru MEET (viu conferință vs. Conducta de sinteză care transmite transcrieri către Inference externe) și VOIP (telefonie vs înregistrări stocate și transcrieri). ȘEDINȚĂ RECORDARE și VOIP RECORDING nu mai au deloc tipul serviciului: sunt capacități Accesibil doar prin cod, iar Javadocul lui PhiModule declară acum regula că o astfel de constantă trebuie verificată de către PhiCapabilityGuard la apelul său site-ul. Reclasificarea unei aplicații permise fără a proteja capacitatea În interior se citeşte ca fiind conform în timp ce aplicarea nimic. AI ASISTANT și LAR SARCH rămâne în mod deliberat blocat: KlusterServices are înfățișări, șoaptă-ar și traducere, dar nici un LLM generativ, și LAR împarte o colecție Qdrant izolată de un filtru de sarcină utilă. Împărţire Acestea ar fi o schimbare de hârtie. Două teste au codat modelul app-grained și sunt actualizate mai degrabă decât extins: PhiServiceTypeMapping Afirmaţia de aplicare blocată a testului şi FeatureServicePhiGateTest, al cărui exemplar blocat trece de la VOIP la RETAIL .

  27. · kamo-internal

    Teren în interiorul unui org nou creat în loc de la configurarea DNS

    Crearea unei org l-a direcţionat pe creator către /setup/dns, iar motivul a fost real: introducerea a însemnat o redirecționare OTK către interior.<noul domeniu> și un nou-nouț Orga nu are DNS, astfel încât gazda a fost de negăsit. Prin urmare, configurarea DNS a fost prețul de deschidere lucru pe care tocmai l-ați făcut - zidul exact acest munca se îndepărtează. Apelul de creare returnează deja o cheie unică; vrăjitorul nu avea nicăieri să-i cheltuiască. Acum o petrece pe originea actuală, unde sesiunea nume de org, astfel încât nu există nici o gazdă să aștepte. Un domeniu este încă în valoare de a avea și Setări este în cazul în care trăiește acum: o pas opţional alb-etichetă mai degrabă decât o uşă. Avertismentele de marcare sunt purtat prin nici un fel, și în cazul în care nici o cheie vine înapoi org încă există, Aşa că vrăjitorul aterizează pe priveliştea proprietăţii în loc să cedeze. check-client-navigarea a marcat corect fereastra.location.href. E al ei. docstring names /validat with a one-time key as a true session-boundary Salt, deci acest lucru este permis listat cu acest motiv mai degrabă decât a lucrat în jurul valorii de - router-ul ar păstra sesiunea OLD a creatorului, care este exact ceea ce este înlocuit. 2857 teste și toate cele 7 gărzi trec.

  28. · kamo-shared-library

    Oferă ServiceType un arbore părinte/copil cu două niveluri

    Șase copii comerț la noi ID-uri 26-31, cu fir la POS într-un bloc static pe modelul RoleRightType (o constantă enum nu poate face referire la altul din propriile argumente ale constructorului). MLOS și LOS reparent fără schimbarea ID-ului, deoarece ORG FEATURES persistă ID prin intermediul ServiceTypeConverter și în mișcare unul ar fi reatribuit fiecare rând existent. Copia lui POS devine "Lines of Business" acum că părinţii împrumută şi înregistrările pacientului; numele constant rămâne POS deoarece Nu-ţi face griji. persistă numele ca și siruri de caractere. E veche. descrierea trece la RETAIL, în cazul în care este exactă și deja verificat de ServiceType ClientCopyTest. Noi constante nava PLANNING / dezactivat atât de featureController.list Bucla automată nu le poate activa pentru fiecare org. PhiServiceTypeMapping Testul eşuează prin proiectare până la următoarea comitere a hărţilor noi constante; ambele terenuri într-o singură împingere.

  29. · kamo-internal

    Face o org fără un domeniu enterable

    Intrarea într-o org însemna navigarea la *************** Cu nici un domeniu care URL-ul redat ca literal Nu-ţi face griji. astfel Enter a fost dezactivat și proprietarii au fost direcţionate către /setup/dns în schimb -- DNS a fost uşa, nu o opţiune albă. Spațiul de lucru se deschide acum pe originea CURRENT atunci când nu există nici un obicei live gazda, iar sesiunea de nume org. Un chiriaș cu un domeniu personalizat de lucru Încă se deschide pe propria gazdă, astfel încât nimic nu se schimbă pentru oricine marcat cu alb. Un domeniu personalizat neterminat este tratat ca nici un domeniu: că HOST nu poate să servească încă, ceea ce nu este acelaşi lucru cu orga care nu poate fi găsită. canEnterOrg prin urmare, chei pe lucru care a fost întotdeauna real precondiție -- un membru utilizabil -- mai degrabă decât pe un domeniu. NeedsDomainSetup și orgStatus continuă în mod deliberat să raporteze un neterminat domeniu: nu mai este o barieră, dar este încă cineva remarcabil sarcina, și vizualizarea bunurilor este în cazul în care devine observat. Învelişul a trebuit să înceteze să mai întrebe numele gazdei în care org se află. Rădăcina Layout dezbrăcat "intern." și a căutat gazda în sus, care răspunde "cine deține acest nume -- aceeaşi întrebare ca "în care spaţiu de lucru sunt" numai în timp ce Fiecare chiriaş avea o gazdă pentru el. Pe platforma gazdă se întoarce proprietarul platformei, astfel încât un membru care intră într-o org fără domeniu ar fi fost afișat KamoCRM Inc.'s branding, caracteristici și drepturi. Acum cere prima sesiune prin /api/org/curent și cade înapoi la gazdă atunci când nu există sesiune; care păstrează randarea shell-out semnat. Prăjitura este ceea ce face SesiuneaStorage este invizibilă unei cereri de documente. 2857 teste și toate 7 scripturi de pază trece.

  30. · SecurityService

    Lasă carapacea să-şi ia orgul din sesiune, nu gazda

    layout rădăcină kamo-internal citește antetul gazdă, benzi "internă." și Aduce /org/domeniu / <that>. Pe o gazdă care servește un chiriaș care este același întrebarea "care sunt eu"; pe o gazdă comună este o întrebare diferită cu un răspuns greșit - se întoarce cine deține gazda, astfel încât un membru care a intrat într-o org fără domeniu ar fi predat branding KamoCRM Inc. lui, caracteristici şi steaguri. Adaugă GET /api/security/org/current, returnând recordul prevăzut pentru Organizare Sesiunea apelantului este inch Layout-ul poate ajunge pentru că deja transmite antetul Cookie și un *** cookie există, astfel încât serverul poate vedea o sesiune chiar dacă sesiuneStorage este invizibil pentru un document cerere. Nu ia nici un parametru, în mod deliberat. Primul proiect a acceptat un id sau alias Şi... a refuzat corect: această formă face ca fiecare înregistrare a orgilor să fie numerotată prin ghicitul unui alias, iar pseudonimele sunt Cred că da. Sesiunea știe deja în ce org este, deci un parametru ar putea întreba doar despre unul diferit. Odată cu sesiunea a rezolvat clichetul trece pe cont propriu în loc să aibă nevoie de o intrare de bază. Proiecţia este extrasă mai degrabă decât copiată. Două criterii finale returnând două Forme ale aceluiaşi record este eşecul care merită prevenit -- un client Nu se poate spune ce deține, și ei derivă prima dată doar unul este actualizat. 928 de teste trec.

Universul tău te așteaptă.

Începeți gratuit în câteva minute.Adăugați produse oricând sunteți pregătit — fără migrare, fără autentificări noi.

Gratuit pentru totdeauna — nu este necesar un card de credit