agentpool 2.1.9__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.
- acp/__init__.py +13 -4
- acp/acp_requests.py +20 -77
- acp/agent/connection.py +8 -0
- acp/agent/implementations/debug_server/debug_server.py +6 -2
- acp/agent/protocol.py +6 -0
- acp/bridge/README.md +15 -2
- acp/bridge/__init__.py +3 -2
- acp/bridge/__main__.py +60 -19
- acp/bridge/ws_server.py +173 -0
- acp/bridge/ws_server_cli.py +89 -0
- acp/client/connection.py +38 -29
- acp/client/implementations/default_client.py +3 -2
- acp/client/implementations/headless_client.py +2 -2
- acp/connection.py +2 -2
- acp/notifications.py +20 -50
- acp/schema/__init__.py +2 -0
- acp/schema/agent_responses.py +21 -0
- acp/schema/client_requests.py +3 -3
- acp/schema/session_state.py +63 -29
- acp/stdio.py +39 -9
- acp/task/supervisor.py +2 -2
- acp/transports.py +362 -2
- acp/utils.py +17 -4
- agentpool/__init__.py +6 -1
- agentpool/agents/__init__.py +2 -0
- agentpool/agents/acp_agent/acp_agent.py +407 -277
- agentpool/agents/acp_agent/acp_converters.py +196 -38
- agentpool/agents/acp_agent/client_handler.py +191 -26
- agentpool/agents/acp_agent/session_state.py +17 -6
- agentpool/agents/agent.py +607 -572
- agentpool/agents/agui_agent/__init__.py +0 -2
- agentpool/agents/agui_agent/agui_agent.py +176 -110
- agentpool/agents/agui_agent/agui_converters.py +0 -131
- agentpool/agents/agui_agent/helpers.py +3 -4
- agentpool/agents/base_agent.py +632 -17
- agentpool/agents/claude_code_agent/FORKING.md +191 -0
- agentpool/agents/claude_code_agent/__init__.py +13 -1
- agentpool/agents/claude_code_agent/claude_code_agent.py +1058 -291
- agentpool/agents/claude_code_agent/converters.py +74 -143
- agentpool/agents/claude_code_agent/history.py +474 -0
- agentpool/agents/claude_code_agent/models.py +77 -0
- agentpool/agents/claude_code_agent/static_info.py +100 -0
- agentpool/agents/claude_code_agent/usage.py +242 -0
- agentpool/agents/context.py +40 -0
- agentpool/agents/events/__init__.py +24 -0
- agentpool/agents/events/builtin_handlers.py +67 -1
- agentpool/agents/events/event_emitter.py +32 -2
- agentpool/agents/events/events.py +104 -3
- agentpool/agents/events/infer_info.py +145 -0
- agentpool/agents/events/processors.py +254 -0
- agentpool/agents/interactions.py +41 -6
- agentpool/agents/modes.py +67 -0
- agentpool/agents/slashed_agent.py +5 -4
- agentpool/agents/tool_call_accumulator.py +213 -0
- agentpool/agents/tool_wrapping.py +18 -6
- agentpool/common_types.py +56 -21
- agentpool/config_resources/__init__.py +38 -1
- agentpool/config_resources/acp_assistant.yml +2 -2
- agentpool/config_resources/agents.yml +3 -0
- agentpool/config_resources/agents_template.yml +1 -0
- agentpool/config_resources/claude_code_agent.yml +10 -6
- agentpool/config_resources/external_acp_agents.yml +2 -1
- agentpool/delegation/base_team.py +4 -30
- agentpool/delegation/pool.py +136 -289
- agentpool/delegation/team.py +58 -57
- agentpool/delegation/teamrun.py +51 -55
- agentpool/diagnostics/__init__.py +53 -0
- agentpool/diagnostics/lsp_manager.py +1593 -0
- agentpool/diagnostics/lsp_proxy.py +41 -0
- agentpool/diagnostics/lsp_proxy_script.py +229 -0
- agentpool/diagnostics/models.py +398 -0
- agentpool/functional/run.py +10 -4
- agentpool/mcp_server/__init__.py +0 -2
- agentpool/mcp_server/client.py +76 -32
- agentpool/mcp_server/conversions.py +54 -13
- agentpool/mcp_server/manager.py +34 -54
- agentpool/mcp_server/registries/official_registry_client.py +35 -1
- agentpool/mcp_server/tool_bridge.py +186 -139
- agentpool/messaging/__init__.py +0 -2
- agentpool/messaging/compaction.py +72 -197
- agentpool/messaging/connection_manager.py +11 -10
- agentpool/messaging/event_manager.py +5 -5
- agentpool/messaging/message_container.py +6 -30
- agentpool/messaging/message_history.py +99 -8
- agentpool/messaging/messagenode.py +52 -14
- agentpool/messaging/messages.py +54 -35
- agentpool/messaging/processing.py +12 -22
- agentpool/models/__init__.py +1 -1
- agentpool/models/acp_agents/base.py +6 -24
- agentpool/models/acp_agents/mcp_capable.py +126 -157
- agentpool/models/acp_agents/non_mcp.py +129 -95
- agentpool/models/agents.py +98 -76
- agentpool/models/agui_agents.py +1 -1
- agentpool/models/claude_code_agents.py +144 -19
- agentpool/models/file_parsing.py +0 -1
- agentpool/models/manifest.py +113 -50
- agentpool/prompts/conversion_manager.py +1 -1
- agentpool/prompts/prompts.py +5 -2
- agentpool/repomap.py +1 -1
- agentpool/resource_providers/__init__.py +11 -1
- agentpool/resource_providers/aggregating.py +56 -5
- agentpool/resource_providers/base.py +70 -4
- agentpool/resource_providers/codemode/code_executor.py +72 -5
- agentpool/resource_providers/codemode/helpers.py +2 -2
- agentpool/resource_providers/codemode/provider.py +64 -12
- agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
- agentpool/resource_providers/codemode/remote_provider.py +9 -12
- agentpool/resource_providers/filtering.py +3 -1
- agentpool/resource_providers/mcp_provider.py +89 -12
- agentpool/resource_providers/plan_provider.py +228 -46
- agentpool/resource_providers/pool.py +7 -3
- agentpool/resource_providers/resource_info.py +111 -0
- agentpool/resource_providers/static.py +4 -2
- agentpool/sessions/__init__.py +4 -1
- agentpool/sessions/manager.py +33 -5
- agentpool/sessions/models.py +59 -6
- agentpool/sessions/protocol.py +28 -0
- agentpool/sessions/session.py +11 -55
- agentpool/skills/registry.py +13 -8
- agentpool/storage/manager.py +572 -49
- agentpool/talk/registry.py +4 -4
- agentpool/talk/talk.py +9 -10
- agentpool/testing.py +538 -20
- agentpool/tool_impls/__init__.py +6 -0
- agentpool/tool_impls/agent_cli/__init__.py +42 -0
- agentpool/tool_impls/agent_cli/tool.py +95 -0
- agentpool/tool_impls/bash/__init__.py +64 -0
- agentpool/tool_impls/bash/helpers.py +35 -0
- agentpool/tool_impls/bash/tool.py +171 -0
- agentpool/tool_impls/delete_path/__init__.py +70 -0
- agentpool/tool_impls/delete_path/tool.py +142 -0
- agentpool/tool_impls/download_file/__init__.py +80 -0
- agentpool/tool_impls/download_file/tool.py +183 -0
- agentpool/tool_impls/execute_code/__init__.py +55 -0
- agentpool/tool_impls/execute_code/tool.py +163 -0
- agentpool/tool_impls/grep/__init__.py +80 -0
- agentpool/tool_impls/grep/tool.py +200 -0
- agentpool/tool_impls/list_directory/__init__.py +73 -0
- agentpool/tool_impls/list_directory/tool.py +197 -0
- agentpool/tool_impls/question/__init__.py +42 -0
- agentpool/tool_impls/question/tool.py +127 -0
- agentpool/tool_impls/read/__init__.py +104 -0
- agentpool/tool_impls/read/tool.py +305 -0
- agentpool/tools/__init__.py +2 -1
- agentpool/tools/base.py +114 -34
- agentpool/tools/manager.py +57 -1
- agentpool/ui/base.py +2 -2
- agentpool/ui/mock_provider.py +2 -2
- agentpool/ui/stdlib_provider.py +2 -2
- agentpool/utils/file_watcher.py +269 -0
- agentpool/utils/identifiers.py +121 -0
- agentpool/utils/pydantic_ai_helpers.py +46 -0
- agentpool/utils/streams.py +616 -2
- agentpool/utils/subprocess_utils.py +155 -0
- agentpool/utils/token_breakdown.py +461 -0
- agentpool/vfs_registry.py +7 -2
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/METADATA +41 -27
- agentpool-2.5.0.dist-info/RECORD +579 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
- agentpool_cli/__main__.py +24 -0
- agentpool_cli/create.py +1 -1
- agentpool_cli/serve_acp.py +100 -21
- agentpool_cli/serve_agui.py +87 -0
- agentpool_cli/serve_opencode.py +119 -0
- agentpool_cli/ui.py +557 -0
- agentpool_commands/__init__.py +42 -5
- agentpool_commands/agents.py +75 -2
- agentpool_commands/history.py +62 -0
- agentpool_commands/mcp.py +176 -0
- agentpool_commands/models.py +56 -3
- agentpool_commands/pool.py +260 -0
- agentpool_commands/session.py +1 -1
- agentpool_commands/text_sharing/__init__.py +119 -0
- agentpool_commands/text_sharing/base.py +123 -0
- agentpool_commands/text_sharing/github_gist.py +80 -0
- agentpool_commands/text_sharing/opencode.py +462 -0
- agentpool_commands/text_sharing/paste_rs.py +59 -0
- agentpool_commands/text_sharing/pastebin.py +116 -0
- agentpool_commands/text_sharing/shittycodingagent.py +112 -0
- agentpool_commands/tools.py +57 -0
- agentpool_commands/utils.py +80 -30
- agentpool_config/__init__.py +30 -2
- agentpool_config/agentpool_tools.py +498 -0
- agentpool_config/builtin_tools.py +77 -22
- agentpool_config/commands.py +24 -1
- agentpool_config/compaction.py +258 -0
- agentpool_config/converters.py +1 -1
- agentpool_config/event_handlers.py +42 -0
- agentpool_config/events.py +1 -1
- agentpool_config/forward_targets.py +1 -4
- agentpool_config/jinja.py +3 -3
- agentpool_config/mcp_server.py +132 -6
- agentpool_config/nodes.py +1 -1
- agentpool_config/observability.py +44 -0
- agentpool_config/session.py +0 -3
- agentpool_config/storage.py +82 -38
- agentpool_config/task.py +3 -3
- agentpool_config/tools.py +11 -22
- agentpool_config/toolsets.py +109 -233
- agentpool_server/a2a_server/agent_worker.py +307 -0
- agentpool_server/a2a_server/server.py +23 -18
- agentpool_server/acp_server/acp_agent.py +234 -181
- agentpool_server/acp_server/commands/acp_commands.py +151 -156
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +18 -17
- agentpool_server/acp_server/event_converter.py +651 -0
- agentpool_server/acp_server/input_provider.py +53 -10
- agentpool_server/acp_server/server.py +24 -90
- agentpool_server/acp_server/session.py +173 -331
- agentpool_server/acp_server/session_manager.py +8 -34
- agentpool_server/agui_server/server.py +3 -1
- agentpool_server/mcp_server/server.py +5 -2
- agentpool_server/opencode_server/.rules +95 -0
- agentpool_server/opencode_server/ENDPOINTS.md +401 -0
- agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
- agentpool_server/opencode_server/__init__.py +19 -0
- agentpool_server/opencode_server/command_validation.py +172 -0
- agentpool_server/opencode_server/converters.py +975 -0
- agentpool_server/opencode_server/dependencies.py +24 -0
- agentpool_server/opencode_server/input_provider.py +421 -0
- agentpool_server/opencode_server/models/__init__.py +250 -0
- agentpool_server/opencode_server/models/agent.py +53 -0
- agentpool_server/opencode_server/models/app.py +72 -0
- agentpool_server/opencode_server/models/base.py +26 -0
- agentpool_server/opencode_server/models/common.py +23 -0
- agentpool_server/opencode_server/models/config.py +37 -0
- agentpool_server/opencode_server/models/events.py +821 -0
- agentpool_server/opencode_server/models/file.py +88 -0
- agentpool_server/opencode_server/models/mcp.py +44 -0
- agentpool_server/opencode_server/models/message.py +179 -0
- agentpool_server/opencode_server/models/parts.py +323 -0
- agentpool_server/opencode_server/models/provider.py +81 -0
- agentpool_server/opencode_server/models/pty.py +43 -0
- agentpool_server/opencode_server/models/question.py +56 -0
- agentpool_server/opencode_server/models/session.py +111 -0
- agentpool_server/opencode_server/routes/__init__.py +29 -0
- agentpool_server/opencode_server/routes/agent_routes.py +473 -0
- agentpool_server/opencode_server/routes/app_routes.py +202 -0
- agentpool_server/opencode_server/routes/config_routes.py +302 -0
- agentpool_server/opencode_server/routes/file_routes.py +571 -0
- agentpool_server/opencode_server/routes/global_routes.py +94 -0
- agentpool_server/opencode_server/routes/lsp_routes.py +319 -0
- agentpool_server/opencode_server/routes/message_routes.py +761 -0
- agentpool_server/opencode_server/routes/permission_routes.py +63 -0
- agentpool_server/opencode_server/routes/pty_routes.py +300 -0
- agentpool_server/opencode_server/routes/question_routes.py +128 -0
- agentpool_server/opencode_server/routes/session_routes.py +1276 -0
- agentpool_server/opencode_server/routes/tui_routes.py +139 -0
- agentpool_server/opencode_server/server.py +475 -0
- agentpool_server/opencode_server/state.py +151 -0
- agentpool_server/opencode_server/time_utils.py +8 -0
- agentpool_storage/__init__.py +12 -0
- agentpool_storage/base.py +184 -2
- agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
- agentpool_storage/claude_provider/__init__.py +42 -0
- agentpool_storage/claude_provider/provider.py +1089 -0
- agentpool_storage/file_provider.py +278 -15
- agentpool_storage/memory_provider.py +193 -12
- agentpool_storage/models.py +3 -0
- agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
- agentpool_storage/opencode_provider/__init__.py +16 -0
- agentpool_storage/opencode_provider/helpers.py +414 -0
- agentpool_storage/opencode_provider/provider.py +895 -0
- agentpool_storage/project_store.py +325 -0
- agentpool_storage/session_store.py +26 -6
- agentpool_storage/sql_provider/__init__.py +4 -2
- agentpool_storage/sql_provider/models.py +48 -0
- agentpool_storage/sql_provider/sql_provider.py +269 -3
- agentpool_storage/sql_provider/utils.py +12 -13
- agentpool_storage/zed_provider/__init__.py +16 -0
- agentpool_storage/zed_provider/helpers.py +281 -0
- agentpool_storage/zed_provider/models.py +130 -0
- agentpool_storage/zed_provider/provider.py +442 -0
- agentpool_storage/zed_provider.py +803 -0
- agentpool_toolsets/__init__.py +0 -2
- agentpool_toolsets/builtin/__init__.py +2 -12
- agentpool_toolsets/builtin/code.py +96 -57
- agentpool_toolsets/builtin/debug.py +118 -48
- agentpool_toolsets/builtin/execution_environment.py +115 -230
- agentpool_toolsets/builtin/file_edit/file_edit.py +115 -7
- agentpool_toolsets/builtin/skills.py +9 -4
- agentpool_toolsets/builtin/subagent_tools.py +64 -51
- agentpool_toolsets/builtin/workers.py +4 -2
- agentpool_toolsets/composio_toolset.py +2 -2
- agentpool_toolsets/entry_points.py +3 -1
- agentpool_toolsets/fsspec_toolset/__init__.py +13 -1
- agentpool_toolsets/fsspec_toolset/diagnostics.py +860 -73
- agentpool_toolsets/fsspec_toolset/grep.py +99 -7
- agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
- agentpool_toolsets/fsspec_toolset/image_utils.py +161 -0
- agentpool_toolsets/fsspec_toolset/toolset.py +500 -95
- agentpool_toolsets/mcp_discovery/__init__.py +5 -0
- agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
- agentpool_toolsets/mcp_discovery/toolset.py +511 -0
- agentpool_toolsets/mcp_run_toolset.py +87 -12
- agentpool_toolsets/notifications.py +33 -33
- agentpool_toolsets/openapi.py +3 -1
- agentpool_toolsets/search_toolset.py +3 -1
- agentpool-2.1.9.dist-info/RECORD +0 -474
- agentpool_config/resources.py +0 -33
- agentpool_server/acp_server/acp_tools.py +0 -43
- agentpool_server/acp_server/commands/spawn.py +0 -210
- agentpool_storage/text_log_provider.py +0 -275
- agentpool_toolsets/builtin/agent_management.py +0 -239
- agentpool_toolsets/builtin/chain.py +0 -288
- agentpool_toolsets/builtin/history.py +0 -36
- agentpool_toolsets/builtin/integration.py +0 -85
- agentpool_toolsets/builtin/tool_management.py +0 -90
- agentpool_toolsets/builtin/user_interaction.py +0 -52
- agentpool_toolsets/semantic_memory_toolset.py +0 -536
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
- {agentpool-2.1.9.dist-info → agentpool-2.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Session Forking in Claude Code Agent
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Claude Code SDK supports **session forking** - creating a new session that shares the conversation history of a parent session but gets its own session ID. This enables ephemeral queries that don't pollute the main conversation history.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
### Basic Fork (with parent still alive)
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
# Parent session is running
|
|
13
|
+
parent_session_id = "abc-123"
|
|
14
|
+
|
|
15
|
+
# Create fork with same context
|
|
16
|
+
options = ClaudeAgentOptions(
|
|
17
|
+
resume=parent_session_id, # Which session to fork from
|
|
18
|
+
fork_session=True # Create new ID instead of resuming same
|
|
19
|
+
)
|
|
20
|
+
fork_client = ClaudeSDKClient(options=options)
|
|
21
|
+
await fork_client.connect()
|
|
22
|
+
|
|
23
|
+
# Fork has parent's context but different session ID
|
|
24
|
+
await fork_client.query("What did we discuss?") # Knows parent's history
|
|
25
|
+
# Get response...
|
|
26
|
+
|
|
27
|
+
await fork_client.disconnect()
|
|
28
|
+
# Parent session remains unchanged
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Key Properties
|
|
32
|
+
|
|
33
|
+
1. **Parent stays alive** - No need to disconnect/reconnect parent session
|
|
34
|
+
2. **Context preserved** - Fork has full conversation history up to fork point
|
|
35
|
+
3. **Isolated changes** - Changes in fork don't affect parent
|
|
36
|
+
4. **Unique session ID** - Each fork gets its own session identifier
|
|
37
|
+
5. **Multiple forks** - Can create multiple concurrent forks from same parent
|
|
38
|
+
|
|
39
|
+
## Use Cases
|
|
40
|
+
|
|
41
|
+
### Ephemeral Queries
|
|
42
|
+
|
|
43
|
+
Execute one-off queries without adding to main conversation:
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
async def run(self, prompt, store_history=True):
|
|
47
|
+
if store_history:
|
|
48
|
+
# Normal - adds to history
|
|
49
|
+
await self.main_client.query(prompt)
|
|
50
|
+
else:
|
|
51
|
+
# Ephemeral - fork, query, discard
|
|
52
|
+
options = ClaudeAgentOptions(
|
|
53
|
+
resume=self.session_id,
|
|
54
|
+
fork_session=True
|
|
55
|
+
)
|
|
56
|
+
fork = ClaudeSDKClient(options=options)
|
|
57
|
+
await fork.connect()
|
|
58
|
+
result = await fork.query(prompt)
|
|
59
|
+
await fork.disconnect()
|
|
60
|
+
return result
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Subagent Spawning
|
|
64
|
+
|
|
65
|
+
Spawn a subagent that has access to current context:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
# Main agent has context: "The secret is XYZ"
|
|
69
|
+
options = ClaudeAgentOptions(
|
|
70
|
+
resume=main_session_id,
|
|
71
|
+
fork_session=True
|
|
72
|
+
)
|
|
73
|
+
subagent = ClaudeSDKClient(options=options)
|
|
74
|
+
await subagent.connect()
|
|
75
|
+
|
|
76
|
+
# Subagent knows the secret
|
|
77
|
+
await subagent.query("What was the secret?") # Knows "XYZ"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### A/B Testing
|
|
81
|
+
|
|
82
|
+
Try different approaches with same context:
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
# Fork for approach A
|
|
86
|
+
fork_a = create_fork(session_id)
|
|
87
|
+
await fork_a.query("Solve using recursion")
|
|
88
|
+
|
|
89
|
+
# Fork for approach B
|
|
90
|
+
fork_b = create_fork(session_id)
|
|
91
|
+
await fork_b.query("Solve using iteration")
|
|
92
|
+
|
|
93
|
+
# Compare results, parent unchanged
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Implementation Notes
|
|
97
|
+
|
|
98
|
+
### Successful Fork Requirements
|
|
99
|
+
|
|
100
|
+
Both parameters are required for forking:
|
|
101
|
+
- `resume`: Must specify the session ID to fork from
|
|
102
|
+
- `fork_session`: Must be `True`
|
|
103
|
+
|
|
104
|
+
Without `resume`, `fork_session=True` creates a fresh session (no context).
|
|
105
|
+
|
|
106
|
+
### Session ID Retrieval
|
|
107
|
+
|
|
108
|
+
Get session ID from `ResultMessage`:
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
async for msg in client.receive_messages():
|
|
112
|
+
if isinstance(msg, ResultMessage):
|
|
113
|
+
session_id = msg.session_id
|
|
114
|
+
break
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Concurrent Forks
|
|
118
|
+
|
|
119
|
+
Multiple forks can run simultaneously:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
# All forks share parent context but have unique session IDs
|
|
123
|
+
fork1 = create_fork(parent_id) # session: aaa-111
|
|
124
|
+
fork2 = create_fork(parent_id) # session: bbb-222
|
|
125
|
+
fork3 = create_fork(parent_id) # session: ccc-333
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Limitations
|
|
129
|
+
|
|
130
|
+
1. **Context is snapshot** - Fork gets parent's history at fork time, not live updates
|
|
131
|
+
2. **One-way isolation** - Fork changes don't affect parent, but parent changes don't reach fork
|
|
132
|
+
3. **Session persistence** - Parent session must exist (be saved/active) to fork from it
|
|
133
|
+
|
|
134
|
+
## Testing
|
|
135
|
+
|
|
136
|
+
See test files in project root:
|
|
137
|
+
- `test_fork_with_context.py` - Context preservation tests
|
|
138
|
+
- `test_resume_without_disconnect.py` - Concurrent forking tests
|
|
139
|
+
- `test_explicit_resume.py` - Explicit session resume tests
|
|
140
|
+
|
|
141
|
+
## Example: Complete Ephemeral Query
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
from claude_agent_sdk import ClaudeSDKClient
|
|
145
|
+
from claude_agent_sdk.types import ClaudeAgentOptions, ResultMessage, AssistantMessage
|
|
146
|
+
|
|
147
|
+
class ClaudeCodeAgent:
|
|
148
|
+
def __init__(self):
|
|
149
|
+
self.main_client = None
|
|
150
|
+
self.session_id = None
|
|
151
|
+
|
|
152
|
+
async def connect(self):
|
|
153
|
+
self.main_client = ClaudeSDKClient()
|
|
154
|
+
await self.main_client.connect()
|
|
155
|
+
# Capture session ID
|
|
156
|
+
await self.main_client.query("Ready")
|
|
157
|
+
async for msg in self.main_client.receive_messages():
|
|
158
|
+
if isinstance(msg, ResultMessage):
|
|
159
|
+
self.session_id = msg.session_id
|
|
160
|
+
break
|
|
161
|
+
|
|
162
|
+
async def ephemeral_query(self, prompt: str) -> str:
|
|
163
|
+
"""Execute query without affecting main conversation."""
|
|
164
|
+
options = ClaudeAgentOptions(
|
|
165
|
+
resume=self.session_id,
|
|
166
|
+
fork_session=True
|
|
167
|
+
)
|
|
168
|
+
fork = ClaudeSDKClient(options=options)
|
|
169
|
+
|
|
170
|
+
try:
|
|
171
|
+
await fork.connect()
|
|
172
|
+
await fork.query(prompt)
|
|
173
|
+
|
|
174
|
+
result = ""
|
|
175
|
+
async for msg in fork.receive_messages():
|
|
176
|
+
if isinstance(msg, AssistantMessage):
|
|
177
|
+
for block in msg.content:
|
|
178
|
+
if hasattr(block, 'text'):
|
|
179
|
+
result += block.text
|
|
180
|
+
if isinstance(msg, ResultMessage):
|
|
181
|
+
break
|
|
182
|
+
|
|
183
|
+
return result
|
|
184
|
+
finally:
|
|
185
|
+
await fork.disconnect()
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Related
|
|
189
|
+
|
|
190
|
+
- [Claude Agent SDK Documentation](https://docs.anthropic.com/en/api/claude-agent-sdk)
|
|
191
|
+
- ACP `session/fork` RFD (protocol-level forking)
|
|
@@ -7,5 +7,17 @@ ClaudeSDKClient for native integration with agentpool.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
from agentpool.agents.claude_code_agent.claude_code_agent import ClaudeCodeAgent
|
|
10
|
+
from agentpool.agents.claude_code_agent.models import (
|
|
11
|
+
ClaudeCodeAccountInfo,
|
|
12
|
+
ClaudeCodeCommandInfo,
|
|
13
|
+
ClaudeCodeModelInfo,
|
|
14
|
+
ClaudeCodeServerInfo,
|
|
15
|
+
)
|
|
10
16
|
|
|
11
|
-
__all__ = [
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ClaudeCodeAccountInfo",
|
|
19
|
+
"ClaudeCodeAgent",
|
|
20
|
+
"ClaudeCodeCommandInfo",
|
|
21
|
+
"ClaudeCodeModelInfo",
|
|
22
|
+
"ClaudeCodeServerInfo",
|
|
23
|
+
]
|