use std::sync::Arc; use crate::ApprovalInterceptorContributor; use crate::ContextContributor; use crate::ThreadStartContributor; use crate::ToolContributor; use crate::TurnItemContributor; /// Mutable registry used while hosts register typed runtime contributions. pub struct ExtensionRegistryBuilder { thread_start_contributors: Vec>>, context_contributors: Vec>, tool_contributors: Vec>, turn_item_contributors: Vec>, approval_interceptor_contributors: Vec>, } impl Default for ExtensionRegistryBuilder { fn default() -> Self { Self { thread_start_contributors: Vec::new(), approval_interceptor_contributors: Vec::new(), context_contributors: Vec::new(), tool_contributors: Vec::new(), turn_item_contributors: Vec::new(), } } } impl ExtensionRegistryBuilder { /// Creates an empty registry builder. pub fn new() -> Self { Self::default() } /// Registers one approval interceptor contributor. pub fn approval_interceptor_contributor( &mut self, contributor: Arc, ) { self.approval_interceptor_contributors.push(contributor); } /// Registers one thread-start contributor. pub fn thread_start_contributor(&mut self, contributor: Arc>) { self.thread_start_contributors.push(contributor); } /// Registers one prompt contributor. pub fn prompt_contributor(&mut self, contributor: Arc) { self.context_contributors.push(contributor); } /// Registers one native tool contributor. pub fn tool_contributor(&mut self, contributor: Arc) { self.tool_contributors.push(contributor); } /// Registers one ordered turn-item contributor. pub fn turn_item_contributor(&mut self, contributor: Arc) { self.turn_item_contributors.push(contributor); } /// Finishes construction and returns the immutable registry. pub fn build(self) -> ExtensionRegistry { ExtensionRegistry { thread_start_contributors: self.thread_start_contributors, approval_interceptor_contributors: self.approval_interceptor_contributors, context_contributors: self.context_contributors, tool_contributors: self.tool_contributors, turn_item_contributors: self.turn_item_contributors, } } } /// Immutable typed registry produced after extensions are installed. pub struct ExtensionRegistry { thread_start_contributors: Vec>>, context_contributors: Vec>, tool_contributors: Vec>, turn_item_contributors: Vec>, approval_interceptor_contributors: Vec>, } impl ExtensionRegistry { /// Returns the registered thread-start contributors. pub fn thread_start_contributors(&self) -> &[Arc>] { &self.thread_start_contributors } /// Returns the registered approval interceptor contributors. pub fn approval_interceptor_contributors(&self) -> &[Arc] { &self.approval_interceptor_contributors } /// Returns the registered prompt contributors. pub fn context_contributors(&self) -> &[Arc] { &self.context_contributors } /// Returns the registered native tool contributors. pub fn tool_contributors(&self) -> &[Arc] { &self.tool_contributors } /// Returns the registered ordered turn-item contributors. pub fn turn_item_contributors(&self) -> &[Arc] { &self.turn_item_contributors } } /// Creates an empty shared registry for hosts that do not register contributions. pub fn empty_extension_registry() -> Arc> { Arc::new(ExtensionRegistryBuilder::new().build()) }