4runr-os 2.10.76 → 2.10.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -378,6 +378,96 @@ fn main() -> Result<()> {
378
378
  .unwrap_or("?")
379
379
  ));
380
380
  }
381
+ // Shield dashboard — match pending id before legacy shieldStatus branch
382
+ else if Some(&resp.id)
383
+ == app.state.pending_shield_load_id.as_ref()
384
+ {
385
+ app.state.pending_shield_load_id = None;
386
+ if obj.get("shieldLoad").and_then(|v| v.as_bool()) == Some(true)
387
+ {
388
+ use crate::ui::shield_dashboard::{
389
+ parse_shield_activity, parse_shield_breakdown,
390
+ parse_shield_load,
391
+ };
392
+ let health_val = obj
393
+ .get("health")
394
+ .cloned()
395
+ .unwrap_or(serde_json::Value::Null);
396
+ let config_val = obj
397
+ .get("config")
398
+ .cloned()
399
+ .unwrap_or(serde_json::Value::Null);
400
+ let metrics_val = obj
401
+ .get("metrics")
402
+ .cloned()
403
+ .unwrap_or(serde_json::Value::Null);
404
+ let gateway_health_val = obj
405
+ .get("gatewayHealth")
406
+ .cloned()
407
+ .unwrap_or(serde_json::Value::Null);
408
+ let runs_val = obj
409
+ .get("recentRuns")
410
+ .cloned()
411
+ .unwrap_or(serde_json::Value::Null);
412
+ let warnings_vec: Vec<String> = obj
413
+ .get("warnings")
414
+ .and_then(|v| v.as_array())
415
+ .map(|a| {
416
+ a.iter()
417
+ .filter_map(|w| {
418
+ w.as_str().map(|s| s.to_string())
419
+ })
420
+ .collect()
421
+ })
422
+ .unwrap_or_default();
423
+ let activity_val = obj
424
+ .get("activity")
425
+ .cloned()
426
+ .unwrap_or(serde_json::Value::Null);
427
+ let breakdown_val = obj
428
+ .get("shieldBreakdown")
429
+ .cloned()
430
+ .unwrap_or(serde_json::Value::Null);
431
+ let snapshot_at = obj
432
+ .get("snapshotAt")
433
+ .and_then(|v| v.as_str())
434
+ .unwrap_or("")
435
+ .to_string();
436
+ let (h, c, m, mut w, recent) = parse_shield_load(
437
+ &health_val,
438
+ &config_val,
439
+ &metrics_val,
440
+ &gateway_health_val,
441
+ &runs_val,
442
+ );
443
+ w.extend(warnings_vec);
444
+ let activity = parse_shield_activity(&activity_val);
445
+ let breakdown_lines =
446
+ parse_shield_breakdown(&breakdown_val);
447
+ app.state.shield_dashboard.apply_load(
448
+ &h,
449
+ &c,
450
+ &m,
451
+ w,
452
+ recent,
453
+ activity,
454
+ breakdown_lines,
455
+ snapshot_at,
456
+ );
457
+ app.state.shield_mode = h.mode.clone();
458
+ app.state.shield_blocks_total = m.blocks;
459
+ app.state.shield_masks_total = m.masks;
460
+ app.add_log(format!(
461
+ "✓ [{}] Shield loaded — {} block(s), {} mask(s)",
462
+ short_id, m.blocks, m.masks
463
+ ));
464
+ } else {
465
+ app.state.shield_dashboard.fail_loading(
466
+ "Shield load: unexpected response shape".to_string(),
467
+ );
468
+ }
469
+ app.request_render("shield_loaded");
470
+ }
381
471
  else if obj.get("shieldDemo").and_then(|v| v.as_bool())
382
472
  == Some(true)
383
473
  {
@@ -707,66 +797,6 @@ fn main() -> Result<()> {
707
797
  }
708
798
  app.request_render("run_quick_ok");
709
799
  }
710
- // Shield dashboard: load health + config + metrics + history
711
- else if Some(&resp.id)
712
- == app.state.pending_shield_load_id.as_ref()
713
- {
714
- app.state.pending_shield_load_id = None;
715
- if obj.get("shieldLoad").and_then(|v| v.as_bool()) == Some(true)
716
- {
717
- use crate::ui::shield_dashboard::parse_shield_load;
718
- let health_val = obj
719
- .get("health")
720
- .cloned()
721
- .unwrap_or(serde_json::Value::Null);
722
- let config_val = obj
723
- .get("config")
724
- .cloned()
725
- .unwrap_or(serde_json::Value::Null);
726
- let metrics_val = obj
727
- .get("metrics")
728
- .cloned()
729
- .unwrap_or(serde_json::Value::Null);
730
- let gateway_health_val = obj
731
- .get("gatewayHealth")
732
- .cloned()
733
- .unwrap_or(serde_json::Value::Null);
734
- let runs_val = obj
735
- .get("recentRuns")
736
- .cloned()
737
- .unwrap_or(serde_json::Value::Null);
738
- let warnings_vec: Vec<String> = obj
739
- .get("warnings")
740
- .and_then(|v| v.as_array())
741
- .map(|a| {
742
- a.iter()
743
- .filter_map(|w| {
744
- w.as_str().map(|s| s.to_string())
745
- })
746
- .collect()
747
- })
748
- .unwrap_or_default();
749
- let (h, c, m, mut w, recent) = parse_shield_load(
750
- &health_val,
751
- &config_val,
752
- &metrics_val,
753
- &gateway_health_val,
754
- &runs_val,
755
- );
756
- w.extend(warnings_vec);
757
- app.state.shield_dashboard.apply_load(
758
- &h, &c, &m, w, recent,
759
- );
760
- app.state.shield_mode = h.mode.clone();
761
- app.state.shield_blocks_total = m.blocks;
762
- app.state.shield_masks_total = m.masks;
763
- app.add_log(format!(
764
- "✓ [{}] Shield loaded — {} block(s), {} mask(s)",
765
- short_id, m.blocks, m.masks
766
- ));
767
- }
768
- app.request_render("shield_loaded");
769
- }
770
800
  // Sentinel config: load templates + current + health
771
801
  else if Some(&resp.id)
772
802
  == app.state.pending_sentinel_load_id.as_ref()