Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· 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
Haken Sie den wöchentlichen Schutzbericht (stündlich, org-local Montag 08:00 Uhr) und die Ausbruchsüberwachung (15 min) an
· SecurityService
Die Antivirus-API, Plattformkontrollen und geplante Endpunkte; Gate SecurityServices eigene Dateipfade
/api/antivirus/** (und der Zwilling /api/security/antivirus, den der Konsolen-Proxy zuerst versucht): Übersicht, Erkennungen, Einstellungen (geprüfte ANTIVIRUS_POLICY_CHANGE), Fehlalarme, Urteilssuche. Plattform (MANAGE_PLATFORM_ANTIVIRUS): Status, Signatur-Refresh/Rollback, False-Alarm-Überprüfung (ALLOWLIST entsperrt überall + informiert die Leute), allowlist, Intern: wöchentlicher Schutzbericht und Ausbruchsprüfung für DaemonService.Intern: wöchentlicher Schutzbericht und Ausbruchsprüfung für DaemonService. Rohe Uploads (Avatare inkl. SVG, Hintergründe, Logos, Lead-Importe, Offenlegungen, Tarifblätter) werden vor der Veröffentlichung geprüft Alles wird geschrieben; ImageService-Pfade behalten ihr lib-Gate und antworten jetzt 422/423/503 anstelle eines 500; Tresor, Leih-, Patienten- und Picture-Frame-Lesevorgänge wenden das Lese-Gate an. kamo.antivirus.enabled bleibt false, bis der kamowsantivirus StatefulSet ist bereit.
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus Mailfilter zuerst auf eingehendem smtpd (Port 25), tempfail wenn nicht erreichbar
smtpd_milters default_action=tempfail }, dann bleibt rspamd unverändert. Schädliche Anhänge werden wird durch einen kleinen Platzhalterteil ersetzt und die Nachricht wird immer noch zugestellt; wenn die Wenn der Filter nicht erreicht werden kann, erhält der Absender eine 4xx und versucht es erneut submission (587) Nur rspamd behalten; postfix-bulk unberührt. Milter wurde vor diesem Push live verifiziert (milter-protocol client in cluster: test Datei durch den Platzhalter ersetzt, sauberes CSV beibehalten, gefälschte Markierung entfernt).
· 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
Registerkartenfilter für Bestellungen nach den eigenen Märkten der Organisation
Chips und Zeilenetiketten waren pro Geschäftsbereich, benannt nach seinem ersten So sind zwei Einzelhandelsmärkte zu einem zusammengebrochen. Jede Zeile zeigt nun Ein eigener Markt (vom Server); ein älterer Datensatz ohne Markt geht Zum einzigen Markt seiner Linie, wenn es einen gibt, sonst zu einem "<Zeile> — Kein Markt" Gruppe. Ein gespeicherter Filter, dessen Markt verschwunden ist fällt zurück auf Alle.
· DocsService
DocsService lehnt gesperrte Dokumente überall ab und prüft, ob der Editor speichert
- WOPI PutFile schreibt raw MinIO, also geht das Speichern zuerst durch AntivirusUploadGuard: a harmful save schreibt nichts, behält den letzten guten Inhalt des Dokuments und antwortet dem Editor 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE, sodass es erneut versucht wird); ein sauberer Speichervorgang wird markiert GetFile lehnt die Überprüfung von gesperrten Inhalten mit 423 ab. - Imaging /download, /stream, die konvertierte PDF und Seiten-Thumbnails rufen das Lese-Gate vor Jedes Byte: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING. VORSICHT Inhalt wird übertragen, so dass seine PDF Der Bulk-Export lässt gesperrte Dokumente wie die anderen Ausschlüsse fallen. - Versions-Download/pdf/Thumbnail beurteilen den Inhalt der Version selbst. - Karriere-Lebensläufe werden als Karriere mit dem Bewerber und der Bewerbung geprüft; die Karriere Die Controller antworten auf Antivirus-Ablehnungen in der Plattformform anstelle einer 500. - Legal: Uploads Kartenverweigerungen auf eigene 422/503, ein angehaltener Upload bittet um Wiederholung (seine PDF Ausgeführte Pakete und Anforderungsbeispiele werden in der Datei gespeichert Binder-Fotoalben lassen gesperrte Fotos aus. - Dokumentenliste/Metadatenzeilen tragen scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (aktiviert: false bis KamoAntivirus bereit ist); ANTIVIRUS_INTERNAL_AUTH_SECRET von mlos-internal-auth.
· SecurityService
Jede Orders-Zeile nennt ihren eigenen Markt
Zeilen tragen marketId / marketTitle aus ihrem Engagement (eine Abfrage nach Ein Unternehmen mit zwei Einzelhandelsmärkten kann also sehen, welcher Eine Bestellung kam von einem Markt anstatt von beiden unter dem Namen des ersten Marktes. Aufzeichnungen, die vor der Nachverfolgung der Märkte erstellt wurden, bleiben null.
· KlusterServices
Antiviren-Warnungen (Scanner aus, veraltete Signaturen, Spiegel-Gate-Fehler, p95, Erkennungsspitzen, Rückstand)
Von Hand aufgetragen (Monitoring/ ist kein CI-Ziel).
· 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
Märkte — die eigenen Märkte der Organisation, mit ihren eigenen Namen
Ein Markt ist das, was die Mitglieder definieren (Titel + Bezeichnung) Beschreibung); seine Branche ist nur seine Art. - Die Navigationsoption ist Märkte. Bei einem Markt ist es dieser Markt, durch seine Titel (wie vorher); bei zwei oder mehr öffnet es ein Menü mit einer Zeile pro Markt — sein Titel, seine Beschreibung darunter, ein Symbol für seine Zeile Jedes Mal, wenn Sie die Registerkarte dieses Marktes öffnen. Ein zwischengespeicherter Listenfeed Die beiden Navigationselemente, das Launchpad und das Label, werden bei Marktveränderungen aktualisiert. - Nav-Menüzeilen nehmen eine optionale Beschreibung (Popover, Schiene, obere Leiste). - Das Typfeld des Marktformulars lautet "Line of Business"; jede Auswahl sagt Was es dem Markt bietet, und ein gesperrtes nennt die App, die es braucht Name- und Beschreibungshilfen erklären, was in der Beschreibung steht Mitglieder finden Sie im Menü Märkte. - ACCESS_COMMERCE liest "Access Markets"; die Lending-Seite verweist auf Einstellungen → Geschäftsbereiche.
· MediaService
MediaService prüft Anhänge mit Antivirus und lehnt gesperrte Dateien bei jedem Lesen ab
- Chat-Anhänge (Mitglied CHAT, Web-Chat-Besucher PUBLIC), System-Bug-Dateien, Growth Hub-Bilder werden innerhalb von storeContentAddressed mit ihrem Kontext (Mitglied, Konversation) überprüft; Canva Eine Ablehnung erreicht den Client, sobald das Plattform-Shape (422 ANTIVIRUS_BLOCKED {family} / 503 ANTIVIRUS_UNAVAILABLE), anstatt in eine 500 eingewickelt zu werden. - Meeting-Hintergründe (raw MinIO, public bucket) gehen zuerst durch AntivirusUploadGuard. - /attachments/link (dedup by hash) verweigert Inhalt Antivirus gesperrt (422); eine gehaltene Datei kann Dieses Feld ist verknüpft und bleibt unlesbar, bis es überprüft wird. - Anhänge tragen Scan {Status, Familie, Ergebnis} auf die Upload-Antwort, die Live-Nachricht Rahmen und Geschichte; PENDING während gehalten. - ImagingProxyController (Original und Vorschau), der Besucher-Download, System-Bug-Dateien, Bilder, Materialien und Canva-Materialien aus dem Wachstums-Hub rufen das Lese-Tor auf: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, überprüft vor dem missing-content 410 so ein gehalten Der Proxy prüft nun die Mitgliedschaft vor dem Inhaltszustand.Der Proxy prüft nun die Mitgliedschaft vor dem Inhaltszustand. - ConfigMap kamo.antivirus.* (aktiviert: false bis KamoAntivirus bereit ist); ANTIVIRUS_INTERNAL_AUTH_SECRET von mlos-internal-auth.
· ConversionService
ConversionService prüft Uploads mit Antivirus, vervollständigt gehaltene Dateien, prüft erneut auf neue Signaturen
Ersetzt den in-service clamd-Client (malware/ package, UploadScanGuard, QuarantineStore, Retro-Scan) mit der Shared-Library Antivirus: - /upload, /replace, /templates/upload werden innerhalb von ImageService vor jeder Zeile oder Objekt wird geschrieben (HOLD erlaubt); Ablehnungen verwenden die Plattformformen: 422 ANTIVIRUS_BLOCKED 503 HASH_MISMATCH. MALWARE_DETECTED ist nicht mehr vorhanden und es gibt keine weiteren Fehlermeldungen Antworten enthalten den Scan {Status, Familie, Ergebnis}; ein gehaltener Name wird immer zurückgegeben Die Datei ist PENDING und wird nach dem Speichern konvertiert. Die Pipeline gibt eine 'Scanning'-Stufe aus. - /register-existing (dedup by reference) verweigert den Inhalt Antivirus gesperrt (422). - Soundeffekte (raw MinIO) gehen durch AntivirusUploadGuard (kein Halten, 503 wenn runter). - QuarantineStore existiert nicht mehr, also wird nichts in den Quarantäne-Bucket geschrieben; nichts Darin wird berührt. - antivirus.hold.verdict (Warteschlange antivirus-hold-completer) -> AntivirusHoldCompleter, dann die Gewöhnliche Konvertierung für die freigegebenen Dokumente; ein Speicherfehler naks für die erneute Lieferung. - antivirus.signatures.promoted (Warteschlange antivirus-recheck) -> AntivirusRecheckService: jedes Mal gekennzeichneter Hash, dessen Bytes gespeichert werden (unlock + notify + AUTO_CLEARED-Berichte) und CLEAN Inhalte, die zuerst in den letzten 14 Tagen gesehen wurden (LOCKED_LATER + Alerts), gestreamt von MinIO, Die Abonnenten versuchen es erneut, bis der ANTIVIRUS-Stream vorhanden ist. - ConfigMap: kamo.antivirus.* (aktiviert: false bis KamoAntivirus bereit ist); ANTIVIRUS_INTERNAL_AUTH_SECRET von mlos-internal-auth.
· kamo-shared-library
Ein Engagement gehört zu einem vom Mitglied definierten Markt
commerce_engagements.market_id (von Hand angewendet, FK auf commerce_markets, Einzelhandelsaufträge, Serviceaufträge, Vermietung und Beschaffung (mit org_id indiziert) Aufzeichnungen haben keine eigene Marktspalte; sie lesen sie aus ihren Engagement, genauso wie sie ihr Kundenkonto lesen.
· 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.
· KlusterServices
Svc_antivirus login + ANTIVIRUS stream; Konvertierung/E-Mail kann Antivirus verbrauchen.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, veröffentlicht antivirus.> und rt.org.>, Abonnieren Sie antivirus.> und _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS.md). - svc_conversion: ANTIVIRUS Verbraucher-API (haltet Urteile, überprüft auf Promotion), publish/subscribe antivirus.>, publish rt.org.> (aufgezeichnete Urteile aktualisieren die Benutzeroberfläche). - svc_email: ANTIVIRUS-Verbraucher-API (E-Mail-Filter-Erkennung), Antivirus.>. - stream-bootstrap Job-Bereitstellungen ANTIVIRUS (R1, 14d), so dass Verbraucher zuerst binden können. Validiert mit nats-server -t gegen den Live-Server.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich