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,