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.
- package/apps/gateway/package-lock.json +21 -21
- package/dist/gateway-observability.d.ts +17 -0
- package/dist/gateway-observability.d.ts.map +1 -1
- package/dist/gateway-observability.js +54 -0
- package/dist/gateway-observability.js.map +1 -1
- package/dist/tui-handlers.d.ts.map +1 -1
- package/dist/tui-handlers.js +116 -15
- package/dist/tui-handlers.js.map +1 -1
- package/mk3-tui/binaries/win32-x64/mk3-tui.exe +0 -0
- package/mk3-tui/src/app.rs +24 -3
- package/mk3-tui/src/main.rs +90 -60
- package/mk3-tui/src/ui/shield_dashboard.rs +388 -44
- package/package.json +2 -2
package/mk3-tui/src/main.rs
CHANGED
|
@@ -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()
|