|
|
|
|
@@ -41,6 +41,7 @@ import { redactPublicIdentifier } from '@/lib/public-security-redaction'
|
|
|
|
|
import {
|
|
|
|
|
apiClient,
|
|
|
|
|
type AiAgent12AgentWarRoomSnapshot,
|
|
|
|
|
type AiAgentProfessionalTaskExpansionSnapshot,
|
|
|
|
|
type AiAgentCandidateOperationDryRunEvidenceSnapshot,
|
|
|
|
|
type AiAgentCriticReviewerResultCaptureSnapshot,
|
|
|
|
|
type AiAgentDeploymentLayoutSnapshot,
|
|
|
|
|
@@ -463,6 +464,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
const [providerRouteMatrix, setProviderRouteMatrix] = useState<AiProviderRouteMatrixSnapshot | null>(null)
|
|
|
|
|
const [deploymentLayout, setDeploymentLayout] = useState<AiAgentDeploymentLayoutSnapshot | null>(null)
|
|
|
|
|
const [warRoom, setWarRoom] = useState<AiAgent12AgentWarRoomSnapshot | null>(null)
|
|
|
|
|
const [professionalTaskExpansion, setProfessionalTaskExpansion] = useState<AiAgentProfessionalTaskExpansionSnapshot | null>(null)
|
|
|
|
|
const [proactiveOperations, setProactiveOperations] = useState<AiAgentProactiveOperationsContractSnapshot | null>(null)
|
|
|
|
|
const [interactionLearningProof, setInteractionLearningProof] = useState<AiAgentInteractionLearningProofSnapshot | null>(null)
|
|
|
|
|
const [liveReadModelGate, setLiveReadModelGate] = useState<AiAgentLiveReadModelGateSnapshot | null>(null)
|
|
|
|
|
@@ -545,6 +547,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
apiClient.getAiProviderRouteMatrix(),
|
|
|
|
|
apiClient.getAiAgentDeploymentLayout(),
|
|
|
|
|
apiClient.getAiAgent12AgentWarRoom(),
|
|
|
|
|
apiClient.getAiAgentProfessionalTaskExpansion(),
|
|
|
|
|
apiClient.getAiAgentProactiveOperationsContract(),
|
|
|
|
|
apiClient.getAiAgentInteractionLearningProof(),
|
|
|
|
|
apiClient.getAiAgentLiveReadModelGate(),
|
|
|
|
|
@@ -626,6 +629,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
providerRouteMatrixResult,
|
|
|
|
|
deploymentLayoutResult,
|
|
|
|
|
warRoomResult,
|
|
|
|
|
professionalTaskExpansionResult,
|
|
|
|
|
proactiveOperationsResult,
|
|
|
|
|
interactionLearningProofResult,
|
|
|
|
|
liveReadModelGateResult,
|
|
|
|
|
@@ -704,6 +708,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
setProviderRouteMatrix(providerRouteMatrixResult.status === 'fulfilled' ? providerRouteMatrixResult.value : null)
|
|
|
|
|
setDeploymentLayout(deploymentLayoutResult.status === 'fulfilled' ? deploymentLayoutResult.value : null)
|
|
|
|
|
setWarRoom(warRoomResult.status === 'fulfilled' ? warRoomResult.value : null)
|
|
|
|
|
setProfessionalTaskExpansion(professionalTaskExpansionResult.status === 'fulfilled' ? professionalTaskExpansionResult.value : null)
|
|
|
|
|
setProactiveOperations(proactiveOperationsResult.status === 'fulfilled' ? proactiveOperationsResult.value : null)
|
|
|
|
|
setInteractionLearningProof(interactionLearningProofResult.status === 'fulfilled' ? interactionLearningProofResult.value : null)
|
|
|
|
|
setLiveReadModelGate(liveReadModelGateResult.status === 'fulfilled' ? liveReadModelGateResult.value : null)
|
|
|
|
|
@@ -780,6 +785,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
providerRouteMatrixResult,
|
|
|
|
|
deploymentLayoutResult,
|
|
|
|
|
warRoomResult,
|
|
|
|
|
professionalTaskExpansionResult,
|
|
|
|
|
proactiveOperationsResult,
|
|
|
|
|
interactionLearningProofResult,
|
|
|
|
|
liveReadModelGateResult,
|
|
|
|
|
@@ -2094,7 +2100,7 @@ export function AutomationInventoryTab() {
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !warRoom || !proactiveOperations || !interactionLearningProof || !liveReadModelGate || !redisDryRunGate || !learningWritebackPackage || !telegramReceiptPackage || !ownerApprovedLearningDryRun || !runtimeWriteGateReview || !postWriteVerifierPackage || !runtimeVerifierEvidenceReview || !reportAutomationReview || !reportStatusBoard || !reportRuntimeReadiness || !reportRuntimeDryRun || !reportRuntimeFixtureReadback || !runtimeWorkerShadowGate || !operationPermissionModel || !candidateOperationDryRunEvidence || !taskResultAuditTrail || !matchedPlaybookLearningGap || !criticReviewerResultCapture || !ownerApprovedResultCaptureDryRun || !ownerApprovedResultCaptureReadback || !runtimeReadbackApprovalPackage || !runtimeReadbackImplementationReview || !reportLiveDeliveryApprovalPackage || !runtimeReadbackFixtureApproval || !runtimeReadbackPromotionGate || !ownerApprovedFixturePromotionGate || !canonicalRuntimeReadbackOwnerAcceptance || !failureReceiptNoSendReplay || !reviewerQueueNoWriteReadback || !resultCaptureNoWriteReadback || !resultCapturePromotionApprovalGate || !ownerApprovedResultCapturePromotionDryRun || !resultCaptureWriteGateReview || !resultCaptureWriterImplementationReview || !resultCaptureWriterDryRunFixture || !resultCaptureWriterDryRunReadback || !resultCaptureOwnerPromotionReview || !resultCaptureOwnerApprovedExecutionRehearsal || !resultCaptureOwnerAcceptanceMaintenanceGate || !resultCaptureOwnerAcceptanceReadbackPreflightHold || !resultCaptureOwnerApprovedPreflightReleasePackage || !resultCaptureOwnerApprovedReleaseReadinessReadback || !resultCaptureOwnerReleaseApprovalGate || !resultCapturePostReleaseVerifierRollbackGate || !resultCaptureFinalReleaseCandidateReadback || !resultCaptureReleaseAuthorizationHold || !resultCaptureReleaseAuthorizationReadbackGate || !resultCaptureReleaseVerifierPreflightGate || !resultCaptureReleaseVerifierOwnerReviewPacket || !resultCaptureReleaseDecisionHold || !resultCaptureReleaseDecisionReadback || !resultCaptureReleaseDecisionNextHandoff || !resultCaptureReleaseDecisionInputPrep || !resultCaptureReleaseDecisionOwnerResponsePreflight || !resultCaptureReleaseDecisionOwnerResponseReadback || !resultCaptureReleaseDecisionOwnerResponseAcceptanceGate || !reportTruthActionabilityReview || !ownerDryRunPackage || !hostStatefulInventory || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) {
|
|
|
|
|
if (error || !snapshot || !backlog || !backupTargets || !backupReadiness || !backupPolicy || !offsiteEscrow || !giteaHealth || !observabilityMatrix || !providerRouteMatrix || !deploymentLayout || !warRoom || !professionalTaskExpansion || !proactiveOperations || !interactionLearningProof || !liveReadModelGate || !redisDryRunGate || !learningWritebackPackage || !telegramReceiptPackage || !ownerApprovedLearningDryRun || !runtimeWriteGateReview || !postWriteVerifierPackage || !runtimeVerifierEvidenceReview || !reportAutomationReview || !reportStatusBoard || !reportRuntimeReadiness || !reportRuntimeDryRun || !reportRuntimeFixtureReadback || !runtimeWorkerShadowGate || !operationPermissionModel || !candidateOperationDryRunEvidence || !taskResultAuditTrail || !matchedPlaybookLearningGap || !criticReviewerResultCapture || !ownerApprovedResultCaptureDryRun || !ownerApprovedResultCaptureReadback || !runtimeReadbackApprovalPackage || !runtimeReadbackImplementationReview || !reportLiveDeliveryApprovalPackage || !runtimeReadbackFixtureApproval || !runtimeReadbackPromotionGate || !ownerApprovedFixturePromotionGate || !canonicalRuntimeReadbackOwnerAcceptance || !failureReceiptNoSendReplay || !reviewerQueueNoWriteReadback || !resultCaptureNoWriteReadback || !resultCapturePromotionApprovalGate || !ownerApprovedResultCapturePromotionDryRun || !resultCaptureWriteGateReview || !resultCaptureWriterImplementationReview || !resultCaptureWriterDryRunFixture || !resultCaptureWriterDryRunReadback || !resultCaptureOwnerPromotionReview || !resultCaptureOwnerApprovedExecutionRehearsal || !resultCaptureOwnerAcceptanceMaintenanceGate || !resultCaptureOwnerAcceptanceReadbackPreflightHold || !resultCaptureOwnerApprovedPreflightReleasePackage || !resultCaptureOwnerApprovedReleaseReadinessReadback || !resultCaptureOwnerReleaseApprovalGate || !resultCapturePostReleaseVerifierRollbackGate || !resultCaptureFinalReleaseCandidateReadback || !resultCaptureReleaseAuthorizationHold || !resultCaptureReleaseAuthorizationReadbackGate || !resultCaptureReleaseVerifierPreflightGate || !resultCaptureReleaseVerifierOwnerReviewPacket || !resultCaptureReleaseDecisionHold || !resultCaptureReleaseDecisionReadback || !resultCaptureReleaseDecisionNextHandoff || !resultCaptureReleaseDecisionInputPrep || !resultCaptureReleaseDecisionOwnerResponsePreflight || !resultCaptureReleaseDecisionOwnerResponseReadback || !resultCaptureReleaseDecisionOwnerResponseAcceptanceGate || !reportTruthActionabilityReview || !ownerDryRunPackage || !hostStatefulInventory || !serviceHealthGapMatrix || !serviceHealthNotificationPolicy) {
|
|
|
|
|
return (
|
|
|
|
|
<div style={{ padding: 20 }}>
|
|
|
|
|
<GlassCard variant="subtle" padding="lg">
|
|
|
|
|
@@ -3666,6 +3672,34 @@ export function AutomationInventoryTab() {
|
|
|
|
|
warRoom.display_redaction_contract.conversation_transcript_display_allowed === false
|
|
|
|
|
&& warRoom.display_redaction_contract.redaction_required === true
|
|
|
|
|
)
|
|
|
|
|
const professionalTaskOverall = professionalTaskExpansion.program_status.overall_completion_percent
|
|
|
|
|
const professionalTaskTotal = professionalTaskExpansion.rollups.professional_task_count
|
|
|
|
|
const professionalTaskDomains = professionalTaskExpansion.rollups.domain_count
|
|
|
|
|
const professionalTaskTelegramStages = professionalTaskExpansion.rollups.telegram_stage_count
|
|
|
|
|
const professionalTaskMessageTypes = professionalTaskExpansion.rollups.telegram_message_type_count
|
|
|
|
|
const professionalTaskApprovals = professionalTaskExpansion.rollups.approval_required_count
|
|
|
|
|
const professionalTaskHighCritical = (
|
|
|
|
|
professionalTaskExpansion.rollups.high_risk_task_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.critical_risk_task_count
|
|
|
|
|
)
|
|
|
|
|
const professionalTaskLiveWrites = (
|
|
|
|
|
professionalTaskExpansion.rollups.current_live_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.gateway_queue_write_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.telegram_send_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.bot_api_call_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.delivery_receipt_write_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.production_write_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.secret_read_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.paid_api_call_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.host_write_count
|
|
|
|
|
+ professionalTaskExpansion.rollups.kubectl_action_count
|
|
|
|
|
)
|
|
|
|
|
const professionalTaskRedactionLocked = (
|
|
|
|
|
professionalTaskExpansion.redaction_contract.conversation_transcript_display_allowed === false
|
|
|
|
|
&& professionalTaskExpansion.redaction_contract.telegram_message_must_be_sanitized === true
|
|
|
|
|
&& professionalTaskExpansion.redaction_contract.redaction_required === true
|
|
|
|
|
)
|
|
|
|
|
const visibleProfessionalTasks = professionalTaskExpansion.professional_tasks.slice(0, 8)
|
|
|
|
|
const backlogProgressPercent = backlog.progress_summary.overall_percent
|
|
|
|
|
const explicitApprovalItemCount = backlog.item_approval_boundary_rollup.items_requiring_explicit_approval.length
|
|
|
|
|
const taskBoundaryCount = snapshot.task_approval_boundary_rollup.total_tasks
|
|
|
|
|
@@ -4052,6 +4086,98 @@ export function AutomationInventoryTab() {
|
|
|
|
|
</div>
|
|
|
|
|
</GlassCard>
|
|
|
|
|
|
|
|
|
|
<GlassCard variant="subtle" padding="md">
|
|
|
|
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 13, minWidth: 0 }}>
|
|
|
|
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12, flexWrap: 'wrap' }}>
|
|
|
|
|
<div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>
|
|
|
|
|
<Boxes size={15} style={{ color: '#176d8a' }} />
|
|
|
|
|
<span style={{ fontFamily: 'Syne, sans-serif', fontSize: 14, fontWeight: 700, color: '#141413' }}>
|
|
|
|
|
{t('professionalTaskExpansion.title')}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, justifyContent: 'flex-end' }}>
|
|
|
|
|
<Chip
|
|
|
|
|
value={t('professionalTaskExpansion.source', {
|
|
|
|
|
generated: formatDateTime(professionalTaskExpansion.generated_at),
|
|
|
|
|
current: professionalTaskExpansion.program_status.current_task_id,
|
|
|
|
|
next: professionalTaskExpansion.program_status.next_task_id,
|
|
|
|
|
})}
|
|
|
|
|
muted
|
|
|
|
|
/>
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.runtime', { value: professionalTaskExpansion.program_status.runtime_authority })} muted />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<p style={{ margin: 0, fontFamily: "'DM Mono', monospace", fontSize: 11, lineHeight: 1.55, color: '#5c5a55', overflowWrap: 'anywhere' }}>
|
|
|
|
|
{professionalTaskExpansion.program_status.status_note}
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(128px, 1fr))', gap: 10 }} className="automation-inventory-live-read-kpi-grid">
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.overall')} value={`${professionalTaskOverall}%`} tone="warn" icon={<Gauge size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.tasks')} value={professionalTaskTotal} tone="neutral" icon={<Boxes size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.domains')} value={professionalTaskDomains} tone="neutral" icon={<Layers3 size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.telegramStages')} value={professionalTaskTelegramStages} tone="warn" icon={<BellRing size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.messageTypes')} value={professionalTaskMessageTypes} tone="neutral" icon={<FileText size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.approvals')} value={professionalTaskApprovals} tone="warn" icon={<ShieldAlert size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.highCritical')} value={professionalTaskHighCritical} tone="danger" icon={<AlertTriangle size={16} />} />
|
|
|
|
|
<MetricCard label={t('professionalTaskExpansion.metrics.liveWrites')} value={professionalTaskLiveWrites} tone={professionalTaskLiveWrites === 0 ? 'ok' : 'danger'} icon={<BellOff size={16} />} />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 10 }}>
|
|
|
|
|
<div style={{ padding: 10, border: '0.5px solid #c8d2e3', borderRadius: 7, background: '#fff', minWidth: 0 }}>
|
|
|
|
|
<SmallLabel>{t('professionalTaskExpansion.telegramTitle')}</SmallLabel>
|
|
|
|
|
<p style={{ margin: '6px 0 8px', fontFamily: "'DM Mono', monospace", fontSize: 10, lineHeight: 1.5, color: '#5c5a55', overflowWrap: 'anywhere' }}>
|
|
|
|
|
{professionalTaskExpansion.telegram_runtime_bridge.canonical_room}
|
|
|
|
|
</p>
|
|
|
|
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.gateway', { value: String(professionalTaskExpansion.telegram_runtime_bridge.gateway_required) })} />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.noSend', { value: String(professionalTaskExpansion.telegram_runtime_bridge.no_send_preview_ready) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.queuePreview', { value: String(professionalTaskExpansion.telegram_runtime_bridge.queue_preview_readback_ready) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.directBot', { value: String(professionalTaskExpansion.telegram_runtime_bridge.direct_bot_api_allowed) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.send', { value: String(professionalTaskExpansion.telegram_runtime_bridge.telegram_send_enabled) })} muted />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div style={{ padding: 10, border: '0.5px solid #c8d2e3', borderRadius: 7, background: '#fff', minWidth: 0 }}>
|
|
|
|
|
<SmallLabel>{t('professionalTaskExpansion.redactionTitle')}</SmallLabel>
|
|
|
|
|
<p style={{ margin: '6px 0 8px', fontFamily: "'DM Mono', monospace", fontSize: 10, lineHeight: 1.5, color: '#5c5a55', overflowWrap: 'anywhere' }}>
|
|
|
|
|
{redactPublicText(professionalTaskExpansion.redaction_contract.frontend_display_policy)}
|
|
|
|
|
</p>
|
|
|
|
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.redaction', { value: String(professionalTaskRedactionLocked) })} />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.gatewayWrites', { value: String(professionalTaskExpansion.rollups.gateway_queue_write_count) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.botCalls', { value: String(professionalTaskExpansion.rollups.bot_api_call_count) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.productionWrites', { value: String(professionalTaskExpansion.rollups.production_write_count) })} muted />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<SmallLabel>{t('professionalTaskExpansion.tasksTitle')}</SmallLabel>
|
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))', gap: 10 }} className="automation-inventory-live-read-card-grid">
|
|
|
|
|
{visibleProfessionalTasks.map(task => {
|
|
|
|
|
const taskTone = task.risk_tier === 'critical' ? 'danger' : task.risk_tier === 'high' ? 'warn' : 'neutral'
|
|
|
|
|
const taskColor = toneColor(taskTone)
|
|
|
|
|
return (
|
|
|
|
|
<div key={task.task_id} style={{ padding: 10, border: `0.5px solid ${taskColor}55`, borderRadius: 7, background: '#fff', display: 'flex', flexDirection: 'column', gap: 7, minWidth: 0 }}>
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'center', minWidth: 0 }}>
|
|
|
|
|
<span style={{ fontFamily: 'Syne, sans-serif', fontSize: 12, fontWeight: 700, color: '#141413', overflowWrap: 'anywhere' }}>
|
|
|
|
|
{task.title}
|
|
|
|
|
</span>
|
|
|
|
|
<Chip value={t(`professionalTaskExpansion.riskTiers.${task.risk_tier}` as never)} muted={task.risk_tier !== 'critical'} />
|
|
|
|
|
</div>
|
|
|
|
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>
|
|
|
|
|
<Chip value={task.owner_agent} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.approval', { value: String(task.approval_required) })} muted />
|
|
|
|
|
<Chip value={t('professionalTaskExpansion.labels.liveCount', { value: String(task.current_live_count_24h) })} muted />
|
|
|
|
|
<Chip value={task.telegram_policy} muted />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
})}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</GlassCard>
|
|
|
|
|
|
|
|
|
|
<div style={{ display: 'grid', gridTemplateColumns: 'minmax(0, 1.05fr) minmax(0, 0.95fr)', gap: 12 }} className="automation-inventory-command-grid">
|
|
|
|
|
<GlassCard variant="subtle" padding="md">
|
|
|
|
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 13, minWidth: 0 }}>
|
|
|
|
|
|