Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· 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
Cochez le rapport hebdomadaire de protection (toutes les heures, lundi 08h00) et la surveillance de l'éclosion (15 min)
· SecurityService
L'API Antivirus, les contrôles de plateforme et les points de terminaison planifiés; les chemins de fichiers propres de gate SecurityService
/api/antivirus/** (et le jumeau /api/security/antivirus que le proxy de la console essaie en premier): aperçu, détections, Configuration des paramètres (ANTIVIRUS_POLICY_CHANGE audité), fausses alarmes, recherche de verdict. Plateforme (MANAGE_PLATFORM_ANTIVIRUS): status, signature refresh/rollback, fausse-alarme review (ALLOWLIST déverrouille partout + dit aux gens), allowlist, Interne: Rapport de protection hebdomadaire et vérification des épidémies pour DaemonService. Les téléchargements bruts (avatars incluant SVG, arrière-plans, logos, importations de leads, divulgations, feuilles de tarifs) sont filtrés avant Les chemins ImageService gardent leur porte lib et répondent maintenant 422/423/503 au lieu d'un 500; vault, kamo.antivirus.enabled reste faux jusqu'à ce que la commande soit exécutée. kamo.antivirus.enabled kamowsantivirus StatefulSet est prêt.
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus Filtrer le courrier d'abord sur smtpd entrant (port 25), échec temporaire lorsque inaccessible
smtpd_milters = { **************** default_action=tempfail }, puis rspamd inchangé. Les pièces jointes malveillantes sont remplacé par une petite partie d'espace réservé et le message est toujours livré; Si le filtre n'est pas atteint, l'expéditeur reçoit un 4xx et réessaie. non_smtpd_milters et submission (587) conserver rspamd uniquement; postfix-bulk intact. Milter vérifié en direct avant ce push (client milter-protocol dans le cluster: test (fichier remplacé par l'espace réservé, CSV propre conservé, marqueur forgé dépouillé).
· EmailService
Antivirus pour le courrier — porte de lecture sur chaque boîte aux lettres, espaces réservés plus doux, filtrage d'envoi, détections
- Lire: chaque pièce jointe/partie en ligne de n'importe quelle boîte aux lettres (Kamo Mail, fournisseurs IMAP, Graph; personnel et Les routes partagées) sont hachées en mémoire (fichier temporaire de plus de 8 Mo, supprimé à la fermeture), son verdict global Le fichier est ouvert et, s'il est inconnu, vérifié par KamoAntivirus (origin MAIL_READ, bytes_stored=false) ANTIVIRUS_BLOCKED, non vérifiable = 423 ANTIVIRUS_CHECKING; raison/famille aussi comme X-Kamo-Antivirus-* Les outils de messagerie du SI lisent ces routes, donc elles sont également protégées. La liste ne scanne jamais: AttachmentInfo contient **************** uniquement pour les parties déjà hachées. - Liste des espaces réservés Milter (X-Kamo-Antivirus-Removed) sous le nom ORIGINAL, removed=true, verrouillé; jamais X-Kamo-L'en-tête du message Antivirus est exposé comme EmailMessage.antivirus pour la bannière. - Envoyer/brouillon (décision 11): les téléchargements d'appareils et les images collées passent par AntivirusGate.scanUpload (stocké 422 ANTIVIRUS_BLOCKED avec verdicts réutilisés, jamais rescannés); les parties d'un forward reçoivent la vérification de lecture Nom du fichier, 503 ANTIVIRUS_UNAVAILABLE. - NATS antivirus.detection.mail (groupe de file d'attente antivirus-mail-detections): destinataires résolus aux membres via Titulaires de boîtes aux lettres, alias personnels, lecteurs de boîtes aux lettres partagées et domaines d'alias; enregistrés par membre (MAIL_INBOUND, contrepartie = expéditeur) de sorte que FILE_BLOCKED / THREAT_ALERT sortent par les paramètres de l'organisation. - Notifications: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (application de base, aucune ligne de fonctionnalité nécessaire); FILE_BLOCKED/UNLOCKED n'appartiennent à aucune application; ordre de catalogue. Prévisualiser des exemples pour les 4 modèles Antivirus. - configmap kamo.antivirus.* (activé: kamowsantivirus est prêt). Nécessite kamo-shared-library b6c41d34 (HashUtils BLAKE3 sur bcprov 1.70).
· SecurityService
Des étapes de location, des listes filtrées par marché et un locataire qui peut déménager mais ne jamais être dégagé
- GET /rental-requests et /bookings prennent ?marketId (le propre marché de l'appelant) et Filtrer par le marché de l'engagement. - POST /requêtes-location/{id}/annuler, PUT /requêtes-location/{id}/dates, POST /réservations/{id}/départ | retour | annuler, PUT /réservations/{id}/dates (MANAGE_RENTALS), chacun répondant à l'enregistrement mis à jour; un refus est un 400 avec un sentence. - GET /rental-assets/{id}/bookings: les dates pour lesquelles un actif est déjà réservé. - PUT /rental-requests/{id}/account et /bookings/{id}/account refusent un compte vide et répondre à l'enregistrement mis à jour au lieu d'un message nu. - DELETE /rental-assets/{id} répond à 409 avec une phrase lorsque l'actif a des locations.
· kamo-internal
Filtres de l'onglet Commandes par les propres marchés de l'organisation
Les puces et les étiquettes de rangée étaient par ligne d'affaires, nommées d'après sa première Deux marchés de détail se sont donc effondrés en un seul. Chaque ligne montre maintenant son propre marché (à partir du serveur); un enregistrement plus ancien sans marché va Au seul marché de sa ligne quand il y en a un, autrement à un Groupe "<Ligne> — Pas de marché". Un filtre mémorisé dont le marché a disparu Revient à All.
· DocsService
DocsService refuse les documents verrouillés partout et vérifie les sauvegardes de l'éditeur
- WOPI PutFile écrit raw MinIO, donc la sauvegarde passe d'abord par AntivirusUploadGuard: harmful save n'écrit rien, conserve le dernier bon contenu du document et répond à l'éditeur 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE pour qu'il réessaie); une sauvegarde propre est marquée GetFile refuse de vérifier le contenu verrouillé avec 423. - Imaging /download, /stream, les PDF convertis et les vignettes de page appellent la porte de lecture avant 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING. ATTENTION le contenu passe, donc son PDF est bloqué L'exportation en vrac supprime les documents verrouillés comme les autres exclusions. - Version télécharger/pdf/thumbnail juger le contenu propre de la version. - Les CV de carrières sont vérifiés en tant que CARRIÈRES avec le candidat et l'application; les carrières Les contrôleurs répondent aux refus d'Antivirus sous la forme d'une plate-forme au lieu d'un 500. - Légal: les téléchargements de cartes refusent à leur propre 422/503, un téléchargement en attente demande à réessayer (son PDF Les paquets exécutés et les échantillons de requêtes sont Les albums photo de Binder laissent les photos verrouillées dehors. - Les lignes de liste de documents/métadonnées portent scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (activé: faux jusqu'à ce que KamoAntivirus soit prêt); ANTIVIRUS_INTERNAL_AUTH_SECRET de mlos-internal-auth.
· SecurityService
Chaque ligne Commandes nomme son propre marché
Les lignes portent marketId / marketTitle de leur engagement (une requête par engagement uid), de sorte qu'une organisation avec deux marchés de détail voit lequel Une commande provenait d'un marché au lieu des deux sous le nom du premier marché. Les enregistrements effectués avant le suivi des marchés restent nuls.
· KlusterServices
Alertes antivirus (scanner en panne, signatures obsolètes, échec de la porte miroir, p95, pic de détection, retard de mise en attente)
Appliqué à la main (le suivi n'est pas une cible de l'IC).
· kamo-shared-library
Une location a besoin d'un locataire; commercialiser l'engagement; annuler, reprogrammer, vérifier, retourner et annuler une réservation
- createRentalRequest refuse un compte client manquant ou étranger, enregistre le Le marché (de l'actif, sinon celui choisi) sur l'engagement, et valide les dates Confirmer refuse une demande sans compte.Confirm refuses a request with no account. - setRentalRequestAccount / setBookingAccount déplacer le locataire vers un autre compte et Ne jamais l'effacer; les deux répondent à l'enregistrement mis à jour. - Demandes: annuler/décoder (IntentStatus.CANCELLED, raison conservée) et nouvelles dates (avec Réservations: check-out (le jour de la réservation) IN_PROGRESS), retour ou fin (COMPLETED; CommitmentStatus.FULFILLED; retard et dommages frais ajoutés au total; notes de condition), annuler (ANNULÉ, avant qu'il ne s'éteigne), et de nouvelles dates (seulement la fin en dehors), chacune vérifiant les autres réservations de l'actif sous Un verrouillage de ligne sur l'actif afin que deux confirmations ne puissent pas doubler. - EngagementLifecycle: un engagement VOIDED n'engage rien; tout annulé et pas de commande Cette activité est ANNULÉE. - Une réservation retournée ne détient plus ses dates. Les dates détenues de l'actif sont lisibles (findRentalAssetBookings) pour les sélecteurs de dates. - DTOs: marketId/marketTitle sur les demandes, les réservations et les actifs; réservation -> rentalRequestUid, rateType, checkedOutAt, returnedAt, frais, notes, raison d'annulation; Demande -> raison d'annulation, bookingStatus. Listes filtrer par le marché et les actifs de charge, Réservations et remises dans une requête chacune au lieu de par ligne. - Actifs de location: colonne de description; marché validé comme le marché de location de l'organisation et taux négatifs refusés; codes en double refusés à la mise à jour; un Une ressource avec des locations enregistrées ne peut pas être supprimée (désactivez-la à la place). - Indices: **************** par engagement, engagements par location actif, accomplissements par engagement, actifs de location par org et marché (appliqués à la main).
· kamo-internal
Marchés — les propres marchés de l'organisation, sous leurs propres noms
Un marché est ce que les membres définissent (titre + nom du marché) Description); son secteur d'activité n'est que son genre. - L'option de navigation est Marchés. Avec un marché, c'est ce marché, par son titre (comme avant); avec deux ou plus, il ouvre un menu avec une ligne par market — son titre, sa description en dessous, une icône pour sa ligne d'affaires — chaque ouverture de l'onglet de ce marché. Un flux de liste en cache Les deux navs, le launchpad et l'étiquette, rafraîchis sur les changements de marché. - Les lignes de menu de navigation prennent une description facultative (popover, rail, barre supérieure). - La case de type du formulaire de marché est "Ligne d'affaires"; chaque choix dit Ce qu'il donne au marché, et un verrouillé nomme l'application dont il a besoin Les aides de nom et de description expliquent ce qu'est un nom de domaine Pour les membres, voir dans le menu Marchés. - ACCESS_COMMERCE indique "Accès aux marchés"; la page Prêts pointe vers Paramètres → Secteurs d'activité.
· MediaService
MediaService vérifie les pièces jointes avec Antivirus et refuse les fichiers verrouillés à chaque lecture
- Pièces jointes de chat (membre CHAT, web-chat visiteur PUBLIC), fichiers de bogues du système, images de Growth Hub sont vérifiés dans storeContentAddressed avec leur contexte (membre, conversation); Canva Un refus est envoyé au client lorsque la forme de la plateforme (422) est atteinte ANTIVIRUS_BLOCKED {family} / 503 ANTIVIRUS_UNAVAILABLE) au lieu d'être enveloppé dans un 500. - Les arrière-plans de réunion (raw MinIO, public bucket) passent d'abord par AntivirusUploadGuard. - /attachments/link (dedup by hash) refuse le contenu Antivirus verrouillé (422); un fichier retenu peut être Il est lié et reste illisible jusqu'à ce qu'il soit coché. - Les pièces jointes portent scan {état, famille, résultat} sur la réponse de téléchargement, le message en direct Cadre et historique ; EN ATTENTE pendant la tenue. - ImagingProxyController (original et preview), le téléchargement du visiteur, les fichiers de bogues du système, Les images, les matériaux et les lectures de matériel Canva de Growth Hub appellent la porte de lecture: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, vérifié avant le missing-content 410 donc un hold Le proxy vérifie maintenant l'appartenance avant l'état du contenu. - ConfigMap kamo.antivirus.* (activé: faux jusqu'à ce que KamoAntivirus soit prêt); ANTIVIRUS_INTERNAL_AUTH_SECRET de mlos-internal-auth.
· ConversionService
ConversionService vérifie les téléchargements avec Antivirus, complète les fichiers retenus, vérifie à nouveau les nouvelles signatures
Remplace le client clamd en service (malware/package, UploadScanGuard, QuarantineStore, Rétro-scan) avec la bibliothèque partagée Antivirus: - /upload, /replace, /templates/upload sont cochés à l'intérieur d'ImageService avant toute ligne ou L'objet est écrit (HOLD autorisé); les refus utilisent les formes de plateforme: 422 ANTIVIRUS_BLOCKED {family}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH. MALWARE_DETECTED a disparu et il n'y a pas de réponse Les réponses portent le scan {status, family, outcome} ; un nom de signature est toujours retourné Le fichier est PENDING et se convertit une fois stocké. Le pipeline émet une étape 'scanning'. - /register-existing (dedup par référence) refuse le contenu Antivirus verrouillé (422). - Les effets sonores (raw MinIO) passent par AntivirusUploadGuard (pas de retenue, 503 en cas de panne). - QuarantineStore n'existe plus, donc rien n'est écrit dans le compartiment de quarantaine; rien Il y est touché. - antivirus.hold.verdict (queue antivirus-hold-completer) -> AntivirusHoldCompleter, puis le Conversion ordinaire pour les documents libérés; une défaillance de stockage naks pour la re-livraison. - antivirus.signatures.promoted (queue antivirus-recheck) -> AntivirusRecheckService: chaque Hash marqué dont les octets sont stockés (déverrouillage + notification + rapports AUTO_CLEARED) et CLEAN contenu vu pour la première fois au cours des 14 derniers jours (LOCKED_LATER + alertes), diffusé depuis MinIO, Un à la fois, limité. Les abonnés réessaient jusqu'à ce que le flux ANTIVIRUS existe. - Carte de configuration: kamo.antivirus.* (activé: faux jusqu'à ce que KamoAntivirus soit prêt); ANTIVIRUS_INTERNAL_AUTH_SECRET de mlos-internal-auth.
· kamo-shared-library
Un engagement appartient à un marché défini par un membre
commerce_engagements.market_id (appliqué à la main, FK à commerce_markets, Ordres de vente au détail, emplois de service, location et approvisionnement Les registres n'ont pas de colonne de marché propre; ils la lisent à partir de leurs L’engagement, de la même manière qu’ils lisent leur compte client.
· kamo-internal
L'interface utilisateur de l'antivirus - la protection scelle partout où un fichier apparaît, le centre antivirus, l'onglet de la plate-forme, les alertes et l'aide
Kit de conception (application/composants/antivirus): ProtectionSeal avec cinq visages animés (Verification, Protégé, Attention, Bloqué, Impossible de vérifier; marque + jetons --av-*, mouvement réduit respecté), BlockedFileCard / LockedAttachment / LockedOverlay, CautionBanner avec Ouvrir une copie sécurisée, MessageAntivirusBanner, ShieldClip, FalseAlarmDialog ("Je pense que c'est une erreur"), AntivirusNotReady. Logique de @kamo/antivirus-core 0.1.0 (état scellé, raison de l'analyseur acceptant Les erreurs suivantes peuvent apparaître: ANTIVIRUS_BLOCKED / MALWARE_DETECTED / ANTIVIRUS_CHECKING / ANTIVIRUS_UNAVAILABLE / SCAN_UNAVAILABLE. Surfaces: panneau de lecture de courrier (scellés, pièces enlevées verrouillées sous leurs noms d'origine, message bannière, images en ligne retenues, Télécharger Toutes les sautes, clip de bouclier de rangée de liste, cache de corps v2), plateaux composer/chat/SMS/SI (vérification + états bloqués), bulles de chat pour les destinataires, documents (Étape de vérification, sceaux, actions verrouillées, porte de mise en garde), et le toast de refus sur chaque téléchargement (KB, avatar, carrières, bugs système, sons, documents de compte/patient/application, logos). Antivirus Center à **************** (VIEW_ANTIVIRUS; les besoins de la politique MANAGE_ANTIVIRUS_POLICY): orbe de protection, KPI de décompte, graphiques de tendance/origine/famille, en direct Chronologie des menaces, commutateurs de politique avec aide, fausses alarmes (MANAGE_PLATFORM_ANTIVIRUS): état de l'analyseur, versions avec actualisation/annulation, file d'attente de révision, Trois types de notification, la visite guidée de l'Antivirus, la liste d'autorisations, /api/antivirus BFF, miroirs pour ServiceType ANTIVIRUS(41), droits 698-700 et MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275), et sept articles du centre d'aide. Le composant Protection home widget est construit mais pas enregistré: le launchpad a besoin d'un ANTIVIRUS_WIDGET bloc droit que la bibliothèque partagée n'a pas encore.
· KlusterServices
Svc_antivirus login + flux ANTIVIRUS; la conversion/le courrier électronique peut consommer l'antivirus.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, publier antivirus.> et rt.org.>, Souscrire antivirus.> et _INBOX.> (Secret kamo/nats-utilisateur-antivirus, SECRETS.md). - svc_conversion: API consommateur ANTIVIRUS (maintenir les verdicts, revérifier sur la promotion), publier/s'abonner antivirus.>, publier rt.org.> (les verdicts enregistrés rafraîchissent l'interface utilisateur). - svc_email: API consommateur ANTIVIRUS (détection des filtres de messagerie), antivirus.>. - stream-bootstrap Job provisions ANTIVIRUS (R1, 14d) afin que les consommateurs puissent se lier en premier. Validé avec nats-server -t contre le serveur live.

Votre univers vous attend.
Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.
Gratuit pour toujours — aucune carte de crédit requise