Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
Fügen Sie einen globalen Alias-Uniques-Check hinzu
************-Fernseher nach Anbietern, und das war richtig, während ein Alias wurde immer nur als (security_provider_id, alias) - das Paar hinter einem <alias>.<parentdomain" Gastgeber. Zwei Orgs unter verschiedenen Anbietern könnten eine ohne Mehrdeutigkeit teilen. Eine Organisation kann nun direkt nach ihrem Alias benannt werden, mit ?org=, und dass die Suche nach keinen Anbieter hat, von dem ausgerechnet werden kann. Ein wiederholter Alias macht die Referenz zweideutig Plattform-weit, so OrgResolutionService lehnt es ab anstatt sich eine zu pflücken - was BEIDE Organisationen unerreichbar macht, von Alias. Der Wohnnachlass enthält bereits Wiederholungen (vier Orgs-Aktien "acme-corp", zwei teilen "kia-kaha"), weshalb der Resolver sich weigert; dies ist das, was aufhört, dass mehr geschaffen wird. ausgeschlossenId lässt eine Organisation ihren eigenen Alias behalten, während andere Bereiche gespeichert; passieren Null beim Erstellen. 1597 Prüfungen bestehen.
· KlusterServices
Entse einen Fehlerbericht in den offenen VS-Code von Salbei
URI-Handler, der ein Gespräch in einem RUNNING-Fenster und Pre-Füllungen erstellt der Input, der der einzige Weg ist, um den Editor Salbei zu erreichen hat bereits geöffnet anstatt eine zweite daneben zu starten. Die URI trägt eine Aufforderung und nichts anderes, so Modell und Aufwand gehen durch coderProcessWrapper - ein Wrapper, der ein validiertes enum auf feste Flaggen abbildet und nimmt nie argv aus der Datei, so dass eine gefälschte Datei eine andere auswählen kann Modell und nichts mehr. Die URI pre-fills, aber nicht einreichen, so dass die Einreichung ist eine synthetische Rückkehr und der Agent wartet dann auf ein Transkript, bevor er Erfolg meldet. Die Nadel, nach der es sucht, ist JSON-entgekommen: Transkripte sind JSONL, und suchen für rohe Newlines würde jede gelieferte Botschaft als gescheitert markieren.
· InitializerService
Erstellen Sie die System Bugs Tabellen
Keine CHECK Einschränkung auf den ordinal Spalten: support_ticket_status_check ist was passiert, wenn Hibernate eins bei einem enum's Größe einfriert und das enum dann wächst, und SystemBugStatusType wird voraussichtlich wachsen. Von Hand auf yb-tserver:5433 angewendet, da dieser Dienst keine CI hat.
· kamo-internal
Verwalen Sie eine eigene Domain von Firmeneinstellungen
Eine Domäne war früher der Eingang in eine Organisation: DNS musste konfiguriert, bevor sich überhaupt jemand anmelden konnte, weshalb /setup/dns eher vom Org-Creation-Assistenten und von einem "Bededs Setup"-Banner aus als von Einstellungen. Es ist jetzt optional, so gehört es mit dem Rest der White-Etiketting. Fügt einen Bereich Custom Domain zu Einstellungen hinzu . Wesentliches . Verhalten & Kennzeichnung, zwischen Company Info und Branding. Es zeigt die aktuelle Domain der Org, oder sagt klar, dass es keine gibt, und öffnet /setup/dns hinzufügen oder ändern it. Der Button lautet "Eine Domäne einrichten" oder "Domain verwalten", je nachdem welche davon ist es. Die Kopie führt mit dem Arbeitsbereich bereits erreichbar bei kamocrm.com, so ein Besitzer, der nie seine eigene Adresse will, weiß, dass dies etwas ist, was sie kann ignorieren. Verwendungen orgIdStr statt organisatorisch.id: dieses Feld ist eine JS-Nummer und Abkürzt int64 org IDs hinter MAX_SAFE_INTEGER, die das DNS öffnen würden Seite für eine andere Organisation. Die Taste ist deaktiviert, bis es löst, anstatt mit einer falschen ID zu navigieren. Kopie landete zuerst in Kamo-Translation-Wörterbuch (98ee7cb6) - CI-Klone unpinned at image-build time, so app-first ist ein roter Build. 2921 Tests und alle 8 Wachen bestehen, i18n inklusive.
· SecurityService
Senden Sie den Baum auf dem App-Katalog-Endpunkt zu
Branch Types - Allowed Apps baut seinen Editor von /features/app-catalog, nicht von der Mieter-Features Liste, so war es die eine Oberfläche, die nicht sehen, welche Apps Kinder sind. Ein Elternteil entscheidet, was seine Kinder können sogar angeboten werden, so dass der Herausgeber die gleiche Form braucht. 947 Tests grün.
· kamo-internal
Render den App-Baum, und bestätigen, was ein Elternteil Abschaltung nimmt
Kinder sitzen jetzt unter ihren Eltern in der Apps & Features Liste, jeder mit seine eigene Schalter. Das Nesting wird von ORDER plus einem Einrückstrich ausgedrückt, anstatt Container, so dass die vorhandene Karte, Bewegung und Gating-Code ist unberührt - und ein Kind, dessen Elternteil aus dem aktuellen Tab gefiltert wird immer noch macht auf Top-Niveau, anstatt zu verschwinden. Zwei Verhaltensweisen, die die Kaskade notwendig machte: Toggling wendet jetzt die gesamte Feature-Liste des Servers an, anstatt zu blättern die angeklickte Zeile. Ein Kind schaltet seinen Eltern ein und deaktiviert Eltern schaltet jedes Kind aus, so dass ein lokales Single-Rrow-Update weggehen würde die UI nicht einverstanden mit dem Server über alles andere die Kaskade berührt. Beide Endpunkte haben bereits die vollständige Liste zurückgegeben; nichts Neues war benötigte Server-Seite. Der alte Single-Re-Pfad bleibt als Rückfall für SecurityService, der keine Liste sendet. Ein Elternteil ausschalten fragt zuerst, die Benennung der Kinder, die es mit nehmen wird es. Das ist eine größere Aktion, als der Toggle aussieht. Der Baum kommt vom Features Endpoint statt eines TypeScript-Spiegels von ServiceType - die bereits zweimal von Java gedriftet sind, und die Server ist der einzige Ort, der den Operator-Katalog kennt. 203 Testdateien / 2921 Tests grün, sauber bauen.
· InitializerService
Preis der Commerce-Kinder und die EHR, mit einer Totalität Wache
Keine der beiden Preiskarten hatte eine Totalitätsprüfung, und die beiden Ausfall-Modi sind unterschiedlich und beide schweigen. Fehlt von CATALOG, eine App landet nirgendwo auf die Preismatrix. Fehlt von TIERS, schreibt jedes Tier is_included=false - ein explizites DENIAL, das Anspruch fail-open tut NICHT Rettung, denn scheiter-open gilt nur, wenn ein Plan überhaupt keine Reihe hat und das schreibt einen. Eine vergessene App wird also entweder an alle verschenkt oder für jeden verschlossen, und welches von einem Detail abhängt niemand erinnert sich an die Zeit. Die fünf Commerce-Vertikalen sitzen auf genau POS-Sügel. Sie waren nicht separat einkaufbar vor dem App-Baum - alles, was an Org mit POS könnte tun, könnte es tun, so dass sie irgendwo anders wäre rückwirkend Gebühr für die Fähigkeit, die Menschen bereits haben. Ein Test pins, dass zu POS eher als zu einem buchstäblichen, so bewegen POS bewegt sie. EHR wird wie die Ursprungssysteme von Unternehmen ausgehandelt: kein Listenpreis, CUSTOM plant nur, abwesend von jeder Ebene. Onboarding eines PHI-Kunden bedeutet eine BAA und eine Compliance-Prüfung, nicht eine Self-Serve-Checkout. 159 Tests grün.
· kamo-marketing
Hören Sie auf, die Besuche eines Mitglieds auf ihren eigenen Link zu zählen
Ein Mitglied, das überprüft, ob sein eigener Tracking-Link funktioniert, ist die häufigste erste besuchen Sie jeden Code jemals bekommt, und es ist schlimmer als nutzlos: es bläst die Zahl sie werden an gemessen, es ist ununterscheidbar von einer realen Aussicht in der Besucher Schublade, und es lässt sie mit einem permanenten Besucher Cookie so dass jeder spätere Besuch zählt wieder. Ein Code, der drei Besuche zeigt, alle die Person, die ihn geprägt hat, ist ein Zahlungsnachweis mit einer Lüge darin. Diese Seite ist der einzige Ursprung, der die Frage beantworten kann - es hat keine Sitzung und kein Mitglied, und die interne Konsole kann kein Cookie auf www.<apex" setzen intern.<apex? Was überquert diese Lücke ist ein Link: Ankunft mit ?mrt_self=1 Mints der Ausschluss, und von da auf der Browser ist bei jedem Besuch ausgeschlossen, ob oder nicht der Parameter ist da. Die interne Registerkarte Tracking Codes wächst die Kontrolle, dass erzeugt diese Verbindung. Nicht zu prägen ist nicht genug, so dass ein ausgeschlossen besuchen DELETES der Besucher und Quelle Cookies auch. Ein Mitglied, das seinen Link vor dieser versandten Seite in der Vorschau gestellt hat, oder das sich entschieden hat auf einem Browser bereits gezählt, trägt noch eine GUID und die Beacon feuert für jeden, der eine hat. Ohne den Lösch hätte das Opt-out immer nur funktioniert für Leute, die es nicht brauchten. Der Ausschluss ist absichtlich NICHT in TRACKING_COOKIES: Das Set ist, was das Cookie Politik Löschkontrolle gelöscht, und fegen eine Opt-OUT weg mit den Identifikatoren würde stillschweigend den einen Besucher wieder einschreiben, der gebeten hat, nicht gezählt zu werden - auf dem Steuerung am ehesten von genau dieser Person gedrückt werden. check-discount-cookie wächst von 50 Checks auf 72, für den Wert-Matching, die Parameter-Aktuation, der Lösch-Ausschluss und die beiden Quell-Invarianten (Middleware muss die Identität löschen, muss das Leuchtfeuer vor Ort retten, weil middleware läuft auf Dokumentenanfragen, während die Beacon auf jeder Client-Seite läuft Navigation).
· kamo-internal
Das Affiliate Sales Scoreboard Widget
Eine Gittersäule breit und zwei Reihen hoch: die zehn Personen in der Organisation bringen in den meisten durch ihre Tracking-Links, über heute, in diesem Monat, dies Jahr oder alle Zeit, Öffnung für Besucher in diesem Monat. Die Neuordnung ist das Merkmal. Jede andere Möglichkeit, vier Metriken über vier zu zeigen Fenster ist sechzehn separate Listen; dies ist eine Liste, die sich neu ordnet. Reihen sind von Mitglied eingegeben und tragen eine Layout-Animation, so wechseln Kategorie Dias die gleichen Leute aneinander vorbei, anstatt die Scheibe auszublenden - und der Haken behält jedes Board, das es geholt hat, so dass die Presse, die diese Animation auslöst Daten, um auf dem gleichen Rahmen zu animieren. Die Selektoren werden gegen den PROFILE des Mitglieds gespeichert, nicht localStorage, also Board jemand an ihrem Schreibtisch eingerichtet ist das Brett, das sie auf ihrem Laptop bekommen. Beide Leser stufen einen unerkannten Wert auf die Standardeinstellung herab, anstatt ihn zu verweigern. der Server wendet die identische Regel an und wiederholt zurück, was er verwendet hat, also Präferenzen, die von einem älteren Build geschrieben werden, kann niemals ein Mitglied auf einer leeren Scheibe zurücklassen. Ein Mitglied außerhalb der Top Ten bekommt seine eigene Linie unter der Liste gepinnt, und ein Mitglied mit nichts noch bekommt es bei Rang Null. Ein Board, das nur sagen kann "Sie sind nicht darauf" ist die eine Sache, die ein Anzeigetafel nicht mit den Menschen, die es existiert, zu tun motivieren. Auch hier, weil es das gleiche Problem vom anderen Ende ist: eine "Vorschau"-Steuerung auf der Registerkarte Tracking Codes, die einen Link OHNE Zählen des Besuchs öffnet. Überprüfung wo Ihr eigener Link landet der häufigste erste Besuch ist, den jeder Code bekommt, und Das Zählen legt die eigenen Klicks des Mitglieds in die Aufzeichnung, auf der sie gemessen werden. buildTrackingPreviewLink ist der eigentliche Link plus der Marker der Marketing-Website liest - ein Cross-Repo-Vertrag, so dass der Test pins den Parameternamen.
· MediaService
Der Affiliate Sales Scoreboard Endpoint
GET **************** antwortet Organisations Top Ten für eine Metrik über einem Fenster, zuzüglich der eigenen des Anrufers Stehen, wenn sie nicht darauf sind. Die Zähler auf MARKETING_TRACKING_CODES können dies nicht zurück: Sie sind alle Zeit Roll-ups ohne Zeitdimension, und es gibt nichts in einer laufenden Summe, die sagt, wenn etwas davon passiert ist. Die gefensterte Wahrheit ist in den Zeilen **************** für den Erwerb, und jede Umwandlung ist selbst *_AT-Stempel auf MARKETING_VISITORS. Das ist auch, warum All Time stimmt mit dem Code Raster: gleiche Daten, gezählt auf die gleiche Weise, nicht eine zweite Buchhaltung. Vier Entscheidungen sollten genannt werden: - Die Akquisition wird durch FIRST Kontakt datiert, nicht durch Aktivität. Besucher zählen, die waren nur aktiv in das Fenster würde neu Kredit die gleiche Person jeden Monat, so Arbeit getan einmal würde out-Rang Arbeit jetzt getan, für immer. - Konvertierungen Rang von zugeschriebenenTrackingCodeId allein. Diese Kolonne friert die Moment ein Konto existiert; lastTrackingCodeId hält sich in Bewegung, und Ranking aus ihm erlaubt, dass ein Mitglied die geschlossene Konvertierung eines anderen mit einem zusätzlichen Klick einnehmen würde. - Das Fenster wird im Kalender des MEMBER geschnitten und in UTC verglichen. "Dieser Monat" unterscheidet sich um bis zu einem Tag, je nachdem, wessen Kalender gefragt wird, und jede Spalte in diesem Schema ist eine Offset-freie LocalDateTime Bedeutung UTC. - Alle vier Metriken werden pro Anfrage berechnet, so dass die Schaltkategorie ein Augenblick ist Re-sort von Reihen bereits auf dem Bildschirm statt ein Spinner. Gated on AFFILIATE_SCOREBOARD_WIDGET und nichts anderes - siehe die Rechte javadoc. Es kauft keine Bohrer-down: es gibt keine Code-ID, keine Besucher-ID und kein Mitglied Parameter auf dem Endpunkt, und jeder by-id analytics Endpunkt geht noch durch MarketingTrackingScopeResolver unverändert. Die vier Aggregate verwenden das Komma-Miteinander statt JOIN..ON, weil keines der beiden ausländische Schlüssel ist ein JPA-Verein und die Komma Form parses auf jedem Hibernate Version der Flotte läuft . MarketingTrackingHqlTest analysiert jetzt alle vier gegen die reale Entität Modell auf 6.2.13, und pins die Akquisition, Zuordnung und Mieter Prädikate, die lautlos scheitern, wenn sie driften.
· kamo-shared-library
Hinzufügen der Affiliate Sales Scoreboard Widget Rechte
Fünf Rechte, 234-238, in der MARKETING-Gruppe und abgehängt an VIEW_REFERRAL_CODES: eine Rangliste von Empfehlungsnummern ist Tracking-Code-Daten, und ein Mitglied, das kann nicht sehen, die Tracking-Codes Registerkarte hat nichts zu tun. Das Widget rechts - nicht VIEW_ALL_MEMBER_TRACKING - ist das, was andere offenbart Die Gesamtsumme der Mitglieder, und das ist gewollt. 200/201 Tor der ANALYTICS: dessen Besucher, deren Adressen, deren Zeitachsen, pro Zielmitglied durch die Umfangsbeschluss. Ein Anzeiger offenbart einen Namen, einen Rang und eine Zahl, um Jeder auf einmal. Die org-weite Analyse rechts würde es sichtbar lassen nur an die Administratoren, die einen halten, das ist ein Bericht und kein Vorstand. Bewusst NICHT ausgesät, aus dem gleichen Grund sind 200 und 201 nicht: Aussaat würde veröffentlichen die Überweisungssummen jedes bestehenden Inhabers an seine Kollegen auf dem Boot die es versendet, das ist eine Offenlegungsentscheidung von einem Einsatz statt von ein Administrator. 229/166/32/31 in der auditierten Form - alle fünf sind Kinder und VIEW_REFERRAL_CODES ist selbst ein Kind von VIEW_MARKETING, also bewegt sich keine Root-Eimer.
· kamo-login
Marke und Umfang der Anmeldebildschirm mit ?org=
login.kamocrm.com ist der Anmeldebildschirm für jede Organisation, die keine hat host of its own, so dass der Hostname nicht sagen kann, welcher sich anmeldet. ?org= tut: es benennt die Organisation nach id oder Alias, wählt das Branding zu malen, und reist mit den Referenzen als die Organisation, die sie sind gegen geprüft. Ein Hinweis, kein Beglaubigungsschreiben. Mitgliedschaft ist bewährte Server-Seite so oder so, so Benennung einer Organisation, die Sie nicht angehören, bekommt die gleiche Ablehnung wie die Namensgebung eine fiktive. Das Schlimmste, was eine falsche Referenz erreicht, ist das falsche Logo auf eine öffentliche Seite. Branding kommt von SecurityServices /org/public/{ref?, die eher übermittelt werden als reimplementiert, so dass die Regel darüber, was eine erratende Referenz kann aussetzen kann bleibt an einem Ort. Die Themenbasis folgt dann der Organisation statt der Host, verwendet als gegeben: Dropping seine erste Beschriftung der Weg der Host-Pfa macht acme.kamocrm.com in kamocrm.com verwandeln und einen Mieter in der Plattform Branding. Die erste Farbe verwendet notwendigerweise das Branding des Hosts, weil die Referenz ist noch nicht aufgelöst; KAMO_THEME_REAPPLY streicht es einmal. Ein Besuch dass keine Organisation einen Verweis auf einen früheren Besuch klärt in dieser Registerkarte, so dass die Plattform eigenen Bildschirm nicht halten jemand anderes Logo.
· SecurityService
Servieren Sie ein Org Branding auf einem Bildschirm ohne Sitzung
Login, Anmeldung und die Meeting-Lobby malen die Farben einer Organisation bevor eine Sitzung existiert. Sie wussten, welche vom Hostnamen, der ist genau das, was eine Organisation ohne eigenen Hostnamen nicht leisten kann. GET /api/security/org/public/{ref> macht eine explizite ?org= Referenz -- die id als Ziffern, oder der Alias -- in etwas zu malen. Branding NUR: Name, Logo, Farben, Locale, Themen-Host. Nicht Features, nicht Rechte, nicht Domains, nicht Mitglieder. Der erste Versuch, dies wiederverwendet projizierte Organisation Rekord und die Endpunkt-Ratsche verweigerte es, richtig -- Aliasnamen sind erraten, so dass eine vollständige Aufzeichnung hinter einem erratenden Die Referenz numeriert die Konfiguration jeder Organisation auf. Was übrig bleibt, ist was jeder, der die Anmeldeseite dieser Organisation öffnet, schon sieht, und Testnamen der ausgeschlossenen Felder einzeln, so dass ein Zurücksetzen muss absichtlich. Nur lesen. Die Schwester /org/domain/{host] auto-provisions App Funktionen als Nebenwirkung; ein Endpunkt, der durch Vermuten erreichbar ist, darf nicht schreiben. Eine unbekannte Referenz 404s, und so auch ein zweideutiger Alias -- byPublicRef bereits verweigert eine Benennung mehrere Orgs, und dies Stifte, dass die Ablehnung erreicht den Anrufer als "keine solche Organisation" und nicht als jemand anderes Branding. Der Anrufer fällt auf die eigene Plattform zurück. themeDomain trägt den gleichen Wert die Shell und das Thema Vorsorgeer verwenden, so ein Pre-Session-Bildschirm liest ein org Branding aus dem Ordner war es tatsächlich geschrieben an -- {alias].kamocrm.com für eine Org ohne Domain. 947 Tests bestehen.
· MediaService
Verweigern Sitzung Aufzeichnung für einen Mieter, der PHI behandelt
Die Fähigkeit Split machte ServiceType.MEET erlaubt - eine Live-Konferenz auf selbst gehosteten Meet verlässt nie den Cluster - während MEETING_RECORDING blieb blockiert, weil diese Pipeline die gesamte Abschrift an die Multi-Provider AI Router und dann per E-Mail das Ergebnis an jeden Teilnehmer einschließlich externer Gäste. Das ist eine nicht rekrutierbare Kopie von Drittanbietern. Die Wache sitzt in der privaten Ingest() beide öffentlichen Einreisestellen Trichter durch, so weigert es sich, bevor irgendwelche Bytes erreichen MinIO, und wieder an der Spitze von runSummaryPipeline, die öffentlich und @Async ist. 200 Tests grün.
· VOIPService
Die blockierte Fähigkeit übertrumpft jetzt die Rechte und Gott-Modus
PhiPlaybackAuthorizer gated PHI Call Playback auf VIEW_CALL_LOGS. Das war die ganze Überprüfung, weil ServiceType.VOIP auf die blockiert abgebildet VOIP_RECORDING Modul, so dass ein PHI-Pächter nicht die Telefonanlage bei alle und diese Klasse lief nie für einen. Der Fähigkeits-Split machte VOIP selbst erlaubt - Anrufabwicklung ist in-Cluster - während VOIP_RECORDING aus Gründen BLOCKED_PENDING_WORK blieb die sich nicht geändert haben: Wiedergabe führt keine Freigabeprüfung durch, Transkripte Fahrt in Metadaten, und es gibt keine Aufbewahrung oder Lösch-Pfad. Allein gelassen das wäre eine direkte Schwächung gewesen: Ein PHI-Pächter könnte die Telefonsystem und, mit einem Recht gewährt, spielen alles zurück. Also betreibt PhiCapabilityGuard FIRST und seine Ablehnung ist endgültig. Es braucht keine Caller-Parameter, also für einen PHI-Pächter hebt kein Recht es - und auch nicht macht eine aktive Gottsitzung, die die Eigenschaft ist, die am meisten zählt. **************** ist jetzt ******************** Drei Tests kodierten den alten Vertrag und werden nicht umgeschrieben gelöscht, jede Aufnahme, warum die Erwartung gedreht. Die Voicemail-Verweigerungsmeldung gibt dem fehlenden Recht nicht mehr die Schuld ist in der Regel nicht mehr der Grund. 152 Tests grün.
· SecurityService
Servieren Sie den App-Baum, und beheben Sie die unbewachte auto-enable
FeatureController sendet jetzt Eltern/Kinder/isParent auf jede serialisierte app, damit der Kunde Kinder unter ihrem Elternteil verschachtelt machen kann. Serviert anstatt absichtlich in TypeScript gespiegelt: die ServiceType-Spiegel von Java zweimal bereits gedriftet und eine zweite Kopie des Baumes würde eine weitere Sache zu driften. Für die Kaskade war keine neue Antwortform erforderlich bereits die gesamte Feature-Liste neu serialisieren, so dass Knock-on-Änderungen ankommen ohne dass der Kunde irgendetwas versöhnt. Beide Auto-Provision-Schleifen überspringen jetzt ein Kind, dessen Eltern die Plattform tut nicht bieten, da enableFeature Kaskaden der Eltern auf und sonst Schalter auf ein Elternteil niemand veröffentlicht. Die Loop von OrganizationController hatte keinen PHI-Check während FeatureController Äquivalent tat, auf einem öffentlichen nicht authentifizierten Endpunkt. Für einen PHI-Mieten erstes blockiertes Modul warf, der umgebende Fang protokollierte eine Warnung, und effectiveFeatures fiel lautlos auf rohe Reihen ohne angewandtes Modell zurück Projektion. Es fragt jetzt, anstatt zu fangen, genau wie die Funktionen Auflistung schon. /api/security/ehr registriert. Die Handelspräfixe bleiben dem POS zugeordnet: der Elternteil ist das richtige grobe Tor und ************ veredelt sich bereits pro Markt. 938 Tests grün.
· kamo-internal
Spiegeln Sie die sechs Commerce-Kinder-Apps, und stoppen Sie die Spiegel driften
Beide TS-Spiegel sind jetzt GENERATED von ServiceType.java statt Handgespeichert. Sie waren von Java und voneinander schlecht abgedriftet: Abgestandene "RAG-Integisierung" und "Fälle zurück zur Mutterorganisation SMTP" kopieren, dass Java in 2026-08 entfernt, POS markiert PLANNING in ServiceType.ts während AppType.ts sagte COMPLETED, und verschiedene Beschreibungen für die gleiche App in jeder Datei. Wissenserhaltung, bevor man ihnen vertraut: AnzeigeName und Beschreibung hier sind gelesen von NICHTS. Jeder Verbraucher nutzt diese Konstanten nur für die Identität hatFeature() passt auf id, appServiceIcons Schlüssel auf Name. Kopie kommt von GET /api/security/features, welche PLATFORM_APP_CATALOG-Rehranzeigen ehrt die Spiegel nicht sehen können. Die Saiten werden synchronisiert, damit ein Leser nicht in die Irre geführt wird, und der Datei-Header sagt, nicht zu starten, sie zu machen. Der Eltern-Kindbaum wird absichtlich NICHT gespiegelt - die Funktionen endpoint sendet Eltern/Kinder/isEltern pro App, und eine zweite Kopie der Form wäre eine weitere Sache zu driften. Außerdem: eine Ikone pro neuer vertikaler, anstatt die Eltern zu leihen Schaufenster und Organisationsräte einschließlich isEhr.
· kamo-internal
Ein Scroll, dreimal so breit, jedes Gespräch runter
Die Bar neben den Nachrichten war 8px im Mitgliederchat und SMS, 6px in Support-Tickets und sozial, und in der KI-Chat war es nichts überhaupt: diese Liste erklärt "Scrollbar-Breite" inline neben seiner ::-Webkit-Scrollbar-Regeln, und seit Chrom 121 eine nicht-in-itielle "Scrollbar-Breite" oder "Scrollbar-color" lässt den Browser den gesamten -webkit- Block wegwerfen - so fragte er nach 12px und bekam die Plattform Haarrang. globals.css Dokumente, die für die Seite scroller Regel; nichts Erzwang es, und die KI-Chat hatte ruhig auf der falschen Seite davon gewesen. Alle fünf lesen jetzt eine CHAT_SCROLLBAR-Konstante: eine 24px-Rinne - dreimal die Mitglieder-Chat alte Breite - mit dem Daumen inset 6px auf jeder Seite durch einen transparenten Rand, so eine Bar, dass breit liest sich immer noch als Pille in einem Trog und nicht als Platte, die an die Fensterkante geschweißt wird. Der KI-Chat ist Standard-Eigenschaften bewegen sich in "@supports not selector(::-webkit-scrollbar) ", wo globals.css setzt sie und der einzige Ort Firefox liest sie ohne Kosten Chrome seine Regeln. Der Test ist source-level, weil das Thema ein Stylesheet ist und jsdom keine Scrollbalken implementiert: es Pins, dass kein Fenster seine Bar von einem wörtlichen, und dass keiner von ihnen setzt den Standard Eigentum wieder unbewacht.
· InitializerService
Ausweitung des Markt-Grandat in die App-Baum-Verfüllung
grandfatherExistingGatedMarkets bewanderte bereits die aktiven Märkte jedes org, behoben getRequiredService() und aktiviert die fehlende App auf isGated() verticals, d.h. MORTGAGE und PERSONAL_LOANS. Jetzt dass jeder CommerceType seine eigene Kinder-App nennt, ist die Beschränkung weg, so die gleiche Schleife Samen RETAIL / RENTAL / SERVICE / SUBSCRIPTION / PROKUREMENT-Reihen. Neue Migration war nicht nötig. Auch Samen RETAIL für Orgs, die POS ohne Märkte überhaupt halten, die hatte arbeiten Handel vor dem Baum, weil Einzelhandel brauchte keine App der eigenen. Top-Level-Orgs werden nicht mehr übersprungen, und das ist die Lösung, die zählt. Die Ausnahme war richtig, als dies nur die beiden Leih-Apps gewährte Plattform-Betreiber Org sollte nicht stillschweigend erwerben MLOS für den App-Baum, weil istAppEffectivelyEnabled erfordert eine OrgFeature ROW und hat keine Ausnahme von Top-Level. Der erste Lauf berichtete Erfolg, während Verlassen von KamoCRM, das aktive RETAIL- und SUBSCRIPTION-Märkte betreibt, mit keine Reihen für beide; es hätte beide von / Handel auf der nächsten verloren SecurityService-Einsatz. Erwitet durch Abfrage der Datenbank, nicht durch Lesen das Protokoll. enableFeature kaskadiert jetzt ein Kind zu seinem Elternteil, so dass Einsetzung eines Kindes auch garantiert die POS-Reihe. RUN gegen prod 2026-08-24. Verifiziert: jede aktive commerce_markets Reihe hat jetzt eine aktive Kind OrgFeature Reihe, Null fehlt.
· SecurityService
Anspruch-überprüfen jede vertikale, nicht nur die gated two
Jeder CommerceType benennt jetzt seine eigene Kinder-App unter POS, also isGated() Kurzschluss, der Einzelhandel, Vermietungen, Service, Abonnements winkte und die Beschaffung direkt durch ist weg. Diese Märkte werden nun überprüft gegen die eigene App - das ist der Punkt: eine vertikale kann verkauft werden, und Ausgeschaltet, auf eigene Faust. Hängt davon ab, dass die KamoInitializer-Drware ausgeführt ist.
· kamo-internal
Die Suche der Toolbar ist eine Glyphe, die sich in ein Feld öffnet
Der Mitglieder-Chat trug eine permanente Suchbox über die Oberseite des Fensters - die Breite der ganze Toolbar, die für eine Steuerung ausgegeben wird, die fast die ganze Zeit leer ist und in Bursts verwendet wird. Es ist jetzt eine 28px Lupe, die in das Feld auf Klick öffnet, und die Symbolleiste liest sich als vier Glyphen und Luft. Die Idee, auf der herum aufgebaut ist: Die Lupe bewegt sich nie und wird nie ausgewechselt. Eingestürzt, die Pille ist 28px und das Symbol sitzt in der Mitte, 14px vom linken Rand; offen, hat die Pille 6px von Padding vor einem 16px-Symbol, das die Mitte des Icons wieder auf 14px setzt. Die Pille wächst also von hinten hinter einer Glyphe, die still hält, und die Steuerung liest sich wie ein Objekt, das sich eher öffnet als zwei Staaten überbleitieren. Die Breite Federn mit ein wenig Überschreitung auf dem Weg offen und keine auf dem Weg geschlossen; der Platzhalter verfolgt das Wachstum um 60ms, so dass der Text in einer Box ankommt, die hat schon Platz dafür; die klare Steuerung springt erst ein, wenn es etwas zu klären gibt. Schließen klärt immer die Abfrage, und das Feld kann nicht weggelegt werden, während es eine hält: ein eingestürzte Lupe noch Filterung der Konversation wäre das Fenster liegen über das, was es ist zeigen. Blur lässt es offen mit Text in ihm, und ein verirrter Klick auf die glyph fokussiert das Feld anstatt die Suche zu verwerfen. Reduzierte Bewegung wird durchgehend honoriert, die Glyphe trägt den Fokusring für einen Tab sowie ein Klicken Sie, und der 50px Abstandshalter ist damit verschwunden.
· kamo-shared-library
Jede Vertikale nennt eigene Kinder-App
erforderlicheService wird jetzt, da jede vertikale hat eine Kind-App unter ServiceType.POS, die die "Null bedeutet POS allein ist genug" löscht Sonderfall und isGated() damit. Jede vertikale kann nun eingeschaltet werden, lizenziert und PHI-klassifiziert unabhängig - das ist, was lässt eine medizinische Praxisnutzungs-Handel überhaupt, da RETAIL für einen PHI-Mieten gesperrt bleibt während der Rest des Handels nicht. HEALTHCARE(ServiceType.EHR) ist das, was die EHR erscheinen lässt ************, wenn die App eingeschaltet ist, ohne neues Gating Code: assertCommerceTypeAllowed, getAllowedCommerceTypes, erlaubt-Typen Endpunkt hinter beiden Marktpflückern, ************ und der Marktliste filtern alle bereits durch getRequiredService( lösen. NICHT PUSHED, bis die KamoInitializer-Verfüllung ausgeführt ist. behauptenCommerceTypeAllowed liest getRequiredService() direkt, also in dem Moment, in dem SecurityService dies sieht jede Org mit einem Einzelhandels-oder Mietmarkt braucht ein Kind OrgFeature Reihe es tut noch nicht.
· MediaService
Lassen Sie die öffentliche Konfiguration von org id angesprochen werden, nicht nur von Host
Der Sidecar sucht eine org's meet Konfiguration, um zu entscheiden, ob ein Gast benötigt ein Kennwort für die Besprechung. Es fragte nach Hostname, die auf dem gemeinsamen Treffen Host löst sich auf die Plattform-Organisation -- so ein Mieter, der eine Passwort hätte diese Anforderung stillschweigend für jeden Gast fallen gelassen Beitritt durch Link. Ein Gast hat keine Sitzung, so dass das einzige, was seinen Mieter Namen ist der Raum, die jetzt ein Org-Token trägt. Beide öffentlichen Endpunkte akzeptieren daher eine explizit orgId und zurückgreifen auf die Domain-Lookup, wenn keine gegeben wird, so nichts, was von Gastgeber heute fragt, ändert sich. Ids kommen als Ziffern an und werden so lange geparst: sie sind nach 2x53, also eins durch einen Doppelnamen eine andere Organisation geleitet. 200 Tests bestehen.
· kamo-shared-library
Cascade-Funktion aktivieren/deaktiv über den App-Baum
Die Ermöglichung eines Kindes ermöglicht es seinem Elternteil; die Behinderung eines Elternteils verhindert jeden Kind; das letzte Kind zu deaktivieren, schaltet die Eltern ein. Ein Elternteil in die Lage versetzen lässt Kinder in Ruhe, so dass ein Elternteil absichtlich eingeschaltet hat, ohne Kinder bleiben. Die Kaskade ist ereignisgetrieben und es gibt absichtlich keine Versöhnung Sweep. Das ist ein Sicherheitseigentum: ein ständig erzwungenes "ein Elternteil mit keine aktivierten Kinder ist aus" invariant würde Handel abschalten für jeden vorhandene org der Moment, in dem diese ausgeliefert wird, weil keine Kinderreihen existieren, bis die KamoInitializer-Verfüllung läuft. Ein Kind behauptet die PHI-Wache auf dem Modul seiner Eltern sowie seine eigene, vor jedem Schreiben - sonst ein erlaubtes Kind unter einem blockierten Elternteil würde entweder gestrandet sein oder stillschweigend den blockierten Elternteil einschalten.
· kamo-shared-library
PhiCapabilityGuard für Call-Time-Fähigkeitsprüfungen hinzufügen
PhiTenantGuard läuft zur funktionsfähigen Zeit und nirgendwo sonst. Websites, alle in FeatureService. Jetzt, da PhiModule fähigkeitskönnte ist, App, deren Kern erlaubt ist, kann immer noch eine Fähigkeit, die nicht enthalten ist, und die E-Enable-Time-Prüfung kann den Unterschied nicht sehen. Dieselbe bewusste Signatur wie PhiTenantGuard: eine reine Funktion von (Status, Modul) ohne Anrufer, rechts oder God-Mode-Parameter, so gibt es nichts zu erheben. Einfache Klasse statt eines Stereotyps - eine Shared-lib @Component mit einem nicht abgesetzten Repository hat Crash-looped services vier Zeiten; jeder verbrauchende Dienst erklärt seine eigene @Bean. HINWEIS: MEETING_RECORDING und VOIP_RECORDING sind jetzt ungebunden von ServiceType aber noch nicht bewacht an ihren Call-Sites - das ist der nächste MediaService und VOIPService berühren. Das ist inert in der Produktion mittlerweile, weil jeder Org hat derzeit GriffePhi=false, aber der Anruf Standorte müssen landen, bevor ein Mieter markiert ist.
· kamo-shared-library
Split PhiModul von app-grained zu fähigkeitskönnten
POS-Maskottierung auf ECOMMERCE_SYNC (BLOCKED_NO_BAA) und den gesamten Handel Oberfläche hängt am POS, so dass ein Org mit GriffenPhi=true nicht wechseln konnte Kommerz auf überhaupt - kein Markt, kein / Handel, und keine klinische vertikale darauf gebaut. Die zehn Retail-Sync-Adapter sind das Ding, das die Grenze, nicht der Handelswirbel. POS jetzt Karten zu COMMERCE_CORE (permitted) und ECOMMERCE_SYNC-Fernseher nach unten an das RETAIL-Kind. Gleiche Korrektur für MEET (Live-Konferenz vs. Zusammenfassungspipeline, die Transkripte an externe Schlussfolgerungen verschickt) und VOIP (Telefonie vs. gespeicherte Aufnahmen und Transkripte). MEETING_RECORDING und VOIP_RECORDING hat jetzt überhaupt keinen ServiceType: Sie sind Fähigkeiten Erreichbar nur über Code, und PhiModule Javadoc gibt jetzt die Regel dass eine solche Konstante von PhiCapabilityGuard bei seinem Anruf überprüft werden muss Website. Eine App als zulässig klassifiziert, ohne die Fähigkeit zu schützen es liest sich als konform, während nichts durchgesetzt. AI_ASSISTANT und RAG_SEARCH bleiben bewusst blockiert: KlusterServices Einbettungen, Flüster-Asr und Übersetzung, aber keine generative LLM, und RAG teilt sich eine Qdrant-Sammlung, die durch einen Nutzlastfilter isoliert wird. Splitting Das wäre eine Papieränderung. Zwei Tests kodiert das App-Korn-Modell und werden aktualisiert, anstatt erweitert: PhiServiceTypeMappingTests blockierte App-Behauptung und FeatureServicePhiGateTest, dessen blockiertes Beispiel bewegt sich von VOIP zu RETAIL - VOIP ist zur E-Grenze nicht mehr verständlich.
· kamo-internal
Landen Sie in einem neu erstellten org statt bei DNS Setup
Erstellen einer Org routed der Schöpfer zu /setup/dns, und der Grund war real: Eingabe bedeutete eine OTK-Umleitung auf interne.<new-domain" und eine brandneue org hat kein DNS, so dass Host nicht erreichbar war. Die Konfiguration von DNS war also der Preis für das Öffnen der Sache, die Sie gerade gemacht hatten -- die genaue Wand diese Arbeit entfernt. Der create call now rettiert bereits einen einmaligen Schlüssel; der Assistent hatte einfach nirgends es auszugeben. Es gibt es jetzt auf den aktuellen Ursprung, wo die Sitzung Namen der Org, so gibt es keinen Host zu warten. Eine Domain ist es immer noch wert und Einstellungen ist, wo es jetzt lebt: ein optionale White-Label-Schritte statt einer Tür. Branding Warnungen sind durch die oder so durchgeführt, und wenn kein Schlüssel zurückkommt, existiert der Org noch, so der Zauberer landet auf dem Nachlass Blick auf das Anwesen, anstatt zu scheitern. check-client-Navigation hat die window.location.href korrekt markiert. Seine eigene docstring Namen /validate mit einem einmaligen Schlüssel als echte Session-Gedächtnis springen, so ist dies erlaubt, mit diesem Grund, anstatt umgearbeitet -- der Router würde die OLD-Sitzung des Schöpfers behalten, was genau das ist wird ersetzt. 2857 Prüfungen und alle 7 Wachen bestehen.
· kamo-shared-library
Geben Sie ServiceType einen zweistufigen Eltern-/Kindbaum
Sechs Commerce-Kinder in neuen IDs 26-31, verdrahtet mit POS in einem statischen Block auf das RoleRightType-Muster (eine Enum-Konstante kann keine andere von seine eigenen Konstruktor-Argumente). MLOS und LOS reparent, ohne id zu ändern, weil ORG_FEATURES die ID über ServiceTypeConverter und Bewegt man würde jede vorhandene Zeile neu zuweisen. POS-Kopie wird "Lines of Business" jetzt, dass es Eltern verleihen und Patientenakten; der konstante Name bleibt POS, weil ************ bleibt mit Namen als Strings. Seine alte Beschreibung bewegt sich zu RETAIL, wo es genau ist und bereits geprüft von ServiceTypeCustomerCopyTest. Neue Konstanten Schiff PLANNING/deaktiviert so FeatureController.list's Die automatische Bereitstellungsschleife kann sie nicht für jeden Org einschalten. PhiServiceTypeMappingTest scheitert durch Design, bis die nächste Übergabe die neue Konstanten; beide landen in einem Schub.
· kamo-internal
Machen Sie ein Org ohne Domain be- enterable
Eingabe eines Orgs bedeutete navigieren zu **************** Ohne Domain, die URL als wörtlich gemacht ************ so Enter war behindert und Besitzer wurden stattdessen zu /setup/dns geroutet -- DNS war der Eingang, nicht ein White-Label-Option. Der Arbeitsbereich öffnet sich nun auf dem CURRENT Ursprung, wenn es keine Live-Gebrauch Host, und die Sitzung benennt die org. Ein Mieter mit einer funktionierenden Custom Domain öffnet sich immer noch auf seinem eigenen Host, so ändert sich nichts für jeden weiß beschriftet. Eine unvollendete eigene Domain wird wie keine Domäne behandelt: dass HOST nicht dienen noch, die nicht das gleiche wie die Org unerreichbar ist. canEnterOrg daher Schlüssel auf die Sache, die immer die real war Voraussetzung -- eine nutzbare Mitgliedschaft -- anstatt auf einer Domain. needsDomainSetup und orgStatus absichtlich halten Bericht über eine unvollendete Domain: Es ist nicht mehr eine Barriere, aber es ist immer noch jemandes ausstehender Aufgabe, und der Nachlass Ansicht ist, wo das bemerkt wird. Die Shell musste auch aufhören, den Hostnamen zu fragen, in welchem sich sich sie befindet. Die Wurzel Layout abgestreift "intern". und sah den Gastgeber, die Antworten antwortet "wer besitzt dieser Name" -- die gleiche Frage wie "Welcher Arbeitsbereich bin ich nur während Jeder Mieter hatte einen Gastgeber für sich. Auf dem Plattform-Host gibt es die Plattform-Inhaber, so dass ein Mitglied, das eine Domain-lose Org eingibt, gezeigt worden wäre KamoCRM Inc.'s Branding, Features und Rechte. Es fragt jetzt die Sitzung zuerst via /api/org/current und fällt zurück zum Host, wenn keine Sitzung läuft, die die ausgezeichnete Schalendarstellung aufrecht erhält. Der *** Cookie ist das, was ausmacht die überhaupt erreichbar ist -- sessionStorage ist für eine Dokumentenanfrage unsichtbar. 2857 Tests und alle 7 Wachenschriften bestehen.
· SecurityService
Lassen Sie die Schale ihre Org von der Sitzung holen, nicht der Host
kamo-internals Wurzellayout lautet der Host-Header, Streifen "internal". und fetches /org/domain/<that? Auf einen Host, der einen Mieter bedient, der derselbe ist Frage wie "welche org bin ich"; auf einem gemeinsamen Host ist es eine andere Frage mit einer falschen Antwort -- es gibt denjenigen zurück, der den Gastgeber besitzt, also ein Mitglied, das ein ein dohädoelos org würde KamoCRM Inc. Branding übergeben werden, Funktionen und Fahnen. Fügt GET /api/security/Ort/aktuelle hinzu und gibt den projizierten Rekord für die Organisation der Anrufer SESSION ist in. Das Layout kann es erreichen, weil es bereits leitet die Cookie-Header und ein *** Cookie existiert, so dass der Server kann eine Sitzung sehen, obwohl sessionStorage für ein Dokument unsichtbar ist Anfrage. Nimmt absichtlich keinen Parameter. Der erste Entwurf akzeptierte eine ID oder einen Alias und ************ richtig abgelehnt: diese Form macht jeden org-Rekord aufzählbar, indem er einen Alias errät, und Aliasnamen sind Erraten. Die Sitzung weiß bereits, in welcher org es ist, also ein Parameter konnte immer nur nach einem anderen fragen. Mit der Sitzung gelöst Ratschen gibt seine eigene, anstatt einen Basiseintritt zu benötigen. Die Projektion wird eher extrahiert als kopiert. Zwei Endpunkte kehren zwei zurück Formen der gleichen Aufzeichnung ist das Scheitern wert zu verhindern -- ein Kunde kann nicht sagen, was es hält, und sie driften das erste Mal, wenn man nur ein ist aktualisiert. 928 Prüfungen bestehen.

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