agentpool 2.2.3__py3-none-any.whl → 2.5.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. acp/__init__.py +0 -4
  2. acp/acp_requests.py +20 -77
  3. acp/agent/connection.py +8 -0
  4. acp/agent/implementations/debug_server/debug_server.py +6 -2
  5. acp/agent/protocol.py +6 -0
  6. acp/client/connection.py +38 -29
  7. acp/client/implementations/default_client.py +3 -2
  8. acp/client/implementations/headless_client.py +2 -2
  9. acp/connection.py +2 -2
  10. acp/notifications.py +18 -49
  11. acp/schema/__init__.py +2 -0
  12. acp/schema/agent_responses.py +21 -0
  13. acp/schema/client_requests.py +3 -3
  14. acp/schema/session_state.py +63 -29
  15. acp/task/supervisor.py +2 -2
  16. acp/utils.py +2 -2
  17. agentpool/__init__.py +2 -0
  18. agentpool/agents/acp_agent/acp_agent.py +278 -263
  19. agentpool/agents/acp_agent/acp_converters.py +150 -17
  20. agentpool/agents/acp_agent/client_handler.py +35 -24
  21. agentpool/agents/acp_agent/session_state.py +14 -6
  22. agentpool/agents/agent.py +471 -643
  23. agentpool/agents/agui_agent/agui_agent.py +104 -107
  24. agentpool/agents/agui_agent/helpers.py +3 -4
  25. agentpool/agents/base_agent.py +485 -32
  26. agentpool/agents/claude_code_agent/FORKING.md +191 -0
  27. agentpool/agents/claude_code_agent/__init__.py +13 -1
  28. agentpool/agents/claude_code_agent/claude_code_agent.py +654 -334
  29. agentpool/agents/claude_code_agent/converters.py +4 -141
  30. agentpool/agents/claude_code_agent/models.py +77 -0
  31. agentpool/agents/claude_code_agent/static_info.py +100 -0
  32. agentpool/agents/claude_code_agent/usage.py +242 -0
  33. agentpool/agents/events/__init__.py +22 -0
  34. agentpool/agents/events/builtin_handlers.py +65 -0
  35. agentpool/agents/events/event_emitter.py +3 -0
  36. agentpool/agents/events/events.py +84 -3
  37. agentpool/agents/events/infer_info.py +145 -0
  38. agentpool/agents/events/processors.py +254 -0
  39. agentpool/agents/interactions.py +41 -6
  40. agentpool/agents/modes.py +13 -0
  41. agentpool/agents/slashed_agent.py +5 -4
  42. agentpool/agents/tool_wrapping.py +18 -6
  43. agentpool/common_types.py +35 -21
  44. agentpool/config_resources/acp_assistant.yml +2 -2
  45. agentpool/config_resources/agents.yml +3 -0
  46. agentpool/config_resources/agents_template.yml +1 -0
  47. agentpool/config_resources/claude_code_agent.yml +9 -8
  48. agentpool/config_resources/external_acp_agents.yml +2 -1
  49. agentpool/delegation/base_team.py +4 -30
  50. agentpool/delegation/pool.py +104 -265
  51. agentpool/delegation/team.py +57 -57
  52. agentpool/delegation/teamrun.py +50 -55
  53. agentpool/functional/run.py +10 -4
  54. agentpool/mcp_server/client.py +73 -38
  55. agentpool/mcp_server/conversions.py +54 -13
  56. agentpool/mcp_server/manager.py +9 -23
  57. agentpool/mcp_server/registries/official_registry_client.py +10 -1
  58. agentpool/mcp_server/tool_bridge.py +114 -79
  59. agentpool/messaging/connection_manager.py +11 -10
  60. agentpool/messaging/event_manager.py +5 -5
  61. agentpool/messaging/message_container.py +6 -30
  62. agentpool/messaging/message_history.py +87 -8
  63. agentpool/messaging/messagenode.py +52 -14
  64. agentpool/messaging/messages.py +2 -26
  65. agentpool/messaging/processing.py +10 -22
  66. agentpool/models/__init__.py +1 -1
  67. agentpool/models/acp_agents/base.py +6 -2
  68. agentpool/models/acp_agents/mcp_capable.py +124 -15
  69. agentpool/models/acp_agents/non_mcp.py +0 -23
  70. agentpool/models/agents.py +66 -66
  71. agentpool/models/agui_agents.py +1 -1
  72. agentpool/models/claude_code_agents.py +111 -17
  73. agentpool/models/file_parsing.py +0 -1
  74. agentpool/models/manifest.py +70 -50
  75. agentpool/prompts/conversion_manager.py +1 -1
  76. agentpool/prompts/prompts.py +5 -2
  77. agentpool/resource_providers/__init__.py +2 -0
  78. agentpool/resource_providers/aggregating.py +4 -2
  79. agentpool/resource_providers/base.py +13 -3
  80. agentpool/resource_providers/codemode/code_executor.py +72 -5
  81. agentpool/resource_providers/codemode/helpers.py +2 -2
  82. agentpool/resource_providers/codemode/provider.py +64 -12
  83. agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
  84. agentpool/resource_providers/codemode/remote_provider.py +9 -12
  85. agentpool/resource_providers/filtering.py +3 -1
  86. agentpool/resource_providers/mcp_provider.py +66 -12
  87. agentpool/resource_providers/plan_provider.py +111 -18
  88. agentpool/resource_providers/pool.py +5 -3
  89. agentpool/resource_providers/resource_info.py +111 -0
  90. agentpool/resource_providers/static.py +2 -2
  91. agentpool/sessions/__init__.py +2 -0
  92. agentpool/sessions/manager.py +2 -3
  93. agentpool/sessions/models.py +9 -6
  94. agentpool/sessions/protocol.py +28 -0
  95. agentpool/sessions/session.py +11 -55
  96. agentpool/storage/manager.py +361 -54
  97. agentpool/talk/registry.py +4 -4
  98. agentpool/talk/talk.py +9 -10
  99. agentpool/testing.py +1 -1
  100. agentpool/tool_impls/__init__.py +6 -0
  101. agentpool/tool_impls/agent_cli/__init__.py +42 -0
  102. agentpool/tool_impls/agent_cli/tool.py +95 -0
  103. agentpool/tool_impls/bash/__init__.py +64 -0
  104. agentpool/tool_impls/bash/helpers.py +35 -0
  105. agentpool/tool_impls/bash/tool.py +171 -0
  106. agentpool/tool_impls/delete_path/__init__.py +70 -0
  107. agentpool/tool_impls/delete_path/tool.py +142 -0
  108. agentpool/tool_impls/download_file/__init__.py +80 -0
  109. agentpool/tool_impls/download_file/tool.py +183 -0
  110. agentpool/tool_impls/execute_code/__init__.py +55 -0
  111. agentpool/tool_impls/execute_code/tool.py +163 -0
  112. agentpool/tool_impls/grep/__init__.py +80 -0
  113. agentpool/tool_impls/grep/tool.py +200 -0
  114. agentpool/tool_impls/list_directory/__init__.py +73 -0
  115. agentpool/tool_impls/list_directory/tool.py +197 -0
  116. agentpool/tool_impls/question/__init__.py +42 -0
  117. agentpool/tool_impls/question/tool.py +127 -0
  118. agentpool/tool_impls/read/__init__.py +104 -0
  119. agentpool/tool_impls/read/tool.py +305 -0
  120. agentpool/tools/__init__.py +2 -1
  121. agentpool/tools/base.py +114 -34
  122. agentpool/tools/manager.py +57 -1
  123. agentpool/ui/base.py +2 -2
  124. agentpool/ui/mock_provider.py +2 -2
  125. agentpool/ui/stdlib_provider.py +2 -2
  126. agentpool/utils/streams.py +21 -96
  127. agentpool/vfs_registry.py +7 -2
  128. {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/METADATA +16 -22
  129. {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/RECORD +242 -195
  130. {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
  131. agentpool_cli/__main__.py +20 -0
  132. agentpool_cli/create.py +1 -1
  133. agentpool_cli/serve_acp.py +59 -1
  134. agentpool_cli/serve_opencode.py +1 -1
  135. agentpool_cli/ui.py +557 -0
  136. agentpool_commands/__init__.py +12 -5
  137. agentpool_commands/agents.py +1 -1
  138. agentpool_commands/pool.py +260 -0
  139. agentpool_commands/session.py +1 -1
  140. agentpool_commands/text_sharing/__init__.py +119 -0
  141. agentpool_commands/text_sharing/base.py +123 -0
  142. agentpool_commands/text_sharing/github_gist.py +80 -0
  143. agentpool_commands/text_sharing/opencode.py +462 -0
  144. agentpool_commands/text_sharing/paste_rs.py +59 -0
  145. agentpool_commands/text_sharing/pastebin.py +116 -0
  146. agentpool_commands/text_sharing/shittycodingagent.py +112 -0
  147. agentpool_commands/utils.py +31 -32
  148. agentpool_config/__init__.py +30 -2
  149. agentpool_config/agentpool_tools.py +498 -0
  150. agentpool_config/converters.py +1 -1
  151. agentpool_config/event_handlers.py +42 -0
  152. agentpool_config/events.py +1 -1
  153. agentpool_config/forward_targets.py +1 -4
  154. agentpool_config/jinja.py +3 -3
  155. agentpool_config/mcp_server.py +1 -5
  156. agentpool_config/nodes.py +1 -1
  157. agentpool_config/observability.py +44 -0
  158. agentpool_config/session.py +0 -3
  159. agentpool_config/storage.py +38 -39
  160. agentpool_config/task.py +3 -3
  161. agentpool_config/tools.py +11 -28
  162. agentpool_config/toolsets.py +22 -90
  163. agentpool_server/a2a_server/agent_worker.py +307 -0
  164. agentpool_server/a2a_server/server.py +23 -18
  165. agentpool_server/acp_server/acp_agent.py +125 -56
  166. agentpool_server/acp_server/commands/acp_commands.py +46 -216
  167. agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +8 -7
  168. agentpool_server/acp_server/event_converter.py +651 -0
  169. agentpool_server/acp_server/input_provider.py +53 -10
  170. agentpool_server/acp_server/server.py +1 -11
  171. agentpool_server/acp_server/session.py +90 -410
  172. agentpool_server/acp_server/session_manager.py +8 -34
  173. agentpool_server/agui_server/server.py +3 -1
  174. agentpool_server/mcp_server/server.py +5 -2
  175. agentpool_server/opencode_server/ENDPOINTS.md +53 -14
  176. agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
  177. agentpool_server/opencode_server/__init__.py +0 -8
  178. agentpool_server/opencode_server/converters.py +132 -26
  179. agentpool_server/opencode_server/input_provider.py +160 -8
  180. agentpool_server/opencode_server/models/__init__.py +42 -20
  181. agentpool_server/opencode_server/models/app.py +12 -0
  182. agentpool_server/opencode_server/models/events.py +203 -29
  183. agentpool_server/opencode_server/models/mcp.py +19 -0
  184. agentpool_server/opencode_server/models/message.py +18 -1
  185. agentpool_server/opencode_server/models/parts.py +134 -1
  186. agentpool_server/opencode_server/models/question.py +56 -0
  187. agentpool_server/opencode_server/models/session.py +13 -1
  188. agentpool_server/opencode_server/routes/__init__.py +4 -0
  189. agentpool_server/opencode_server/routes/agent_routes.py +33 -2
  190. agentpool_server/opencode_server/routes/app_routes.py +66 -3
  191. agentpool_server/opencode_server/routes/config_routes.py +66 -5
  192. agentpool_server/opencode_server/routes/file_routes.py +184 -5
  193. agentpool_server/opencode_server/routes/global_routes.py +1 -1
  194. agentpool_server/opencode_server/routes/lsp_routes.py +1 -1
  195. agentpool_server/opencode_server/routes/message_routes.py +122 -66
  196. agentpool_server/opencode_server/routes/permission_routes.py +63 -0
  197. agentpool_server/opencode_server/routes/pty_routes.py +23 -22
  198. agentpool_server/opencode_server/routes/question_routes.py +128 -0
  199. agentpool_server/opencode_server/routes/session_routes.py +139 -68
  200. agentpool_server/opencode_server/routes/tui_routes.py +1 -1
  201. agentpool_server/opencode_server/server.py +47 -2
  202. agentpool_server/opencode_server/state.py +30 -0
  203. agentpool_storage/__init__.py +0 -4
  204. agentpool_storage/base.py +81 -2
  205. agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
  206. agentpool_storage/claude_provider/__init__.py +42 -0
  207. agentpool_storage/{claude_provider.py → claude_provider/provider.py} +190 -8
  208. agentpool_storage/file_provider.py +149 -15
  209. agentpool_storage/memory_provider.py +132 -12
  210. agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
  211. agentpool_storage/opencode_provider/__init__.py +16 -0
  212. agentpool_storage/opencode_provider/helpers.py +414 -0
  213. agentpool_storage/opencode_provider/provider.py +895 -0
  214. agentpool_storage/session_store.py +20 -6
  215. agentpool_storage/sql_provider/sql_provider.py +135 -2
  216. agentpool_storage/sql_provider/utils.py +2 -12
  217. agentpool_storage/zed_provider/__init__.py +16 -0
  218. agentpool_storage/zed_provider/helpers.py +281 -0
  219. agentpool_storage/zed_provider/models.py +130 -0
  220. agentpool_storage/zed_provider/provider.py +442 -0
  221. agentpool_storage/zed_provider.py +803 -0
  222. agentpool_toolsets/__init__.py +0 -2
  223. agentpool_toolsets/builtin/__init__.py +2 -4
  224. agentpool_toolsets/builtin/code.py +4 -4
  225. agentpool_toolsets/builtin/debug.py +115 -40
  226. agentpool_toolsets/builtin/execution_environment.py +54 -165
  227. agentpool_toolsets/builtin/skills.py +0 -77
  228. agentpool_toolsets/builtin/subagent_tools.py +64 -51
  229. agentpool_toolsets/builtin/workers.py +4 -2
  230. agentpool_toolsets/composio_toolset.py +2 -2
  231. agentpool_toolsets/entry_points.py +3 -1
  232. agentpool_toolsets/fsspec_toolset/grep.py +25 -5
  233. agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
  234. agentpool_toolsets/fsspec_toolset/toolset.py +350 -66
  235. agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
  236. agentpool_toolsets/mcp_discovery/toolset.py +74 -17
  237. agentpool_toolsets/mcp_run_toolset.py +8 -11
  238. agentpool_toolsets/notifications.py +33 -33
  239. agentpool_toolsets/openapi.py +3 -1
  240. agentpool_toolsets/search_toolset.py +3 -1
  241. agentpool_config/resources.py +0 -33
  242. agentpool_server/acp_server/acp_tools.py +0 -43
  243. agentpool_server/acp_server/commands/spawn.py +0 -210
  244. agentpool_storage/opencode_provider.py +0 -730
  245. agentpool_storage/text_log_provider.py +0 -276
  246. agentpool_toolsets/builtin/chain.py +0 -288
  247. agentpool_toolsets/builtin/user_interaction.py +0 -52
  248. agentpool_toolsets/semantic_memory_toolset.py +0 -536
  249. {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
  250. {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -33,7 +33,7 @@ class NewSessionRequest(Request):
33
33
  cwd: str
34
34
  """The working directory for this session. Must be an absolute path."""
35
35
 
36
- mcp_servers: Sequence[McpServer]
36
+ mcp_servers: Sequence[McpServer] | None = None
37
37
  """List of MCP (Model Context Protocol) servers the agent should connect to."""
38
38
 
39
39
 
@@ -48,7 +48,7 @@ class LoadSessionRequest(Request):
48
48
  cwd: str
49
49
  """The working directory for this session."""
50
50
 
51
- mcp_servers: Sequence[McpServer]
51
+ mcp_servers: Sequence[McpServer] | None = None
52
52
  """List of MCP servers to connect to for this session."""
53
53
 
54
54
  session_id: str
@@ -176,7 +176,7 @@ class SetSessionConfigOptionRequest(Request):
176
176
  session_id: str
177
177
  """The ID of the session to set the config option for."""
178
178
 
179
- value_id: str
179
+ value: str = Field(serialization_alias="valueId")
180
180
  """The ID of the value to set for this configuration option."""
181
181
 
182
182
 
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Sequence
6
- from typing import Annotated, Literal
6
+ from typing import Literal
7
7
 
8
8
  from pydantic import Field
9
9
 
@@ -21,6 +21,24 @@ SessionConfigGroupId = str
21
21
  """Unique identifier for a group of values within a configuration option."""
22
22
 
23
23
 
24
+ SessionConfigOptionCategory = Literal["mode", "model", "thought_level", "other"]
25
+ """**UNSTABLE**: This capability is not part of the spec yet.
26
+
27
+ Semantic category for a session configuration option.
28
+
29
+ This is intended to help Clients distinguish broadly common selectors (e.g. model selector vs
30
+ session mode selector vs thought/reasoning level) for UX purposes (keyboard shortcuts, icons,
31
+ placement). It MUST NOT be required for correctness. Clients MUST handle missing or unknown
32
+ categories gracefully (treat as `other`).
33
+
34
+ Values:
35
+ - "mode": Session mode selector
36
+ - "model": Model selector
37
+ - "thought_level": Thought/reasoning level selector
38
+ - "other": Unknown / uncategorized selector
39
+ """
40
+
41
+
24
42
  class ModelInfo(AnnotatedObject):
25
43
  """**UNSTABLE**: This capability is not part of the spec yet.
26
44
 
@@ -98,63 +116,79 @@ class SessionInfo(AnnotatedObject):
98
116
  class SessionConfigSelectOption(AnnotatedObject):
99
117
  """A possible value for a configuration selector."""
100
118
 
101
- id: SessionConfigValueId
102
- """Unique identifier for this value."""
119
+ value: SessionConfigValueId
120
+ """Unique identifier for this option value."""
103
121
 
104
- label: str
105
- """Human-readable label for this value."""
122
+ name: str
123
+ """Human-readable label for this option value."""
106
124
 
107
125
  description: str | None = None
108
- """Optional description explaining this value."""
126
+ """Optional description for this option value."""
109
127
 
110
128
 
111
129
  class SessionConfigSelectGroup(AnnotatedObject):
112
130
  """A group of possible values for a configuration selector."""
113
131
 
114
- id: SessionConfigGroupId
132
+ group: SessionConfigGroupId
115
133
  """Unique identifier for this group."""
116
134
 
117
- label: str
135
+ name: str
118
136
  """Human-readable label for this group."""
119
137
 
120
138
  options: Sequence[SessionConfigSelectOption]
121
- """The options within this group."""
139
+ """The set of option values in this group."""
122
140
 
123
141
 
124
- SessionConfigSelectOptions = Sequence[SessionConfigSelectOption | SessionConfigSelectGroup]
142
+ SessionConfigSelectOptions = (
143
+ Sequence[SessionConfigSelectOption] | Sequence[SessionConfigSelectGroup]
144
+ )
125
145
  """The possible values for a configuration selector, optionally organized into groups."""
126
146
 
127
147
 
128
148
  class SessionConfigSelect(AnnotatedObject):
129
- """A configuration option that allows selecting a single value from a list.
149
+ """A single-value selector (dropdown) session configuration option payload."""
150
+
151
+ current_value: SessionConfigValueId
152
+ """The currently selected value."""
153
+
154
+ options: SessionConfigSelectOptions
155
+ """The set of selectable options."""
130
156
 
131
- Similar to a dropdown/select UI element.
132
- """
157
+
158
+ class SessionConfigKind(AnnotatedObject):
159
+ """Type-specific session configuration option payload."""
133
160
 
134
161
  type: Literal["select"] = Field(default="select", init=False)
135
162
  """Discriminator for the config option type."""
136
163
 
164
+ # Flattened SessionConfigSelect fields
165
+ current_value: SessionConfigValueId
166
+ """The currently selected value."""
167
+
168
+ options: SessionConfigSelectOptions
169
+ """The set of selectable options."""
170
+
171
+
172
+ class SessionConfigOption(AnnotatedObject):
173
+ """A session configuration option selector and its current state."""
174
+
137
175
  id: SessionConfigId
138
- """Unique identifier for this configuration option."""
176
+ """Unique identifier for the configuration option."""
139
177
 
140
- label: str
141
- """Human-readable label for this option."""
178
+ name: str
179
+ """Human-readable label for the option."""
142
180
 
143
181
  description: str | None = None
144
- """Optional description explaining this option."""
182
+ """Optional description for the Client to display to the user."""
145
183
 
146
- options: SessionConfigSelectOptions
147
- """The possible values for this option."""
148
-
149
- value: SessionConfigValueId
150
- """The currently selected value ID."""
184
+ category: SessionConfigOptionCategory | None = None
185
+ """Optional semantic category for this option (UX only)."""
151
186
 
187
+ type: Literal["select"] = Field(default="select", init=False)
188
+ """Discriminator for the config option type (flattened from kind)."""
152
189
 
153
- SessionConfigOption = Annotated[
154
- SessionConfigSelect,
155
- Field(discriminator="type"),
156
- ]
157
- """A session configuration option.
190
+ current_value: SessionConfigValueId
191
+ """The currently selected value (flattened from kind.select)."""
158
192
 
159
- Currently only supports select-type options, but designed for extensibility.
160
- """
193
+ options: SessionConfigSelectOptions
194
+ """The set of selectable options (flattened from kind.select)."""
acp/task/supervisor.py CHANGED
@@ -7,7 +7,7 @@ from collections.abc import Callable
7
7
  from contextlib import suppress
8
8
  from typing import TYPE_CHECKING, Any
9
9
 
10
- from agentpool import log
10
+ import structlog
11
11
 
12
12
 
13
13
  if TYPE_CHECKING:
@@ -16,7 +16,7 @@ if TYPE_CHECKING:
16
16
 
17
17
  __all__ = ["TaskSupervisor"]
18
18
 
19
- logger = log.get_logger(__name__)
19
+ logger = structlog.get_logger(__name__)
20
20
  ErrorHandler = Callable[[asyncio.Task[Any], BaseException], None]
21
21
 
22
22
 
acp/utils.py CHANGED
@@ -6,6 +6,7 @@ import base64
6
6
  from typing import TYPE_CHECKING, Any
7
7
 
8
8
  from pydantic_ai import BinaryContent, FileUrl, ToolReturn
9
+ import structlog
9
10
 
10
11
  from acp.schema import (
11
12
  AudioContentBlock,
@@ -16,7 +17,6 @@ from acp.schema import (
16
17
  ResourceContentBlock,
17
18
  TextContentBlock,
18
19
  )
19
- from agentpool.log import get_logger
20
20
 
21
21
 
22
22
  if TYPE_CHECKING:
@@ -27,7 +27,7 @@ if TYPE_CHECKING:
27
27
  from acp.schema import ContentBlock, ToolCallKind
28
28
 
29
29
 
30
- logger = get_logger(__name__)
30
+ logger = structlog.get_logger(__name__)
31
31
 
32
32
 
33
33
  DEFAULT_PERMISSION_OPTIONS = [
agentpool/__init__.py CHANGED
@@ -7,6 +7,7 @@ Extended ACP / AGUI integration.
7
7
  from __future__ import annotations
8
8
 
9
9
  from importlib.metadata import version
10
+ from upathtools import register_http_filesystems
10
11
 
11
12
  from agentpool.models.agents import NativeAgentConfig
12
13
  from agentpool.models.manifest import AgentsManifest
@@ -38,6 +39,7 @@ __license__ = "MIT"
38
39
  __url__ = "https://github.com/phil65/agentpool"
39
40
 
40
41
  load_dotenv()
42
+ register_http_filesystems()
41
43
 
42
44
  __all__ = [
43
45
  "ACPAgent",