From e6d45eaea86b4275f05392abba1a67c5877c3ca3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=86=B0=E6=9C=94?= <565183519@qq.com>
Date: Sun, 16 Aug 2026 23:39:52 +0800
Subject: [PATCH] fix(desktop): place private lake modules and sleep idle
layers
---
.../scripts/ambient-motion-idle.test.mjs | 2 ++
.../fifth-domain-private-route.test.mjs | 13 ++++++++++
.../hololake-native-desktop/src/main.tsx | 26 ++++++++++++-------
.../hololake-native-desktop/src/styles.css | 5 ++++
4 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/product-source/hololake-native-desktop/scripts/ambient-motion-idle.test.mjs b/product-source/hololake-native-desktop/scripts/ambient-motion-idle.test.mjs
index 8174ab79d..cb94110ba 100644
--- a/product-source/hololake-native-desktop/scripts/ambient-motion-idle.test.mjs
+++ b/product-source/hololake-native-desktop/scripts/ambient-motion-idle.test.mjs
@@ -7,6 +7,8 @@ const styles = fs.readFileSync(new URL('../src/styles.css', import.meta.url), 'u
test('ambient lake motion sleeps by default and wakes only after human interaction', () => {
assert.match(source, /const \[motionAwake, setMotionAwake\] = useState\(false\)/)
+ assert.match(source, /function LakeAtmosphere\(\{ awake \}: \{ awake: boolean \}\)/)
+ assert.match(source, /\{awake &&
{
assert.match(source, /title="心跳核心频道" meta="冰朔 · 私人频道"/)
assert.match(source, /title="爱之核心子系统" meta="责任主体 · 之之"/)
+ assert.match(source, /title="光之湖" meta="人格体居所"/)
assert.match(source, /worldStage === 'heartbeat'/)
assert.match(source, /
心跳核心频道<\/h1>/)
})
+test('knowledge belongs to Heartbeat Core while persona repositories belong to Light Lake', () => {
+ const heartbeatStart = source.indexOf("worldStage === 'heartbeat'")
+ const lightLakeStart = source.indexOf("worldStage === 'lightLake'", heartbeatStart)
+ const toolStart = source.indexOf("worldStage === 'tool'", lightLakeStart)
+ const heartbeat = source.slice(heartbeatStart, lightLakeStart)
+ const lightLake = source.slice(lightLakeStart, toolStart)
+ assert.match(heartbeat, /title="知识空间"/)
+ assert.doesNotMatch(heartbeat, /人格体代码仓库|title="光之湖"/)
+ assert.match(lightLake, /光之湖<\/h1>/)
+ assert.match(lightLake, /title="人格体代码仓库"/)
+})
+
test('Fifth Domain human numbers are paired with their own login account', () => {
assert.match(source, /'ICE-GL∞': 'bingshuo'/)
assert.match(source, /'ICE-GL-ZHI∞': 'zhizhi'/)
diff --git a/product-source/hololake-native-desktop/src/main.tsx b/product-source/hololake-native-desktop/src/main.tsx
index 717737c13..2c1cf04cc 100644
--- a/product-source/hololake-native-desktop/src/main.tsx
+++ b/product-source/hololake-native-desktop/src/main.tsx
@@ -49,7 +49,7 @@ import './styles.css'
type ThemeId = 'night' | 'dawn' | 'nebula' | 'candle' | 'clear'
type ViewId = 'overview' | 'knowledge' | 'code' | 'receipts' | 'system'
-type WorldStage = 'domain' | 'heart' | 'heartbeat' | 'love' | 'tomorrow' | 'bottle' | 'channel' | 'tool'
+type WorldStage = 'domain' | 'heart' | 'heartbeat' | 'lightLake' | 'love' | 'tomorrow' | 'bottle' | 'channel' | 'tool'
type KnowledgeSource = 'native' | 'legacy'
interface HomeStatus {
@@ -278,17 +278,17 @@ const glintPoints = Array.from({ length: 58 }, (_, index) => ({
delay: (index % 11) * .43,
}))
-function LakeAtmosphere() {
+function LakeAtmosphere({ awake }: { awake: boolean }) {
return <>
{starPoints.map(([left, top, size, duration], index) => ) }
-
+ {awake &&
{glintPoints.map((point, index) => ) }
-
+
}
>
}
@@ -424,6 +424,7 @@ function HoloLakeApp() {
const [theme, setTheme] = useState(() => (window.localStorage.getItem('hololake-theme') as ThemeId) || 'night')
const [view, setView] = useState('overview')
const [worldStage, setWorldStage] = useState('domain')
+ const [toolReturnStage, setToolReturnStage] = useState('channel')
const [status, setStatus] = useState(previewStatus)
const [personal, setPersonal] = useState(previewPersonal)
const [knowledge, setKnowledge] = useState(previewKnowledge)
@@ -1239,6 +1240,7 @@ function HoloLakeApp() {
const openWorldTool = (nextView: ViewId) => {
setView(nextView)
+ setToolReturnStage(worldStage === 'tool' ? 'channel' : worldStage)
setWorldStage('tool')
}
@@ -1249,7 +1251,7 @@ function HoloLakeApp() {
const resolvedDomain = zeroPoint?.resolvedDomain || ''
const activeGate = domainGates.find((gate) => gate.domain === activeDomainInfo)
return
-
+
HoloLake
光湖语言系统 · 通用人工智能操作平台
GH-AIOS · GUANGHU AI OPERATING SYSTEM
@@ -1308,10 +1310,8 @@ function HoloLakeApp() {
}
const isZhizhi = repoLogin.domain === 'FIFTH_DOMAIN' && zeroPoint?.userNumber === 'ICE-GL-ZHI∞'
- const toolReturnStage: WorldStage = isZhizhi ? 'tomorrow' : repoLogin.domain === 'FIFTH_DOMAIN' ? 'heartbeat' : 'channel'
-
return
-
+
{worldStage === 'domain' &&
@@ -1352,6 +1352,7 @@ function HoloLakeApp() {
{repoLogin.domain === 'FIFTH_DOMAIN' ? <>
setWorldStage('bottle')}/>
setWorldStage('heartbeat')}/>
+ setWorldStage('lightLake')}/>
setWorldStage('love')}/>
openWorldTool('system')}/>
> : <>
@@ -1367,8 +1368,13 @@ function HoloLakeApp() {
心跳核心频道
冰朔 · ICE-GL∞ · 私人频道全景
openWorldTool('overview')}/>
openWorldTool('knowledge')}/>
- openWorldTool('code')}/>
- openWorldTool('receipts')}/>
+ openWorldTool('system')}/>
+ }
+ {worldStage === 'lightLake' && repoLogin.domain === 'FIFTH_DOMAIN' &&
+
+
+ openWorldTool('receipts')}/>
+ openWorldTool('code')}/>
openWorldTool('system')}/>
}
{worldStage === 'tool' &&
diff --git a/product-source/hololake-native-desktop/src/styles.css b/product-source/hololake-native-desktop/src/styles.css
index 46e9ff8a8..374b34b8e 100644
--- a/product-source/hololake-native-desktop/src/styles.css
+++ b/product-source/hololake-native-desktop/src/styles.css
@@ -589,6 +589,11 @@ svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-lineca
.official-world.motion-awake .pool-halo { animation: world-pool-breathe 5.8s ease-in-out infinite; }
.official-world.motion-awake .pool-ring { animation: world-ripple 5.5s ease-out infinite; }
.official-world.motion-awake .nucleus-locus i { animation: world-pool-breathe 5.2s ease-in-out infinite; }
+.official-world:not(.motion-awake) .world-nebula,
+.official-world:not(.motion-awake) .world-mist,
+.official-world:not(.motion-awake) .pool-halo,
+.official-world:not(.motion-awake) .nucleus-locus i { filter: none; }
+.official-world:not(.motion-awake) .world-titlebar { backdrop-filter: none; -webkit-backdrop-filter: none; background: color-mix(in srgb, var(--surface-sky) 92%, transparent); }
.official-hero { position: absolute; z-index: 10; top: 26px; left: 0; right: 0; text-align: center; }
.official-hero h1 { margin: 0; color: var(--content-primary); font-size: clamp(24px, 3vw, 34px); font-weight: 700; letter-spacing: .09em; }