Codex Handbook
ext/memories/src/prompts.rs 55 lines
use crate::MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT;use codex_utils_absolute_path::AbsolutePathBuf;use codex_utils_output_truncation::TruncationPolicy;use codex_utils_output_truncation::truncate_text;use codex_utils_template::Template;use std::sync::LazyLock;use tokio::fs;static MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_TEMPLATE: LazyLock<Template> = LazyLock::new(|| {    parse_embedded_template(        include_str!("../templates/memories/read_path.md"),        "memories/read_path.md",    )});fn parse_embedded_template(source: &'static str, template_name: &str) -> Template {    match Template::parse(source) {        Ok(template) => template,        Err(err) => panic!("embedded template {template_name} is invalid: {err}"),    }}/// Build the memory read-path prompt that is added to developer instructions.////// Large `memory_summary.md` files are truncated at/// [MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT].pub(crate) async fn build_memory_tool_developer_instructions(    codex_home: &AbsolutePathBuf,) -> Option<String> {    let base_path = codex_home.join("memories");    let memory_summary_path = base_path.join("memory_summary.md");    let memory_summary = fs::read_to_string(&memory_summary_path)        .await        .ok()?        .trim()        .to_string();    let memory_summary = truncate_text(        &memory_summary,        TruncationPolicy::Tokens(MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_SUMMARY_TOKEN_LIMIT),    );    if memory_summary.is_empty() {        return None;    }    let base_path = base_path.display().to_string();    MEMORY_TOOL_DEVELOPER_INSTRUCTIONS_TEMPLATE        .render([            ("base_path", base_path.as_str()),            ("memory_summary", memory_summary.as_str()),        ])        .ok()}#[cfg(test)]#[path = "prompts_tests.rs"]mod tests;