From 040ae57d53ac79cb3b277bb737eb16f52e433ba2 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 31 Oct 2026 06:44:49 +0100 Subject: [PATCH] daemon: a source search is a Search with no mind part (keeps the Handled/Routed sizes clippy already accepted) Co-Authored-By: Claude Sonnet 5.5 --- crates/huginn-daemon/src/daemon.rs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/crates/huginn-daemon/src/daemon.rs b/crates/huginn-daemon/src/daemon.rs index 3b53acc..f04f45d 100644 --- a/crates/huginn-daemon/src/daemon.rs +++ b/crates/huginn-daemon/src/daemon.rs @@ -58,14 +58,9 @@ pub type Hits = Vec<(PipelineRef, f32)>; /// `Daemon::finish` with the index's answer. pub struct Search { pub ticket: SearchTicket, - pending: Pending, -} - -/// What the asker is owed: a ranked page of the mind's documents, or the -/// source index's chunks as the index holds them. -enum Pending { - Mind(Box), - Sources, + /// What the mind owes the asker of a mind search; `None` for a source + /// search, whose answer is the source index's hits as it holds them. + mind: Option, } /// A mind search in flight: the asked selection and query, and the members the @@ -201,7 +196,7 @@ impl> Daemon { return Handled::Answered(HuginnMindResponse::Refused(refusal)); } return match self.index.search_sources(&query) { - Ok(ticket) => Handled::Searching(Search { ticket, pending: Pending::Sources }), + Ok(ticket) => Handled::Searching(Search { ticket, mind: None }), Err(detail) => Handled::Answered(HuginnMindResponse::Refused(MindRefusal::Unavailable { detail })), }; } @@ -228,7 +223,7 @@ impl> Daemon { } let among = members.ids.iter().map(|id| id.id.0.clone()).collect(); match self.index.search(&semantic.text.0, semantic.top_k, among) { - Ok(ticket) => Handled::Searching(Search { ticket, pending: Pending::Mind(Box::new(MindSearch { selection, semantic, members })) }), + Ok(ticket) => Handled::Searching(Search { ticket, mind: Some(MindSearch { selection, semantic, members }) }), Err(detail) => refused(MindRefusal::Unavailable { detail }), } } @@ -256,10 +251,10 @@ impl> Daemon { /// `Unavailable`. Never an empty page in place of a failure. pub fn finish(&mut self, search: Search, found: Found) -> HuginnMindResponse { let unavailable = |detail: String| HuginnMindResponse::Refused(MindRefusal::Unavailable { detail }); - let (selection, semantic, members, hits) = match (search.pending, found) { + let (selection, semantic, members, hits) = match (search.mind, found) { (_, Found::Failed(detail)) => return unavailable(detail), - (Pending::Sources, Found::Sources(hits)) => return HuginnMindResponse::Sources(hits), - (Pending::Mind(asked), Found::Mind(hits)) => (asked.selection, asked.semantic, asked.members, hits), + (None, Found::Sources(hits)) => return HuginnMindResponse::Sources(hits), + (Some(asked), Found::Mind(hits)) => (asked.selection, asked.semantic, asked.members, hits), _ => return unavailable("the index answered another kind of search than the one asked".into()), }; match self.mind.rank(&selection, &semantic, &members, &hits) {