import { useState, type FormEvent, type ReactNode } from 'react'; import { useNavigate } from 'react-router-dom'; import { Logo } from '@/components/brand/Logo'; import { Button } from '@/components/ui/Button'; import { Pill } from '@/components/ui/Pill'; import { useSession } from '@/session/useSession'; import { MOCK_SESSIONS } from '@/mocks/session'; import type { Role } from '@/types/roles'; type Mode = 'rt' | 'soc'; /** * Login screen — two distinct paths. * * RT operators authenticate via username/password (D-003 v1, OIDC v2). * SOC analysts use a one-shot token (D-006: bcrypt-hashed soc_session, * clear value delivered out-of-band by the lead RT). * * Sprint 0 mock: no validation. Picking a role assumes that role's mock * session and lands the user inside the shell. */ export function LoginPage() { const [mode, setMode] = useState('rt'); const [pickedRtRole, setPickedRtRole] = useState<'rt_operator' | 'rt_lead'>('rt_lead'); const { signIn } = useSession(); const navigate = useNavigate(); const handleSubmit = (e: FormEvent) => { e.preventDefault(); const role: Role = mode === 'soc' ? 'soc_analyst' : pickedRtRole; const user = MOCK_SESSIONS[role]; if (!user) return; signIn(user); void navigate(mode === 'soc' ? '/runs' : '/engagements', { replace: true }); }; return (
{/* Left rail — masthead, identity, telemetry of the platform itself */} {/* Right column — the auth form, instrument-panel inset card */}
{/* Mode switch — segmented, role-tinted */}
setMode('rt')} tone="rt" label="RT — operator" hint="username + password" /> setMode('soc')} tone="soc" label="SOC — analyst" hint="session token" />

{mode === 'rt' ? 'Operator sign-in' : 'SOC session'}

{mode === 'rt' ? 'RT' : 'SOC'}
{mode === 'rt' ? ( ) : ( )}

{mode === 'rt' ? 'OIDC Keycloak — v2' : 'Token delivered out-of-band'}

mimic.rt.local · session ssrf-protected · audit log live

); } interface ModeTabProps { active: boolean; onClick: () => void; tone: 'rt' | 'soc'; label: string; hint: string; } function ModeTab({ active, onClick, tone, label, hint }: ModeTabProps) { return ( ); } function RtForm({ picked, onPick, }: { picked: 'rt_operator' | 'rt_lead'; onPick: (r: 'rt_operator' | 'rt_lead') => void; }) { return (
Mock role (sprint 0 only)
onPick('rt_operator')}> RT Operator onPick('rt_lead')}> RT Lead
); } function SocForm() { return (

Your token was delivered out-of-band by the lead RT.
Scope: single engagement, read-only on telemetry, write on detection coting.

); } interface FieldProps { label: string; placeholder?: string; type?: string; autoComplete?: string; spellCheck?: boolean; mono?: boolean; } function Field({ label, placeholder, type = 'text', autoComplete, spellCheck, mono }: FieldProps) { const id = label.toLowerCase().replace(/\s+/g, '-'); return (
); } function RolePick({ active, onClick, children, }: { active: boolean; onClick: () => void; children: ReactNode; }) { return ( ); }