agent_os_kernel 3.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. agent_control_plane/__init__.py +662 -0
  2. agent_control_plane/a2a_adapter.py +543 -0
  3. agent_control_plane/adapter.py +417 -0
  4. agent_control_plane/agent_hibernation.py +394 -0
  5. agent_control_plane/agent_kernel.py +470 -0
  6. agent_control_plane/compliance.py +720 -0
  7. agent_control_plane/constraint_graphs.py +478 -0
  8. agent_control_plane/control_plane.py +854 -0
  9. agent_control_plane/example_executors.py +195 -0
  10. agent_control_plane/execution_engine.py +231 -0
  11. agent_control_plane/flight_recorder.py +846 -0
  12. agent_control_plane/governance_layer.py +435 -0
  13. agent_control_plane/hf_utils.py +563 -0
  14. agent_control_plane/interfaces/__init__.py +55 -0
  15. agent_control_plane/interfaces/kernel_interface.py +361 -0
  16. agent_control_plane/interfaces/plugin_interface.py +497 -0
  17. agent_control_plane/interfaces/protocol_interfaces.py +387 -0
  18. agent_control_plane/kernel_space.py +1009 -0
  19. agent_control_plane/langchain_adapter.py +424 -0
  20. agent_control_plane/lifecycle.py +3113 -0
  21. agent_control_plane/mcp_adapter.py +653 -0
  22. agent_control_plane/ml_safety.py +563 -0
  23. agent_control_plane/multimodal.py +727 -0
  24. agent_control_plane/mute_agent.py +422 -0
  25. agent_control_plane/observability.py +787 -0
  26. agent_control_plane/orchestrator.py +482 -0
  27. agent_control_plane/plugin_registry.py +750 -0
  28. agent_control_plane/policy_engine.py +954 -0
  29. agent_control_plane/process_isolation.py +777 -0
  30. agent_control_plane/shadow_mode.py +310 -0
  31. agent_control_plane/signals.py +493 -0
  32. agent_control_plane/supervisor_agents.py +430 -0
  33. agent_control_plane/time_travel_debugger.py +557 -0
  34. agent_control_plane/tool_registry.py +452 -0
  35. agent_control_plane/vfs.py +697 -0
  36. agent_kernel/__init__.py +69 -0
  37. agent_kernel/analyzer.py +435 -0
  38. agent_kernel/auditor.py +36 -0
  39. agent_kernel/completeness_auditor.py +237 -0
  40. agent_kernel/detector.py +203 -0
  41. agent_kernel/kernel.py +744 -0
  42. agent_kernel/memory_manager.py +85 -0
  43. agent_kernel/models.py +374 -0
  44. agent_kernel/nudge_mechanism.py +263 -0
  45. agent_kernel/outcome_analyzer.py +338 -0
  46. agent_kernel/patcher.py +582 -0
  47. agent_kernel/semantic_analyzer.py +316 -0
  48. agent_kernel/semantic_purge.py +349 -0
  49. agent_kernel/simulator.py +449 -0
  50. agent_kernel/teacher.py +85 -0
  51. agent_kernel/triage.py +152 -0
  52. agent_os/__init__.py +409 -0
  53. agent_os/_adversarial_impl.py +200 -0
  54. agent_os/_circuit_breaker_impl.py +232 -0
  55. agent_os/_mcp_metrics.py +193 -0
  56. agent_os/adversarial.py +20 -0
  57. agent_os/agents_compat.py +490 -0
  58. agent_os/audit_logger.py +135 -0
  59. agent_os/base_agent.py +651 -0
  60. agent_os/circuit_breaker.py +34 -0
  61. agent_os/cli/__init__.py +659 -0
  62. agent_os/cli/cmd_audit.py +128 -0
  63. agent_os/cli/cmd_init.py +152 -0
  64. agent_os/cli/cmd_policy.py +41 -0
  65. agent_os/cli/cmd_policy_gen.py +180 -0
  66. agent_os/cli/cmd_validate.py +258 -0
  67. agent_os/cli/mcp_scan.py +265 -0
  68. agent_os/cli/output.py +192 -0
  69. agent_os/cli/policy_checker.py +330 -0
  70. agent_os/compat.py +74 -0
  71. agent_os/constraint_graph.py +234 -0
  72. agent_os/content_governance.py +140 -0
  73. agent_os/context_budget.py +305 -0
  74. agent_os/credential_redactor.py +224 -0
  75. agent_os/diff_policy.py +89 -0
  76. agent_os/egress_policy.py +159 -0
  77. agent_os/escalation.py +276 -0
  78. agent_os/event_bus.py +124 -0
  79. agent_os/exceptions.py +180 -0
  80. agent_os/execution_context_policy.py +141 -0
  81. agent_os/github_enterprise.py +96 -0
  82. agent_os/health.py +20 -0
  83. agent_os/integrations/__init__.py +279 -0
  84. agent_os/integrations/a2a_adapter.py +279 -0
  85. agent_os/integrations/agent_lightning/__init__.py +30 -0
  86. agent_os/integrations/anthropic_adapter.py +420 -0
  87. agent_os/integrations/autogen_adapter.py +620 -0
  88. agent_os/integrations/base.py +1137 -0
  89. agent_os/integrations/compat.py +229 -0
  90. agent_os/integrations/config.py +98 -0
  91. agent_os/integrations/conversation_guardian.py +957 -0
  92. agent_os/integrations/crewai_adapter.py +467 -0
  93. agent_os/integrations/drift_detector.py +425 -0
  94. agent_os/integrations/dry_run.py +124 -0
  95. agent_os/integrations/escalation.py +582 -0
  96. agent_os/integrations/gemini_adapter.py +364 -0
  97. agent_os/integrations/google_adk_adapter.py +633 -0
  98. agent_os/integrations/guardrails_adapter.py +394 -0
  99. agent_os/integrations/health.py +197 -0
  100. agent_os/integrations/langchain_adapter.py +654 -0
  101. agent_os/integrations/llamafirewall.py +343 -0
  102. agent_os/integrations/llamaindex_adapter.py +188 -0
  103. agent_os/integrations/logging.py +191 -0
  104. agent_os/integrations/maf_adapter.py +631 -0
  105. agent_os/integrations/mistral_adapter.py +365 -0
  106. agent_os/integrations/openai_adapter.py +816 -0
  107. agent_os/integrations/openai_agents_sdk.py +406 -0
  108. agent_os/integrations/policy_compose.py +171 -0
  109. agent_os/integrations/profiling.py +144 -0
  110. agent_os/integrations/pydantic_ai_adapter.py +420 -0
  111. agent_os/integrations/rate_limiter.py +130 -0
  112. agent_os/integrations/rbac.py +143 -0
  113. agent_os/integrations/registry.py +113 -0
  114. agent_os/integrations/scope_guard.py +303 -0
  115. agent_os/integrations/semantic_kernel_adapter.py +769 -0
  116. agent_os/integrations/smolagents_adapter.py +629 -0
  117. agent_os/integrations/templates.py +178 -0
  118. agent_os/integrations/token_budget.py +134 -0
  119. agent_os/integrations/tool_aliases.py +190 -0
  120. agent_os/integrations/webhooks.py +177 -0
  121. agent_os/lite.py +208 -0
  122. agent_os/mcp_gateway.py +385 -0
  123. agent_os/mcp_message_signer.py +273 -0
  124. agent_os/mcp_protocols.py +161 -0
  125. agent_os/mcp_response_scanner.py +232 -0
  126. agent_os/mcp_security.py +924 -0
  127. agent_os/mcp_session_auth.py +231 -0
  128. agent_os/mcp_sliding_rate_limiter.py +184 -0
  129. agent_os/memory_guard.py +409 -0
  130. agent_os/metrics.py +134 -0
  131. agent_os/mute.py +428 -0
  132. agent_os/mute_agent.py +209 -0
  133. agent_os/policies/__init__.py +77 -0
  134. agent_os/policies/async_evaluator.py +275 -0
  135. agent_os/policies/backends.py +670 -0
  136. agent_os/policies/bridge.py +169 -0
  137. agent_os/policies/budget.py +85 -0
  138. agent_os/policies/cli.py +294 -0
  139. agent_os/policies/conflict_resolution.py +270 -0
  140. agent_os/policies/data_classification.py +252 -0
  141. agent_os/policies/evaluator.py +239 -0
  142. agent_os/policies/policy_schema.json +228 -0
  143. agent_os/policies/rate_limiting.py +145 -0
  144. agent_os/policies/schema.py +115 -0
  145. agent_os/policies/shared.py +331 -0
  146. agent_os/prompt_injection.py +694 -0
  147. agent_os/providers.py +182 -0
  148. agent_os/py.typed +0 -0
  149. agent_os/retry.py +81 -0
  150. agent_os/reversibility.py +251 -0
  151. agent_os/sandbox.py +432 -0
  152. agent_os/sandbox_provider.py +140 -0
  153. agent_os/secure_codegen.py +525 -0
  154. agent_os/security_skills.py +538 -0
  155. agent_os/semantic_policy.py +422 -0
  156. agent_os/server/__init__.py +15 -0
  157. agent_os/server/__main__.py +25 -0
  158. agent_os/server/app.py +277 -0
  159. agent_os/server/models.py +104 -0
  160. agent_os/shift_left_metrics.py +130 -0
  161. agent_os/stateless.py +742 -0
  162. agent_os/supervisor.py +148 -0
  163. agent_os/task_outcome.py +148 -0
  164. agent_os/transparency.py +181 -0
  165. agent_os/trust_root.py +128 -0
  166. agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
  167. agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
  168. agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
  169. agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
  170. agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
  171. agent_os_observability/__init__.py +27 -0
  172. agent_os_observability/dashboards.py +898 -0
  173. agent_os_observability/metrics.py +398 -0
  174. agent_os_observability/server.py +223 -0
  175. agent_os_observability/tracer.py +232 -0
  176. agent_primitives/__init__.py +24 -0
  177. agent_primitives/failures.py +84 -0
  178. agent_primitives/py.typed +0 -0
  179. amb_core/__init__.py +177 -0
  180. amb_core/adapters/__init__.py +57 -0
  181. amb_core/adapters/aws_sqs_broker.py +376 -0
  182. amb_core/adapters/azure_servicebus_broker.py +340 -0
  183. amb_core/adapters/kafka_broker.py +260 -0
  184. amb_core/adapters/nats_broker.py +285 -0
  185. amb_core/adapters/rabbitmq_broker.py +235 -0
  186. amb_core/adapters/redis_broker.py +262 -0
  187. amb_core/broker.py +145 -0
  188. amb_core/bus.py +481 -0
  189. amb_core/cloudevents.py +509 -0
  190. amb_core/dlq.py +345 -0
  191. amb_core/hf_utils.py +536 -0
  192. amb_core/memory_broker.py +410 -0
  193. amb_core/models.py +141 -0
  194. amb_core/persistence.py +529 -0
  195. amb_core/schema.py +294 -0
  196. amb_core/tracing.py +358 -0
  197. atr/__init__.py +640 -0
  198. atr/access.py +348 -0
  199. atr/composition.py +645 -0
  200. atr/decorator.py +357 -0
  201. atr/executor.py +384 -0
  202. atr/health.py +557 -0
  203. atr/hf_utils.py +449 -0
  204. atr/injection.py +422 -0
  205. atr/metrics.py +440 -0
  206. atr/policies.py +403 -0
  207. atr/py.typed +2 -0
  208. atr/registry.py +452 -0
  209. atr/schema.py +480 -0
  210. atr/tools/safe/__init__.py +75 -0
  211. atr/tools/safe/calculator.py +467 -0
  212. atr/tools/safe/datetime_tool.py +443 -0
  213. atr/tools/safe/file_reader.py +402 -0
  214. atr/tools/safe/http_client.py +316 -0
  215. atr/tools/safe/json_parser.py +374 -0
  216. atr/tools/safe/text_tool.py +537 -0
  217. atr/tools/safe/toolkit.py +175 -0
  218. caas/__init__.py +162 -0
  219. caas/api/__init__.py +7 -0
  220. caas/api/server.py +1328 -0
  221. caas/caching.py +834 -0
  222. caas/cli.py +210 -0
  223. caas/conversation.py +223 -0
  224. caas/decay.py +72 -0
  225. caas/detection/__init__.py +9 -0
  226. caas/detection/detector.py +238 -0
  227. caas/enrichment.py +130 -0
  228. caas/gateway/__init__.py +27 -0
  229. caas/gateway/trust_gateway.py +474 -0
  230. caas/hf_utils.py +479 -0
  231. caas/ingestion/__init__.py +23 -0
  232. caas/ingestion/processors.py +253 -0
  233. caas/ingestion/structure_parser.py +188 -0
  234. caas/models.py +356 -0
  235. caas/pragmatic_truth.py +444 -0
  236. caas/routing/__init__.py +10 -0
  237. caas/routing/heuristic_router.py +58 -0
  238. caas/storage/__init__.py +9 -0
  239. caas/storage/store.py +389 -0
  240. caas/triad.py +213 -0
  241. caas/tuning/__init__.py +9 -0
  242. caas/tuning/tuner.py +329 -0
  243. caas/vfs/__init__.py +14 -0
  244. caas/vfs/filesystem.py +452 -0
  245. cmvk/__init__.py +218 -0
  246. cmvk/audit.py +402 -0
  247. cmvk/benchmarks.py +478 -0
  248. cmvk/constitutional.py +904 -0
  249. cmvk/hf_utils.py +301 -0
  250. cmvk/metrics.py +473 -0
  251. cmvk/profiles.py +300 -0
  252. cmvk/py.typed +0 -0
  253. cmvk/types.py +12 -0
  254. cmvk/verification.py +956 -0
  255. emk/__init__.py +89 -0
  256. emk/causal.py +352 -0
  257. emk/hf_utils.py +421 -0
  258. emk/indexer.py +83 -0
  259. emk/py.typed +0 -0
  260. emk/schema.py +204 -0
  261. emk/sleep_cycle.py +347 -0
  262. emk/store.py +281 -0
  263. iatp/__init__.py +166 -0
  264. iatp/attestation.py +461 -0
  265. iatp/cli.py +317 -0
  266. iatp/hf_utils.py +472 -0
  267. iatp/ipc_pipes.py +580 -0
  268. iatp/main.py +412 -0
  269. iatp/models/__init__.py +447 -0
  270. iatp/policy_engine.py +337 -0
  271. iatp/py.typed +2 -0
  272. iatp/recovery.py +321 -0
  273. iatp/security/__init__.py +270 -0
  274. iatp/sidecar/__init__.py +519 -0
  275. iatp/telemetry/__init__.py +164 -0
  276. iatp/tests/__init__.py +1 -0
  277. iatp/tests/test_attestation.py +370 -0
  278. iatp/tests/test_cli.py +131 -0
  279. iatp/tests/test_ed25519_attestation.py +211 -0
  280. iatp/tests/test_models.py +130 -0
  281. iatp/tests/test_policy_engine.py +347 -0
  282. iatp/tests/test_recovery.py +281 -0
  283. iatp/tests/test_security.py +222 -0
  284. iatp/tests/test_sidecar.py +167 -0
  285. iatp/tests/test_telemetry.py +175 -0
  286. mcp_kernel_server/__init__.py +28 -0
  287. mcp_kernel_server/cli.py +274 -0
  288. mcp_kernel_server/resources.py +217 -0
  289. mcp_kernel_server/server.py +564 -0
  290. mcp_kernel_server/tools.py +1174 -0
  291. mute_agent/__init__.py +68 -0
  292. mute_agent/core/__init__.py +1 -0
  293. mute_agent/core/execution_agent.py +166 -0
  294. mute_agent/core/handshake_protocol.py +201 -0
  295. mute_agent/core/reasoning_agent.py +238 -0
  296. mute_agent/knowledge_graph/__init__.py +1 -0
  297. mute_agent/knowledge_graph/graph_elements.py +65 -0
  298. mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
  299. mute_agent/knowledge_graph/subgraph.py +224 -0
  300. mute_agent/listener/__init__.py +43 -0
  301. mute_agent/listener/adapters/__init__.py +31 -0
  302. mute_agent/listener/adapters/base_adapter.py +189 -0
  303. mute_agent/listener/adapters/caas_adapter.py +344 -0
  304. mute_agent/listener/adapters/control_plane_adapter.py +436 -0
  305. mute_agent/listener/adapters/iatp_adapter.py +332 -0
  306. mute_agent/listener/adapters/scak_adapter.py +251 -0
  307. mute_agent/listener/listener.py +610 -0
  308. mute_agent/listener/state_observer.py +436 -0
  309. mute_agent/listener/threshold_config.py +313 -0
  310. mute_agent/super_system/__init__.py +1 -0
  311. mute_agent/super_system/router.py +204 -0
  312. mute_agent/visualization/__init__.py +10 -0
  313. mute_agent/visualization/graph_debugger.py +502 -0
  314. nexus/README.md +60 -0
  315. nexus/__init__.py +51 -0
  316. nexus/arbiter.py +359 -0
  317. nexus/client.py +466 -0
  318. nexus/dmz.py +444 -0
  319. nexus/escrow.py +430 -0
  320. nexus/exceptions.py +286 -0
  321. nexus/pyproject.toml +36 -0
  322. nexus/registry.py +393 -0
  323. nexus/reputation.py +425 -0
  324. nexus/schemas/__init__.py +51 -0
  325. nexus/schemas/compliance.py +276 -0
  326. nexus/schemas/escrow.py +251 -0
  327. nexus/schemas/manifest.py +225 -0
  328. nexus/schemas/receipt.py +208 -0
  329. nexus/tests/__init__.py +0 -0
  330. nexus/tests/conftest.py +146 -0
  331. nexus/tests/test_arbiter.py +192 -0
  332. nexus/tests/test_dmz.py +194 -0
  333. nexus/tests/test_escrow.py +276 -0
  334. nexus/tests/test_exceptions.py +225 -0
  335. nexus/tests/test_registry.py +232 -0
  336. nexus/tests/test_reputation.py +328 -0
  337. nexus/tests/test_schemas.py +295 -0
atr/decorator.py ADDED
@@ -0,0 +1,357 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Decorator for registering tools in the Agent Tool Registry.
5
+
6
+ Provides @atr.register() decorator to turn Python functions into discoverable tools.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import asyncio
12
+ import inspect
13
+ from typing import (
14
+ TYPE_CHECKING,
15
+ Any,
16
+ Callable,
17
+ List,
18
+ Optional,
19
+ Union,
20
+ get_args,
21
+ get_origin,
22
+ get_type_hints,
23
+ )
24
+
25
+ from .registry import Registry
26
+ from .schema import (
27
+ CostLevel,
28
+ ParameterSpec,
29
+ ParameterType,
30
+ SideEffect,
31
+ ToolMetadata,
32
+ ToolSpec,
33
+ )
34
+
35
+ if TYPE_CHECKING:
36
+ pass
37
+
38
+
39
+ def _python_type_to_parameter_type(python_type: Any) -> ParameterType:
40
+ """Convert Python type annotation to ParameterType.
41
+
42
+ Args:
43
+ python_type: Python type annotation
44
+
45
+ Returns:
46
+ Corresponding ParameterType
47
+ """
48
+ # Handle None type
49
+ if python_type is type(None):
50
+ return ParameterType.STRING
51
+
52
+ # Get the origin to check for generic types
53
+ origin = get_origin(python_type)
54
+
55
+ # Only unwrap Optional/Union types - don't unwrap List, Dict, etc.
56
+ # Check if it's a Union (which includes Optional)
57
+ if origin is Union:
58
+ args = get_args(python_type)
59
+ if args:
60
+ # For Optional[X] or Union[X, None], get X
61
+ non_none_types = [arg for arg in args if arg is not type(None)]
62
+ if non_none_types:
63
+ # Use the first non-None type and recurse
64
+ return _python_type_to_parameter_type(non_none_types[0])
65
+
66
+ # Now check the origin for generic types like List[str], Dict[str, int]
67
+ if origin is list:
68
+ return ParameterType.ARRAY
69
+ elif origin is dict:
70
+ return ParameterType.OBJECT
71
+
72
+ # Map basic Python types to ParameterType
73
+ if python_type == str:
74
+ return ParameterType.STRING
75
+ elif python_type == int:
76
+ return ParameterType.INTEGER
77
+ elif python_type == float:
78
+ return ParameterType.NUMBER
79
+ elif python_type == bool:
80
+ return ParameterType.BOOLEAN
81
+ elif python_type == list:
82
+ return ParameterType.ARRAY
83
+ elif python_type == dict:
84
+ return ParameterType.OBJECT
85
+ else:
86
+ # Default to string for unknown types
87
+ return ParameterType.STRING
88
+
89
+
90
+ def _extract_parameters_from_function(func: Callable) -> List[ParameterSpec]:
91
+ """Extract parameter specifications from function signature.
92
+
93
+ Args:
94
+ func: The function to analyze
95
+
96
+ Returns:
97
+ List of ParameterSpec objects
98
+
99
+ Raises:
100
+ ValueError: If function has parameters without type hints
101
+ """
102
+ sig = inspect.signature(func)
103
+ type_hints = get_type_hints(func)
104
+ parameters = []
105
+
106
+ for param_name, param in sig.parameters.items():
107
+ # Skip self/cls parameters
108
+ if param_name in ("self", "cls"):
109
+ continue
110
+
111
+ # Require type hints - no magic arguments!
112
+ if param_name not in type_hints:
113
+ raise ValueError(
114
+ f"Parameter '{param_name}' in function '{func.__name__}' must have a type hint. "
115
+ "No magic arguments allowed!"
116
+ )
117
+
118
+ python_type = type_hints[param_name]
119
+ param_type = _python_type_to_parameter_type(python_type)
120
+
121
+ # Determine if required (has no default value)
122
+ required = param.default == inspect.Parameter.empty
123
+ default = None if required else param.default
124
+
125
+ # Extract description from docstring if available
126
+ description = f"Parameter {param_name}"
127
+ docstring = inspect.getdoc(func)
128
+ if docstring:
129
+ # Simple extraction - look for "param_name: description" pattern
130
+ for line in docstring.split("\n"):
131
+ if param_name in line and ":" in line:
132
+ parts = line.split(":", 1)
133
+ if len(parts) == 2:
134
+ description = parts[1].strip()
135
+ break
136
+
137
+ param_spec = ParameterSpec(
138
+ name=param_name,
139
+ type=param_type,
140
+ description=description,
141
+ required=required,
142
+ default=default,
143
+ )
144
+ parameters.append(param_spec)
145
+
146
+ return parameters
147
+
148
+
149
+ def _extract_return_spec_from_function(func: Callable) -> Optional[ParameterSpec]:
150
+ """Extract return value specification from function.
151
+
152
+ Args:
153
+ func: The function to analyze
154
+
155
+ Returns:
156
+ ParameterSpec for return value, or None if no return type
157
+ """
158
+ type_hints = get_type_hints(func)
159
+
160
+ if "return" not in type_hints or type_hints["return"] == type(None):
161
+ return None
162
+
163
+ return_type = type_hints["return"]
164
+ param_type = _python_type_to_parameter_type(return_type)
165
+
166
+ return ParameterSpec(
167
+ name="return_value",
168
+ type=param_type,
169
+ description="Function return value",
170
+ required=True,
171
+ )
172
+
173
+
174
+ class register:
175
+ """Decorator to register a function as a tool in the ATR.
176
+
177
+ Usage:
178
+ @atr.register(name="scraper", cost="low", tags=["web", "scraping"])
179
+ def scrape_website(url: str, timeout: int = 30) -> str:
180
+ '''Scrape content from a website.
181
+
182
+ Args:
183
+ url: The URL to scrape
184
+ timeout: Timeout in seconds
185
+ '''
186
+ # Implementation here
187
+ pass
188
+
189
+ Advanced usage with all features:
190
+ @atr.register(
191
+ name="pdf_parser",
192
+ version="1.0.0",
193
+ async_=True,
194
+ rate_limit="10/minute",
195
+ permissions=["claims-agent"],
196
+ retry_policy=RetryPolicy(max_attempts=3, backoff="exponential"),
197
+ tags=["document", "parsing"]
198
+ )
199
+ async def pdf_parser(file_path: str, config: Config = inject()) -> dict:
200
+ '''Parse a PDF document.'''
201
+ ...
202
+
203
+ This decorator:
204
+ 1. Extracts function signature and converts to ToolSpec
205
+ 2. Validates all parameters have type hints (no magic arguments!)
206
+ 3. Registers the tool in the global registry
207
+ 4. Returns the original function unchanged (doesn't wrap it)
208
+ """
209
+
210
+ def __init__(
211
+ self,
212
+ name: Optional[str] = None,
213
+ description: Optional[str] = None,
214
+ version: str = "1.0.0",
215
+ author: Optional[str] = None,
216
+ cost: str = "free",
217
+ side_effects: Optional[List[str]] = None,
218
+ tags: Optional[List[str]] = None,
219
+ registry: Optional[Registry] = None,
220
+ # New parameters for enhanced features
221
+ async_: Optional[bool] = None, # Auto-detected if None
222
+ permissions: Optional[List[str]] = None,
223
+ rate_limit: Optional[str] = None,
224
+ retry_policy: Optional[Any] = None, # RetryPolicy
225
+ health_check: Optional[Any] = None, # HealthCheck
226
+ access_policy: Optional[Any] = None, # AccessPolicy
227
+ deprecated: bool = False,
228
+ deprecated_message: Optional[str] = None,
229
+ ):
230
+ """Initialize the register decorator.
231
+
232
+ Args:
233
+ name: Tool name (defaults to function name)
234
+ description: Tool description (defaults to function docstring)
235
+ version: Semantic version string (e.g., "1.0.0")
236
+ author: Tool author
237
+ cost: Cost level (free, low, medium, high)
238
+ side_effects: List of side effects
239
+ tags: Searchable tags
240
+ registry: Registry instance (uses global if not provided)
241
+ async_: Whether tool is async (auto-detected if None)
242
+ permissions: List of roles/agents allowed to access this tool
243
+ rate_limit: Rate limit string (e.g., "10/minute", "100/hour")
244
+ retry_policy: RetryPolicy instance for automatic retries
245
+ health_check: HealthCheck instance for verifying tool availability
246
+ access_policy: AccessPolicy instance for fine-grained access control
247
+ deprecated: Whether this version is deprecated
248
+ deprecated_message: Migration guide for deprecated tools
249
+ """
250
+ self.name = name
251
+ self.description = description
252
+ self.version = version
253
+ self.author = author
254
+ self.cost = cost
255
+ self.side_effects = side_effects or ["none"]
256
+ self.tags = tags or []
257
+ self.registry = registry
258
+ self.async_ = async_
259
+ self.permissions = permissions or []
260
+ self.rate_limit = rate_limit
261
+ self.retry_policy = retry_policy
262
+ self.health_check = health_check
263
+ self.access_policy = access_policy
264
+ self.deprecated = deprecated
265
+ self.deprecated_message = deprecated_message
266
+
267
+ def __call__(self, func: Callable) -> Callable:
268
+ """Register the function and return it unchanged.
269
+
270
+ Args:
271
+ func: The function to register
272
+
273
+ Returns:
274
+ The original function (not wrapped)
275
+ """
276
+ # Get or import global registry
277
+ if self.registry is None:
278
+ from . import _global_registry
279
+
280
+ self.registry = _global_registry
281
+
282
+ # Extract metadata
283
+ tool_name = self.name or func.__name__
284
+ tool_description = self.description or inspect.getdoc(func) or f"Tool: {tool_name}"
285
+
286
+ # Auto-detect async
287
+ is_async = self.async_ if self.async_ is not None else asyncio.iscoroutinefunction(func)
288
+
289
+ # Parse cost level
290
+ try:
291
+ cost_level = CostLevel(self.cost.lower())
292
+ except ValueError:
293
+ cost_level = CostLevel.FREE
294
+
295
+ # Parse side effects
296
+ parsed_side_effects = []
297
+ for se in self.side_effects:
298
+ try:
299
+ parsed_side_effects.append(SideEffect(se.lower()))
300
+ except ValueError:
301
+ parsed_side_effects.append(SideEffect.NONE)
302
+
303
+ # Create metadata
304
+ metadata = ToolMetadata(
305
+ name=tool_name,
306
+ description=tool_description,
307
+ version=self.version,
308
+ author=self.author,
309
+ cost=cost_level,
310
+ side_effects=parsed_side_effects,
311
+ tags=self.tags,
312
+ is_async=is_async,
313
+ permissions=self.permissions,
314
+ rate_limit=self.rate_limit,
315
+ deprecated=self.deprecated,
316
+ deprecated_message=self.deprecated_message,
317
+ )
318
+
319
+ # Extract parameters from function signature
320
+ parameters = _extract_parameters_from_function(func)
321
+
322
+ # Extract return specification
323
+ returns = _extract_return_spec_from_function(func)
324
+
325
+ # Create tool spec
326
+ tool_spec = ToolSpec(
327
+ metadata=metadata,
328
+ parameters=parameters,
329
+ returns=returns,
330
+ )
331
+
332
+ # Apply policies
333
+ if self.retry_policy is not None:
334
+ tool_spec._retry_policy = self.retry_policy
335
+
336
+ if self.rate_limit is not None:
337
+ from .policies import RateLimitPolicy
338
+
339
+ tool_spec._rate_limit_policy = RateLimitPolicy.from_string(self.rate_limit)
340
+
341
+ if self.health_check is not None:
342
+ tool_spec._health_check = self.health_check
343
+
344
+ if self.access_policy is not None:
345
+ tool_spec._access_policy = self.access_policy
346
+ elif self.permissions:
347
+ # Create access policy from permissions list
348
+ from .access import AccessPolicy
349
+
350
+ tool_spec._access_policy = AccessPolicy.roles_only(*self.permissions)
351
+
352
+ # Register the tool (store the callable but don't execute it)
353
+ self.registry.register_tool(tool_spec, callable_func=func)
354
+
355
+ # Return the original function unchanged - we don't wrap it
356
+ # The registry stores it, but execution happens elsewhere
357
+ return func