Strip BOM before matching (LLM won't include invisible BOM in oldText), restore on write. Based on #394 by @prathamdby
- Extract diff computation from edit.ts into shared edit-diff.ts - ToolExecutionComponent computes and caches diff when args are complete - Diff is visible while permission hooks block, before tool executes