Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-shared-library
Добавить глобальную проверку уникальности псевдонима
**************** Поставщик, и это Он был прав, когда псевдоним был разрешен только как (security provider id, псевдоним) — пара, стоящая за <alias>. Хозяин. Две организации под разными провайдерами могут делиться одной без двусмысленности. Организация теперь может быть названа непосредственно по ее псевдониму, с ?org=, и Этот поиск не имеет поставщика для охвата. Повторяющийся псевдоним делает ссылка неоднозначная по всей платформе, поэтому OrgResolutionService отказывается от нее Вместо того, чтобы выбирать одну из них, что делает обе организации недоступными. псевдоним. Живое поместье уже содержит повторы (четыре орга доли) «акме-корп», две акции «киа-каха»), от чего разрешающий отказывается; это Это то, что больше не создается. позволяет организации сохранить свой собственный псевдоним, в то время как другие области Сохраняй, ноль при создании. Пройдет 1597 испытаний.
· KlusterServices
Отправьте сообщение об ошибке в открытый VS-код мудреца
Обработчик URI, который создает разговор в окне RUNNING и предварительно заполняется Ввод, который является единственным способом добраться до редактора мудрец уже открыл Вместо того, чтобы начать второй рядом с ним. URI несет в себе подсказку и ничего больше, поэтому модель и усилия проходят через это. CoderProcessWrapper — обертка, которая отображает проверенный список на фиксированные флаги и никогда не берет argv из файла, поэтому кованый файл может выбрать другой Модель и ничего больше. URI заполняется, но не подается, поэтому подача является синтетическим возвратом. Затем агент ждет расшифровку, прежде чем сообщать об успехе. The Игла, которую он ищет, ускользает от JSON: транскрипты JSONL и поиск Для необработанных новых линий каждое доставленное сообщение будет помечено как неудачное.
· InitializerService
Создание таблиц системных ошибок
Нет ограничений CHECK на порядковые столбцы: support ticket status check Что происходит, когда гибернат замораживает один при размере числа, а затем Ожидается рост SystemBugStatusType. Применяется к yb-серверу:5433 от руки, так как эта услуга не имеет CI.
· kamo-internal
Управление пользовательским доменом из настроек компании
Домен, который раньше был входом в организацию: DNS должен быть Он был настроен до того, как кто-либо вообще мог войти в систему, поэтому /setup/dns был Он был достигнут от волшебника-создателя организации и от баннера «Нужна установка». нежели в настройках. Теперь он необязателен, поэтому он принадлежит остальной части белая маркировка. Добавляет раздел пользовательского домена в настройки → Essential → Поведение и маркировка между компанией Info и брендингом. Он показывает текущий домен организации, или Ясно говорит, что его нет, и открывает /setup/dns для добавления или изменения. Это. Кнопка «Установить домен» или «Управлять доменом» в зависимости от Кто из них является Копия ведет с рабочим пространством, уже доступным на kamocrm.com. Поэтому владелец, который никогда не хочет иметь свой собственный адрес, знает, что это то, что он хочет. Можно игнорировать. Использует orgIdStr, а не organization.id: это поле является номером JS и усеченные идентификаторы int64 ids мимо MAX SAFE INTEGER, которые открывают DNS Страница для другой организации. Кнопка отключена до тех пор, пока Решает, а не перемещается с неправильным идентификатором. Копия впервые попала в камо-переводческий словарь (98ee7cb6) — CI клонирует его не привязанный к времени создания изображения, поэтому приложение-первое - это красная сборка. 2921 тест и все 8 охранников прошли, включая i18n.
· SecurityService
Отправьте дерево на конечную точку приложения-каталога
Branch Types → Allowed Apps создает свой редактор из /features/app-каталога Не из списка свойств арендатора, поэтому это была единственная поверхность, которая могла Мы не знаем, какие приложения являются детьми. Родитель решает, что его Детям даже можно предложить, поэтому редактору нужна такая же форма. 947 тестов зеленый.
· kamo-internal
Отредактируйте дерево приложений и подтвердите, что принимает родительское выключение
Дети теперь сидят под своим родителем в списке приложений и функций. Собственный переключатель. Вложение выражается приказом плюс отступ, а не вложенный контейнер, поэтому существующий код карты, движения и гатинга Нетронутый — и ребенок, чей родитель отфильтрован из текущей вкладки Они все еще находятся на высшем уровне, а не исчезают. Два поведения, которые каскад сделал необходимыми: Toggling теперь использует весь список функций сервера вместо перелистывания Кликнувший ряд. Включение ребенка переключает его родителя и отключение Родители отключают каждого ребенка, поэтому локальное однорядное обновление оставит UI не согласен с сервером обо всем остальном каскад Тронутый. Обе конечные точки уже вернули полный список; ничего нового не было. Нужна серверная сторона. Старый однорядный путь остается в качестве запасного для одного Безопасность Сервис, который не отправляет список. Отключение родителя сначала спрашивает, называя детей, которых он возьмет с собой. Это. Это большее действие, чем выглядит переключатель. Дерево происходит от конечной точки, а не от зеркала TypeScript. ServiceType — те, которые уже дважды дрейфовали с Java, и те, которые были на Java. Сервер — единственное место, которое знает каталог операторов. 203 тестовых файла / 2921 тестов зеленый, построить чисто.
· InitializerService
Цена торговли детей и EHR, с полной охраной
Ни на одной карте ценообразования не было полной проверки, и два режима отказа являются Разные и молчаливые. Пропавшее из CATALOG приложение никуда не денется Матрица ценообразования. Пропавшие без вести, каждый уровень пишет is included=false — явный отказ, который дает право на отказ Не спасение, потому что отказоустойчивый применяется только тогда, когда план не имеет строки вообще. И это пишет один. Таким образом, забытое приложение либо выдается всем. или заперты для всех, и какая из них зависит от детали, никто Помнят в то время. Пять торговых вертикалей находятся именно на ступеньке POS. Они не были отдельно покупаемый перед деревом приложений - все, что имеет POS Это может сделать, это может сделать, поэтому помещение их в другое место задним числом. Затраты на те возможности, которые есть у людей. Тестовые штифты, которые лучше POS Вместо того, чтобы двигаться до буквы, их перемещает POS. EHR является предметом корпоративных переговоров, как и системы происхождения: нет цены списка, Планы CUSTOM, отсутствующие на каждом уровне. На борту клиента PHI Это означает BAA и обзор соответствия, а не самообслуживание. 159 тестов зеленый.
· kamo-marketing
Перестаньте считать визиты участника по их собственной ссылке
Участник, проверяющий, что его собственная ссылка отслеживания работает, является наиболее распространенным первым. Посетите любой код, который когда-либо получает, и это хуже, чем бесполезно: он раздувает число. Они измеряются, это неотличимо от реальной перспективы у посетителя. выдвижной ящик, и он оставляет их с печеньем постоянного посетителя, так что каждый последующий визит Снова считается. Код, показывающий три посещения, все они человек, который чеканил его, Это платежная запись с ложью в ней. Этот сайт является единственным источником, который может ответить на вопрос - у него нет сеанса, и он не может найти ответ. Нет участника, и внутренняя консоль не может установить cookie на www. <apex> из Внутренний.<apex> Что пересекает этот разрыв - это ссылка: прибытие с ?mrt self=1 mints исключение, а затем в браузере исключается при каждом посещении, независимо от того, Здесь нет параметра. Внутренняя вкладка «Коды отслеживания» увеличивает контроль, который создает эту связь. Не чеканки недостаточно, поэтому исключённое посещение ПОДДЕРЖАЕТ посетителя и источник Печенье тоже. Участник, который просмотрел свою ссылку перед отправкой или который выбрал В браузере, который уже просчитался, все еще есть GUID - и маяк горит Для тех, у кого есть. Без удаления отказ только сработал бы Для тех, кто в этом не нуждается. Исключение намеренно не в TRACKING COOKIES: этот набор является тем, что печенье Политика удаления очищает контроль и удаляет Opt-OUT с идентификаторами Молча перечислил бы одного посетителя, который просил, чтобы его не считали — на Контроль, скорее всего, будет осуществляться именно этим человеком. check-discount-cookie увеличивается с 50 чеков до 72, покрывая соотношение стоимости и стоимости. Параметры орфографии, исключение набора удаления и два инварианта источника (среднее программное обеспечение должно удалить личность, маяк должен залог локально, потому что Промежуточное ПО работает на запросах документов, в то время как маяк работает на каждой стороне клиента навигации).
· kamo-internal
Виджет Affiliate Sales Scoreboard
Один столбец сетки шириной и два ряда высотой: десять человек в организации Привлекая больше всего через их отслеживающие ссылки, сегодня, в этом месяце, Год или все время, открытие для посетителей в этом месяце. Переупорядочение является особенностью. Каждый другой способ показа четырех метрик над четырьмя Окна — это шестнадцать отдельных списков; это один список, который перестраивается. ряды настроены членом и несут анимацию макета, поэтому переключение слайдов категории одни и те же люди проходят мимо друг друга вместо того, чтобы одеть панно — и крючок держит каждую доску, которую он получил, так что пресса, которая запускает эту анимацию, данные для анимации на одном и том же фрейме. Селекторы хранятся против ПОЛОЖЕНИЯ участника, а не локального хранилища, поэтому Совет, который кто-то устанавливает за своим столом, - это та плата, которую они получают на своем ноутбуке. Оба Читатели понижают непризнанное значение по умолчанию, а не отказываются от него. сервер применяет то же правило и повторяет то, что он использовал, поэтому Предпочтение, написанное более старой сборкой, никогда не может оставить члена на пустой панели. Член за пределами первой десятки получает свою собственную линию, прикрепленную ниже списка, и участник, у которого ничего еще нет, получает его в нулевом ранге. Совет, который может только сказать: "Ты «Not On It» — это единственное, что табло не должно делать с людьми, для которых оно существует. мотивировать. Также здесь, потому что это та же проблема с другого конца: «предварительный» контроль на вкладке «Коды отслеживания», которая открывает ссылку, не считая посещения. Проверка где ваша собственная ссылка является наиболее распространенным первым посещением любого кода. Подсчет этого ставит собственные клики участника в запись, на которой они измеряются. сборка PreviewLink - это реальная ссылка плюс маркер маркетингового сайта считывает — кросс-репо контракт, поэтому тест прикрепляет имя параметра.
· MediaService
Affiliate Sales Scoreboard конечная точка
*************** Ответить на этот вопрос Десятка лучших организаций по одной метрике за одно окно, а также собственный абонент Они стоят, когда их нет. Счетчики на MARKETING TRACKING CODES не могут подтвердить это: они все время свертывания без измерения времени, и нет ничего в бегущей сумме, что Он говорит, когда что-то из этого произошло. Оконная истина в рядах — **************** для приобретения, и каждая конверсия имеет свою собственную ** На марке Markting VISITORS. Вот почему все время согласуется с кодом. Сетка: одни и те же данные, подсчитанные одинаково, а не вторая бухгалтерия. Четыре решения, которые стоит принять: Приобретение датируется первым контактом, а не деятельностью. Подсчет посетителей, которые Если бы они были просто активны в окне, то каждый месяц перекредитовали бы одного и того же человека. Так что работа, сделанная однажды, будет превосходить работу, сделанную сейчас, навсегда. - Рейтинг конверсий присваивается только TrackingCodeId. Эта колонна замораживает момент, когда учетная запись существует; LastTrackingCodeId продолжает двигаться и ранжироваться по ней Один участник может принять закрытое преобразование другого с дополнительным щелчком мыши. Окно вырезается в календаре MEMBER и сравнивается в UTC. "В этом месяце" Отличается до суток в зависимости от того, чей календарь задан, и каждой колонки. В этой схеме есть офсетное LocalDateTime, означающее UTC. Все четыре метрики вычисляются по запросу, поэтому переключение категории происходит мгновенно. Пересортировать ряды уже на экране, а не спиннер. AFFILIATE SCOREBOARD WIDGET и ничего больше — см. Джавадок. Он не покупает сверление: нет идентификатора кода, нет идентификатора посетителя и нет члена параметр на конечной точке, и каждая конечная точка анализа по идентификатору все еще проходит через MarketingTrackingScopeResolver без изменений. Четыре агрегации используют соединение запятой, а не JOIN..ON, потому что ни одна из них не является Иностранный ключ - это ассоциация JPA, и запятая формирует парсы на каждом Hibernate. Версия, которую запускает флот — MarketingTrackingHqlTest теперь сравнивает все четыре против Модель реального объекта на 6.2.13 и определяет приобретение, атрибуцию и арендатора Предикаты, которые молча проваливаются, если дрейфуют.
· kamo-shared-library
Добавить права виджета Affiliate Sales Scoreboard
Пять прав, 234-238, в группе MARKETING и вывешенные на VIEW REFERRAL CODES: таблица лидеров реферальных номеров - это данные кода отслеживания и член, который может Не видеть, что вкладка кодов отслеживания не имеет никакого отношения к нему. Правильный виджет — не VIEW ALL MEMBER TRACKING — это то, что раскрывает другие Общее количество членов, и это преднамеренно. 200/201 Ворота Аналитики: чьи посетителей, адреса которых, сроки которых определены для каждого целевого участника Решитель масштаба. Табло раскрывает имя, ранг и один номер, чтобы всех сразу. Требование права на аналитику в масштабах организации оставит его видимым Только для администраторов, которые имеют один, который является отчетом, а не советом. Преднамеренно НЕ посевные, по той же причине 200 и 201 не являются: посевные публиковать все имеющиеся данные о рефералах держателя своим коллегам на загрузке который отгрузил его, что является решением о раскрытии информации, принятым развертыванием, а не администратором. 229/166/32/31 в проверенной форме — все пятеро — дети и VIEW REFERRAL CODES Сам по себе является ребенком ВИУ-Маркетинга, поэтому ни одно корневое ведро не движется.
· kamo-login
Бренд и масштаб экрана входа с ?org =
login.kamocrm.com - это экран входа для каждой организации, у которой нет доступа к Интернету. хозяин сам по себе, поэтому имя хозяина не может сказать, какой из них подписывается. ?org= делает: он называет организацию по идентификатору или псевдониму, выбирает брендинг для рисовать и путешествовать с учетными данными как организация, которой они являются Проверено против. Подсказка, а не подтверждение. Членство в любом случае доказано на стороне сервера, поэтому Название организации, к которой вы не принадлежите, получает тот же отказ, что и название. вымышленный. Худшее, что достигает неправильная ссылка, - это неправильный логотип. Публичная страница. Брендинг происходит от SecurityService's /org/public/{ref}, скорее чем реализуемое таким образом правило о том, что догадочная ссылка может разоблачить остается на одном месте. Тематическая база следует за организацией вместо хост, используемый как данность: сброс его первой метки путь хост пути превращает acme.kamocrm.com в kamocrm.com и рисует арендатора в Бренд платформы. Первая краска обязательно использует брендинг хозяина, поскольку ссылка До сих пор не решено; KAMO THEME REAPPLY перекрашивает после того, как это произошло. Посещение что ни одна организация не очистит ссылку на предыдущий визит, записанный в этой вкладке, поэтому собственный экран платформы не сохраняет чужой Логотип.
· SecurityService
Подавать брендинг организации на экран без сеанса
Логин, регистрация и лобби встречи раскрашивают цвета организации. До начала любой сессии. Знали они, кто из них является обладателем То, что организация без собственного хоста не может предоставить. GET/api/security/org/public/{ref} переворачивает явную ссылку ?org= Идентификатор как цифры, или псевдоним — во что-то, чтобы нарисовать. Брендинг ТОЛЬКО: имя, логотип, цвета, локализация, хост темы. Не особенности, не Права, а не домены, не члены. Первая попытка повторного использования прогнозируемый организационный рекорд, и конечная точка рэтчета отказалась от него, Правильно - псевдонимы догадываются, поэтому полная запись за догадкой Ссылка перечисляет конфигурацию каждой организации. Что осталось - это то, что любой, открывающий страницу регистрации этой организации, уже видит, и Тестовые имена исключенных полей по отдельности, поэтому помещение одного обратно должно быть Умышленно. Только для чтения. Приложение sibling /org/domain/{host} Auto-Provisions Побочный эффект; конечная точка, достижимая путем угадывания, не должна записываться. Неизвестная ссылка 404s, а также двусмысленный псевдоним. уже отказывается от одного наименования нескольких оргов, и это ставит точку в том, что отказ достигает абонента как «нет такой организации», а не как чужая брендинг. Звонивший возвращается на платформу. themeDomain несет ту же ценность, что и оболочка и использование провизора темы, Таким образом, предсессионный экран считывает брендинг организации из папки, которая была На самом деле написано на - {alias}.kamocrm.com для организации без домена. Пройдет 947 испытаний.
· MediaService
Откажитесь от записи встречи для арендатора, который обрабатывает PHI
Разделение возможностей сделало ServiceType.MEET разрешенным — живая конференция Meet никогда не покидает кластер — в то время как MEETING RECORDING оставалась заблокированной, потому что этот трубопровод выкладывает всю стенограмму на многопользовательский маршрутизатор AI, а затем отправляет результат каждому участнику В том числе и внешние гости. Это бесспорная копия третьей стороны. Охранник сидит в частной воронке () обоих общественных точек входа через, поэтому он отказывается, прежде чем какие-либо байты достигают Минио, и снова наверху RunSummaryPipeline, который является публичным и @Async. 200 зелёных тестов.
· VOIPService
Заблокированная возможность теперь превосходит правый, и режим бога
PhiPlaybackAuthorizer подключил функцию воспроизведения вызовов PHI на VIEW CALL LOGS. Это было весь чек, потому что ServiceType.VOIP отображается на заблокированном Модуль VOIP RECORDING, поэтому у арендатора PHI не может быть телефонной системы И этот класс никогда не бежал за одним. Разделение возможностей сделало сам VOIP разрешенным - обработка вызовов VOIP RECORDING остается BLOCKED PENDING WORK по причинам которые не изменились: воспроизведение не выполняет проверку клиренса, транскрипты Поездка в метаданных, и нет пути удержания или удаления. Одинокий Это было бы прямым ослаблением: арендатор PHI мог бы позволить Телефонная система и, с одним предоставленным правом, отыграть все. Так что возможность Охрана идет первой, и ее отказ является окончательным. Не нужно параметр вызывающего абонента, поэтому для арендатора PHI ни одно право не поднимает его - и ни одно Выполняет активную сессию Бога, которая является наиболее важным свойством. ************************* **************************** Три теста закодированы в старом контракте и переписаны. Удаленный, каждая запись, почему ожидания перевернулись. Сообщение об отказе голосовой почты больше не обвиняет пропавшее право, которое Обычно это уже не причина. 152 теста зеленого цвета.
· SecurityService
Обслуживайте дерево приложений и исправляйте неохраняемое автоматическое включение
FeatureController теперь отправляет родителей / детей / родителей на каждый сериализованный Приложение позволяет клиенту сделать детей вложенными под своего родителя. обслуживаемый Вместо зеркального отображения в TypeScript специально: зеркала ServiceType Дважды дрейфовал с Явы, и вторая копия дерева была бы готова. Еще одна вещь, чтобы дрейфовать. Для каскада не требовалось никакой новой формы отклика — /enable и /disable уже ресериализирует весь список функций, поэтому приходят изменения без согласования клиентом чего-либо. Оба цикла автопроизводства теперь пропускают ребенка, чей родитель делает это. не предлагать, так как функция включает каскад родительской функции и в противном случае Включите родительский номер, который никто не опубликовал. У петли OrganizationController не было проверки PHI, а у FeatureController То же самое произошло на публичной неаутентифицированной конечной точке. Для арендатора PHI первый заблокированный модуль бросил, окружающий улов записал предупреждение, и Эффективные характеристики молча вернулись к сырым рядам без прикладной модели Проекция. Теперь он спрашивает, а не ловит, точно так же, как функции Список делает. /api/security/ehr зарегистрирован. Префиксы торговли отображаются на POS: Родитель - это правильные грубые ворота и ******************* уже перепрофилирован на рынок. 938 тестов зеленый.
· kamo-internal
Зазеркальте шесть приложений для детей и остановите дрейф зеркал
Оба зеркала теперь защищены от ServiceType.java. ручной работы. Они плохо дрейфовали от Явы и друг от друга: «RAG-интеграция» и «Возвращение в родительскую организацию SMTP» копия, которую Java удалила в 2026-08, POS помечена PLANNING в ServiceType.ts В то время как AppType.ts сказал COMPLETED, и различные описания для одного и того же приложение в каждом файле. Стоит знать, прежде чем доверять им: Имя и описание здесь Читается НИЧЕГО. Каждый потребитель использует эти константы только для идентификации. естьFeature() matchs on id, ключи AppServiceIcons on name. Копии приходят из GET/api/security/features, что позволяет PLATFORM APP CATALOG Зеркала не видят. Струны синхронизируются, чтобы читатель не вводился в заблуждение. Заголовок файла говорит не начинать их рендеринг. Дерево родителя/ребенка намеренно не отражается — особенности конечная точка отправляет родитель / ребенок / родитель за приложение и вторую копию Форма была бы еще одной вещью для дрейфа. Также: иконка на новую вертикаль вместо заимствования родительской Витрина магазина, и Геттеры организации в том числе IsEhr.
· kamo-internal
Одна полоса прокрутки, в три раза шире, вниз каждый разговор
Бар рядом с сообщениями был 8px в чате участника и SMS, 6px в билетах поддержки и социальные, а в чате ИИ это было совсем ничего: в этом списке была объявлена «ширина полосы» рядом с его::-webkit-scrollbar правилами, а с Chrome 121 неисходная «ширина полосы» или «Scrollbar-color» заставляет браузер отбрасывать весь блок -webkit - поэтому он запросил 12px. Получил линию волос платформы. документы globals.css, которые управляют прокруткой страницы; ничего Это было сделано, и ИИ-чат был на неправильной стороне. Все пятеро теперь читают одну константу CHAT SCROLLBAR: водосток 24px - в три раза больше, чем в чате участника. старая ширина — с большим пальцем, установленным 6px по обе стороны прозрачной границей, так что бар такой широкий Все еще читается как таблетка в корыте, а не плита, приваренная к краю окна. Чат ИИ Стандартные свойства переходят в '@supports not selector(:::-webkit-scrollbar)', где globals.css ставит их и единственное место, где Firefox читает их, не обходясь Chrome его правилами. Тест является исходным уровнем, потому что предмет представляет собой таблицу стилей, и jsdom не реализует прокрутки: Он зажимает то, что ни одно окно не имеет буквальных размеров, и что ни одно из них не устанавливает стандарт. Имущество опять не охраняется.
· InitializerService
Расширьте дедушку рынка в заднюю засыпку дерева приложений
существующий дедушка GatedMarkets уже прошлись по активным рынкам каждой организации. Решено getRequiredService() и включено недостающее приложение — это было просто ограничивается вертикалями, то есть MORTGAGE и PERSONAL LOANS. Теперь Каждый CommerceType называет свое собственное приложение для детей. Так же петля семян RETAIL/RENTAL/SERVICE/SUBSCRIPTION/ Прокурорные ряды. Новая миграция не нужна. Также семена RETAIL для организаций, которые держат POS без рынков вообще. Торговля до дерева, потому что розничная торговля не нуждалась в собственном приложении. Органы верхнего уровня больше не пропускаются, и это решение имеет значение. Освобождение было правильным, когда это предоставляло только два приложения для кредитования. Платформа-оператор не должна молча приобретать MLOS, но это неправильно. для дерева приложений, потому что для него требуется функция OrgFeature ROW и не имеет исключений высшего уровня. Первый забег показал успех, пока оставляя KamoCRM, который управляет активными рынками ретейла и SUBSCRIPTION, Ни для одного из них нет строк; он потерял бы оба из / коммерции на следующем. Безопасность Служба развернута. Пойманный запросом базы данных, а не чтением Журнал. теперь каскадирует ребенка к его родителю, поэтому посев ребенка также Гарантия POS-ряда. Бегите против выступа 2026-08-24. Проверено: каждая активная строка commerce markets Сейчас есть активный детский ряд OrgFeature, ноль отсутствует.
· SecurityService
Проверяйте каждую вертикаль, а не только две закрытые
Каждый CommerceType теперь называет свое собственное приложение для детей под POS. isGated() короткое замыкание, которое волновало розничную торговлю, аренду, обслуживание, подписки Приобретение сразу же прекращается. Сейчас эти рынки проверяются. против собственного приложения — в чем суть: вертикаль может быть продана, и Выключен, сам по себе. Зависит от заполнителя KamoInitializer.
· kamo-internal
Поиск панели инструментов - это глиф, который открывается в поле
В чате участника была постоянная строка поиска в верхней части окна — ширина окна. вся панель инструментов, потраченная на управление, которое пустует почти все время и используется в очередях. Это Теперь это лупа 28px, которая открывается в поле нажатием, а панель инструментов читается как четыре. Глифы и воздух. Идея в том, что он построен вокруг: лупа никогда не движется и никогда не заменяется. Развалился, таблетка 28px и иконка находится в центре, 14px с левого края; открытая таблетка имеет 6px Облицовка перед значком 16px, который снова ставит центр значка на 14px. Таблетка растет из-за глифа, который неподвижен, и управление читается как один объект, открывающийся скорее более чем в двух штатах. Ширина пружин с небольшим перелетом на пути открыта и ни одного на закрытом пути; заполнитель отслеживает рост на 60 мс, поэтому текст поступает в коробку, которая У него уже есть место для этого; четкий контроль возникает только тогда, когда есть что очистить. Закрытие всегда очищает запрос, и поле не может быть удалено, пока оно содержит один: Разрушенный луп, все еще фильтрующий разговор, был бы окном, лгущим о том, что это такое. Показать. Blur оставляет его открытым с текстом в нем, и случайный щелчок по глифу фокусирует поле Вместо того, чтобы отказаться от поиска. Уменьшенное движение почитается повсюду, глиф несет фокусное кольцо для вкладки, а также для щелкните, и 50px-спейсер, старый необходимый ящик, исчезнет вместе с ним.
· kamo-shared-library
Каждая вертикаль называет свое детское приложение
обслуживание становится полным теперь, когда каждая вертикаль имеет приложение для детей. ServiceType.POS, который удаляет «ноль означает, что одного POS достаточно». Особый случай и с ним (с ним). Теперь можно включить каждую вертикаль, лицензируется и классифицируется независимо, что позволяет врачу практикуйте торговлю вообще, так как RETAIL остается заблокированным для арендатора PHI Остальная часть торговли – нет. HEALTHCARE (ServiceType.EHR) - это то, что заставляет EHR появляться в Интернете. **************** когда приложение включено, без нового торможения код: claimCommerceTypeAllowed, getAllowedCommerceTypes конечная точка разрешенного типа позади обоих маркет-пикеров; **************** и список рынка фильтровать все Решить проблему можно с помощью GetRequiredService(). Не откладывайте до тех пор, пока не заработает заполнение KamoInitializer. Разработчик:CommerceTypeAllowed читать GetRequiredService() напрямую, поэтому в тот момент, когда SecurityService увидит это Каждой организации с розничным или арендным рынком нужен детский ряд OrgFeature. Пока нет.
· MediaService
Пусть публичная конфигурация будет адресована org id, а не только хостом
Коляска встреч ищет конфигурацию встречи организации, чтобы решить, является ли гость Нужен пароль встречи. Его спросили по имени хоста, который на совместной встрече хозяин решается на организацию платформы - поэтому арендатор, который требует Пароль должен был отбросить это требование для каждого гостя. присоединение по ссылке. У гостя нет сеанса, поэтому единственное, что называет его арендатора, это комната. Который теперь носит орг-токен. Таким образом, оба конечных пункта принимают явный orgId и вернуться к поиску домена, когда его нет, поэтому Ничто из того, что просит сегодня хозяин, не меняется. Иды приходят в виде цифр и парсируются как длинные: они проходят 2^53. Иными словами, через двойное название проходит другая организация. Проходят 200 тестов.
· kamo-shared-library
Функция Cascade позволяет / отключает через дерево приложений
Воспитание ребенка позволяет его родителю; отключение родителя отключает каждого ребенок; отключение последнего ребенка отключает родителя. Позволить родителю Оставляет детей одних, поэтому родитель включился намеренно без Дети остаются. Каскад движим событиями, и нет преднамеренного примирения. подметать. Это свойство безопасности: постоянно принуждаемый "родитель с «Нет включенных детей выключен» инвариант переключает торговлю для каждого существующая организация в момент отправки, потому что никаких детских рядов не существует до Заполнение KamoInitializer. Ребенок утверждает охрану PHI на родительском модуле, а также на своем собственном. перед любой записью — в противном случае разрешенный ребенок под заблокированным родителем Либо застрял бы, либо молча включил заблокированного родителя.
· kamo-shared-library
Добавить PhiCapabilityGuard для проверки возможностей времени вызова
PhiTenantGuard работает в включенное время и нигде больше — три звонка Сайты, все в FeatureService. Теперь, когда PhiModule имеет потенциал, приложение, ядро которого разрешено, все еще может содержать возможность, которая не Проверка времени не может увидеть разницу. Та же преднамеренная подпись, что и PhiTenantGuard: чистая функция (статус, модуль) без абонента, правого или божественного параметра, поэтому Нечего поднимать. Простой класс, а не стереотип — общий либ Компонент, нуждающийся в несканируемом репозитории, взломал четыре сервиса Время; каждый потребитель услуг объявляет свой собственный @Bean. ПРИМЕЧАНИЕ: MEETING RECORDING и VOIP RECORDING в настоящее время не связаны с какими-либо ServiceType, но пока не охраняется на своих сайтах звонков - это следующий Совершите прикосновение к MediaService и VOIPService. Это инертно в производстве. Между тем, потому что каждая организация в настоящее время обрабатывает Phi = ложно, но вызов Сайты должны приземлиться до того, как любой арендатор будет помечен.
· kamo-shared-library
Сплит PhiModule от App-grained до функциональности
POS отображается на ECOMMERCE SYNC (BLOCKED NO BAA) и всю торговлю поверхность свисает с POS, поэтому орг с ручкамиPhi=true не мог переключаться Торговля вообще — нет рынка, нет / торговли и нет клинической вертикали Построен на нем. Десять розничных адаптеров синхронизации - это то, что оставляет Граница, а не торговый позвоночник. POS теперь отображается в COMMERCE CORE (разрешено) и ECOMMERCE SYNC Для ребеночка. То же исправление для MEET (живая конференция vs. сводный конвейер, который отправляет транскрипты на внешний вывод) и VOIP (телефония vs сохраненные записи и транскрипты). MEETING RECORDING и У VOIP RECORDING теперь нет ServiceType: это возможности Достижимо только через код, и в javadoc PhiModule теперь указано правило Чтобы такая постоянная была проверена PhiCapabilityGuard по ее вызову Сайт. Реклассифицировать приложение как разрешенное без защиты возможностей Внутри он читается как совместимый, ничего не принуждая. AI ASSISTANT и RAG SEARCH остаются заблокированными имеет вставки, шепот и перевод, но не генеративный LLM, и RAG разделяет одну коллекцию Qdrant, выделенную фильтром полезной нагрузки. Расщепление Это будет бумажная смена. Два теста закодировали модель приложения и обновляются, а не Разработчик: PhiServiceTypeMapping Заявление о блокировке приложения и FeatureServicePhiGateTest, чей заблокированный экземпляр переходит из VOIP в RETAIL — VOIP больше не может быть опровергнут во время включения.
· kamo-internal
Земля внутри вновь созданной организации вместо установки DNS
Создание орга направило создателя в /setup/dns, и причина была реальной: Ввод означает перенаправление OTK на внутренний.<new-domain> и совершенно новый Орг не имеет DNS, поэтому хост был недостижим. Конфигурация DNS была Цена открытия того, что вы только что сделали, — точная стена, которую вы построили. Работа снимается. Звонок создателя уже возвращает одноразовый ключ; у волшебника просто не было места. Чтобы потратить его. Сейчас он тратит его на текущее происхождение, где сессия Назовите организацию, так что хозяина ждать не приходится. Домен все еще стоит иметь, и настройки там, где он живет сейчас: необязательный шаг с белой маркировкой, а не дверной проем. Предупреждения о брендинге Пройдя через любой путь, и если ключ не возвращается, то орг все еще существует. И тогда колдовство рассеется. Контрольно-клиентская навигация правильно пометила window.location.href. собственный docstring names /validate with a one-time key as a real session-boundary прыжок, так что это разрешено с этой причиной, а не работать вокруг - роутер будет поддерживать OLD-сессию создателя, что и является Его заменяют. Проходят 2857 испытаний и все 7 охранников.
· kamo-shared-library
Дайте ServiceType двухуровневое дерево родителей и детей
Шесть коммерческих детей на новых идентификаторах 26-31, подключенных к POS в статическом блоке Модель RoleRightType (константа enum не может ссылаться на другую модель). собственные конструкторские аргументы. МЛОС и ЛОС возмещают без изменения ИД, потому что ORG FEATURES сохраняет идентификатор через ServiceTypeConverter и перемещается Он переназначил бы все существующие ряды. Копия POS становится «Линиями бизнеса» теперь, когда ее родители ссужают деньги. Записи пациентов; постоянное имя остается POS **************************** Названия продолжаются как строки. старый Описание перемещается в RETAIL, где оно точно и уже проверено. СервисTypeCustomerCopyTest Новые константы отправляются ПЛАНИРОВАНИЕ / отключены, поэтому FeatureController.list Автозавод не может включить их для каждой организации. PhiServiceTypeMapping Тест не срабатывает по дизайну до тех пор, пока следующая карта фиксации не Новые константы; оба приземляются в один толчок.
· kamo-internal
Создайте орг без вводимого домена
Вхождение в организацию означало переход к ******************* Без домена, который URL отображается как буквальный **************************** Так что вход был инвалидом и владельцами. вместо этого были направлены в /setup/dns - DNS был дверным проемом, а не Вариант с белой маркировкой. Рабочее пространство теперь открывается на непосредственном происхождении, когда нет живого обычая. Ведущий, и сессия называет организацию. Арендатор с работающим пользовательским доменом Он по-прежнему открывается на своем собственном хосте, поэтому ничего не меняется для тех, кто имеет белую маркировку. Незавершенный пользовательский домен рассматривается как никакой домен: что HOST не может служить, но это не то же самое, что недостижимая организация. CanEnterOrg - ключи от того, что всегда было реальным Предпосылка - полезное членство - а не домен. NeedsDomainSetup и orgStatus намеренно продолжают сообщать о незавершенном домен: это больше не барьер, но это все еще кто-то выдающийся Задача, и вид на усадьбу там, где это замечают. Оболочка также должна была перестать спрашивать имя хоста, в какой организации она находится. Корень макет стер «внутренний» и посмотрел на хозяина вверх, который отвечает «кто владеет». Это имя — тот же вопрос, что и «в каком рабочем пространстве я нахожусь» только тогда, когда У каждого жильца был свой хозяин. На платформе хост возвращает Владелец платформы, поэтому член, входящий в бездомную организацию, был бы показан. KamoCRM Бренд, особенности и права Inc. Теперь он просит первую сессию через /api/org/current и возвращается к хосту, когда нет сеанса; который сохраняет подписанную оболочку. Печенье *** это то, что делает Сессионное хранилище невидимо для запроса документа. Проходят 2857 тестов и все 7 защитных скриптов.
· SecurityService
Пусть оболочка вытаскивает свою форму из сеанса, а не хозяина
корневая компоновка kamo-internal читает заголовок Host, полоски «внутренние». fetches /org/domain/<that>. На хозяине, обслуживающем одного арендатора, который тот же вопрос как «какой я орг»; на общем хосте это другой вопрос с неправильным ответом - он возвращает того, кто владеет хозяином, так что член, который введенный в бездомную организацию будет передан брендингу KamoCRM Inc., функциям и флаги. Добавляет GET/api/security/org/current, возвращая прогнозируемый рекорд для Организация, в которой находится Сессия звонящего. Макет может достичь его, потому что он уже пересылает заголовок Cookie и существует *** cookie, поэтому сервер может видеть сессию, даже если она невидима для документа просьба. Не принимает никаких параметров, намеренно. Первый проект принял идентификатор или псевдоним ************************* Правильно отказал: форма У каждого из них есть свой собственный псевдоним, и они Догадываемо. Сеанс уже знает, в какой организации он находится, поэтому параметр Можно было только спросить о другом. После того, как сессия разрешила Раштет проходит сам по себе, а не нуждается в базовом входе. Проекция извлекается, а не копируется. Две конечные точки возвращают две Формы одной и той же записи - это неудача, которую стоит предотвратить - клиент Они не могут определить, что это такое, и они дрейфуют в первый раз. обновлено. Пройдет 928 испытаний.

Ваша вселенная ждет.
Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.
Бесплатно навсегда — не требуется кредитная карта