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
@@ -103,9 +103,6 @@ class SessionQuery(Schema):
103
103
  limit: int | None = Field(default=None, examples=[10, 50, 100], title="Message limit")
104
104
  """Maximum number of messages to return."""
105
105
 
106
- include_forwarded: bool = Field(default=True, title="Include forwarded messages")
107
- """Whether to include messages forwarded through agents."""
108
-
109
106
  model_config = ConfigDict(frozen=True)
110
107
 
111
108
  def get_time_cutoff(self) -> datetime | None:
@@ -19,7 +19,6 @@ if TYPE_CHECKING:
19
19
  from agentpool.sessions.store import SessionStore
20
20
 
21
21
 
22
- LogFormat = Literal["chronological", "conversations"]
23
22
  FilterMode = Literal["and", "override"]
24
23
 
25
24
  APP_NAME: Final = "agentpool"
@@ -27,8 +26,10 @@ APP_AUTHOR: Final = "agentpool"
27
26
  DATA_DIR: Final = Path(user_data_dir(APP_NAME, APP_AUTHOR))
28
27
  DEFAULT_DB_NAME: Final = "history.db"
29
28
  DEFAULT_TITLE_PROMPT: Final = """\
30
- Generate a short, descriptive title (3-7 words) for this request. \
31
- Only respond with the title, nothing else."""
29
+ Generate metadata for this conversation request. Provide:
30
+ - A short, descriptive title (3-7 words)
31
+ - A single emoji that represents the topic
32
+ - An iconify icon name (e.g., 'mdi:code-braces', 'mdi:database', 'mdi:bug')"""
32
33
 
33
34
 
34
35
  def get_database_path() -> str:
@@ -104,38 +105,6 @@ class SQLStorageConfig(BaseStorageProviderConfig):
104
105
  return create_async_engine(url_str, pool_size=self.pool_size)
105
106
 
106
107
 
107
- class TextLogConfig(BaseStorageProviderConfig):
108
- """Text log configuration."""
109
-
110
- model_config = ConfigDict(json_schema_extra={"x-doc-title": "Text Log"})
111
-
112
- type: Literal["text_file"] = Field("text_file", init=False)
113
- """Text log storage configuration."""
114
-
115
- path: str = Field(
116
- examples=["/var/log/agent.log", "~/logs/conversations.txt"],
117
- title="Log file path",
118
- )
119
- """Path to log file"""
120
-
121
- format: LogFormat = Field(
122
- default="chronological",
123
- examples=["chronological", "conversations"],
124
- title="Log format",
125
- )
126
- """Log format template to use"""
127
-
128
- template: Literal["chronological", "conversations"] | str | None = Field( # noqa: PYI051
129
- default="chronological",
130
- examples=["chronological", "conversations", "/path/to/template.j2"],
131
- title="Template",
132
- )
133
- """Template to use: either predefined name or path to custom template"""
134
-
135
- encoding: str = Field(default="utf-8", examples=["utf-8", "ascii"], title="File encoding")
136
- """File encoding"""
137
-
138
-
139
108
  class FileStorageConfig(BaseStorageProviderConfig):
140
109
  """File storage configuration."""
141
110
 
@@ -210,13 +179,35 @@ class OpenCodeStorageConfig(BaseStorageProviderConfig):
210
179
  """Path to OpenCode storage directory."""
211
180
 
212
181
 
182
+ class ZedStorageConfig(BaseStorageProviderConfig):
183
+ """Zed IDE native storage format configuration.
184
+
185
+ Reads from Zed's native SQLite + zstd-compressed JSON format.
186
+ Useful for importing conversation history from Zed's AI assistant.
187
+
188
+ This is a READ-ONLY provider - it cannot write back to Zed's format.
189
+ """
190
+
191
+ model_config = ConfigDict(json_schema_extra={"x-doc-title": "Zed Storage"})
192
+
193
+ type: Literal["zed"] = Field("zed", init=False)
194
+ """Zed IDE native storage configuration."""
195
+
196
+ path: str = Field(
197
+ default="~/.local/share/zed/threads/threads.db",
198
+ examples=["~/.local/share/zed/threads/threads.db", "~/.local/share/zed"],
199
+ title="Zed threads database path",
200
+ )
201
+ """Path to Zed threads database (or parent directory)."""
202
+
203
+
213
204
  StorageProviderConfig = Annotated[
214
205
  SQLStorageConfig
215
206
  | FileStorageConfig
216
- | TextLogConfig
217
207
  | MemoryStorageConfig
218
208
  | ClaudeStorageConfig
219
- | OpenCodeStorageConfig,
209
+ | OpenCodeStorageConfig
210
+ | ZedStorageConfig,
220
211
  Field(discriminator="type"),
221
212
  ]
222
213
 
@@ -282,8 +273,12 @@ class StorageConfig(Schema):
282
273
  """Whether to log additions to the context."""
283
274
 
284
275
  title_generation_model: ModelId | str | None = Field(
285
- default="google-gla:gemini-2.5-flash-lite",
286
- examples=["google-gla:gemini-2.5-flash-lite", None],
276
+ default="google-gla:gemini-2.5-flash-lite,openrouter:deepseek/deepseek-r1-0528:free",
277
+ examples=[
278
+ "google-gla:gemini-2.5-flash-lite",
279
+ "google-gla:gemini-2.5-flash-lite,openrouter:deepseek/deepseek-r1-0528:free",
280
+ None,
281
+ ],
287
282
  title="Title generation model",
288
283
  )
289
284
  """Model to use for generating conversation titles.
@@ -318,6 +313,10 @@ class StorageConfig(Schema):
318
313
  from agentpool.sessions.store import MemorySessionStore
319
314
  from agentpool_storage.session_store import SQLSessionStore
320
315
 
316
+ # Use memory store during tests
317
+ if os.getenv("PYTEST_CURRENT_TEST"):
318
+ return MemorySessionStore()
319
+
321
320
  match self.session_store:
322
321
  case "memory":
323
322
  return MemorySessionStore()
agentpool_config/task.py CHANGED
@@ -23,7 +23,7 @@ class Job[TDeps, TResult = str](Schema):
23
23
 
24
24
  Requirements:
25
25
  - The agent must have compatible dependencies (required_dependency)
26
- - The agent must produce the specified result type (required_return_type)
26
+ - The agent must produce the specified result type (required_output_type)
27
27
 
28
28
  Equipment:
29
29
  - The task provides necessary tools for execution (tools)
@@ -54,7 +54,7 @@ class Job[TDeps, TResult = str](Schema):
54
54
  )
55
55
  """The task instruction/prompt."""
56
56
 
57
- required_return_type: ImportString[type[TResult]] = Field(
57
+ required_output_type: ImportString[type[TResult]] = Field(
58
58
  default="str",
59
59
  validate_default=True,
60
60
  examples=["str", "dict", "builtins:str"],
@@ -120,7 +120,7 @@ class Job[TDeps, TResult = str](Schema):
120
120
  ):
121
121
  return False
122
122
 
123
- if agent._output_type != self.required_return_type:
123
+ if agent._output_type != self.required_output_type:
124
124
  return False
125
125
 
126
126
  # Check vision capabilities
agentpool_config/tools.py CHANGED
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Callable
6
- from typing import TYPE_CHECKING, Annotated, Any, Literal
6
+ from typing import TYPE_CHECKING, Any, Literal
7
7
 
8
8
  from pydantic import ConfigDict, Field, ImportString
9
9
  from schemez import Schema
@@ -56,26 +56,9 @@ class BaseToolConfig(Schema):
56
56
  requires_confirmation: bool = Field(default=False, title="Requires confirmation")
57
57
  """Whether tool execution needs confirmation."""
58
58
 
59
- metadata: dict[str, str] = Field(
60
- default_factory=dict,
61
- examples=[
62
- {"category": "web", "version": "1.0"},
63
- {"author": "system", "tags": "search,utility"},
64
- {"priority": "high", "environment": "production"},
65
- ],
66
- title="Tool metadata",
67
- )
59
+ metadata: dict[str, str] = Field(default_factory=dict, title="Tool metadata")
68
60
  """Additional tool metadata."""
69
61
 
70
- hints: ToolHints | None = Field(
71
- default=None,
72
- title="Execution hints",
73
- examples=[
74
- {"read_only": True, "destructive": False, "open_world": True, "idempotent": False},
75
- ],
76
- )
77
- """Hints for tool execution."""
78
-
79
62
  model_config = ConfigDict(frozen=True)
80
63
 
81
64
  def get_tool(self) -> Tool:
@@ -95,6 +78,15 @@ class ImportToolConfig(BaseToolConfig):
95
78
  )
96
79
  """Import path to the tool function."""
97
80
 
81
+ hints: ToolHints | None = Field(
82
+ default=None,
83
+ title="Execution hints",
84
+ examples=[
85
+ {"read_only": True, "destructive": False, "open_world": True, "idempotent": False},
86
+ ],
87
+ )
88
+ """Hints for tool execution."""
89
+
98
90
  def get_tool(self) -> Tool:
99
91
  """Import and create tool from configuration."""
100
92
  from agentpool.tools.base import Tool
@@ -107,12 +99,3 @@ class ImportToolConfig(BaseToolConfig):
107
99
  requires_confirmation=self.requires_confirmation,
108
100
  metadata=self.metadata,
109
101
  )
110
-
111
-
112
- from agentpool_config.builtin_tools import BuiltinToolConfig # noqa: E402
113
-
114
-
115
- ToolConfig = Annotated[
116
- ImportToolConfig | BuiltinToolConfig,
117
- Field(discriminator="type"),
118
- ]
@@ -5,11 +5,11 @@ from __future__ import annotations
5
5
  import os
6
6
  from typing import TYPE_CHECKING, Annotated, Literal, cast
7
7
 
8
- from exxec.configs import ExecutionEnvironmentConfig
9
- from llmling_models.configs.model_configs import AnyModelConfig
8
+ from exxec_config import ExecutionEnvironmentConfig
9
+ from llmling_models_config import AnyModelConfig
10
10
  from pydantic import ConfigDict, EmailStr, Field, HttpUrl, SecretStr
11
11
  from schemez import Schema
12
- from searchly.config import (
12
+ from searchly_config import (
13
13
  NewsSearchProviderConfig,
14
14
  NewsSearchProviderName,
15
15
  WebSearchProviderConfig,
@@ -18,8 +18,8 @@ from searchly.config import (
18
18
  )
19
19
  from tokonomics.model_names import ModelId
20
20
  from upathtools import UPath
21
- from upathtools.configs import FilesystemConfigType
22
- from upathtools.configs.base import FileSystemConfig
21
+ from upathtools_config import FilesystemConfigType
22
+ from upathtools_config.base import FileSystemConfig
23
23
 
24
24
  from agentpool_config.converters import ConversionConfig
25
25
  from agentpool_config.tools import ImportToolConfig
@@ -49,11 +49,10 @@ ExecutionEnvironmentToolName = Literal[
49
49
  "list_processes",
50
50
  ]
51
51
 
52
- UserInteractionToolName = Literal["ask_user",]
53
52
  SkillsToolName = Literal["load_skill", "list_skills"]
54
53
  CodeToolName = Literal["format_code", "ast_grep"]
55
54
  PlanToolName = Literal["get_plan", "add_plan_entry", "update_plan_entry", "remove_plan_entry"]
56
- PlanToolMode = Literal["granular", "declarative", "hybrid"]
55
+ PlanToolMode = Literal["granular", "declarative"]
57
56
 
58
57
 
59
58
  class BaseToolsetConfig(Schema):
@@ -235,24 +234,24 @@ class WorkersToolsetConfig(BaseToolsetConfig):
235
234
  return WorkersTools(workers=self.workers, name="workers")
236
235
 
237
236
 
238
- class ExecutionEnvironmentToolsetConfig(BaseToolsetConfig):
239
- """Configuration for execution environment toolset (code + process management)."""
237
+ class ProcessManagementToolsetConfig(BaseToolsetConfig):
238
+ """Configuration for process management toolset (code + process management)."""
240
239
 
241
240
  model_config = ConfigDict(
242
241
  json_schema_extra={
243
242
  "x-icon": "octicon:terminal-16",
244
- "x-doc-title": "Execution Environment Toolset",
243
+ "x-doc-title": "Process management Toolset",
245
244
  }
246
245
  )
247
246
 
248
- type: Literal["execution"] = Field("execution", init=False)
249
- """Execution environment toolset."""
247
+ type: Literal["process_management"] = Field("process_management", init=False)
248
+ """Process management toolset."""
250
249
 
251
250
  environment: ExecutionEnvironmentConfig | None = Field(
252
251
  default=None,
253
- title="Execution environment",
252
+ title="Process management",
254
253
  )
255
- """Optional execution environment configuration (defaults to local)."""
254
+ """Optional Process management configuration (defaults to local)."""
256
255
 
257
256
  tools: dict[ExecutionEnvironmentToolName, bool] | None = Field(
258
257
  default=None,
@@ -261,42 +260,11 @@ class ExecutionEnvironmentToolsetConfig(BaseToolsetConfig):
261
260
  """Optional tool filter to enable/disable specific tools."""
262
261
 
263
262
  def get_provider(self) -> ResourceProvider:
264
- """Create execution environment tools provider."""
265
- from agentpool_toolsets.builtin import ExecutionEnvironmentTools
263
+ """Create Process management tools provider."""
264
+ from agentpool_toolsets.builtin import ProcessManagementTools
266
265
 
267
266
  env = self.environment.get_provider() if self.environment else None
268
- provider = ExecutionEnvironmentTools(env=env, name="execution")
269
- if self.tools is not None:
270
- from agentpool.resource_providers import FilteringResourceProvider
271
-
272
- return FilteringResourceProvider(provider, cast(dict[str, bool], self.tools))
273
- return provider
274
-
275
-
276
- class UserInteractionToolsetConfig(BaseToolsetConfig):
277
- """Configuration for user interaction toolset."""
278
-
279
- model_config = ConfigDict(
280
- json_schema_extra={
281
- "x-icon": "octicon:comment-discussion-16",
282
- "x-doc-title": "User Interaction Toolset",
283
- }
284
- )
285
-
286
- type: Literal["user_interaction"] = Field("user_interaction", init=False)
287
- """User interaction toolset."""
288
-
289
- tools: dict[UserInteractionToolName, bool] | None = Field(
290
- default=None,
291
- title="Tool filter",
292
- )
293
- """Optional tool filter to enable/disable specific tools."""
294
-
295
- def get_provider(self) -> ResourceProvider:
296
- """Create user interaction tools provider."""
297
- from agentpool_toolsets.builtin import UserInteractionTools
298
-
299
- provider = UserInteractionTools(name="user_interaction")
267
+ provider = ProcessManagementTools(env=env, name="process_management")
300
268
  if self.tools is not None:
301
269
  from agentpool.resource_providers import FilteringResourceProvider
302
270
 
@@ -644,41 +612,6 @@ class NotificationsToolsetConfig(BaseToolsetConfig):
644
612
  return NotificationsTools(channels=self.channels)
645
613
 
646
614
 
647
- class SemanticMemoryToolsetConfig(BaseToolsetConfig):
648
- """Configuration for semantic memory / knowledge processing toolset."""
649
-
650
- model_config = ConfigDict(
651
- json_schema_extra={
652
- "x-icon": "octicon:database-16",
653
- "x-doc-title": "Semantic Memory Toolset",
654
- }
655
- )
656
-
657
- type: Literal["semantic_memory"] = Field("semantic_memory", init=False)
658
- """Semantic memory toolset using TypeAgent's KnowPro."""
659
-
660
- model: str | ModelId | AnyModelConfig | None = Field(
661
- default=None,
662
- examples=["openai:gpt-4o", "anthropic:claude-sonnet-4-20250514"],
663
- title="Model for LLM sampling",
664
- )
665
- """Model to use for query translation and answer generation."""
666
-
667
- dbname: str | None = Field(
668
- default=None,
669
- examples=["knowledge.db", "/path/to/memory.db"],
670
- title="Database path",
671
- )
672
- """SQLite database path for persistent storage, or None for in-memory."""
673
-
674
- def get_provider(self) -> ResourceProvider:
675
- """Create semantic memory tools provider."""
676
- from agentpool_toolsets.semantic_memory_toolset import SemanticMemoryTools
677
-
678
- model = m if isinstance(m := self.model, str) or m is None else m.get_model()
679
- return SemanticMemoryTools(model=model, dbname=self.dbname)
680
-
681
-
682
615
  class CustomToolsetConfig(BaseToolsetConfig):
683
616
  """Configuration for custom toolsets."""
684
617
 
@@ -847,13 +780,14 @@ class PlanToolsetConfig(BaseToolsetConfig):
847
780
  """Plan toolset."""
848
781
 
849
782
  mode: PlanToolMode = Field(
850
- default="granular",
783
+ default="declarative",
851
784
  title="Plan tool mode",
852
785
  )
853
786
  """Tool mode:
854
- - 'granular': Separate tools (get/add/update/remove) - better for simpler models
855
- - 'declarative': Single set_plan tool with full list - fewer calls, suits capable models
856
- - 'hybrid': Both approaches available - model chooses most efficient per situation
787
+ - 'declarative': Single set_plan tool with full list (default, recommended)
788
+ - Fewer calls, better UX with parallel updates
789
+ - 'granular': Separate tools (get/add/update/remove)
790
+ - For simpler models or fine-grained control
857
791
  """
858
792
 
859
793
  tools: dict[PlanToolName, bool] | None = Field(
@@ -954,8 +888,7 @@ ToolsetConfig = Annotated[
954
888
  OpenAPIToolsetConfig
955
889
  | EntryPointToolsetConfig
956
890
  | ComposioToolSetConfig
957
- | ExecutionEnvironmentToolsetConfig
958
- | UserInteractionToolsetConfig
891
+ | ProcessManagementToolsetConfig
959
892
  | SkillsToolsetConfig
960
893
  | CodeToolsetConfig
961
894
  | FSSpecToolsetConfig
@@ -966,7 +899,6 @@ ToolsetConfig = Annotated[
966
899
  | RemoteCodeModeToolsetConfig
967
900
  | SearchToolsetConfig
968
901
  | NotificationsToolsetConfig
969
- | SemanticMemoryToolsetConfig
970
902
  | ConfigCreationToolsetConfig
971
903
  | ImportToolsToolsetConfig
972
904
  | PlanToolsetConfig