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
+39
View File
@@ -0,0 +1,39 @@
import Link from "next/link";
import { requireCloudViewer } from "../../../cloud-auth";
import { DashboardShell, PageHeading } from "../../../components/Shells";
import { getDashboardSnapshot, getOrCreateAccount } from "@/db/repository";
import { getDaemonReleaseState } from "../../../daemon-release";
import { deriveBetaOnboarding } from "../../onboarding";
import { PairingForm } from "./PairingForm";
import { resolveConnectOrigin } from "./onboarding";
import { env } from "cloudflare:workers";
export const dynamic = "force-dynamic";
export default async function NewHostPage() {
const viewer = await requireCloudViewer("/dashboard/hosts/new");
const account = await getOrCreateAccount(viewer);
const [snapshot, daemonRelease] = await Promise.all([
getDashboardSnapshot(account),
getDaemonReleaseState(),
]);
const onboarding = deriveBetaOnboarding({
entitlement: snapshot.entitlement,
hasPendingRequest: snapshot.accessRequests.some((request) => request.status === "requested"),
});
const connectOrigin = resolveConnectOrigin(
env.NEKONEST_CLOUD_CONNECT_ORIGIN,
process.env.NODE_ENV !== "production",
);
return (
<DashboardShell viewer={viewer} active="/dashboard/hosts">
<div className="cloud-page narrow-cloud-page">
<PageHeading eyebrow="ADD OR RECOVER HOST / 添加或恢复主机" title="先创建一次性配对请求。" description="新主机和已撤销主机的安全恢复共用这一步;家里不需要打开入站端口。" actions={<Link className="button button-secondary" href="/download"> daemon</Link>} />
<div className="form-layout">
<section className="panel form-panel"><PairingForm accessState={onboarding.pairingAccessState} releaseAvailable={daemonRelease.available} minimumDaemonVersion={daemonRelease.minimumVersion} connectOrigin={connectOrigin} /></section>
<aside className="form-aside"><span className="eyebrow"></span><ol><li><strong></strong><p> SHA-256 </p></li><li><strong>daemon </strong><p>daemon </p></li><li><strong></strong><p> daemon </p></li><li><strong></strong><p></p></li></ol></aside>
</div>
</div>
</DashboardShell>
);
}