From f33b1767dafa2e7100cf80eb39c16928e01f9cc8 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 7 Apr 2026 13:39:20 -0400 Subject: [PATCH] =?UTF-8?q?Restrict=20API=20types=20visibility=20=E2=80=94?= =?UTF-8?q?=20types=20module=20is=20now=20private?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only Message, Role, MessageContent, ContentPart, ToolCall, FunctionCall, Usage, ImageUrl are pub-exported from agent::api. Internal types (ChatRequest, ChatCompletionChunk, ChunkChoice, Delta, ReasoningConfig, ToolCallDelta, FunctionCallDelta) are pub(crate) — invisible outside the crate. All callers updated to import from agent::api:: instead of agent::api::types::. Co-Authored-By: Proof of Concept --- src/agent/api/mod.rs | 8 +++++--- src/agent/context.rs | 2 +- src/agent/mod.rs | 2 +- src/agent/oneshot.rs | 3 +-- src/agent/tools/mod.rs | 2 +- src/mind/dmn.rs | 6 +++--- src/mind/mod.rs | 4 ++-- src/subconscious/learn.rs | 2 +- src/user/chat.rs | 2 +- src/user/subconscious.rs | 2 +- 10 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/agent/api/mod.rs b/src/agent/api/mod.rs index 38fe71d..fd3fd38 100644 --- a/src/agent/api/mod.rs +++ b/src/agent/api/mod.rs @@ -8,10 +8,13 @@ pub mod http; pub mod parsing; -pub mod types; +mod types; mod openai; -pub use types::*; +// Public API types — used outside agent::api +pub use types::{Message, MessageContent, ContentPart, ImageUrl, Role, ToolCall, FunctionCall, Usage}; +// Internal types — re-exported for sibling modules within agent/ +pub(crate) use types::{ChatRequest, ReasoningConfig, ChatCompletionChunk, ChunkChoice, Delta, ToolCallDelta, FunctionCallDelta}; use anyhow::Result; use std::time::{Duration, Instant}; @@ -21,7 +24,6 @@ use self::http::{HttpClient, HttpResponse}; use tokio::sync::mpsc; use crate::agent::tools::{self as agent_tools, summarize_args, ActiveToolCall}; -pub use types::ToolCall; /// A JoinHandle that aborts its task when dropped. pub struct AbortOnDrop(tokio::task::JoinHandle<()>); diff --git a/src/agent/context.rs b/src/agent/context.rs index f6de30c..defff60 100644 --- a/src/agent/context.rs +++ b/src/agent/context.rs @@ -4,7 +4,7 @@ // Journal entries are loaded from the memory graph store, not from // a flat file — the parse functions are gone. -use crate::agent::api::types::*; +use crate::agent::api::*; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use tiktoken_rs::CoreBPE; diff --git a/src/agent/mod.rs b/src/agent/mod.rs index 98f2e3f..36a1260 100644 --- a/src/agent/mod.rs +++ b/src/agent/mod.rs @@ -23,7 +23,7 @@ use anyhow::Result; use tiktoken_rs::CoreBPE; use api::{ApiClient, ToolCall}; -use api::types::{ContentPart, Message, MessageContent, Role}; +use api::{ContentPart, Message, MessageContent, Role}; use context::{ConversationEntry, ContextState}; use tools::{summarize_args, working_stack}; diff --git a/src/agent/oneshot.rs b/src/agent/oneshot.rs index cb2a24d..9257aa3 100644 --- a/src/agent/oneshot.rs +++ b/src/agent/oneshot.rs @@ -14,8 +14,7 @@ use std::fs; use std::path::PathBuf; use std::sync::OnceLock; -use super::api::ApiClient; -use super::api::types::*; +use super::api::{self, ApiClient, Message, Usage}; use super::tools::{self as agent_tools}; use super::Agent; diff --git a/src/agent/tools/mod.rs b/src/agent/tools/mod.rs index 6f03a67..5a66d62 100644 --- a/src/agent/tools/mod.rs +++ b/src/agent/tools/mod.rs @@ -58,7 +58,7 @@ impl Tool { } // Re-export API wire types used by the agent turn loop -use super::api::types::ToolCall; +use super::api::ToolCall; /// A tool call in flight — metadata for TUI + JoinHandle for /// result collection and cancellation. diff --git a/src/mind/dmn.rs b/src/mind/dmn.rs index e465a16..491143d 100644 --- a/src/mind/dmn.rs +++ b/src/mind/dmn.rs @@ -433,7 +433,7 @@ impl Subconscious { let rendered = store_guard.as_ref() .and_then(|s| crate::cli::node::render_node(s, key)); if let Some(rendered) = rendered { - let mut msg = crate::agent::api::types::Message::user(format!( + let mut msg = crate::agent::api::Message::user(format!( "\n--- {} (surfaced) ---\n{}\n", key, rendered, )); @@ -447,7 +447,7 @@ impl Subconscious { if let Some(reflection) = outputs.get("reflection") { if !reflection.trim().is_empty() { - ag.push_message(crate::agent::api::types::Message::user(format!( + ag.push_message(crate::agent::api::Message::user(format!( "\n--- subconscious reflection ---\n{}\n", reflection.trim(), ))); @@ -457,7 +457,7 @@ impl Subconscious { if let Some(nudge) = outputs.get("thalamus") { let nudge = nudge.trim(); if !nudge.is_empty() && nudge != "ok" { - ag.push_message(crate::agent::api::types::Message::user(format!( + ag.push_message(crate::agent::api::Message::user(format!( "\n--- thalamus ---\n{}\n", nudge, ))); diff --git a/src/mind/mod.rs b/src/mind/mod.rs index b946318..3bbca79 100644 --- a/src/mind/mod.rs +++ b/src/mind/mod.rs @@ -363,10 +363,10 @@ impl Mind { let mut ag = self.agent.lock().await; match target { StreamTarget::Conversation => { - ag.push_message(crate::agent::api::types::Message::user(text)); + ag.push_message(crate::agent::api::Message::user(text)); } StreamTarget::Autonomous => { - let mut msg = crate::agent::api::types::Message::user(text); + let mut msg = crate::agent::api::Message::user(text); msg.stamp(); ag.push_entry(crate::agent::context::ConversationEntry::Dmn(msg)); } diff --git a/src/subconscious/learn.rs b/src/subconscious/learn.rs index 7e2722f..c72e3f3 100644 --- a/src/subconscious/learn.rs +++ b/src/subconscious/learn.rs @@ -15,7 +15,7 @@ // hasn't internalized. 2 API calls. use crate::agent::api::ApiClient; -use crate::agent::api::types::*; +use crate::agent::api::*; use crate::agent::context::{ConversationEntry, ContextState}; const SCORE_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(120); diff --git a/src/user/chat.rs b/src/user/chat.rs index 53342ec..b863667 100644 --- a/src/user/chat.rs +++ b/src/user/chat.rs @@ -414,7 +414,7 @@ impl InteractScreen { /// Route an agent entry to pane items. /// Returns empty vec for entries that shouldn't be displayed. fn route_entry(entry: &crate::agent::context::ConversationEntry) -> Vec<(PaneTarget, String, Marker)> { - use crate::agent::api::types::Role; + use crate::agent::api::Role; use crate::agent::context::ConversationEntry; if let ConversationEntry::Memory { .. } = entry { diff --git a/src/user/subconscious.rs b/src/user/subconscious.rs index 24e88cb..6ecbdf6 100644 --- a/src/user/subconscious.rs +++ b/src/user/subconscious.rs @@ -11,7 +11,7 @@ use ratatui::{ use super::{App, ScreenView, screen_legend}; use crate::agent::context::ConversationEntry; -use crate::agent::api::types::Role; +use crate::agent::api::Role; pub(crate) struct SubconsciousScreen { selected: usize,