Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-shared-library
Добавить ключ типа события VENDOR CALLBACK RESOLVED (вход 0.6a)
· kamo-shared-library
Подложка реестра LoanIdentifier — 42 типизированных идентификатора (ключевой камень 0,5, срез 1)
Новый pkg com.kamo.z.shared.mlos.identity (ключ маршрутизации входящего веб-хука): LoanIdentifierType (42 идентификатора первого класса, каждый из которых несет Cardinality + Ownership; @Enumerated STRING; SingleActiveTypes(), полученный из метаданных) + **************************** + Субъект LoanIdentifier (BaseUuidEntity; FK-by-id Long loanFileUid + денормализованная организацияId, отделенная от заблокированного LoanFile; напишите один раз @PreUpdate Guard бросает на изменение стоимости / типа / пользовательского подтипа, допускается только изменение статуса; @PrePersist нормализует эмитента / подтипа + применяет OTHER<=>customSubtype) + LoanIdentifierRepository (ищущие решения; значение - только поисковая помощь). Проверено локально: mvn установит BUILD SUCCESS, 49 тестов MLOS (включая одноактивный дрифтерный тест, утверждающий, что набор enum соответствует DDL с частичным индексом KamoInitializer). KamoInitializer DDL: сканирование + 3 парциально-уникальных индекса + ДРУГИЙ CHECK. RESOLVER + webhook ingress = первый новый микросервис MLOSIdentifierService (отложенный).
· kamo-shared-library
StewardFeedback flywheel — захват каждого вердикта стюарда (ключевой камень 0.11)
Новый pkg ************* только в приложении StewardFeedback строка наземной правды (FK ai decision.uid; вердикт CONFIRM/OVERRIDE/MODIFY; Reg-B-aligned reasonCode; correctedValue jsonb; isTestLoan со штампом во время записи на doc12 §4.4; @PreUpdate WORM guard) + StewardFeedbackRepository + StewardFeedbackRecorder, который составляет ALL THREE Phase-0 Keystones в одном tx (спиновое суждение AiDecision + очерчивает mlos.steward.feedback.записанный через окно событийной магистрали + штампирует тестовый раздел). Запись закрыта mlos.governance.enabled (по умолчанию -> нулевой радиус взрыва). KamoInitializer DDL: сканирование + индексы обратной связи + FK до ai decision.
· kamo-shared-library
Immutable AiDecision WORM ledger + двухстенный DecisionGate (ключевой камень 0.3, срез 1)
New pkg com.kamo.z.shared.mlos.decision (greenfield decision spine, never edits donotmodify): неизменяемый AiDecision (WORM via @PreUpdate guard; loanFileId is a Long FK to LoanFile.uid per doc01/gotchas, NOT UUID; supersession via supersedesDecisionId on the NEW row to stay WORM-consistent with the DB trigger) + **************************** enums + AiDecisionRepository (определяющие ссуды). DecisionGate = двухстенная библиотека в процессе (юридическая стена ABSOLUTE/non-tunable; настраиваемая стена доверия; ненастраиваемый пол безопасности платформы внизу) — только конфигурация @Component, без repo dep, безопасная недвижимость в целом. DEFERRED to Dependency slices: DecisionInput (FKs the Phase-2 catalog), StewardTask/OrchestrationState, legal registry, HMDA-firewall CHECK, ModelVersion FK. KamoInitializer DDL added (ai decision index + flagged DB WORM trigger needing CRDB v24.x).
· kamo-shared-library
Ворота для изоляции арендатора для костяка событий (срез 3)
Дорожная карта 0.10: **************** (шов для подписки на одного арендатора) + принадлежит ToTenant (субъект,orgId) по токену, соответствующему фильтрации NATS; для Event теперь отклоняет непозитивный orgId (никаких событий без арендатора). Изоляция MlosTenant Тестирование представляет собой исполняемый перекрестный вход для арендатора (в том числе токен-граница: org 12 никогда не совпадает с org 123). MlosDeadLetterRepository получает искателя стюардов с орг-шпионом (защитника орг-шпиона репо-слоя) вместе с перекрестным арендатором с оператором. Сфера применения для арендаторов в X-Internal-Auth hops охватывает всю территорию недвижимости и откладывается до краеугольного камня аута; тест изоляции живого брокера следует с первым конкретным потребителем.
· kamo-shared-library
Потребительская идемпотентность, DLQ + повторение стюарда (срез 2)
Добавляет ядро надежности, к которому подключается любой потребитель MLOS: ProcessedEvent dedup ledger (уникальное Consumer name+event id) + MlosDeadLetter DLQ + MlosDeadLetterStatus; IdempotentEventProcessor (INSERT-or-skip dedup в обработчике tx, поэтому отказ откатывает маркер; dead-letters past maxAttempts вместо петли; deadLetterUnprocessable для неразборчивого яда); DeadLetterReplayer (переоформляет письмо DEAD через почтовый ящик в качестве нового события с причинно-следственной линией -> без столкновения msg id-unique/dedup-window, метки REPLAYED). MlosEventEnvelope получил @Jacksonized за десериализацию в оба конца. Новые @Components используют опцию mlos.outbox.enabled; РЕПО находятся в уже отсканированном пакете. Live AbstractMlosDurableConsumer (подписка НАТС) откладывается до своего первого конкретного потребителя.
· kamolos
Принять транзакционный почтовый ящик MLOS (путь производителя)
Включает хребет событий фазы 0 в KamoLOS: добавляет com.kamo.z.shared.mlos.event к сканированию @EnableJpaRepositories, mlos.* config (mlos.outbox.enabled=true, MLOS EVENTS stream + dedup window, sweeper) и тесту проводки на пути производителя, доказывающему очередь -> Эстафета AFTER COMMIT публикуется ровно один раз с конвертом eventId в виде Nats-Msg-Id. Schema (mlos outbox event + indexes) применяется отдельно пользователем KamoInitializer.
· kamo-shared-library
Транзакционный аутбокс событий (Phase-0 keystone B)
Дорога производителя в категории «Деньги / соответствие» в NEW sibling pkg **************** (никогда не редактирует donotmodify): MlosEventEnvelope DTO + MlosOutboxEvent outbox entity/repo + OutboxWriter (заголовок один-tx) + OutboxRelay (AFTER COMMIT hot-path + @Scheduled sweeper, публикуется с Nats-Msg-Id) + MlosNatsStreamConfig (новый поток MLOS EVENTS с окном dedup NatsConfig отсутствует). Повторное использование заблокированных NATS Connection/JetStream бобов. Включение через mlos.outbox.enabled (по умолчанию), поэтому непринятие услуг не затрагивается. Точно один раз эффект = транзакционный аутбокс + JetStream Nats-Msg-Id dedup. Потребительский дедуп / DLQ + CI арендатор-изоляция Slice 2/3.
· kamo-internal
Показать уровни данных на стадии вкл. Морская маска EDT4 + маркировка TRF2
Сценические карты приборной панели Worldgen теперь перечисляют слои данных каждой плитки. акцентируя вновь добавленные: маска EDT4 «Океан» (морская связь) под водой, и маркировка полосы TRF2 + ранговая градация местности под транспортом. Чистый формат/данные Ярлыки (STAGE LAYERS в type.ts) — никаких новых строк i18n. Свежий / Regen уже Поверхность автоматически после того, как происхождение ударов EDT3→EDT4 / TRF1→TRF2.
· kamo-internal
Поверхностная несвежесть плитки + таргетированная «Регенерировать N» на странице
Снимок агента теперь несет за рецепт несвежесть (обновленный / устаревший / отсутствующий); Переведите его через API + SSE на страницу: - На вкладке услуг отображается линия свежести на услугу плитки, и кнопка «Пуск» становится «Восстановление N» (= устаревший + отсутствующий), когда есть целевая работа, или «До настоящего времени». - Обзор завершения плитки подсказка показывает, сколько плиток нужно обновить. Старт уже ориентирован на хост, поэтому кнопка запускает целевой Реген именно застойных/отсутствующих клеток.
· kamo-internal
Страница администратора мирового поколения
Добавления/настройки/платформа/вселенная под Администрированием Платформы — собственная платформа карта + три подзадачи (Обзор, Услуги, Действия) — для запуска и мониторинга KamoUniverse world-data pipeline live. Backend (Next API, Platform-admin gated via *** session, то же правило, что и в случае с платформой). Охрана клиента: - app/lib/worldgenNats.ts: одно длительное соединение NATS + абонент статуса который кэширует последний статус на стадии + снимок (в памяти + Redis) и Повторный вход в автобус для SSE. Публикация стартовых команд. - app/api/universe/services GET текущее состояние каждого этапа (статус + плитка) Счет + lockHeld. ********************** Отправьте команду запуска агенту k3m1. - app/api/universe/stream SSE stream of live status/snapshot events. Frontend (MUI + next-intl, отображает страницу конфигурации): - использовать Worldgen: один общий поток SSE (авто-подключение) + start() для всех вкладок. - Общий обзор: агент/пакет/завершение/фрагментная плитка + рельс с живым трубопроводом. Услуги: богатая карта на сценарий — роль + что она выполняет, живое состояние значок, есть/общая планка прогресса, последнее событие и кнопка «Пуск» (отключен во время работы) Любая партия держит глобальный замок. - Действия: запуск полного трубопровода или индивидуального этапа (с подтверждением); Плюс свежий снимок. Проводка: NATS URL добавлен к configmap; добавлена зависимость от клиента. k3m1 Агент + сценарная телеметрия живут во вселенной-земляных данных; строки в переводе Словарь. TSC чист на всех новых файлах.
· kamo-shared-library
Добавить случай-нечувствительный findByEmailEmailIgnoreCase
Электронные письма хранятся с непоследовательным случаем (например, Sage@KamoCRM.com) и Равенство строк CockroachDB чувствительно к случаю, поэтому найдите промахи в электронной почте Только по делу. Требуется для поиска пароля восстановления электронной почты.
· EmailService
Учетные записи почтового ящика самоисцеления из приложения DB (возвращение дрейфа)
Приложение DB — источник истины, для которого должны существовать почтовые ящики; Учетные записи живут в виртуальных пользователях почтового сервера. Если DB потеряет данные, Почтовые ящики пропадают у провайдера, а записи приложений остаются. - MailboxSelfHealService: при запуске + ежедневно, повторное предоставление любого приложения KAMO MAIL почтовый ящик, отсутствующий у виртуальных пользователей (свежий случайный пароль, управляемый приложением). - syncMailboxes (настройки "Sync" действие) теперь также нажимает приложение->провайдер для Отсутствующий почтовый ящик, а не только импортное приложение.
· kamo-internal
Композиция/отправка от имени коммутируемого почтового ящика
- Thread mailbox owner memberId из коммутатора через ActiveMailbox в контекст (событие + парам URL). - Новое сообщение/ответ/передний открытый состав для выбранного почтового ящика участника: Из раскрывающихся списков, что почтовые ящики участника + псевдонимы, подпись персонализирована Отправляйте и записывайте их в качестве почтового ящика (mailboxId). Самосочинение без изменений, когда почтовый ящик не активен.
· kamo-internal
Переносить *** в сеансе per-tab Хранение вместо совместного файла cookie
Id сеанса жил в файле cookie браузера, совместно используемом во всех вкладках Происхождение, поэтому вторая вкладка (имперсонация) не могла проводить собственную сессию. Переместить носитель в sessionStorage (per-tab): - sessionClient: токены-помощники + глобальная обертка, которая прикрепляет id как X-***-Token на вызовах того же происхождения /api, плюс одноразовый Cookie->sessionМиграция хранилища. Устанавливается через SessionBootstrap в макете. - **************** header-first (cookie fallback) generate-otk, session/info, session/extend, logout, meet/invite-email. - сгенерироватьOTK + getKsemIdFromRequest предпочитают X-***-токен печенью. - /api/validate больше не устанавливает *** cookie; возвращает идентификатор и Страница /validate хранит его в этой вкладке SessionStorage. - использовать UserInfo + все крюки WebSocket читать идентификатор из sessionStorage. - logout захватывает токен перед очисткой хранилища, поэтому сеанс Redis до сих пор недействительным. Impersonation now just opens /validate?otk=... in a new tab как логин: сеанс Redis создан на стороне сервера, OTK передан /validate; Новая вкладка получает свою собственную сессию, а вкладка администратора не тронута. Удалить The устаревшие механизмы возврата к администрированию KeepPrev/ImpersonationBanner. Органы остаются разделенными по домену — без изменений.
· kamo-internal
Кнопка God-mode Impersonate в заголовке настроек членов
Добавляет правое верхнее действие «Impersonate» на /settings /member / [id], видимое только в том случае, если подписанная сессия имеет режим Бога (getIsGod) и цель не является само-новым. Вызывает новый /api/security/impersonate, затем меняет *** cookie через путь OTK (/validate?otk=...&keepPrev=1) в новой вкладке. KeepPrev сохраняет собственную сессию администратора в Redis; олицетворение Баннер скрывает админ *** и предлагает один клик 'Возвращение на мой аккаунт (файлы cookie одного и того же происхождения не могут одновременно проводить два сеанса). SettingsView получает дополнительный слот HeaderAction.
· SecurityService
Конечная точка имперсонации участника God-mode
POST/api/security/impersonate mints a fresh ***+OTK for a arbitrary член текущей организации абонента, закрытый на сеансе абонента, несущий Режим бога (GD). Записывает идентификатор члена администратора бога как SUDO MEMBER ID для аудит. Тот же логин в форме сессии построить как EnterAsController, но тот же орг Вместо того, чтобы креститься.
· SecurityService
Return orgName + language in /user-info
Разрешить отображаемое имя организации и выбранный язык участника (ISO-639-) 1 1 код) из DB, так что камо-вселенная может показать язык каждого игрока на своей табличке. Решены в прямом эфире (не с сессии), поэтому существующие сессии Заберите их немедленно.
· kamo-internal
Карта запуска KamoUniverse + значок навигатора (содержит ACCESS KAMOWORLD, OTK redirect to play.*)
· kamo-shared-library
Добавить ACCESS KAMOWORLD right (145, GAMES)
· KlusterServices
Реестр изображений K1m1, заменяющий отставной k0m1:5000 (одинаковые учетные данные)
· KlusterServices
Kamo-universe namespace+quota+valkey, резервные копии CockroachDB, стек наблюдения
- Вселенная/: пространство имен + ResourceQuota, вальки-вселенная (AOF, hostPath k1m1), Ночная резервная копия CockroachDB CronJob, сценарий загрузки оператора - мониторинг/: значения штурвала с прикрепленными штурвалами **************** установить скрипт, grafana.* маршрут, панель управления вселенной + правила оповещения CI: применять пространство имен Вселенной + Valkey в фазе k1m1 (Упаковка NATS упала: 43030d6 уже переоборудованный k3m1 с изоляцией аккаунта)
· KlusterServices
Добавление узла k3m1 + миграция кластера в IP-адреса LAN
- Statefulset: реклама/присоединение более 192.168.4.x (k1m1=.22, k3m1=.36); WireGuard упал (k3m1 wg0 10.8.0.1 столкнулся с рекламным IP-адресом k0m1). - конечные точки init-job + CI kubeconfig перемещаются в локальные IP-адреса. - CI: добавить раздел развертывания K3M1 CockroachDB (необходим секрет K3M1 KUBECONFIG B64).
· kamo-login
Маршрут платных регистраций для проверки после входа
После успешного аута (ручного или автологина) потребляйте apex-домен. Sp checkout plan cookie, оставленный компанией kamo-register и перенаправляемый покупателем Brand /subscribe?plan= page (Stripe checkout) вместо приложения по умолчанию пункт назначения. One-shot: печенье очищается при чтении.
· kamo-register
Провести платный план от регистрации в кассе
Когда подписка участника происходит от платного ценообразования CTA (?план = pro | бизнес), Скачать apex-domain sp checkout plan cookie по завершении. Камо-Логин потребляет после того, как пользователь аутентифицирует и направляет их на /подписаться -> Стрип, Выжившие в реестре -> проверьте -> логин-хоп.
· kamo-shared-library
Canonical e-sign signer templates (верификация + приглашение)
Добавьте два общеплатформенных канонических шаблона электронной почты, посаженных лениво на одну организацию: - esign.signer verification (повышение OTP: {{code}}, {{name}}) - esign.signer invite (приглашение подписи: {{name}}, {{sender}}, {{message}}, {{link}}) Переведите их в список ключевых ресурсов CanonicalTemplateLoader + EmailService.seedForOrg забирает их при первой отправке. Скачать OTP/invite Доставка для потока электронной подписи (было лучше всего без шаблонов).
· BillingService
Измерение использования электронной подписи + проверка самообслуживания потребителей
#4 Измерение: - EsignMeterSubmissionService (@Scheduled daily): агрегаты API-происхождения EsignUsageRecords per org+period; первые 40/period включены, остальные представлены В роли: Stripe MeterEvents. Idempotent через reportToStripe + UID с записью использования Идентификатор MeterEvent (Stripe-side dedupe). Решает название события метр от фактической цены дополнения Stripe ****************, так что Сравнение с любым измерителем, к которому привязана цена (исправляет несоответствие имен). #5 Проверка потребителей: - ConsumerCheckoutService: Stripe Checkout Session (режим = подписка) цена плана корня продукта (+измеренная линия перегрузки для бизнеса); записывает AccountSubscription (источник PAID) + SubscriptionMember + AccountLicense on Завершение и аннулирование прав. - ConsumerSessionResolver: аутентифицирует покупателя по собственному *** cookie Redis (никогда не заголовок клиентской организации). ConsumerCheckoutController POST **************************** StripeWebhookService теперь обрабатывает checkout.session. Аддитивный / инертный до тех пор, пока потребитель не подпишется; живой заряд требует реальной карты.
· kamo-internal
Экспозиция API SIGNATURE (E-Signature API)
Добавьте область API E-Signature в менеджер API-ключа, чтобы персонал мог предоставить Бизнес-организации программный доступ к электронной подписи. Использование сверх включенного ежемесячного Выделение измеряется на подпись.
· APIService
Публичный программный API шлюз (API SIGNATURE scope)
Добавить /api/public/esign/** в PublicApiController: проверяет ключ API, требует области API SIGNATURE, пределов скорости и пересылается в ESigService Внутренняя оболочка API (/api/esig/internal/**) с X-Internal-Auth + X-Org-Id. Зеркала для подписки-каталог шлюза прецедент.
· ESigService
Внутренний программный конверт API (origin=API) для бизнеса
- EsignInternalController (/api/esig/internal/*): X-Internal-Auth + X-Org-Id authed, вызванный APIService после проверки ключа API SIGNATURE; повторно использует EsignEnvelopeService, теги конвертов EsignUsageOrigin. API **************** получает перегрузку источника (МАНУАЛЬНЫЙ дефолт) - Подпись дорожки теперь измеряется происхождением конверта (API -> избыточный вес, MANUAL никогда) - OTKAuthFilter обходы /api/esig/internal (внутренне-секретный authed, а не OTK)

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