feat(mcp): expose verified replay receipts

This commit is contained in:
ogt
2026-07-15 11:56:08 +08:00
parent 7cd0f69475
commit 8a314a8373
7 changed files with 231 additions and 10 deletions

View File

@@ -38,6 +38,14 @@ interface Capability extends CapabilitySummary {
digest_state: string
sbom_state: string
signature_state: string
compatibility_state?: string
replay_status?: string
replay_protocol_version?: string
replay_server_version?: string
replay_tool_count?: number
replay_run_id?: string
replay_independent_verifier?: boolean
replay_promotion_allowed?: boolean
rag_policy: string
blockers: string[]
}
@@ -633,7 +641,7 @@ export default function McpControlPlanePage({ params }: { params: { locale: stri
</div>
</div>
<div className="mt-4 max-w-full overflow-x-auto overscroll-x-contain">
<table className="min-w-[980px] w-full border-collapse text-left text-xs">
<table className="min-w-[1160px] w-full border-collapse text-left text-xs">
<caption className="sr-only">{t('external.caption')}</caption>
<thead>
<tr className="border-b border-[#dedbd1] text-[#6c685f]">
@@ -643,6 +651,7 @@ export default function McpControlPlanePage({ params }: { params: { locale: stri
<th className="px-3 py-3 font-semibold">{t('external.columns.scope')}</th>
<th className="px-3 py-3 font-semibold">{t('external.columns.version')}</th>
<th className="px-3 py-3 font-semibold">{t('external.columns.supply')}</th>
<th className="px-3 py-3 font-semibold">{t('external.columns.replay')}</th>
<th className="px-3 py-3 font-semibold">{t('external.columns.promote')}</th>
</tr>
</thead>
@@ -662,8 +671,32 @@ export default function McpControlPlanePage({ params }: { params: { locale: stri
) : null}
</td>
<td className="px-3 py-3 text-[#5f5b54]">{item.digest_state} / {item.sbom_state} / {item.signature_state}</td>
<td className="px-3 py-3 text-[#5f5b54]">
{item.compatibility_state === 'protocol_schema_compatibility_verified'
&& item.replay_status === 'completed_protocol_schema_replay_verified'
&& item.replay_independent_verifier === true ? (
<div>
<div className="font-semibold text-[#17602a]">{t('external.replay.verified')}</div>
<div className="mt-1 text-[10px] text-[#6c685f]">
{t('external.replay.protocolTools', {
protocol: item.replay_protocol_version ?? '--',
tools: item.replay_tool_count ?? 0,
})}
</div>
<div
className="mt-1 font-mono text-[10px] text-[#8a867e]"
title={item.replay_run_id}
>
{t('external.replay.receipt', { id: item.replay_run_id?.slice(0, 8) ?? '--' })}
</div>
</div>
) : (
<span className="text-[#8b5e18]">{t('external.replay.pending')}</span>
)}
</td>
<td className="px-3 py-3">
{item.deployment_allowed ? <CheckCircle2 className="h-4 w-4 text-[#2f7d54]" aria-label={t('external.allowed')} /> : <XCircle className="h-4 w-4 text-[#b2432d]" aria-label={t('external.blocked')} />}
<p className="mt-1 text-[10px] text-[#8a867e]">{t('external.blockerCount', { count: item.blockers.length })}</p>
</td>
</tr>
))}