atlas-chat 0.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 (250) hide show
  1. atlas/__init__.py +40 -0
  2. atlas/application/__init__.py +7 -0
  3. atlas/application/chat/__init__.py +7 -0
  4. atlas/application/chat/agent/__init__.py +10 -0
  5. atlas/application/chat/agent/act_loop.py +179 -0
  6. atlas/application/chat/agent/factory.py +142 -0
  7. atlas/application/chat/agent/protocols.py +46 -0
  8. atlas/application/chat/agent/react_loop.py +338 -0
  9. atlas/application/chat/agent/think_act_loop.py +171 -0
  10. atlas/application/chat/approval_manager.py +151 -0
  11. atlas/application/chat/elicitation_manager.py +191 -0
  12. atlas/application/chat/events/__init__.py +1 -0
  13. atlas/application/chat/events/agent_event_relay.py +112 -0
  14. atlas/application/chat/modes/__init__.py +1 -0
  15. atlas/application/chat/modes/agent.py +125 -0
  16. atlas/application/chat/modes/plain.py +74 -0
  17. atlas/application/chat/modes/rag.py +81 -0
  18. atlas/application/chat/modes/tools.py +179 -0
  19. atlas/application/chat/orchestrator.py +213 -0
  20. atlas/application/chat/policies/__init__.py +1 -0
  21. atlas/application/chat/policies/tool_authorization.py +99 -0
  22. atlas/application/chat/preprocessors/__init__.py +1 -0
  23. atlas/application/chat/preprocessors/message_builder.py +92 -0
  24. atlas/application/chat/preprocessors/prompt_override_service.py +104 -0
  25. atlas/application/chat/service.py +454 -0
  26. atlas/application/chat/utilities/__init__.py +6 -0
  27. atlas/application/chat/utilities/error_handler.py +367 -0
  28. atlas/application/chat/utilities/event_notifier.py +546 -0
  29. atlas/application/chat/utilities/file_processor.py +613 -0
  30. atlas/application/chat/utilities/tool_executor.py +789 -0
  31. atlas/atlas_chat_cli.py +347 -0
  32. atlas/atlas_client.py +238 -0
  33. atlas/core/__init__.py +0 -0
  34. atlas/core/auth.py +205 -0
  35. atlas/core/authorization_manager.py +27 -0
  36. atlas/core/capabilities.py +123 -0
  37. atlas/core/compliance.py +215 -0
  38. atlas/core/domain_whitelist.py +147 -0
  39. atlas/core/domain_whitelist_middleware.py +82 -0
  40. atlas/core/http_client.py +28 -0
  41. atlas/core/log_sanitizer.py +102 -0
  42. atlas/core/metrics_logger.py +59 -0
  43. atlas/core/middleware.py +131 -0
  44. atlas/core/otel_config.py +242 -0
  45. atlas/core/prompt_risk.py +200 -0
  46. atlas/core/rate_limit.py +0 -0
  47. atlas/core/rate_limit_middleware.py +64 -0
  48. atlas/core/security_headers_middleware.py +51 -0
  49. atlas/domain/__init__.py +37 -0
  50. atlas/domain/chat/__init__.py +1 -0
  51. atlas/domain/chat/dtos.py +85 -0
  52. atlas/domain/errors.py +96 -0
  53. atlas/domain/messages/__init__.py +12 -0
  54. atlas/domain/messages/models.py +160 -0
  55. atlas/domain/rag_mcp_service.py +664 -0
  56. atlas/domain/sessions/__init__.py +7 -0
  57. atlas/domain/sessions/models.py +36 -0
  58. atlas/domain/unified_rag_service.py +371 -0
  59. atlas/infrastructure/__init__.py +10 -0
  60. atlas/infrastructure/app_factory.py +135 -0
  61. atlas/infrastructure/events/__init__.py +1 -0
  62. atlas/infrastructure/events/cli_event_publisher.py +140 -0
  63. atlas/infrastructure/events/websocket_publisher.py +140 -0
  64. atlas/infrastructure/sessions/in_memory_repository.py +56 -0
  65. atlas/infrastructure/transport/__init__.py +7 -0
  66. atlas/infrastructure/transport/websocket_connection_adapter.py +33 -0
  67. atlas/init_cli.py +226 -0
  68. atlas/interfaces/__init__.py +15 -0
  69. atlas/interfaces/events.py +134 -0
  70. atlas/interfaces/llm.py +54 -0
  71. atlas/interfaces/rag.py +40 -0
  72. atlas/interfaces/sessions.py +75 -0
  73. atlas/interfaces/tools.py +57 -0
  74. atlas/interfaces/transport.py +24 -0
  75. atlas/main.py +564 -0
  76. atlas/mcp/api_key_demo/README.md +76 -0
  77. atlas/mcp/api_key_demo/main.py +172 -0
  78. atlas/mcp/api_key_demo/run.sh +56 -0
  79. atlas/mcp/basictable/main.py +147 -0
  80. atlas/mcp/calculator/main.py +149 -0
  81. atlas/mcp/code-executor/execution_engine.py +98 -0
  82. atlas/mcp/code-executor/execution_environment.py +95 -0
  83. atlas/mcp/code-executor/main.py +528 -0
  84. atlas/mcp/code-executor/result_processing.py +276 -0
  85. atlas/mcp/code-executor/script_generation.py +195 -0
  86. atlas/mcp/code-executor/security_checker.py +140 -0
  87. atlas/mcp/corporate_cars/main.py +437 -0
  88. atlas/mcp/csv_reporter/main.py +545 -0
  89. atlas/mcp/duckduckgo/main.py +182 -0
  90. atlas/mcp/elicitation_demo/README.md +171 -0
  91. atlas/mcp/elicitation_demo/main.py +262 -0
  92. atlas/mcp/env-demo/README.md +158 -0
  93. atlas/mcp/env-demo/main.py +199 -0
  94. atlas/mcp/file_size_test/main.py +284 -0
  95. atlas/mcp/filesystem/main.py +348 -0
  96. atlas/mcp/image_demo/main.py +113 -0
  97. atlas/mcp/image_demo/requirements.txt +4 -0
  98. atlas/mcp/logging_demo/README.md +72 -0
  99. atlas/mcp/logging_demo/main.py +103 -0
  100. atlas/mcp/many_tools_demo/main.py +50 -0
  101. atlas/mcp/order_database/__init__.py +0 -0
  102. atlas/mcp/order_database/main.py +369 -0
  103. atlas/mcp/order_database/signal_data.csv +1001 -0
  104. atlas/mcp/pdfbasic/main.py +394 -0
  105. atlas/mcp/pptx_generator/main.py +760 -0
  106. atlas/mcp/pptx_generator/requirements.txt +13 -0
  107. atlas/mcp/pptx_generator/run_test.sh +1 -0
  108. atlas/mcp/pptx_generator/test_pptx_generator_security.py +169 -0
  109. atlas/mcp/progress_demo/main.py +167 -0
  110. atlas/mcp/progress_updates_demo/QUICKSTART.md +273 -0
  111. atlas/mcp/progress_updates_demo/README.md +120 -0
  112. atlas/mcp/progress_updates_demo/main.py +497 -0
  113. atlas/mcp/prompts/main.py +222 -0
  114. atlas/mcp/public_demo/main.py +189 -0
  115. atlas/mcp/sampling_demo/README.md +169 -0
  116. atlas/mcp/sampling_demo/main.py +234 -0
  117. atlas/mcp/thinking/main.py +77 -0
  118. atlas/mcp/tool_planner/main.py +240 -0
  119. atlas/mcp/ui-demo/badmesh.png +0 -0
  120. atlas/mcp/ui-demo/main.py +383 -0
  121. atlas/mcp/ui-demo/templates/button_demo.html +32 -0
  122. atlas/mcp/ui-demo/templates/data_visualization.html +32 -0
  123. atlas/mcp/ui-demo/templates/form_demo.html +28 -0
  124. atlas/mcp/username-override-demo/README.md +320 -0
  125. atlas/mcp/username-override-demo/main.py +308 -0
  126. atlas/modules/__init__.py +0 -0
  127. atlas/modules/config/__init__.py +34 -0
  128. atlas/modules/config/cli.py +231 -0
  129. atlas/modules/config/config_manager.py +1096 -0
  130. atlas/modules/file_storage/__init__.py +22 -0
  131. atlas/modules/file_storage/cli.py +330 -0
  132. atlas/modules/file_storage/content_extractor.py +290 -0
  133. atlas/modules/file_storage/manager.py +295 -0
  134. atlas/modules/file_storage/mock_s3_client.py +402 -0
  135. atlas/modules/file_storage/s3_client.py +417 -0
  136. atlas/modules/llm/__init__.py +19 -0
  137. atlas/modules/llm/caller.py +287 -0
  138. atlas/modules/llm/litellm_caller.py +675 -0
  139. atlas/modules/llm/models.py +19 -0
  140. atlas/modules/mcp_tools/__init__.py +17 -0
  141. atlas/modules/mcp_tools/client.py +2123 -0
  142. atlas/modules/mcp_tools/token_storage.py +556 -0
  143. atlas/modules/prompts/prompt_provider.py +130 -0
  144. atlas/modules/rag/__init__.py +24 -0
  145. atlas/modules/rag/atlas_rag_client.py +336 -0
  146. atlas/modules/rag/client.py +129 -0
  147. atlas/routes/admin_routes.py +865 -0
  148. atlas/routes/config_routes.py +484 -0
  149. atlas/routes/feedback_routes.py +361 -0
  150. atlas/routes/files_routes.py +274 -0
  151. atlas/routes/health_routes.py +40 -0
  152. atlas/routes/mcp_auth_routes.py +223 -0
  153. atlas/server_cli.py +164 -0
  154. atlas/tests/conftest.py +20 -0
  155. atlas/tests/integration/test_mcp_auth_integration.py +152 -0
  156. atlas/tests/manual_test_sampling.py +87 -0
  157. atlas/tests/modules/mcp_tools/test_client_auth.py +226 -0
  158. atlas/tests/modules/mcp_tools/test_client_env.py +191 -0
  159. atlas/tests/test_admin_mcp_server_management_routes.py +141 -0
  160. atlas/tests/test_agent_roa.py +135 -0
  161. atlas/tests/test_app_factory_smoke.py +47 -0
  162. atlas/tests/test_approval_manager.py +439 -0
  163. atlas/tests/test_atlas_client.py +188 -0
  164. atlas/tests/test_atlas_rag_client.py +447 -0
  165. atlas/tests/test_atlas_rag_integration.py +224 -0
  166. atlas/tests/test_attach_file_flow.py +287 -0
  167. atlas/tests/test_auth_utils.py +165 -0
  168. atlas/tests/test_backend_public_url.py +185 -0
  169. atlas/tests/test_banner_logging.py +287 -0
  170. atlas/tests/test_capability_tokens_and_injection.py +203 -0
  171. atlas/tests/test_compliance_level.py +54 -0
  172. atlas/tests/test_compliance_manager.py +253 -0
  173. atlas/tests/test_config_manager.py +617 -0
  174. atlas/tests/test_config_manager_paths.py +12 -0
  175. atlas/tests/test_core_auth.py +18 -0
  176. atlas/tests/test_core_utils.py +190 -0
  177. atlas/tests/test_docker_env_sync.py +202 -0
  178. atlas/tests/test_domain_errors.py +329 -0
  179. atlas/tests/test_domain_whitelist.py +359 -0
  180. atlas/tests/test_elicitation_manager.py +408 -0
  181. atlas/tests/test_elicitation_routing.py +296 -0
  182. atlas/tests/test_env_demo_server.py +88 -0
  183. atlas/tests/test_error_classification.py +113 -0
  184. atlas/tests/test_error_flow_integration.py +116 -0
  185. atlas/tests/test_feedback_routes.py +333 -0
  186. atlas/tests/test_file_content_extraction.py +1134 -0
  187. atlas/tests/test_file_extraction_routes.py +158 -0
  188. atlas/tests/test_file_library.py +107 -0
  189. atlas/tests/test_file_manager_unit.py +18 -0
  190. atlas/tests/test_health_route.py +49 -0
  191. atlas/tests/test_http_client_stub.py +8 -0
  192. atlas/tests/test_imports_smoke.py +30 -0
  193. atlas/tests/test_interfaces_llm_response.py +9 -0
  194. atlas/tests/test_issue_access_denied_fix.py +136 -0
  195. atlas/tests/test_llm_env_expansion.py +836 -0
  196. atlas/tests/test_log_level_sensitive_data.py +285 -0
  197. atlas/tests/test_mcp_auth_routes.py +341 -0
  198. atlas/tests/test_mcp_client_auth.py +331 -0
  199. atlas/tests/test_mcp_data_injection.py +270 -0
  200. atlas/tests/test_mcp_get_authorized_servers.py +95 -0
  201. atlas/tests/test_mcp_hot_reload.py +512 -0
  202. atlas/tests/test_mcp_image_content.py +424 -0
  203. atlas/tests/test_mcp_logging.py +172 -0
  204. atlas/tests/test_mcp_progress_updates.py +313 -0
  205. atlas/tests/test_mcp_prompt_override_system_prompt.py +102 -0
  206. atlas/tests/test_mcp_prompts_server.py +39 -0
  207. atlas/tests/test_mcp_tool_result_parsing.py +296 -0
  208. atlas/tests/test_metrics_logger.py +56 -0
  209. atlas/tests/test_middleware_auth.py +379 -0
  210. atlas/tests/test_prompt_risk_and_acl.py +141 -0
  211. atlas/tests/test_rag_mcp_aggregator.py +204 -0
  212. atlas/tests/test_rag_mcp_service.py +224 -0
  213. atlas/tests/test_rate_limit_middleware.py +45 -0
  214. atlas/tests/test_routes_config_smoke.py +60 -0
  215. atlas/tests/test_routes_files_download_token.py +41 -0
  216. atlas/tests/test_routes_files_health.py +18 -0
  217. atlas/tests/test_runtime_imports.py +53 -0
  218. atlas/tests/test_sampling_integration.py +482 -0
  219. atlas/tests/test_security_admin_routes.py +61 -0
  220. atlas/tests/test_security_capability_tokens.py +65 -0
  221. atlas/tests/test_security_file_stats_scope.py +21 -0
  222. atlas/tests/test_security_header_injection.py +191 -0
  223. atlas/tests/test_security_headers_and_filename.py +63 -0
  224. atlas/tests/test_shared_session_repository.py +101 -0
  225. atlas/tests/test_system_prompt_loading.py +181 -0
  226. atlas/tests/test_token_storage.py +505 -0
  227. atlas/tests/test_tool_approval_config.py +93 -0
  228. atlas/tests/test_tool_approval_utils.py +356 -0
  229. atlas/tests/test_tool_authorization_group_filtering.py +223 -0
  230. atlas/tests/test_tool_details_in_config.py +108 -0
  231. atlas/tests/test_tool_planner.py +300 -0
  232. atlas/tests/test_unified_rag_service.py +398 -0
  233. atlas/tests/test_username_override_in_approval.py +258 -0
  234. atlas/tests/test_websocket_auth_header.py +168 -0
  235. atlas/version.py +6 -0
  236. atlas_chat-0.1.0.data/data/.env.example +253 -0
  237. atlas_chat-0.1.0.data/data/config/defaults/compliance-levels.json +44 -0
  238. atlas_chat-0.1.0.data/data/config/defaults/domain-whitelist.json +123 -0
  239. atlas_chat-0.1.0.data/data/config/defaults/file-extractors.json +74 -0
  240. atlas_chat-0.1.0.data/data/config/defaults/help-config.json +198 -0
  241. atlas_chat-0.1.0.data/data/config/defaults/llmconfig-buggy.yml +11 -0
  242. atlas_chat-0.1.0.data/data/config/defaults/llmconfig.yml +19 -0
  243. atlas_chat-0.1.0.data/data/config/defaults/mcp.json +138 -0
  244. atlas_chat-0.1.0.data/data/config/defaults/rag-sources.json +17 -0
  245. atlas_chat-0.1.0.data/data/config/defaults/splash-config.json +16 -0
  246. atlas_chat-0.1.0.dist-info/METADATA +236 -0
  247. atlas_chat-0.1.0.dist-info/RECORD +250 -0
  248. atlas_chat-0.1.0.dist-info/WHEEL +5 -0
  249. atlas_chat-0.1.0.dist-info/entry_points.txt +4 -0
  250. atlas_chat-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,134 @@
1
+ """Event publisher interface for transport-agnostic UI updates."""
2
+
3
+ from typing import Any, Dict, Protocol
4
+
5
+
6
+ class EventPublisher(Protocol):
7
+ """
8
+ Protocol for publishing events to UI/clients.
9
+
10
+ Provides transport-agnostic interface for sending various update types
11
+ to connected clients (e.g., via WebSocket, SSE, HTTP streaming, etc.).
12
+
13
+ This interface lives in the interfaces layer to avoid circular dependencies
14
+ and keep the application layer decoupled from atlas.infrastructure concerns.
15
+ """
16
+
17
+ async def publish_chat_response(
18
+ self,
19
+ message: str,
20
+ has_pending_tools: bool = False,
21
+ ) -> None:
22
+ """
23
+ Publish a chat response message.
24
+
25
+ Args:
26
+ message: Response text from assistant
27
+ has_pending_tools: Whether tools are still executing
28
+ """
29
+ pass
30
+
31
+ async def publish_response_complete(self) -> None:
32
+ """Signal that the response is complete."""
33
+ pass
34
+
35
+ async def publish_agent_update(
36
+ self,
37
+ update_type: str,
38
+ **kwargs: Any
39
+ ) -> None:
40
+ """
41
+ Publish an agent-specific update.
42
+
43
+ Args:
44
+ update_type: Type of agent update (agent_start, agent_turn_start, etc.)
45
+ **kwargs: Additional data specific to the update type
46
+ """
47
+ pass
48
+
49
+ async def publish_tool_start(
50
+ self,
51
+ tool_name: str,
52
+ **kwargs: Any
53
+ ) -> None:
54
+ """
55
+ Publish notification that a tool is starting.
56
+
57
+ Args:
58
+ tool_name: Name of the tool being executed
59
+ **kwargs: Additional tool execution metadata
60
+ """
61
+ pass
62
+
63
+ async def publish_tool_complete(
64
+ self,
65
+ tool_name: str,
66
+ result: Any,
67
+ **kwargs: Any
68
+ ) -> None:
69
+ """
70
+ Publish notification that a tool has completed.
71
+
72
+ Args:
73
+ tool_name: Name of the tool that completed
74
+ result: Tool execution result
75
+ **kwargs: Additional tool execution metadata
76
+ """
77
+ pass
78
+
79
+ async def publish_files_update(
80
+ self,
81
+ files: Dict[str, Any]
82
+ ) -> None:
83
+ """
84
+ Publish update about session files.
85
+
86
+ Args:
87
+ files: Dictionary of file information
88
+ """
89
+ pass
90
+
91
+ async def publish_canvas_content(
92
+ self,
93
+ content: str,
94
+ content_type: str = "text/html",
95
+ **kwargs: Any
96
+ ) -> None:
97
+ """
98
+ Publish content for canvas display.
99
+
100
+ Args:
101
+ content: Content to display in canvas
102
+ content_type: MIME type of content
103
+ **kwargs: Additional canvas metadata
104
+ """
105
+ pass
106
+
107
+ async def send_json(self, data: Dict[str, Any]) -> None:
108
+ """
109
+ Send raw JSON message.
110
+
111
+ Args:
112
+ data: Dictionary to send as JSON
113
+ """
114
+ pass
115
+
116
+ async def publish_elicitation_request(
117
+ self,
118
+ elicitation_id: str,
119
+ tool_call_id: str,
120
+ tool_name: str,
121
+ message: str,
122
+ response_schema: Dict[str, Any]
123
+ ) -> None:
124
+ """
125
+ Publish an elicitation request to the user.
126
+
127
+ Args:
128
+ elicitation_id: Unique identifier for this elicitation
129
+ tool_call_id: ID of the tool call that requested elicitation
130
+ tool_name: Name of the tool requesting input
131
+ message: Prompt message to display to the user
132
+ response_schema: JSON schema defining expected response structure
133
+ """
134
+ pass
@@ -0,0 +1,54 @@
1
+ """LLM interface protocols."""
2
+
3
+ from typing import Dict, List, Protocol, runtime_checkable
4
+
5
+ from atlas.modules.llm.models import LLMResponse as LLMResponse
6
+
7
+
8
+ @runtime_checkable
9
+ class LLMProtocol(Protocol):
10
+ """Protocol for LLM interactions."""
11
+
12
+ async def call_plain(
13
+ self,
14
+ model_name: str,
15
+ messages: List[Dict[str, str]],
16
+ temperature: float = 0.7,
17
+ ) -> str:
18
+ """Plain LLM call without tools or RAG."""
19
+ ...
20
+
21
+ async def call_with_tools(
22
+ self,
23
+ model_name: str,
24
+ messages: List[Dict[str, str]],
25
+ tools_schema: List[Dict],
26
+ tool_choice: str = "auto",
27
+ temperature: float = 0.7,
28
+ ) -> LLMResponse:
29
+ """LLM call with tool support."""
30
+ ...
31
+
32
+ async def call_with_rag(
33
+ self,
34
+ model_name: str,
35
+ messages: List[Dict[str, str]],
36
+ data_sources: List[str],
37
+ user_email: str,
38
+ temperature: float = 0.7,
39
+ ) -> str:
40
+ """LLM call with RAG integration."""
41
+ ...
42
+
43
+ async def call_with_rag_and_tools(
44
+ self,
45
+ model_name: str,
46
+ messages: List[Dict[str, str]],
47
+ data_sources: List[str],
48
+ tools_schema: List[Dict],
49
+ user_email: str,
50
+ tool_choice: str = "auto",
51
+ temperature: float = 0.7,
52
+ ) -> LLMResponse:
53
+ """LLM call with both RAG and tools."""
54
+ ...
@@ -0,0 +1,40 @@
1
+ """RAG interface protocols."""
2
+
3
+ from typing import Dict, List, Protocol, runtime_checkable
4
+
5
+ from atlas.modules.rag.client import DataSource, RAGResponse
6
+
7
+
8
+ @runtime_checkable
9
+ class RAGClientProtocol(Protocol):
10
+ """Protocol for RAG client implementations.
11
+
12
+ Defines the interface that all RAG clients must implement,
13
+ enabling dependency injection and easier testing.
14
+ """
15
+
16
+ async def discover_data_sources(self, user_name: str) -> List[DataSource]:
17
+ """Discover data sources accessible by a user.
18
+
19
+ Args:
20
+ user_name: The username to discover data sources for.
21
+
22
+ Returns:
23
+ List of DataSource objects the user can access.
24
+ """
25
+ pass
26
+
27
+ async def query_rag(
28
+ self, user_name: str, data_source: str, messages: List[Dict]
29
+ ) -> RAGResponse:
30
+ """Query RAG endpoint for a response with metadata.
31
+
32
+ Args:
33
+ user_name: The username making the query.
34
+ data_source: The data source to query.
35
+ messages: List of message dictionaries with role and content.
36
+
37
+ Returns:
38
+ RAGResponse containing content and optional metadata.
39
+ """
40
+ pass
@@ -0,0 +1,75 @@
1
+ """Session repository interface."""
2
+
3
+ from typing import Optional, Protocol
4
+ from uuid import UUID
5
+
6
+ from atlas.domain.sessions.models import Session
7
+
8
+
9
+ class SessionRepository(Protocol):
10
+ """
11
+ Port for session storage and retrieval.
12
+
13
+ Abstracts session persistence from the application layer,
14
+ allowing different storage implementations (in-memory, Redis, DB, etc.).
15
+ """
16
+
17
+ async def get(self, session_id: UUID) -> Optional[Session]:
18
+ """
19
+ Retrieve a session by ID.
20
+
21
+ Args:
22
+ session_id: Unique session identifier
23
+
24
+ Returns:
25
+ Session if found, None otherwise
26
+ """
27
+ pass
28
+
29
+ async def create(self, session: Session) -> Session:
30
+ """
31
+ Create and store a new session.
32
+
33
+ Args:
34
+ session: Session to create
35
+
36
+ Returns:
37
+ Created session
38
+ """
39
+ pass
40
+
41
+ async def update(self, session: Session) -> Session:
42
+ """
43
+ Update an existing session.
44
+
45
+ Args:
46
+ session: Session to update
47
+
48
+ Returns:
49
+ Updated session
50
+ """
51
+ pass
52
+
53
+ async def delete(self, session_id: UUID) -> bool:
54
+ """
55
+ Delete a session.
56
+
57
+ Args:
58
+ session_id: ID of session to delete
59
+
60
+ Returns:
61
+ True if deleted, False if not found
62
+ """
63
+ pass
64
+
65
+ async def exists(self, session_id: UUID) -> bool:
66
+ """
67
+ Check if a session exists.
68
+
69
+ Args:
70
+ session_id: Session ID to check
71
+
72
+ Returns:
73
+ True if session exists, False otherwise
74
+ """
75
+ pass
@@ -0,0 +1,57 @@
1
+ """Tools interface protocols."""
2
+
3
+ from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
4
+
5
+ from atlas.domain.messages.models import ToolCall, ToolResult
6
+
7
+
8
+ @runtime_checkable
9
+ class ToolProtocol(Protocol):
10
+ """Protocol for individual tools."""
11
+
12
+ @property
13
+ def name(self) -> str:
14
+ """Tool name."""
15
+ ...
16
+
17
+ @property
18
+ def description(self) -> str:
19
+ """Tool description."""
20
+ ...
21
+
22
+ def get_schema(self) -> Dict[str, Any]:
23
+ """Get tool schema for LLM."""
24
+ ...
25
+
26
+ async def execute(self, arguments: Dict[str, Any]) -> ToolResult:
27
+ """Execute the tool with given arguments."""
28
+ ...
29
+
30
+
31
+ @runtime_checkable
32
+ class ToolManagerProtocol(Protocol):
33
+ """Protocol for tool management."""
34
+
35
+ def get_available_tools(self) -> List[str]:
36
+ """Get list of available tool names."""
37
+ ...
38
+
39
+ def get_tools_schema(self, tool_names: List[str]) -> List[Dict[str, Any]]:
40
+ """Get schemas for specified tools."""
41
+ ...
42
+
43
+ async def execute_tool(
44
+ self,
45
+ tool_call: ToolCall,
46
+ context: Optional[Dict[str, Any]] = None
47
+ ) -> ToolResult:
48
+ """Execute a tool call."""
49
+ ...
50
+
51
+ async def execute_tool_calls(
52
+ self,
53
+ tool_calls: List[ToolCall],
54
+ context: Optional[Dict[str, Any]] = None
55
+ ) -> List[ToolResult]:
56
+ """Execute multiple tool calls."""
57
+ ...
@@ -0,0 +1,24 @@
1
+ """Transport interface protocols."""
2
+
3
+ from typing import Any, Dict, Protocol, runtime_checkable
4
+
5
+
6
+ @runtime_checkable
7
+ class ChatConnectionProtocol(Protocol):
8
+ """Protocol for chat connections (WebSocket abstraction)."""
9
+
10
+ async def send_json(self, data: Dict[str, Any]) -> None:
11
+ """Send JSON data to the client."""
12
+ ...
13
+
14
+ async def receive_json(self) -> Dict[str, Any]:
15
+ """Receive JSON data from the client."""
16
+ ...
17
+
18
+ async def accept(self) -> None:
19
+ """Accept the connection."""
20
+ ...
21
+
22
+ async def close(self) -> None:
23
+ """Close the connection."""
24
+ ...