claude-agent-sdk 0.1.2__tar.gz → 0.1.3__tar.gz
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.
Potentially problematic release.
This version of claude-agent-sdk might be problematic. Click here for more details.
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/PKG-INFO +1 -1
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/pyproject.toml +1 -1
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/__init__.py +17 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/query.py +22 -1
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_version.py +1 -1
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/types.py +120 -14
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_tool_callbacks.py +74 -8
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/.gitignore +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/LICENSE +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/README.md +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_errors.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/__init__.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/client.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/message_parser.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/transport/__init__.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/transport/subprocess_cli.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/client.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/py.typed +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/query.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/conftest.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_changelog.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_client.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_errors.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_integration.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_message_parser.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_sdk_mcp_integration.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_streaming_client.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_subprocess_buffering.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_transport.py +0 -0
- {claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/tests/test_types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-agent-sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Python SDK for Claude Code
|
|
5
5
|
Project-URL: Homepage, https://github.com/anthropics/claude-agent-sdk-python
|
|
6
6
|
Project-URL: Documentation, https://docs.anthropic.com/en/docs/claude-code/sdk
|
|
@@ -18,11 +18,13 @@ from .query import query
|
|
|
18
18
|
from .types import (
|
|
19
19
|
AgentDefinition,
|
|
20
20
|
AssistantMessage,
|
|
21
|
+
BaseHookInput,
|
|
21
22
|
CanUseTool,
|
|
22
23
|
ClaudeAgentOptions,
|
|
23
24
|
ContentBlock,
|
|
24
25
|
HookCallback,
|
|
25
26
|
HookContext,
|
|
27
|
+
HookInput,
|
|
26
28
|
HookJSONOutput,
|
|
27
29
|
HookMatcher,
|
|
28
30
|
McpSdkServerConfig,
|
|
@@ -33,8 +35,13 @@ from .types import (
|
|
|
33
35
|
PermissionResultAllow,
|
|
34
36
|
PermissionResultDeny,
|
|
35
37
|
PermissionUpdate,
|
|
38
|
+
PostToolUseHookInput,
|
|
39
|
+
PreCompactHookInput,
|
|
40
|
+
PreToolUseHookInput,
|
|
36
41
|
ResultMessage,
|
|
37
42
|
SettingSource,
|
|
43
|
+
StopHookInput,
|
|
44
|
+
SubagentStopHookInput,
|
|
38
45
|
SystemMessage,
|
|
39
46
|
TextBlock,
|
|
40
47
|
ThinkingBlock,
|
|
@@ -42,6 +49,7 @@ from .types import (
|
|
|
42
49
|
ToolResultBlock,
|
|
43
50
|
ToolUseBlock,
|
|
44
51
|
UserMessage,
|
|
52
|
+
UserPromptSubmitHookInput,
|
|
45
53
|
)
|
|
46
54
|
|
|
47
55
|
# MCP Server Support
|
|
@@ -307,8 +315,17 @@ __all__ = [
|
|
|
307
315
|
"PermissionResultAllow",
|
|
308
316
|
"PermissionResultDeny",
|
|
309
317
|
"PermissionUpdate",
|
|
318
|
+
# Hook support
|
|
310
319
|
"HookCallback",
|
|
311
320
|
"HookContext",
|
|
321
|
+
"HookInput",
|
|
322
|
+
"BaseHookInput",
|
|
323
|
+
"PreToolUseHookInput",
|
|
324
|
+
"PostToolUseHookInput",
|
|
325
|
+
"UserPromptSubmitHookInput",
|
|
326
|
+
"StopHookInput",
|
|
327
|
+
"SubagentStopHookInput",
|
|
328
|
+
"PreCompactHookInput",
|
|
312
329
|
"HookJSONOutput",
|
|
313
330
|
"HookMatcher",
|
|
314
331
|
# Agent support
|
|
@@ -31,6 +31,25 @@ if TYPE_CHECKING:
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def _convert_hook_output_for_cli(hook_output: dict[str, Any]) -> dict[str, Any]:
|
|
35
|
+
"""Convert Python-safe field names to CLI-expected field names.
|
|
36
|
+
|
|
37
|
+
The Python SDK uses `async_` and `continue_` to avoid keyword conflicts,
|
|
38
|
+
but the CLI expects `async` and `continue`. This function performs the
|
|
39
|
+
necessary conversion.
|
|
40
|
+
"""
|
|
41
|
+
converted = {}
|
|
42
|
+
for key, value in hook_output.items():
|
|
43
|
+
# Convert Python-safe names to JavaScript names
|
|
44
|
+
if key == "async_":
|
|
45
|
+
converted["async"] = value
|
|
46
|
+
elif key == "continue_":
|
|
47
|
+
converted["continue"] = value
|
|
48
|
+
else:
|
|
49
|
+
converted[key] = value
|
|
50
|
+
return converted
|
|
51
|
+
|
|
52
|
+
|
|
34
53
|
class Query:
|
|
35
54
|
"""Handles bidirectional control protocol on top of Transport.
|
|
36
55
|
|
|
@@ -244,11 +263,13 @@ class Query:
|
|
|
244
263
|
if not callback:
|
|
245
264
|
raise Exception(f"No hook callback found for ID: {callback_id}")
|
|
246
265
|
|
|
247
|
-
|
|
266
|
+
hook_output = await callback(
|
|
248
267
|
request_data.get("input"),
|
|
249
268
|
request_data.get("tool_use_id"),
|
|
250
269
|
{"signal": None}, # TODO: Add abort signal support
|
|
251
270
|
)
|
|
271
|
+
# Convert Python-safe field names (async_, continue_) to CLI-expected names (async, continue)
|
|
272
|
+
response_data = _convert_hook_output_for_cli(hook_output)
|
|
252
273
|
|
|
253
274
|
elif subtype == "mcp_message":
|
|
254
275
|
# Handle SDK MCP request
|
|
@@ -157,6 +157,73 @@ HookEvent = (
|
|
|
157
157
|
)
|
|
158
158
|
|
|
159
159
|
|
|
160
|
+
# Hook input types - strongly typed for each hook event
|
|
161
|
+
class BaseHookInput(TypedDict):
|
|
162
|
+
"""Base hook input fields present across many hook events."""
|
|
163
|
+
|
|
164
|
+
session_id: str
|
|
165
|
+
transcript_path: str
|
|
166
|
+
cwd: str
|
|
167
|
+
permission_mode: NotRequired[str]
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class PreToolUseHookInput(BaseHookInput):
|
|
171
|
+
"""Input data for PreToolUse hook events."""
|
|
172
|
+
|
|
173
|
+
hook_event_name: Literal["PreToolUse"]
|
|
174
|
+
tool_name: str
|
|
175
|
+
tool_input: dict[str, Any]
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class PostToolUseHookInput(BaseHookInput):
|
|
179
|
+
"""Input data for PostToolUse hook events."""
|
|
180
|
+
|
|
181
|
+
hook_event_name: Literal["PostToolUse"]
|
|
182
|
+
tool_name: str
|
|
183
|
+
tool_input: dict[str, Any]
|
|
184
|
+
tool_response: Any
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class UserPromptSubmitHookInput(BaseHookInput):
|
|
188
|
+
"""Input data for UserPromptSubmit hook events."""
|
|
189
|
+
|
|
190
|
+
hook_event_name: Literal["UserPromptSubmit"]
|
|
191
|
+
prompt: str
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class StopHookInput(BaseHookInput):
|
|
195
|
+
"""Input data for Stop hook events."""
|
|
196
|
+
|
|
197
|
+
hook_event_name: Literal["Stop"]
|
|
198
|
+
stop_hook_active: bool
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class SubagentStopHookInput(BaseHookInput):
|
|
202
|
+
"""Input data for SubagentStop hook events."""
|
|
203
|
+
|
|
204
|
+
hook_event_name: Literal["SubagentStop"]
|
|
205
|
+
stop_hook_active: bool
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class PreCompactHookInput(BaseHookInput):
|
|
209
|
+
"""Input data for PreCompact hook events."""
|
|
210
|
+
|
|
211
|
+
hook_event_name: Literal["PreCompact"]
|
|
212
|
+
trigger: Literal["manual", "auto"]
|
|
213
|
+
custom_instructions: str | None
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# Union type for all hook inputs
|
|
217
|
+
HookInput = (
|
|
218
|
+
PreToolUseHookInput
|
|
219
|
+
| PostToolUseHookInput
|
|
220
|
+
| UserPromptSubmitHookInput
|
|
221
|
+
| StopHookInput
|
|
222
|
+
| SubagentStopHookInput
|
|
223
|
+
| PreCompactHookInput
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
160
227
|
# Hook-specific output types
|
|
161
228
|
class PreToolUseHookSpecificOutput(TypedDict):
|
|
162
229
|
"""Hook-specific output for PreToolUse events."""
|
|
@@ -198,18 +265,56 @@ HookSpecificOutput = (
|
|
|
198
265
|
|
|
199
266
|
# See https://docs.anthropic.com/en/docs/claude-code/hooks#advanced%3A-json-output
|
|
200
267
|
# for documentation of the output types.
|
|
268
|
+
#
|
|
269
|
+
# IMPORTANT: The Python SDK uses `async_` and `continue_` (with underscores) to avoid
|
|
270
|
+
# Python keyword conflicts. These fields are automatically converted to `async` and
|
|
271
|
+
# `continue` when sent to the CLI. You should use the underscore versions in your
|
|
272
|
+
# Python code.
|
|
201
273
|
class AsyncHookJSONOutput(TypedDict):
|
|
202
|
-
"""Async hook output that defers hook execution.
|
|
274
|
+
"""Async hook output that defers hook execution.
|
|
203
275
|
|
|
204
|
-
|
|
276
|
+
Fields:
|
|
277
|
+
async_: Set to True to defer hook execution. Note: This is converted to
|
|
278
|
+
"async" when sent to the CLI - use "async_" in your Python code.
|
|
279
|
+
asyncTimeout: Optional timeout in milliseconds for the async operation.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
async_: Literal[
|
|
283
|
+
True
|
|
284
|
+
] # Using async_ to avoid Python keyword (converted to "async" for CLI)
|
|
205
285
|
asyncTimeout: NotRequired[int]
|
|
206
286
|
|
|
207
287
|
|
|
208
288
|
class SyncHookJSONOutput(TypedDict):
|
|
209
|
-
"""Synchronous hook output with control and decision fields.
|
|
289
|
+
"""Synchronous hook output with control and decision fields.
|
|
290
|
+
|
|
291
|
+
This defines the structure for hook callbacks to control execution and provide
|
|
292
|
+
feedback to Claude.
|
|
293
|
+
|
|
294
|
+
Common Control Fields:
|
|
295
|
+
continue_: Whether Claude should proceed after hook execution (default: True).
|
|
296
|
+
Note: This is converted to "continue" when sent to the CLI.
|
|
297
|
+
suppressOutput: Hide stdout from transcript mode (default: False).
|
|
298
|
+
stopReason: Message shown when continue is False.
|
|
299
|
+
|
|
300
|
+
Decision Fields:
|
|
301
|
+
decision: Set to "block" to indicate blocking behavior.
|
|
302
|
+
systemMessage: Warning message displayed to the user.
|
|
303
|
+
reason: Feedback message for Claude about the decision.
|
|
304
|
+
|
|
305
|
+
Hook-Specific Output:
|
|
306
|
+
hookSpecificOutput: Event-specific controls (e.g., permissionDecision for
|
|
307
|
+
PreToolUse, additionalContext for PostToolUse).
|
|
308
|
+
|
|
309
|
+
Note: The CLI documentation shows field names without underscores ("async", "continue"),
|
|
310
|
+
but Python code should use the underscore versions ("async_", "continue_") as they
|
|
311
|
+
are automatically converted.
|
|
312
|
+
"""
|
|
210
313
|
|
|
211
314
|
# Common control fields
|
|
212
|
-
continue_: NotRequired[
|
|
315
|
+
continue_: NotRequired[
|
|
316
|
+
bool
|
|
317
|
+
] # Using continue_ to avoid Python keyword (converted to "continue" for CLI)
|
|
213
318
|
suppressOutput: NotRequired[bool]
|
|
214
319
|
stopReason: NotRequired[str]
|
|
215
320
|
|
|
@@ -227,21 +332,22 @@ class SyncHookJSONOutput(TypedDict):
|
|
|
227
332
|
HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput
|
|
228
333
|
|
|
229
334
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"""Context information for hook callbacks."""
|
|
335
|
+
class HookContext(TypedDict):
|
|
336
|
+
"""Context information for hook callbacks.
|
|
233
337
|
|
|
234
|
-
|
|
338
|
+
Fields:
|
|
339
|
+
signal: Reserved for future abort signal support. Currently always None.
|
|
340
|
+
"""
|
|
341
|
+
|
|
342
|
+
signal: Any | None # Future: abort signal support
|
|
235
343
|
|
|
236
344
|
|
|
237
345
|
HookCallback = Callable[
|
|
238
346
|
# HookCallback input parameters:
|
|
239
|
-
# - input
|
|
240
|
-
#
|
|
241
|
-
#
|
|
242
|
-
|
|
243
|
-
# - context
|
|
244
|
-
[dict[str, Any], str | None, HookContext],
|
|
347
|
+
# - input: Strongly-typed hook input with discriminated unions based on hook_event_name
|
|
348
|
+
# - tool_use_id: Optional tool use identifier
|
|
349
|
+
# - context: Hook context with abort signal support (currently placeholder)
|
|
350
|
+
[HookInput, str | None, HookContext],
|
|
245
351
|
Awaitable[HookJSONOutput],
|
|
246
352
|
]
|
|
247
353
|
|
|
@@ -7,6 +7,7 @@ import pytest
|
|
|
7
7
|
from claude_agent_sdk import (
|
|
8
8
|
ClaudeAgentOptions,
|
|
9
9
|
HookContext,
|
|
10
|
+
HookInput,
|
|
10
11
|
HookJSONOutput,
|
|
11
12
|
HookMatcher,
|
|
12
13
|
PermissionResultAllow,
|
|
@@ -216,7 +217,7 @@ class TestHookCallbacks:
|
|
|
216
217
|
hook_calls = []
|
|
217
218
|
|
|
218
219
|
async def test_hook(
|
|
219
|
-
input_data:
|
|
220
|
+
input_data: HookInput, tool_use_id: str | None, context: HookContext
|
|
220
221
|
) -> dict:
|
|
221
222
|
hook_calls.append({"input": input_data, "tool_use_id": tool_use_id})
|
|
222
223
|
return {"processed": True}
|
|
@@ -266,7 +267,7 @@ class TestHookCallbacks:
|
|
|
266
267
|
|
|
267
268
|
# Test all SyncHookJSONOutput fields together
|
|
268
269
|
async def comprehensive_hook(
|
|
269
|
-
input_data:
|
|
270
|
+
input_data: HookInput, tool_use_id: str | None, context: HookContext
|
|
270
271
|
) -> HookJSONOutput:
|
|
271
272
|
return {
|
|
272
273
|
# Control fields
|
|
@@ -322,8 +323,11 @@ class TestHookCallbacks:
|
|
|
322
323
|
# The hook result is nested at response.response
|
|
323
324
|
result = response_data["response"]["response"]
|
|
324
325
|
|
|
325
|
-
# Verify control fields are present
|
|
326
|
-
assert result.get("
|
|
326
|
+
# Verify control fields are present and converted to CLI format
|
|
327
|
+
assert result.get("continue") is True, (
|
|
328
|
+
"continue_ should be converted to continue"
|
|
329
|
+
)
|
|
330
|
+
assert "continue_" not in result, "continue_ should not appear in CLI output"
|
|
327
331
|
assert result.get("suppressOutput") is False
|
|
328
332
|
assert result.get("stopReason") == "Test stop reason"
|
|
329
333
|
|
|
@@ -346,7 +350,7 @@ class TestHookCallbacks:
|
|
|
346
350
|
"""Test AsyncHookJSONOutput type with proper async fields."""
|
|
347
351
|
|
|
348
352
|
async def async_hook(
|
|
349
|
-
input_data:
|
|
353
|
+
input_data: HookInput, tool_use_id: str | None, context: HookContext
|
|
350
354
|
) -> HookJSONOutput:
|
|
351
355
|
# Test that async hooks properly use async_ and asyncTimeout fields
|
|
352
356
|
return {
|
|
@@ -386,10 +390,72 @@ class TestHookCallbacks:
|
|
|
386
390
|
# The hook result is nested at response.response
|
|
387
391
|
result = response_data["response"]["response"]
|
|
388
392
|
|
|
389
|
-
# The SDK should
|
|
390
|
-
assert result.get("
|
|
393
|
+
# The SDK should convert async_ to "async" for CLI compatibility
|
|
394
|
+
assert result.get("async") is True, "async_ should be converted to async"
|
|
395
|
+
assert "async_" not in result, "async_ should not appear in CLI output"
|
|
391
396
|
assert result.get("asyncTimeout") == 5000
|
|
392
397
|
|
|
398
|
+
@pytest.mark.asyncio
|
|
399
|
+
async def test_field_name_conversion(self):
|
|
400
|
+
"""Test that Python-safe field names (async_, continue_) are converted to CLI format (async, continue)."""
|
|
401
|
+
|
|
402
|
+
async def conversion_test_hook(
|
|
403
|
+
input_data: HookInput, tool_use_id: str | None, context: HookContext
|
|
404
|
+
) -> HookJSONOutput:
|
|
405
|
+
# Return both async_ and continue_ to test conversion
|
|
406
|
+
return {
|
|
407
|
+
"async_": True,
|
|
408
|
+
"asyncTimeout": 10000,
|
|
409
|
+
"continue_": False,
|
|
410
|
+
"stopReason": "Testing field conversion",
|
|
411
|
+
"systemMessage": "Fields should be converted",
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
transport = MockTransport()
|
|
415
|
+
hooks = {"PreToolUse": [{"matcher": None, "hooks": [conversion_test_hook]}]}
|
|
416
|
+
|
|
417
|
+
query = Query(
|
|
418
|
+
transport=transport, is_streaming_mode=True, can_use_tool=None, hooks=hooks
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
callback_id = "test_conversion"
|
|
422
|
+
query.hook_callbacks[callback_id] = conversion_test_hook
|
|
423
|
+
|
|
424
|
+
request = {
|
|
425
|
+
"type": "control_request",
|
|
426
|
+
"request_id": "test-conversion",
|
|
427
|
+
"request": {
|
|
428
|
+
"subtype": "hook_callback",
|
|
429
|
+
"callback_id": callback_id,
|
|
430
|
+
"input": {"test": "data"},
|
|
431
|
+
"tool_use_id": None,
|
|
432
|
+
},
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
await query._handle_control_request(request)
|
|
436
|
+
|
|
437
|
+
# Check response has converted field names
|
|
438
|
+
assert len(transport.written_messages) > 0
|
|
439
|
+
last_response = transport.written_messages[-1]
|
|
440
|
+
|
|
441
|
+
response_data = json.loads(last_response)
|
|
442
|
+
result = response_data["response"]["response"]
|
|
443
|
+
|
|
444
|
+
# Verify async_ was converted to async
|
|
445
|
+
assert result.get("async") is True, "async_ should be converted to async"
|
|
446
|
+
assert "async_" not in result, "async_ should not appear in output"
|
|
447
|
+
|
|
448
|
+
# Verify continue_ was converted to continue
|
|
449
|
+
assert result.get("continue") is False, (
|
|
450
|
+
"continue_ should be converted to continue"
|
|
451
|
+
)
|
|
452
|
+
assert "continue_" not in result, "continue_ should not appear in output"
|
|
453
|
+
|
|
454
|
+
# Verify other fields are unchanged
|
|
455
|
+
assert result.get("asyncTimeout") == 10000
|
|
456
|
+
assert result.get("stopReason") == "Testing field conversion"
|
|
457
|
+
assert result.get("systemMessage") == "Fields should be converted"
|
|
458
|
+
|
|
393
459
|
|
|
394
460
|
class TestClaudeAgentOptionsIntegration:
|
|
395
461
|
"""Test that callbacks work through ClaudeAgentOptions."""
|
|
@@ -403,7 +469,7 @@ class TestClaudeAgentOptionsIntegration:
|
|
|
403
469
|
return PermissionResultAllow()
|
|
404
470
|
|
|
405
471
|
async def my_hook(
|
|
406
|
-
input_data:
|
|
472
|
+
input_data: HookInput, tool_use_id: str | None, context: HookContext
|
|
407
473
|
) -> dict:
|
|
408
474
|
return {}
|
|
409
475
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_agent_sdk-0.1.2 → claude_agent_sdk-0.1.3}/src/claude_agent_sdk/_internal/message_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|