"""21: Sandbox settings on a host WITHOUT bubblewrap: failIfUnavailable=True stops the run with a clear error result; failIfUnavailable=False falls back with a warning you can capture through the stderr callback.""" import asyncio from claude_agent_sdk import ClaudeAgentOptions, ResultError, ResultMessage, query from demo_util import PROJECT async def run(label, sandbox): print(f"\n=== {label} ===") stderr_lines = [] try: async for m in query( prompt="Run `echo sandbox-test` with bash and reply with its output only.", options=ClaudeAgentOptions(cwd=PROJECT, allowed_tools=["Bash"], max_turns=3, sandbox=sandbox, stderr=stderr_lines.append), ): if isinstance(m, ResultMessage): print(f"result: subtype={m.subtype} terminal_reason={m.terminal_reason!r} errors={m.errors}") if m.result: print(f"result text: {m.result!r}") except ResultError as e: print(f"ResultError raised: {e}") sandbox_lines = [l for l in stderr_lines if "sandbox" in l.lower()] print(f"stderr lines mentioning sandbox ({len(sandbox_lines)}):") for l in sandbox_lines[:4]: print(" ", l.strip()[:160]) async def main(): await run("sandbox enabled, failIfUnavailable=True", {"enabled": True, "autoAllowBashIfSandboxed": True, "failIfUnavailable": True}) await run("sandbox enabled, failIfUnavailable=False (fall back unsandboxed, warn)", {"enabled": True, "autoAllowBashIfSandboxed": True, "failIfUnavailable": False}) asyncio.run(main())