1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//! AgentTool - wraps a Callable as a Tool (agent-as-tool pattern)
//!
//! ⚠️ **SECURITY WARNING: PRIVILEGED ADAPTER**
//!
//! `AgentTool` is **NOT** a general-purpose adapter. It is a **privileged** component
//! that must only be constructed by **trusted runtime components**.
//!
//! ## Why This Is Dangerous
//!
//! `AgentTool` allows exposing a `Callable` (which may be an agent, graph, or other
//! complex execution unit) as a `Tool`. This creates a powerful capability:
//!
//! - **Callable** = execution (agents, graphs, complex workflows)
//! - **Tool** = capability (side-effect functions for LLMs to invoke)
//!
//! Wrapping a Callable as a Tool means an LLM can invoke agents/graphs as tools,
//! creating recursive agent execution patterns. This is powerful but **dangerous**
//! if exposed to untrusted contexts.
//!
//! ## Security Invariant
//!
//! **AgentTool may only be constructed by trusted runtime components.**
//!
//! This means:
//! - ✅ **Allowed**: Kernel, runner, or other trusted execution components
//! - ❌ **Forbidden**: User-provided code, untrusted plugins, dynamic tool registries
//!
//! ## Why This Matters
//!
//! If `AgentTool` is exposed to untrusted contexts:
//! - Malicious users could expose arbitrary agents as tools
//! - Untrusted code could create recursive agent loops
//! - Policy boundaries could be bypassed
//! - Quota limits could be circumvented
//!
//! ## Usage Pattern
//!
//! ```rust,ignore
//! // ✅ CORRECT: Created by trusted runtime component
//! // In kernel or runner, with proper policy checks
//! let agent = Arc::new(LlmCallable::new(...));
//! let agent_tool = AgentTool::new(agent, "agent_name", "Agent description");
//!
//! // ❌ WRONG: Created from user input or untrusted source
//! // let agent_tool = AgentTool::from_user_input(...); // DON'T DO THIS!
//! ```
//!
//! ## Policy Enforcement
//!
//! Even when created by trusted components, `AgentTool` instances must still:
//! - Go through `ToolExecutor` for execution (policy enforcement)
//! - Respect `ToolPolicy` trust levels
//! - Be subject to quota limits
//! - Follow the same security boundaries as any other tool
//!
//! The privilege is in **construction**, not in **execution**.
use Tool;
use crateDynCallable;
use async_trait;
use ;
/// AgentTool - wraps a Callable as a Tool
///
/// ⚠️ **PRIVILEGED**: This adapter may only be constructed by trusted runtime components.
/// See module-level documentation for security implications.
///
/// This allows exposing agents, graphs, or other Callables as tools that can be
/// invoked by LLMs. The Callable's `run()` method is invoked with the tool's
/// JSON arguments serialized as a string.