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,