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
+240
View File
@@ -0,0 +1,240 @@
import type { Metadata } from "next";
import Link from "next/link";
import { PublicShell, StatusPill } from "./components/Shells";
import { getPublicCommercialSnapshot } from "@/db/repository";
import { getPublicBetaPresentation } from "@/db/domain";
export const dynamic = "force-dynamic";
export const metadata: Metadata = {
title: "把本地 coding-agent 接回手机",
description:
"NekoNest Cloud 让 Windows 与 Linux 主机主动出站连接,在手机上继续真实的本地 Codex、Claude Code、Kimi CLI 与 Grok Build 会话。",
};
export default async function Home() {
const commercial = await getPublicCommercialSnapshot();
const betaActive = Boolean(commercial.beta);
const publicBetaOpen = betaActive && commercial.blockedP0 === 0;
const betaCopy = getPublicBetaPresentation(betaActive);
return (
<PublicShell>
<section className="hero-section">
<div className="hero-grid">
<div className="hero-copy">
<div className="hero-kicker">
<StatusPill tone={publicBetaOpen ? "good" : betaActive ? "warn" : "neutral"}>
{publicBetaOpen ? betaCopy.status : betaActive ? "闭测免费 · 公开接入冻结" : betaCopy.status}
</StatusPill>
<span>{betaActive && !publicBetaOpen ? "免费政策已经预设;当前仅向明确受邀账户开放。" : betaCopy.subline}</span>
</div>
<h1>
<br />
<em>coding-agent</em>
<br />
</h1>
<p className="hero-lead">
CLI Windows Linux NekoNest Cloud
</p>
<div className="hero-actions">
<Link className="button button-primary button-large" href="/dashboard">
{publicBetaOpen ? "连接自己的主机" : "进入控制台"}
<span aria-hidden="true"></span>
</Link>
<Link className="button button-ghost button-large" href="/trust">
</Link>
</div>
<div className="hero-facts" aria-label="产品关键事实">
<span><strong>0</strong> </span>
<span><strong>4</strong> Agent</span>
<span><strong>{betaCopy.factValue}</strong> {betaCopy.factLabel}</span>
</div>
</div>
<div className="hero-console" aria-label="移动控制台示意">
<div className="console-topbar">
<span className="console-dots" aria-hidden="true"><i /><i /><i /></span>
<span> / home-lab</span>
<StatusPill tone="good">线</StatusPill>
</div>
<div className="console-layout">
<div className="console-tree">
<span className="tree-label"></span>
<strong>D:\work\nekonest</strong>
<div className="tree-agent active"><span></span> Codex <small></small></div>
<div className="tree-thread active"></div>
<div className="tree-thread"> daemon </div>
<div className="tree-agent"><span></span> Claude Code <small></small></div>
<div className="tree-agent"><span></span> Kimi CLI <small></small></div>
</div>
<div className="console-chat">
<div className="chat-meta">
<span>Codex · 21:48</span>
<StatusPill tone="info"></StatusPill>
</div>
<div className="message assistant">
<span className="message-avatar">N</span>
<p></p>
</div>
<div className="message user"><p>线</p></div>
<div className="delivery-row">
<span className="pulse-dot" />
WebSocket
</div>
<div className="composer-mock">
<span>线</span>
<button type="button" aria-label="发送示意" disabled></button>
</div>
</div>
</div>
<div className="console-caption"> Cloud Agent </div>
</div>
</div>
</section>
<section className="proof-strip" aria-label="核心边界">
<span></span>
<span> store </span>
<span> Agent 线</span>
<span>Codex </span>
<span></span>
</section>
<section className="section light-section" id="how">
<div className="section-heading split-heading">
<div>
<span className="eyebrow">HOW IT WORKS / </span>
<h2>Cloud </h2>
</div>
<p>
API Key沿
</p>
</div>
<div className="relay-diagram">
<div className="relay-node phone-node">
<span className="node-number">01</span>
<strong> PWA</strong>
<small> · · · </small>
</div>
<div className="relay-arrow"><span>HTTPS / WSS</span><i /></div>
<div className="relay-node cloud-node">
<span className="node-number">02</span>
<strong>NekoNest Cloud</strong>
<small> · · </small>
<b></b>
</div>
<div className="relay-arrow"><span></span><i /></div>
<div className="relay-node host-node">
<span className="node-number">03</span>
<strong></strong>
<small>Daemon · CLI · store · </small>
</div>
</div>
<div className="steps-grid">
<article><span>1</span><h3></h3><p>Windows Linux IP</p></article>
<article><span>2</span><h3></h3><p></p></article>
<article><span>3</span><h3>线</h3><p>Agent 线</p></article>
</div>
</section>
<section className="section dark-section">
<div className="section-heading split-heading inverse">
<div>
<span className="eyebrow">BUILT FOR CONTINUATION</span>
<h2></h2>
</div>
<p> agent 线</p>
</div>
<div className="feature-ledger">
<article>
<span className="ledger-index">A</span>
<div><h3></h3><p> Agent </p></div>
</article>
<article>
<span className="ledger-index">B</span>
<div><h3> Agent </h3><p>Codex Claude CodeKimi CLIGrok Build </p></div>
</article>
<article>
<span className="ledger-index">C</span>
<div><h3></h3><p>线 daemon ghost thread</p></div>
</article>
<article>
<span className="ledger-index">D</span>
<div><h3></h3><p>线</p></div>
</article>
</div>
</section>
<section className="section price-section">
<div className="price-callout">
<div className="price-copy">
<span className="eyebrow">FREE PUBLIC BETA</span>
<h2></h2>
<p>{publicBetaOpen ? "当前面向国内个人用户免费测试。无需支付方式,不生成报价或订单,也不会在结束时自动扣款。" : betaActive ? "免费测试政策已经预设,但公开接入仍由 P0 安全门禁冻结;受邀闭测账户免费,不需要支付方式。" : "免费公测政策已经结束,但收费功能仍未开放;后续决定会另行通知。"}</p>
<ul className="check-list">
<li></li>
<li> Token </li>
<li></li>
</ul>
</div>
<div className="price-board">
<div className="beta-price-row"><span>{betaCopy.priceHeading}</span><strong>{betaCopy.priceValue}</strong><small>{betaCopy.priceDetail}</small></div>
<div className="catalog-price-row">
<span></span>
<strong></strong>
<small></small>
</div>
<div className="catalog-price-row">
<span></span>
<strong></strong>
<small>使</small>
</div>
<Link href="/pricing"> </Link>
</div>
</div>
</section>
<section className="section trust-section">
<div className="trust-grid">
<div className="trust-title">
<span className="eyebrow">TRUST IS A BOUNDARY</span>
<h2></h2>
<p> Cloud </p>
<Link className="text-link" href="/trust"> </Link>
</div>
<div className="visibility-table" role="table" aria-label="数据可见性边界">
<div role="row" className="visibility-head"><span></span><span></span><span>Cloud </span></div>
<div role="row"><span> / CLI </span><strong></strong><em></em></div>
<div role="row"><span></span><strong></strong><em></em></div>
<div role="row"><span> / / </span><strong></strong><em></em></div>
<div role="row"><span> / / </span><strong></strong><em>*</em></div>
<small>* sealed </small>
</div>
</div>
</section>
<section className="readiness-banner">
<div>
<StatusPill tone={commercial.blockedP0 ? "danger" : "good"}>{commercial.blockedP0 ? "免费公测尚未开放" : "公测门禁已通过"}</StatusPill>
<h2>{commercial.blockedP0 ? "控制台能跑,不等于托管链路已经可用。" : "免费公测已经具备基础开放条件。"}</h2>
<p>
{commercial.blockedP0
? `当前还有 ${commercial.blockedP0} 项免费公测 P0 门禁未通过,包括密封传输、租户隔离、主机认领、主体/域名路径和隐私保存。`
: "P0 证据已经齐全;仍需按邀请范围和运营容量逐步开放。"}
</p>
</div>
<Link className="button button-light button-large" href="/readiness">
线
<span aria-hidden="true"></span>
</Link>
</section>
</PublicShell>
);
}