diff --git a/.gitignore b/.gitignore index 6e3390e3a..7d851b760 100644 --- a/.gitignore +++ b/.gitignore @@ -146,4 +146,8 @@ data/ sessions/ backups/ uploads/ -config/mcp.json \ No newline at end of file +config/mcp.json +# Local env backups (ignored) +.env.bak +.env.bak2 +.env.kai diff --git a/src/claude/sdk_integration.py b/src/claude/sdk_integration.py index 5a95f16da..dce9fdd74 100644 --- a/src/claude/sdk_integration.py +++ b/src/claude/sdk_integration.py @@ -309,11 +309,15 @@ def _stderr_callback(line: str) -> None: path=str(claude_md_path), ) - # When DISABLE_TOOL_VALIDATION=true, pass None for allowed/disallowed - # tools so the SDK does not restrict tool usage (e.g. MCP tools). + # When DISABLE_TOOL_VALIDATION=true, pass [] (not None) for + # allowed/disallowed tools. claude-agent-sdk subprocess_cli.py + # calls list(options.allowed_tools) unconditionally and crashes + # with "'NoneType' object is not iterable". Empty list is treated + # by the CLI as "no --allowedTools flag" → no restriction, which + # is the intent of DISABLE_TOOL_VALIDATION=true. if self.config.disable_tool_validation: - sdk_allowed_tools = None - sdk_disallowed_tools = None + sdk_allowed_tools = [] + sdk_disallowed_tools = [] else: sdk_allowed_tools = self.config.claude_allowed_tools sdk_disallowed_tools = self.config.claude_disallowed_tools