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
@@ -0,0 +1,112 @@
1
+ """ShittyCodingAgent.ai text sharing provider.
2
+
3
+ Creates a GitHub Gist and returns a preview URL via shittycodingagent.ai.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import os
9
+ from typing import TYPE_CHECKING, Any
10
+
11
+ from agentpool_commands.text_sharing.base import ShareResult, TextSharer
12
+
13
+
14
+ if TYPE_CHECKING:
15
+ from agentpool_commands.text_sharing.base import Visibility
16
+
17
+
18
+ PREVIEW_BASE_URL = "https://shittycodingagent.ai/session"
19
+
20
+
21
+ class ShittyCodingAgentSharer(TextSharer):
22
+ """Share text via GitHub Gists with shittycodingagent.ai preview URL.
23
+
24
+ Creates a secret (unlisted) GitHub Gist and returns a URL in the format:
25
+ https://shittycodingagent.ai/session?{gist_id}
26
+ """
27
+
28
+ def __init__(self, token: str | None = None) -> None:
29
+ """Initialize the ShittyCodingAgent sharer.
30
+
31
+ Args:
32
+ token: GitHub personal access token. If not provided,
33
+ reads from GITHUB_TOKEN environment variable.
34
+ """
35
+ self._token = token or os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN")
36
+ if not self._token:
37
+ msg = "GitHub token required. Set GITHUB_TOKEN/GH_TOKEN or pass token parameter."
38
+ raise ValueError(msg)
39
+
40
+ @property
41
+ def name(self) -> str:
42
+ """Name of the sharing service."""
43
+ return "ShittyCodingAgent.ai"
44
+
45
+ async def share(
46
+ self,
47
+ content: str,
48
+ *,
49
+ title: str | None = None,
50
+ syntax: str | None = None,
51
+ visibility: Visibility = "unlisted",
52
+ expires_in: int | None = None,
53
+ ) -> ShareResult:
54
+ """Share content via GitHub Gist with shittycodingagent.ai preview.
55
+
56
+ Args:
57
+ content: The text content to share
58
+ title: Filename for the gist (defaults to "session.html")
59
+ syntax: File extension hint (e.g. "html")
60
+ visibility: Always creates unlisted gist (visibility param ignored)
61
+ expires_in: Ignored (gists don't expire)
62
+
63
+ Returns:
64
+ ShareResult with shittycodingagent.ai preview URL
65
+ """
66
+ import anyenv
67
+
68
+ # Default to session.html for the typical use case
69
+ filename = title or f"session.{syntax or 'html'}"
70
+
71
+ # Always create as unlisted (secret) gist
72
+ payload: dict[str, Any] = {
73
+ "files": {filename: {"content": content}},
74
+ "public": False,
75
+ }
76
+ headers = {
77
+ "Authorization": f"Bearer {self._token}",
78
+ "Accept": "application/vnd.github+json",
79
+ "X-GitHub-Api-Version": "2022-11-28",
80
+ }
81
+ url = "https://api.github.com/gists"
82
+ response: dict[str, Any] = await anyenv.post_json(url, payload, headers=headers)
83
+
84
+ gist_id = response["id"]
85
+ raw_url = response["files"][filename]["raw_url"]
86
+
87
+ # Build the shittycodingagent.ai preview URL
88
+ preview_url = f"{PREVIEW_BASE_URL}?{gist_id}"
89
+
90
+ return ShareResult(
91
+ url=preview_url,
92
+ raw_url=raw_url,
93
+ delete_url=None,
94
+ id=gist_id,
95
+ )
96
+
97
+
98
+ if __name__ == "__main__":
99
+ import asyncio
100
+
101
+ async def main() -> None:
102
+ """Example usage of the ShittyCodingAgentSharer class."""
103
+ sharer = ShittyCodingAgentSharer()
104
+ result = await sharer.share(
105
+ "<html><body><h1>Test Session</h1></body></html>",
106
+ title="session.html",
107
+ )
108
+ print(f"Preview URL: {result.url}")
109
+ print(f"Raw: {result.raw_url}")
110
+ print(f"Gist ID: {result.id}")
111
+
112
+ asyncio.run(main())
@@ -3,16 +3,19 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import importlib.util
6
- from typing import Literal
6
+ from typing import TYPE_CHECKING, Literal
7
7
  import webbrowser
8
8
 
9
- from anyenv.text_sharing import TextSharerStr, Visibility # noqa: TC002
10
9
  from slashed import CommandContext, CommandError # noqa: TC002
11
10
 
12
11
  from agentpool.messaging.context import NodeContext # noqa: TC001
13
12
  from agentpool_commands.base import NodeCommand
14
13
 
15
14
 
15
+ if TYPE_CHECKING:
16
+ from agentpool_commands.text_sharing import TextSharerStr, Visibility
17
+
18
+
16
19
  LogLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
17
20
 
18
21
 
@@ -21,11 +24,10 @@ class CopyClipboardCommand(NodeCommand):
21
24
 
22
25
  Allows copying a configurable number of messages with options for:
23
26
  - Number of messages to include
24
- - Including/excluding system messages
25
27
  - Token limit for context size
26
28
  - Custom format templates
27
29
 
28
- Requires clipman package to be installed.
30
+ Requires copykitten package to be installed.
29
31
  """
30
32
 
31
33
  name = "copy-clipboard"
@@ -36,7 +38,6 @@ class CopyClipboardCommand(NodeCommand):
36
38
  ctx: CommandContext[NodeContext],
37
39
  *,
38
40
  num_messages: int = 1,
39
- include_system: bool = False,
40
41
  max_tokens: int | None = None,
41
42
  format_template: str | None = None,
42
43
  ) -> None:
@@ -45,19 +46,17 @@ class CopyClipboardCommand(NodeCommand):
45
46
  Args:
46
47
  ctx: Command context
47
48
  num_messages: Number of messages to copy (default: 1)
48
- include_system: Include system messages
49
49
  max_tokens: Only include messages up to token limit
50
50
  format_template: Custom format template
51
51
  """
52
52
  try:
53
- import clipman # type: ignore[import-untyped]
53
+ import copykitten
54
54
  except ImportError as e:
55
- msg = "clipman package required for clipboard operations"
55
+ msg = "copykitten package required for clipboard operations"
56
56
  raise CommandError(msg) from e
57
57
 
58
58
  content = await ctx.context.agent.conversation.format_history(
59
59
  num_messages=num_messages,
60
- include_system=include_system,
61
60
  max_tokens=max_tokens,
62
61
  format_template=format_template,
63
62
  )
@@ -67,8 +66,7 @@ class CopyClipboardCommand(NodeCommand):
67
66
  return
68
67
 
69
68
  try:
70
- clipman.init()
71
- clipman.copy(content)
69
+ copykitten.copy(content)
72
70
  await ctx.print("📋 **Messages copied to clipboard**")
73
71
  except Exception as e:
74
72
  msg = f"Failed to copy to clipboard: {e}"
@@ -76,8 +74,8 @@ class CopyClipboardCommand(NodeCommand):
76
74
 
77
75
  @classmethod
78
76
  def condition(cls) -> bool:
79
- """Check if clipman is available."""
80
- return importlib.util.find_spec("clipman") is not None
77
+ """Check if copykitten is available."""
78
+ return importlib.util.find_spec("copykitten") is not None
81
79
 
82
80
 
83
81
  class EditAgentFileCommand(NodeCommand):
@@ -134,8 +132,7 @@ class ShareHistoryCommand(NodeCommand):
134
132
  ctx: CommandContext[NodeContext],
135
133
  *,
136
134
  provider: TextSharerStr = "paste_rs",
137
- num_messages: int = 1,
138
- include_system: bool = False,
135
+ num_messages: int | None = None,
139
136
  max_tokens: int | None = None,
140
137
  format_template: str | None = None,
141
138
  title: str | None = None,
@@ -147,32 +144,39 @@ class ShareHistoryCommand(NodeCommand):
147
144
  Args:
148
145
  ctx: Command context
149
146
  provider: Text sharing provider to use
150
- num_messages: Number of messages from history to share (ignored if custom_content)
151
- include_system: Include system messages in history
147
+ num_messages: Number of messages from history to share (None = all messages)
152
148
  max_tokens: Token limit for conversation history
153
149
  format_template: Custom format template for history
154
150
  title: Title/filename for the shared content
155
151
  syntax: Syntax highlighting (e.g., "python", "markdown")
156
152
  visibility: Visibility level
157
153
  """
158
- from anyenv.text_sharing import get_sharer
154
+ from agentpool_commands.text_sharing import get_sharer
159
155
 
160
- content = await ctx.context.agent.conversation.format_history(
161
- num_messages=num_messages,
162
- include_system=include_system,
163
- max_tokens=max_tokens,
164
- format_template=format_template,
165
- )
156
+ conversation = ctx.context.agent.conversation
166
157
 
167
- if not content.strip():
158
+ # Check if there's content to share
159
+ messages_to_check = (
160
+ conversation.chat_messages[-num_messages:]
161
+ if num_messages
162
+ else conversation.chat_messages
163
+ )
164
+ if not messages_to_check:
168
165
  await ctx.print("ℹ️ **No content to share**") # noqa: RUF001
169
166
  return
170
167
 
171
168
  try:
172
169
  # Get the appropriate sharer
173
170
  sharer = get_sharer(provider)
174
- # Share the content
175
- result = await sharer.share(content, title=title, syntax=syntax, visibility=visibility)
171
+
172
+ # Use structured sharing for providers that support it (OpenCode)
173
+ # Otherwise fall back to plain text sharing
174
+ result = await sharer.share_conversation(
175
+ conversation,
176
+ title=title,
177
+ visibility=visibility,
178
+ num_messages=num_messages,
179
+ )
176
180
  # Format success message
177
181
  provider_name = sharer.name
178
182
  msg_parts = [f"🔗 **Content shared via {provider_name}:**", f"• URL: {result.url}"]
@@ -187,11 +191,6 @@ class ShareHistoryCommand(NodeCommand):
187
191
  msg = f"Failed to share content via {provider}: {e}"
188
192
  raise CommandError(msg) from e
189
193
 
190
- @classmethod
191
- def condition(cls) -> bool:
192
- """Check if anyenv text_sharing is available."""
193
- return importlib.util.find_spec("anyenv.text_sharing") is not None
194
-
195
194
 
196
195
  class GetLogsCommand(NodeCommand):
197
196
  """Get recent log entries from memory.
@@ -2,7 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from agentpool_config.resources import ResourceInfo
5
+
6
+ from typing import Annotated
7
+ from pydantic import Field
8
+
9
+ from agentpool_config.tools import ImportToolConfig, BaseToolConfig
10
+ from agentpool_config.agentpool_tools import AgentpoolToolConfig
11
+ from agentpool_config.builtin_tools import BuiltinToolConfig
12
+
6
13
  from agentpool_config.forward_targets import ForwardingTarget
7
14
  from agentpool_config.session import SessionQuery
8
15
  from agentpool_config.teams import TeamConfig
@@ -28,11 +35,30 @@ from agentpool_config.hooks import (
28
35
  HooksConfig,
29
36
  PromptHookConfig,
30
37
  )
38
+ from agentpool_config.toolsets import ToolsetConfig
31
39
 
40
+
41
+ ToolConfig = Annotated[
42
+ ImportToolConfig | AgentpoolToolConfig,
43
+ Field(discriminator="type"),
44
+ ]
45
+
46
+ NativeAgentToolConfig = Annotated[
47
+ ToolConfig | BuiltinToolConfig,
48
+ Field(discriminator="type"),
49
+ ]
50
+
51
+ # Unified type for all tool configurations (single tools + toolsets)
52
+ AnyToolConfig = Annotated[
53
+ NativeAgentToolConfig | ToolsetConfig,
54
+ Field(discriminator="type"),
55
+ ]
32
56
  __all__ = [
57
+ "AnyToolConfig",
33
58
  "BaseEventHandlerConfig",
34
59
  "BaseHookConfig",
35
60
  "BaseMCPServerConfig",
61
+ "BaseToolConfig",
36
62
  "CallableHookConfig",
37
63
  "CallbackEventHandlerConfig",
38
64
  "CommandHookConfig",
@@ -41,13 +67,15 @@ __all__ = [
41
67
  "HookConfig",
42
68
  "HooksConfig",
43
69
  "MCPServerConfig",
70
+ "NativeAgentToolConfig",
44
71
  "PromptHookConfig",
45
- "ResourceInfo",
46
72
  "SSEMCPServerConfig",
47
73
  "SessionQuery",
48
74
  "StdioMCPServerConfig",
49
75
  "StdoutEventHandlerConfig",
50
76
  "StreamableHTTPMCPServerConfig",
51
77
  "TeamConfig",
78
+ "ToolConfig",
79
+ "ToolsetConfig",
52
80
  "resolve_handler_configs",
53
81
  ]