fix(desktop): allow public world before account login
This commit is contained in:
parent
b83c575279
commit
466542ac93
6 changed files with 89 additions and 6 deletions
|
|
@ -7,6 +7,7 @@
|
|||
"persona_relationship_gate": {"shows_species":"AGE","shows_current_persona_identity":true,"shows_invalid_age_individual_numbers":false,"human_confirms_relationship_mapping":true,"human_confirmation_is_persona_acceptance":false,"responsibility_acceptance_is_separate":true},
|
||||
"work_entry": {"domain":"DOMAIN-ZS","channel":"GUANGHU_CHANNEL","preserves_responsibility_domain":true},
|
||||
"personal_route": {"separate_node_ownership_check":true,"enterprise_credentials_are_sufficient":false},
|
||||
"desktop_install_acceptance": {"mac_arm64":"PASS","mac_x86_64":"NOT_BUILT","windows":"NOT_BUILT","automatic_update_channel":"UNPROVISIONED_FAIL_CLOSED"},
|
||||
"ui_template": "REPO-012@27d34dfdbf5df4c67b805402d442e5912c8f4c31:official-login-template-v0.4-locked+inner-screens-v0.1",
|
||||
"source": "routing/hololake-enterprise-four-domain-work-channel.json"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,12 +60,27 @@ test('the locked Qoder world template is the running client structure, not a ski
|
|||
const frontend = read('src/main.tsx')
|
||||
assert.equal(contract.state, 'SERVER_LIVE_CLIENT_UI_INTEGRATED')
|
||||
assert.match(contract.ui_template, /official-login-template-v0\.4-locked\+inner-screens-v0\.1/)
|
||||
assert.equal(contract.desktop_install_acceptance.mac_arm64, 'PASS')
|
||||
assert.equal(contract.desktop_install_acceptance.mac_x86_64, 'NOT_BUILT')
|
||||
assert.equal(contract.desktop_install_acceptance.windows, 'NOT_BUILT')
|
||||
assert.equal(contract.desktop_install_acceptance.automatic_update_channel, 'UNPROVISIONED_FAIL_CLOSED')
|
||||
assert.match(frontend, /number-nucleus/)
|
||||
assert.match(frontend, /worldStage === 'domain'/)
|
||||
assert.match(frontend, /worldStage === 'channel'/)
|
||||
assert.match(frontend, /worldStage === 'tool'/)
|
||||
})
|
||||
|
||||
test('the public five-domain world starts before any private account storage is opened', () => {
|
||||
const library = read('src-tauri/src/lib.rs')
|
||||
const broker = read('src-tauri/src/direct_local_broker.rs')
|
||||
const home = read('src-tauri/src/home_status.rs')
|
||||
assert.match(library, /DirectLocalBrokerState::default\(\)/)
|
||||
assert.match(broker, /HOLOLAKE_AUTHENTICATED_ACCOUNT_REQUIRED/)
|
||||
assert.match(broker, /Ok\(false\)/)
|
||||
assert.match(home, /WAITING_FOR_LOGIN/)
|
||||
assert.doesNotMatch(library, /let broker = direct_local_broker::start\(app\.handle\(\)\)\?/)
|
||||
})
|
||||
|
||||
test('enterprise root uses a bounded lighthouse on the current Linux service node', () => {
|
||||
const contract = JSON.parse(read('contracts/domain-number-routing.json'))
|
||||
assert.equal(contract.server_runtime.enterprise_root, 'ENTERPRISE_LIGHTHOUSE_ON_CURRENT_LINUX_SERVICE_NODE')
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ use std::os::unix::net::{UnixListener, UnixStream};
|
|||
use std::path::{Path, PathBuf};
|
||||
use std::sync::{
|
||||
atomic::{AtomicBool, AtomicUsize, Ordering},
|
||||
mpsc, Arc,
|
||||
mpsc, Arc, Mutex,
|
||||
};
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
|
@ -48,6 +48,51 @@ pub struct DirectLocalBrokerHandle {
|
|||
worker: Option<thread::JoinHandle<()>>,
|
||||
}
|
||||
|
||||
/// Broker 在账号登录前保持休眠;登录后的状态刷新会按账号隔离根幂等启动。
|
||||
/// 这避免为了展示公共五域首页而提前打开任何私人存储目录。
|
||||
#[derive(Default)]
|
||||
pub struct DirectLocalBrokerState {
|
||||
handle: Mutex<Option<DirectLocalBrokerHandle>>,
|
||||
}
|
||||
|
||||
impl DirectLocalBrokerState {
|
||||
pub fn ensure_started(&self, app: &AppHandle) -> Result<bool, String> {
|
||||
let mut handle = self
|
||||
.handle
|
||||
.lock()
|
||||
.map_err(|_| "HOLOLAKE_BROKER_STATE_LOCK_FAILED".to_string())?;
|
||||
if handle.is_some() {
|
||||
return Ok(true);
|
||||
}
|
||||
match start(app) {
|
||||
Ok(started) => {
|
||||
*handle = Some(started);
|
||||
Ok(true)
|
||||
}
|
||||
Err(error)
|
||||
if error
|
||||
.to_string()
|
||||
.contains("HOLOLAKE_AUTHENTICATED_ACCOUNT_REQUIRED") =>
|
||||
{
|
||||
Ok(false)
|
||||
}
|
||||
Err(error) => Err(error.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn active_connection_count(&self) -> usize {
|
||||
self.handle
|
||||
.lock()
|
||||
.ok()
|
||||
.and_then(|handle| {
|
||||
handle
|
||||
.as_ref()
|
||||
.map(DirectLocalBrokerHandle::active_connection_count)
|
||||
})
|
||||
.unwrap_or(0)
|
||||
}
|
||||
}
|
||||
|
||||
impl DirectLocalBrokerHandle {
|
||||
pub fn active_connection_count(&self) -> usize {
|
||||
self.authenticated_connections.load(Ordering::Acquire)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
use crate::direct_local_broker::DirectLocalBrokerHandle;
|
||||
use crate::direct_local_broker::DirectLocalBrokerState;
|
||||
use crate::direct_local_session::{active_session_count_at, direct_session_root};
|
||||
use crate::pncc_receipt_projection::{pncc_projection_root, projection_event_count_at};
|
||||
use crate::pncc_repository_binding::{mounted_repository_count_at, pncc_repository_mount_root};
|
||||
|
|
@ -26,8 +26,23 @@ pub struct HoloLakeHomeStatus {
|
|||
#[tauri::command]
|
||||
pub fn get_hololake_home_status(
|
||||
app: AppHandle,
|
||||
broker: State<'_, DirectLocalBrokerHandle>,
|
||||
broker: State<'_, DirectLocalBrokerState>,
|
||||
) -> Result<HoloLakeHomeStatus, String> {
|
||||
let broker_ready = broker.ensure_started(&app)?;
|
||||
if !broker_ready {
|
||||
return Ok(HoloLakeHomeStatus {
|
||||
schema: "hololake.home-status/v1",
|
||||
direct_local_broker_state: "WAITING_FOR_LOGIN",
|
||||
direct_connection_count: 0,
|
||||
resumable_session_count: 0,
|
||||
code_repository_mount_count: 0,
|
||||
pncc_receipt_count: 0,
|
||||
update_state: release_trust_state()?,
|
||||
release_recovery_state: crate::release_update::release_recovery_state(&app)?,
|
||||
automatic_upstream_updates: false,
|
||||
mcp_role: "DISCOVERY_RECOVERY_COMPATIBILITY_ONLY",
|
||||
});
|
||||
}
|
||||
let session_root = direct_session_root(&app)?;
|
||||
let mount_root = pncc_repository_mount_root(&app)?;
|
||||
let projection_root = pncc_projection_root(&app)?;
|
||||
|
|
|
|||
|
|
@ -96,7 +96,9 @@ pub fn run() {
|
|||
eprintln!("HoloLake zero-point protocol sync was not completed: {error}");
|
||||
}
|
||||
});
|
||||
let broker = direct_local_broker::start(app.handle())?;
|
||||
let broker = direct_local_broker::DirectLocalBrokerState::default();
|
||||
// 公共五域首页必须能在未登录时启动;私人 broker 只在已有账号会话时启动。
|
||||
broker.ensure_started(app.handle())?;
|
||||
app.manage(broker);
|
||||
release_trust::install_updater_if_provisioned(app.handle())?;
|
||||
if let Err(error) = release_update::observe_release_startup(app.handle()) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"schema": "hololake.current-architecture/v1",
|
||||
"architecture_id": "HLP-CURRENT-ARCH-001",
|
||||
"version": "2026-08-16.12",
|
||||
"version": "2026-08-16.13",
|
||||
"state": "CURRENT_CANONICAL",
|
||||
"product": {
|
||||
"formal_name": "光湖语言系统 · 通用人工智能操作平台",
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
},
|
||||
"current_native_edge": {
|
||||
"record_id": "HLP-NATIVE-DOMAIN-MEMBRANE-PNCC-20260816-001",
|
||||
"state": "SOURCE_IMPLEMENTED_ENTERPRISE_IDENTITY_LIGHTHOUSE_LIVE_DESKTOP_INSTALL_ACCEPTANCE_PENDING",
|
||||
"state": "MAC_ARM64_DESKTOP_INSTALLED_AND_LAUNCH_ACCEPTED_CROSS_PLATFORM_RELEASE_PENDING",
|
||||
"native_source": "product-source/hololake-native-desktop",
|
||||
"public_entry": "FIVE_DOMAIN_HOME_NUMBER_ROUTED_BEFORE_DOMAIN_LOGIN",
|
||||
"domain_selection_by_human_allowed": false,
|
||||
|
|
@ -28,6 +28,11 @@
|
|||
"enterprise_relationship_and_responsibility_client_commands": "SOURCE_INTEGRATED_QODER_UI_BOUND_MACOS_KEYCHAIN_SIGNING_READY",
|
||||
"qoder_official_ui_template": "REPO_012_27D34DF_OFFICIAL_LOGIN_V0_4_AND_INNER_SCREENS_V0_1_RUNTIME_INTEGRATED_BROWSER_VERIFIED",
|
||||
"client_world_navigation": "DOMAIN_HOME_TO_CHANNEL_OVERVIEW_TO_TOOL_PROJECTION_NO_TRADITIONAL_GLOBAL_SIDEBAR",
|
||||
"prelogin_private_broker": "WAITING_FOR_LOGIN_NO_PRIVATE_STORAGE_OPENED",
|
||||
"mac_arm64_desktop_install_acceptance": "PASS_DESKTOP_HOLOLAKE_APP_REAL_PROCESS_AND_FIVE_DOMAIN_UI_READBACK",
|
||||
"mac_x86_64_installer": "NOT_BUILT",
|
||||
"windows_installer": "NOT_BUILT",
|
||||
"automatic_update_release_channel": "UNPROVISIONED_FAIL_CLOSED",
|
||||
"windows_secure_credential_bridge": "NOT_IMPLEMENTED_DO_NOT_CLAIM_PERSISTENT_SIGNING",
|
||||
"age_is_persona_species_not_individual_number_namespace": true,
|
||||
"enterprise_persona_identity_namespace": "PENDING_GUANGHU_TEAM_GOVERNANCE",
|
||||
|
|
|
|||
Loading…
Reference in a new issue