feat: expose HoloLake development lane to authenticated carriers

This commit is contained in:
冰朔 2026-08-17 15:41:04 +08:00
commit 96769846ac
7 changed files with 324 additions and 9 deletions

View file

@ -62,6 +62,13 @@ interface HomeStatus {
releaseRecoveryState: string
mcpRole: string
}
interface DevelopmentWriteLaneStatus {
state: 'AVAILABLE' | 'ACTIVE'
laneId?: string
ownerInstanceId?: string
acquiredAtUnixMs?: number
observedAtUnixMs: number
}
interface PersonalChannelIdentity { humanSubjectId: string; displayName: string; channelId: string; createdAtUnixMs: number }
interface PersonalChannelModule { moduleId: string; kind: string; displayName: string; state: string; installedAtUnixMs: number; timeZone: string; calendarName: string; clockVerification: string }
interface LoginSession { username: string; host: string; domain: string; signedInAtUnixMs: number }
@ -573,6 +580,7 @@ function HoloLakeApp() {
const [serverPncc, setServerPncc] = useState<ServerPnccProjection | null>(null)
const [serverPnccBusy, setServerPnccBusy] = useState(false)
const [serverPnccReadback, setServerPnccReadback] = useState<'WAITING' | 'LIVE' | 'UNAVAILABLE'>('WAITING')
const [developmentLane, setDevelopmentLane] = useState<DevelopmentWriteLaneStatus | null>(null)
const [enterpriseEntry, setEnterpriseEntry] = useState<EnterpriseEntry | null>(null)
const [enterpriseEntryBusy, setEnterpriseEntryBusy] = useState(false)
const [enterpriseReceiptBusy, setEnterpriseReceiptBusy] = useState(false)
@ -600,12 +608,14 @@ function HoloLakeApp() {
const startup = await invoke<PersonaTimeAuthorityStartup>('start_persona_time_authority')
setBeijingCoordinate(startup.coordinate)
} catch { /* 联网失败时其余首页能力仍可启动。 */ }
const [homeResult, personalResult, knowledgeResult, codeResult, eraResult] = await Promise.allSettled([
const localAccountId = getOrCreateLocalId('hololake-local-account', 'human-local')
const [homeResult, personalResult, knowledgeResult, codeResult, eraResult, developmentResult] = await Promise.allSettled([
invoke<HomeStatus>('get_hololake_home_status'),
invoke<PersonalChannelSnapshot>('get_personal_channel_snapshot'),
invoke<KnowledgeSnapshot>('get_knowledge_snapshot'),
invoke<CodeChannelSnapshot>('get_code_channel_snapshot'),
invoke<GuanghuEraTimeline>('get_guanghu_era_timeline'),
invoke<DevelopmentWriteLaneStatus>('inspect_development_write_lane', { input: { accountId: localAccountId } }),
])
if (homeResult.status === 'fulfilled') setStatus(homeResult.value)
if (personalResult.status === 'fulfilled') setPersonal(personalResult.value)
@ -615,6 +625,7 @@ function HoloLakeApp() {
setEraTimeline(eraResult.value)
setBeijingCoordinate(eraResult.value.currentCoordinate)
}
setDevelopmentLane(developmentResult.status === 'fulfilled' ? developmentResult.value : null)
}, [])
const loadReceipts = useCallback(async () => {
try {
@ -1321,7 +1332,7 @@ function HoloLakeApp() {
</dl> : <p className="boundary-note">线</p>}
<button className="secondary-button" type="button" disabled={serverPnccBusy} onClick={() => void refreshServerPncc()}>{serverPnccBusy ? '正在读取…' : '重新读取主控状态'}</button>
</section>
<section className="plain-panel"><header><div><h2> GH-PNCC </h2><p></p></div></header><dl className="evidence-list"><div><dt></dt><dd>{status.codeRepositoryMountCount}</dd></div><div><dt></dt><dd>{status.pnccReceiptCount}</dd></div><div><dt></dt><dd>{status.codeRepositoryMountCount > 0 && status.pnccReceiptCount > 0 ? '已有可核验运行记录' : '接口已接入,尚无完整运行记录'}</dd></div></dl></section>
<section className="plain-panel"><header><div><h2> GH-PNCC </h2><p></p></div></header><dl className="evidence-list"><div><dt></dt><dd>{status.codeRepositoryMountCount}</dd></div><div><dt></dt><dd>{status.pnccReceiptCount}</dd></div><div><dt></dt><dd>{developmentLane?.state === 'ACTIVE' ? '已切入 HoloLake' : '等待受控载体'}</dd></div><div><dt>线</dt><dd>{developmentLane?.laneId || '—'}</dd></div><div><dt></dt><dd>{developmentLane?.ownerInstanceId || '—'}</dd></div><div><dt></dt><dd>{developmentLane?.state === 'ACTIVE' ? '开发执行环境已由 HoloLake 持有单写通道' : status.codeRepositoryMountCount > 0 && status.pnccReceiptCount > 0 ? '已有可核验运行记录' : '接口已接入,尚无完整运行记录'}</dd></div></dl></section>
<section className="plain-panel">
<header><div><h2></h2><p></p></div><span className={zeroPoint?.route === 'verified' ? 'status-chip online' : 'status-chip'}>{zeroPoint ? (zeroPoint.route === 'verified' ? '验证有效' : '功能受限') : '正在读取'}</span></header>
<dl className="evidence-list">