bamboo-server 2026.5.3

HTTP server and API layer for the Bamboo agent framework
Documentation
use bamboo_agent_core::agent::{Message, Role};

use super::models::{FileChangePayload, FileRestoreAction, FileRestoreError};

#[derive(Debug, Default)]
pub(super) struct FileRestorePlan {
    pub(super) actions: Vec<FileRestoreAction>,
    pub(super) initial_errors: Vec<FileRestoreError>,
}

pub(super) fn find_target_message_index(
    messages: &[Message],
    target_message_id: &str,
) -> Option<usize> {
    messages
        .iter()
        .position(|message| message.id == target_message_id)
}

pub(super) fn build_restore_plan(messages_after_target: &[Message]) -> FileRestorePlan {
    let mut plan = FileRestorePlan::default();

    for message in messages_after_target.iter().rev() {
        if !matches!(message.role, Role::Tool) {
            continue;
        }

        let Ok(payload) = serde_json::from_str::<FileChangePayload>(&message.content) else {
            continue;
        };

        let file_path = payload.file_path.trim();
        if file_path.is_empty() {
            continue;
        }

        if let Some(checkpoint) = payload.checkpoint {
            if checkpoint.created {
                let Some(checkpoint_path) = checkpoint.path else {
                    plan.initial_errors.push(FileRestoreError::new(
                        file_path,
                        None,
                        "Checkpoint path missing",
                    ));
                    continue;
                };

                plan.actions.push(FileRestoreAction::RestoreFromCheckpoint {
                    file_path: file_path.to_string(),
                    checkpoint_path,
                });
                continue;
            }
        }

        plan.actions.push(FileRestoreAction::DeleteFile {
            file_path: file_path.to_string(),
        });
    }

    plan
}