Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 4 additions & 17 deletions src/apps/cli/src/agent/agentic_system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,11 @@ pub async fn init_agentic_system() -> Result<AgenticSystem> {
let path_manager = try_get_path_manager_arc()?;
let persistence_manager = Arc::new(persistence::PersistenceManager::new(path_manager.clone())?);

let history_manager = Arc::new(session::MessageHistoryManager::new(
persistence_manager.clone(),
session::HistoryConfig {
enable_persistence: false,
..Default::default()
},
));

let compression_manager = Arc::new(session::CompressionManager::new(
persistence_manager.clone(),
session::CompressionConfig {
enable_persistence: false,
..Default::default()
},
));
let context_store = Arc::new(session::SessionContextStore::new());
let context_compressor = Arc::new(session::ContextCompressor::new(Default::default()));

let session_manager = Arc::new(session::SessionManager::new(
history_manager.clone(),
compression_manager,
context_store,
persistence_manager.clone(),
Default::default(),
));
Expand All @@ -75,6 +61,7 @@ pub async fn init_agentic_system() -> Result<AgenticSystem> {
round_executor,
event_queue.clone(),
session_manager.clone(),
context_compressor,
Default::default(),
));

Expand Down
100 changes: 0 additions & 100 deletions src/apps/desktop/src/api/agentic_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,22 +125,6 @@ pub struct SessionResponse {
pub created_at: u64,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetMessagesRequest {
pub session_id: String,
pub limit: Option<usize>,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MessageDTO {
pub id: String,
pub role: String,
pub content: serde_json::Value,
pub timestamp: u64,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelDialogTurnRequest {
Expand Down Expand Up @@ -583,21 +567,6 @@ pub async fn list_sessions(
Ok(responses)
}

#[tauri::command]
pub async fn get_session_messages(
coordinator: State<'_, Arc<ConversationCoordinator>>,
request: GetMessagesRequest,
) -> Result<Vec<MessageDTO>, String> {
let messages = coordinator
.get_messages(&request.session_id)
.await
.map_err(|e| format!("Failed to get messages: {}", e))?;

let message_dtos = messages.into_iter().map(message_to_dto).collect();

Ok(message_dtos)
}

#[tauri::command]
pub async fn confirm_tool_execution(
coordinator: State<'_, Arc<ConversationCoordinator>>,
Expand Down Expand Up @@ -733,75 +702,6 @@ fn session_to_response(session: Session) -> SessionResponse {
}
}

fn message_to_dto(message: Message) -> MessageDTO {
let role = match message.role {
MessageRole::User => "user",
MessageRole::Assistant => "assistant",
MessageRole::Tool => "tool",
MessageRole::System => "system",
};

let content = match message.content {
MessageContent::Text(text) => serde_json::json!({ "type": "text", "text": text }),
MessageContent::Multimodal { text, images } => {
let images: Vec<serde_json::Value> = images
.into_iter()
.map(|img| {
serde_json::json!({
"id": img.id,
"image_path": img.image_path,
"mime_type": img.mime_type,
"metadata": img.metadata,
"has_data_url": img.data_url.as_ref().is_some_and(|s| !s.is_empty()),
})
})
.collect();

serde_json::json!({
"type": "multimodal",
"text": text,
"images": images,
})
}
MessageContent::ToolResult {
tool_id,
tool_name,
result,
result_for_assistant,
is_error: _,
image_attachments,
} => {
serde_json::json!({
"type": "tool_result",
"tool_id": tool_id,
"tool_name": tool_name,
"result": result,
"result_for_assistant": result_for_assistant,
"has_image_attachments": image_attachments.as_ref().is_some_and(|a| !a.is_empty()),
})
}
MessageContent::Mixed {
reasoning_content,
text,
tool_calls,
} => {
serde_json::json!({
"type": "mixed",
"reasoning_content": reasoning_content,
"text": text,
"tool_calls": tool_calls,
})
}
};

MessageDTO {
id: message.id,
role: role.to_string(),
content,
timestamp: system_time_to_unix_secs(message.timestamp),
}
}

fn system_time_to_unix_secs(time: std::time::SystemTime) -> u64 {
match time.duration_since(std::time::UNIX_EPOCH) {
Ok(duration) => duration.as_secs(),
Expand Down
22 changes: 4 additions & 18 deletions src/apps/desktop/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,6 @@ pub async fn run() {
api::agentic_api::restore_session,
webdriver_bridge_result,
api::agentic_api::list_sessions,
api::agentic_api::get_session_messages,
api::agentic_api::confirm_tool_execution,
api::agentic_api::reject_tool_execution,
api::agentic_api::cancel_tool,
Expand Down Expand Up @@ -714,25 +713,11 @@ async fn init_agentic_system() -> anyhow::Result<(
let path_manager = try_get_path_manager_arc()?;
let persistence_manager = Arc::new(persistence::PersistenceManager::new(path_manager.clone())?);

let history_manager = Arc::new(session::MessageHistoryManager::new(
persistence_manager.clone(),
session::HistoryConfig {
enable_persistence: false,
..Default::default()
},
));

let compression_manager = Arc::new(session::CompressionManager::new(
persistence_manager.clone(),
session::CompressionConfig {
enable_persistence: false,
..Default::default()
},
));
let context_store = Arc::new(session::SessionContextStore::new());
let context_compressor = Arc::new(session::ContextCompressor::new(Default::default()));

let session_manager = Arc::new(session::SessionManager::new(
history_manager,
compression_manager,
context_store,
persistence_manager,
Default::default(),
));
Expand Down Expand Up @@ -762,6 +747,7 @@ async fn init_agentic_system() -> anyhow::Result<(
round_executor,
event_queue.clone(),
session_manager.clone(),
context_compressor,
Default::default(),
));

Expand Down
38 changes: 11 additions & 27 deletions src/apps/server/src/bootstrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
use bitfun_core::agentic::*;
use bitfun_core::infrastructure::ai::AIClientFactory;
use bitfun_core::infrastructure::try_get_path_manager_arc;
use bitfun_core::service::{
ai_rules, config, filesystem, mcp, token_usage, workspace,
};
use bitfun_core::service::{ai_rules, config, filesystem, mcp, token_usage, workspace};
use std::sync::Arc;
use tokio::sync::RwLock;

Expand Down Expand Up @@ -50,28 +48,13 @@ pub async fn initialize(workspace: Option<String>) -> anyhow::Result<Arc<ServerA
let event_queue = Arc::new(events::EventQueue::new(Default::default()));
let event_router = Arc::new(events::EventRouter::new());

let persistence_manager =
Arc::new(persistence::PersistenceManager::new(path_manager.clone())?);
let persistence_manager = Arc::new(persistence::PersistenceManager::new(path_manager.clone())?);

let history_manager = Arc::new(session::MessageHistoryManager::new(
persistence_manager.clone(),
session::HistoryConfig {
enable_persistence: false,
..Default::default()
},
));

let compression_manager = Arc::new(session::CompressionManager::new(
persistence_manager.clone(),
session::CompressionConfig {
enable_persistence: false,
..Default::default()
},
));
let context_store = Arc::new(session::SessionContextStore::new());
let context_compressor = Arc::new(session::ContextCompressor::new(Default::default()));

let session_manager = Arc::new(session::SessionManager::new(
history_manager,
compression_manager,
context_store,
persistence_manager,
Default::default(),
));
Expand All @@ -96,6 +79,7 @@ pub async fn initialize(workspace: Option<String>) -> anyhow::Result<Arc<ServerA
round_executor,
event_queue.clone(),
session_manager.clone(),
context_compressor,
Default::default(),
));

Expand All @@ -110,11 +94,11 @@ pub async fn initialize(workspace: Option<String>) -> anyhow::Result<Arc<ServerA
coordination::ConversationCoordinator::set_global(coordinator.clone());

// Token usage
let token_usage_service = Arc::new(
token_usage::TokenUsageService::new(path_manager.clone()).await?,
);
let token_usage_subscriber =
Arc::new(token_usage::TokenUsageSubscriber::new(token_usage_service.clone()));
let token_usage_service =
Arc::new(token_usage::TokenUsageService::new(path_manager.clone()).await?);
let token_usage_subscriber = Arc::new(token_usage::TokenUsageSubscriber::new(
token_usage_service.clone(),
));
event_router.subscribe_internal("token_usage".to_string(), token_usage_subscriber);

// Dialog scheduler
Expand Down
Loading
Loading