4runr-os 2.9.66 → 2.9.68

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.
@@ -641,6 +641,23 @@ impl App {
641
641
 
642
642
  // === MAIN INPUT HANDLING ===
643
643
  match key.code {
644
+ // F2 - Open Setup Portal (Gateway options) from main screen
645
+ KeyCode::F(2) => {
646
+ self.state.navigation.navigate_to_base(Screen::SetupPortal);
647
+ self.state.setup_portal.reset();
648
+ if let Some(ws) = ws_client {
649
+ self.state.setup_portal.detecting = true;
650
+ if let Ok(id) = ws.send_command("setup.detect", None) {
651
+ self.state.pending_setup_detect_id = Some(id);
652
+ self.add_log("[SETUP] Detecting Gateway options...".to_string());
653
+ } else {
654
+ self.state.setup_portal.detecting = false;
655
+ self.state.setup_portal.error = Some("Failed to start detection".to_string());
656
+ }
657
+ }
658
+ self.state.logs.push_back("[NAV] Opening Setup Portal (F2)...".into());
659
+ self.request_render("open_setup_portal");
660
+ }
644
661
  // Typing - ALL characters go to command input (immediate render for responsiveness)
645
662
  KeyCode::Char(c) => {
646
663
  // CRITICAL: Always set focused when typing to show cursor
@@ -610,9 +610,11 @@ fn main() -> Result<()> {
610
610
  }
611
611
 
612
612
  // BACK TO PHASE 1.1: Clear every frame on Setup Portal (no corruption, but flickers)
613
- // We'll add logging to understand WHY it flickers, then fix the flicker surgically.
614
- if matches!(current_screen, crate::screens::Screen::SetupPortal) {
613
+ // Flicker debug: log CLEAR then DRAW so we can confirm flicker = clear then redraw.
614
+ let on_setup_portal = matches!(current_screen, crate::screens::Screen::SetupPortal);
615
+ if on_setup_portal {
615
616
  terminal.autoresize()?;
617
+ debug_log::log_flicker_debug("CLEAR_BEFORE", &format!("switching={}", switching_to_setup_portal));
616
618
  terminal.clear()?;
617
619
  if switching_to_setup_portal {
618
620
  #[cfg(debug_assertions)]
@@ -628,6 +630,9 @@ fn main() -> Result<()> {
628
630
  terminal.draw(|f| app.render(f))?;
629
631
  let render_duration = render_start.elapsed().as_millis() as u64;
630
632
  app.record_render(render_duration);
633
+ if on_setup_portal {
634
+ debug_log::log_flicker_debug("DRAW_DONE", &format!("ms={}", render_duration));
635
+ }
631
636
 
632
637
  // Update previous screen tracking
633
638
  previous_screen = Some(current_screen);
@@ -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.66";
147
+ const PACKAGE_VERSION: &str = "2.9.68";
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.66",
3
+ "version": "2.9.68",
4
4
  "type": "module",
5
- "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.66: Setup Portal windowed - clear every frame (no corruption). v2.9.65: Explicit resize. ⚠️ Pre-MVP / Development Phase",
5
+ "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.68: F2 opens Setup Portal from main. v2.9.67: Flicker debug. ⚠️ Pre-MVP / Development Phase",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "4runr": "dist/index.js",