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.
- package/dist/security/package-integrity.d.ts.map +1 -1
- package/dist/security/package-integrity.js +5 -7
- package/dist/security/package-integrity.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +5 -4
- package/dist/version-check.js.map +1 -1
- package/mk3-tui/binaries/win32-x64/mk3-tui.exe +0 -0
- package/mk3-tui/src/app.rs +7 -16
- package/mk3-tui/src/ui/setup_portal.rs +212 -304
- package/package.json +2 -2
- package/src/security/package-integrity.ts +6 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-integrity.d.ts","sourceRoot":"","sources":["../../src/security/package-integrity.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
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(
|
|
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(
|
|
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(
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAe;IACtE,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,
|
|
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;
|
|
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"}
|
package/dist/version-check.js
CHANGED
|
@@ -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(
|
|
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(
|
|
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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"}
|
|
Binary file
|
package/mk3-tui/src/app.rs
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
_ =>
|
|
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
|
|
2
|
-
///
|
|
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
|
-
|
|
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
|
-
///
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
37
|
+
// Full-screen clear (already done in main.rs, but ensure it's clean)
|
|
78
38
|
f.render_widget(Clear, area);
|
|
79
39
|
|
|
80
|
-
//
|
|
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
|
|
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 =
|
|
89
|
-
let portal_y =
|
|
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
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
|
130
|
-
Constraint::Length(6), // Error
|
|
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
|
|
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(
|
|
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
|
-
|
|
170
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
225
|
-
|
|
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
|
|
229
|
-
|
|
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 =
|
|
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
|
|
251
|
-
|
|
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 =
|
|
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
|
-
|
|
265
|
-
|
|
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
|
-
//
|
|
220
|
+
// Background fill
|
|
298
221
|
let fill = Block::default().style(Style::default().bg(BG_PANEL));
|
|
299
222
|
f.render_widget(fill, inner);
|
|
300
|
-
|
|
301
|
-
//
|
|
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
|
|
307
|
-
|
|
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
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
|
430
|
-
|
|
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
|
|
440
|
-
let
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
//
|
|
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(
|
|
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
|
|
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
|
-
|
|
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.
|
|
3
|
+
"version": "2.9.80",
|
|
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.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(
|
|
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(
|
|
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(
|
|
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'],
|