fix(web): expose autonomous runtime readback marker [skip ci]

This commit is contained in:
Your Name
2026-06-28 20:52:10 +08:00
parent 4825844f8f
commit 00a0f1ffc3
4 changed files with 82 additions and 1 deletions

View File

@@ -3699,6 +3699,14 @@
"overrideTitle": "舊規範覆寫",
"hardBlockerTitle": "仍維持硬阻擋",
"hardBlockerDetail": "需 break-glass 或專案級合約,不由一般自動化靜默執行。",
"readback": {
"marker": "Production v2 marker",
"markerDetail": "{task} · {status}",
"executor": "live ansible_apply_executed",
"executorDetail": "post verifier {verifier} · KM {km} · Telegram {telegram}",
"loop": "latest flow closed",
"loopDetail": "MCP {mcp} · RAG {rag} · PlayBook {playbook}"
},
"badges": {
"override": "舊 no-send / no-live 已覆寫",
"gateway": "Telegram Gateway",

View File

@@ -3699,6 +3699,14 @@
"overrideTitle": "舊規範覆寫",
"hardBlockerTitle": "仍維持硬阻擋",
"hardBlockerDetail": "需 break-glass 或專案級合約,不由一般自動化靜默執行。",
"readback": {
"marker": "Production v2 marker",
"markerDetail": "{task} · {status}",
"executor": "live ansible_apply_executed",
"executorDetail": "post verifier {verifier} · KM {km} · Telegram {telegram}",
"loop": "latest flow closed",
"loopDetail": "MCP {mcp} · RAG {rag} · PlayBook {playbook}"
},
"badges": {
"override": "舊 no-send / no-live 已覆寫",
"gateway": "Telegram Gateway",

View File

@@ -847,6 +847,50 @@ function GateMatrixRow({
)
}
function AutonomousRuntimeControlReadbackGrid({
control,
t,
}: {
control: AiAgentAutonomousRuntimeControlSnapshot
t: ReturnType<typeof useTranslations>
}) {
const rollups = control.rollups
return (
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, minmax(0, 1fr))', gap: 10 }} className="automation-inventory-current-autonomy-readback-grid">
<GateMatrixRow
label={t('globalControl.currentAutonomy.readback.marker')}
value={control.program_status.deploy_readback_marker}
detail={t('globalControl.currentAutonomy.readback.markerDetail', {
task: control.program_status.current_task_id,
status: control.program_status.status,
})}
tone="ok"
/>
<GateMatrixRow
label={t('globalControl.currentAutonomy.readback.executor')}
value={String(rollups.live_ansible_apply_executed_count ?? 0)}
detail={t('globalControl.currentAutonomy.readback.executorDetail', {
verifier: rollups.live_post_apply_verifier_count ?? 0,
km: rollups.live_km_writeback_count ?? 0,
telegram: rollups.live_telegram_receipt_count ?? 0,
})}
tone={(rollups.live_ansible_apply_executed_count ?? 0) > 0 ? 'ok' : 'warn'}
/>
<GateMatrixRow
label={t('globalControl.currentAutonomy.readback.loop')}
value={String(rollups.live_executor_latest_flow_closed_count ?? 0)}
detail={t('globalControl.currentAutonomy.readback.loopDetail', {
mcp: rollups.mcp_sensor_count ?? 0,
rag: rollups.rag_context_query_count ?? 0,
playbook: rollups.playbook_decision_class_count ?? 0,
})}
tone={(rollups.live_executor_latest_flow_closed_count ?? 0) > 0 ? 'ok' : 'warn'}
/>
</div>
)
}
function AutonomousRuntimeControlPriorityPanel({
control,
t,
@@ -895,6 +939,8 @@ function AutonomousRuntimeControlPriorityPanel({
</div>
</div>
<AutonomousRuntimeControlReadbackGrid control={control} t={t} />
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(128px, 1fr))', gap: 10 }} className="automation-inventory-global-control-kpi-grid">
<MetricCard label={t('globalControl.currentAutonomy.metrics.completion')} value={`${control.program_status.implementation_completion_percent}%`} tone="ok" icon={<Gauge size={16} />} />
<MetricCard label={t('globalControl.currentAutonomy.metrics.riskTiers')} value={`${control.rollups.automated_risk_tier_count}/3`} tone={control.rollups.automated_risk_tier_count === 3 ? 'ok' : 'warn'} icon={<ShieldCheck size={16} />} />
@@ -1085,6 +1131,12 @@ export function AutomationInventoryTab() {
.catch(() => undefined)
}
const fetchAutonomousRuntimeControlReadback = () => {
apiClient.getAiAgentAutonomousRuntimeControl()
.then(value => setAutonomousRuntimeControl(sanitizePublicSnapshot(value)))
.catch(() => undefined)
}
const fetchSnapshot = () => {
setLoading(true)
const requests = [
@@ -1272,7 +1324,7 @@ export function AutomationInventoryTab() {
] = results
setSnapshot(settledPublicValue(inventoryResult))
setAutonomousRuntimeControl(settledPublicValue(autonomousRuntimeControlResult))
setAutonomousRuntimeControl(previous => settledPublicValue(autonomousRuntimeControlResult) ?? previous)
setBacklog(settledPublicValue(backlogResult))
setBackupTargets(settledPublicValue(targetResult))
setBackupReadiness(settledPublicValue(readinessResult))
@@ -1458,6 +1510,7 @@ export function AutomationInventoryTab() {
useEffect(() => {
fetchReportTruthQuickView()
fetchAutonomousRuntimeControlReadback()
fetchSnapshot()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
@@ -6500,6 +6553,8 @@ export function AutomationInventoryTab() {
</div>
</div>
<AutonomousRuntimeControlReadbackGrid control={autonomousRuntimeControl} t={t} />
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(128px, 1fr))', gap: 10 }} className="automation-inventory-global-control-kpi-grid">
<MetricCard label={t('globalControl.currentAutonomy.metrics.completion')} value={`${autonomousRuntimeControl.program_status.implementation_completion_percent}%`} tone="ok" icon={<Gauge size={16} />} />
<MetricCard label={t('globalControl.currentAutonomy.metrics.riskTiers')} value={`${autonomousRuntimeControl.rollups.automated_risk_tier_count}/3`} tone={autonomousRuntimeControl.rollups.automated_risk_tier_count === 3 ? 'ok' : 'warn'} icon={<ShieldCheck size={16} />} />
@@ -20063,6 +20118,7 @@ export function AutomationInventoryTab() {
.automation-inventory-visual-grid,
.automation-inventory-stage-grid,
.automation-inventory-visual-factor-grid,
.automation-inventory-current-autonomy-readback-grid,
.automation-inventory-global-control-kpi-grid,
.automation-inventory-global-control-grid,
.automation-inventory-global-control-pipeline-grid,

View File

@@ -2189,6 +2189,15 @@ export interface AiAgentAutonomousRuntimeControlSnapshot {
controlled_executor_operation_receipt_count: number
runtime_write_receipt_type_count: number
legacy_policy_overridden_count: number
live_ansible_apply_executed_count?: number
live_executor_latest_flow_closed_count?: number
live_km_writeback_count?: number
live_post_apply_verifier_count?: number
live_telegram_receipt_count?: number
mcp_sensor_count?: number
rag_context_query_count?: number
playbook_decision_class_count?: number
deploy_control_classifier_example_count?: number
}
}