Перейти к содержимому
KAMOUniverse

Журнал изменений

Что нового.

Каждое усовершенствование платформы, как только она появится.

  1. · kamo-shared-library

    Репозиторные запросы для поиска точного соответствия, список страниц, квитанции

  2. · kamo-shared-library

    Добавить dateLastViewed в MediaSessionMember для получения временных меток

  3. · kamo-shared-library

    Добавить флаг isAccessRevoked для управления доступом в каждом приложении

  4. · kamo-marketing

    Distinguish actively-translating vs queued messages

    The translation queue was already sequential, but every queued bubble rendered "Translating…". Now the single in-flight message shows "Translating…" with a pulsing dot and the rest show "Pending Translation…" with a static dot, so the visitor can see the queue progressing.

  5. · kamo-internal

    Distinguish actively-translating vs queued messages

    The streaming queue was already strictly sequential (one fetch at a time), but every queued message rendered "Translating…" because they all shared the same pendingTranslation flag. Split that into two states: the single message currently in flight shows "Translating…" with a pulsing dot, all the other queued messages show "Pending Translation…" with a static dot. Live (just-arrived) messages are translated alone and start in the active state.

  6. · kamo-marketing

    Show error icon when a message fails to translate

    When the per-message translate call returns translated:false, errors out, or times out, the chat bubble now renders an AlertTriangle icon in red with tooltip "Failed to translate message." instead of silently leaving the bubble in the original language.

  7. · kamo-internal

    Show error icon when a message fails to translate

    When the per-message translate call returns translated:false, errors out, or times out, the chat bubble now renders a small red ErrorOutline icon in place of the translate badge with tooltip "Failed to translate message." instead of silently leaving the bubble in the original language. The flag is reset whenever the user picks a new language so a re-attempt can succeed without the stale error sticking around.

  8. · kamo-marketing

    Stream translations newest-first for visitor history

    When the visitor lands on a non-English locale and the support chat has existing English messages, every bubble flagged needsTranslation by the backend now shows a "Translating…" placeholder while a streaming queue fills them in one at a time, starting from the newest message. A generation counter prevents stale queues from clobbering current state.

  9. · kamo-internal

    Stream message translations newest-first on language switch

    When the user picks a new language (or opens an existing chat in a language different from the messages' source), every bubble that needs translation immediately renders a "Translating…" placeholder and the translations stream in one at a time starting from the most recent message and working backwards. This includes the user's own past messages — anything authored in a different language than the viewer is now translated. A generation counter cancels in-flight queues if the user changes language again.

  10. · kamo-marketing

    Auto-translate visitor and agent messages

    Live agent replies arriving in a language other than the visitor's URL locale now show a "Translating…" bubble while the TranslateService call resolves, then swap to the translated text with a Languages badge whose tooltip shows the source language and the original message. Visitor messages are tagged with the URL locale on send so the agent's chat can translate them into the agent's profile language. Messages loaded into history are translated up front via the new ?lang=<locale> query param on /api/chat/support.

  11. · kamo-internal

    Translate chat messages into the viewer's language

    Adds a "My Language" flag picker in NavTop (left of the email tool, separated by a vertical rule). Selecting a language writes back to Member.language and syncs the locale cookie so the entire UI switches; it also broadcasts an event that any open ChatBox uses to re-fetch its history in the new language. ChatBox now fetches messages with ?lang=<locale>, renders translated bubbles with a small Translate badge whose tooltip shows the original text and source language, and shows a "Translating…" placeholder for live messages until the TranslateService call returns. The send path tags every outbound message with the author's locale so other viewers can translate it on demand.

  12. · APIService

    Proxy support-message translate endpoint

    Adds a passthrough route for the new MediaService endpoint that translates a single support-chat message into the visitor's URL locale. The marketing-side chat widget hits **************** which the gateway now forwards to MediaService with the standard public-chat auth and rate-limit checks.

  13. · MediaService

    On-demand translation for chat and support messages

    Captures the source language for every chat / support message and adds an optional ?lang=XX param on the message-fetch endpoints plus a per-message POST /translate endpoint. MediaService now talks to TranslateService via TranslationServiceClient, and MessageTranslationService caches results in MediaObjMsgTranslation so the same translation is never paid for twice. Wires the same flow into the public-chat (visitor) path: visitors send their URL locale as sourceLanguage, and the agent / visitor sides each pull translations into their own preferred language. Adds the translate-service secret to the MediaService deployment so the new client can authenticate.

  14. · kamo-shared-library

    Translation cache for chat messages

    Adds the MediaObjMsgTranslation entity (one row per (message, language) pair) and an optional sourceLanguageId column on MediaObjMsg so chat messages can be translated on demand and re-served instantly to other viewers in the same language. ChatMessageDto carries sourceLanguageId so live recipients know whether they need to translate. MediaService.createMessage gains an overload that takes the authoring language, falling back to Member.language for legacy callers.

  15. · kamo-internal

    Добавить Personal + Chat/Docs/Notes/KB/HRS разделы

    Индекс /settings не показывает разделы для не-администраторов, потому что каждый существующий раздел был закрыт справа от администратора (CONFIGURE SYSTEM, MANAGE * SETTINGS, MANAGE ACCESS RULES. Регулярный член команды, имеющий только права поддержки видели ровно 3 карты (Topics, Analytics, Scheduled) Поддержка) и ничего более. Добавить всегда видимый личный раздел (Мой профиль, аудио и видео). Аккаунтная деятельность и планы и выставление счетов на детских организациях, которые связаны с собственные вкладки /settings/member/<myId> — так что настройки никогда не бывают пустыми; независимо от прав на уровне организации. Также всплыли ранее отсутствовавшие чаты / Документы / Заметки / Знания Базовые / HRS-разделы — каждый из которых закрыт соответствующим флагом + соответствующее MANAGE * SETTINGS право - чтобы соответствовать выделенным /settings/features/<app> страницы, которые уже существуют для этих приложений.

  16. · kamo-internal

    Вращение открытия цели на основе соотношения сторон обзора

    Рамка цели теперь наклонена на Atan2 (viewportH, viewportW), так что она открыта. правая сторона направлена к диагонали обзорного поля — для мониторов 16:9 точки открытия ~29° к югу от востока; для портрета это точки ближе к На юг. Читает, как пользователи естественным образом выбрасывают головы из основной массы Экран назад к верхнему левому углу. Физика: столкновение целей теперь проходит в координационных коордах. Каждый брошенный Центр головы + скорость вращаются в локальную рамку, существующую AABB. Столкновение со стенами, выровненными по оси, проходит без изменений, затем любые Отталкивание и отражение скорости вращаются обратно в мировое пространство. The Проверка зоны баллов также проводится в местных кордах, поэтому голова действительно При входе в (поворотное) отверстие все равно баллы. Визуальное: кадр SVG + свечение на стороне входа живут внутри вращения Контейнер; праздничные накладки (GOAL! / MISS!) и подпись Удалить Сидите вне вращения, чтобы текст оставался читаемым. Мисс Тряска Колеблется вокруг угла основания вместо нуля. Угол цели пересчитывается по размеру видопорта через установщик состояния с параллельный ref, поэтому бросок RAF считывает последнее значение каждого кадра без повторного создания обратной связи.

  17. · kamo-internal

    Бросайте-удалить гол со счетом / пропущенные торжества

    Рамка 132×132 цели появляется в верхнем левом углу, когда голова находится в соло-драг или активный бросок, смещение 56px из угла, чтобы головы могли Пропустить прошлое или позади него. Три твердые стены (верхняя, левая, нижняя) действуют как упругие поверхности отскока (0,65 реституции); правая сторона открыта Вход. Смелый красный X на задней панели делает намерение «удалить» Безошибочно, и пульсирующий индикатор входа отмечает открытую сторону. Когда центр брошенной головы пересекает зону оценки, он удаляется. с карты броска окно основного инструмента закрывается через инструмент: закрыть, и голова удаляется с помощью удаления головы. Зеленый радиальный Вспышка, 18-частичный золото-оранжевый взрыв и прыгающая цель! наложение Огонь на счет. Когда брошенная голова просто отскакивает от любой стены цели (объявлен на 350 мс, так что один провал не спам-события), цель Встряхивает красный и Мисс! Наложение ударов. Стабильность: столкновение с целью живет полностью внутри петли броска RAF (не споры пружинной системы), и HexHeadGoalZone владеет всеми Празднование состояния внутри — двигатель только зажигает события. чистый аддитивная функция; пути без броска перетаскивания / капли неизменны.

  18. · kamo-internal

    Бросьте физику с столкновениями с бассейном и следом кометы

    Промахивая головой мимо порога броска, запускает его через видопорт в соответствии с эксплицитной физикой (трение, отскок ребра, упругость головы против головы) Столкновения). Медленные капли все еще приземляются именно там, где выпущены. Пока голова Вслед за ним идет огненная тропа в аркадном стиле. Бросок закрывается обеими скоростями высвобождения (>= 650 px/s, усредненный по последнее ~110 мс) и общее расстояние перетаскивания (>= 30 px) так быстро Повторное положение никогда случайно не вызывает броска. Магнитуда ограничена 3200 px/s, чтобы держать кромки обнаружения прирученными. Бросок петли RAF приводит в движение значение пишет непосредственно через .set() - обход кадровых пружин во время полета — и самоостановки, когда Все головы опускаются ниже порога скорости остановки. HomeCluster и softPushCluster пропускает любой якорь в настоящее время на карте броска Весенняя система никогда не борется с физическим интегратором. Ударные головки отделяются от любого кластера, продвигаются к одиночному кластеру и Присоединяйтесь к симуляции броска с импульсом, передаваемым столкновением. Рендеринг траектории: слой SVG с радиально-градиентными угли вдоль последних позиции, смешанно-смешанный режим: экран для аддитивного свечения, одиночный размытие CSS фильтр мягкости — аркадная эстетика, почти нулевая стоимость процессора.

  19. · kamo-internal

    Используйте OTK, отчеканенный сервером, для перехода в новую организацию

    Предпочитаете otk, возвращенный POST/api/security/org, по сравнению с последующей версией. /api/security/enter-as round-trip. Сервер теперь чеканит нового владельца сеанс как часть создания организации, поэтому пост-создание перенаправляется на новую Орг /validate является детерминированным - нет расы с созданием домена, нет Молчаливый вход — как неудача, оставляющая создателя на родительской сессии.

  20. · SecurityService

    Владелец монетного двора ***+OTK on org

    После создания OrganizationOwner отчеканить свежий *** привязанный к новому владельцу TeamMember и верните OTK вместе с id/members. Без этого, Создатель остается на родительской сессии — ограниченные права и isOrganizationOwner=false — так появляется страница настроек новой детской организации Планы и Биллинг скрыты, пока они не войдут вручную.

  21. · kamo-shared-library

    Самоисцеляющиеся непредусмотренные заказы COMP на запуск

    На @PostConstruct отсканируйте все заказы APPROVED COMP и предоставьте все, что Отсутствие подписки на аккаунт. Idempotent — find-or-create — безопасный способ многократно бегать.

  22. · kamo-internal

    Переместите статус доступности вниз на левую сторону перед моим бизнесом

    Переносит статусную таблетку из правой строки действия в левую часть приветствия, помещая ее между разделителем приветствия и Моим бизнесом с разделителем. Удалите вертикальное правило, которое ранее отделяло статус от кнопок значка.

  23. · kamo-internal

    Добавить targetOrganizationId в типы SubscriptionOrder и создать Subscription Приказ

  24. · SecurityService

    Добавить точку доступа для активации подписки COMP из утвержденного заказа

    POST **************** звонки ****************, а затем аннулирует права на целевую организацию через Службу прав.

  25. · kamo-shared-library

    COMP заказывает одобрение автопредложений АккаунтПодписка и присваивает лицензию

    - Заказ подписки: добавить целевую организацию (отменяемую ФК к оргам) ************* Добавить целевую организацию - AccountRepository: добавьте findByPrimaryMember Id для поиска учетной записи владельцем - SubscriptionService: injet billing repos; provisionCompSubscription create/upserts **************************** SubscriptionMember и ACTIVE AccountLicense для целевого участника; approveOrder призывает его к методу оплаты COMP; newactivCompOrder для ретроактивного предоставления существующих заказов APPROVED COMP

  26. · kamo-internal

    Замените click-to-open на action popover + size control

    Щелкнув шестнадцатеричной головой, теперь открывается полированный стеклянно-морфный попувер с Контекстные действия вместо немедленного открытия окна инструмента. член чат-руководители разоблачают: Open Chat, View Account, Email, Invite to Meeting, Звонок (когда обе стороны имеют зарегистрированное расширение VOIP); Открытое <toolName>. Подменю размера позволяет пользователю выбирать малый / средний / большой для этой конкретной головы (сохраняется на члена через новый MemberUiPreference store) плюс слайдер глобального масштаба, который влияет на каждый Шестиглавая голова на этой машине (сохранилась в локальном хранилище). Инструментальные окна сейчас ширина/высота зажима для обзорной площадки, чтобы они никогда не открывались частично Экран даже с усохшими окнами.

  27. · InitializerService

    Добавить таблицу MEMBER UI PREFERENCES (порядок 60)

    Idempotent CREATE для общего резервного копирования UI-предпочтения на каждого участника селектор размера поползновения и будущие настройки пользовательского интерфейса на одного участника. Схема отражает конвенцию EmbRecordState (is active, date created, date updated) используется в других разделах модели данных.

  28. · SecurityService

    Add MemberUiPreferenceController for per-member UI settings

    Backs the new hex-head popover size selector and any future small per- member UI preference. Endpoints under /api/security/members/me/ui- preferences resolve the member from the OTK session and read/write JSON values keyed by an opaque prefKey string.

  29. · kamo-shared-library

    Add MemberUiPreference entity for per-member UI prefs

    Generic per-member UI preference store (memberId, prefKey, JSONB value) for small persisted UI settings. First consumer is the hex-head popover size selector.

  30. · kamo-internal

    Wire FeaturesManager для подписки на платформу для знакомства с детьми

    FeaturesManager назвал наследие **************** броски (невостребованный запасной вариант) вместо чтения реальной подписки на платформу. Теперь звонки ****************, который запрашивает корневую форму Коммерческая подписка на членство абонента в кросс-оргах. Когда Caller имеет APPROVED COMP-заказ на корневой орге, все функции открываются как ожидаемые для компьютерных администраторов child-org.

Ваша вселенная ждет.

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

Бесплатно навсегда — не требуется кредитная карта