Add session to agents (#4216)

Co-authored-by: Douwe Osinga <douwe@squareup.com>
Co-authored-by: Jack Amadeo <jackamadeo@squareup.com>
Co-authored-by: Jack Amadeo <jackamadeo@block.xyz>
This commit is contained in:
Douwe Osinga
2025-09-03 10:31:24 -04:00
committed by GitHub
parent db94c5b7c3
commit d2195289cf
65 changed files with 1473 additions and 1601 deletions
@@ -270,6 +270,7 @@ mod tests {
accumulated_input_tokens: Some(50),
accumulated_output_tokens: Some(50),
extension_data: crate::session::ExtensionData::new(),
recipe: None,
}
}
+1
View File
@@ -1299,6 +1299,7 @@ async fn run_scheduled_job_internal(
accumulated_input_tokens: None,
accumulated_output_tokens: None,
extension_data: crate::session::ExtensionData::new(),
recipe: None,
};
if let Err(e_fb) = crate::session::storage::save_messages_with_metadata(
&session_file_path,
+11 -4
View File
@@ -8,6 +8,7 @@
use crate::conversation::message::Message;
use crate::conversation::Conversation;
use crate::providers::base::Provider;
use crate::recipe::Recipe;
use crate::session::extension_data::ExtensionData;
use crate::utils::safe_truncate;
use anyhow::Result;
@@ -69,6 +70,8 @@ pub struct SessionMetadata {
/// Extension data containing extension states
#[serde(default)]
pub extension_data: ExtensionData,
pub recipe: Option<Recipe>,
}
// Custom deserializer to handle old sessions without working_dir
@@ -91,6 +94,7 @@ impl<'de> Deserialize<'de> for SessionMetadata {
working_dir: Option<PathBuf>,
#[serde(default)]
extension_data: ExtensionData,
recipe: Option<Recipe>,
}
let helper = Helper::deserialize(deserializer)?;
@@ -113,6 +117,7 @@ impl<'de> Deserialize<'de> for SessionMetadata {
accumulated_output_tokens: helper.accumulated_output_tokens,
working_dir,
extension_data: helper.extension_data,
recipe: helper.recipe,
})
}
}
@@ -138,6 +143,7 @@ impl SessionMetadata {
accumulated_input_tokens: None,
accumulated_output_tokens: None,
extension_data: ExtensionData::new(),
recipe: None,
}
}
}
@@ -391,6 +397,7 @@ pub fn list_sessions() -> Result<Vec<(String, PathBuf)>> {
}
/// Generate a session ID using timestamp format (yyyymmdd_hhmmss)
/// TODO(Douwe): make this actually be unique
pub fn generate_session_id() -> String {
Local::now().format("%Y%m%d_%H%M%S").to_string()
}
@@ -1150,7 +1157,7 @@ pub async fn persist_messages_with_schedule_id(
pub fn save_messages_with_metadata(
session_file: &Path,
metadata: &SessionMetadata,
messages: &Conversation,
conversation: &Conversation,
) -> Result<()> {
use fs2::FileExt;
@@ -1158,10 +1165,10 @@ pub fn save_messages_with_metadata(
let secure_path = get_path(Identifier::Path(session_file.to_path_buf()))?;
// Security check: message count limit
if messages.len() > MAX_MESSAGE_COUNT {
if conversation.len() > MAX_MESSAGE_COUNT {
tracing::warn!(
"Message count exceeds limit during save: {}",
messages.len()
conversation.len()
);
return Err(anyhow::anyhow!("Too many messages to save"));
}
@@ -1218,7 +1225,7 @@ pub fn save_messages_with_metadata(
writeln!(writer)?;
// Write all messages with progress tracking
for (i, message) in messages.iter().enumerate() {
for (i, message) in conversation.iter().enumerate() {
serde_json::to_writer(&mut writer, &message).map_err(|e| {
tracing::error!("Failed to serialize message {}: {}", i, e);
anyhow::anyhow!("Failed to write session message")