diff --git a/src/agent/context.rs b/src/agent/context.rs index e550885..79ca030 100644 --- a/src/agent/context.rs +++ b/src/agent/context.rs @@ -63,7 +63,8 @@ pub enum NodeBody { } /// A leaf node: typed content with cached token IDs. -#[derive(Debug, Clone, Serialize, Deserialize)] +/// Token IDs are not serialized — they're recomputed on deserialization. +#[derive(Debug, Clone, Serialize)] pub struct NodeLeaf { body: NodeBody, #[serde(skip)] @@ -71,6 +72,23 @@ pub struct NodeLeaf { timestamp: Option>, } +impl<'de> Deserialize<'de> for NodeLeaf { + fn deserialize>(deserializer: D) -> Result { + #[derive(Deserialize)] + struct Raw { + body: NodeBody, + timestamp: Option>, + } + let raw = Raw::deserialize(deserializer)?; + let token_ids = if raw.body.is_prompt_visible() { + tokenizer::encode(&raw.body.render()) + } else { + vec![] + }; + Ok(NodeLeaf { body: raw.body, token_ids, timestamp: raw.timestamp }) + } +} + /// A node in the context AST. #[derive(Debug, Clone, Serialize, Deserialize)] pub enum AstNode {