feat: establish NekoNest Cloud control and relay

This commit is contained in:
2026-08-12 23:25:43 +08:00
commit f27606b709
222 changed files with 71456 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
import Link from "next/link";
import { requireCloudViewer } from "../../cloud-auth";
import { DashboardShell, PageHeading, StatusPill } from "../../components/Shells";
import {
getDashboardSnapshot,
getOrCreateAccount,
listAccountDeletionRequests,
} from "@/db/repository";
import { AccountDeletionAction } from "./AccountLifecycleActions";
export const dynamic = "force-dynamic";
export default async function SecurityPage() {
const viewer = await requireCloudViewer("/dashboard/security");
const account = await getOrCreateAccount(viewer);
const [snapshot, deletionRequests] = await Promise.all([
getDashboardSnapshot(account),
listAccountDeletionRequests(account.id),
]);
return (
<DashboardShell viewer={viewer} active="/dashboard/security" serviceStatus={snapshot.serviceStatus}>
<div className="cloud-page">
<PageHeading eyebrow="SECURITY / 安全与设备" title="把身份、设备和内容边界分开。" description="用户、手机、主机和管理员使用不同身份;控制平面不把登录成功当作跨租户授权。" />
<div className="security-grid">
<section className="panel security-card"><span className="card-index">01</span><StatusPill tone="good"></StatusPill><h2>{viewer.email}</h2><p>{viewer.isLocalDemo ? "本地开发演示身份;部署后不会存在。" : "由 Sites 的 ChatGPT 登录识别;正式公共身份提供商仍需上线前确认。"}</p></section>
<section className="panel security-card"><span className="card-index">02</span><StatusPill tone={snapshot.connection.state === "ready" ? "good" : "warn"}></StatusPill><h2>{snapshot.tenant?.slug}</h2><p> Relay {snapshot.connection.state} revision {snapshot.connection.authorizationRevision} phone device grant</p></section>
<section className="panel security-card"><span className="card-index">03</span><StatusPill tone="danger"></StatusPill><h2>sealed attachments</h2><p></p></section>
</div>
<section className="panel full-panel"><div className="panel-heading"><div><span></span><h2></h2></div></div><div className="safety-actions"><article><strong></strong><p></p><Link className="button button-secondary" href="/dashboard/hosts"></Link></article><article><strong></strong><p> Cloud </p><a className="button button-secondary" href="/api/account/export" download> JSON </a></article><article className="account-lifecycle-card"><strong></strong><p></p><AccountDeletionAction requests={deletionRequests} /></article></div></section>
<div className="inline-callout"><div><strong></strong><p> PWA </p></div><Link className="button button-secondary" href="/trust"></Link></div>
</div>
</DashboardShell>
);
}