Commit a735d4e
Fix script mutation tools retrying and failing after domain reload (#796)
* Fix script edit tools retrying non-idempotent commands during reload
When Unity enters domain reload after a script edit, the retry loop in
send_command_with_retry would re-send the identical edit command up to
40 times, duplicating insert_method/anchor_insert edits. Pass
retry_on_reload=False on all script-mutating send calls since the edit
lands on disk before the reload triggers.
Also fix _flip_async coroutine in apply_text_edits that was passed as a
threading.Thread target — the coroutine was never awaited. Replace with
asyncio.create_task so the sentinel reload flip actually executes.
Fixes #790
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add post-mutation wait-for-ready and reloading-rejection retry
Script-mutating tools (create_script, delete_script, apply_text_edits,
script_apply_edits) use retry_on_reload=False to avoid re-sending
non-idempotent commands during domain reload. But this meant they
returned before Unity finished reloading, causing the next tool call
to timeout.
This commit:
- Extracts wait_for_editor_ready() helper from refresh_unity.py that
polls editor_state until Unity reports ready_for_tools
- Adds is_reloading_rejection() to detect when Unity rejected a command
due to stale reloading state (safe to retry since command never ran)
- Calls both at all 9 mutation sites (4 in manage_script, 5 in
script_apply_edits): retry on rejection, then wait for readiness
- Adds 9 unit tests for the new helpers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix stale socket causing mutations to silently fail after domain reload
UnityConnection reuses TCP sockets across commands. After domain reload
kills Unity TCP listener, the Python side still holds the dead socket.
With retry_on_reload=False (used for non-idempotent mutations), there are
no retries to recover -- the command is never delivered to Unity.
- Add _ensure_live_connection() to detect dead sockets via non-blocking
MSG_PEEK before each send, allowing reconnection
- Add is_connection_lost_after_send() helper and post-mutation verification
at all 9 mutation sites (create/delete/apply_text_edits/script_apply_edits)
to recover when domain reload drops the TCP response
- Fix stale reloading heartbeat in C# bridge: write reloading=false at
Start() entry and after retry exhaustion in StdioBridgeReloadHandler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Extract send_mutation() and verify_edit_by_sha() shared helpers
Consolidates the repeated retry+wait+verify pattern from 9 inline
sites across manage_script.py and script_apply_edits.py into a
single send_mutation() helper in refresh_unity.py. Addresses
Sourcery code review feedback on PR #796.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>1 parent 63bb2ef commit a735d4e
7 files changed
Lines changed: 533 additions & 107 deletions
File tree
- MCPForUnity/Editor/Services
- Transport/Transports
- Server
- src
- services/tools
- transport/legacy
- tests/integration
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
194 | 199 | | |
195 | 200 | | |
196 | 201 | | |
| |||
Lines changed: 7 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
269 | 269 | | |
270 | 270 | | |
271 | 271 | | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
272 | 278 | | |
273 | 279 | | |
274 | 280 | | |
| |||
320 | 326 | | |
321 | 327 | | |
322 | 328 | | |
| 329 | + | |
323 | 330 | | |
324 | 331 | | |
325 | 332 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
324 | 325 | | |
325 | 326 | | |
326 | 327 | | |
327 | | - | |
328 | | - | |
329 | | - | |
330 | | - | |
331 | | - | |
332 | | - | |
333 | | - | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
334 | 335 | | |
335 | 336 | | |
336 | 337 | | |
| |||
423 | 424 | | |
424 | 425 | | |
425 | 426 | | |
426 | | - | |
427 | | - | |
428 | | - | |
429 | | - | |
430 | | - | |
431 | | - | |
432 | | - | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
433 | 439 | | |
434 | 440 | | |
435 | 441 | | |
| |||
453 | 459 | | |
454 | 460 | | |
455 | 461 | | |
456 | | - | |
457 | | - | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
463 | 474 | | |
464 | 475 | | |
465 | 476 | | |
| |||
553 | 564 | | |
554 | 565 | | |
555 | 566 | | |
556 | | - | |
557 | | - | |
558 | | - | |
559 | | - | |
560 | | - | |
561 | | - | |
562 | | - | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
563 | 589 | | |
564 | 590 | | |
565 | 591 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
| 7 | + | |
6 | 8 | | |
7 | 9 | | |
8 | 10 | | |
| |||
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
15 | | - | |
| 17 | + | |
| 18 | + | |
16 | 19 | | |
17 | 20 | | |
18 | 21 | | |
19 | 22 | | |
20 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
21 | 167 | | |
22 | 168 | | |
23 | 169 | | |
| |||
49 | 195 | | |
50 | 196 | | |
51 | 197 | | |
52 | | - | |
| 198 | + | |
53 | 199 | | |
54 | 200 | | |
55 | 201 | | |
| |||
98 | 244 | | |
99 | 245 | | |
100 | 246 | | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
| 247 | + | |
128 | 248 | | |
129 | 249 | | |
130 | 250 | | |
131 | | - | |
| 251 | + | |
132 | 252 | | |
133 | 253 | | |
134 | | - | |
135 | | - | |
| 254 | + | |
| 255 | + | |
136 | 256 | | |
137 | 257 | | |
138 | 258 | | |
| |||
0 commit comments