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:
@@ -270,6 +270,7 @@ mod tests {
|
||||
accumulated_input_tokens: Some(50),
|
||||
accumulated_output_tokens: Some(50),
|
||||
extension_data: crate::session::ExtensionData::new(),
|
||||
recipe: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user