4runr-os 2.9.52 → 2.9.53

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.
@@ -144,7 +144,7 @@ fn render_header(f: &mut Frame, area: Rect, state: &AppState) {
144
144
 
145
145
  // Line 1: Brand + version + mode + uptime - Bug 3 fix: Use "4Runr." with dot (matches brand logo)
146
146
  // Use npm package version (2.9.24) - matches package.json
147
- const PACKAGE_VERSION: &str = "2.9.52";
147
+ const PACKAGE_VERSION: &str = "2.9.53";
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)),
@@ -151,6 +151,9 @@ fn render_content(f: &mut Frame, area: Rect, state: &mut AppState, render_id: u6
151
151
  }
152
152
 
153
153
  fn render_options_list(f: &mut Frame, area: Rect, state: &mut AppState, _render_id: u64) {
154
+ // Clear this rect first so no duplicate rows from previous frame
155
+ f.render_widget(Clear, area);
156
+
154
157
  let options = vec![
155
158
  ("Local Bundle", GatewayOption::LocalBundle),
156
159
  ("4Runr Server", GatewayOption::CloudServer),
@@ -202,6 +205,9 @@ fn render_options_list(f: &mut Frame, area: Rect, state: &mut AppState, _render_
202
205
  }
203
206
 
204
207
  fn render_option_details(f: &mut Frame, area: Rect, state: &AppState, _render_id: u64) {
208
+ // Clear this rect first so no leftover from previous option
209
+ f.render_widget(Clear, area);
210
+
205
211
  let selected_option = &state.setup_portal.selected_option;
206
212
  let detection_result = &state.setup_portal.detection_result;
207
213
 
@@ -297,21 +303,27 @@ fn render_option_details(f: &mut Frame, area: Rect, state: &AppState, _render_id
297
303
  let inner = block.inner(area);
298
304
  f.render_widget(block, area);
299
305
 
300
- // Fill the inner area with background explicitly
301
- let fill = Block::default().style(Style::default().bg(BG_PANEL));
302
- f.render_widget(fill, inner);
303
-
304
- // Now render paragraph (content only, no block)
305
- let paragraph = Paragraph::new(content)
306
- .wrap(Wrap { trim: true })
307
- .style(Style::default().bg(BG_PANEL));
308
-
309
306
  // Validate area before rendering
310
307
  let terminal_size = f.size();
311
308
  if inner.width == 0 || inner.height == 0 ||
312
309
  inner.x >= terminal_size.width || inner.y >= terminal_size.height {
313
310
  return;
314
311
  }
312
+
313
+ // Pad content to at least inner height so every row is painted (no leftover text)
314
+ let min_lines = inner.height as usize;
315
+ let mut padded: Vec<Line> = content.into_iter().collect();
316
+ while padded.len() < min_lines {
317
+ padded.push(Line::from(""));
318
+ }
319
+
320
+ // Fill inner with background then paragraph so every cell is overwritten
321
+ let fill = Block::default().style(Style::default().bg(BG_PANEL));
322
+ f.render_widget(fill, inner);
323
+
324
+ let paragraph = Paragraph::new(padded)
325
+ .wrap(Wrap { trim: true })
326
+ .style(Style::default().bg(BG_PANEL));
315
327
 
316
328
  f.render_widget(paragraph, inner);
317
329
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "2.9.52",
3
+ "version": "2.9.53",
4
4
  "type": "module",
5
- "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.52: Setup Portal - block+fill+widget render (no flicker, no corruption). v2.9.51: No clear on nav, removed debug logs. ⚠️ Pre-MVP / Development Phase",
5
+ "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.53: Setup Portal - Clear per panel + padded details (no corruption, no flicker). v2.9.52: Block+fill+widget. ⚠️ Pre-MVP / Development Phase",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "4runr": "dist/index.js",