diff --git a/core/Cargo.lock b/core/Cargo.lock index 08195110..2cfc92fc 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.17-alpha" +version = "1.7.18-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 524abbf8..11d07d1c 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.17-alpha" +version = "1.7.18-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/core/archipelago/src/federation/sync.rs b/core/archipelago/src/federation/sync.rs index 59250c31..629e6833 100644 --- a/core/archipelago/src/federation/sync.rs +++ b/core/archipelago/src/federation/sync.rs @@ -107,8 +107,10 @@ pub async fn sync_with_peer_by_did( } /// Merge peers advertised by a Trusted federated node into our own -/// federation list. New peers are added at `Observer` trust (not -/// Trusted — that requires a direct invite). Existing peers get their +/// federation list. New peers are added at `Trusted` — hints only +/// arrive from peers we already trust, and `build_local_state` only +/// re-exports our Trusted list, so transitive membership carries the +/// same trust the direct-invite path gives. Existing peers get their /// `fips_npub` refreshed if we hadn't learned it yet. /// /// Peers we are (us) or that we already track by DID are skipped. @@ -142,7 +144,7 @@ async fn merge_transitive_peers( pubkey: hint.pubkey.clone(), onion: hint.onion.clone(), name: hint.name.clone(), - trust_level: TrustLevel::Observer, + trust_level: TrustLevel::Trusted, added_at: chrono::Utc::now().to_rfc3339(), last_seen: None, last_state: None, diff --git a/core/archipelago/src/update.rs b/core/archipelago/src/update.rs index fc77c8b8..62c2ed73 100644 --- a/core/archipelago/src/update.rs +++ b/core/archipelago/src/update.rs @@ -244,6 +244,14 @@ pub async fn download_update(data_dir: &Path) -> Result { let mut downloaded = 0u64; let total_bytes: u64 = manifest.components.iter().map(|c| c.size_bytes).sum(); + info!( + version = %manifest.version, + components = manifest.components.len(), + total_bytes, + staging = %staging_dir.display(), + "Starting update download" + ); + // Clear any stale cancel flag from a prior aborted run, then seed // the live counters so polls during the handshake show the right // denominator immediately instead of 0/0 → NaN%. @@ -477,17 +485,27 @@ pub async fn cancel_download(data_dir: &Path) -> Result<()> { DOWNLOAD_BYTES.store(0, Ordering::Relaxed); DOWNLOAD_TOTAL.store(0, Ordering::Relaxed); let staging = data_dir.join("update-staging"); - if staging.exists() { - let _ = tokio::fs::remove_dir_all(&staging).await; - } + let wiped = if staging.exists() { + tokio::fs::remove_dir_all(&staging).await.is_ok() + } else { + false + }; // Clear the "downloaded, ready to apply" marker too — a canceled // download is not a staged update. + let mut cleared_marker = false; if let Ok(mut state) = load_state(data_dir).await { if state.update_in_progress { state.update_in_progress = false; let _ = save_state(data_dir, &state).await; + cleared_marker = true; } } + info!( + staging = %staging.display(), + wiped, + cleared_marker, + "Update download canceled" + ); Ok(()) } @@ -529,6 +547,12 @@ pub async fn apply_update(data_dir: &Path) -> Result<()> { .await .context("Failed to create backup dir")?; + info!( + staging = %staging_dir.display(), + backup = %backup_dir.display(), + "Applying staged update" + ); + // Back up current backend binary let current_binary = Path::new("/usr/local/bin/archipelago"); if current_binary.exists() { diff --git a/neode-ui/package-lock.json b/neode-ui/package-lock.json index 51dc0d80..0d619a1a 100644 --- a/neode-ui/package-lock.json +++ b/neode-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "neode-ui", - "version": "1.3.5", + "version": "1.6.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "neode-ui", - "version": "1.3.5", + "version": "1.6.0-alpha", "dependencies": { "@types/dompurify": "^3.0.5", "@vue-leaflet/vue-leaflet": "^0.10.1", diff --git a/neode-ui/src/views/settings/AccountInfoSection.vue b/neode-ui/src/views/settings/AccountInfoSection.vue index f1cdc62f..3af00db9 100644 --- a/neode-ui/src/views/settings/AccountInfoSection.vue +++ b/neode-ui/src/views/settings/AccountInfoSection.vue @@ -180,6 +180,17 @@ init()
+ +
+
+ v1.7.18-alpha + Apr 20, 2026 +
+
+

Nodes discovered through a trusted peer now land as Trusted instead of Observer. When your federated peer shares its own peer list with you, those nodes get the same trust level as a direct invite — the link they came through is already one you vetted, so you no longer need to promote them by hand before they can be used normally.

+

The update flow now writes clearer logs at every step. Start of download, cancel, and apply each emit a one-line entry to the system journal with the staging path and the affected files, so if a download misbehaves on your node it's easy to see exactly where it got to.

+
+