feat: add remote-first education work lake

This commit is contained in:
冰朔 2026-08-07 20:41:03 +08:00
commit 333cd222c5
43 changed files with 923 additions and 74 deletions

View file

@ -22,11 +22,13 @@ import { GUANGHU_THEMES, type GuanghuTheme } from '../lib/guanghuTheme'
import { planGuanghuLivingSystem } from '../utils/planGuanghuLivingSystem'
import { Button } from './ui/button'
import { HOLOLAKE_REPOSITORY_URL } from '../constants/feedback'
import { isEducationWorkLakePath } from '../lib/educationWorkLake'
import { GuanghuRouterConsole } from './GuanghuRouterConsole'
import { GuanghuWorldMap } from './GuanghuWorldMap'
import { GuanghuWorldLoginGate } from './GuanghuWorldLoginGate'
import { FifthDomainSystems } from './FifthDomainSystems'
import { EternalLakeHeartPage } from './EternalLakeHeartPage'
import { EducationWorkLake } from './EducationWorkLake'
import {
Dialog,
DialogContent,
@ -89,14 +91,17 @@ export function HoloLakeHome({
onOpenLocalWorkspace,
livingSystemTarget,
}: HoloLakeHomeProps) {
const [route, setRoute] = useState<ChannelRoute>('world')
const initialRoute: ChannelRoute = isEducationWorkLakePath(window.location.pathname)
? 'education-work-lake'
: 'world'
const [route, setRoute] = useState<ChannelRoute>(initialRoute)
const [livingPlan, setLivingPlan] = useState<GuanghuLivingSystemPlan>(() => (
createDeterministicLivingSystemPlan(createLivingSystemEvent({
currentRoute: 'world',
currentRoute: initialRoute,
eventId: 'system-start',
intent: 'navigate',
receiptIds: [],
requestedRoute: 'world',
requestedRoute: initialRoute,
worldOpen: false,
}))
))
@ -407,6 +412,10 @@ export function HoloLakeHome({
)
}
if (route === 'education-work-lake') {
return <EducationWorkLake locale={locale} />
}
if (route === 'servers') {
return (
<section className="channel-stage channel-stage--node">
@ -453,6 +462,7 @@ export function HoloLakeHome({
<p className="channel-stage__lead">{t('hololake.channel.heartbeatDescription')}</p>
<div className="channel-grid channel-grid--three">
<RouteCard eyebrow="PERSONA · AI AGENT" title="人格体工作舱" description="与当前频道的人格体持续协作;保留多 Agent、模型选择、权限模式、工具调用、执行回执与历史会话。" action="打开人格体工作舱" onOpen={onOpenAiWorkspace ? openAiWorkspace : undefined} />
<RouteCard eyebrow="INDUSTRY · EDUCATION" title="教育工作湖" description="通过语言指令调出并编辑文档、表格、对比图、仪表盘与知识。第一阶段权限保留在应用内。" action="进入教育工作湖" onOpen={() => navigate('education-work-lake')} />
<RouteCard eyebrow="MODULE · KNOWLEDGE" title={t('hololake.home.moduleKnowledgeTitle')} description={t('hololake.home.moduleKnowledgeDescription')} action={t('hololake.channel.openKnowledge')} onOpen={openKnowledgeBase} />
<RouteCard eyebrow="LOCAL COMPUTER · LIVE FOLDER" title="本地电脑工作区" description="选择电脑上的任意项目文件夹。编程 AI 直接在原文件夹写入页面,光湖实时显示,不再复制到旧笔记库。" action="打开本地文件夹" onOpen={onOpenLocalWorkspace ? openLocalWorkspace : undefined} />
<RouteCard eyebrow="MODULE · VIDEO AI" title={t('hololake.channel.videoAiTitle')} description={t('hololake.channel.videoAiDescription')} status={t('hololake.channel.prototypeMounted')} />
@ -492,6 +502,7 @@ export function HoloLakeHome({
<Button data-active={route === 'world'} variant="ghost" onClick={() => navigate('world')}><i data-color="cyan" /></Button>
<Button variant="ghost" onClick={openKnowledgeBase}><i data-color="blue" /></Button>
<Button disabled={!onOpenAiWorkspace} variant="ghost" onClick={openAiWorkspace}><i data-color="violet" />Agent </Button>
<Button data-active={route === 'education-work-lake'} variant="ghost" onClick={() => navigate('education-work-lake')}><i data-color="green" /></Button>
<Button disabled={!onOpenLocalWorkspace} variant="ghost" onClick={openLocalWorkspace}><i data-color="amber" /></Button>
</>}
{fifthDomainOpen && <>