Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f78c7f4
Add floating War Room launcher
sonoxo Aug 20, 2026
e844976
Add cyberpunk AEGIS War Room dashboard
sonoxo Aug 20, 2026
f242e16
Wire AEGIS War Room route and launcher
sonoxo Aug 20, 2026
0a5febd
Add War Room safety and connector state core
sonoxo Aug 20, 2026
e9257b2
Add War Room boundary tests
sonoxo Aug 20, 2026
a07f99a
Add safe live War Room connector API
sonoxo Aug 20, 2026
6b304c9
Register War Room live data routes
sonoxo Aug 20, 2026
e54db08
Connect War Room UI to live public data fabric
sonoxo Aug 20, 2026
9314a39
Add War Room CI proof gate
sonoxo Aug 20, 2026
12e2f21
fix: set explicit ES2022 TypeScript target
sonoxo Aug 20, 2026
5b77006
ci: repair Express type compatibility lockfile
sonoxo Aug 20, 2026
9249a7f
fix: pin compatible Express parameter types
github-actions[bot] Aug 20, 2026
d204f6e
ci: remove one-shot TypeScript lockfile repair
sonoxo Aug 20, 2026
c25dc25
ci: add deterministic TypeScript schema repair
sonoxo Aug 20, 2026
ecd4693
ci: run verified TypeScript schema repair
sonoxo Aug 20, 2026
cec5c67
ci: preview deterministic TypeScript repairs
sonoxo Aug 20, 2026
5d29812
fix: correct deterministic repair expectations
sonoxo Aug 20, 2026
a25d092
fix: handle unknown pentest summary rendering
sonoxo Aug 20, 2026
cecc5e9
ci: apply verified TypeScript schema repair
sonoxo Aug 20, 2026
f3ca1fe
fix: align TypeScript code with current schemas
github-actions[bot] Aug 20, 2026
ea92f93
ci: remove completed TypeScript repair helper
sonoxo Aug 20, 2026
edde9ee
ci: remove completed TypeScript repair preview
sonoxo Aug 20, 2026
f881124
ci: remove completed TypeScript repair workflow
sonoxo Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/workflows/war-room-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: War Room CI

on:
push:
branches:
- feature/cyberpunk-war-room
pull_request:
paths:
- "client/src/pages/war-room.tsx"
- "client/src/components/WarRoomLauncher.tsx"
- "server/war-room*.ts"
- "server/index.ts"
- ".github/workflows/war-room-ci.yml"

permissions:
contents: read

jobs:
verify:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- name: Install dependencies
run: npm ci

- name: War Room boundary tests
run: npx tsx --test server/war-room.test.ts

- name: TypeScript check
run: npm run check

- name: Production build
run: npm run build
4 changes: 4 additions & 0 deletions client/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ import AuditLogsPage from "@/pages/audit-logs";
import ThreatSimulationPage from "@/pages/threat-simulation";
import ThreatDetailPage from "@/pages/threat-detail";
import IncidentDetailPage from "@/pages/incident-detail";
import WarRoomPage from "@/pages/war-room";
import Layout from "@/components/Layout";
import WarRoomLauncher from "@/components/WarRoomLauncher";
import type { AuthUser } from "@/lib/auth";

function ProtectedRoute({ component: Component }: { component: () => JSX.Element | null }) {
Expand Down Expand Up @@ -124,6 +126,7 @@ function Router() {
<Route path="/reset-password" component={ResetPasswordPage} />
<Route path="/accept-invite" component={AcceptInvitePage} />
<Route path="/dashboard">{() => <ProtectedRoute component={Dashboard} />}</Route>
<Route path="/war-room">{() => <ProtectedRoute component={WarRoomPage} />}</Route>
<Route path="/scans/:id">{() => <ProtectedRoute component={ScanDetail} />}</Route>
<Route path="/scans">{() => <ProtectedRoute component={Scans} />}</Route>
<Route path="/compliance">{() => <ProtectedRoute component={Compliance} />}</Route>
Expand Down Expand Up @@ -190,6 +193,7 @@ function App() {
<TooltipProvider>
<Toaster />
<Router />
<WarRoomLauncher />
</TooltipProvider>
</ThemeProvider>
</QueryClientProvider>
Expand Down
30 changes: 30 additions & 0 deletions client/src/components/WarRoomLauncher.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Link, useLocation } from "wouter";
import { Shield, RadioTower } from "lucide-react";

export default function WarRoomLauncher() {
const [location] = useLocation();
if (location === "/auth" || location.startsWith("/verify-email") || location.startsWith("/reset-password") || location.startsWith("/accept-invite") || location === "/war-room") {
return null;
}

return (
<Link href="/war-room">
<button
data-testid="war-room-launcher"
className="fixed bottom-5 right-5 z-50 group rounded-2xl border border-emerald-400/40 bg-black/90 px-4 py-3 text-emerald-300 shadow-[0_0_30px_rgba(16,185,129,0.25)] backdrop-blur-xl transition hover:border-cyan-300/70 hover:text-cyan-200 hover:shadow-[0_0_36px_rgba(34,211,238,0.30)]"
aria-label="Open AEGIS War Room"
>
<span className="flex items-center gap-2">
<span className="relative flex h-8 w-8 items-center justify-center rounded-xl border border-emerald-400/30 bg-emerald-500/10">
<Shield className="h-4 w-4" />
<RadioTower className="absolute -right-1 -top-1 h-3 w-3 animate-pulse text-cyan-300" />
</span>
<span className="text-left">
<span className="block text-[10px] font-mono uppercase tracking-[0.25em] text-emerald-500/80">AEGIS</span>
<span className="block text-sm font-semibold">War Room</span>
</span>
</span>
</button>
</Link>
);
}
2 changes: 1 addition & 1 deletion client/src/pages/enterprise.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ function SsoTab({ isLoading: _parentLoading }: { settings?: Setting[]; isLoading
);
}

function MultiRegionTab({ isLoading: _parentLoading }: { settings?: Setting[]; isLoading: boolean }) {
function MultiRegionTab({ settings, isLoading: _parentLoading }: { settings?: Setting[]; isLoading: boolean }) {
const { toast } = useToast();

interface RegionInfo { id: string; name: string; status: string; }
Expand Down
6 changes: 3 additions & 3 deletions client/src/pages/pentest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -392,9 +392,9 @@ export default function PentestPage() {
<CardContent className="pb-2">
<div className="flex flex-wrap gap-2 mt-2">
<Badge variant="outline" className="text-xs">
{session.testTypes.length} test types
{Array.isArray(session.testTypes) ? session.testTypes.length : 0} test types
</Badge>
{session.summary && ((session.summary as any).findingsCount as number) > 0 && (
{Boolean(session.summary) && ((session.summary as any).findingsCount as number) > 0 && (
<>
{((session.summary as any).criticalCount as number) > 0 && (
<Badge variant="destructive" className="text-xs">
Expand Down Expand Up @@ -506,7 +506,7 @@ export default function PentestPage() {
{sessionDetails.findings.map((finding) => (
<TableRow key={finding.id} className="cursor-pointer hover:bg-muted/50 group">
<TableCell>{getSeverityBadge(finding.severity)}</TableCell>
<TableCell className="capitalize">{(finding.testType as React.ReactNode).toString().replace("_", " ")}</TableCell>
<TableCell className="capitalize">{String(finding.testType ?? "unknown").replace("_", " ")}</TableCell>
<TableCell className="font-medium">
<div className="flex flex-col">
<span>{(finding.title as React.ReactNode)}</span>
Expand Down
2 changes: 1 addition & 1 deletion client/src/pages/threat-detail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export default function ThreatDetailPage() {
<Server className="w-8 h-8 text-muted-foreground/30 mx-auto mb-2" />
<p className="text-sm text-muted-foreground">No matching assets found in inventory.</p>
<Link href="/assets">
<Button variant="link" size="sm" className="mt-1" data-testid="link-view-assets">View Asset Inventory</Button>
<Button variant="ghost" size="sm" className="mt-1 underline" data-testid="link-view-assets">View Asset Inventory</Button>
</Link>
</div>
);
Expand Down
Loading
Loading