Add AI chat to dashboard, refactor stream module, snapshot --urls, batch argument mode (#1160)

* chat

* refactor

* fixes

* fixes

* fixes

* fixes

* improvements

* download chat

* batch

* fixes

* fixes

* fixes

* fmt

* fixes

* fixes

* fixes

* fmt
This commit is contained in:
Chris Tate
2026-04-06 08:10:43 -05:00
committed by GitHub
parent fcb6615f5a
commit 317e6869b6
44 changed files with 4933 additions and 1957 deletions
+36 -26
View File
@@ -1257,10 +1257,16 @@ fn main() {
}
}
// Handle batch command: read commands from stdin, execute sequentially
// Handle batch command: from args or stdin
if cmd.get("action").and_then(|v| v.as_str()) == Some("batch") {
let bail = cmd.get("bail").and_then(|v| v.as_bool()).unwrap_or(false);
run_batch(&flags, bail);
let arg_commands = cmd.get("commands").and_then(|v| v.as_array()).map(|arr| {
arr.iter()
.filter_map(|v| v.as_str())
.map(commands::shell_words_split)
.collect::<Vec<Vec<String>>>()
});
run_batch(&flags, bail, arg_commands);
return;
}
@@ -1340,36 +1346,40 @@ fn main() {
}
}
fn run_batch(flags: &Flags, bail: bool) {
use std::io::Read as _;
fn run_batch(flags: &Flags, bail: bool, arg_commands: Option<Vec<Vec<String>>>) {
let commands: Vec<Vec<String>> = if let Some(cmds) = arg_commands {
cmds
} else {
use std::io::Read as _;
let mut input = String::new();
if let Err(e) = std::io::stdin().read_to_string(&mut input) {
if flags.json {
print_json_error(format!("Failed to read stdin: {}", e));
} else {
eprintln!("{} Failed to read stdin: {}", color::error_indicator(), e);
}
exit(1);
}
let commands: Vec<Vec<String>> = match serde_json::from_str(&input) {
Ok(c) => c,
Err(e) => {
let mut input = String::new();
if let Err(e) = std::io::stdin().read_to_string(&mut input) {
if flags.json {
print_json_error(format!(
"Invalid JSON input: {}. Expected an array of string arrays, e.g. [[\"open\", \"https://example.com\"], [\"snapshot\"]]",
e
));
print_json_error(format!("Failed to read stdin: {}", e));
} else {
eprintln!(
"{} Invalid JSON input: {}. Expected an array of string arrays.",
color::error_indicator(),
e
);
eprintln!("{} Failed to read stdin: {}", color::error_indicator(), e);
}
exit(1);
}
match serde_json::from_str(&input) {
Ok(c) => c,
Err(e) => {
if flags.json {
print_json_error(format!(
"Invalid JSON input: {}. Expected an array of string arrays, e.g. [[\"open\", \"https://example.com\"], [\"snapshot\"]]",
e
));
} else {
eprintln!(
"{} Invalid JSON input: {}. Expected an array of string arrays.",
color::error_indicator(),
e
);
}
exit(1);
}
}
};
if commands.is_empty() {