cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit c83b69f154fb172d91a0c7b2649007559302a578
parent c761bd1de80119716c87b2cfffa37f85b23984b4
Author: triesap <tyson@radroots.org>
Date:   Tue,  7 Jul 2026 19:21:36 +0000

sync: expose deferred preview queue counts

- show preview-unavailable and deferred-until-implemented counts in SDK-backed status views
- carry the new outbox counters through sync and transport status output
- keep actionable pending counts separate from non-actionable Reticulum preview work
- update focused sync view tests for the explicit queue fields

Diffstat:
MCargo.lock | 1+
Msrc/runtime/store.rs | 2++
Msrc/runtime/sync.rs | 24+++++++++++++++++++++++-
Msrc/runtime/transport.rs | 2++
Msrc/view/runtime.rs | 8++++++++
5 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -4029,6 +4029,7 @@ dependencies = [ name = "radroots_transport_publish_protocol" version = "0.1.0-alpha.2" dependencies = [ + "radroots_transport", "serde", ] diff --git a/src/runtime/store.rs b/src/runtime/store.rs @@ -430,6 +430,8 @@ fn sdk_outbox_status_view( retryable_events: status.retryable_events, terminal_events: status.terminal_events, failed_terminal_events: status.failed_terminal_events, + preview_unavailable_events: status.preview_unavailable_events, + deferred_until_implemented_events: status.deferred_until_implemented_events, ready_signed_events: status.ready_signed_events, publishing_events: status.publishing_events, last_attempt_at_ms: status.last_attempt_at_ms, diff --git a/src/runtime/sync.rs b/src/runtime/sync.rs @@ -614,6 +614,10 @@ fn sdk_sync_queue(receipt: &SyncStatusReceipt) -> SyncQueueView { retryable_count: Some(usize_from_i64(receipt.outbox.retryable_events)), terminal_count: Some(usize_from_i64(receipt.outbox.terminal_events)), failed_terminal_count: Some(usize_from_i64(receipt.outbox.failed_terminal_events)), + preview_unavailable_count: Some(usize_from_i64(receipt.outbox.preview_unavailable_events)), + deferred_until_implemented_count: Some(usize_from_i64( + receipt.outbox.deferred_until_implemented_events, + )), ready_signed_count: Some(usize_from_i64(receipt.outbox.ready_signed_events)), publishing_count: Some(usize_from_i64(receipt.outbox.publishing_events)), last_attempt_at_ms: receipt.outbox.last_attempt_at_ms, @@ -629,6 +633,8 @@ fn derived_projection_sync_queue(expected_count: usize, pending_count: usize) -> retryable_count: None, terminal_count: None, failed_terminal_count: None, + preview_unavailable_count: None, + deferred_until_implemented_count: None, ready_signed_count: None, publishing_count: None, last_attempt_at_ms: None, @@ -1540,6 +1546,8 @@ mod tests { 0, 0, 0, + 0, + 0, None, None, &["wss://relay-a.example.com", "wss://relay-b.example.com"], @@ -1554,6 +1562,8 @@ mod tests { assert_eq!(view.queue.pending_count, 0); assert_eq!(view.queue.retryable_count, Some(0)); assert_eq!(view.queue.terminal_count, Some(0)); + assert_eq!(view.queue.preview_unavailable_count, Some(0)); + assert_eq!(view.queue.deferred_until_implemented_count, Some(0)); assert_eq!(view.queue.ready_signed_count, Some(0)); assert_eq!(view.actions, vec!["radroots sync pull"]); } @@ -1572,6 +1582,8 @@ mod tests { 1, 2, 1, + 0, + 0, 1, 0, Some(1_700_000_010_000), @@ -1586,6 +1598,8 @@ mod tests { assert_eq!(view.queue.retryable_count, Some(1)); assert_eq!(view.queue.terminal_count, Some(2)); assert_eq!(view.queue.failed_terminal_count, Some(1)); + assert_eq!(view.queue.preview_unavailable_count, Some(0)); + assert_eq!(view.queue.deferred_until_implemented_count, Some(0)); assert_eq!(view.queue.ready_signed_count, Some(1)); assert_eq!(view.queue.last_attempt_at_ms, Some(1_700_000_010_000)); assert_eq!( @@ -1610,6 +1624,8 @@ mod tests { 0, 0, 0, + 0, + 0, 1, 0, None, @@ -1645,7 +1661,7 @@ mod tests { let view = sdk_push_view( &config, PushOutboxReceipt::default(), - sdk_status_receipt(0, 0, 0, 0, 0, 0, 0, 0, None, None, &[]), + sdk_status_receipt(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, None, None, &[]), ); assert_eq!(view.state, "ready"); @@ -1704,6 +1720,8 @@ mod tests { 0, 0, 0, + 0, + 0, Some(1_700_000_020_000), Some("auth-required: login".to_owned()), &["wss://relay-a.example.com", "wss://relay-b.example.com"], @@ -1749,6 +1767,8 @@ mod tests { retryable_events: i64, terminal_events: i64, failed_terminal_events: i64, + preview_unavailable_events: i64, + deferred_until_implemented_events: i64, ready_signed_events: i64, publishing_events: i64, last_attempt_at_ms: Option<i64>, @@ -1771,6 +1791,8 @@ mod tests { retryable_events, terminal_events, failed_terminal_events, + preview_unavailable_events, + deferred_until_implemented_events, ready_signed_events, publishing_events, last_attempt_at_ms, diff --git a/src/runtime/transport.rs b/src/runtime/transport.rs @@ -110,6 +110,8 @@ pub fn outbox_status( pending_count: receipt.outbox.pending_events, retryable_count: receipt.outbox.retryable_events, terminal_count: receipt.outbox.terminal_events, + preview_unavailable_count: receipt.outbox.preview_unavailable_events, + deferred_until_implemented_count: receipt.outbox.deferred_until_implemented_events, ready_signed_count: receipt.outbox.ready_signed_events, publishing_count: receipt.outbox.publishing_events, last_attempt_at_ms: receipt.outbox.last_attempt_at_ms, diff --git a/src/view/runtime.rs b/src/view/runtime.rs @@ -634,6 +634,8 @@ pub struct SdkOutboxStatusView { pub retryable_events: i64, pub terminal_events: i64, pub failed_terminal_events: i64, + pub preview_unavailable_events: i64, + pub deferred_until_implemented_events: i64, pub ready_signed_events: i64, pub publishing_events: i64, #[serde(skip_serializing_if = "Option::is_none")] @@ -3159,6 +3161,10 @@ pub struct SyncQueueView { #[serde(skip_serializing_if = "Option::is_none")] pub failed_terminal_count: Option<usize>, #[serde(skip_serializing_if = "Option::is_none")] + pub preview_unavailable_count: Option<usize>, + #[serde(skip_serializing_if = "Option::is_none")] + pub deferred_until_implemented_count: Option<usize>, + #[serde(skip_serializing_if = "Option::is_none")] pub ready_signed_count: Option<usize>, #[serde(skip_serializing_if = "Option::is_none")] pub publishing_count: Option<usize>, @@ -3297,6 +3303,8 @@ pub struct TransportOutboxStatusView { pub pending_count: i64, pub retryable_count: i64, pub terminal_count: i64, + pub preview_unavailable_count: i64, + pub deferred_until_implemented_count: i64, pub ready_signed_count: i64, pub publishing_count: i64, #[serde(skip_serializing_if = "Option::is_none")]