|
|
|
|
@@ -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,
|
|
|
|
|
|