Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · 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.

  2. · 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

  3. · 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

  4. · 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.

  5. · 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

  6. · 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)

  7. · 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)

  8. · 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.

  9. · 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.

  10. · 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.

  11. · 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.

  12. · 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.

  13. · 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.

  14. · DaemonService

    Marque o Relatório de Proteção semanal (a cada hora, org-local segunda-feira 08:00) e o alerta de surto (15 min)

  15. · SecurityService

    A API de antivírus, controles de plataforma e endpoints agendados; porta de caminhos de arquivo próprios do SecurityService

    /api/antivirus/** (e o gêmeo /api/security/antivirus que o proxy do console tenta primeiro): visão geral, detecções, configurações (auditado ANTIVIRUS_POLICY_CHANGE), alarmes falsos, pesquisa de veredicto. Plataforma (MANAGE_PLATFORM_ANTIVIRUS): status, assinatura refresh/rollback, revisão de falso-alarme (ALLOWLIST desbloqueia em todos os lugares + diz às pessoas), allowlist, Interno: relatório semanal de proteção e verificação de surtos para o DaemonService. Uploads brutos (avatares incluindo SVG, planos de fundo, logotipos, importações de leads, divulgações, folhas de taxas) são analisados antes de serem enviados nada é escrito; caminhos ImageService mantêm seu portão lib e agora respondem 422/423/503 em vez de um 500; vault, empréstimo, paciente e leituras de quadro de imagem aplicam o portão de leitura. kamo.antivirus.enabled permanece false até que o kamowsantivirus StatefulSet está pronto.

  16. · APIService

    Route /api/antivirus/** to SecurityService and seal its internal subtree

  17. · KlusterServices

    KamoAntivirus filtro de e-mail primeiro no smtpd de entrada (porta 25), falha temporária quando inacessível

    smtpd_milters = { **************** default_action=tempfail }, então o rspamd permanecerá inalterado substituído por uma pequena parte de espaço reservado e a mensagem ainda é entregue; se o o filtro não pode ser alcançado, o remetente recebe um 4xx e tenta novamente. non_smtpd_milters e submission (587) manter apenas o rspamd; postfix-bulk intocado. Milter verificado ao vivo antes deste push (cliente de protocolo milter no cluster: test arquivo substituído pelo placeholder, CSV limpo mantido, marcador forjado removido).

  18. · EmailService

    Antivírus para e-mail — porta de leitura em todas as caixas de correio, espaços reservados mais suaves, triagem de envio, detecções

    - Ler: cada anexo/parte em linha de qualquer caixa de correio (Kamo Mail, provedores IMAP, Graph; pessoal e rotas compartilhadas) é hash na memória (arquivo temporário após 8 MiB, excluído no fechamento), seu veredicto global parecia O endereço de e-mail foi criado e, quando desconhecido, verificado por KamoAntivirus (origem MAIL_READ, bytes_stored=false) ANTIVIRUS_BLOCKED, não verificável = 423 ANTIVIRUS_CHECKING; razão/família também como X-Kamo-Antivírus-* As ferramentas de e-mail do SI lêem através dessas rotas, então elas também são bloqueadas. Listagem nunca verifica: AttachmentInfo carrega **************** somente para partes já hash. - Milter placeholders (X-Kamo-Antivirus-Removed) lista sob o nome ORIGINAL, removed=true, locked; nunca X-Kamo-Cabeçalho de mensagem do Antivírus exposto como EmailMessage.antivirus para o banner. - Enviar/rascunho (decisão 11): uploads de dispositivos e imagens coladas passam por AntivirusGate.scanUpload (armazena 422 ANTIVIRUS_BLOCKED (veredicts reused, never rescanned); as partes de um forward recebem a verificação de leitura Nome do arquivo, 503 Antivírus não disponível. - NATS antivirus.detection.mail (grupo de fila antivirus-mail-detections): destinatários resolvidos para membros via titulares de caixas de correio, aliases pessoais, leitores de caixas de correio compartilhadas e domínios de alias; registrado por membro (MAIL_INBOUND, contraparte = remetente) para que FILE_BLOCKED / THREAT_ALERT saia por configurações da organização. - Notificações: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (aplicativo principal, nenhuma linha de recursos necessária); FILE_BLOCKED/UNLOCKED não pertencem a nenhum aplicativo; ordem de catálogo. Amostras de visualização para os 4 modelos de antivírus. - configmap kamo.antivirus.* (ativado: kamowsantivirus está pronto). Necessita kamo-shared-library b6c41d34 (HashUtils BLAKE3 em bcprov 1.70).

  19. · SecurityService

    Etapas de aluguel, listas filtradas por mercado e um locatário que pode se mover, mas nunca ser liberado

    - GET /rental-requests e /bookings levam ?marketId (o próprio mercado do chamador) e filtro pelo mercado do engajamento. - POST /solicitações-de-aluguel/{id}/cancelar, PUT /solicitações-de-aluguel/{id}/datas, POST /reservas/{id}/check-out | devolução | cancelar, PUT /reservas/{id}/datas (MANAGE_RENTALS), cada um respondendo ao registro atualizado; uma recusa é um 400 com um sentença. - GET /rental-assets/{id}/bookings: as datas para as quais um ativo já está reservado. - PUT /rental-requests/{id}/account e /bookings/{id}/account recusam uma conta em branco e responder ao registro atualizado em vez de uma mensagem nua. - DELETE /rental-assets/{id} responde 409 com uma frase quando o ativo tem aluguéis.

  20. · kamo-internal

    Filtros da guia Pedidos pelos próprios mercados da organização

    Chips e etiquetas de linha eram por linha de negócios, nomeados após sua primeira mercado, então dois mercados de varejo entraram em colapso em um. Cada linha agora mostra seu próprio mercado (a partir do servidor); um registro mais antigo sem mercado vai para o único mercado de sua linha quando há um, outro para um Grupo "<Linha> — Sem mercado". Um filtro lembrado cujo mercado foi perdido cai de volta para Todos.

  21. · DocsService

    O DocsService recusa documentos bloqueados em todos os lugares e verifica os salvos do editor

    - WOPI PutFile escreve raw MinIO, então o save passa pelo AntivirusUploadGuard primeiro: a harmful save não escreve nada, mantém o último conteúdo bom do documento e responde ao editor 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE para que ele tente novamente); um salvamento limpo é marcado GetFile recusa o conteúdo bloqueado/verificado com 423. - Imagem /download, /stream, o PDF convertido e as miniaturas das páginas chamam o portão de leitura antes qualquer byte: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING. ATENÇÃO conteúdo passa, então seu PDF A exportação em massa deixa cair documentos bloqueados como as outras exclusões. - Versão download/pdf/thumbnail julgar o próprio conteúdo da versão. - Os currículos de carreiras são verificados como CARREIRAS com o candidato e aplicação; as carreiras Os controladores respondem a recusas de antivírus na forma de plataforma em vez de um 500. - Legal: uploads de recusas de mapa para o seu próprio 422/503, um upload retido pede para tentar novamente (seu PDF bytes não verificados), pacotes executados e amostras de requisições são Os álbuns de fotos do Binder deixam as fotos bloqueadas. - Lista de documentos/linhas de metadados carregam scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (ativado: false até que KamoAntivirus esteja pronto); O arquivo ANTIVIRUS_INTERNAL_AUTH_SECRET foi criado pelo mlos-internal-auth.

  22. · SecurityService

    Cada linha de Pedidos nomeia seu próprio mercado

    As linhas carregam marketId / marketTitle de seu engajamento (uma consulta por uid de engajamento), de modo que uma organização com dois mercados de varejo vê qual um de um pedido veio em vez de ambos sob o nome do primeiro mercado. Os registros feitos antes que os mercados fossem rastreados permanecem nulos.

  23. · KlusterServices

    Alertas de antivírus (scanner desligado, assinaturas obsoletas, falha no portão do espelho, p95, pico de detecção, atraso de espera)

    Aplicado à mão (monitoramento/não é um alvo de IC).

  24. · kamo-shared-library

    Um aluguel precisa de um locatário; mercado no compromisso; cancelar, re-data, check-out, devolução e cancelar uma reserva

    - createRentalRequest recusa uma conta de cliente ausente ou estrangeira, registra o mercado (do ativo, caso contrário, o escolhido) no compromisso, e valida as datas e o tipo de tarifa. Confirmar recusa uma solicitação sem conta. - setRentalRequestAccount / setBookingAccount mover o locatário para outra conta e nunca limpe-o; ambos respondem ao registro atualizado. - Solicitações: cancelar/decodificar (IntentStatus.CANCELLED, razão mantida) e novas datas (com Reservas: check-out (a data de check-out é a data da reserva) IN_PROGRESS), retornar ou terminar (COMPLETED; CommitmentStatus.FULFILLED; atrasado e danificado) taxas adicionadas ao total; notas de condição), cancelar (ANOITED, antes que ele saia), e novas datas (apenas o final enquanto estiver fora), cada uma verificando as outras reservas do ativo sob um bloqueio de linha no ativo para que duas confirmações não possam ser duplicadas. - EngagementLifecycle: um compromisso VOIDED não compromete nada; tudo anulado e nenhuma ordem Este evento está cancelado. - Uma reserva devolvida não mantém mais suas datas. As datas do ativo são legíveis (findRentalAssetBookings) para seletores de data. - DTOs: marketId/marketTitle em solicitações, reservas e ativos; reserva -> rentalRequestUid, rateType, checkedOutAt, returnedAt, taxas, notas, motivo de cancelamento; request -> cancelReason, bookingStatus. Listas de filtro por mercado e carregar ativos, reservas e entregas em uma consulta cada, em vez de por linha. - Ativos de aluguel: coluna de descrição; mercado validado como o mercado de aluguel da organização e móveis na atualização; taxas negativas recusadas; códigos duplicados recusados na atualização; um ativo com aluguéis registrados não pode ser excluído (desative-o). - Índices: **************** por engajamento, compromissos por locação ativo, cumprimentos por compromisso, ativos de aluguel por org e mercado (aplicados à mão).

  25. · kamo-internal

    Mercados — os próprios mercados da organização, por seus próprios nomes

    "Comércio" se foi. Um mercado é o que os membros definem (título + descrição); a sua Linha de Negócios é apenas a sua espécie. - A opção de navegação é Mercados. Com um mercado é esse mercado, por sua título (como antes); com dois ou mais abre um menu com uma linha por mercado — seu título, sua descrição abaixo, um ícone para sua linha de negócios — cada uma abrindo a guia desse mercado. Um feed de lista em cache ambas as naves, o launchpad e o rótulo, atualizado sobre as mudanças do mercado. - As linhas do menu de navegação levam uma descrição opcional (popover, trilho, barra superior). - A caixa de tipo do formulário de mercado é "Linha de Negócios"; cada escolha diz o que ele dá ao mercado, e um bloqueado nomeia o aplicativo que ele precisa Os ajudantes de nome e descrição explicam o que é um nome de domínio membros vejam no menu Mercados. - ACCESS_COMMERCE lê "Acesso aos Mercados"; a página de Empréstimos aponta para Configurações → Linhas de Negócios.

  26. · MediaService

    MediaService verifica anexos com Antivírus e recusa arquivos bloqueados em cada leitura

    - Anexos de bate-papo (membro CHAT, web-chat visitante PÚBLICO), arquivos de bug do sistema, imagens do Hub de crescimento são verificados dentro de storeContentAddressed com seu contexto (membro, conversa); Canva Uma recusa chega ao cliente quando a forma da plataforma (422) é alterada ANTIVIRUS_BLOCKED {família} / 503 ANTIVIRUS_UNAVAILABLE) em vez de ser envolvido em um 500. - Fundos de reunião (raw MinIO, bucket público) passam pelo AntivirusUploadGuard primeiro. - /attachments/link (dedup by hash) rejeita conteúdo Antivírus bloqueado (422); um arquivo retido pode ser é vinculado e permanece ilegível até ser verificado. - Anexos carregam digitalização {status, família, resultado} sobre a resposta de upload, a mensagem ao vivo quadro e histórico; PENDING enquanto mantido. - ImagingProxyController (original e visualização), o download do visitante, arquivos de bug do sistema, As imagens, materiais e leituras de materiais do Canva do Hub de crescimento chamam o portão de leitura: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, verificado antes do conteúdo ausente 410, portanto, uma retenção O proxy agora verifica a associação antes do estado do conteúdo. - ConfigMap kamo.antivirus.* (ativado: false até que KamoAntivirus esteja pronto); O arquivo ANTIVIRUS_INTERNAL_AUTH_SECRET foi criado pelo mlos-internal-auth.

  27. · ConversionService

    ConversionService verifica uploads com Antivírus, completa arquivos retidos, re-verifica em novas assinaturas

    Substitui o cliente clamd em serviço (malware / pacote, UploadScanGuard, QuarantineStore, retro-scan) com a biblioteca compartilhada Antivírus: - /upload, /replace, /templates/upload são verificados dentro do ImageService antes de qualquer linha ou objeto é escrito (HOLD permitido); recusas usam as formas da plataforma: 422 ANTIVIRUS_BLOCKED {família}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH. MALWARE_DETECTED foi removido e não há mais As respostas carregam a varredura {status, família, resultado}; um nome de assinatura é sempre retornado O arquivo está PENDING e converte uma vez armazenado. O pipeline emite um estágio de 'digitalização'. - /register-existing (dedup por referência) recusa o conteúdo Antivírus bloqueado (422). - Efeitos sonoros (raw MinIO) passam pelo AntivirusUploadGuard (sem espera, 503 quando para baixo). - QuarantineStore não existe mais, então nada é escrito para o balde de quarentena; nada nele é tocado. - antivirus.hold.verdict (fila antivirus-hold-completer) -> AntivirusHoldCompleter, então o conversão ordinária para os documentos liberados; uma falha de armazenamento naks para reentrega. - antivirus.signatures.promoted (fila antivirus-recheck) -> AntivirusRecheckService: a cada hash sinalizado cujos bytes são armazenados (desbloquear + notificar + relatórios AUTO_CLEARED) e CLEAN conteúdo visto pela primeira vez nos últimos 14 dias (LOCKED_LATER + alertas), transmitido de MinIO, Um de cada vez, com restrição. Os assinantes tentam novamente até que o fluxo ANTIVIRUS exista. - ConfigMap: kamo.antivirus.* (ativado: false até que KamoAntivirus esteja pronto); O arquivo ANTIVIRUS_INTERNAL_AUTH_SECRET foi criado pelo mlos-internal-auth.

  28. · kamo-shared-library

    Um compromisso pertence a um mercado definido pelo membro

    commerce_engagements.market_id (aplicado manualmente, FK para commerce_markets, indexado com org_id). Pedidos de varejo, trabalhos de serviço, aluguel e aquisição registros não têm uma coluna de mercado própria; eles a leem de seus engajamento, da mesma forma que eles leem a conta do cliente.

  29. · kamo-internal

    The Antivirus UI — protection seals everywhere a file appears, the Antivirus Center, the platform tab, alerts and help

    Design kit (app/components/antivirus): ProtectionSeal with five animated faces (Checking, Protected, Caution, Blocked, Couldn't Check; brand + --av-* tokens, reduced motion honoured), BlockedFileCard / LockedAttachment / LockedOverlay, CautionBanner with Open a Safe Copy, MessageAntivirusBanner, ShieldClip, FalseAlarmDialog ("I think this is a mistake"), AntivirusNotReady. Logic from @kamo/antivirus-core 0.1.0 (seal state, reason parser accepting ANTIVIRUS_BLOCKED / MALWARE_DETECTED / ANTIVIRUS_CHECKING / ANTIVIRUS_UNAVAILABLE / SCAN_UNAVAILABLE). Surfaces: mail reading pane (seals, removed parts locked under their original names, message banner, inline images withheld, Download All skips them, list-row shield clip, body cache v2), composer/chat/SMS/SI trays (Checking + blocked states), chat bubbles for recipients, documents (Checking stage, seals, locked actions, caution gate), and the refusal toast on every upload (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 threat timeline, policy switches with help, false alarms. Platform tab (MANAGE_PLATFORM_ANTIVIRUS): scanner health, releases with refresh/rollback, review queue, allowlist, outbreaks, safety drill. Three notification kinds, the Antivirus guided tour, /api/antivirus BFF, mirrors for ServiceType ANTIVIRUS(41), rights 698-700 and MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275), and seven help center articles. The Protection home widget component is built but not registered: the launchpad needs an ANTIVIRUS_WIDGET right block that the shared library does not have yet.

  30. · KlusterServices

    Svc_antivirus login + ANTIVIRUS stream; conversão/email pode consumir antivírus.>

    - svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, publicar antivirus.> e rt.org.>, subscribe antivirus.> e _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS.md). - svc_conversion: API do consumidor ANTIVIRUS (guardar veredictos, reverificar na promoção), publish/subscribe antivirus.>, publish rt.org.> (veredictos gravados atualizam a interface do usuário). - svc_email: API de consumidor ANTIVIRUS (detecções de filtro de e-mail), antivírus.>. - stream-bootstrap Provisões de trabalho ANTIVIRUS (R1, 14d) para que os consumidores possam vincular primeiro. Validado com nats-server -t contra o servidor ao vivo.

Seu universo está esperando.

Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.

Gratuito para sempre — não é necessário cartão de crédito