4runr-os 2.10.40 → 2.10.41
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/mk3-tui/src/app/render_scheduler.rs +111 -112
- package/mk3-tui/src/app.rs +526 -304
- package/mk3-tui/src/debug_log.rs +131 -124
- package/mk3-tui/src/io/mod.rs +63 -66
- package/mk3-tui/src/io/protocol.rs +14 -15
- package/mk3-tui/src/io/stdio.rs +31 -32
- package/mk3-tui/src/io/ws.rs +25 -32
- package/mk3-tui/src/main.rs +593 -279
- package/mk3-tui/src/screens/mod.rs +53 -39
- package/mk3-tui/src/storage/cache.rs +221 -224
- package/mk3-tui/src/storage/mod.rs +5 -6
- package/mk3-tui/src/ui/agent_builder.rs +1148 -922
- package/mk3-tui/src/ui/agent_list.rs +344 -295
- package/mk3-tui/src/ui/boot.rs +145 -148
- package/mk3-tui/src/ui/connection_portal.rs +121 -98
- package/mk3-tui/src/ui/help.rs +340 -284
- package/mk3-tui/src/ui/layout.rs +966 -803
- package/mk3-tui/src/ui/mod.rs +1 -1
- package/mk3-tui/src/ui/portal_monitoring.rs +58 -50
- package/mk3-tui/src/ui/run_manager.rs +784 -764
- package/mk3-tui/src/ui/safe_viewport.rs +236 -235
- package/mk3-tui/src/ui/settings.rs +414 -362
- package/mk3-tui/src/ui/setup_portal.rs +158 -101
- package/mk3-tui/src/websocket.rs +315 -308
- package/package.json +2 -2
|
@@ -1,112 +1,111 @@
|
|
|
1
|
-
use std::time::{Duration, Instant};
|
|
2
|
-
|
|
3
|
-
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
4
|
-
pub enum RunMode {
|
|
5
|
-
Local,
|
|
6
|
-
Browser,
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
impl RunMode {
|
|
10
|
-
pub fn detect() -> Self {
|
|
11
|
-
if let Ok(mode) = std::env::var("RUN_MODE") {
|
|
12
|
-
match mode.to_lowercase().as_str() {
|
|
13
|
-
"browser" | "web" => return RunMode::Browser,
|
|
14
|
-
"local" => return RunMode::Local,
|
|
15
|
-
_ => {}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Auto-detect
|
|
20
|
-
if std::env::var("AWS_EXECUTION_ENV").is_ok()
|
|
21
|
-
|| std::env::var("CLOUDSHELL").is_ok()
|
|
22
|
-
|| std::env::var("TUI_WEB").map(|v| v == "1").unwrap_or(false)
|
|
23
|
-
{
|
|
24
|
-
RunMode::Browser
|
|
25
|
-
} else {
|
|
26
|
-
RunMode::Local
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
pub struct RenderScheduler {
|
|
32
|
-
run_mode: RunMode,
|
|
33
|
-
last_render: Instant,
|
|
34
|
-
render_scheduled: bool,
|
|
35
|
-
immediate_render: bool,
|
|
36
|
-
render_scheduled_count: u64,
|
|
37
|
-
min_render_interval: Duration,
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
impl RenderScheduler {
|
|
41
|
-
pub fn new() -> Self {
|
|
42
|
-
let run_mode = RunMode::detect();
|
|
43
|
-
let min_render_interval = match run_mode {
|
|
44
|
-
RunMode::Browser => Duration::from_millis(50),
|
|
45
|
-
RunMode::Local => Duration::from_millis(8),
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
Self {
|
|
49
|
-
run_mode,
|
|
50
|
-
last_render: Instant::now(),
|
|
51
|
-
render_scheduled: false,
|
|
52
|
-
immediate_render: false,
|
|
53
|
-
render_scheduled_count: 0,
|
|
54
|
-
min_render_interval,
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
pub fn run_mode(&self) -> RunMode {
|
|
59
|
-
self.run_mode
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
pub fn request_render(&mut self, _reason: &str) -> bool {
|
|
63
|
-
self.render_scheduled_count += 1;
|
|
64
|
-
self.render_scheduled = true;
|
|
65
|
-
let now = Instant::now();
|
|
66
|
-
let elapsed = now.duration_since(self.last_render);
|
|
67
|
-
if elapsed >= self.min_render_interval {
|
|
68
|
-
// Throttle allows: next frame should draw without waiting another interval
|
|
69
|
-
self.immediate_render = true;
|
|
70
|
-
true
|
|
71
|
-
} else {
|
|
72
|
-
false
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/// Request immediate render (bypass throttling) - for critical input events
|
|
77
|
-
pub fn request_immediate_render(&mut self, _reason: &str) -> bool {
|
|
78
|
-
self.render_scheduled_count += 1;
|
|
79
|
-
self.render_scheduled = true;
|
|
80
|
-
self.immediate_render = true;
|
|
81
|
-
true
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
pub fn should_render(&mut self) -> bool {
|
|
85
|
-
if !self.render_scheduled {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
let now = Instant::now();
|
|
90
|
-
let elapsed = now.duration_since(self.last_render);
|
|
91
|
-
|
|
92
|
-
// If immediate render was requested, bypass throttling
|
|
93
|
-
// Otherwise, respect the throttle interval
|
|
94
|
-
if self.immediate_render || elapsed >= self.min_render_interval {
|
|
95
|
-
self.last_render = now;
|
|
96
|
-
self.render_scheduled = false;
|
|
97
|
-
self.immediate_render = false;
|
|
98
|
-
true
|
|
99
|
-
} else {
|
|
100
|
-
false
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
pub fn render_scheduled_count(&self) -> u64 {
|
|
105
|
-
self.render_scheduled_count
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
pub fn min_render_interval_ms(&self) -> u64 {
|
|
109
|
-
self.min_render_interval.as_millis() as u64
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
1
|
+
use std::time::{Duration, Instant};
|
|
2
|
+
|
|
3
|
+
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
4
|
+
pub enum RunMode {
|
|
5
|
+
Local,
|
|
6
|
+
Browser,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
impl RunMode {
|
|
10
|
+
pub fn detect() -> Self {
|
|
11
|
+
if let Ok(mode) = std::env::var("RUN_MODE") {
|
|
12
|
+
match mode.to_lowercase().as_str() {
|
|
13
|
+
"browser" | "web" => return RunMode::Browser,
|
|
14
|
+
"local" => return RunMode::Local,
|
|
15
|
+
_ => {}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Auto-detect
|
|
20
|
+
if std::env::var("AWS_EXECUTION_ENV").is_ok()
|
|
21
|
+
|| std::env::var("CLOUDSHELL").is_ok()
|
|
22
|
+
|| std::env::var("TUI_WEB").map(|v| v == "1").unwrap_or(false)
|
|
23
|
+
{
|
|
24
|
+
RunMode::Browser
|
|
25
|
+
} else {
|
|
26
|
+
RunMode::Local
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
pub struct RenderScheduler {
|
|
32
|
+
run_mode: RunMode,
|
|
33
|
+
last_render: Instant,
|
|
34
|
+
render_scheduled: bool,
|
|
35
|
+
immediate_render: bool, // Flag for immediate renders (bypass throttling)
|
|
36
|
+
render_scheduled_count: u64,
|
|
37
|
+
min_render_interval: Duration,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
impl RenderScheduler {
|
|
41
|
+
pub fn new() -> Self {
|
|
42
|
+
let run_mode = RunMode::detect();
|
|
43
|
+
let min_render_interval = match run_mode {
|
|
44
|
+
RunMode::Browser => Duration::from_millis(50), // Max 20 FPS (browser limitation)
|
|
45
|
+
RunMode::Local => Duration::from_millis(8), // Max 120 FPS (ultra-responsive, throttled for non-input)
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
Self {
|
|
49
|
+
run_mode,
|
|
50
|
+
last_render: Instant::now(),
|
|
51
|
+
render_scheduled: false,
|
|
52
|
+
immediate_render: false,
|
|
53
|
+
render_scheduled_count: 0,
|
|
54
|
+
min_render_interval,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
pub fn run_mode(&self) -> RunMode {
|
|
59
|
+
self.run_mode
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
pub fn request_render(&mut self, _reason: &str) -> bool {
|
|
63
|
+
self.render_scheduled_count += 1;
|
|
64
|
+
self.render_scheduled = true; // Always schedule so the next should_render() can draw
|
|
65
|
+
let now = Instant::now();
|
|
66
|
+
let elapsed = now.duration_since(self.last_render);
|
|
67
|
+
if elapsed >= self.min_render_interval {
|
|
68
|
+
// Throttle allows: next frame should draw without waiting another interval
|
|
69
|
+
self.immediate_render = true;
|
|
70
|
+
true
|
|
71
|
+
} else {
|
|
72
|
+
false
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Request immediate render (bypass throttling) - for critical input events
|
|
77
|
+
pub fn request_immediate_render(&mut self, _reason: &str) -> bool {
|
|
78
|
+
self.render_scheduled_count += 1;
|
|
79
|
+
self.render_scheduled = true;
|
|
80
|
+
self.immediate_render = true; // Mark as immediate to bypass throttling
|
|
81
|
+
true
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
pub fn should_render(&mut self) -> bool {
|
|
85
|
+
if !self.render_scheduled {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let now = Instant::now();
|
|
90
|
+
let elapsed = now.duration_since(self.last_render);
|
|
91
|
+
|
|
92
|
+
// If immediate render was requested, bypass throttling
|
|
93
|
+
// Otherwise, respect the throttle interval
|
|
94
|
+
if self.immediate_render || elapsed >= self.min_render_interval {
|
|
95
|
+
self.last_render = now;
|
|
96
|
+
self.render_scheduled = false;
|
|
97
|
+
self.immediate_render = false; // Clear immediate flag
|
|
98
|
+
true
|
|
99
|
+
} else {
|
|
100
|
+
false
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
pub fn render_scheduled_count(&self) -> u64 {
|
|
105
|
+
self.render_scheduled_count
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
pub fn min_render_interval_ms(&self) -> u64 {
|
|
109
|
+
self.min_render_interval.as_millis() as u64
|
|
110
|
+
}
|
|
111
|
+
}
|