Журнал изменений
Что нового.
Каждое усовершенствование платформы, как только она появится.
· kamo-internal
Real work orders and subscriptions per market — dispatch, customer accounts, live subscriptions, cancel at period end
Service (work orders): - the grid reads its own market's jobs (plus older jobs with no market), shows the customer, the technician (member chip, never an id), the next visit, and status / priority words from the dictionary; rows keep ?back= - the work order page shows its market, files the job under an account or none (swap beside Customer), dispatches a technician (Choose Technician, arrival and finish, visit notes; a new job becomes Assigned), adds return visits, edits summary / description / trade / priority / address, labels status buttons by what they do (Start Work, Put On Hold, Mark Complete, Mark Invoiced, Cancel Work Order), shows each note's author with photo, and goes Back to its market's tab - no screen shows a job's uid: new jobs are numbered, older ones show a short ref Subscription: - the Agreements sub-tab was fifteen generated agreements whose buttons changed nothing; it now lists the market's live subscriptions (customer with photo, plan, status, seats, MRR, next billing, balance due, overdue, ending) and opens each on its order page - Signups reads the market's orders, names customers by account and member chip (was Member #<id>), offers only the market's plans in the order wizard - the subscription page shows the customer with photo and Open Account, the market, loads its subscription by id (no org-wide account or subscription scan), and cancels a live subscription with a reason, now or at the end of the billing period (Cancel only marked the order before, leaving the subscription billing); cancelling an order asks first - /commerce/agreements/new opens the order wizard for the market instead of a Coming Soon page - Back on agreement and signup pages no longer points at a tab id that never existed Removed the unreachable mortgage mock PipelineCommitmentsTab and /commerce/commitments/[id] (generated data; nothing linked to either). Help: How to Manage a Work Order and How to Manage a Subscription, linked from the grids, the visit window and the cancel window.
· SecurityService
Market-scoped work orders and subscriptions; dispatch and customer endpoints
- GET **************** lists one market's work orders (plus those with no market) - PUT /service-jobs/{uid}/customer files a job under an account or takes it off - POST /service-jobs/{uid}/visits adds a visit; PUT .../visits/{visitUid} schedules it and assigns a technician (409 on a finished visit) - GET /pos/subscription-orders and /pos/subscriptions take ?marketId= - GET **************** takes the market UUID (it was a Long, so every market-scoped request was a 400) and returns only the caller's plans - ServiceJobRightsGateTest covers the three new handlers
· kamo-shared-library
Market on the engagement, job numbers, dispatch, customer accounts, market-scoped lists
Service work orders: - createJob stores the chosen market on Engagement.market (it only picked the engagement type before) and the customer account on Engagement.account - every new job gets a person-readable number (WO-00001…), so no screen falls back to the uid - JobView carries marketId / marketTitle; customerName reads Company (Contact) - listJobs(org, status, marketId): one fetched read (engagement, market, customer, visits) instead of up to four lazy loads per row; a market tab also shows jobs that carry no market - setCustomer: file a job under an account or take it off one (engagement follows) - addVisit / updateVisit: schedule a visit, assign a technician (org-checked in SQL), mark en route / no access / cancelled; assigning someone to a CREATED job moves it to ASSIGNED Subscriptions: - createOrder stores the plan's market and the customer member's account on the engagement (a quote's engagement keeps what it has) - SubscriptionOrderDTO and SubscriptionRecordDTO carry marketId, marketTitle, customerAccountUid and customerAccountName - getOrders / getSubscriptions take a marketId (engagement market, else plan market; none stays in) and read the rows with one fetched query - getPlansForMarket: the market filter on plans took a Long and could never parse a market UUID; it is also limited to the caller's org now
· kamo-internal
Every rental has a renter; cancel, re-date, check out, check in and end; booked dates beside the date picker
- New Rental Request: the Renter (customer account) is required and pre-filled from ?accountId; ?marketId is sent so the rental is filed under the market. Once an asset is chosen, Already Booked lists its booked dates, names a clash, and Create waits for free dates. No assets: a way to the market's Rental Assets. - Rental request: Change Dates (with Charge By and booked dates), Cancel Request (cancel or decoder, with a reason kept on the request), Confirm Booking asks for a renter first; market and the booking's stage shown. - Booking: Check Out, Check In (late fee suggested from the daily rate when it is overdue, damage fee, condition notes, new total), End Rental (nothing handed over), Change Dates (end only once out), Cancel Booking, Open Request; price breakdown, checked out / returned times, overdue warning. - The renter can be changed, never removed; account saves use the record the server answers instead of reloading. - Pipeline lists ask the server for the market's rentals (by the rental's market); Market column when no market is chosen; bookings listed by stage (Reserved, Checked Out, Returned, Cancelled). - Market Rental Assets: Offered switch (switch an asset off instead of deleting it), translated copy, theme tokens, the server's sentence when an asset in use can't be deleted. The unused PipelineRentalAssetsTab (hard-coded English) is removed. - Help: Rentals and Bookings article (commerce/orders) linked from each rental page.
· kamo-internal
Market-filtered lists, line items, approve/reject/withdraw, send/receive/close/cancel, and a real Vendors list
- Procurement tab: Purchase Requests / Vendor Orders / Vendors; lists ask the server for the selected market (plus rows with none), show a Market column, and filter/count in plain words (Waiting for Approval, Rejected, Partly Received…); the "every market shows the same list" caption is gone - New / Change Purchase Request: vendor picker (active, this market's first) with New Vendor on the spot, market, lines with live total (or an estimated amount), notes, optional customer account - Record page: who asked and who decided (with photos), status banner, line table with arrived / still to come, history; Approve, Reject (reason shown to the requester), Change, Withdraw; Mark as Sent, Record Delivery (per line or everything), Close Order, Cancel Order — each confirmed - Vendors: contact person, email and phone through EmailAddress/PhoneNumber, website, notes, market; Active / Inactive with counts; deactivate instead of delete; ids stay strings - Help: "Buying from Your Vendors" help center article, linked from the form and the record page
· SecurityService
ProcurementController — market-filtered lists, change/reject/withdraw a request, send/receive/close/cancel a vendor order, records returned from every change
- purchase requests and vendor orders move out of POSController into ProcurementController (MANAGE_PROCUREMENT to buy and run orders, APPROVE_PURCHASE_REQUESTS to approve or reject) - PUT …/account and …/market answer with the updated record - ProcurementNotifier: a new request tells everyone who can approve it; a decision tells the requester - vendor create/edit/deactivate opens to MANAGE_PROCUREMENT (MANAGE_SUBSCRIPTION_SETTINGS kept)
· kamo-shared-library
Market, lines, approval decisions, and the vendor order lifecycle (send, receive, close, cancel)
ProcurementService owns purchase requests and vendor orders: - the engagement carries the market (chosen Procurement market, else the vendor's); lists filter by market plus rows with none; marketId/marketTitle on both DTOs; PUT market/account return the record - lines (description, quantity, unit cost, received) in the record payload; the total is their sum - reject (outcome REJECTED + reason) and withdraw (CANCELLED) a waiting request; requester and decider recorded; the request is SUBMITTED on create - vendor order: mark sent, receive in parts or whole, close (FULFILLED), cancel before anything arrived (VOIDED); derived stage on the DTO, never stored - EngagementLifecycle: all commitments voided -> CANCELLED, all ended -> FULFILLED - one-query lists (fetch-joined engagement/account/market, vendors and orders batched) - vendors: contact name, email, phone, website, notes, market, active flag (deactivate, never delete) - indexes on org_id / intent_id / commitment_id of the intent and commitment tables (applied by hand)
· KBService
Turn Antivirus scanning on in kbservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for the standard test string and CLEAN for plain text with this service's internal-auth secret.
· DocsService
Turn Antivirus scanning on in docsservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for the standard test string and CLEAN for plain text with this service's internal-auth secret.
· MediaService
Turn Antivirus scanning on in mediaservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for the standard test string and CLEAN for plain text with this service's internal-auth secret.
· ConversionService
Turn Antivirus scanning on in conversionservice
KamoAntivirus is Ready (StatefulSet kamowsantivirus 2/2, /readyz ready, release 2026.11.08.0101); a direct scan from the cluster returns MALICIOUS/TEST_FILE for the standard test string and CLEAN for plain text with this service's internal-auth secret.
· DocsService
Assignment rows say what the member still owes
Adds signableOutstandingCount (signable documents not yet signed) and uploadsOwedCount (required requests with no live file) to each assignment row, so the member's list can label its button by what is actually owed instead of "Continue Signing" on a Quick Request with nothing to sign. Three grouped queries per page; LegalAssignmentCountsParseTest parses them against the real mapping.
· KBService
KBService checks knowledge-base resources and looks up the verdict before signing
- Resource upload writes the raw kb bucket, so it goes through AntivirusUploadGuard (KB) before anything touches storage: 422 ANTIVIRUS_BLOCKED (nothing stored) / 503 ANTIVIRUS_UNAVAILABLE, answered in that shape by the controller. - The content hashes ride on the object as user metadata (kamo-blake3 / kamo-sha3), so every presign site (single URL, batch, library tiles, platform help) looks up the content's global verdict first: a locked or still-checking resource is never signed (423 on the single URL, no URL for a tile). Resources stored before this carry no hashes and are not judged here. - ConfigMap kamo.antivirus.* (enabled: false until KamoAntivirus is Ready); ANTIVIRUS_INTERNAL_AUTH_SECRET from mlos-internal-auth.
· DaemonService
Отметить еженедельный отчет о защите (почасовой, org-local понедельник 08:00) и наблюдение за вспышкой (15 мин)
· SecurityService
Антивирусный API, средства управления платформой и запланированные конечные точки; пропуск собственных путей к файлам SecurityService
/api/antivirus/** (и близнец /api/security/antivirus, который прокси консоли пытается сначала): обзор, обнаружения, настройки (проверенные ANTIVIRUS_POLICY_CHANGE), ложные тревоги, поиск вердикта. Платформа (MANAGE_PLATFORM_ANTIVIRUS): статус, обновление/отмена подписи, обзор ложных тревог (ALLOWLIST разблокирует везде + сообщает людям), allowlist, Внутренний: еженедельный отчет о защите и проверка вспышки для DaemonService. Необработанные загрузки (аватары в том числе SVG, фоны, логотипы, импорт ведущих, раскрытия, тарифные листы) проверяются перед что-либо записывается; пути ImageService сохраняют свои lib-ворота и теперь отвечают 422/423/503 вместо 500; vault, считывания ссуды, пациента и рамки картины применяют ворота чтения. kamo.antivirus.enabled остается false до тех пор, пока kamowsantivirus StatefulSet готов.
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus почтовый фильтр сначала на входящем smtpd (порт 25), tempfail при недоступности
smtpd_milters = { **************** default_action=tempfail }, тогда rspamd не изменяется. Вредные вложения заменяется небольшим замещающим элементом, и сообщение по-прежнему доставляется; если фильтр не может быть достигнут отправитель получает 4xx и повторяет. non_smtpd_milters и submission (587) сохранить только rspamd; postfix-bulk не затрагивается. Milter проверен в режиме реального времени до этого push (клиент milter-protocol в кластере: test файл заменен на заполнитель, чистый CSV сохранен, поддельный маркер удален).
· EmailService
Антивирус для почты — шлюз чтения на каждом почтовом ящике, мягкие замены, фильтрация отправки, обнаружения
- Чтение: каждое вложение/встроенная часть из любой папки (Kamo Mail, IMAP-провайдеры, Graph; персональные и общие маршруты) хешированы в памяти (временный файл более 8 Мб, удаленный при закрытии), его глобальный вердикт выглядел и, если неизвестно, проверяется KamoAntivirus (origin MAIL_READ, bytes_stored=false). Вредный = 423 ANTIVIRUS_BLOCKED, не проверяется = 423 ANTIVIRUS_CHECKING; причина/семейство также как X-Kamo-Antivirus-* заголовки. Почтовые инструменты SI читают через эти маршруты, так что они тоже заблокированы. AttachmentInfo переносит **************** только для уже хешированных частей. - Заполнители Milter (X-Kamo-Antivirus-Removed) список под ORIGINAL имя, removed=true, заблокирован; никогда X-Kamo-Заголовок антивирусного сообщения для баннера представлен как EmailMessage.antivirus. - Отправить/черновик (решение 11): загружаемые устройства и вставляемые изображения проходят через AntivirusGate.scanUpload (хранится 422 ANTIVIRUS_BLOCKED with Имя файла, 503 Антивирус недоступен. - NATS antivirus.detection.mail (очередная группа antivirus-mail-detections): получатели разрешены к членам через владельцев почтовых ящиков, личных псевдонимов, общих устройств чтения почтовых ящиков и доменов псевдонимов; регистрируются по членам (MAIL_INBOUND, контрагент = отправитель), так что FILE_BLOCKED / THREAT_ALERT выходят по настройкам организации. - Уведомления: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (основное приложение, не требуется строка функций); FILE_BLOCKED/UNLOCKED не принадлежат к приложению; каталог заказа. Образцы предварительного просмотра для 4 антивирусных шаблонов. - configmap kamo.antivirus.* (включен: kamowsantivirus готов). Необходимо kamo-shared-library b6c41d34 (HashUtils BLAKE3 на bcprov 1.70).
· SecurityService
Шаги аренды, списки, отфильтрованные по рынку, и арендатор, который может перемещаться, но никогда не будет очищен
- GET /rental-requests и /bookings принимают ?marketId (рынок вызывающего) и фильтр по рынку участия. - POST /rental-requests/{id}/cancel, PUT /rental-requests/{id}/dates, POST /bookings/{id}/check-out | возврат | отмена, PUT /bookings/{id}/dates (MANAGE_RENTALS), каждый из которых отвечает на обновленную запись; отказ - это 400 с предложение. - GET /rental-assets/{id}/bookings: даты, на которые актив уже зарезервирован. - PUT /rental-requests/{id}/account и /bookings/{id}/account отказываются от пустой учетной записи и ответить на обновленную запись вместо простого сообщения. - DELETE /rental-assets/{id} отвечает 409 с предложением, когда актив имеет аренду.
· kamo-internal
Фильтры вкладки Заказы по собственным рынкам организации
Чипы и строки этикеток были по направлению деятельности, названные в честь его первого рынка, так что два розничных рынка сливаются в один. Каждая строка теперь показывает свой собственный рынок (с сервера); более старая запись без рынка к единственному рынку своей линии, когда есть один, иначе к Группа "<Line> — No Market". Запоминаемый фильтр, рынок которого исчез возвращается к Все.
· DocsService
DocsService отклоняет заблокированные документы везде и проверяет сохранения редактора
- WOPI PutFile записывает raw MinIO, так что сохранение проходит через AntivirusUploadGuard сначала: a harmful save ничего не записывает, сохраняет последнее исправное содержимое документа и отвечает редактору 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE, чтобы повторить попытку); отмечено чистое сохранение GetFile отказывается от блокировки/проверки содержимого с 423. - Образование /download, /stream, преобразованный PDF и миниатюры страницы вызывают ворота чтения до любой байт: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING. ВНИМАНИЕ содержимое проходит, поэтому его PDF пакетный экспорт сбрасывает заблокированные документы, как и другие исключения. - Загрузка версии / pdf / миниатюра судить собственное содержание версии. - Карьеры резюме проверяются как КАРЬЕРЫ с заявителем и заявлением; карьеры контроллеры отвечают на отказы Антивируса в форме платформы вместо 500. - Юридические: загрузить карту отказов на свои 422/503, задержанный загрузки просит повторить попытку (его PDF выполненных пакетов и образцов запросов, а также обнаруженных ошибок, которые Биндер фотоальбомы оставляют заблокированные фотографии вне. - строки списка документов/метаданных содержат scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (включено: false до тех пор, пока KamoAntivirus не будет готов); ANTIVIRUS_INTERNAL_AUTH_SECRET от mlos-internal-auth.
· SecurityService
Каждая строка Заказы имеет собственное название рынка
Стороны несут marketId / marketTitle от их участия (один запрос по uid), так что организация с двумя розничными рынками видит, какие один заказ пришел от вместо обоих под именем первого рынка. Записи, сделанные до отслеживания рынков, остаются недействительными.
· KlusterServices
Антивирусные оповещения (сканер не работает, устаревшие сигнатуры, отсутствие зеркала, p95, пик обнаружения, задержка)
Применяется вручную (мониторинг/ не является целью КИ).
· kamo-shared-library
Аренда нуждается в арендаторе; рынок по обязательству; отмена, перенос даты, выезд, возврат и отмена бронирования
- createRentalRequest отклоняет отсутствующий или иностранный счет клиента, регистрирует рынок (актива, иначе выбранный) на задействовании, и проверяет даты и тип тарифа. Подтвердить отклоняет запрос без учетной записи. - setRentalRequestAccount / setBookingAccount переместить арендатора на другую учетную запись и никогда не очищать; оба отвечают на обновленную запись. - Запросы: отмена/декодирование (IntentStatus.CANCELLED, причина сохранена) и новые даты (с Бронирование: выезд из отеля (заказ выполняется в течение 24 часов) IN_PROGRESS), возврат или завершение (COMPLETED; CommitmentStatus.FULFILLED; задержка и повреждение) сборы добавлены к общей сумме; состояние заметки), отменить (аннулировано, прежде чем он выходит), и новые даты (только конец, пока не), каждая проверка других резерваций актива под блокировка строки на активе, чтобы два подтверждения не могли дублировать. - EngagementLifecycle: обязательство VOIDED не связывает ничего; все аннулировано и нет заказа ОТМЕНЕНО. - Возвращенная резервация больше не содержит свои даты. Даты, удерживаемые активом, читаемы (findRentalAssetBookings) для выборщиков дат. - DTOs: marketId/marketTitle по запросам, резервациям и активам; резервация -> rentalRequestUid, rateType, checkedOutAt, returnedAt, сборы, примечания, причина отмены; request -> cancelReason, bookingStatus. Списки фильтруют по рынку и загружают активы, резервации и передачи в одном запросе каждый, а не по строке. - Арендные активы: столбец описания; рынок подтвержден как рынок аренды организации и отрицательные ставки отклоняются; дублирующиеся коды отклоняются при обновлении; актив с арендой в записи не может быть удален (вместо этого выключите его). - Индексы: **************** по контрактам, обязательства по аренде активы, исполнения по обязательствам, арендные активы по организациям и рынкам (применяется вручную).
· kamo-internal
Рынки — собственные рынки организации, по своим собственным названиям
"Торговля" исчезла. Рынок - это то, что члены определяют (название + описание); его направление деятельности - это только его вид. - Опция навигации Рынки. С одним рынком это тот рынок, по его заголовок (как и раньше); при двух или более открывается меню со строкой для каждого рынок — его название, описание под ним, значок для его строки бизнеса — каждое открытие вкладки этого рынка. Один кэшированный список оба навигатора, стартовая площадка и ярлык, обновленные на изменениях рынка. - Навигационные строки меню имеют необязательное описание (popover, reil, top bar). - В поле типа формы рынка указывается "Линия бизнеса"; каждый выбор говорит что он дает рынку, и заблокированный один называет приложение, которое ему нужно (был жестко закодирован на английском языке) члены смотрите в меню Рынки. - ACCESS_COMMERCE читает "Доступ к рынкам"; страница кредитования указывает на Настройки → Направления деятельности.
· MediaService
MediaService проверяет вложения с помощью антивируса и отклоняет заблокированные файлы при каждом чтении
- Вложения чата (участник CHAT, посетитель веб-чата PUBLIC), файлы системных ошибок, изображения Growth Hub проверяются внутри storeContentAddressed с их контекстом (член, разговор); Canva отказ достигает клиента, как только форма платформы (422 ANTIVIRUS_BLOCKED {family} / 503 ANTIVIRUS_UNAVAILABLE) вместо того, чтобы быть упакованным в 500. - Фоны встреч (raw MinIO, public bucket) проходят через AntivirusUploadGuard в первую очередь. - /attachments/link (dedup by hash) отклоняет содержимое Антивирус заблокирован (422); задержанный файл может быть связан и остается нечитаемым до тех пор, пока не будет проверен. - Вложения несут сканирование {статус, семья, результат} на ответ на загрузку, живое сообщение рамка и история; ОЖИДАЮЩАЯ, пока удерживается. - ImagingProxyController (оригинал и предварительный просмотр), загрузка посетителей, файлы системных ошибок, Изображения, материалы и материалы Canva, прочитанные в Growth Hub, вызывают ворота чтения: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, проверяется перед недостающим-содержимым 410, так что задержан Прокси теперь проверяет членство перед состоянием содержимого. - ConfigMap kamo.antivirus.* (включено: false до тех пор, пока KamoAntivirus не будет готов); ANTIVIRUS_INTERNAL_AUTH_SECRET от mlos-internal-auth.
· ConversionService
ConversionService проверяет загружаемые файлы с помощью антивируса, завершает удерживаемые файлы, повторно проверяет новые сигнатуры
Заменяет действующий клиент clamd (malware/ package, UploadScanGuard, QuarantineStore, ретро-сканирование) с общей библиотекой Антивирус: - /upload, /replace, /templates/upload проверяются внутри ImageService перед любой строкой или объект записывается (HOLD разрешено); отказы используют формы платформы: 422 ANTIVIRUS_BLOCKED {family}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH. Malware_Detected исчезло и нет имя подписи всегда возвращается. Ответы содержат скан {статус, семейство, результат}; файл находится в состоянии ОЖИДАНИЯ и преобразуется после сохранения. Конвейер выводит этап 'сканирования'. - /register-existing (dedup по ссылке) отклоняет содержимое блокировки антивируса (422). - Звуковые эффекты (raw MinIO) проходят через AntivirusUploadGuard (без задержки, 503 при выключении). - QuarantineStore больше не существует, поэтому в карантинный контейнер ничего не записывается; ничего в нем прикоснуться. - antivirus.hold.verdict (очередь antivirus-hold-completer) -> AntivirusHoldCompleter, затем обычное преобразование для выпущенных документов; отказ хранения naks для повторной доставки. - antivirus.signatures.promoted (очередная проверка антивируса) -> AntivirusRecheckService: каждые отмеченный флагом хэш, байт которого хранится (отчеты unlock + notify + AUTO_CLEARED) и CLEAN содержимое впервые просмотрено за последние 14 дней (LOCKED_LATER + оповещения), поток из MinIO, Подписчики повторяют попытку до тех пор, пока не появится поток ANTIVIRUS. - Карта конфигурации: kamo.antivirus.* (включено: false до тех пор, пока KamoAntivirus не будет готов); ANTIVIRUS_INTERNAL_AUTH_SECRET от mlos-internal-auth.
· kamo-shared-library
Участие относится к определенному участником рынку
commerce_engagements.market_id (применяется вручную, FK для commerce_markets, Организационные заказы, заказы на услуги, аренда и закупки у них нет своей собственной рыночной колонки; они читают ее из взаимодействия, так же, как они читают их учетную запись клиента.
· kamo-internal
Интерфейс антивируса — защита печати везде, где появляется файл, антивирусный центр, вкладка платформы, оповещения и помощь
Набор дизайна (приложение/компоненты/антивирус): ProtectionSeal с пятью анимированными лицами (Проверка, Защищен, Предупреждение, Заблокирован, Не удалось проверить; бренд + --av-* токены, уменьшенное движение уважено), BlockedFileCard / LockedAttachment / LockedOverlay, ПредупреждениеБанер с Открыть безопасную копию, MessageAntivirusBanner, ShieldClip, FalseAlarmDialog ("Я думаю, что это ошибка"), AntivirusNotReady. Логика из @kamo/antivirus-core 0.1.0 (состояние печати, причина принятия анализатором) Антивирус блокирован / Malware_Detected / Антивирусная проверка / Антивирусная недоступна / Сканирование недоступно). Поверхности: почтовое окно чтения (пломбы, удаленные части заблокированы под их первоначальными названиями, сообщение баннер, встроенные изображения удерживаются, Скачать все пропускает их, список-строка щит клипа, кэш тела v2), составитель/чат/SMS/SI лотки (проверка + заблокированные состояния), чат пузыри для получателей, документы (Проверка этапа, печати, заблокированные действия, предупреждение ворот), и отказ тост на каждой загрузке (KB, аватар, карьеры, системные ошибки, звуки, документы аккаунта/пациента/приложения, логотипы). Антивирусный центр по адресу **************** (VIEW_ANTIVIRUS; требования политики MANAGE_ANTIVIRUS_POLICY): сфера защиты, подсчет показателей, графики тренда/происхождения/семейства, живой хронология угроз, переключения политик с помощью помощи, ложные тревоги (MANAGE_PLATFORM_ANTIVIRUS): состояние сканера, выпуски с обновлением/отмена, очередь проверки, три вида уведомлений, антивирусная экскурсия, /api/antivirus BFF, зеркала для ServiceType ANTIVIRUS(41), права 698-700 и MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275) и семь статей справочного центра. Компонент Protection home widget построен, но не зарегистрирован: стартовая панель нуждается ANTIVIRUS_WIDGET правый блок, которого у общей библиотеки еще нет.
· KlusterServices
Svc_antivirus вход + поток ANTIVIRUS; конверсия/электронная почта может потреблять антивирус.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, опубликовать antivirus.> и rt.org.>, подписаться на antivirus.> и _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS.md). - svc_conversion: потребительский API ANTIVIRUS (держать вердикты, перепроверка на продвижение), publish/subscribe antivirus.>, publish rt.org.> (записанные вердикты обновляют пользовательский интерфейс). - svc_email: потребительский API ANTIVIRUS (обнаружение почтовых фильтров), антивирус.>. - stream-bootstrap Предоставление заданий ANTIVIRUS (R1, 14d), чтобы потребители могли связываться первыми. Проверено с помощью nats-server -t против реального сервера.

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