Integrate core functionality for tools, MCP, and enhanced session management
Adds consent management for tool execution, input validation, sandboxed process execution, and MCP server integration. Updates session management to support tool use, conversation persistence, and streaming responses. Major additions: - Database migrations for conversations and secure storage - Encryption and credential management infrastructure - Extensible tool system with code execution and web search - Consent management and validation systems - Sandboxed process execution - MCP server integration Infrastructure changes: - Module registration and workspace dependencies - ToolCall type and tool-related Message methods - Privacy, security, and tool configuration structures - Database-backed conversation persistence - Tool call tracking in conversations Provider and UI updates: - Ollama provider updates for tool support and new Role types - TUI chat and code app updates for async initialization - CLI updates for new SessionController API - Configuration documentation updates - CHANGELOG updates 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,6 @@ use crate::types::{Conversation, Message};
|
||||
use crate::Result;
|
||||
use serde_json::{Number, Value};
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::time::{Duration, Instant};
|
||||
use uuid::Uuid;
|
||||
|
||||
@@ -214,6 +213,25 @@ impl ConversationManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Set tool calls on a streaming message
|
||||
pub fn set_tool_calls_on_message(
|
||||
&mut self,
|
||||
message_id: Uuid,
|
||||
tool_calls: Vec<crate::types::ToolCall>,
|
||||
) -> Result<()> {
|
||||
let index = self
|
||||
.message_index
|
||||
.get(&message_id)
|
||||
.copied()
|
||||
.ok_or_else(|| crate::Error::Unknown(format!("Unknown message id: {message_id}")))?;
|
||||
|
||||
if let Some(message) = self.active_mut().messages.get_mut(index) {
|
||||
message.tool_calls = Some(tool_calls);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Update the active model (used when user changes model mid session)
|
||||
pub fn set_model(&mut self, model: impl Into<String>) {
|
||||
self.active.model = model.into();
|
||||
@@ -268,36 +286,40 @@ impl ConversationManager {
|
||||
}
|
||||
|
||||
/// Save the active conversation to disk
|
||||
pub fn save_active(&self, storage: &StorageManager, name: Option<String>) -> Result<PathBuf> {
|
||||
storage.save_conversation(&self.active, name)
|
||||
pub async fn save_active(
|
||||
&self,
|
||||
storage: &StorageManager,
|
||||
name: Option<String>,
|
||||
) -> Result<Uuid> {
|
||||
storage.save_conversation(&self.active, name).await?;
|
||||
Ok(self.active.id)
|
||||
}
|
||||
|
||||
/// Save the active conversation to disk with a description
|
||||
pub fn save_active_with_description(
|
||||
pub async fn save_active_with_description(
|
||||
&self,
|
||||
storage: &StorageManager,
|
||||
name: Option<String>,
|
||||
description: Option<String>,
|
||||
) -> Result<PathBuf> {
|
||||
storage.save_conversation_with_description(&self.active, name, description)
|
||||
) -> Result<Uuid> {
|
||||
storage
|
||||
.save_conversation_with_description(&self.active, name, description)
|
||||
.await?;
|
||||
Ok(self.active.id)
|
||||
}
|
||||
|
||||
/// Load a conversation from disk and make it active
|
||||
pub fn load_from_disk(
|
||||
&mut self,
|
||||
storage: &StorageManager,
|
||||
path: impl AsRef<Path>,
|
||||
) -> Result<()> {
|
||||
let conversation = storage.load_conversation(path)?;
|
||||
/// Load a conversation from storage and make it active
|
||||
pub async fn load_saved(&mut self, storage: &StorageManager, id: Uuid) -> Result<()> {
|
||||
let conversation = storage.load_conversation(id).await?;
|
||||
self.load(conversation);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// List all saved sessions
|
||||
pub fn list_saved_sessions(
|
||||
pub async fn list_saved_sessions(
|
||||
storage: &StorageManager,
|
||||
) -> Result<Vec<crate::storage::SessionMeta>> {
|
||||
storage.list_sessions()
|
||||
storage.list_sessions().await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user