Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
cd585b2
feat(storage): restore quarantined archived sessions (phase 2.1 of #42)
Wibias Jul 27, 2026
38e6bfa
fix(storage): address PR #558 restore review and GUI loading races
Wibias Jul 27, 2026
a567a28
fix(storage): harden restore moves and Windows lock-test timeouts
Wibias Jul 27, 2026
8c1d9e3
fix(storage): atomic trash parse and legacy thread restore
Wibias Jul 27, 2026
d81a5a5
fix(storage): release memories lock before post-image backup write
Wibias Jul 27, 2026
5405289
fix(storage): compensate restore metadata on late failure
Wibias Jul 27, 2026
d864769
fix(storage): enforce restore compensation success and preserve pre-e…
Wibias Jul 27, 2026
a61fd99
fix(storage): resume incomplete restore instead of non-atomic compens…
Wibias Jul 27, 2026
f765c4c
fix(storage): write restore-pending atomically before file moves
Wibias Jul 27, 2026
f11acc3
fix(storage): keep placed dests on mid-move restore failure
Wibias Jul 27, 2026
64ebcb4
fix(storage): close PR #558 restore blockers (fail-closed resume, tom…
Wibias Jul 27, 2026
074a50a
fix(storage): serialize cleanup and restore via shared mutation gate
Wibias Jul 27, 2026
05a44f3
fix(storage): export policy overlap guard for pending restore
Wibias Jul 27, 2026
6a347b0
fix(storage): surface restore worker failures and gate test-stream route
Wibias Jul 27, 2026
3ffacfd
fix(storage): drop broken pending-overlap hooks from cleanup preview
Wibias Jul 27, 2026
c7a0db4
fix(storage): guard cleanup against pending restore overlap
Wibias Jul 27, 2026
815196c
Merge upstream dev into feat/storage-phase2.1-restore
Wibias Jul 27, 2026
67ca4a5
fix(tests): stabilize Windows CI storage policy and rollback cases
Wibias Jul 27, 2026
456f093
fix(storage): hold policy mutation slot in parent and backfill pendin…
Wibias Jul 27, 2026
6701e41
fix(storage): clear policy-job inflight after busy-path settle
Wibias Jul 27, 2026
b300802
Merge upstream/dev into feat/storage-phase2.1-restore
Wibias Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ bun run dev:gui
| **Models** | Toggle native GPT and routed models, set provider allowlists and context caps, choose v1/base/v2, and configure the v2 thread limit. Configured providers stay visible as zero-model groups when discovery is off or returns no rows. |
| **Logs** | Auto-refresh recent requests with tokens, requested effort and (when available) effective outbound effort, resolved model, provider, status, request id, duration, and error details. The detail view includes the exact reasoning wire field when the adapter emits one. Filter by opaque conversation/session id (when the client sends one) to total tokens and estimated list-price cost for the currently loaded Logs ring. |
| **Usage / Debug** | Inspect token-usage coverage and trends, or enable opt-in provider transport and usage-extraction diagnostics. |
| **Storage** | Read-only CODEX_HOME disk breakdown (sessions, archives, DBs, attachments). Optional archived cleanup: preview the oldest N%, then quarantine to `CODEX_HOME/.trash` (default) or permanently delete behind an explicit checkbox. **Auto-cleanup policy** is opt-in and **default OFF** (`storageCleanupPolicy.enabled`); configure threshold/target/schedule/mode on the Storage page, or trigger **Run now**. Active sessions stay read-only. Cleanup is refused while Codex holds the newest/active `state_*.sqlite` locked. Quarantined files are **not** restorable from the dashboard — recover manually from `.trash/<epoch>/` using `manifest.json` if needed. |
| **Storage** | Read-only CODEX_HOME disk breakdown (sessions, archives, DBs, attachments). Optional archived cleanup: preview the oldest N%, then quarantine to `CODEX_HOME/.trash` (default) or permanently delete behind an explicit checkbox. **Auto-cleanup policy** is opt-in and **default OFF** (`storageCleanupPolicy.enabled`); configure threshold/target/schedule/mode on the Storage page, or trigger **Run now**. Quarantined entries can be restored from the Storage page (JSONL + threads). Active sessions stay read-only. Cleanup and restore are refused while Codex holds the newest/active `state_*.sqlite` locked. |
| **Stop** | Gracefully stop the proxy and installed background service, restore native Codex, and exit (`POST /api/stop`). |

### Linking to a section
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/ja/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ bun run dev:gui
| **モデル** | ネイティブ GPT とルーティングモデルをオン/オフし、プロバイダー許可リストとコンテキスト上限、v1/base/v2、v2 スレッド数を設定します。 |
| **ログ** | トークン、要求された強度と(利用可能な場合は)実際に送信された強度、実際のモデル、プロバイダー、状態、リクエスト ID、所要時間、エラー詳細を含む最近のリクエストを自動更新します。アダプターが reasoning パラメーターを送信した場合、詳細表示に正確な wire field も表示されます。 |
| **使用量 / デバッグ** | トークン使用量の測定範囲と推移を見るか、オプションのプロバイダートランスポート/使用量抽出診断をオンにします。 |
| **ストレージ** | CODEX_HOME のディスク内訳(セッション、アーカイブ、DB、添付)を読み取り専用で表示。任意のアーカイブクリーンアップ: 最古 N% をプレビューし、既定では `CODEX_HOME/.trash` へ隔離、または明示チェックで完全削除。**自動クリーンアップ方針**はオプトインで**既定 OFF**(`storageCleanupPolicy.enabled`)。Storage ページでしきい値/目標/スケジュール/モードを設定するか **今すぐ実行**。アクティブセッションは読み取り専用。最新/アクティブな `state_*.sqlite` がロック中は拒否。隔離分はダッシュボードから復元不可 — 必要なら `.trash/<epoch>/` と `manifest.json` から手動復旧。 |
| **ストレージ** | CODEX_HOME のディスク内訳(セッション、アーカイブ、DB、添付)を読み取り専用で表示。任意のアーカイブクリーンアップ: 最古 N% をプレビューし、既定では `CODEX_HOME/.trash` へ隔離、または明示チェックで完全削除。**自動クリーンアップ方針**はオプトインで**既定 OFF**(`storageCleanupPolicy.enabled`)。Storage ページでしきい値/目標/スケジュール/モードを設定するか **今すぐ実行**。隔離エントリは Storage ページから復元可能(JSONL + スレッド)。アクティブセッションは読み取り専用。最新/アクティブな `state_*.sqlite` がロック中はクリーンアップと復元を拒否。 |
| **停止** | プロキシとインストールされたバックグラウンドサービスを正常終了しネイティブ Codex を復元した後終了します(`POST /api/stop`)。 |

### セクションへのリンク
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/ko/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ bun run dev:gui
| **Models** | 네이티브 GPT와 라우팅 모델을 켜고 끄고, 프로바이더 allowlist와 컨텍스트 상한, v1/base/v2, v2 thread 수를 설정합니다. |
| **Logs** | 토큰, 요청한 강도와 (사용 가능한 경우) 실제 전송 강도, 실제 모델, 프로바이더, 상태, 요청 id, 소요 시간, 오류 상세가 포함된 최근 요청을 자동 갱신합니다. 어댑터가 reasoning 매개변수를 전송한 경우 상세 보기에 정확한 wire field도 표시됩니다. 클라이언트가 보낸 불투명 대화/세션 id로 필터하면 현재 로드된 Logs 링의 토큰·추정 정가 합계를 볼 수 있습니다. |
| **Usage / Debug** | 토큰 사용량의 측정 범위와 추이를 보거나, 선택적 프로바이더 전송/사용량 추출 진단을 켭니다. |
| **Storage** | CODEX_HOME 디스크 사용량(세션, 보관, DB, 첨부)을 읽기 전용으로 표시합니다. 선택적 보관 정리: 가장 오래된 N%를 미리본 뒤 기본으로 `CODEX_HOME/.trash`에 격리하거나, 명시 체크 후 영구 삭제합니다. **자동 정리 정책**은 opt-in이며 **기본 OFF**(`storageCleanupPolicy.enabled`)입니다. Storage 페이지에서 임계값/목표/일정/모드를 설정하거나 **지금 실행**하세요. 활성 세션은 읽기 전용입니다. Codex가 최신/활성 `state_*.sqlite`를 잠그면 거절합니다. 격리 파일은 대시보드에서 복원할 수 없습니다 — 필요하면 `.trash/<epoch>/`와 `manifest.json`으로 수동 복구하세요. |
| **Storage** | CODEX_HOME 디스크 사용량(세션, 보관, DB, 첨부)을 읽기 전용으로 표시합니다. 선택적 보관 정리: 가장 오래된 N%를 미리본 뒤 기본으로 `CODEX_HOME/.trash`에 격리하거나, 명시 체크 후 영구 삭제합니다. **자동 정리 정책**은 opt-in이며 **기본 OFF**(`storageCleanupPolicy.enabled`)입니다. Storage 페이지에서 임계값/목표/일정/모드를 설정하거나 **지금 실행**하세요. Storage 페이지에서 격리 항목을 복원할 수 있습니다(JSONL + 스레드). 활성 세션은 읽기 전용입니다. Codex가 최신/활성 `state_*.sqlite`를 잠그면 정리와 복원을 거절합니다. |
| **Stop** | 프록시와 설치된 백그라운드 서비스를 정상 종료하고 네이티브 Codex를 복원한 뒤 끝냅니다(`POST /api/stop`). |

### 섹션으로 바로 가기
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/ru/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ bun run dev:gui
| **Models** | Включение и отключение нативных GPT и маршрутизируемых моделей, настройка списков разрешённых провайдеров и лимитов контекста, выбор v1/base/v2 и настройка лимита потоков v2. |
| **Logs** | Автообновляемый список недавних запросов: токены, запрошенный и, когда доступен, фактически отправленный уровень рассуждений, фактическая модель, провайдер, статус, id запроса, длительность и подробности ошибок. Если адаптер отправляет параметр рассуждений, в подробностях также отображается точное wire-поле. Можно фильтровать по непрозрачному id диалога/сессии (если клиент его передаёт) и суммировать токены и оценочную стоимость по прайс-листу в пределах загруженного кольца Logs. |
| **Usage / Debug** | Просмотр покрытия и трендов расхода токенов либо включение опциональной диагностики транспорта провайдеров и извлечения данных об использовании. |
| **Storage** | Только чтение разбивки диска CODEX_HOME (сессии, архивы, БД, вложения). Опциональная очистка архива: предпросмотр самых старых N%, затем карантин в `CODEX_HOME/.trash` (по умолчанию) или безвозвратное удаление по явному флажку. **Политика автоочистки** — opt-in и **по умолчанию ВЫКЛ** (`storageCleanupPolicy.enabled`); порог/цель/расписание/режим на странице Storage или **Запустить сейчас**. Активные сессии только для чтения. Очистка отклоняется, пока Codex держит блокировку новейшего/активного `state_*.sqlite`. Из карантина **нельзя** восстановить через панель — вручную из `.trash/<epoch>/` и `manifest.json`. |
| **Storage** | Только чтение разбивки диска CODEX_HOME (сессии, архивы, БД, вложения). Опциональная очистка архива: предпросмотр самых старых N%, затем карантин в `CODEX_HOME/.trash` (по умолчанию) или безвозвратное удаление по явному флажку. **Политика автоочистки** — opt-in и **по умолчанию ВЫКЛ** (`storageCleanupPolicy.enabled`); порог/цель/расписание/режим на странице Storage или **Запустить сейчас**. Записи карантина можно восстановить со страницы Storage (JSONL + threads). Активные сессии только для чтения. Очистка и восстановление отклоняются, пока Codex держит блокировку новейшего/активного `state_*.sqlite`. |
| **Stop** | Корректная остановка прокси и установленного фонового сервиса, восстановление нативного Codex и выход (`POST /api/stop`). |

### Ссылки на разделы
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/zh-cn/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ bun run dev:gui
| **Models** | 开关原生 GPT 与路由模型,配置 provider allowlist、上下文上限、v1/base/v2 以及 v2 thread 数量。 |
| **Logs** | 自动刷新近期请求,显示 token、请求强度以及(可用时)实际发送强度、实际模型、provider、状态、request id、耗时和错误详情。适配器发送 reasoning 参数时,详情中还会显示准确的 wire field。可按不透明会话/对话 ID(客户端提供时)筛选,并对当前已加载的 Logs 环形缓冲合计 token 与估算标价成本。 |
| **Usage / Debug** | 查看 token usage 覆盖率与趋势,或启用可选的 provider transport 和 usage 提取诊断。 |
| **Storage** | 只读查看 CODEX_HOME 磁盘占用(会话、归档、数据库、附件)。可选归档清理:预览最旧 N%,默认隔离到 `CODEX_HOME/.trash`,或勾选后永久删除。**自动清理策略**为可选且**默认关闭**(`storageCleanupPolicy.enabled`);可在 Storage 页配置阈值/目标/计划/模式,或点「立即运行」。活动会话保持只读。Codex 锁定最新/活动的 `state_*.sqlite` 时拒绝清理。隔离文件**不能**从仪表盘恢复——如需恢复,请根据 `manifest.json` 将文件从 `.trash/<epoch>/` 手动移回原位置。 |
| **Storage** | 只读查看 CODEX_HOME 磁盘占用(会话、归档、数据库、附件)。可选归档清理:预览最旧 N%,默认隔离到 `CODEX_HOME/.trash`,或勾选后永久删除。**自动清理策略**为可选且**默认关闭**(`storageCleanupPolicy.enabled`);可在 Storage 页配置阈值/目标/计划/模式,或点「立即运行」。可在 Storage 页从隔离区恢复(JSONL + 线程)。活动会话保持只读。Codex 锁定最新/活动的 `state_*.sqlite` 时拒绝清理与恢复。 |
| **Stop** | 优雅地停止代理和已安装的后台服务,恢复原生 Codex 并退出(`POST /api/stop`)。 |

### 链接到某个部分
Expand Down
33 changes: 32 additions & 1 deletion gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -901,7 +901,7 @@ export const de: Record<TKey, string> = {
"storage.cleanup.moreFiles": "…und {n} weitere",
"storage.cleanup.permanent": "Dauerhaft löschen (ohne Quarantäne)",
"storage.cleanup.permanentWarn": "Dauerhaftes Löschen kann nicht rückgängig gemacht werden.",
"storage.cleanup.quarantineNote": "Dateien wandern nach .trash unter CODEX_HOME. In dieser Version gibt es keine App-Wiederherstellung — behalte den Ordner oder verschiebe Dateien manuell anhand von manifest.json zurück.",
"storage.cleanup.quarantineNote": "Dateien wandern nach .trash unter CODEX_HOME. Du kannst sie im Quarantäne-Abschnitt darunter wiederherstellen.",
"storage.cleanup.cancel": "Abbrechen",
"storage.cleanup.confirmQuarantine": "In Quarantäne",
"storage.cleanup.confirmPermanent": "Dauerhaft löschen",
Expand All @@ -911,6 +911,7 @@ export const de: Record<TKey, string> = {
"storage.cleanup.cleanupFailed": "Bereinigung fehlgeschlagen.",
"storage.cleanup.err.codex_busy": "Codex verwendet state.sqlite — beende Codex und versuche es erneut.",
"storage.cleanup.err.stale_preview": "Archivdateien haben sich seit der Vorschau geändert — führe Vorschau erneut aus.",
"storage.cleanup.err.restore_pending_overlap": "Ausgewählte Archive überschneiden sich mit einer unvollständigen Wiederherstellung — zuerst Wiederherstellung abschließen oder erneut versuchen.",
"storage.cleanup.err.referenced_history": "Ausgewählte Archive werden noch von Fork- oder paginierter Historie referenziert.",
"storage.cleanup.err.invalid_digest": "Vorschaudigest fehlt oder ist ungültig.",
"storage.cleanup.err.invalid_mode": "Modus muss quarantine oder permanent sein.",
Expand All @@ -919,6 +920,36 @@ export const de: Record<TKey, string> = {
"storage.cleanup.err.db_reconcile_failed": "Codex-Statusdatenbank konnte nicht aktualisiert werden.",
"storage.cleanup.err.cleanup_failed": "Bereinigung fehlgeschlagen.",

"storage.trash.title": "Quarantäne",
"storage.trash.help": "Archivierte Sitzungen in CODEX_HOME/.trash. Wiederherstellen legt JSONL-Dateien und Thread-Zeilen zurück.",
"storage.trash.empty": "Keine Quarantäne-Einträge.",
"storage.trash.loading": "Quarantäne wird geladen…",
"storage.trash.col.when": "Quarantäne seit",
"storage.trash.col.files": "Dateien",
"storage.trash.col.size": "Größe",
"storage.trash.col.mode": "Modus",
"storage.trash.col.id": "Eintrag",
"storage.trash.restore": "Wiederherstellen",
"storage.trash.confirmTitle": "Quarantäne-Eintrag wiederherstellen?",
"storage.trash.confirmBody": "{count} Datei(en) (~{size}) aus {id} zurück in archivierte Sitzungen legen.",
"storage.trash.cancel": "Abbrechen",
"storage.trash.confirmRestore": "Wiederherstellen",
"storage.trash.done": "{count} Datei(en) wiederhergestellt ({size}).",
"storage.trash.restoreFailed": "Wiederherstellung fehlgeschlagen.",
"storage.trash.listFailed": "Quarantäne-Einträge konnten nicht geladen werden.",
"storage.trash.mode.quarantine": "quarantine",
"storage.trash.mode.permanent": "permanent (unvollständig)",
"storage.trash.err.codex_busy": "Codex verwendet state.sqlite — beende Codex und versuche es erneut.",
"storage.trash.err.invalid_trash": "Trash-Eintrags-ID fehlt oder ist ungültig.",
"storage.trash.err.missing_trash": "Trash-Eintrag wurde nicht gefunden.",
"storage.trash.err.dest_exists": "Wiederherstellungsziel existiert bereits — entferne oder benenne die Archivdatei um und versuche es erneut.",
"storage.trash.err.fs_failed": "Dateisystem-Wiederherstellung fehlgeschlagen. Einige Dateien können bereits wiederhergestellt sein — prüfe archived_sessions und .trash.",
"storage.trash.err.storage_mutation_busy": "Eine andere Speicher-Bereinigung oder Wiederherstellung läuft — bitte kurz warten.",
"storage.trash.err.db_reconcile_failed": "Codex-Statusdatenbankzeilen konnten nicht wiederhergestellt werden.",
"storage.trash.err.restore_failed": "Wiederherstellung fehlgeschlagen.",
"storage.trash.err.restore_worker_timeout": "Wiederherstellung dauerte zu lange (über 10 Minuten) und wurde abgebrochen.",
"storage.trash.err.restore_worker_aborted": "Wiederherstellung wurde beim Herunterfahren abgebrochen.",
"storage.trash.err.restore_worker_failed": "Wiederherstellungs-Worker ist abgestürzt oder unerwartet fehlgeschlagen.",
"storage.policy.title": "Automatische Bereinigungsrichtlinie",
"storage.policy.help": "Optionale Stapelbereinigung, wenn archivierte Sitzungen einen Schwellwert überschreiten. Standardmäßig aus — wird nie automatisch aktiviert.",
"storage.policy.loading": "Richtlinie wird geladen…",
Expand Down
Loading
Loading