チェンジログ
何が新しいの?
プラットフォームのすべての改良 それが出荷される
· 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
週間保護レポートにチェックを入れてください(毎時間、組織の地域の月曜日 08: 00)と発生のウォッチ(15分)
· SecurityService
Antivirus API、プラットフォームコントロール、スケジュールエンドポイント;SecurityService 独自のファイルパスをゲート
/api/antivirus/** (およびコンソールプロキシが最初に試みる /api/security/antivirus ツイン): 概要、検出、 プラットフォーム: 状態、署名更新/ロールバック、 偽警報の検証(ALLOWLISTはどこでもロック解除し 人々に知らせる)、Allowlist、 ドリル、爆発 内部: 週間保護レポートとダモンサービスの爆発チェック 生のアップロード(SVGを含むアバター、背景、ロゴ、リードインポート、公開、料金シート)は、アップロード前にスクリーニングされます 500の代わりに 422/423/503に返信します ローン、患者、画像フレームの読み込みは 読み込みゲートを適用します。 kamo.antivirus.enabled は 読み込みゲートが カモウアンチウイルス ステートフルセット 準備完了
· APIService
Route /api/antivirus/** to SecurityService and seal its internal subtree
· KlusterServices
KamoAntivirus mail filter first on inbound smtpd (port 25), tempfail when unreachable
smtpd_milters = { **************** default_action=tempfail }, then rspamd unchanged. Harmful attachments are replaced by a small placeholder part and the message is still delivered; if the filter cannot be reached the sender gets a 4xx and retries. non_smtpd_milters and submission (587) keep rspamd only; postfix-bulk untouched. Milter verified live before this push (milter-protocol client in cluster: test file replaced with the placeholder, clean CSV kept, forged marker stripped).
· EmailService
Antivirus for mail — read gate on every mailbox, milter placeholders, send screening, detections
- Read: every attachment/inline part from any mailbox (Kamo Mail, IMAP providers, Graph; personal and shared routes) is hashed in memory (temp file past 8 MiB, deleted on close), its global verdict looked up and, when unknown, checked by KamoAntivirus (origin MAIL_READ, bytes_stored=false). Harmful = 423 ANTIVIRUS_BLOCKED, not checkable = 423 ANTIVIRUS_CHECKING; reason/family also as X-Kamo-Antivirus-* headers. The SI mail tools read through these routes, so they are gated too. Listing never scans: AttachmentInfo carries **************** only for parts already hashed. - Milter placeholders (X-Kamo-Antivirus-Removed) list under the ORIGINAL name, removed=true, locked; never served or forwarded. X-Kamo-Antivirus message header exposed as EmailMessage.antivirus for the banner. - Send/draft (decision 11): device uploads and pasted images go through AntivirusGate.scanUpload (stored verdicts reused, never rescanned); a forward's parts get the read check. 422 ANTIVIRUS_BLOCKED with fileName, 503 ANTIVIRUS_UNAVAILABLE. - NATS antivirus.detection.mail (queue group antivirus-mail-detections): recipients resolved to members via mailbox holders, personal aliases, shared mailbox readers and alias domains; recorded per member (MAIL_INBOUND, counterparty = sender) so FILE_BLOCKED / THREAT_ALERT go out per org settings. - Notifications: ANTIVIRUS_THREAT_ALERT -> VIEW_ANTIVIRUS (core app, no feature row needed); FILE_BLOCKED/UNLOCKED belong to no app; catalog order. Preview samples for the 4 Antivirus templates. - configmap kamo.antivirus.* (enabled: kamowsantivirus is Ready). Needs kamo-shared-library b6c41d34 (HashUtils BLAKE3 on bcprov 1.70).
· SecurityService
Rental steps, market-filtered lists, and a renter that can move but never be cleared
- GET /rental-requests and /bookings take ?marketId (the caller's own market) and filter by the engagement's market. - POST /rental-requests/{id}/cancel, PUT /rental-requests/{id}/dates, POST /bookings/{id}/check-out | return | cancel, PUT /bookings/{id}/dates (MANAGE_RENTALS), each answering the updated record; a refusal is a 400 with a sentence. - GET /rental-assets/{id}/bookings: the dates an asset is already booked for. - PUT /rental-requests/{id}/account and /bookings/{id}/account refuse a blank account and answer the updated record instead of a bare message. - DELETE /rental-assets/{id} answers 409 with a sentence when the asset has rentals.
· kamo-internal
組織自身の市場によるオーダータブフィルタ
チップと行ラベルは業務ごとに、その最初の名前から名付けられた 2つの小売市場が1つになりました 市場がない古いレコードは あるときは ラインの唯一の市場に それ以外は "<Line> - No Market" グループ。市場が消えた記憶されたフィルタ オールに戻る
· DocsService
DocsService はロックされた文書をすべて拒否し、エディタの保存をチェックします
- WOPI PutFile は raw MinIO に書き込みますので、保存はまず AntivirusUploadGuard を通過します: a 有害なセーブは何も書かず 最後の良い内容を保持し 編集者に返信します 422 ANTIVIRUS_BLOCKED (503 ANTIVIRUS_UNAVAILABLE で再試行);クリーンセーブをマーク GetFile はロック/チェックされたコンテンツを 423 で拒否します。 - イメージング /download, /stream, 変換されたPDFとページサムネイルを呼び出す前に読み込みゲートを呼ぶ 423 ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING 注意 コンテンツが通過したので バルクエクスポートは他の排除と同様にロックされた文書を削除します - バージョンダウンロード/pdf/サムネイルはバージョン自体の内容を判断する。 -キャリア履歴書は応募者と応募書類とともにCAREERSとしてチェックし,キャリアを確認する コントローラは500の代わりに プラットフォームの形でアンチウイルス拒否に答えます - 合法的:自分の422/503に地図の拒否をアップロードし、待ち受けるアップロードは再試行を要求します(そのPDFはこちら) 実行されたパッケージとリクエストのサンプルは 読み込み制限だ バインダーの写真アルバムは 写真をロックしてる - 文書リスト/メタデータ行は scanStatus / scanFamily / scanOutcome を持つ。 - ConfigMap kamo.antivirus.* (有効: KamoAntivirus が準備完了するまで false); mlos-internal-auth からの ANTIVIRUS_INTERNAL_AUTH_SECRET です。
· SecurityService
それぞれの Orders 行は独自の市場名を持っています
行はエンゲージメントから marketId / marketTitle を持っています 2つの小売市場を持つ組織は 最初の市場の名前で 2つではなく 1つから注文が来た。 市場が追跡される前に作成された記録は無効にする。
· KlusterServices
アンチウイルス警告 (スキャナダウン、シグニチャが古い、ミラーゲートが失敗、p95、検出スパイク、バックログを保持)
手作業で施行した(モニタリング/はCIターゲットではない)。
· kamo-shared-library
A rental needs a renter; market on the engagement; cancel, re-date, check out, return and cancel a booking
- createRentalRequest refuses a missing or foreign customer account, records the market (the asset's, else the chosen one) on the engagement, and validates dates and the rate type. Confirm refuses a request with no account. - setRentalRequestAccount / setBookingAccount move the renter to another account and never clear it; both answer the updated record. - Requests: cancel/decoder (IntentStatus.CANCELLED, reason kept) and new dates (with the availability check). Bookings: check out (the booking's FulfillmentOrder IN_PROGRESS), return or end (COMPLETED; CommitmentStatus.FULFILLED; late and damage fees added to the total; condition notes), cancel (VOIDED, before it goes out), and new dates (only the end while out), each checking the asset's other bookings under a row lock on the asset so two confirms cannot double-book. - EngagementLifecycle: a VOIDED commitment commits nothing; all voided and no order is CANCELLED. - A returned booking no longer holds its dates. The asset's held dates are readable (findRentalAssetBookings) for date pickers. - DTOs: marketId/marketTitle on requests, bookings and assets; booking -> rentalRequestUid, rateType, checkedOutAt, returnedAt, fees, notes, cancel reason; request -> cancelReason, bookingStatus. Lists filter by market and load assets, bookings and hand-overs in one query each instead of per row. - Rental assets: description column; market validated as the org's Rental market and movable on update; negative rates refused; duplicate codes refused on update; an asset with rentals on record cannot be deleted (switch it off instead). - Indexes: **************** by engagement, commitments by rental asset, fulfillments by commitment, rental assets by org and market (applied by hand).
· kamo-internal
マーケット-組織の自身の市場、自身の名前で
"商業"は消えた 市場はメンバーが定義する 業種は 種類だけです。 - ナビオプションはマーケットです 1つのマーケットがあるなら 2つ以上の場合は それぞれ1行ずつのメニューが表示されます 市場のタイトル 下の説明 行のアイコン 市場のタブを開きます 1つのキャッシュされたリストは 両方のナビ 発射台とラベル 市場の変化に合わせて更新 - ナビゲーションメニュー行はオプションの説明 (ポポバー、レール、トップバー) を取ります。 -市場表のタイプボックスは「業種」で、各選択肢は ロックされたアプリは必要なアプリを指定します 名前と説明のヘルパーが 何を説明するのかを説明します 会員はマーケットのメニューを見てください - ACCESS_COMMERCE は "Access Markets" を表示します 設定→ビジネスライン
· MediaService
MediaService はアンチウイルスで添付ファイルをチェックし、読み込むたびにロックされたファイルを拒否します
- チャットアタッチメント(メンバーチャット、ウェブチャット訪問者公開)、システムバグファイル、グロースハブ画像 storeContentAddressed内の文脈(メンバー、会話)でチェックされます 拒否はクライアントに プラットフォーム形状 (422) として届きます 500に包まれる代わりに、503のアンティウイルスコードが表示されます。 - メッセージバックグラウンド (raw MinIO, public bucket) はまず AntivirusUploadGuard を通過します。 - /attachments/link (dedup by hash) はコンテンツを拒否します チェックされるまで 読み取れないままです - アップロードの返信、ライブメッセージの添付ファイルにスキャンを行う {状態、家族、結果} フレームと履歴; 保持中は待ち受け - ImagingProxyController(オリジナルとプレビュー)、ビジターダウンロード、システムバグファイル、 Growth Hub 画像、素材、Canva 素材の読み込みは、読み込みゲート: 423 を呼び出します ANTIVIRUS_BLOCKED / ANTIVIRUS_CHECKING、ミッシング・コンテンツ 410 の前にチェックされ、保持されました ファイルは「まだチェック中」と表示されています。プロキシは現在、コンテンツの状態よりも先にメンバーシップをチェックします。 - ConfigMap kamo.antivirus.* (有効: KamoAntivirus が準備完了するまで false); mlos-internal-auth からの ANTIVIRUS_INTERNAL_AUTH_SECRET です。
· ConversionService
ConversionService はアップロードを Antivirus でチェックし、保持されているファイルを完了し、新しい署名を再チェックします
サービス中の clamd クライアントを置き換えます (malware/package, UploadScanGuard, QuarantineStore, 共有ライブラリのアンチウイルスを使って - /upload, /replace, /templates/upload は ImageService 内で行の前にチェックされます オブジェクトは書き込まれています (HOLD 許可); 拒否はプラットフォーム形式を使用します: 422 ANTIVIRUS_BLOCKED {family}, 503 ANTIVIRUS_UNAVAILABLE, 503 HASH_MISMATCH. MALWARE_DETECTED は消えており、検出できません 応答はスキャン {状態, 家族, 結果}を持ちます パイプラインはスキャンステージを出力します。 - /register-existing (参照による削除) はコンテンツを拒否します。 - サウンド効果 (raw MinIO) は AntivirusUploadGuard を通過します (ホールドなし、ダウン時は 503)。 - QuarantineStore はもはや存在しませんので、隔離バケットに何も書き込まれません そこに触れるのです - antivirus.hold.verdict (キュー antivirus-hold-completer) -> AntivirusHoldCompleter そして 解禁された文書は 普通の変換で 再配達は 保管故障のナックスです。 - antivirus.signatures.promoted (キュー antivirus-recheck) -> AntivirusRecheckService: 毎回 バイトが保存されるフラグハッシュ (ロック解除 + 通知 + AUTO_CLEARED レポート) と CLEAN 過去14日間で最初に見たコンテンツ(LOCKED_LATER + アラート) MinIOからストリーミング 一度に一人ずつ 制限されてる アンチウイルスのストリームが存在するまで 再試行する - ConfigMap: kamo.antivirus.* (有効: KamoAntivirus が準備完了するまで false); mlos-internal-auth からの ANTIVIRUS_INTERNAL_AUTH_SECRET です。
· kamo-shared-library
参加はメンバーによって定義された市場に属する
commerce_engagements.market_id (手動で適用 commerce_marketsにFK、 小売りの注文 サービスの仕事 賃貸と調達 レコードには独自の市場コラムはありません 顧客アカウントを読むのと同じです
· kamo-internal
アンチウイルス UI - ファイルが表示される場所全てに保護シール、アンチウイルスセンター、プラットフォームタブ、警告、ヘルプ
デザインキット(アプリケーション/コンポーネント/アンチウイルス):プロテクションシールと5つのアニメーション顔(チェック,検索,検索,検索) プロテクト、注意、ブロック、チェックできませんでした。ブランド + --av-* トークン、減少した動きを尊重します BlockedFileCard / LockedAttachment / LockedOverlay, 安全なコピーを開く警告バナー, メッセージAntivirusBanner, ShieldClip, FalseAlarmDialog ("これは間違いだと思います"), AntivirusNotReady。 @kamo/antivirus-core 0.1.0 からの論理(シール状態、理由はパーサが受け入れない) マルウェア検出/検出/検出/検出/検出/検出 表面:メール読み取り面(封印、取り外した部分を元の名前でロック、メッセージ) バナー インライン画像を隠し ダウンロードすべてスキップ リスト行シールドクリップ ボディキャッシュv2) 作成者/チャット/SMS/SIトレイ (チェック + ブロック状態), 受信者のチャットバブル, 文書 (チェックステージ、シール、ロックされた動作、注意ゲート)、およびすべてのアップロードの拒否トースト (KB,アバター,キャリア,システムバグ,サウンド,アカウント/患者/アプリケーション文書,ロゴ)。 アンチウイルスセンター **************** (VIEW_ANTIVIRUS; 政策の必要性 プロテクションオーブ、カウントアップKPI、トレンド/オリジン/ファミリーチャート、ライブ 脅威のタイムライン 政策の切り替え 偽の警報 スキャナの健康状態、リフレッシュ/ロールバックのあるリリース、レビューキュー、 許可リスト 流行 安全訓練 3種類の通知 アンチウイルスガイドツアー /api/antivirus BFF、ServiceType ANTIVIRUS(41)のミラー、権利698-700および MANAGE_PLATFORM_ANTIVIRUS (shared-lib 332f7275) と 7 つのヘルプセンター記事。 プロテクションホームウィジェットコンポーネントがビルドされていますが、登録されていません。ランチャーパッドには、プロテクションホームウィジェットコンポーネントの登録が必要です 共有ライブラリがまだ持っていない右ブロック。
· KlusterServices
Svc_antivirus login + ANTIVIRUS ストリーム; 変換/メールはアンチウイルスを消費します。>
- svc_antivirus: STREAM.INFO/CREATE ANTIVIRUS, antivirus.> と rt.org.> を公開 antivirus.>と_INBOX.>(秘密のカモ/nats-user-antivirus, SECRETS.md) に加入してください。 - svc_conversion: ANTIVIRUS 消費者アプリケーションインタフェース (判断を保持し、プロモーションを再チェック) rt.org を公開すると UI が更新されます。 - svc_email: ANTIVIRUS 消費者 API (メールフィルタ検出)、アンチウイルス。 - ストリームブートストラップ 消費者が最初にバインドできるように、ジョブプロビジョニング ANTIVIRUS (R1, 14d)。 nats-server -t でライブサーバに対して検証しました。
