diff --git a/web/app/(app)/audit/page.tsx b/web/app/(app)/audit/page.tsx index d15c7de..0d7e7de 100644 --- a/web/app/(app)/audit/page.tsx +++ b/web/app/(app)/audit/page.tsx @@ -49,7 +49,7 @@ export default function AuditPage() { }); return ( -
+

Audit Log

@@ -77,18 +77,18 @@ export default function AuditPage() { {events.map((e: AuditEvent) => ( - + {formatDate(e.created_at)} - + - + {e.actor} - + {e.details} diff --git a/web/app/(app)/keys/[id]/page.tsx b/web/app/(app)/keys/[id]/page.tsx index 4a9b9fc..f90a23c 100644 --- a/web/app/(app)/keys/[id]/page.tsx +++ b/web/app/(app)/keys/[id]/page.tsx @@ -227,7 +227,7 @@ export default function KeyDetailPage() { if (error || !key) { return ( -

+
Key not found or failed to load.
@@ -239,7 +239,7 @@ export default function KeyDetailPage() { const assignedServerIds = activeAssignments.map((a) => a.server_id); return ( -
+
{showAssign && ( {key.assignments.map((assignment) => ( - + - + {assignment.server?.ip_address ?? "n/a"} - + {assignment.revoked_at ? "revoked" : "active"} - + {new Date(assignment.assigned_at).toLocaleDateString()} - + {assignment.revoked_at ? new Date(assignment.revoked_at).toLocaleDateString() diff --git a/web/app/(app)/keys/page.tsx b/web/app/(app)/keys/page.tsx index ff0bb66..26cd967 100644 --- a/web/app/(app)/keys/page.tsx +++ b/web/app/(app)/keys/page.tsx @@ -106,10 +106,10 @@ export default function KeysPage() { }); return ( -
+
{showUpload && setShowUpload(false)} />} -
+

SSH Keys

@@ -146,21 +146,21 @@ export default function KeysPage() { {keys.map((key: Key) => ( - + {key.label} - + {key.fingerprint} - + {key.source} - + {key.assigned_count ?? 0} server{(key.assigned_count ?? 0) !== 1 ? "s" : ""} - + {new Date(key.created_at).toLocaleDateString()} diff --git a/web/app/(app)/layout.tsx b/web/app/(app)/layout.tsx index 5716a50..be7a8f8 100644 --- a/web/app/(app)/layout.tsx +++ b/web/app/(app)/layout.tsx @@ -1,6 +1,5 @@ import { AuthProvider } from "@/components/AuthProvider"; -import { LicenseBanner } from "@/components/LicenseBanner"; -import { Sidebar } from "@/components/Sidebar"; +import { AppShell } from "@/components/AppShell"; export default function AppLayout({ children, @@ -9,13 +8,7 @@ export default function AppLayout({ }) { return ( -

- -
- - {children} -
-
+ {children} ); } diff --git a/web/app/(app)/monitors/[id]/edit/page.tsx b/web/app/(app)/monitors/[id]/edit/page.tsx index 8a6b3f8..de1e933 100644 --- a/web/app/(app)/monitors/[id]/edit/page.tsx +++ b/web/app/(app)/monitors/[id]/edit/page.tsx @@ -37,14 +37,14 @@ export default function EditMonitorPage() { if (!monitor) { return ( -
+
Monitor not found.
); } return ( -
+
← {monitor.name} diff --git a/web/app/(app)/monitors/[id]/page.tsx b/web/app/(app)/monitors/[id]/page.tsx index 08ca9d9..43edc76 100644 --- a/web/app/(app)/monitors/[id]/page.tsx +++ b/web/app/(app)/monitors/[id]/page.tsx @@ -86,7 +86,7 @@ export default function MonitorDetailPage() { if (!monitor) { return ( -
+
Monitor not found.
); @@ -96,7 +96,7 @@ export default function MonitorDetailPage() { const last24 = all.slice(-24); return ( -
+
@@ -180,17 +180,17 @@ export default function MonitorDetailPage() { {incidents.map((inc) => ( - + {new Date(inc.started_at).toLocaleString()} - + {inc.resolved_at ? ( {new Date(inc.resolved_at).toLocaleString()} ) : ( ongoing )} - + {inc.cause || "n/a"} diff --git a/web/app/(app)/monitors/new/page.tsx b/web/app/(app)/monitors/new/page.tsx index bc536f2..d754dac 100644 --- a/web/app/(app)/monitors/new/page.tsx +++ b/web/app/(app)/monitors/new/page.tsx @@ -20,7 +20,7 @@ export default function NewMonitorPage() { }); return ( -
+
← Monitors diff --git a/web/app/(app)/monitors/page.tsx b/web/app/(app)/monitors/page.tsx index a9d035a..5c17228 100644 --- a/web/app/(app)/monitors/page.tsx +++ b/web/app/(app)/monitors/page.tsx @@ -31,8 +31,8 @@ export default function MonitorsPage() { }); return ( -
-
+
+

Monitors

Service uptime and latency checks.

@@ -76,24 +76,24 @@ export default function MonitorsPage() { {monitors.map((m) => ( - + {m.name} - + {m.type} - + {targetSummary(m)} - + {m.state.status} - + {m.state.latency_ms}ms - + {m.state.last_check_at ? new Date(m.state.last_check_at).toLocaleTimeString() : "n/a"} diff --git a/web/app/(app)/secrets/[group]/page.tsx b/web/app/(app)/secrets/[group]/page.tsx index 24bbb1f..0745b68 100644 --- a/web/app/(app)/secrets/[group]/page.tsx +++ b/web/app/(app)/secrets/[group]/page.tsx @@ -138,11 +138,11 @@ function SecretRow({ group, secret }: { group: string; secret: Secret }) { return ( - + {secret.key} - {revealed == null ? •••••••••••• : {revealed}} - + {revealed == null ? •••••••••••• : {revealed}} + {new Date(secret.updated_at).toLocaleString()} @@ -241,14 +241,14 @@ export default function SecretGroupPage() { }); return ( -
+
{showYaml && setShowYaml(false)} />} ← Back to secrets -
+

{group}

diff --git a/web/app/(app)/secrets/page.tsx b/web/app/(app)/secrets/page.tsx index ff746f0..f8c28ad 100644 --- a/web/app/(app)/secrets/page.tsx +++ b/web/app/(app)/secrets/page.tsx @@ -50,7 +50,7 @@ function NewGroupModal({ onClose }: { onClose: () => void }) { className={`${inputClass} font-mono`} />

-
+
+
{showNew && setShowNew(false)} />} -
+

Secrets

@@ -139,15 +139,15 @@ export default function SecretsPage() { {groups.map((g: SecretGroupSummary) => ( - + {g.group} - + {g.key_count} key{g.key_count !== 1 ? "s" : ""} - + {new Date(g.updated_at).toLocaleString()} diff --git a/web/app/(app)/servers/[id]/console/page.tsx b/web/app/(app)/servers/[id]/console/page.tsx index 675db57..8705175 100644 --- a/web/app/(app)/servers/[id]/console/page.tsx +++ b/web/app/(app)/servers/[id]/console/page.tsx @@ -158,14 +158,14 @@ export default function ServerConsolePage() { if (!server) { return ( -

+
Server not found or failed to load.
); } return ( -
+
← {server.hostname} @@ -267,7 +267,7 @@ export default function ServerConsolePage() {
) : ( -
+
diff --git a/web/app/(app)/servers/[id]/page.tsx b/web/app/(app)/servers/[id]/page.tsx index d0124cf..0fff5ee 100644 --- a/web/app/(app)/servers/[id]/page.tsx +++ b/web/app/(app)/servers/[id]/page.tsx @@ -161,7 +161,7 @@ function GenerateKeyModal({ onClose, onSubmit, isPending }: { onClose: () => voi
-
+
{(["ed25519", "rsa", "ecdsa"] as const).map((t) => ( -
+
{server.os_info?.toLowerCase().includes("windows") ? "PS>" : "$"}{" "} {api.getUpdateCommand(server.os_info)}
-
+
{sortedSteps.map((ref, i) => { const lib = libById(ref.step_id); @@ -369,7 +369,7 @@ export default function WorkflowBuilder() { e.dataTransfer.setData("text/plain", JSON.stringify({ kind: "move", from: i })); }} onClick={() => setSelected(i)} - className={`w-[340px] cursor-pointer rounded border bg-surface p-3 ${isSelected ? "border-signal ring-2 ring-signal/40" : "border-border"}`} + className={`w-full cursor-pointer rounded border bg-surface p-3 ${isSelected ? "border-signal ring-2 ring-signal/40" : "border-border"}`} >
{i + 1} @@ -400,7 +400,11 @@ export default function WorkflowBuilder() { {/* RIGHT: inspector */} -