Codex Handbook
core/src/state/additional_context.rs 37 lines
use std::collections::BTreeMap;use crate::context::AdditionalContextDeveloperFragment;use crate::context::AdditionalContextUserFragment;use crate::context::ContextualUserFragment;use codex_protocol::models::ResponseInputItem;use codex_protocol::protocol::AdditionalContextEntry;use codex_protocol::protocol::AdditionalContextKind;#[derive(Debug, Clone, Default, PartialEq, Eq)]pub(crate) struct AdditionalContextStore {    values: BTreeMap<String, AdditionalContextEntry>,}impl AdditionalContextStore {    pub(crate) fn merge(        &mut self,        values: BTreeMap<String, AdditionalContextEntry>,    ) -> Vec<ResponseInputItem> {        let fragments = values            .iter()            .filter(|(key, value)| self.values.get(*key) != Some(*value))            .map(|(key, entry)| match entry.kind {                AdditionalContextKind::Untrusted => {                    AdditionalContextUserFragment::new(key.clone(), entry.value.clone())                        .into_response_input_item()                }                AdditionalContextKind::Application => {                    AdditionalContextDeveloperFragment::new(key.clone(), entry.value.clone())                        .into_response_input_item()                }            })            .collect();        self.values = values;        fragments    }}