use crate::{ client::HonchoClient, error::Result, models::*, workspaces::page_query, }; impl HonchoClient { // ── CRUD ────────────────────────────────────────────────────────────── pub async fn create_peer(&self, workspace_id: &str, body: &PeerCreate) -> Result { self.post(&format!("/v3/workspaces/{workspace_id}/peers"), body) .await } pub async fn list_peers( &self, workspace_id: &str, params: &PageParams, filter: &PeerGet, ) -> Result> { self.post_with_query( &format!("/v3/workspaces/{workspace_id}/peers/list"), &page_query(params), filter, ) .await } pub async fn update_peer( &self, workspace_id: &str, peer_id: &str, body: &PeerUpdate, ) -> Result { self.put( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}"), body, ) .await } // ── Sessions for a peer ─────────────────────────────────────────────── pub async fn list_peer_sessions( &self, workspace_id: &str, peer_id: &str, params: &PageParams, filter: &SessionGet, ) -> Result> { self.post_with_query( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/sessions"), &page_query(params), filter, ) .await } // ── Dialectic (memory query via LLM) ────────────────────────────────── /// Query a peer's memory using natural language. Returns the LLM answer. /// Note: `stream: true` is not supported by this client (use raw reqwest if needed). pub async fn peer_chat( &self, workspace_id: &str, peer_id: &str, opts: &DialecticOptions, ) -> Result { self.post( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/chat"), opts, ) .await } // ── Representation ──────────────────────────────────────────────────── /// Get a structured representation of a peer's memory. pub async fn peer_representation( &self, workspace_id: &str, peer_id: &str, opts: &PeerRepresentationGet, ) -> Result { self.post( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/representation"), opts, ) .await } // ── Context ─────────────────────────────────────────────────────────── /// Get context for a peer (conclusions + card, ready for injection into prompts). pub async fn peer_context( &self, workspace_id: &str, peer_id: &str, opts: &PeerRepresentationGet, ) -> Result { let mut q: Vec<(&str, String)> = vec![]; if let Some(ref v) = opts.target { q.push(("target", v.clone())); } if let Some(ref v) = opts.search_query { q.push(("search_query", v.clone())); } if let Some(v) = opts.search_top_k { q.push(("search_top_k", v.to_string())); } if let Some(v) = opts.search_max_distance { q.push(("search_max_distance", v.to_string())); } if let Some(v) = opts.include_most_frequent { q.push(("include_most_frequent", v.to_string())); } if let Some(v) = opts.max_conclusions { q.push(("max_conclusions", v.to_string())); } self.get_with_query( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/context"), &q, ) .await } // ── Card ────────────────────────────────────────────────────────────── pub async fn get_peer_card( &self, workspace_id: &str, peer_id: &str, target: Option<&str>, ) -> Result { let mut q: Vec<(&str, String)> = vec![]; if let Some(t) = target { q.push(("target", t.to_owned())); } self.get_with_query( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/card"), &q, ) .await } pub async fn set_peer_card( &self, workspace_id: &str, peer_id: &str, target: Option<&str>, card: serde_json::Value, ) -> Result { let mut q: Vec<(&str, String)> = vec![]; if let Some(t) = target { q.push(("target", t.to_owned())); } self.put_with_query( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/card"), &q, &card, ) .await } // ── Search ──────────────────────────────────────────────────────────── pub async fn search_peer( &self, workspace_id: &str, peer_id: &str, opts: &MessageSearchOptions, ) -> Result> { self.post( &format!("/v3/workspaces/{workspace_id}/peers/{peer_id}/search"), opts, ) .await } }