Bản ghi thay đổi
Có gì mới không?
Mọi cải tiến cho nền tảng, khi nó được đưa ra.
· 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
Đánh dấu báo cáo bảo vệ hàng tuần (mỗi giờ, tổ chức địa phương thứ hai 08:00) và theo dõi sự bùng phát (15 phút)
· SecurityService
The Antivirus API, platform controls and scheduled endpoints; gate SecurityService's own file paths
/api/antivirus/** (and the /api/security/antivirus twin the console proxy tries first): overview, detections, settings (audited ANTIVIRUS_POLICY_CHANGE), false alarms, verdict lookup. Platform (MANAGE_PLATFORM_ANTIVIRUS): status, signature refresh/rollback, false-alarm review (ALLOWLIST unlocks everywhere + tells people), allowlist, drill, outbreaks. Internal: weekly Protection Report and outbreak check for DaemonService. Raw uploads (avatars incl. SVG, backgrounds, logos, lead imports, disclosures, rate sheets) are screened before anything is written; ImageService paths keep their lib gate and now answer 422/423/503 instead of a 500; vault, loan, patient and picture-frame reads apply the read gate. kamo.antivirus.enabled stays false until the kamowsantivirus StatefulSet is Ready.
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus mail filter first on inbound smtpd (port 25), tempfail when unreachable
smtpd_milters = { **************** default_action=tempfail }, then rspamd unchanged. Harmful attachments are replaced by a small placeholder part and the message is still delivered; if the filter cannot be reached the sender gets a 4xx and retries. non_smtpd_milters and submission (587) keep rspamd only; postfix-bulk untouched. Milter verified live before this push (milter-protocol client in cluster: test file replaced with the placeholder, clean CSV kept, forged marker stripped).
· EmailService
Antivirus for mail — read gate on every mailbox, milter placeholders, send screening, detections
- Read: every attachment/inline part from any mailbox (Kamo Mail, IMAP providers, Graph; personal and shared routes) is hashed in memory (temp file past 8 MiB, deleted on close), its global verdict looked up and, when unknown, checked by KamoAntivirus (origin MAIL_READ, bytes_stored=false). Harmful = 423 ANTIVIRUS_BLOCKED, not checkable = 423 ANTIVIRUS_CHECKING; reason/family also as X-Kamo-Antivirus-* headers. The SI mail tools read through these routes, so they are gated too. Listing never scans: AttachmentInfo carries **************** only for parts already hashed. - Milter placeholders (X-Kamo-Antivirus-Removed) list under the ORIGINAL name, removed=true, locked; never served or forwarded. X-Kamo-Antivirus message header exposed as EmailMessage.antivirus for the banner. - Send/draft (decision 11): device uploads and pasted images go through AntivirusGate.scanUpload (stored verdicts reused, never rescanned); a forward's parts get the read check. 422 ANTIVIRUS_BLOCKED with fileName, 503 ANTIVIRUS_UNAVAILABLE. - NATS antivirus.detection.mail (queue group antivirus-mail-detections): recipients resolved to members via mailbox holders, personal aliases, shared mailbox readers and alias domains; recorded per member (MAIL_INBOUND, counterparty = sender) so FILE_BLOCKED / THREAT_ALERT go out per org settings. - Notifications: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (core app, no feature row needed); FILE_BLOCKED/UNLOCKED belong to no app; catalog order. Preview samples for the 4 Antivirus templates. - configmap kamo.antivirus.* (enabled: kamowsantivirus is Ready). Needs kamo-shared-library b6c41d34 (HashUtils BLAKE3 on bcprov 1.70).
· SecurityService
Rental steps, market-filtered lists, and a renter that can move but never be cleared
- GET /rental-requests and /bookings take ?marketId (the caller's own market) and filter by the engagement's market. - POST /rental-requests/{id}/cancel, PUT /rental-requests/{id}/dates, POST /bookings/{id}/check-out | return | cancel, PUT /bookings/{id}/dates (MANAGE_RENTALS), each answering the updated record; a refusal is a 400 with a sentence. - GET /rental-assets/{id}/bookings: the dates an asset is already booked for. - PUT /rental-requests/{id}/account and /bookings/{id}/account refuse a blank account and answer the updated record instead of a bare message. - DELETE /rental-assets/{id} answers 409 with a sentence when the asset has rentals.
· kamo-internal
Orders tab filters by the organization's own markets
Chips and row labels were per line of business, named after its first market, so two Retail markets collapsed into one. Each row now shows its own market (from the server); an older record with no market goes to the only market of its line when there is one, else to a "<Line> — No Market" group. A remembered filter whose market is gone falls back to All.
· DocsService
Dịch vụ tài liệu từ chối tài liệu bị khóa ở mọi nơi và kiểm tra việc lưu của trình biên tập
- WOPI PutFile viết raw MinIO, vì vậy việc lưu sẽ đi qua AntivirusUploadGuard trước: a lưu có hại không ghi gì, giữ nội dung tốt cuối cùng của tài liệu và trả lời biên tập viên 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE so it retry); một bản lưu sạch được đánh dấu lưu trữ để kiểm tra lại sau này. GetFile từ chối khóa/kiểm tra nội dung với 423. - Chụp ảnh /download, /stream, chuyển đổi PDF và hình ảnh nhỏ của trang gọi cổng đọc trước bất kỳ byte nào: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING xuất hiện là 'bản sao an toàn'. Xuất khẩu tập thể bỏ tài liệu khóa như những ngoại lệ khác. - Phiên bản tải xuống/pdf/thumbnail đánh giá nội dung của phiên bản. - CV nghề nghiệp được kiểm tra như nghề nghiệp với người nộp đơn và ứng dụng; nghề nghiệp Người điều khiển trả lời từ chối Antivirus bằng hình dạng nền thay vì 500. - Luật pháp: tải bản đồ từ chối đến 422/503 của riêng họ, tải lên bị chặn yêu cầu thử lại (PDF của nó trình bày sẽ được thực hiện từ byte không kiểm tra), gói đã thực hiện và mẫu yêu cầu Bộ sưu tập ảnh của Binder bỏ qua những bức ảnh bị khóa. - Danh sách tài liệu/siêu dữ liệu có scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (bật: sai cho đến khi KamoAntivirus sẵn sàng); ANTIVIRUS_INTERNAL_AUTH_SECRET từ mlos-internal-auth.
· SecurityService
Mỗi hàng Orders có tên thị trường riêng
Các hàng mang marketId / marketTitle từ sự tham gia của chúng (một truy vấn bởi uid tham gia), vì vậy một tổ chức với hai thị trường bán lẻ thấy Một đơn đặt hàng đến từ một nơi thay vì cả hai dưới tên của thị trường đầu tiên. Các ghi chép được thực hiện trước khi các thị trường được theo dõi giữ rỗng.
· KlusterServices
Cảnh báo chống virus (bộ quét tắt, chữ ký lỗi thời, cổng gương thất bại, p95, phát hiện tăng, giữ dư)
Ứng dụng bằng tay (monitoring/ không phải là mục tiêu CI).
· kamo-shared-library
A rental needs a renter; market on the engagement; cancel, re-date, check out, return and cancel a booking
- createRentalRequest refuses a missing or foreign customer account, records the market (the asset's, else the chosen one) on the engagement, and validates dates and the rate type. Confirm refuses a request with no account. - setRentalRequestAccount / setBookingAccount move the renter to another account and never clear it; both answer the updated record. - Requests: cancel/decoder (IntentStatus.CANCELLED, reason kept) and new dates (with the availability check). Bookings: check out (the booking's FulfillmentOrder IN_PROGRESS), return or end (COMPLETED; CommitmentStatus.FULFILLED; late and damage fees added to the total; condition notes), cancel (VOIDED, before it goes out), and new dates (only the end while out), each checking the asset's other bookings under a row lock on the asset so two confirms cannot double-book. - EngagementLifecycle: a VOIDED commitment commits nothing; all voided and no order is CANCELLED. - A returned booking no longer holds its dates. The asset's held dates are readable (findRentalAssetBookings) for date pickers. - DTOs: marketId/marketTitle on requests, bookings and assets; booking -> rentalRequestUid, rateType, checkedOutAt, returnedAt, fees, notes, cancel reason; request -> cancelReason, bookingStatus. Lists filter by market and load assets, bookings and hand-overs in one query each instead of per row. - Rental assets: description column; market validated as the org's Rental market and movable on update; negative rates refused; duplicate codes refused on update; an asset with rentals on record cannot be deleted (switch it off instead). - Indexes: **************** by engagement, commitments by rental asset, fulfillments by commitment, rental assets by org and market (applied by hand).
· kamo-internal
Thị trường — thị trường của chính tổ chức, theo tên của họ
"Thương mại" đã biến mất description); Line of Business của nó chỉ là loại của nó. - Tùy chọn "Navigation" là "Markets" title (như trước); với hai hoặc nhiều nó mở một thực đơn với một hàng mỗi market — tiêu đề, mô tả bên dưới, biểu tượng cho dòng mỗi lần mở thẻ thị trường đó. Một danh sách lưu trữ Cả 2 bảng điều khiển, bệ phóng và nhãn mác, được cập nhật khi thị trường thay đổi. - Các hàng trình đơn Navigation có mô tả tùy chọn (popover, rail, top bar). - Hộp kiểu mẫu thị trường là "Liên doanh"; mỗi lựa chọn nói cái nó mang lại cho thị trường, và một cái khóa tên của ứng dụng nó cần Tên và mô tả giúp giải thích những gì Các thành viên xem trong menu Thị trường. - ACCESS_COMMERCE đọc "Thị trường truy cập"; trang cho vay chỉ vào Settings → Lines of Business (bằng tiếng Anh).
· MediaService
Dịch vụ Truyền thông kiểm tra các tập tin gắn liền với Antivirus và từ chối các tập tin bị khóa khi đọc
- Bộ đính kèm chat (người dùng CHAT, người truy cập web-chat PUBLIC), tập tin lỗi hệ thống, hình ảnh Growth Hub are checked inside storeContentAddressed with their context (member, conversation); Canva Một sự từ chối sẽ đến với người dùng khi hình dạng nền tảng (422 ANTIVIRUS_BLOCKED {family} / 503 ANTIVIRUS_UNAVAILABLE) thay vì được gói trong một 500. - Nền của cuộc họp (raw MinIO, public bucket) đi qua AntivirusUploadGuard trước. - /attachments/link (dedup by hash) refuses content Antivirus locked (422); a held file may be liên kết và không thể đọc cho đến khi kiểm tra. - Các tệp đính kèm có thể quét {tình trạng, gia đình, kết quả} trên câu trả lời tải lên, thông điệp trực tiếp frame and history; PENDING while held. - ImagingProxyController (gốc và xem trước), tải về của khách, tập tin lỗi hệ thống, Growth Hub images, materials and Canva material reads gọi cổng đọc: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, kiểm tra trước khi thiếu nội dung 410 vì vậy được giữ lại tập tin nói 'vẫn đang kiểm tra'. Ứng dụng ủy nhiệm giờ kiểm tra thành viên trước trạng thái nội dung. - ConfigMap kamo.antivirus.* (bật: sai cho đến khi KamoAntivirus sẵn sàng); ANTIVIRUS_INTERNAL_AUTH_SECRET từ mlos-internal-auth.
· ConversionService
ConversionService kiểm tra việc tải lên với Antivirus, hoàn thành các tập tin đang giữ, kiểm tra lại các chữ ký mới
Thay thế chương trình khách clamd đang hoạt động (malware/ package, UploadScanGuard, QuarantineStore, retro- scan) với thư viện chia sẻ Antivirus: - / tải lên, / thay thế, / templates/ tải lên được kiểm tra bên trong ImageService trước bất kỳ hàng nào hoặc đối tượng được viết (HOLD được cho phép); từ chối sử dụng các hình dạng nền tảng: 422 ANTIVIRUS_ BLOCKED {family}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH Tên chữ ký không bao giờ được trả lại. Phản hồi mang scan {status, family, outcome}; a held tập tin đang CÓ ĐƯỜNG và chuyển đổi khi đã được lưu trữ. Đường ống phát ra một giai đoạn 'scanning'. - /register-existing (dedup by reference) từ chối nội dung Antivirus bị khóa (422). - Hiệu ứng âm thanh (raw MinIO) đi qua AntivirusUploadGuard (không giữ, 503 khi tắt). - QuarantineStore không còn tồn tại nữa, vì vậy không có gì được viết vào thùng cách ly; không có gì trong đó là chạm vào. - antivirus.hold.verdict (số hàng đợi antivirus-hold-completer) -> AntivirusHoldCompleter, sau đó chuyển đổi thông thường cho các tài liệu được giải phóng; một thất bại lưu trữ naks cho việc giao lại. - antivirus.signatures.promoted (queue antivirus-recheck) -> AntivirusRecheckService: every hàm băm được đánh dấu với các byte được lưu trữ (mở khóa + thông báo + báo cáo AUTO_ CLEAN) và CLEAN nội dung được xem lần đầu trong 14 ngày qua (LOCKED_LATER + cảnh báo), được truyền từ MinIO, Người đăng ký thử lại cho đến khi dòng ANTIVIRUS tồn tại. - ConfigMap: kamo.antivirus.* (bật: sai cho đến khi KamoAntivirus sẵn sàng); ANTIVIRUS_INTERNAL_AUTH_SECRET từ mlos-internal-auth.
· kamo-shared-library
Một sự tham gia thuộc về một thị trường được xác định bởi thành viên
commerce_engagements.market_id (được áp dụng bằng tay, FK cho commerce_markets, orders, service jobs, rental and procurement các ghi chép không có cột thị trường của riêng mình; họ đọc nó từ của họ cùng cách họ đọc tài khoản khách hàng của họ.
· kamo-internal
Giao diện người dùng Antivirus — bảo vệ các khẩu hiệu ở mọi nơi một tập tin xuất hiện, Trung tâm Antivirus, thẻ nền tảng, cảnh báo và giúp đỡ
Design kit (app/components/antivirus): ProtectionSeal with five animated faces (Checking, Protected, Caution, Blocked, Couldn't Check; brand + --av-* tokens, reduced motion honored), BlockedFileCard / LockedAttachment / LockedOverlay, CautionBanner with Open a Safe Copy, MessageAntivirusBanner, ShieldClip, FalseAlarmDialog ("Tôi nghĩ đây là một lỗi"), Logic from @kamo/antivirus-core 0.1.0 (seal state, reason parser accepting Antivirus_Blocked / Malware_Detected / Antivirus_Checking / Antivirus_Unavailable / SCAN_Unavailable). Bề mặt: hộp đọc thư (đóng dấu, các phần được gỡ bỏ được khóa dưới tên ban đầu, thông điệp) Tải xuống tất cả bỏ qua chúng, đoạn phim bảo vệ hàng danh sách, bộ nhớ đệm cơ thể v2), thùng biên soạn/ trò chuyện/ SMS/ SI (Kiểm tra + trạng thái bị chặn), bong bóng trò chuyện cho người nhận, tài liệu (Kiểm tra giai đoạn, dấu ấn, khóa hành động, cổng cẩn thận), và uống rượu từ chối trên mỗi tải lên (KB, avatar, careers, system bugs, sounds, account/patient/application documents, logos). Antivirus Center at **************** (VIEW_ANTIVIRUS; policy needs MANAGE_ANTIVIRUS_POLICY): protection orb, count-up KPIs, trend/origin/family charts, live Thời gian đe dọa, thay đổi chính sách với sự giúp đỡ, báo động sai (MANAGE_PLATFORM_ANTIVIRUS): sức khỏe quét, phát hành với cập nhật/trả lại, hàng đợi xem xét, 3 loại thông báo, tour hướng dẫn chống virus, /api/antivirus BFF, mirrors for ServiceType ANTIVIRUS(41), rights 698-700 and MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275), và bảy bài viết trung tâm hỗ trợ. Thành phần trang chủ Protection đã được xây dựng nhưng chưa được đăng ký: launchpad cần một ANTIVIRUS_WIDGET khối phải mà thư viện chia sẻ chưa có.
· KlusterServices
Svc_antivirus login + ANTIVIRUS stream; conversion/email may consume antivirus.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, công bố antivirus.> và rt.org.>, subscribe antivirus.> và _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS.md). - svc_conversion: ANTIVIRUS consumer API (giữ phán quyết, kiểm tra lại khi nâng cấp), publish/subscribe antivirus.>, publish rt.org.> (các phán quyết ghi lại sẽ làm mới giao diện người dùng). - svc_email: ANTIVIRUS consumer API (mail-filter detections), antivirus.> - stream-bootstrap Job provisions ANTIVIRUS (R1, 14d) để người dùng có thể kết nối trước. Xác nhận với nats-server -t so với máy chủ thực.

Vũ trụ của anh đang chờ đợi.
Bắt đầu miễn phí trong vài phút. Thêm sản phẩm bất cứ khi nào bạn sẵn sàng — không di chuyển, không đăng nhập mới.
Miễn phí mãi mãi — không cần thẻ tín dụng