@@ -12,7 +12,7 @@ import (
1212 "sync"
1313 "time"
1414
15- "github.com/google/renameio/v2"
15+ "github.com/google/renameio/v2/maybe "
1616)
1717
1818// Sandbox is a single tracked MCP-managed sandbox.
@@ -142,9 +142,10 @@ func (s *State) SetStatus(name, status string) {
142142 s .update (name , func (sb * Sandbox ) { sb .Status = status })
143143}
144144
145- // Save persists state atomically via renameio: a crash mid-save leaves either
146- // the previous contents or the new contents, never zero-length. On-disk
147- // sandbox order is non-deterministic across saves (map iteration order).
145+ // Save persists state via renameio's maybe.WriteFile: atomic on Unix (a crash
146+ // mid-save leaves either the previous or new contents, never zero-length) and
147+ // best-effort on Windows. On-disk sandbox order is non-deterministic across
148+ // saves (map iteration order).
148149func (s * State ) Save () error {
149150 s .mu .RLock ()
150151 data := stateData {Sandboxes : slices .Collect (maps .Values (s .sandboxes ))}
@@ -158,7 +159,7 @@ func (s *State) Save() error {
158159 return fmt .Errorf ("create state dir: %w" , err )
159160 }
160161
161- if err := renameio .WriteFile (s .path , b , 0o600 ); err != nil {
162+ if err := maybe .WriteFile (s .path , b , 0o600 ); err != nil {
162163 return fmt .Errorf ("write state: %w" , err )
163164 }
164165 return nil
0 commit comments