4runr-os 2.9.78 → 2.9.80

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.
@@ -1 +1 @@
1
- {"version":3,"file":"package-integrity.d.ts","sourceRoot":"","sources":["../../src/security/package-integrity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBvF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAkB9F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAwB5F;AAyBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmEzG"}
1
+ {"version":3,"file":"package-integrity.d.ts","sourceRoot":"","sources":["../../src/security/package-integrity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBvF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAkB9F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAwB5F;AAyBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgEzG"}
@@ -6,6 +6,7 @@ import * as crypto from 'crypto';
6
6
  import { spawnSync } from 'child_process';
7
7
  import * as fs from 'fs';
8
8
  import { sanitizePackageName } from './validation.js';
9
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
9
10
  /**
10
11
  * Get package integrity hash from npm registry
11
12
  */
@@ -16,8 +17,8 @@ export function getPackageIntegrity(packageName, version) {
16
17
  if (!validation.valid || !validation.sanitized) {
17
18
  throw new Error(`Invalid package name: ${validation.error}`);
18
19
  }
19
- // Get package info from npm (includes integrity hash)
20
- const result = spawnSync('npm', ['view', `${validation.sanitized}@${version}`, 'dist.integrity', '--json'], {
20
+ // Get package info from npm (includes integrity hash); npm.cmd on Windows = no DEP0190
21
+ const result = spawnSync(npmCmd, ['view', `${validation.sanitized}@${version}`, 'dist.integrity', '--json'], {
21
22
  encoding: 'utf-8',
22
23
  stdio: ['ignore', 'pipe', 'pipe']
23
24
  });
@@ -60,7 +61,7 @@ export function verifyInstalledVersion(packageName, expectedVersion) {
60
61
  if (!validation.valid || !validation.sanitized) {
61
62
  return false;
62
63
  }
63
- const result = spawnSync('npm', ['list', '-g', validation.sanitized, '--depth=0', '--json'], {
64
+ const result = spawnSync(npmCmd, ['list', '-g', validation.sanitized, '--depth=0', '--json'], {
64
65
  encoding: 'utf-8',
65
66
  stdio: ['ignore', 'pipe', 'pipe']
66
67
  });
@@ -84,7 +85,7 @@ function npmErrorResult(result) {
84
85
  /** Resolve a tag (e.g. 'latest') to a concrete version from the registry */
85
86
  function resolveTagVersion(packageName, tag) {
86
87
  try {
87
- const result = spawnSync('npm', ['view', `${packageName}@${tag}`, 'version'], {
88
+ const result = spawnSync(npmCmd, ['view', `${packageName}@${tag}`, 'version'], {
88
89
  encoding: 'utf-8',
89
90
  stdio: ['ignore', 'pipe', 'pipe'],
90
91
  });
@@ -108,9 +109,6 @@ export function safeNpmInstall(packageName, version) {
108
109
  if (!validation.valid || !validation.sanitized) {
109
110
  return { success: false, error: `Invalid package name: ${validation.error}` };
110
111
  }
111
- const isWindows = process.platform === 'win32';
112
- // Use npm.cmd on Windows without shell to avoid Node DEP0190 (args + shell: true)
113
- const npmCmd = isWindows ? 'npm.cmd' : 'npm';
114
112
  const spawnOpts = {
115
113
  encoding: 'utf-8',
116
114
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -1 +1 @@
1
- {"version":3,"file":"package-integrity.js","sourceRoot":"","sources":["../../src/security/package-integrity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-integrity.js","sourceRoot":"","sources":["../../src/security/package-integrity.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAoGD;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,GAAE,MAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM5F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAmB,GAAG,IAAI,CAGpG;AAgGD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,GAAE,MAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CA2EjF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,WAAW,GAAE,MAAmB,EAAE,iBAAiB,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvH"}
1
+ {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAsGD;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,GAAE,MAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM5F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAmB,GAAG,IAAI,CAGpG;AAgGD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,GAAE,MAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,CA2EjF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,WAAW,GAAE,MAAmB,EAAE,iBAAiB,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvH"}
@@ -9,14 +9,15 @@ import { fileURLToPath } from 'url';
9
9
  import { dirname } from 'path';
10
10
  const __filename = fileURLToPath(import.meta.url);
11
11
  const __dirname = dirname(__filename);
12
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
12
13
  /**
13
14
  * Get current installed version from package.json
14
15
  */
15
16
  function getCurrentVersion() {
16
17
  try {
17
- // Use npm list to get the actual installed global version
18
+ // Use npm list to get the actual installed global version (npm.cmd on Windows = no shell = no DEP0190)
18
19
  const { spawnSync } = require('child_process');
19
- const result = spawnSync('npm', ['list', '-g', '4runr-os', '--depth=0', '--json'], {
20
+ const result = spawnSync(npmCmd, ['list', '-g', '4runr-os', '--depth=0', '--json'], {
20
21
  encoding: 'utf-8',
21
22
  stdio: ['ignore', 'pipe', 'pipe']
22
23
  });
@@ -73,9 +74,9 @@ async function getLatestVersion(packageName) {
73
74
  console.error(`Invalid package name: ${validation.error}`);
74
75
  return null;
75
76
  }
76
- // Use spawn instead of execSync for better security
77
+ // Use spawn instead of execSync for better security (npm.cmd on Windows = no DEP0190)
77
78
  const { spawnSync } = require('child_process');
78
- const result = spawnSync('npm', ['view', validation.sanitized, 'version'], {
79
+ const result = spawnSync(npmCmd, ['view', validation.sanitized, 'version'], {
79
80
  encoding: 'utf-8',
80
81
  stdio: ['ignore', 'pipe', 'pipe']
81
82
  });
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
@@ -341,11 +341,10 @@ impl GatewayOption {
341
341
  pub struct SetupPortalState {
342
342
  pub selected_option: GatewayOption,
343
343
  pub detecting: bool,
344
- /// When detection started (for timeout so portal never stays frozen)
344
+ /// When detection started (for timeout)
345
345
  pub detecting_since: Option<std::time::Instant>,
346
346
  pub detection_result: Option<DetectionResult>,
347
347
  pub error: Option<String>,
348
- pub list_state: ratatui::widgets::ListState,
349
348
  }
350
349
 
351
350
  #[derive(Debug, Clone)]
@@ -369,43 +368,35 @@ pub struct CloudStatus {
369
368
 
370
369
  impl Default for SetupPortalState {
371
370
  fn default() -> Self {
372
- let mut list_state = ratatui::widgets::ListState::default();
373
- list_state.select(Some(0)); // Start with first option selected
374
371
  Self {
375
372
  selected_option: GatewayOption::LocalBundle,
376
373
  detecting: false,
377
374
  detecting_since: None,
378
375
  detection_result: None,
379
376
  error: None,
380
- list_state,
381
377
  }
382
378
  }
383
379
  }
384
380
 
385
381
  impl SetupPortalState {
382
+ /// Cycle to next/previous option
383
+ /// direction: 1 for down/next, -1 for up/previous
386
384
  pub fn cycle_option(&mut self, direction: i8) {
387
385
  use GatewayOption::*;
388
386
  self.selected_option = match (&self.selected_option, direction) {
389
- // Forward cycling (Down key, Scroll Down)
387
+ // Forward (Down key, Scroll Down)
390
388
  (LocalBundle, 1) => CloudServer,
391
389
  (CloudServer, 1) => CustomUrl,
392
390
  (CustomUrl, 1) => LocalBundle, // Wrap to top
393
- // Backward cycling (Up key, Scroll Up)
391
+ // Backward (Up key, Scroll Up)
394
392
  (LocalBundle, -1) => CustomUrl, // Wrap to bottom
395
393
  (CloudServer, -1) => LocalBundle,
396
394
  (CustomUrl, -1) => CloudServer,
397
- _ => self.selected_option.clone(),
395
+ _ => return, // No change for invalid direction
398
396
  };
399
-
400
- // CRITICAL: Update the persisted ListState index
401
- let new_index = match self.selected_option {
402
- LocalBundle => 0,
403
- CloudServer => 1,
404
- CustomUrl => 2,
405
- };
406
- self.list_state.select(Some(new_index));
407
397
  }
408
398
 
399
+ /// Clear detection state and errors
409
400
  pub fn reset(&mut self) {
410
401
  self.detecting = false;
411
402
  self.detecting_since = None;
@@ -1,25 +1,14 @@
1
- /// Setup Portal Screen - Clean Rebuild
2
- /// Wizard for setting up Gateway connection options
1
+ /// Setup Portal Screen - Clean Architecture
2
+ /// Gateway connection setup wizard with three options:
3
+ /// - Local Bundle (localhost:3001)
4
+ /// - 4Runr Server (cloud, coming soon)
5
+ /// - Custom URL (user's own gateway)
3
6
 
4
7
  use ratatui::prelude::*;
5
8
  use ratatui::widgets::{Block, Borders, Paragraph, Wrap, Clear, List, ListItem};
6
9
  use crate::app::{AppState, GatewayOption};
7
10
 
8
- /// When SETUP_PORTAL_DEBUG=1 or SETUP_PORTAL_DEBUG_FILE is set, log to file (and optionally stderr).
9
- fn setup_debug_enabled() -> bool {
10
- std::env::var("SETUP_PORTAL_DEBUG").as_deref() == Ok("1")
11
- || std::env::var("SETUP_PORTAL_DEBUG_FILE").is_ok()
12
- }
13
-
14
- fn dbg_log(msg: &str) {
15
- if setup_debug_enabled() {
16
- crate::debug_log::log(msg);
17
- #[cfg(debug_assertions)]
18
- eprintln!("{}", msg);
19
- }
20
- }
21
-
22
- // === 4RUNR BRAND COLORS (matching layout.rs) ===
11
+ // === BRAND COLORS ===
23
12
  const BRAND_PURPLE: Color = Color::Rgb(138, 43, 226);
24
13
  const CYBER_CYAN: Color = Color::Rgb(0, 255, 255);
25
14
  const NEON_GREEN: Color = Color::Rgb(57, 255, 20);
@@ -30,111 +19,81 @@ const TEXT_MUTED: Color = Color::Rgb(60, 60, 80);
30
19
  const BG_PANEL: Color = Color::Rgb(18, 18, 25);
31
20
  const ERROR_RED: Color = Color::Rgb(255, 69, 69);
32
21
 
33
- /// Render the Setup Portal screen - Full-screen standalone portal
22
+ /// Main render entry point
23
+ /// This is called from main.rs after terminal.clear() and autoresize()
34
24
  pub fn render(f: &mut Frame, state: &mut AppState) {
35
- // Per-frame render ID (used for passing to content/details; debug logs removed to avoid terminal spam)
36
- static mut RENDER_ID: u64 = 0;
37
- let render_id = unsafe {
38
- RENDER_ID += 1;
39
- RENDER_ID
40
- };
41
-
42
25
  let area = f.size();
43
-
44
- // Debug: log dimensions when SETUP_PORTAL_DEBUG=1 (release) or in debug build
45
- let do_dbg = setup_debug_enabled() || cfg!(debug_assertions);
46
- if do_dbg {
47
- static mut LAST_DIMS: Option<(u16, u16)> = None;
48
- static mut FRAME_COUNT: u64 = 0;
49
- static mut BANNER_SHOWN: bool = false;
50
- unsafe {
51
- if !BANNER_SHOWN {
52
- eprintln!("[SETUP_PORTAL] Debug logging active (SETUP_PORTAL_DEBUG=1 or debug build). Redirect stderr to capture, e.g. 4r 2> setup-debug.log");
53
- BANNER_SHOWN = true;
54
- }
55
- FRAME_COUNT += 1;
56
- let changed = LAST_DIMS.map_or(true, |(w, h)| w != area.width || h != area.height);
57
- if changed || FRAME_COUNT <= 15 || FRAME_COUNT % 60 == 0 {
58
- eprintln!("[SETUP_PORTAL] R#{} frame={} DIMS: {}x{} (changed={})",
59
- render_id, FRAME_COUNT, area.width, area.height, changed);
60
- LAST_DIMS = Some((area.width, area.height));
61
- }
62
- }
63
- }
64
-
65
- // CRITICAL: Validate terminal size before rendering
26
+
27
+ // Validate terminal size
66
28
  if area.width == 0 || area.height == 0 {
67
- #[cfg(debug_assertions)]
68
- eprintln!("[SETUP_PORTAL] R#{} INVALID DIMS: {}x{} - skip", render_id, area.width, area.height);
69
- return;
29
+ return; // Invalid terminal state, skip frame
70
30
  }
71
-
31
+
72
32
  if area.width < 85 || area.height < 25 {
73
33
  render_too_small(f, area);
74
34
  return;
75
35
  }
76
36
 
77
- // CRITICAL: Clear the ENTIRE screen first - this is a standalone screen, not an overlay
37
+ // Full-screen clear (already done in main.rs, but ensure it's clean)
78
38
  f.render_widget(Clear, area);
79
39
 
80
- // Render full-screen background (no dimming - this is the only screen)
81
- let bg = Block::default()
82
- .style(Style::default().bg(BG_PANEL));
40
+ // Background
41
+ let bg = Block::default().style(Style::default().bg(BG_PANEL));
83
42
  f.render_widget(bg, area);
84
43
 
85
- // Center the portal dialog - larger for better visibility
44
+ // Center portal dialog
86
45
  let portal_width = area.width.min(110).max(85);
87
46
  let portal_height = area.height.min(38).max(25);
88
- let portal_x = (area.width.saturating_sub(portal_width)) / 2;
89
- let portal_y = (area.height.saturating_sub(portal_height)) / 2;
47
+ let portal_x = area.width.saturating_sub(portal_width) / 2;
48
+ let portal_y = area.height.saturating_sub(portal_height) / 2;
90
49
 
91
- let portal_area = Rect {
50
+ let portal_rect = Rect {
92
51
  x: portal_x,
93
52
  y: portal_y,
94
53
  width: portal_width,
95
54
  height: portal_height,
96
55
  };
97
- if do_dbg {
98
- dbg_log(&format!("[SETUP_PORTAL] portal_area: x={} y={} w={} h={}",
99
- portal_area.x, portal_area.y, portal_area.width, portal_area.height));
56
+
57
+ // Layout: Header | Description | Content | Error (optional) | Actions
58
+ let sections = build_layout(portal_rect, state.setup_portal.error.is_some());
59
+
60
+ render_header(f, sections.header, state);
61
+ render_description(f, sections.description);
62
+ render_content(f, sections.content, state);
63
+
64
+ if let Some(error_rect) = sections.error {
65
+ render_error_box(f, error_rect, state);
100
66
  }
67
+
68
+ render_actions(f, sections.actions, state);
69
+ }
101
70
 
102
- // File strategy: one composite RENDER line per frame (throttled) so file has full trace
103
- if setup_debug_enabled() {
104
- static mut RENDER_LOG_COUNT: u64 = 0;
105
- unsafe {
106
- RENDER_LOG_COUNT += 1;
107
- let throttle = RENDER_LOG_COUNT <= 25 || RENDER_LOG_COUNT % 30 == 0;
108
- if throttle {
109
- let sel = format!("{:?}", state.setup_portal.selected_option);
110
- crate::debug_log::log_render(&format!(
111
- "frame={} dims={}x{} portal=({},{},{},{}) selected={}",
112
- RENDER_LOG_COUNT, area.width, area.height,
113
- portal_area.x, portal_area.y, portal_area.width, portal_area.height,
114
- sel
115
- ));
116
- }
117
- }
118
- }
71
+ /// Layout structure for all portal sections
72
+ struct PortalLayout {
73
+ header: Rect,
74
+ description: Rect,
75
+ content: Rect,
76
+ error: Option<Rect>,
77
+ actions: Rect,
78
+ }
119
79
 
120
- // Split portal into sections
80
+ /// Build vertical layout with dynamic error section
81
+ fn build_layout(area: Rect, has_error: bool) -> PortalLayout {
121
82
  use ratatui::layout::{Constraint, Direction, Layout};
122
83
 
123
- // Dynamic layout based on error state
124
- let has_error = state.setup_portal.error.is_some();
125
84
  let constraints = if has_error {
126
85
  vec![
127
86
  Constraint::Length(3), // Header
128
87
  Constraint::Length(3), // Description
129
- Constraint::Min(12), // Content area
130
- Constraint::Length(6), // Error box
88
+ Constraint::Min(12), // Content
89
+ Constraint::Length(6), // Error
131
90
  Constraint::Length(3), // Actions
132
91
  ]
133
92
  } else {
134
93
  vec![
135
94
  Constraint::Length(3), // Header
136
95
  Constraint::Length(3), // Description
137
- Constraint::Min(15), // Content area
96
+ Constraint::Min(15), // Content
138
97
  Constraint::Length(3), // Actions
139
98
  ]
140
99
  };
@@ -142,37 +101,29 @@ pub fn render(f: &mut Frame, state: &mut AppState) {
142
101
  let chunks = Layout::default()
143
102
  .direction(Direction::Vertical)
144
103
  .constraints(constraints)
145
- .split(portal_area);
146
- if do_dbg {
147
- let c = &chunks[2];
148
- dbg_log(&format!("[SETUP_PORTAL] content chunk: x={} y={} w={} h={}", c.x, c.y, c.width, c.height));
149
- }
150
- if setup_debug_enabled() {
151
- static mut N: u64 = 0;
152
- unsafe {
153
- N += 1;
154
- if N <= 25 || N % 30 == 0 {
155
- let c = &chunks[2];
156
- crate::debug_log::log_render(&format!(
157
- "content_chunk=({},{},{},{})",
158
- c.x, c.y, c.width, c.height
159
- ));
160
- }
161
- }
162
- }
163
-
164
- render_header(f, chunks[0], state);
165
- render_description(f, chunks[1]);
166
- render_content(f, chunks[2], state, render_id);
104
+ .split(area);
167
105
 
168
106
  if has_error {
169
- render_error_box(f, chunks[3], state);
170
- render_actions(f, chunks[4], state);
107
+ PortalLayout {
108
+ header: chunks[0],
109
+ description: chunks[1],
110
+ content: chunks[2],
111
+ error: Some(chunks[3]),
112
+ actions: chunks[4],
113
+ }
171
114
  } else {
172
- render_actions(f, chunks[3], state);
115
+ PortalLayout {
116
+ header: chunks[0],
117
+ description: chunks[1],
118
+ content: chunks[2],
119
+ error: None,
120
+ actions: chunks[3],
121
+ }
173
122
  }
174
123
  }
175
124
 
125
+ // === SECTION RENDERERS ===
126
+
176
127
  fn render_header(f: &mut Frame, area: Rect, state: &AppState) {
177
128
  let title = if state.setup_portal.error.is_some() {
178
129
  " ⚙ Gateway Setup Portal - Error "
@@ -212,199 +163,78 @@ fn render_description(f: &mut Frame, area: Rect) {
212
163
  f.render_widget(text, inner);
213
164
  }
214
165
 
215
- fn render_content(f: &mut Frame, area: Rect, state: &mut AppState, render_id: u64) {
166
+ fn render_content(f: &mut Frame, area: Rect, state: &mut AppState) {
167
+ use ratatui::layout::{Constraint, Direction, Layout};
168
+
216
169
  let chunks = Layout::default()
217
170
  .direction(Direction::Horizontal)
218
171
  .constraints([
219
- Constraint::Percentage(40),
220
- Constraint::Percentage(60),
172
+ Constraint::Percentage(40), // Options list
173
+ Constraint::Percentage(60), // Details panel
221
174
  ])
222
175
  .split(area);
223
-
224
- render_options_list(f, chunks[0], state, render_id);
225
- render_option_details(f, chunks[1], state, render_id);
176
+
177
+ render_options_list(f, chunks[0], state);
178
+ render_details_panel(f, chunks[1], state);
226
179
  }
227
180
 
228
- fn render_options_list(f: &mut Frame, area: Rect, state: &mut AppState, _render_id: u64) {
229
- if setup_debug_enabled() {
230
- static mut N: u64 = 0;
231
- unsafe {
232
- N += 1;
233
- if N <= 10 || N % 30 == 0 {
234
- crate::debug_log::log_render(&format!(
235
- "list area=({},{},{},{})",
236
- area.x, area.y, area.width, area.height
237
- ));
238
- }
239
- }
240
- }
241
- // Clear this rect first so no duplicate rows from previous frame
181
+ fn render_options_list(f: &mut Frame, area: Rect, state: &mut AppState) {
182
+ // Clear to prevent artifacts
242
183
  f.render_widget(Clear, area);
243
-
244
- let options = vec![
184
+
185
+ let options = [
245
186
  ("Local Bundle", GatewayOption::LocalBundle),
246
187
  ("4Runr Server", GatewayOption::CloudServer),
247
188
  ("Custom URL", GatewayOption::CustomUrl),
248
189
  ];
249
-
250
- let selected_option = &state.setup_portal.selected_option;
251
- let _selected_index = options.iter()
252
- .position(|(_, opt)| opt == selected_option)
253
- .unwrap_or(0);
254
-
190
+
191
+ let selected = &state.setup_portal.selected_option;
192
+
255
193
  let items: Vec<ListItem> = options
256
194
  .iter()
257
195
  .map(|(name, option)| {
258
- let is_selected = selected_option == option;
196
+ let is_selected = selected == option;
259
197
  let style = if is_selected {
260
198
  Style::default().fg(CYBER_CYAN).bold()
261
199
  } else {
262
200
  Style::default().fg(TEXT_MUTED)
263
201
  };
264
- let icon = match option {
265
- GatewayOption::LocalBundle => "[■]",
266
- GatewayOption::CloudServer => "[≡]",
267
- GatewayOption::CustomUrl => "[◆]",
268
- };
202
+
203
+ let icon = get_option_icon(option);
269
204
  let prefix = if is_selected { "► " } else { " " };
270
205
  let text = format!("{}{} {}", prefix, icon, name);
206
+
271
207
  ListItem::new(text).style(style)
272
208
  })
273
209
  .collect();
274
-
275
- // CRITICAL: Render block first, then fill inner, then list to ensure full paint
210
+
276
211
  let block = Block::default()
277
212
  .borders(Borders::ALL)
278
213
  .title(" Gateway Options ")
279
214
  .border_style(Style::default().fg(CYBER_CYAN))
280
215
  .style(Style::default().bg(BG_PANEL));
281
-
216
+
282
217
  let inner = block.inner(area);
283
- if setup_debug_enabled() {
284
- static mut N: u64 = 0;
285
- unsafe {
286
- N += 1;
287
- if N <= 10 || N % 30 == 0 {
288
- crate::debug_log::log_render(&format!(
289
- "list inner=({},{},{},{})",
290
- inner.x, inner.y, inner.width, inner.height
291
- ));
292
- }
293
- }
294
- }
295
218
  f.render_widget(block, area);
296
219
 
297
- // Fill inner area
220
+ // Background fill
298
221
  let fill = Block::default().style(Style::default().bg(BG_PANEL));
299
222
  f.render_widget(fill, inner);
300
-
301
- // STATELESS: Render list without ListState so only our item styling (► + color) shows selection
223
+
224
+ // Stateless list (selection shown via prefix and color)
302
225
  let list = List::new(items).style(Style::default().bg(BG_PANEL));
303
226
  f.render_widget(list, inner);
304
227
  }
305
228
 
306
- fn render_option_details(f: &mut Frame, area: Rect, state: &AppState, _render_id: u64) {
307
- if setup_debug_enabled() {
308
- static mut N: u64 = 0;
309
- unsafe {
310
- N += 1;
311
- if N <= 10 || N % 30 == 0 {
312
- crate::debug_log::log_render(&format!(
313
- "details area=({},{},{},{})",
314
- area.x, area.y, area.width, area.height
315
- ));
316
- }
317
- }
318
- }
319
- // Clear this rect first so no leftover from previous option
229
+ fn render_details_panel(f: &mut Frame, area: Rect, state: &AppState) {
230
+ // Clear to prevent ghost text
320
231
  f.render_widget(Clear, area);
321
-
322
- let selected_option = &state.setup_portal.selected_option;
323
- let detection_result = &state.setup_portal.detection_result;
324
232
 
325
- let (title, content) = match selected_option {
326
- GatewayOption::LocalBundle => {
327
- let mut lines = vec![
328
- Line::from(""),
329
- Line::from(Span::styled("Local Bundle Gateway", Style::default().fg(NEON_GREEN).bold())),
330
- Line::from(Span::styled("Runs on your machine", Style::default().fg(TEXT_DIM))),
331
- Line::from(""),
332
- ];
333
-
334
- // Show detection results if available
335
- if let Some(result) = detection_result {
336
- if result.local_bundle.running {
337
- lines.extend(vec![
338
- Line::from(vec![
339
- Span::styled("[✓] ", Style::default().fg(NEON_GREEN)),
340
- Span::styled("Running at ", Style::default().fg(TEXT_PRIMARY)),
341
- Span::styled("localhost:3001", Style::default().fg(CYBER_CYAN)),
342
- ]),
343
- Line::from(""),
344
- Line::from(Span::styled("Press Enter to connect", Style::default().fg(CYBER_CYAN))),
345
- ]);
346
- } else if result.local_bundle.available {
347
- lines.extend(vec![
348
- Line::from(vec![
349
- Span::styled("[!] ", Style::default().fg(AMBER_WARN)),
350
- Span::styled("Found but not running", Style::default().fg(AMBER_WARN)),
351
- ]),
352
- Line::from(""),
353
- Line::from(Span::styled("Start with:", Style::default().fg(TEXT_DIM))),
354
- Line::from(Span::styled(" cd apps/gateway && pnpm start", Style::default().fg(NEON_GREEN))),
355
- Line::from(""),
356
- Line::from(Span::styled("Then press F2 to connect", Style::default().fg(CYBER_CYAN))),
357
- ]);
358
- } else {
359
- lines.extend(vec![
360
- Line::from(vec![
361
- Span::styled("[✗] ", Style::default().fg(ERROR_RED)),
362
- Span::styled("Bundle not found", Style::default().fg(ERROR_RED)),
363
- ]),
364
- Line::from(""),
365
- Line::from(Span::styled("Try 4Runr Server or Custom URL", Style::default().fg(TEXT_DIM))),
366
- ]);
367
- }
368
- } else {
369
- lines.push(Line::from(Span::styled("Press Enter to connect", Style::default().fg(CYBER_CYAN))));
370
- }
371
-
372
- (" [■] Local Bundle ", lines)
373
- },
374
- GatewayOption::CloudServer => (
375
- " [≡] 4Runr Server ",
376
- vec![
377
- Line::from(""),
378
- Line::from(Span::styled("4Runr Cloud Server", Style::default().fg(NEON_GREEN).bold())),
379
- Line::from(Span::styled("Managed cloud hosting", Style::default().fg(TEXT_DIM))),
380
- Line::from(""),
381
- Line::from(vec![
382
- Span::styled("[!] ", Style::default().fg(AMBER_WARN)),
383
- Span::styled("Coming Soon", Style::default().fg(AMBER_WARN).bold()),
384
- ]),
385
- Line::from(""),
386
- Line::from(Span::styled("Service not yet available", Style::default().fg(TEXT_DIM))),
387
- Line::from(""),
388
- Line::from(Span::styled("Use Local Bundle or Custom URL", Style::default().fg(CYBER_CYAN))),
389
- ]
390
- ),
391
- GatewayOption::CustomUrl => (
392
- " [◆] Custom URL ",
393
- vec![
394
- Line::from(""),
395
- Line::from(Span::styled("Custom Gateway Server", Style::default().fg(NEON_GREEN).bold())),
396
- Line::from(Span::styled("Your own deployment", Style::default().fg(TEXT_DIM))),
397
- Line::from(""),
398
- Line::from(Span::styled("Requirements:", Style::default().fg(TEXT_DIM))),
399
- Line::from(Span::styled(" • Running Gateway server", Style::default().fg(TEXT_DIM))),
400
- Line::from(Span::styled(" • Accessible URL (http:// or https://)", Style::default().fg(TEXT_DIM))),
401
- Line::from(""),
402
- Line::from(Span::styled("Press Enter to continue", Style::default().fg(CYBER_CYAN))),
403
- ]
404
- ),
405
- };
406
-
407
- // CRITICAL: Render Block first (clears its area), then Paragraph separately to force full paint
233
+ let selected = &state.setup_portal.selected_option;
234
+ let detection = &state.setup_portal.detection_result;
235
+
236
+ let (title, lines) = build_details_content(selected, detection);
237
+
408
238
  let block = Block::default()
409
239
  .title(title)
410
240
  .borders(Borders::ALL)
@@ -412,42 +242,24 @@ fn render_option_details(f: &mut Frame, area: Rect, state: &AppState, _render_id
412
242
  .style(Style::default().bg(BG_PANEL));
413
243
 
414
244
  let inner = block.inner(area);
415
- if setup_debug_enabled() {
416
- static mut N: u64 = 0;
417
- unsafe {
418
- N += 1;
419
- if N <= 10 || N % 30 == 0 {
420
- crate::debug_log::log_render(&format!(
421
- "details inner=({},{},{},{})",
422
- inner.x, inner.y, inner.width, inner.height
423
- ));
424
- }
425
- }
426
- }
427
245
  f.render_widget(block, area);
428
246
 
429
- // Validate area before rendering
430
- let terminal_size = f.size();
431
- if inner.width == 0 || inner.height == 0 ||
432
- inner.x >= terminal_size.width || inner.y >= terminal_size.height {
433
- if setup_debug_enabled() {
434
- dbg_log("[DETAILS] SKIP render: inner or terminal invalid");
435
- }
247
+ // Validate inner area
248
+ if inner.width == 0 || inner.height == 0 {
436
249
  return;
437
250
  }
438
-
439
- // Pad content to at least inner height so every row is painted (no leftover text)
440
- let min_lines = inner.height as usize;
441
- let mut padded: Vec<Line> = content.into_iter().collect();
442
- while padded.len() < min_lines {
443
- padded.push(Line::from(""));
251
+
252
+ // Pad content to fill height (prevents ghost text from previous selection)
253
+ let mut padded_lines = lines;
254
+ while padded_lines.len() < inner.height as usize {
255
+ padded_lines.push(Line::from(""));
444
256
  }
445
-
446
- // Fill inner with background then paragraph so every cell is overwritten
257
+
258
+ // Background fill + content
447
259
  let fill = Block::default().style(Style::default().bg(BG_PANEL));
448
260
  f.render_widget(fill, inner);
449
261
 
450
- let paragraph = Paragraph::new(padded)
262
+ let paragraph = Paragraph::new(padded_lines)
451
263
  .wrap(Wrap { trim: true })
452
264
  .style(Style::default().bg(BG_PANEL));
453
265
 
@@ -474,9 +286,7 @@ fn render_error_box(f: &mut Frame, area: Rect, state: &AppState) {
474
286
  Line::from(""),
475
287
  ];
476
288
 
477
- let paragraph = Paragraph::new(text)
478
- .wrap(Wrap { trim: true });
479
-
289
+ let paragraph = Paragraph::new(text).wrap(Wrap { trim: true });
480
290
  f.render_widget(paragraph, inner);
481
291
  }
482
292
  }
@@ -490,9 +300,7 @@ fn render_actions(f: &mut Frame, area: Rect, state: &AppState) {
490
300
  let inner = block.inner(area);
491
301
  f.render_widget(block, area);
492
302
 
493
- let detecting = state.setup_portal.detecting;
494
-
495
- let text = if detecting {
303
+ let text = if state.setup_portal.detecting {
496
304
  Line::from(vec![
497
305
  Span::styled("Detecting Gateway options...", Style::default().fg(AMBER_WARN)),
498
306
  ])
@@ -502,8 +310,6 @@ fn render_actions(f: &mut Frame, area: Rect, state: &AppState) {
502
310
  Span::styled(" Navigate │ ", Style::default().fg(TEXT_DIM)),
503
311
  Span::styled("Enter", Style::default().fg(NEON_GREEN).bold()),
504
312
  Span::styled(" Continue │ ", Style::default().fg(TEXT_DIM)),
505
- Span::styled("F2", Style::default().fg(AMBER_WARN).bold()),
506
- Span::styled(" Connection Portal │ ", Style::default().fg(TEXT_DIM)),
507
313
  Span::styled("ESC", Style::default().fg(BRAND_PURPLE).bold()),
508
314
  Span::styled(" Cancel", Style::default().fg(TEXT_DIM)),
509
315
  ])
@@ -517,15 +323,11 @@ fn render_actions(f: &mut Frame, area: Rect, state: &AppState) {
517
323
  }
518
324
 
519
325
  fn render_too_small(f: &mut Frame, area: Rect) {
520
- // Clear screen
521
326
  f.render_widget(Clear, area);
522
327
 
523
- // Render background
524
- let bg = Block::default()
525
- .style(Style::default().bg(BG_PANEL));
328
+ let bg = Block::default().style(Style::default().bg(BG_PANEL));
526
329
  f.render_widget(bg, area);
527
330
 
528
- // Center the message
529
331
  let msg = vec![
530
332
  Line::from(""),
531
333
  Line::from(Span::styled("Setup Portal", Style::default().fg(BRAND_PURPLE).bold())),
@@ -552,3 +354,109 @@ fn render_too_small(f: &mut Frame, area: Rect) {
552
354
  height: area.height / 3,
553
355
  });
554
356
  }
357
+
358
+ // === HELPER FUNCTIONS ===
359
+
360
+ fn get_option_icon(option: &GatewayOption) -> &'static str {
361
+ match option {
362
+ GatewayOption::LocalBundle => "[■]",
363
+ GatewayOption::CloudServer => "[≡]",
364
+ GatewayOption::CustomUrl => "[◆]",
365
+ }
366
+ }
367
+
368
+ fn build_details_content(
369
+ option: &GatewayOption,
370
+ detection: &Option<crate::app::DetectionResult>
371
+ ) -> (&'static str, Vec<Line<'static>>) {
372
+ match option {
373
+ GatewayOption::LocalBundle => build_local_bundle_details(detection),
374
+ GatewayOption::CloudServer => build_cloud_server_details(),
375
+ GatewayOption::CustomUrl => build_custom_url_details(),
376
+ }
377
+ }
378
+
379
+ fn build_local_bundle_details(
380
+ detection: &Option<crate::app::DetectionResult>
381
+ ) -> (&'static str, Vec<Line<'static>>) {
382
+ let mut lines = vec![
383
+ Line::from(""),
384
+ Line::from(Span::styled("Local Bundle Gateway", Style::default().fg(NEON_GREEN).bold())),
385
+ Line::from(Span::styled("Runs on your machine", Style::default().fg(TEXT_DIM))),
386
+ Line::from(""),
387
+ ];
388
+
389
+ if let Some(result) = detection {
390
+ if result.local_bundle.running {
391
+ lines.extend(vec![
392
+ Line::from(vec![
393
+ Span::styled("[✓] ", Style::default().fg(NEON_GREEN)),
394
+ Span::styled("Running at ", Style::default().fg(TEXT_PRIMARY)),
395
+ Span::styled("localhost:3001", Style::default().fg(CYBER_CYAN)),
396
+ ]),
397
+ Line::from(""),
398
+ Line::from(Span::styled("Press Enter to connect", Style::default().fg(CYBER_CYAN))),
399
+ ]);
400
+ } else if result.local_bundle.available {
401
+ lines.extend(vec![
402
+ Line::from(vec![
403
+ Span::styled("[!] ", Style::default().fg(AMBER_WARN)),
404
+ Span::styled("Found but not running", Style::default().fg(AMBER_WARN)),
405
+ ]),
406
+ Line::from(""),
407
+ Line::from(Span::styled("Start with:", Style::default().fg(TEXT_DIM))),
408
+ Line::from(Span::styled(" cd apps/gateway && pnpm start", Style::default().fg(NEON_GREEN))),
409
+ Line::from(""),
410
+ Line::from(Span::styled("Then press F2 to reconnect", Style::default().fg(CYBER_CYAN))),
411
+ ]);
412
+ } else {
413
+ lines.extend(vec![
414
+ Line::from(vec![
415
+ Span::styled("[✗] ", Style::default().fg(ERROR_RED)),
416
+ Span::styled("Bundle not found", Style::default().fg(ERROR_RED)),
417
+ ]),
418
+ Line::from(""),
419
+ Line::from(Span::styled("Try 4Runr Server or Custom URL", Style::default().fg(TEXT_DIM))),
420
+ ]);
421
+ }
422
+ } else {
423
+ lines.push(Line::from(Span::styled("Press Enter to connect", Style::default().fg(CYBER_CYAN))));
424
+ }
425
+
426
+ (" [■] Local Bundle ", lines)
427
+ }
428
+
429
+ fn build_cloud_server_details() -> (&'static str, Vec<Line<'static>>) {
430
+ let lines = vec![
431
+ Line::from(""),
432
+ Line::from(Span::styled("4Runr Cloud Server", Style::default().fg(NEON_GREEN).bold())),
433
+ Line::from(Span::styled("Managed cloud hosting", Style::default().fg(TEXT_DIM))),
434
+ Line::from(""),
435
+ Line::from(vec![
436
+ Span::styled("[!] ", Style::default().fg(AMBER_WARN)),
437
+ Span::styled("Coming Soon", Style::default().fg(AMBER_WARN).bold()),
438
+ ]),
439
+ Line::from(""),
440
+ Line::from(Span::styled("Service not yet available", Style::default().fg(TEXT_DIM))),
441
+ Line::from(""),
442
+ Line::from(Span::styled("Use Local Bundle or Custom URL", Style::default().fg(CYBER_CYAN))),
443
+ ];
444
+
445
+ (" [≡] 4Runr Server ", lines)
446
+ }
447
+
448
+ fn build_custom_url_details() -> (&'static str, Vec<Line<'static>>) {
449
+ let lines = vec![
450
+ Line::from(""),
451
+ Line::from(Span::styled("Custom Gateway Server", Style::default().fg(NEON_GREEN).bold())),
452
+ Line::from(Span::styled("Your own deployment", Style::default().fg(TEXT_DIM))),
453
+ Line::from(""),
454
+ Line::from(Span::styled("Requirements:", Style::default().fg(TEXT_DIM))),
455
+ Line::from(Span::styled(" • Running Gateway server", Style::default().fg(TEXT_DIM))),
456
+ Line::from(Span::styled(" • Accessible URL (http:// or https://)", Style::default().fg(TEXT_DIM))),
457
+ Line::from(""),
458
+ Line::from(Span::styled("Press Enter to continue", Style::default().fg(CYBER_CYAN))),
459
+ ];
460
+
461
+ (" [◆] Custom URL ", lines)
462
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "2.9.78",
3
+ "version": "2.9.80",
4
4
  "type": "module",
5
- "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.78: Fix DEP0190 (no shell+args in version-check & package-integrity). ⚠️ Pre-MVP / Development Phase",
5
+ "description": "4Runr AI Agent OS - Secure terminal interface for AI agents. v2.9.80: Setup Portal complete rewrite clean architecture, no bugs. ⚠️ Pre-MVP / Development Phase",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "4runr": "dist/index.js",
@@ -8,6 +8,8 @@ import { spawnSync } from 'child_process';
8
8
  import * as fs from 'fs';
9
9
  import { sanitizePackageName } from './validation.js';
10
10
 
11
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
12
+
11
13
  /**
12
14
  * Get package integrity hash from npm registry
13
15
  */
@@ -20,8 +22,8 @@ export function getPackageIntegrity(packageName: string, version: string): strin
20
22
  throw new Error(`Invalid package name: ${validation.error}`);
21
23
  }
22
24
 
23
- // Get package info from npm (includes integrity hash)
24
- const result = spawnSync('npm', ['view', `${validation.sanitized}@${version}`, 'dist.integrity', '--json'], {
25
+ // Get package info from npm (includes integrity hash); npm.cmd on Windows = no DEP0190
26
+ const result = spawnSync(npmCmd, ['view', `${validation.sanitized}@${version}`, 'dist.integrity', '--json'], {
25
27
  encoding: 'utf-8',
26
28
  stdio: ['ignore', 'pipe', 'pipe']
27
29
  });
@@ -71,7 +73,7 @@ export function verifyInstalledVersion(packageName: string, expectedVersion: str
71
73
  return false;
72
74
  }
73
75
 
74
- const result = spawnSync('npm', ['list', '-g', validation.sanitized, '--depth=0', '--json'], {
76
+ const result = spawnSync(npmCmd, ['list', '-g', validation.sanitized, '--depth=0', '--json'], {
75
77
  encoding: 'utf-8',
76
78
  stdio: ['ignore', 'pipe', 'pipe']
77
79
  });
@@ -99,7 +101,7 @@ function npmErrorResult(result: { status: number | null; stdout?: string | Buffe
99
101
  /** Resolve a tag (e.g. 'latest') to a concrete version from the registry */
100
102
  function resolveTagVersion(packageName: string, tag: string): string | null {
101
103
  try {
102
- const result = spawnSync('npm', ['view', `${packageName}@${tag}`, 'version'], {
104
+ const result = spawnSync(npmCmd, ['view', `${packageName}@${tag}`, 'version'], {
103
105
  encoding: 'utf-8',
104
106
  stdio: ['ignore', 'pipe', 'pipe'],
105
107
  });
@@ -125,9 +127,6 @@ export function safeNpmInstall(packageName: string, version: string): { success:
125
127
  return { success: false, error: `Invalid package name: ${validation.error}` };
126
128
  }
127
129
 
128
- const isWindows = process.platform === 'win32';
129
- // Use npm.cmd on Windows without shell to avoid Node DEP0190 (args + shell: true)
130
- const npmCmd = isWindows ? 'npm.cmd' : 'npm';
131
130
  const spawnOpts: Parameters<typeof spawnSync>[2] = {
132
131
  encoding: 'utf-8',
133
132
  stdio: ['ignore', 'pipe', 'pipe'],