summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2025-01-18 08:46:33 +0800
committerGitHub <noreply@github.com>2025-01-18 08:46:33 +0800
commit58c3cdc9d9c65ff2ef89eaf16588e613d9ca2f49 (patch)
tree402afb39fa89f0fc21448aec2aeb17d41aa4244f
parentd37d99c63dafaa606ece5aa3b36ad9c5e58e5cbb (diff)
downloadaichat-58c3cdc9d9c65ff2ef89eaf16588e613d9ca2f49.tar.gz
feat: `.starter` accepts index other than text (#1093)
-rw-r--r--src/config/mod.rs19
-rw-r--r--src/repl/mod.rs24
2 files changed, 28 insertions, 15 deletions
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 3ea7648..20f19e5 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -1688,7 +1688,7 @@ impl Config {
&self,
cmd: &str,
args: &[&str],
- line: &str,
+ _line: &str,
) -> Vec<(String, Option<String>)> {
let mut values: Vec<(String, Option<String>)> = vec![];
let mut filter = "";
@@ -1716,7 +1716,12 @@ impl Config {
".agent" => map_completion_values(list_agents()),
".macro" => map_completion_values(Self::list_macros()),
".starter" => match &self.agent {
- Some(agent) => map_completion_values(agent.conversation_staters().to_vec()),
+ Some(agent) => agent
+ .conversation_staters()
+ .iter()
+ .enumerate()
+ .map(|(i, v)| ((i + 1).to_string(), Some(v.to_string())))
+ .collect(),
None => vec![],
},
".set" => {
@@ -1793,20 +1798,12 @@ impl Config {
};
values = candidates.into_iter().map(|v| (v, None)).collect();
filter = args[1];
- } else if cmd == ".agent" && args.len() >= 2 {
+ } else if cmd == ".agent" && args.len() == 2 {
let dir = Self::agent_data_dir(args[0]).join(SESSIONS_DIR_NAME);
values = list_file_names(dir, ".yaml")
.into_iter()
.map(|v| (v, None))
.collect();
- } else if cmd == ".starter" && args.len() >= 2 {
- if let Some(agent) = &self.agent {
- values = agent
- .conversation_staters()
- .iter()
- .filter_map(|v| v.strip_prefix(line).map(|x| (x.to_string(), None)))
- .collect()
- }
};
values
.into_iter()
diff --git a/src/repl/mod.rs b/src/repl/mod.rs
index 1d96885..ef7921d 100644
--- a/src/repl/mod.rs
+++ b/src/repl/mod.rs
@@ -13,7 +13,7 @@ use crate::config::{
};
use crate::render::render_error;
use crate::utils::{
- abortable_run_with_spinner, create_abort_signal, set_text, temp_file, AbortSignal,
+ abortable_run_with_spinner, create_abort_signal, dimmed_text, set_text, temp_file, AbortSignal,
};
use anyhow::{bail, Context, Result};
@@ -450,9 +450,25 @@ pub async fn run_repl_command(
}
},
".starter" => match args {
- Some(value) => {
- let input = Input::from_str(config, value, None);
- ask(config, abort_signal.clone(), input, true).await?;
+ Some(id) => {
+ let mut text = None;
+ if let Some(agent) = config.read().agent.as_ref() {
+ for (i, value) in agent.conversation_staters().iter().enumerate() {
+ if (i + 1).to_string() == id {
+ text = Some(value.clone());
+ }
+ }
+ }
+ match text {
+ Some(text) => {
+ println!("{}", dimmed_text(&format!(">> {}", text)));
+ let input = Input::from_str(config, &text, None);
+ ask(config, abort_signal.clone(), input, true).await?;
+ }
+ None => {
+ bail!("Invalid starter value");
+ }
+ }
}
None => {
let banner = config.read().agent_banner()?;