Description
When a PreToolUse Python hook callback returns updatedInput for AskUserQuestion, the updated input is not reflected in the tool result that Claude sees. Claude continues as if no answer was provided.
Steps to Reproduce
async def ask_hook(hook_input, tool_use_id, hook_context):
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"updatedInput": {"answer": "Jeremy"}, # This is ignored
}
}
options = ClaudeAgentOptions(
permission_mode="bypassPermissions",
cli_path="/home/tester/.local/bin/claude",
hooks={
"PreToolUse": [HookMatcher(matcher="AskUserQuestion", hooks=[ask_hook])],
},
)
async for msg in query(prompt="Ask my name with AskUserQuestion, then greet me", options=options):
if isinstance(msg, ResultMessage):
print(msg.result)
# Output: "It seems your answer didn't come through clearly!"
# Expected: "Hello, Jeremy!"
Expected Behavior
updatedInput: {"answer": "Jeremy"} should replace the AskUserQuestion tool input, and Claude should see the answer in the tool result.
Workaround
Use permissionDecision: "deny" with the answer in permissionDecisionReason:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "The user has already provided their answer: Jeremy",
}
}
Claude reads the denial reason and uses the answer correctly.
Environment
- claude-agent-sdk: 0.1.51
- Claude CLI: 2.1.86
- Python: 3.12
- OS: Linux (Docker)
Description
When a PreToolUse Python hook callback returns
updatedInputfor AskUserQuestion, the updated input is not reflected in the tool result that Claude sees. Claude continues as if no answer was provided.Steps to Reproduce
Expected Behavior
updatedInput: {"answer": "Jeremy"}should replace the AskUserQuestion tool input, and Claude should see the answer in the tool result.Workaround
Use
permissionDecision: "deny"with the answer inpermissionDecisionReason:Claude reads the denial reason and uses the answer correctly.
Environment