4runr-os 2.9.23 → 2.9.25
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.
|
Binary file
|
|
@@ -58,9 +58,9 @@ pub fn render(f: &mut Frame, state: &AppState) {
|
|
|
58
58
|
.direction(Direction::Vertical)
|
|
59
59
|
.constraints([
|
|
60
60
|
Constraint::Length(3), // Header
|
|
61
|
-
Constraint::Length(2), // Description
|
|
62
|
-
Constraint::Length(
|
|
63
|
-
Constraint::Min(10), // Content area (error/success/connecting)
|
|
61
|
+
Constraint::Length(2), // Description
|
|
62
|
+
Constraint::Length(3), // Input field (single bordered block)
|
|
63
|
+
Constraint::Min(10), // Content area (error/success/connecting)
|
|
64
64
|
Constraint::Length(3), // Actions
|
|
65
65
|
])
|
|
66
66
|
.split(portal_area);
|
|
@@ -74,6 +74,9 @@ pub fn render(f: &mut Frame, state: &AppState) {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
fn render_header(f: &mut Frame, area: Rect, state: &AppState) {
|
|
77
|
+
// Clear area to prevent duplication
|
|
78
|
+
f.render_widget(Clear, area);
|
|
79
|
+
|
|
77
80
|
let portal = &state.connection_portal;
|
|
78
81
|
|
|
79
82
|
let (title, border_color) = if portal.connection_success {
|
|
@@ -96,6 +99,9 @@ fn render_header(f: &mut Frame, area: Rect, state: &AppState) {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
fn render_description(f: &mut Frame, area: Rect) {
|
|
102
|
+
// Clear area to prevent duplication
|
|
103
|
+
f.render_widget(Clear, area);
|
|
104
|
+
|
|
99
105
|
let text = Paragraph::new("Connect to a Gateway server to enable advanced features")
|
|
100
106
|
.style(Style::default().fg(TEXT_DIM))
|
|
101
107
|
.alignment(Alignment::Center);
|
|
@@ -104,6 +110,9 @@ fn render_description(f: &mut Frame, area: Rect) {
|
|
|
104
110
|
}
|
|
105
111
|
|
|
106
112
|
fn render_input_fields(f: &mut Frame, area: Rect, state: &AppState) {
|
|
113
|
+
// CRITICAL: Clear the input area first to prevent duplication
|
|
114
|
+
f.render_widget(Clear, area);
|
|
115
|
+
|
|
107
116
|
let portal = &state.connection_portal;
|
|
108
117
|
let url_focused = portal.focused_field == PortalField::GatewayUrl;
|
|
109
118
|
let input_enabled = !portal.connecting;
|
|
@@ -118,37 +127,27 @@ fn render_input_fields(f: &mut Frame, area: Rect, state: &AppState) {
|
|
|
118
127
|
};
|
|
119
128
|
|
|
120
129
|
let url_display = if portal.gateway_url.is_empty() {
|
|
121
|
-
"
|
|
130
|
+
"".to_string()
|
|
122
131
|
} else {
|
|
123
132
|
portal.gateway_url.clone()
|
|
124
133
|
};
|
|
125
134
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
Span::styled(" ┌", url_style),
|
|
133
|
-
Span::styled("─".repeat((area.width.saturating_sub(5)) as usize), url_style),
|
|
134
|
-
Span::styled("┐", url_style),
|
|
135
|
-
]),
|
|
136
|
-
Line::from(vec![
|
|
137
|
-
Span::styled(" │ ", url_style),
|
|
138
|
-
Span::styled(url_display, url_style),
|
|
139
|
-
]),
|
|
140
|
-
Line::from(vec![
|
|
141
|
-
Span::styled(" └", url_style),
|
|
142
|
-
Span::styled("─".repeat((area.width.saturating_sub(5)) as usize), url_style),
|
|
143
|
-
Span::styled("┘", url_style),
|
|
144
|
-
]),
|
|
145
|
-
Line::from(""),
|
|
146
|
-
];
|
|
135
|
+
// Use a bordered Block for the input field
|
|
136
|
+
let block = Block::default()
|
|
137
|
+
.title(" Gateway URL ")
|
|
138
|
+
.borders(Borders::ALL)
|
|
139
|
+
.border_style(url_style)
|
|
140
|
+
.style(Style::default().bg(BG_PANEL));
|
|
147
141
|
|
|
148
|
-
let
|
|
142
|
+
let inner = block.inner(area);
|
|
143
|
+
f.render_widget(block, area);
|
|
144
|
+
|
|
145
|
+
// Render the URL text inside the block
|
|
146
|
+
let text = Paragraph::new(url_display)
|
|
147
|
+
.style(url_style)
|
|
149
148
|
.alignment(Alignment::Left);
|
|
150
149
|
|
|
151
|
-
f.render_widget(
|
|
150
|
+
f.render_widget(text, inner);
|
|
152
151
|
}
|
|
153
152
|
|
|
154
153
|
fn render_content_area(f: &mut Frame, area: Rect, state: &AppState) {
|
|
@@ -343,6 +342,9 @@ fn render_instructions(f: &mut Frame, area: Rect) {
|
|
|
343
342
|
}
|
|
344
343
|
|
|
345
344
|
fn render_actions(f: &mut Frame, area: Rect, state: &AppState) {
|
|
345
|
+
// Clear area to prevent duplication
|
|
346
|
+
f.render_widget(Clear, area);
|
|
347
|
+
|
|
346
348
|
let portal = &state.connection_portal;
|
|
347
349
|
|
|
348
350
|
let text = if portal.connecting {
|
package/mk3-tui/src/ui/layout.rs
CHANGED
|
@@ -143,8 +143,8 @@ fn render_header(f: &mut Frame, area: Rect, state: &AppState) {
|
|
|
143
143
|
};
|
|
144
144
|
|
|
145
145
|
// Line 1: Brand + version + mode + uptime - Bug 3 fix: Use "4Runr." with dot (matches brand logo)
|
|
146
|
-
// Use npm package version (2.9.
|
|
147
|
-
const PACKAGE_VERSION: &str = "2.9.
|
|
146
|
+
// Use npm package version (2.9.24) - matches package.json
|
|
147
|
+
const PACKAGE_VERSION: &str = "2.9.25";
|
|
148
148
|
let brand_line = Line::from(vec![
|
|
149
149
|
Span::styled("4Runr.", Style::default().fg(BRAND_PURPLE).add_modifier(Modifier::BOLD)),
|
|
150
150
|
Span::styled(" AI AGENT OS", Style::default().fg(BRAND_VIOLET)),
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "4runr-os",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.25",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.
|
|
5
|
+
"description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.25: Completely rewrote Connection Portal input field rendering - replaced manual box drawing with clean Ratatui Block widget to eliminate duplication. v2.9.24: Fixed Connection Portal duplication - added Clear widgets to all render areas to prevent artifacts. ⚠️ Pre-MVP / Development Phase",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"4runr": "dist/index.js",
|