feat(iwooos): segment security workbench
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 59s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-03 01:21:39 +08:00
parent 91a67bbb2a
commit fc28a1f4a6
4 changed files with 213 additions and 0 deletions

View File

@@ -168,6 +168,7 @@ type VisualDashboardGate = {
type VisualExperienceMode = 'attackPath' | 'assetHeat' | 'responseFlow'
type IwoooSCommandMapMode = 'unlock' | 'scope' | 'hosts' | 'sourceControl' | 'awooop' | 'boundary'
type IwoooSWorkspaceView = 'overview' | 'runtime' | 'evidence' | 'ledger'
type VisualExperienceTab = {
key: VisualExperienceMode
@@ -6462,6 +6463,105 @@ function ToneDot({ tone }: { tone: 'steady' | 'warn' | 'locked' }) {
)
}
const iwooosWorkspaceViews: Array<{
key: IwoooSWorkspaceView
icon: typeof ShieldCheck
tone: 'steady' | 'warn' | 'locked'
}> = [
{ key: 'overview', icon: Radar, tone: 'steady' },
{ key: 'runtime', icon: Workflow, tone: 'warn' },
{ key: 'evidence', icon: FileCheck2, tone: 'warn' },
{ key: 'ledger', icon: ClipboardList, tone: 'locked' },
]
function IwoooSWorkspaceSwitcher({
active,
onChange,
}: {
active: IwoooSWorkspaceView
onChange: (value: IwoooSWorkspaceView) => void
}) {
const t = useTranslations('iwooos.workspace')
return (
<section style={{ ...band, padding: 14, marginBottom: 14 }} data-testid="iwooos-workspace-switcher">
<div
style={{
display: 'grid',
gridTemplateColumns: 'minmax(0, 1.1fr) minmax(0, 2fr)',
gap: 14,
alignItems: 'center',
}}
>
<div style={{ minWidth: 0 }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 8, color: '#315f45', fontSize: 12, fontWeight: 800 }}>
<ShieldCheck size={16} color="#2f7d48" />
{t('eyebrow')}
</div>
<h2 style={{ margin: '6px 0 0', fontSize: 18, color: '#141413' }}>{t('title')}</h2>
<p style={{ margin: '6px 0 0', color: '#5f5b52', fontSize: 12, lineHeight: 1.5 }}>
{t('subtitle')}
</p>
</div>
<div
role="tablist"
aria-label={t('ariaLabel')}
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(132px, 1fr))',
gap: 8,
}}
>
{iwooosWorkspaceViews.map(view => {
const Icon = view.icon
const selected = active === view.key
return (
<button
key={view.key}
type="button"
role="tab"
aria-selected={selected}
onClick={() => onChange(view.key)}
style={{
appearance: 'none',
border: selected ? `1px solid ${toneColors[view.tone]}` : '0.5px solid #ded9ce',
background: selected ? '#f6fbf6' : '#fff',
color: selected ? toneColors[view.tone] : '#5f5b52',
minHeight: 58,
padding: '10px 11px',
display: 'grid',
gap: 5,
textAlign: 'left',
cursor: 'pointer',
}}
>
<span style={{ display: 'flex', alignItems: 'center', gap: 7, fontSize: 12, fontWeight: 800 }}>
<Icon size={15} color={selected ? toneColors[view.tone] : '#77736a'} />
{t(`views.${view.key}.label` as never)}
</span>
<span style={{ fontSize: 11, lineHeight: 1.35, color: selected ? '#315f45' : '#77736a' }}>
{t(`views.${view.key}.detail` as never)}
</span>
</button>
)
})}
</div>
</div>
</section>
)
}
function IwoooSWorkspacePanel({
active,
children,
}: {
active: boolean
children: ReactNode
}) {
if (!active) return null
return <div style={{ display: 'grid', gap: 14 }}>{children}</div>
}
function MetricCard({ item }: { item: PostureMetric }) {
const t = useTranslations('iwooos.metrics')
return (
@@ -24146,6 +24246,7 @@ function HostOwnerDecisionRecordHumanRecordOwnerReviewPreparationChecklistCard({
export default function IwoooSPage({ params }: { params: { locale: string } }) {
const t = useTranslations('iwooos')
const ia = useTranslations('iwooos.informationArchitecture')
const [workspaceView, setWorkspaceView] = useState<IwoooSWorkspaceView>('overview')
return (
<AppLayout locale={params.locale} fullBleed>
@@ -24178,7 +24279,54 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
</div>
</section>
<IwoooSWorkspaceSwitcher active={workspaceView} onChange={setWorkspaceView} />
<IwoooSManagerCockpit />
<IwoooSWorkspacePanel active={workspaceView === 'overview'}>
<IwoooSCommandRail />
<IwoooSProgressIntegrityRibbon />
<IwoooSExecutiveSnapshotBoard />
<IwoooSRuntimeSecurityReadbackBoard />
<IwoooSSecurityControlCoverageBoard />
</IwoooSWorkspacePanel>
<IwoooSWorkspacePanel active={workspaceView === 'runtime'}>
<IwoooSCommandRail />
<IwoooSAgentBountySecurityOnboardingBoard />
<IwoooSRolloutRiskReadOnlyBoard />
<IwoooSWazuhIntrusionReadbackBoard />
<IwoooSRuntimeSecurityReadbackBoard />
<IwoooSWazuhLiveRouteReadbackBoard />
<IwoooSWazuhReleaseGateBoard />
<IwoooSWazuhManagedHostCoverageBoard />
<IwoooSWazuhManagerRegistryReviewerValidationBoard />
<IwoooSWazuhLiveMetadataEnvGateBoard />
<IwoooSSecurityOperatingSystemBoard />
<IwoooSSocSiemKaliWazuhIntegrationBoard />
<IwoooSP0SecurityIncidentConvergenceBoard />
</IwoooSWorkspacePanel>
<IwoooSWorkspacePanel active={workspaceView === 'evidence'}>
<IwoooSSectionGroup
id="iwooos-workspace-evidence-chain"
title={ia('firstLayerEvidence.title')}
summary={ia('firstLayerEvidence.summary')}
defaultOpen
>
<IwoooSFocusDeckBoard />
<IwoooSFirstScreenDepthMapBoard />
<IwoooSProgressEvidenceRailBoard />
<IwoooSEvidenceUnlockQueueBoard />
<IwoooSS49RequestDraftPackageBoard />
<IwoooSS49RequestDraftDetailBoard />
<IwoooSS49OwnerResponseIntakeBoard />
</IwoooSSectionGroup>
<IwoooSOwnerEvidenceIntakePreflightBoard />
<IwoooSWazuhOwnerEvidencePreflightBoard />
<IwoooSHighValueConfigOwnerPacketBoard />
</IwoooSWorkspacePanel>
<IwoooSWorkspacePanel active={workspaceView === 'ledger'}>
<IwoooSCommandRail />
<IwoooSProgressIntegrityRibbon />
<IwoooSExecutiveSnapshotBoard />
@@ -25388,6 +25536,7 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
</div>
</section>
</IwoooSSectionGroup>
</IwoooSWorkspacePanel>
</main>
</AppLayout>
)