send tool call log as .md file, deploy assets, fix status(&mut self)

This commit is contained in:
Fam Zheng
2026-04-11 09:39:51 +01:00
parent 55e9b2f50f
commit 2b42ca539c
3 changed files with 21 additions and 6 deletions

View File

@@ -35,6 +35,7 @@ deploy: test build
scp config.suite.yaml $(SUITE):/data/noc/config.yaml scp config.suite.yaml $(SUITE):/data/noc/config.yaml
scp noc.service.in $(SUITE):/data/noc/ scp noc.service.in $(SUITE):/data/noc/
rsync -a tools/ $(SUITE):/data/noc/tools/ rsync -a tools/ $(SUITE):/data/noc/tools/
rsync -a assets/ $(SUITE):/data/noc/assets/
ssh $(SUITE) 'bash -lc "\ ssh $(SUITE) 'bash -lc "\
cd /data/noc \ cd /data/noc \
&& sed -e \"s|@REPO@|/data/noc|g\" -e \"s|@PATH@|\$$PATH|g\" noc.service.in > ~/.config/systemd/user/noc.service \ && sed -e \"s|@REPO@|/data/noc|g\" -e \"s|@PATH@|\$$PATH|g\" noc.service.in > ~/.config/systemd/user/noc.service \

View File

@@ -18,7 +18,7 @@ pub trait Output: Send + Sync {
async fn finalize(&mut self, text: &str) -> Result<()>; async fn finalize(&mut self, text: &str) -> Result<()>;
/// Send a status/notification line (e.g. "[tool: bash] running...") /// Send a status/notification line (e.g. "[tool: bash] running...")
async fn status(&self, text: &str) -> Result<()>; async fn status(&mut self, text: &str) -> Result<()>;
/// Send a file. Returns Ok(true) if sent, Ok(false) if not supported. /// Send a file. Returns Ok(true) if sent, Ok(false) if not supported.
async fn send_file(&self, path: &Path, caption: &str) -> Result<bool>; async fn send_file(&self, path: &Path, caption: &str) -> Result<bool>;
@@ -43,6 +43,7 @@ pub struct TelegramOutput {
use_draft: bool, use_draft: bool,
last_edit: Instant, last_edit: Instant,
http: reqwest::Client, http: reqwest::Client,
tool_log: Vec<String>,
} }
impl TelegramOutput { impl TelegramOutput {
@@ -55,6 +56,7 @@ impl TelegramOutput {
use_draft: is_private, use_draft: is_private,
last_edit: Instant::now(), last_edit: Instant::now(),
http: reqwest::Client::new(), http: reqwest::Client::new(),
tool_log: Vec::new(),
} }
} }
} }
@@ -118,11 +120,23 @@ impl Output for TelegramOutput {
text, text,
) )
.await; .await;
// send tool call log as .md file if any
if !self.tool_log.is_empty() {
let md = self.tool_log.join("\n");
let tmp = format!("/tmp/noc_tools_{}.md", std::process::id());
if std::fs::write(&tmp, &md).is_ok() {
let input_file = InputFile::file(std::path::Path::new(&tmp));
let _ = self.bot.send_document(self.chat_id, input_file).await;
let _ = std::fs::remove_file(&tmp);
}
self.tool_log.clear();
}
Ok(()) Ok(())
} }
async fn status(&self, text: &str) -> Result<()> { async fn status(&mut self, text: &str) -> Result<()> {
let _ = self.bot.send_message(self.chat_id, text).await; self.tool_log.push(text.to_string());
Ok(()) Ok(())
} }
@@ -162,7 +176,7 @@ impl Output for GiteaOutput {
.await .await
} }
async fn status(&self, _text: &str) -> Result<()> { async fn status(&mut self, _text: &str) -> Result<()> {
// No status updates for Gitea // No status updates for Gitea
Ok(()) Ok(())
} }
@@ -201,7 +215,7 @@ impl Output for BufferOutput {
Ok(()) Ok(())
} }
async fn status(&self, _text: &str) -> Result<()> { async fn status(&mut self, _text: &str) -> Result<()> {
Ok(()) Ok(())
} }

View File

@@ -625,7 +625,7 @@ pub async fn spawn_agent(
id: &str, id: &str,
task: &str, task: &str,
state: &Arc<AppState>, state: &Arc<AppState>,
output: &dyn Output, output: &mut dyn Output,
sid: &str, sid: &str,
_config: &Arc<Config>, _config: &Arc<Config>,
chat_id: i64, chat_id: i64,