diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 26c1a31a..0414451b 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -3337,6 +3337,8 @@ "cadencesTitle": "報告節奏與 AI 閱讀後分析", "workloadTitle": "每個 Agent 工作狀態報告", "analysisTitle": "報告後 AI 解法與風險邊界", + "deliveryTitle": "Telegram 報告實發批准包", + "deliveryGuardTitle": "路由鎖 / 無發送回執保護", "metrics": { "reports": "報告完成", "charts": "圖表區塊", @@ -3344,6 +3346,20 @@ "analysisPackets": "分析包", "lowMedium": "低中風險", "highRisk": "高風險" + }, + "deliveryMetrics": { + "packets": "批准包", + "routes": "路由鎖", + "redaction": "遮蔽檢查", + "receipts": "Dry-run 回執", + "liveSend": "實發次數" + }, + "deliveryTruth": { + "scheduler": "排程", + "queue": "Gateway 佇列", + "botApi": "Bot API", + "receiptWrite": "回執寫入", + "note": "真相註記" } }, "metrics": { diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 26c1a31a..0414451b 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -3337,6 +3337,8 @@ "cadencesTitle": "報告節奏與 AI 閱讀後分析", "workloadTitle": "每個 Agent 工作狀態報告", "analysisTitle": "報告後 AI 解法與風險邊界", + "deliveryTitle": "Telegram 報告實發批准包", + "deliveryGuardTitle": "路由鎖 / 無發送回執保護", "metrics": { "reports": "報告完成", "charts": "圖表區塊", @@ -3344,6 +3346,20 @@ "analysisPackets": "分析包", "lowMedium": "低中風險", "highRisk": "高風險" + }, + "deliveryMetrics": { + "packets": "批准包", + "routes": "路由鎖", + "redaction": "遮蔽檢查", + "receipts": "Dry-run 回執", + "liveSend": "實發次數" + }, + "deliveryTruth": { + "scheduler": "排程", + "queue": "Gateway 佇列", + "botApi": "Bot API", + "receiptWrite": "回執寫入", + "note": "真相註記" } }, "metrics": { diff --git a/apps/web/src/app/[locale]/governance/tabs/agent-market-tab.tsx b/apps/web/src/app/[locale]/governance/tabs/agent-market-tab.tsx index 37c23aa4..6b473e3f 100644 --- a/apps/web/src/app/[locale]/governance/tabs/agent-market-tab.tsx +++ b/apps/web/src/app/[locale]/governance/tabs/agent-market-tab.tsx @@ -14,7 +14,13 @@ import { useTranslations } from 'next-intl' import { GlassCard } from '@/components/ui/glass-card' import { StatusOrb } from '@/components/ui/status-orb' import { AgentActivityConstellation } from '@/components/governance/agent-activity-constellation' -import { apiClient, type AgentMarketGovernanceSnapshot, type AiTechnologyRadarReadback, type AiTechnologyReportCadenceReadback } from '@/lib/api-client' +import { + apiClient, + type AgentMarketGovernanceSnapshot, + type AiAgentReportLiveDeliveryApprovalPackageSnapshot, + type AiTechnologyRadarReadback, + type AiTechnologyReportCadenceReadback, +} from '@/lib/api-client' // ============================================================================= // Helpers @@ -432,6 +438,132 @@ function PostReportAnalysisCard({ packet }: { packet: AiTechnologyReportCadenceR ) } +function DeliveryApprovalPacketCard({ packet }: { packet: AiAgentReportLiveDeliveryApprovalPackageSnapshot['delivery_approval_packets'][number] }) { + const tone = packet.risk_tier === 'critical' ? '#DC2626' : packet.risk_tier === 'high' ? '#F59E0B' : '#d97757' + return ( +
+
+
+ + {packet.display_name} + +
+ + + +
+
+ + {packet.risk_tier} + +
+ +
+ {packet.required_approval_fields.map(field => ( + + ))} +
+
+ +
+ {packet.blocked_runtime_actions.map(action => ( + + ))} +
+
+ + {packet.operator_guidance} + +
+ ) +} + +function DeliveryGateCard({ gate }: { gate: AiAgentReportLiveDeliveryApprovalPackageSnapshot['route_lock_gates'][number] }) { + return ( +
+
+ + {gate.display_name} + + +
+ +
+ {gate.blocked_routes.map(route => ( + + ))} +
+
+ +
+ + + +
+
+
+ ) +} + +function DryRunReceiptCard({ receipt }: { receipt: AiAgentReportLiveDeliveryApprovalPackageSnapshot['dry_run_delivery_receipts'][number] }) { + return ( +
+
+ + {receipt.display_name} + + +
+
+ + + +
+ +
+ {receipt.required_fields.map(field => ( + + ))} +
+
+
+ ) +} + // ============================================================================= // Component // ============================================================================= @@ -441,6 +573,7 @@ export function AgentMarketTab() { const [snapshot, setSnapshot] = useState(null) const [technologyRadar, setTechnologyRadar] = useState(null) const [technologyReportCadence, setTechnologyReportCadence] = useState(null) + const [reportDeliveryApproval, setReportDeliveryApproval] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(false) @@ -450,11 +583,13 @@ export function AgentMarketTab() { apiClient.getAgentMarketGovernanceSnapshot(), apiClient.getAiTechnologyRadarReadback(), apiClient.getAiTechnologyReportCadenceReadback(), + apiClient.getAiAgentReportLiveDeliveryApprovalPackage(), ]) - .then(([marketSnapshot, radarReadback, reportCadenceReadback]) => { + .then(([marketSnapshot, radarReadback, reportCadenceReadback, deliveryApprovalPackage]) => { setSnapshot(marketSnapshot) setTechnologyRadar(radarReadback) setTechnologyReportCadence(reportCadenceReadback) + setReportDeliveryApproval(deliveryApprovalPackage) setError(false) }) .catch(() => setError(true)) @@ -479,7 +614,7 @@ export function AgentMarketTab() { ) } - if (error || !snapshot || !technologyRadar || !technologyReportCadence) { + if (error || !snapshot || !technologyRadar || !technologyReportCadence || !reportDeliveryApproval) { return (
@@ -516,6 +651,7 @@ export function AgentMarketTab() { const summary = snapshot.summary const radarSummary = technologyRadar.summary const reportSummary = technologyReportCadence.summary + const deliveryRollups = reportDeliveryApproval.rollups const allApprovals = summary.priority_upgrades_approved + summary.market_scorecard_updates_approved + @@ -636,6 +772,97 @@ export function AgentMarketTab() {
+ +
+
+
+ + + {t('technologyReports.deliveryTitle')} + +
+
+ + +
+
+ +
+ + + + + +
+ +
+ + + + + + + + + + + + +
+ + + {reportDeliveryApproval.delivery_approval_truth.truth_note} + + +
+ {reportDeliveryApproval.delivery_approval_packets.map(packet => ( + + ))} +
+
+
+ + +
+
+ + + {t('technologyReports.deliveryGuardTitle')} + +
+
+ {reportDeliveryApproval.route_lock_gates.map(gate => ( + + ))} +
+
+ {reportDeliveryApproval.dry_run_delivery_receipts.map(receipt => ( + + ))} +
+
+
+
@@ -1198,6 +1425,11 @@ export function AgentMarketTab() { .agent-market-report-cadence-grid, .agent-market-report-workload-grid, .agent-market-report-analysis-grid, + .agent-market-delivery-metrics-grid, + .agent-market-delivery-gate-grid, + .agent-market-delivery-packet-grid, + .agent-market-delivery-guard-grid, + .agent-market-delivery-receipt-grid, .agent-market-health-grid, .agent-market-cadence-grid, .agent-market-decision-grid,