import asyncio, os, sys, json
from pathlib import Path
from claude_agent_sdk import AssistantMessage, ToolUseBlock, ToolResultBlock, ClaudeSDKClient, ClaudeAgentOptions, UserMessage
W = Path(sys.argv[1]).resolve(); W.mkdir(parents=True, exist_ok=True)
(W/'target.txt').write_text('orig\n'); os.symlink('target.txt', W/'link.txt')
(W/'hard-a.txt').write_text('orig\n'); os.link(W/'hard-a.txt', W/'hard-b.txt')
def show(t): print(t, '| target=%r link_is_symlink=%s hard-a=%r hard-b=%r' % ((W/'target.txt').read_text(), (W/'link.txt').is_symlink(), (W/'hard-a.txt').read_text(), (W/'hard-b.txt').read_text()))
P = "Use the Edit tool (not Bash) to change the text 'orig' to 'CHANGED' in link.txt, then do the same in hard-b.txt. Read each file first if needed. Reply done."
async def main():
    show('before')
    o = ClaudeAgentOptions(cwd=str(W), enable_file_checkpointing=True, permission_mode='bypassPermissions', setting_sources=[], extra_args={'replay-user-messages': None,'strict-mcp-config':None}, max_turns=15)
    ids=[]
    async with ClaudeSDKClient(o) as c:
        await c.query(P)
        async for m in c.receive_response():
            if isinstance(m, UserMessage) and m.uuid: ids.append(m.uuid)
            if isinstance(m, (AssistantMessage, UserMessage)) and isinstance(m.content, list):
                for b in m.content:
                    if isinstance(b, ToolUseBlock): print('TOOL', b.name, json.dumps(b.input)[:100])
                    if isinstance(b, ToolResultBlock): print('  RESULT', str(b.content)[:100])
        show('after')
        await c.rewind_files(ids[0])
    show('rewound')
asyncio.run(main())
