Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ fn is_pid_alive(pid: u32) -> bool {
}
}

fn run_dashboard_start(port: u16, json_mode: bool) {
fn run_dashboard_start(addr: &str, port: u16, json_mode: bool) {
let pid_path = get_dashboard_pid_path();

// Check if already running
Expand All @@ -293,7 +293,7 @@ fn run_dashboard_start(port: u16, json_mode: bool) {
"data": { "port": port, "pid": pid, "already_running": true },
}));
} else {
println!("Dashboard already running at http://localhost:{}", port);
println!("Dashboard already running at http://{}:{}", addr, port);
}
return;
}
Expand Down Expand Up @@ -324,6 +324,7 @@ fn run_dashboard_start(port: u16, json_mode: bool) {

let mut cmd = std::process::Command::new(&exe_path);
cmd.env("AGENT_BROWSER_DASHBOARD", "1")
.env("AGENT_BROWSER_DASHBOARD_ADDR", addr)
.env("AGENT_BROWSER_DASHBOARD_PORT", port.to_string());

#[cfg(unix)]
Expand Down Expand Up @@ -361,7 +362,7 @@ fn run_dashboard_start(port: u16, json_mode: bool) {
"data": { "port": port, "pid": pid },
}));
} else {
println!("Dashboard started at http://localhost:{}", port);
println!("Dashboard started at http://{}:{}", addr, port);
}
}
Err(e) => {
Expand Down Expand Up @@ -602,12 +603,16 @@ fn main() {

// Standalone dashboard server mode
if env::var("AGENT_BROWSER_DASHBOARD").is_ok() {
let addr = env::var("AGENT_BROWSER_DASHBOARD_ADDR")
.ok()
.unwrap_or_else(|| "127.0.0.1".to_string());
let port: u16 = env::var("AGENT_BROWSER_DASHBOARD_PORT")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(4848);
let addr = format!("{}:{}", addr, port);
let rt = tokio::runtime::Runtime::new().expect("Failed to create tokio runtime");
rt.block_on(native::stream::run_dashboard_server(port));
rt.block_on(native::stream::run_dashboard_server(&addr));
return;
}

Expand Down Expand Up @@ -655,13 +660,19 @@ fn main() {
if clean.first().map(|s| s.as_str()) == Some("dashboard") {
match clean.get(1).map(|s| s.as_str()) {
Some("start") | None => {
let addr = clean
.iter()
.position(|a| a == "--addr")
.and_then(|i| clean.get(i + 1))
.map(|s| s.as_str())
.unwrap_or("127.0.0.1");
let port = clean
.iter()
.position(|a| a == "--port")
.and_then(|i| clean.get(i + 1))
.and_then(|s| s.parse::<u16>().ok())
.unwrap_or(4848);
run_dashboard_start(port, flags.json);
run_dashboard_start(addr, port, flags.json);
return;
}
Some("stop") => {
Expand Down
5 changes: 2 additions & 3 deletions cli/src/native/stream/dashboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ use super::chat::{chat_status_json, handle_chat_request, handle_models_request};
use super::discovery::discover_sessions;
use super::http::{serve_embedded_file, CORS_HEADERS};

pub async fn run_dashboard_server(port: u16) {
let addr = format!("127.0.0.1:{}", port);
let listener = match TcpListener::bind(&addr).await {
pub async fn run_dashboard_server(addr: &str) {
let listener = match TcpListener::bind(addr).await {
Ok(l) => l,
Err(e) => {
eprintln!("Failed to bind dashboard server on {}: {}", addr, e);
Expand Down
9 changes: 6 additions & 3 deletions cli/src/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2406,23 +2406,26 @@ browser viewports and command activity feeds for all sessions.
The dashboard is bundled into the binary and requires no separate install.

Subcommands:
start [--port <n>] Start the dashboard server (default port: 4848)
stop Stop the dashboard server
start [--port <n>] [--addr <addr>] Start the dashboard server (default: 127.0.0.1:4848)
stop Stop the dashboard server

Running 'agent-browser dashboard' with no subcommand is equivalent to 'dashboard start'.

The dashboard runs as a standalone background process, independent of
browser sessions. All sessions automatically stream to the dashboard.

Options:
--port <n> Port for the dashboard server (default: 4848)
--addr <addr> Bind address for the dashboard server (default: 127.0.0.1)
--port <n> Port for the dashboard server (default: 4848)

Global Options:
--json Output as JSON

Examples:
agent-browser dashboard start
agent-browser dashboard start --port 8080
agent-browser dashboard start --addr 0.0.0.0
agent-browser dashboard start --addr 0.0.0.0 --port 8080
agent-browser dashboard stop
"##
}
Expand Down