feat: gate the language world behind number verification
This commit is contained in:
parent
4006f3454c
commit
f8c8db4d48
39 changed files with 1445 additions and 129 deletions
|
|
@ -0,0 +1,106 @@
|
|||
import type { DomainId } from '../qoder-surface/StarlakeSurface'
|
||||
import type { ReactNode } from 'react'
|
||||
import './public-domain-portal.css'
|
||||
|
||||
export type PublicDomainId = Extract<DomainId, 'MAIN_DOMAIN' | 'BRANCH_DOMAIN' | 'ZERO_DOMAIN'>
|
||||
|
||||
interface PublicMarketplaceItem {
|
||||
itemNumber: string
|
||||
artifactKind: 'PHYSICAL_MODULE' | 'COGNITIVE_SKILL'
|
||||
displayName: string
|
||||
summary: string
|
||||
version: string
|
||||
executionAuthority: boolean
|
||||
}
|
||||
|
||||
interface PublicMarketplaceSnapshot {
|
||||
state: string
|
||||
trustState: string
|
||||
catalogEpoch: number
|
||||
itemCount: number
|
||||
catalogReceiptCount: number
|
||||
items: PublicMarketplaceItem[]
|
||||
}
|
||||
|
||||
interface PublicDomainPortalProps {
|
||||
domain: PublicDomainId
|
||||
authenticated: boolean
|
||||
guanghuEraDay?: number
|
||||
beijingTime?: string
|
||||
latestEvent?: { title: string; summary: string }
|
||||
publicDistribution?: { version: string; epoch: number; trustState: string; receiptCount: number }
|
||||
marketplace?: PublicMarketplaceSnapshot | null
|
||||
marketplaceBusy?: boolean
|
||||
marketplaceMessage?: string
|
||||
glsRuntime?: { state: string; protocolCount: number; executableProjectionCount: number; numberCoordinateCount: number; unresolvedNumberReferenceCount: number; authorityConflictCount: number } | null
|
||||
glsKernel?: { state: string; implementedStageCount: number; decisionReceiptCount: number; denyCount: number; ambiguousCount: number; unverifiedCount: number; modelCanOverrideDecision: boolean } | null
|
||||
onBack: () => void
|
||||
onOpenGate: () => void
|
||||
onRefreshMarketplace: () => void
|
||||
onOpenMarketplace?: () => void
|
||||
}
|
||||
|
||||
const DOMAIN_COPY: Record<PublicDomainId, { eyebrow: string; title: string; summary: string }> = {
|
||||
MAIN_DOMAIN: { eyebrow: 'PUBLIC WORLD · MAIN DOMAIN', title: '光湖主域', summary: '公开公告、版本更新与系统通知。这里展示当前客户端亲自读到的运行版本和时间坐标。' },
|
||||
BRANCH_DOMAIN: { eyebrow: 'PUBLIC WORLD · BRANCH DOMAIN', title: '光湖分域', summary: '行业成品模块与思维大脑技能的公共目录。游客可查看,安装仍需进入自己的频道并明确授权。' },
|
||||
ZERO_DOMAIN: { eyebrow: 'PUBLIC WORLD · ZERO DOMAIN', title: '光湖零域', summary: '协议实验、热更新与系统架构的公共观察窗。这里只投影已登记的运行状态,不把草案冒充成已执行能力。' },
|
||||
}
|
||||
|
||||
function StatePill({ children, online = false }: { children: ReactNode; online?: boolean }) {
|
||||
return <span className={`public-domain-state${online ? ' online' : ''}`}>{children}</span>
|
||||
}
|
||||
|
||||
export function PublicDomainPortal(props: PublicDomainPortalProps) {
|
||||
const copy = DOMAIN_COPY[props.domain]
|
||||
const modules = props.marketplace?.items.filter((item) => item.artifactKind === 'PHYSICAL_MODULE') || []
|
||||
const skills = props.marketplace?.items.filter((item) => item.artifactKind === 'COGNITIVE_SKILL') || []
|
||||
return <section className={`public-domain-portal public-domain-${props.domain.toLowerCase()}`} aria-label={`${copy.title}公共入口`}>
|
||||
<header className="public-domain-header">
|
||||
<button type="button" onClick={props.onBack}>← 返回五域湖面</button>
|
||||
<div><span>{copy.eyebrow}</span><h1>{copy.title}</h1><p>{copy.summary}</p></div>
|
||||
<StatePill online>前三域公共只读入口</StatePill>
|
||||
</header>
|
||||
|
||||
{props.domain === 'MAIN_DOMAIN' && <>
|
||||
<div className="public-domain-metrics" aria-label="主域实时状态">
|
||||
<article><span>当前客户端</span><b>HoloLake 0.5.0</b><small>本机运行版本</small></article>
|
||||
<article><span>光湖历</span><b>第 {props.guanghuEraDay ?? '—'} 天</b><small>{props.beijingTime || '时间坐标读取中'}</small></article>
|
||||
<article><span>公众协议</span><b>{props.publicDistribution?.version || '等待线上版本'}</b><small>目录纪元 {props.publicDistribution?.epoch ?? '—'} · {props.publicDistribution?.receiptCount ?? 0} 条回执</small></article>
|
||||
</div>
|
||||
<div className="public-domain-grid">
|
||||
<article><span>最新公共纪事</span><h2>{props.latestEvent?.title || '曜冥纪元长河正在读取'}</h2><p>{props.latestEvent?.summary || '时间证据不可读时不生成替代公告。'}</p></article>
|
||||
<article><span>版本与通知</span><h2>{props.publicDistribution?.trustState === 'PROVISIONED' ? '双签分发信任已配置' : '公众分发状态待验证'}</h2><p>所有公共协议和模块更新都以本机验签结果为准,不用首页文案代替真实发布回执。</p></article>
|
||||
<article><span>公共边界</span><h2>能看见,不等于获得权限</h2><p>主域公开信息不会授予第五域、零感域、终端或用户频道的访问权。</p></article>
|
||||
</div>
|
||||
</>}
|
||||
|
||||
{props.domain === 'BRANCH_DOMAIN' && <>
|
||||
<div className="public-domain-metrics" aria-label="分域目录状态">
|
||||
<article><span>目录状态</span><b>{props.marketplace?.state === 'ACTIVE_VERIFIED_CATALOG' ? '已验签在线' : '等待读取'}</b><small>{props.marketplace?.trustState || '双签状态未知'}</small></article>
|
||||
<article><span>目录纪元</span><b>{props.marketplace?.catalogEpoch ?? '—'}</b><small>{props.marketplace?.catalogReceiptCount ?? 0} 条验真回执</small></article>
|
||||
<article><span>公开资源</span><b>{props.marketplace?.itemCount ?? '—'} 项</b><small>{modules.length} 个成品模块 · {skills.length} 个思维技能</small></article>
|
||||
</div>
|
||||
<div className="public-market-groups">
|
||||
<section><header><div><span>PHYSICAL MODULES</span><h2>成品模块应用</h2></div><StatePill>{modules.length} 项</StatePill></header>{modules.length ? modules.map((item) => <article key={item.itemNumber}><div><h3>{item.displayName}</h3><p>{item.summary}</p></div><small>版本 {item.version}</small></article>) : <p className="public-domain-empty">尚未读到已验签模块目录。</p>}</section>
|
||||
<section><header><div><span>COGNITIVE SKILLS</span><h2>思维大脑技能</h2></div><StatePill>{skills.length} 项</StatePill></header>{skills.length ? skills.map((item) => <article key={item.itemNumber}><div><h3>{item.displayName}</h3><p>{item.summary}</p></div><small>{item.executionAuthority ? '执行权异常' : '只读 · 无执行权'}</small></article>) : <p className="public-domain-empty">尚未读到已验签技能目录。</p>}</section>
|
||||
</div>
|
||||
{props.marketplaceMessage && <p className="public-domain-message">{props.marketplaceMessage}</p>}
|
||||
<div className="public-domain-actions"><button type="button" disabled={props.marketplaceBusy} onClick={props.onRefreshMarketplace}>{props.marketplaceBusy ? '正在核验公共目录…' : '重新核验公共目录'}</button>{props.authenticated && props.onOpenMarketplace ? <button className="primary" type="button" onClick={props.onOpenMarketplace}>进入完整模块商城</button> : <button className="primary" type="button" onClick={props.onOpenGate}>返回编号入口</button>}</div>
|
||||
</>}
|
||||
|
||||
{props.domain === 'ZERO_DOMAIN' && <>
|
||||
<div className="public-domain-metrics" aria-label="零域运行状态">
|
||||
<article><span>协议运行层</span><b>{props.glsRuntime ? '已读取' : '失败关闭'}</b><small>{props.glsRuntime?.state || '运行清单不可读'}</small></article>
|
||||
<article><span>编号坐标</span><b>{props.glsRuntime?.numberCoordinateCount ?? '—'}</b><small>未解析 {props.glsRuntime?.unresolvedNumberReferenceCount ?? '—'}</small></article>
|
||||
<article><span>决策回执</span><b>{props.glsKernel?.decisionReceiptCount ?? '—'}</b><small>已实现 {props.glsKernel?.implementedStageCount ?? '—'} 个阶段</small></article>
|
||||
</div>
|
||||
<div className="public-domain-grid">
|
||||
<article><span>协议清单</span><h2>{props.glsRuntime?.protocolCount ?? '—'} 个独立协议来源</h2><p>{props.glsRuntime?.executableProjectionCount ?? '—'} 个显式原生投影进入运行图;原始协议文本不会直接执行。</p></article>
|
||||
<article><span>冲突守卫</span><h2>{props.glsRuntime?.authorityConflictCount === 0 ? '当前没有登记冲突' : `${props.glsRuntime?.authorityConflictCount ?? '—'} 个冲突待处理`}</h2><p>未知坐标、歧义和未验证状态均保持失败关闭,不由模型自行补猜。</p></article>
|
||||
<article><span>模型边界</span><h2>{props.glsKernel?.modelCanOverrideDecision ? '异常:模型可覆盖' : '模型不能覆盖系统裁决'}</h2><p>拒绝 {props.glsKernel?.denyCount ?? '—'} · 歧义 {props.glsKernel?.ambiguousCount ?? '—'} · 未验证 {props.glsKernel?.unverifiedCount ?? '—'}</p></article>
|
||||
</div>
|
||||
</>}
|
||||
|
||||
<footer><p>公共入口只负责浏览当前可信投影,不授予安装、写入或域内管理权限。</p>{props.domain !== 'BRANCH_DOMAIN' && <button type="button" onClick={props.onOpenGate}>{props.authenticated ? '返回我的频道' : '返回编号入口'}</button>}</footer>
|
||||
</section>
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
.public-domain-portal { position:absolute; z-index:36; inset:58px 0 0; overflow:auto; padding:clamp(28px,4vw,58px) clamp(24px,6vw,88px) 54px; color:var(--content-primary); background:linear-gradient(180deg,rgba(5,9,22,.96),rgba(6,10,24,.985)); backdrop-filter:blur(24px); }
|
||||
.public-domain-header { display:grid; grid-template-columns:minmax(120px,.55fr) minmax(420px,1.7fr) minmax(180px,.55fr); gap:32px; align-items:start; max-width:1280px; margin:0 auto 34px; }
|
||||
.public-domain-header > button,.public-domain-actions button,.public-domain-portal footer button { width:max-content; border:1px solid var(--panel-edge); border-radius:999px; padding:10px 15px; color:var(--content-secondary); background:var(--panel-soft); cursor:pointer; font:700 12px/1.2 inherit; }
|
||||
.public-domain-header > button:hover,.public-domain-actions button:hover,.public-domain-portal footer button:hover { color:var(--accent-light); border-color:var(--accent); }
|
||||
.public-domain-header div > span,.public-market-groups header span { color:var(--accent-light); font-size:10px; font-weight:800; letter-spacing:.18em; }
|
||||
.public-domain-header h1 { margin:10px 0 10px; font-size:clamp(36px,5vw,64px); line-height:1; letter-spacing:.05em; }
|
||||
.public-domain-header p { max-width:760px; margin:0; color:var(--content-secondary); font-size:14px; line-height:1.8; }
|
||||
.public-domain-state { justify-self:end; width:max-content; padding:7px 10px; border:1px solid var(--panel-edge); border-radius:999px; color:var(--content-secondary); background:var(--panel-soft); font-size:10px; font-weight:800; letter-spacing:.08em; }
|
||||
.public-domain-state.online { color:var(--success); border-color:color-mix(in srgb,var(--success) 42%,transparent); }
|
||||
.public-domain-metrics { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; max-width:1280px; margin:0 auto 18px; }
|
||||
.public-domain-metrics article,.public-domain-grid article,.public-market-groups > section { border:1px solid var(--panel-edge); border-radius:18px; background:var(--panel-bg); box-shadow:inset 0 1px 0 rgba(255,255,255,.035); }
|
||||
.public-domain-metrics article { min-height:126px; padding:22px; }
|
||||
.public-domain-metrics span,.public-domain-grid article > span { color:var(--content-muted); font-size:10px; font-weight:800; letter-spacing:.14em; }
|
||||
.public-domain-metrics b { display:block; margin-top:12px; font-size:22px; line-height:1.2; }
|
||||
.public-domain-metrics small { display:block; margin-top:8px; color:var(--content-secondary); font-size:11px; line-height:1.5; }
|
||||
.public-domain-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; max-width:1280px; margin:0 auto; }
|
||||
.public-domain-grid article { min-height:210px; padding:26px; }
|
||||
.public-domain-grid h2 { margin:18px 0 10px; font-size:20px; line-height:1.35; }
|
||||
.public-domain-grid p,.public-market-groups p { margin:0; color:var(--content-secondary); font-size:13px; line-height:1.75; }
|
||||
.public-market-groups { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; max-width:1280px; margin:0 auto; }
|
||||
.public-market-groups > section { padding:24px; }
|
||||
.public-market-groups header { display:flex; align-items:start; justify-content:space-between; gap:18px; margin-bottom:16px; }
|
||||
.public-market-groups h2 { margin:8px 0 0; font-size:20px; }
|
||||
.public-market-groups section > article { display:flex; align-items:start; justify-content:space-between; gap:18px; padding:16px 0; border-top:1px solid var(--panel-edge); }
|
||||
.public-market-groups h3 { margin:0 0 7px; font-size:14px; }
|
||||
.public-market-groups article small { flex:0 0 auto; color:var(--content-muted); font-size:10px; }
|
||||
.public-domain-empty { padding:28px 0; text-align:center; }
|
||||
.public-domain-message { max-width:1280px; margin:14px auto 0; color:var(--content-secondary); font-size:12px; }
|
||||
.public-domain-actions { display:flex; justify-content:flex-end; gap:10px; max-width:1280px; margin:20px auto 0; }
|
||||
.public-domain-actions button.primary { color:var(--button-primary-text); border-color:var(--button-primary-bg); background:var(--button-primary-bg); box-shadow:var(--button-primary-shadow); }
|
||||
.public-domain-portal footer { display:flex; align-items:center; justify-content:space-between; gap:24px; max-width:1280px; margin:26px auto 0; padding-top:20px; border-top:1px solid var(--panel-edge); }
|
||||
.public-domain-portal footer p { margin:0; color:var(--content-muted); font-size:11px; line-height:1.6; }
|
||||
@media (max-width:900px) { .public-domain-header { grid-template-columns:1fr; gap:16px; } .public-domain-state { justify-self:start; } .public-domain-metrics,.public-domain-grid,.public-market-groups { grid-template-columns:1fr; } }
|
||||
@media (max-width:620px) { .public-domain-portal { padding-inline:18px; } .public-domain-header { min-width:0; } .public-domain-header div { min-width:0; } .public-domain-header h1 { font-size:38px; } .public-domain-actions,.public-domain-portal footer { align-items:stretch; flex-direction:column; } .public-domain-actions button,.public-domain-portal footer button { width:100%; } }
|
||||
Loading…
Reference in a new issue