Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· 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
Tandai laporan perlindungan mingguan (sehari-hari, org-local Senin 08:00) dan pengamatan wabah (15 menit)
· SecurityService
Antivirus API, kontrol platform dan titik akhir terjadwal; lalu lintas berkas SecurityService sendiri
/api/antivirus/** (dan kembar /api/security/antivirus yang dicoba pertama oleh proxy konsol): ringkasan, deteksi, pengaturan (diaudit ANTIVIRUS_POLICY_CHANGE), alarm palsu, verdict lookup. Platform (MANAGE_PLATFORM_ANTIVIRUS): status, tanda tangan refresh/rollback, false-alarm review (ALLOWLIST membuka di mana-mana + memberitahu orang), allowlist, Internal: laporan perlindungan mingguan dan periksa wabah untuk DaemonService. Unggahan mentah (avatar termasuk SVG, latar belakang, logo, impor lead, pengungkapan, lembar tarif) disaring sebelum apapun ditulis; ImageService paths menyimpan lib gate mereka dan sekarang menjawab 422/423/503 bukan 500; vault, pinjaman, pasien dan gambar-frame membaca menerapkan gerbang baca. kamo.antivirus.enabled tetap salah sampai kamowsantivirus StatefulSet sudah Siap.
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus salin surat pertama pada smtpd masuk (port 25), gagal sementara bila tidak dapat dijangkau
smtpd_milters = { **************** default_action=tempfail }, maka rspamd tidak berubah. Lampiran berbahaya adalah digantikan oleh bagian tempat tinggal kecil dan pesan masih dikirim; jika filter tidak dapat dicapai pengirim mendapat 4xx dan mencoba lagi. non_smtpd_milters dan submission (587) simpan hanya rspamd; postfix-bulk tidak disentuh. Milter diverifikasi secara langsung sebelum push ini (klien protokol milter di cluster: test berkas digantikan dengan tempat tinggal, CSV bersih disimpan, penanda palsu dihilangkan).
· EmailService
Antivirus untuk surat — baca gerbang pada setiap kotak surat, milter placeholders, kirim penyaringan, deteksi
- Baca: setiap lampiran/bagian dalam baris dari kotak surat apapun (Kamo Mail, penyedia IMAP, Graph; pribadi dan rute berbagi) dihash dalam memori (berkas sementara melebihi 8 MiB, dihapus pada penutupan), keputusan globalnya terlihat up dan, bila tidak diketahui, diperiksa oleh KamoAntivirus (origin MAIL_READ, bytes_stored=false). Harmful = 423 ANTIVIRUS_BLOCKED, tidak dapat diperiksa = 423 ANTIVIRUS_CHECKING; alasan/keluarga juga sebagai X-Kamo-Antivirus-* header. Alat surat SI membaca melalui rute ini, sehingga mereka juga di-gated. Daftar tidak pernah mengimbas: AttachmentInfo membawa **************** hanya untuk bagian yang sudah dihash. - Milter placeholders (X-Kamo-Antivirus-Removed) daftar dibawah nama ORIGINAL, removed=true, locked; never tidak dilayani atau dimajukan. X-Kamo-Antivirus header pesan terpapar sebagai EmailMessage.antivirus untuk banner. - Kirim/draft (keputusan 11): unggah perangkat dan gambar yang ditempel melalui AntivirusGate.scanUpload (disembunyikan 422 ANTIVIRUS_BLOCKED with fileName, 503 ANTIVIRUS_UNAVAILABLE. - NATS antivirus.detection.mail (kelompok baris tunggu antivirus-mail-detections): penerima dipecahkan ke anggota via pemegang kotak surat, alias pribadi, pembaca kotak surat bersama dan domain alias; direkam per anggota (MAIL_INBOUND, counterparty = sender) jadi FILE_BLOCKED / THREAT_ALERT keluar per pengaturan org. - Notifikasi: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (aplikasi inti, tidak perlu baris fitur); FILE_BLOCKED/UNLOCKED bukan milik aplikasi; urutan katalog. Contoh pratinjau untuk 4 template Antivirus. - configmap kamo.antivirus.* (diaktifkan: kamowsantivirus sudah siap). Perlu kamo-shared-library b6c41d34 (HashUtils BLAKE3 pada 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
Pesan tab filter oleh pasar organisasi sendiri
Chip dan label baris adalah per jalur bisnis, dinamai setelah pertama kalinya pasar, jadi dua pasar ritel runtuh menjadi satu. setiap baris sekarang menunjukkan pasarnya sendiri (dari server); rekaman yang lebih tua tanpa pasar akan pergi untuk satu-satunya pasar dari garisnya ketika ada satu, lain untuk "<Line> — No Market" group. Sebuah filter yang diingat yang pasarnya hilang jatuh kembali ke semua.
· DocsService
DocsService menolak dokumen terkunci dimanapun dan memeriksa penyimpanan penyunting
- WOPI PutFile menulis raw MinIO, jadi penyimpanan melalui AntivirusUploadGuard terlebih dahulu: a menyimpan berbahaya tidak menulis apa-apa, menyimpan isi terakhir yang baik dari dokumen dan menjawab editor 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE sehingga mencoba lagi); penyimpanan bersih ditandai disimpan untuk pengecekan ulang selanjutnya. GetFile menolak konten terkunci/pemeriksaan dengan 423. - Pencitraan /download, /stream, PDF yang dikonversi dan thumbnails halaman memanggil gerbang baca sebelum apapun byte: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING. CAUTION konten melewati, jadi PDF rendition adalah 'salinan aman'. Ekspor berlebihan membuang dokumen terkunci seperti pengecualian lainnya. - Versi download/pdf/thumbnail menilai isi versi sendiri. - Karir resume diperiksa sebagai karir dengan calon dan aplikasi; karir Pengendali menjawab penolakan Antivirus dalam bentuk platform bukan 500. - Legal: mengunggah peta penolakan untuk mereka sendiri 422/503, ditahan upload meminta untuk mencoba lagi (PDF-nya rendering akan dibuat dari byte yang tidak diperiksa), paket yang dieksekusi dan contoh permintaan adalah Binder foto album meninggalkan foto terkunci keluar. - Daftar dokumen/baris metadata membawa scanStatus / scanFamily / scanOutcome. - ConfigMap kamo.antivirus.* (diaktifkan: salah sampai KamoAntivirus siap); ANTIVIRUS_INTERNAL_AUTH_SECRET dari mlos-internal-auth
· SecurityService
Setiap baris Orders diberi nama pasarnya sendiri
Baris membawa marketId / marketTitle dari keterlibatan mereka (satu pertanyaan oleh uid keterlibatan), sehingga organisasi dengan dua pasar ritel melihat yang satu pesanan datang dari bukannya keduanya di bawah nama pasar pertama. Catatan yang dibuat sebelum pasar diikuti tetap nol.
· KlusterServices
Peringatan antivirus (pengimbas turun, tanda tangan usang, cermin gerbang gagal, p95, deteksi spike, tunggu backlog)
Diterapkan dengan tangan (monitoring/ bukan target CI).
· kamo-shared-library
Sewa membutuhkan penyewa; pasar pada keterlibatan; membatalkan, re-date, check out, kembali dan membatalkan pemesanan
- createRentalRequest menolak akun pelanggan hilang atau asing, rekaman pasar (aset, jika tidak yang dipilih) pada keterlibatan, dan memvalidasi tanggal dan jenis tarif. Konfirmasi menolak permintaan tanpa akun. - setRentalRequestAccount / setBookingAccount pindahkan penyewa ke akun lain dan jangan pernah hapusnya; keduanya menjawab rekor yang diperbarui. - Permintaan: batal/dekoder (IntentStatus.CANCELLED, alasan tetap) dan tanggal baru (dengan Bookings: check out (order pemenuhan reservasi) IN_PROGRESS), return atau end (COMPLETED; CommitmentStatus.FULFILLED; terlambat dan rusak biaya ditambahkan ke total; catatan kondisi), batalkan (dibuang, sebelum keluar), dan tanggal baru (hanya akhir sementara keluar), masing-masing memeriksa reservasi lain aset di bawah kunci baris pada aset sehingga dua konfirmasi tidak bisa dicatat ulang. - EngagementLifecycle: sebuah komitmen VOIDED tidak berkomitmen apa-apa; semua dibatalkan dan tidak ada perintah dibatalkan. - Reservasi yang dikembalikan tidak lagi menyimpan tanggalnya (findRentalAssetBookings) untuk pemilih tanggal. - DTOs: marketId/marketTitle pada permintaan, pemesanan dan aset; pemesanan -> rentalRequestUid, rateType, checkedOutAt, returnedAt, fees, notes, cancel reason; request -> cancelReason, bookingStatus. Daftar filter berdasarkan pasar dan isi aset, pemesanan dan penyerahan dalam satu pertanyaan setiap bukan per baris. - Aset sewa: kolom deskripsi; pasar divalidasi sebagai pasar sewa org dan dapat dipindahkan pada update; tingkat negatif ditolak; kode duplikat ditolak pada update; an aset dengan sewa pada catatan tidak dapat dihapus (matikan saja). - Indeks: **************** oleh keterlibatan, komitmen oleh sewa aset, pemenuhan oleh komitmen, sewa aset oleh org dan pasar (dilakukan dengan tangan).
· kamo-internal
Pasar — pasar organisasi sendiri, dengan nama mereka sendiri
"Perdagangan" sudah hilang. pasar adalah apa yang didefinisikan anggota (judul + deskripsi); Line of Business-nya hanya sejenisnya. - Opsi navigasi adalah pasar. dengan satu pasar adalah pasar itu, oleh judul (seperti sebelumnya); dengan dua atau lebih ia membuka menu dengan satu baris per market — judulnya, deskripsinya di bawahnya, sebuah ikon untuk barisnya dari bisnis — setiap membuka tab pasar itu Kedua navs, launchpad dan label, diperbarui pada perubahan pasar. - Baris menu Nav mengambil deskripsi pilihan (popover, rel, bar atas). - Kotak jenis form pasar adalah "Line of Business"; setiap pilihan mengatakan apa yang ia berikan pada pasar, dan yang terkunci namanya aplikasi yang dibutuhkan Nama dan deskripsi membantu menjelaskan apa anggota lihat di menu Pasar. - ACCESS_COMMERCE baca "Access Markets"; halaman pinjaman menunjuk pada Setting → Lines of Business.
· MediaService
MediaService memeriksa lampiran dengan Antivirus dan menolak berkas terkunci pada setiap membaca
- Lampiran chat (member CHAT, web-chat kunjungan PUBLIC), berkas sistem-bug, gambar Growth Hub diperiksa di dalam storeContentAddressed dengan konteksnya (anggota, percakapan); Canva keluaran melalui uploadDocument. penolakan mencapai klien sebagai bentuk platform (422 ANTIVIRUS_BLOCKED {family} / 503 ANTIVIRUS_UNAVAILABLE) daripada dimasukkan ke dalam 500. - Latar belakang pertemuan (raw MinIO, public bucket) melalui AntivirusUploadGuard terlebih dahulu. - /attachments/link (dedup by hash) menolak isi Antivirus terkunci (422); berkas yang ditahan mungkin terhubung dan tetap tidak dapat dibaca sampai dicek. - Lampiran membawa scan {status, keluarga, hasil} pada unggah jawaban, pesan langsung frame dan sejarah; PENDING saat dipegang. - ImagingProxyController (asli dan pratinjau), pengunjung download, sistem-bug berkas, Gambar-gambar, bahan-bahan dan bacaan bahan Canva dari Growth Hub memanggil gerbang bacaan: 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING, diperiksa sebelum missing-content 410 jadi ditahan berkas mengatakan 'sedang diperiksa'. Proksi sekarang memeriksa keanggotaan sebelum keadaan isi. - ConfigMap kamo.antivirus.* (diaktifkan: salah sampai KamoAntivirus siap); ANTIVIRUS_INTERNAL_AUTH_SECRET dari mlos-internal-auth
· ConversionService
ConversionService memeriksa unggah dengan Antivirus, menyelesaikan berkas yang ditahan, memeriksa ulang tanda tangan baru
Menggantikan klien clamd dalam layanan (malware/ package, UploadScanGuard, QuarantineStore, retro-scan) dengan share-library Antivirus: - /upload, /replace, /templates/upload dicek di dalam ImageService sebelum baris apapun atau objek ditulis (HOLD diizinkan); penolakan menggunakan bentuk platform: 422 ANTIVIRUS_BLOCKED {family}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH. MALWARE_DETECTED hilang dan tidak ada nama tanda tangan tidak pernah dikembalikan. Balasan membawa scan {status, keluarga, hasil}; a hold berkas adalah PENDING dan mengkonversi setelah disimpan. Pipeline mengeluarkan tahap 'scanning'. - /register-existing (dedup by reference) menolak konten Antivirus terkunci (422). - Efek suara (raw MinIO) melewati AntivirusUploadGuard (tidak ditahan, 503 ketika turun). - QuarantineStore tidak lagi ada, jadi tidak ada yang ditulis ke bucket karantina; tidak ada di dalamnya tersentuh. - antivirus.hold.verdict (baris tunggu antivirus-hold-completer) -> AntivirusHoldCompleter, lalu konversi biasa untuk dokumen yang dirilis; kegagalan penyimpanan naks untuk pengiriman ulang. - antivirus.signatures.promoted (queue antivirus-recheck) -> AntivirusRecheckService: setiap hash berbendera yang byte-nya disimpan (buka + notifikasi + laporan AUTO_CLEARED) dan CLEAN konten yang pertama kali dilihat dalam 14 hari terakhir (LOCKED_LATER + alerts), disiarkan dari MinIO, satu demi satu, terhenti. pelanggan mencoba lagi sampai aliran antivirus ada. - ConfigMap: kamo.antivirus.* (diaktifkan: salah sampai KamoAntivirus siap); ANTIVIRUS_INTERNAL_AUTH_SECRET dari mlos-internal-auth
· kamo-shared-library
Sebuah keterlibatan milik pasar yang didefinisikan oleh anggota
commerce_engagements.market_id (dilakukan dengan tangan, FK ke commerce_markets, diindeks dengan org_id). Retail orders, service jobs, rental and procurement catatan tidak memiliki kolom pasar sendiri; mereka membacanya dari mereka keterlibatan, cara yang sama mereka membaca akun pelanggan mereka.
· kamo-internal
Antivirus UI — perlindungan menyegel di mana saja berkas muncul, Antivirus Center, tab platform, peringatan dan bantuan
Kit desain (aplikasi/komponen/antivirus): ProtectionSeal dengan lima wajah animasi (Pemeriksaan, Dilindungi, Perhatian, Diblokir, Tidak Dapat Diperiksa; brand + --av-* tokens, gerakan berkurang dihormati), BlockedFileCard / LockedAttachment / LockedOverlay, CautionBanner with Open a Safe Copy, MessageAntivirusBanner, ShieldClip, FalseAlarmDialog ("Saya pikir ini adalah kesalahan"), AntivirusNotReady. Logika dari @kamo/antivirus-core 0.1.0 (seal state, reason parser accepting Antivirus_Blocked / Malware_Detected / Antivirus_Checking / Antivirus_Unavailable / SCAN_Unavailable). Permukaan: jendela membaca surat (segel, bagian yang dihilangkan terkunci dengan nama aslinya, pesan banner, inline images retained, Download All skips them, list-row shield clip, body cache v2), komponis/chat/SMS/SI tray (Pemeriksaan + keadaan terblokir), gelembung chat untuk penerima, dokumen (Pemeriksaan tahap, segel, aksi terkunci, gerbang peringatan), dan toast penolakan pada setiap upload (KB, avatar, karir, bug sistem, suara, dokumen akun/pasien/aplikasi, logo). Antivirus Center di **************** (VIEW_ANTIVIRUS; kebijakan diperlukan MANAGE_ANTIVIRUS_POLICY): orb perlindungan, KPI penghitungan, grafik tren/asal/keluarga, langsung garis waktu ancaman, pengaturan kebijakan dengan bantuan, alarm palsu. tab Platform (MANAGE_PLATFORM_ANTIVIRUS): kesehatan pemindai, rilis dengan refresh/rollback, baris tunggu review, tiga jenis notifikasi, Antivirus dengan panduan, /api/antivirus BFF, cermin untuk ServiceType ANTIVIRUS(41), hak 698-700 dan MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275), dan tujuh artikel pusat bantuan. Komponen widget home Protection telah dibangun tetapi belum terdaftar: launchpad membutuhkan Blok kanan ANTIVIRUS_WIDGET yang belum dimiliki pustaka berbagi.
· KlusterServices
Svc_antivirus login + ANTIVIRUS stream; konversi/email mungkin menghabiskan antivirus.>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, terbitkan antivirus.> dan rt.org.>, subscribe antivirus.> dan _INBOX.> (Secret kamo/nats-user-antivirus, SECRETS.md). - svc_conversion: ANTIVIRUS konsumen API (memegang verdicts, periksa ulang pada promosi), publish/subscribe antivirus.>, publish rt.org.> (verdicts yang direkam memperbarui UI). - svc_email: ANTIVIRUS consumer API (deteksi mail-filter), antivirus.>. - stream-bootstrap Job provisi ANTIVIRUS (R1, 14d) sehingga konsumen dapat mengikat pertama. Divalidasi dengan nats-server -t terhadap server hidup.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit