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.
@@ -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(9), // Input fields
63
- Constraint::Min(10), // Content area (error/success/connecting) - increased for bordered boxes
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
- " ".to_string()
130
+ "".to_string()
122
131
  } else {
123
132
  portal.gateway_url.clone()
124
133
  };
125
134
 
126
- let lines = vec![
127
- Line::from(""),
128
- Line::from(vec![
129
- Span::styled(" Gateway URL", Style::default().fg(TEXT_DIM)),
130
- ]),
131
- Line::from(vec![
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 paragraph = Paragraph::new(lines)
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(paragraph, area);
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 {
@@ -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.23) - matches package.json
147
- const PACKAGE_VERSION: &str = "2.9.23";
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.23",
3
+ "version": "2.9.25",
4
4
  "type": "module",
5
- "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.23: Cleaned up Connection Portal status displays - removed duplicates, improved spacing, cleaner formatting. v2.9.22: Status fixes with immediate render. v2.9.21: Improved status display. ⚠️ Pre-MVP / Development Phase",
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",