HERMES-GIELIE/api
wangyichen 17f2d898f3 fix: retry os.replace() on Windows WinError 5 (PermissionError)
Windows locks session JSON files briefly during antivirus scans or
browser polling, causing os.replace() to raise WinError 5
(ERROR_ACCESS_DENIED). Add _safe_replace() helper that retries with
exponential backoff (50ms to 800ms, max 5 attempts) on PermissionError.
No-op on non-Windows platforms.

Replaces all 5 os.replace() call sites in models.py:
- Session.save() (main file + backup)
- _write_session_index() (full rebuild + fast path)
- prune_session_from_index()
2026-06-29 17:53:41 +00:00
..
__init__.py
agent_health.py fix(agent_health): read cross-container gateway runtime status from gateway_state.json (#5065) 2026-06-27 19:54:50 +00:00
agent_sessions.py fix(sidebar): restrict cron pre-aggregation to missing-index scans 2026-06-26 03:06:40 +00:00
auth.py fix(#5022): keep corrupt auth state from bricking startup 2026-06-27 01:58:40 +00:00
background.py
background_process.py fix(#4912): deliver async_delegation completions to the parent chat 2026-06-25 11:38:02 +00:00
clarify.py stage #4524: clarify 409-terminal (id-guarded, loading-cleared) + SSE-notify on expiry (#4504) + v0.51.534 CHANGELOG 2026-06-20 05:36:56 +00:00
commands.py feat(moa): route /moa through WebUI via server-resolved MoA config (#5070, #5057) 2026-06-28 00:23:51 +00:00
compression_anchor.py Address compaction marker and redaction review 2026-06-26 00:12:09 +00:00
config.py fix(#5139): keep timeout capability probes on the unsupported path 2026-06-28 18:29:37 -04:00
dashboard_probe.py fix: preserve IPv6 dashboard link brackets 2026-05-19 21:35:10 -04:00
extensions.py fix(extensions): keep settings-only installs canonical (#5094) 2026-06-28 18:25:47 -04:00
gateway_chat.py merge #5151 distinguish offline gateway approval warnings 2026-06-28 22:54:54 +00:00
gateway_restart.py fix(health): preserve restart failure contract and proofs (#5156) 2026-06-29 03:44:06 +00:00
gateway_watcher.py Release PF (v0.51.445): scope gateway watcher to active profile (#2848) (#4275) 2026-06-15 15:41:21 -07:00
goals.py
helpers.py feat(extensions): opt-in CSP frame-src allowlist (HERMES_WEBUI_CSP_FRAME_EXTRA) 2026-06-28 04:08:04 +00:00
kanban_bridge.py rebase(#2814): resolve i18n onto current master + add kanban_view_* keys to all 13 locales 2026-06-23 23:40:45 +00:00
metering.py
models.py fix: retry os.replace() on Windows WinError 5 (PermissionError) 2026-06-29 17:53:41 +00:00
oauth.py Avoid blocking OAuth flow lock during Codex start 2026-06-17 00:20:49 +00:00
onboarding.py fix: harden None providers config across onboarding/providers/routes (salvage of #3967) 2026-06-28 08:57:39 +00:00
passkeys.py Release v0.51.270 — Release IL (stage-u1 — un-hold batch: #3517 #3624 #3613) (#3674) 2026-06-05 11:35:26 -07:00
paths.py fix(profiles): avoid config import cycle 2026-06-01 05:05:16 +00:00
plugin_providers.py Release v0.51.270 — Release IL (stage-u1 — un-hold batch: #3517 #3624 #3613) (#3674) 2026-06-05 11:35:26 -07:00
plugins.py fix(#2622): plugin card UX — legible Open button, single badge, visible toggle + reject protocol-relative tab.path 2026-06-02 03:58:02 +00:00
profiles.py fix(#4783): prune dependency trees in mtime probe to match compute path (gate finding 4) 2026-06-24 21:27:22 +00:00
providers.py fix: harden None providers config across onboarding/providers/routes (salvage of #3967) 2026-06-28 08:57:39 +00:00
request_diagnostics.py fix(#4973): replace per-request diagnostics Timer with a process-global watchdog thread 2026-06-26 07:58:13 +00:00
rollback.py fix(#4410): pre-check workspace leaf type via lstat + close fd on non-regular (Codex gate v2) 2026-06-18 19:22:29 +00:00
route_approvals.py fix(#5000): relay mirrored gateway approvals after stream loss 2026-06-27 06:03:24 +00:00
route_session_list_cache.py Keep session cache invalidation signals live across the routes extraction 2026-06-26 18:36:07 +00:00
routes.py fix: authorize session html media artifacts 2026-06-29 05:17:33 +00:00
run_journal.py fix(streaming): tighten tool limit terminal guards 2026-06-12 10:03:31 +08:00
runner_client.py fix(gateway): correct approval URL and thread session history into runs API (#4479) 2026-06-19 13:16:39 -04:00
runtime_adapter.py Stage 398: PR #2696 — feat(runtime): add runner-local adapter selection (RuntimeAdapter slice 4c, feature-flagged) 2026-05-21 17:43:54 +00:00
session_discoverability.py Merge PR #3048 2026-05-28 17:47:33 +00:00
session_events.py feat(sessions): carry changed session_id in session-list-changed events (#4221) (#4233) 2026-06-15 00:10:01 -07:00
session_lifecycle.py Release v0.51.256 — Release HX (stage-r4) (#3596) 2026-06-04 12:28:06 -07:00
session_ops.py fix(webui): render server-initiated turns in a hidden tab without a refresh 2026-06-29 16:28:30 +00:00
session_recovery.py fix(anchor): preserve settled mixed content order (#4958) 2026-06-27 22:54:29 +00:00
skill_usage.py fix: remove webui-side writer to avoid conflict with agent 2026-05-27 20:57:32 +08:00
sse_chunked.py stage #4447: opt-in chunked SSE for buffering proxies (#4447) + v0.51.524 CHANGELOG 2026-06-19 22:09:17 +00:00
startup.py
state_sync.py fix: use Optional[T] for default None parameters in state_sync.py 2026-06-01 17:20:17 +00:00
streaming.py Keep null error fields from tripping replay failure 2026-06-28 15:22:33 -04:00
system_health.py fix: keep psutil optional for system health 2026-06-26 20:49:13 +00:00
terminal.py Release v0.51.304 — Release JT (stage-p2a — un-held terminal reaper + opt-in Docker GPU) (#3757) 2026-06-06 18:04:16 -07:00
todo_state.py Release v0.51.261 — Release IC (stage-r11) (#3616) 2026-06-04 16:46:20 -07:00
turn_journal.py Release v0.51.326 — Release KP (#3618 + #3802 + #3762 + #3810) (#3816) 2026-06-07 23:18:51 -07:00
updates.py fix(updates): resolve git under macOS launchd (#5175) 2026-06-29 04:22:51 +00:00
upload.py fix(voice): recognize command STT providers in capability probe (#4312) 2026-06-16 17:21:11 +00:00
usage.py fix: display canonical cache hit percentage 2026-05-19 02:27:12 -06:00
webui_session_db.py fix(#4767): review fixes - more edge cases 2026-06-24 18:08:50 +00:00
workspace.py fix(profiles): use profile-scoped resolver for /api/profile/active default_workspace (Codex gate #5169) 2026-06-29 01:45:17 +00:00
workspace_git.py release: v0.51.506 — harden destructive workspace Git paths vs repo-local execution (#3879, #3777) 2026-06-19 02:14:13 +00:00
worktrees.py Harden worktree removal safeguards 2026-05-13 09:49:15 +08:00