ceylon_runtime/core/
agent.rs

1use crate::core::error::Result;
2use crate::core::message::Message;
3use crate::core::request_queue::RequestQueue;
4use async_trait::async_trait;
5use std::sync::Arc;
6
7#[async_trait]
8pub trait Agent: Send + Sync {
9    fn name(&self) -> String;
10    async fn on_start(&mut self, _ctx: &mut AgentContext) -> Result<()> {
11        Ok(())
12    }
13    async fn on_message(&mut self, _msg: Message, _ctx: &mut AgentContext) -> Result<()> {
14        // Default implementation does nothing
15        Ok(())
16    }
17
18    /// Handle a generic string message and return a generic response.
19    /// Default implementation returns an echo response.
20    async fn on_generic_message(
21        &mut self,
22        msg: crate::core::message::GenericMessage,
23        _ctx: &mut AgentContext,
24    ) -> Result<crate::core::message::GenericResponse> {
25        // Simple default: echo the content back
26        Ok(crate::core::message::GenericResponse::new(msg.content))
27    }
28    async fn on_stop(&mut self, _ctx: &mut AgentContext) -> Result<()> {
29        Ok(())
30    }
31
32    /// Get the tool invoker for this agent (if it has actions)
33    fn tool_invoker(&self) -> Option<&crate::core::action::ToolInvoker> {
34        None // Default: no actions
35    }
36
37    /// Get mutable tool invoker for registration
38    fn tool_invoker_mut(&mut self) -> Option<&mut crate::core::action::ToolInvoker> {
39        None
40    }
41}
42
43pub struct AgentContext {
44    pub mesh_name: String,
45    request_queue: Option<Arc<RequestQueue>>,
46}
47
48impl AgentContext {
49    /// Create context without request queue (for standalone use)
50    pub fn new(mesh_name: String, request_queue: Option<Arc<RequestQueue>>) -> Self {
51        Self {
52            mesh_name,
53            request_queue,
54        }
55    }
56
57    /// Report a result for a request (used by agents to send responses back)
58    pub fn report_result(&self, request_id: &str, response: String) {
59        if let Some(queue) = &self.request_queue {
60            queue.complete(request_id, response);
61        }
62    }
63
64    /// Check if this context has a request queue
65    pub fn has_request_queue(&self) -> bool {
66        self.request_queue.is_some()
67    }
68}