Skip to content

Commit ca4fbfd

Browse files
Native: Complete MCP workflow for search filter
1 parent 89151b6 commit ca4fbfd

File tree

11 files changed

+43
-30
lines changed

11 files changed

+43
-30
lines changed

application/apps/indexer/gui/application/src/host/message.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ pub enum HostMessage {
2929
/// instead of creating a new tab for the session.
3030
session_setup_id: Option<Uuid>,
3131
},
32+
SessionFilterUpdated {
33+
session_id: Uuid,
34+
operation_id: Uuid,
35+
filters: Vec<processor::search::filter::SearchFilter>,
36+
},
3237
/// Open Session Setup for concatenating files.
3338
MultiFilesSetup(Box<MultiFileState>),
3439
}

application/apps/indexer/gui/application/src/host/service/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use itertools::Itertools;
1010
use tokio::runtime::Handle;
1111
use uuid::Uuid;
1212

13-
use mcp::server::{McpServer, tasks::Tasks};
13+
use mcp::server::McpServer;
1414
use parsers::dlt::DltFilterConfig;
1515
use stypes::{
1616
DltParserSettings, FileFormat, ObserveOptions, ObserveOrigin, ParserType, SomeIpParserSettings,
@@ -91,7 +91,6 @@ impl HostService {
9191
async fn handle_command(&mut self, cmd: HostCommand) -> Result<(), HostError> {
9292
match cmd {
9393
HostCommand::OpenFiles(files) => {
94-
println!("🔵 HostCommand::OpenFiles");
9594
log::trace!("Got open files request. Files: {files:?}");
9695

9796
if files.len() == 1 {
@@ -102,7 +101,6 @@ impl HostService {
102101
}
103102
}
104103
HostCommand::OpenAsSessions(files) => {
105-
println!("🔵 HostCommand::OpenAsSessions");
106104
for file in files {
107105
if let Err(err) = self.open_single_file(file).await {
108106
self.send_host_err(err).await;
@@ -112,10 +110,7 @@ impl HostService {
112110
HostCommand::OpenFromDirectory {
113111
dir_path,
114112
target_format,
115-
} => {
116-
println!("🔵 HostCommand::OpenFromDirectory");
117-
self.files_in_dir(dir_path, target_format).await?
118-
}
113+
} => self.files_in_dir(dir_path, target_format).await?,
119114

120115
HostCommand::ConcatFiles(files) => self.concatenate_files(files).await?,
121116
HostCommand::ConnectionSessionSetup { stream, parser } => {

application/apps/indexer/gui/application/src/host/ui/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ impl Host {
156156
session_setup_id,
157157
self.senders.cmd_tx.clone(),
158158
),
159+
HostMessage::SessionFilterUpdated {
160+
session_id,
161+
operation_id,
162+
filters,
163+
} => {
164+
self.state.sessions.get_mut(&session_id).map(|session| {
165+
session.update_session_filters(operation_id, filters);
166+
});
167+
}
159168
HostMessage::MultiFilesSetup(state) => self
160169
.state
161170
.add_multi_files(*state, self.senders.cmd_tx.clone()),

application/apps/indexer/gui/application/src/host/ui/state.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use crate::{
99
ui::{
1010
multi_setup::{MultiFileSetup, state::MultiFileState},
1111
session_setup::{SessionSetup, state::SessionSetupState},
12-
settings::ai_config::AiConfiguration,
1312
tabs::TabType,
1413
},
1514
},

application/apps/indexer/gui/application/src/session/service/mod.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl SessionService {
9696
async fn run(mut self) {
9797
log::trace!("Start Session Service {}", self.session_id());
9898

99-
let (client, prompt_tx, mut response_rx) = McpClient::new();
99+
let (client, prompt_tx, mut _response_rx) = McpClient::new();
100100
if let Err(err) = client.start().await {
101101
log::error!(
102102
"Failed to start MCP client for session {}: {err:?}",
@@ -120,20 +120,21 @@ impl SessionService {
120120
match task {
121121
Tasks::ApplySearchFilter { session_id, filters, task_result_tx } => {
122122
if self.session_id() == session_id {
123-
let cmd = SessionCommand::ApplySearchFilter { operation_id: session_id, filters: filters.clone() };
123+
let operation_id = Uuid::new_v4();
124+
let cmd = SessionCommand::ApplySearchFilter { operation_id: operation_id.clone(), filters: filters.clone() };
125+
124126
match self.handle_command(cmd, prompt_tx.clone()).await {
125127
Ok(ControlFlow::Break(())) => {
126-
127128
if let Err(err) = task_result_tx.send(Ok(())).await {
128129
log::error!("Failed to send task result for ApplySearchFilter: {err:?}");
129130
}
130131
break
131132
},
132133
Ok(ControlFlow::Continue(())) => {
133-
134134
if let Err(err) = task_result_tx.send(Ok(())).await {
135135
log::error!("Failed to send task result for ApplySearchFilter: {err:?}");
136136
}
137+
self.senders.send_host_message(HostMessage::SessionFilterUpdated { session_id, operation_id, filters }).await;
137138
},
138139
Err(error) => {
139140
self.send_error(error).await;
@@ -212,13 +213,7 @@ impl SessionService {
212213
operation_id,
213214
filters,
214215
} => {
215-
let filts = vec![SearchFilter::new("time=13".to_string(), false, true, false)];
216-
println!(
217-
"☑️ Session::SessionService::handle_command: Applying search filters for session {}: {:?}",
218-
self.session_id(),
219-
filters
220-
);
221-
self.session.apply_search_filters(operation_id, filts)?;
216+
self.session.apply_search_filters(operation_id, filters)?;
222217
}
223218
SessionCommand::DropSearch { operation_id } => {
224219
if let Some(filter_op) = operation_id {

application/apps/indexer/gui/application/src/session/ui/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ impl Session {
9090
actions.try_send_command(&self.cmd_tx, SessionCommand::CloseSession);
9191
}
9292

93+
pub fn update_session_filters(
94+
&mut self,
95+
operation_id: uuid::Uuid,
96+
filters: Vec<processor::search::filter::SearchFilter>,
97+
) {
98+
self.shared.search.set_search_operation(operation_id);
99+
self.bottom_panel.search.bar.temp_filter = filters.first().cloned();
100+
}
101+
93102
pub fn render_content(&mut self, actions: &mut UiActions, ui: &mut Ui) {
94103
let Self {
95104
logs_table,
File renamed without changes.

application/apps/indexer/mcp/src/agents/ollama.rs renamed to application/apps/indexer/mcp/src/client/agents/ollama.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use serde_json::Value;
88
use url::Url;
99

1010
use super::LlmAgent;
11-
use crate::{agents, errors::McpError};
11+
use crate::errors::McpError;
1212

1313
#[derive(Debug, Clone, Deserialize, Serialize)]
1414
pub struct Ollama {

application/apps/indexer/mcp/src/agents/open_ai.rs renamed to application/apps/indexer/mcp/src/client/agents/open_ai.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use ollama_rs::generation::{
55
use serde::{Deserialize, Serialize};
66
use serde_json::Value;
77

8-
use crate::agents::{self, open_ai};
98
use crate::errors::McpError;
109

1110
use super::LlmAgent;
@@ -119,16 +118,16 @@ impl LlmAgent for OpenAI {
119118
.collect::<Vec<ToolInfo>>();
120119
let mut messages = history
121120
.iter()
122-
.map(open_ai::chat_message_to_openai)
121+
.map(chat_message_to_openai)
123122
.collect::<Vec<Value>>();
124-
messages.push(open_ai::chat_message_to_openai(&ChatMessage::user(prompt)));
123+
messages.push(chat_message_to_openai(&ChatMessage::user(prompt)));
125124

126125
let tools = mcp_tools
127126
.iter()
128-
.map(open_ai::fetch_tool_info)
127+
.map(fetch_tool_info)
129128
.collect::<Vec<Value>>();
130129

131-
let request_body = open_ai::OpenAIRequest {
130+
let request_body = OpenAIRequest {
132131
model: "gpt-4.1".to_string(),
133132
messages: messages,
134133
tools: tools,
@@ -158,15 +157,15 @@ impl LlmAgent for OpenAI {
158157
});
159158
}
160159

161-
let openai_response: open_ai::OpenAIResponse =
160+
let openai_response: OpenAIResponse =
162161
response.json().await.map_err(|err| McpError::ChatError {
163162
message: format!("{err:?}"),
164163
})?;
165164

166165
// --- Handle response / tool calls ----------------------------------------
167166
log::warn!("✅ Response ID: {}", openai_response.id);
168167

169-
open_ai::fetch_chat_message(openai_response)
168+
fetch_chat_message(openai_response)
170169
}
171170
}
172171

@@ -181,7 +180,7 @@ pub fn fetch_tool_info(tool: &ToolInfo) -> Value {
181180
})
182181
}
183182

184-
pub fn fetch_chat_message(resp: open_ai::OpenAIResponse) -> Result<ChatMessageResponse, McpError> {
183+
pub fn fetch_chat_message(resp: OpenAIResponse) -> Result<ChatMessageResponse, McpError> {
185184
let choice = resp.choices.into_iter().next().ok_or(McpError::ChatError {
186185
message: "Missing Choices from OpenAI Response".to_string(),
187186
})?;

application/apps/indexer/mcp/src/client/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// pub mod conversation;
22
// pub mod llm;
33

4+
pub mod agents;
5+
46
use log::{error, warn};
57
use ollama_rs::generation::chat::ChatMessage;
68
use rmcp::{
@@ -17,10 +19,10 @@ use tokio::{select, sync::mpsc};
1719

1820
use crate::{
1921
// client::llm::{Llm, LlmClient, LlmConfig},
20-
agents::{self, LlmAgent},
2122
errors::McpError,
2223
types::{Prompt, Response},
2324
};
25+
use agents::LlmAgent;
2426

2527
// TODO:[MCP] store this in a single global location
2628
pub const SERVER_ADDRESS: &str = "http://127.0.0.1:8181/mcp";
@@ -126,6 +128,7 @@ impl McpClient {
126128
let tools = mcp_service.list_tools(Default::default()).await?;
127129
let message = format!("User prompt: {}\n\n session_id:\n{}", prompt.message, prompt.id);
128130

131+
println!("mcp/client/mod.rs => Sending prompt to MCP: {message}");
129132
let response = match std::env::var("LLM_AGENT")
130133
.ok()
131134
.map(|v| v.to_ascii_lowercase())

0 commit comments

Comments
 (0)