Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
37d672f
feat(codex): record each LazyCodex role model write with its earlier …
LilMGenius Oct 24, 2026
559cb48
feat(gui): restore LazyCodex role models from the change history
LilMGenius Oct 24, 2026
d6de97d
fix(codex): list a role-model change batch whole, never cut by the 50…
LilMGenius Oct 24, 2026
66e0843
docs(codex): say the change history lists the newest 50 in whole batches
LilMGenius Oct 24, 2026
2177cfe
fix(codex): keep role editing when the change history cannot be read
LilMGenius Oct 25, 2026
428b61a
docs(codex): say the role history widens to whole batches and can be …
LilMGenius Oct 25, 2026
5c2279c
fix(gui): stop a role Restore at the first failed write and say so
LilMGenius Oct 25, 2026
f3071ee
docs(codex): name the history file in the read-failure sentence
LilMGenius Oct 25, 2026
c3f41be
fix(gui): date the role history in the dashboard's language and state…
LilMGenius Oct 25, 2026
d2ffedb
fix(codex): keep role history and Restore to the Codex home that wrot…
LilMGenius Oct 26, 2026
2b017a3
fix(codex): bound the role history file, its reads and its batches
LilMGenius Oct 26, 2026
713519a
fix(gui): let Apply all and Restore run without crypto.randomUUID
LilMGenius Oct 26, 2026
82a8a69
fix(codex): let a Restore finish every role of the batch it restores
LilMGenius Oct 26, 2026
8d08e19
fix(codex): keep compaction from resetting or fragmenting a batch
LilMGenius Oct 26, 2026
36172ec
fix(codex): retain restore sources before history compaction
lidge-jun Oct 27, 2026
a997457
fix(codex): separate history records from interrupted suffixes
lidge-jun Oct 27, 2026
d9d343f
Merge origin/dev c4dbcc0ae into feat/codex-role-model-history
lidge-jun Oct 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: 2 additions & 0 deletions docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,8 @@ ocx agent roles suggest
ocx agent roles suggest --model xai/grok-4.5 --apply
```

Under the table, **Change history** lists the newest changes a save, an auto-assign apply or `ocx agent roles set` wrote, newest first, in whole batches and never more than 50, so an Apply all is listed with every role it wrote or not at all, with each role's model and effort before and after. One Apply all is one entry. **Restore** writes the earlier values back through the same save, so a restore is listed too. A save never removes a model pin, so a role that had none keeps its current model and gets only its effort back. The history lives in `integrations/codex-agent-roles.jsonl` under the opencodex config directory, which retains at most 256 KiB and 1000 rows by dropping its oldest whole batches. Compaction targets 128 KiB and preserves a Restore together with its complete source batch when they fit both limits, making room by dropping unrelated older batches; history can still expire as later writes arrive. The writer captures the bounded history before appending so a Restore does not evict its own source at the retention boundary; the omo card's Restore center above tracks only `~/.omo/agent/models.json`. Each change records the Codex home it was made in, and only the current home's changes are listed or restored, so after pointing `CODEX_HOME` elsewhere the list starts empty and a Restore from another home's history is refused. If the history file cannot be read, the section says so in place of the list, and the role table keeps working.

## Kilo

Kilo CLI, VS Code, and JetBrains share one global config. This integration writes
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1905,6 +1905,12 @@ export const de: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} läuft jetzt mit {model}. omo.jsonc blieb unverändert, weil es kein gültiges JSON in der Form ist, die LazyCodex liest.",
"integrations.lazycodexRoles.omoFailed": "{role} läuft jetzt mit {model}, aber omo.jsonc konnte nicht geschrieben werden.",
"integrations.lazycodexRoles.retryMirror": "omo.jsonc erneut versuchen",
"integrations.lazycodexRoles.history.title": "Änderungsverlauf",
"integrations.lazycodexRoles.history.hint": "Hier stehen die letzten 50 Speichervorgänge und automatischen Zuweisungen dieses Abschnitts, jeweils als ganze Aktion. Wiederherstellen schreibt das frühere Modell und den früheren Aufwand wie ein normales Speichern zurück und wird ebenfalls aufgeführt. Eine Rolle ohne frühere Modellbindung behält ihr aktuelles Modell; nur der Aufwand wird zurückgesetzt.",
"integrations.lazycodexRoles.history.unavailable": "Der Änderungsverlauf konnte nicht gelesen werden, daher ist Wiederherstellen nicht verfügbar. Rollen lassen sich weiterhin bearbeiten.",
"integrations.lazycodexRoles.history.restore": "Wiederherstellen",
"integrations.lazycodexRoles.history.restored": "{count} Rolle(n) auf den Stand vor {time} zurückgesetzt.",
"integrations.lazycodexRoles.history.partial": "Wiederherstellen bei {role} abgebrochen: {count} von {total} Rolle(n) wurden zurückgesetzt, die übrigen behalten ihre aktuellen Werte. Behebe den Fehler oben und stelle erneut wieder her.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc enthält Kommentare, daher ändert Speichern hier nur die Rollendateien. Setze [codex].agents in omo.jsonc selbst.",
"integrations.lazycodexRoles.auto.button": "Automatisch zuweisen",
"integrations.lazycodexRoles.auto.running": "Rollen werden eingestuft…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2536,6 +2536,12 @@ export const en = {
"integrations.lazycodexRoles.omoInvalid": "{role} now runs on {model}. omo.jsonc was left alone because it is not valid JSON in the shape LazyCodex reads.",
"integrations.lazycodexRoles.omoFailed": "{role} now runs on {model}, but omo.jsonc could not be written.",
"integrations.lazycodexRoles.retryMirror": "Retry omo.jsonc",
"integrations.lazycodexRoles.history.title": "Change history",
"integrations.lazycodexRoles.history.hint": "The newest 50 saves and auto-assigns in this section are listed here, kept in whole batches. Restore writes the earlier model and effort back as an ordinary save, so it is listed too. A role that had no model pin keeps its current one; only its effort goes back.",
"integrations.lazycodexRoles.history.unavailable": "The change history could not be read, so Restore is unavailable. Role editing still works.",
"integrations.lazycodexRoles.history.restore": "Restore",
"integrations.lazycodexRoles.history.restored": "Restored {count} role(s) to how they were before {time}.",
"integrations.lazycodexRoles.history.partial": "Restore stopped at {role}: {count} of {total} role(s) went back, and the rest keep their current values. Fix the error above and restore again.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc has comments, so saving here updates only the role files. Set [codex].agents in omo.jsonc yourself.",
"integrations.lazycodexRoles.auto.button": "Auto-assign",
"integrations.lazycodexRoles.auto.running": "Sizing roles…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2463,6 +2463,12 @@ export const fr: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} utilise désormais {model}. omo.jsonc n'a pas été modifié, car ce n'est pas un JSON valide de la forme que LazyCodex lit.",
"integrations.lazycodexRoles.omoFailed": "{role} utilise désormais {model}, mais omo.jsonc n'a pas pu être écrit.",
"integrations.lazycodexRoles.retryMirror": "Réessayer omo.jsonc",
"integrations.lazycodexRoles.history.title": "Historique des modifications",
"integrations.lazycodexRoles.history.hint": "Les 50 derniers enregistrements et attributions automatiques de cette section figurent ici, regroupés par action entière. Restaurer réécrit le modèle et l'effort précédents comme un enregistrement ordinaire, qui figure donc aussi ici. Un rôle sans modèle épinglé auparavant garde son modèle actuel ; seul son effort est rétabli.",
"integrations.lazycodexRoles.history.unavailable": "L'historique des modifications n'a pas pu être lu, donc Restaurer n'est pas disponible. La modification des rôles fonctionne toujours.",
"integrations.lazycodexRoles.history.restore": "Restaurer",
"integrations.lazycodexRoles.history.restored": "{count} rôle(s) rétabli(s) à leur état d'avant {time}.",
"integrations.lazycodexRoles.history.partial": "La restauration s'est arrêtée à {role} : {count} rôle(s) sur {total} ont été rétablis, les autres gardent leurs valeurs actuelles. Corrigez l'erreur ci-dessus et restaurez à nouveau.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc contient des commentaires : enregistrer ici ne met à jour que les fichiers de rôle. Définissez [codex].agents dans omo.jsonc vous-même.",
"integrations.lazycodexRoles.auto.button": "Attribution auto",
"integrations.lazycodexRoles.auto.running": "Évaluation des rôles…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2358,6 +2358,12 @@ export const ja: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} は {model} で動くようになりました。omo.jsonc は LazyCodex が読む形の有効な JSON ではないため変更していません。",
"integrations.lazycodexRoles.omoFailed": "{role} は {model} で動くようになりましたが、omo.jsonc は書き込めませんでした。",
"integrations.lazycodexRoles.retryMirror": "omo.jsonc を再試行",
"integrations.lazycodexRoles.history.title": "変更履歴",
"integrations.lazycodexRoles.history.hint": "このセクションでの保存と自動割り当てのうち、新しい 50 件が操作単位でここに記録されます。元に戻すと以前のモデルと推論強度が通常の保存と同じ方法で書き戻され、その操作も記録されます。以前モデルが固定されていなかったロールは現在のモデルを保ち、推論強度だけを戻します。",
"integrations.lazycodexRoles.history.unavailable": "変更履歴を読み込めなかったため、元に戻す機能は使えません。ロールの編集はそのまま使えます。",
"integrations.lazycodexRoles.history.restore": "元に戻す",
"integrations.lazycodexRoles.history.restored": "{count} 件のロールを {time} より前の状態に戻しました。",
"integrations.lazycodexRoles.history.partial": "{role} で元に戻す処理が止まりました。{total} 件中 {count} 件のロールが戻り、残りは現在の値のままです。上のエラーを解消してからもう一度元に戻してください。",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc にコメントがあるため、ここで保存するとロールファイルだけが更新されます。omo.jsonc の [codex].agents はご自身で設定してください。",
"integrations.lazycodexRoles.auto.button": "自動割り当て",
"integrations.lazycodexRoles.auto.running": "ロールを評価中…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1949,6 +1949,12 @@ export const ko: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role}은(는) 이제 {model}로 실행됩니다. omo.jsonc가 LazyCodex가 읽는 형태의 올바른 JSON이 아니어서 그 파일은 바꾸지 않았습니다.",
"integrations.lazycodexRoles.omoFailed": "{role}은(는) 이제 {model}로 실행되지만, omo.jsonc는 쓰지 못했습니다.",
"integrations.lazycodexRoles.retryMirror": "omo.jsonc 다시 시도",
"integrations.lazycodexRoles.history.title": "변경 기록",
"integrations.lazycodexRoles.history.hint": "이 섹션에서 저장하거나 자동 배정한 변경 중 최근 50개가 작업 단위로 여기에 남습니다. 되돌리기는 이전 모델과 추론 강도를 일반 저장과 같은 방식으로 다시 쓰고, 그 자체도 기록됩니다. 원래 모델이 지정되지 않았던 역할은 현재 모델을 유지하고 추론 강도만 되돌립니다.",
"integrations.lazycodexRoles.history.unavailable": "변경 기록을 읽지 못해 되돌리기를 쓸 수 없습니다. 역할 편집은 그대로 할 수 있습니다.",
"integrations.lazycodexRoles.history.restore": "되돌리기",
"integrations.lazycodexRoles.history.restored": "{count}개 역할을 {time} 이전 상태로 되돌렸습니다.",
"integrations.lazycodexRoles.history.partial": "{role}에서 되돌리기가 멈췄습니다. {total}개 중 {count}개 역할만 되돌아갔고 나머지는 현재 값을 유지합니다. 위의 오류를 해결한 뒤 다시 되돌리세요.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc에 주석이 있어 여기서 저장하면 역할 파일만 바뀝니다. omo.jsonc의 [codex].agents는 직접 맞춰 주세요.",
"integrations.lazycodexRoles.auto.button": "자동 배정",
"integrations.lazycodexRoles.auto.running": "역할 평가 중…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2507,6 +2507,12 @@ export const pt: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} agora usa {model}. O omo.jsonc ficou como estava porque não é um JSON válido no formato que o LazyCodex lê.",
"integrations.lazycodexRoles.omoFailed": "{role} agora usa {model}, mas não foi possível gravar o omo.jsonc.",
"integrations.lazycodexRoles.retryMirror": "Tentar omo.jsonc novamente",
"integrations.lazycodexRoles.history.title": "Histórico de alterações",
"integrations.lazycodexRoles.history.hint": "As 50 gravações e atribuições automáticas mais recentes desta seção aparecem aqui, agrupadas por ação inteira. Restaurar grava de volta o modelo e o esforço anteriores como uma gravação comum, que também aparece aqui. Um papel que não tinha modelo fixado mantém o atual; só o esforço volta.",
"integrations.lazycodexRoles.history.unavailable": "Não foi possível ler o histórico de alterações, por isso Restaurar não está disponível. A edição de papéis continua funcionando.",
"integrations.lazycodexRoles.history.restore": "Restaurar",
"integrations.lazycodexRoles.history.restored": "{count} papel(is) restaurado(s) ao estado anterior a {time}.",
"integrations.lazycodexRoles.history.partial": "A restauração parou em {role}: {count} de {total} papel(is) voltaram, e os demais mantêm os valores atuais. Corrija o erro acima e restaure novamente.",
"integrations.lazycodexRoles.omoCommentsState": "O omo.jsonc tem comentários, então salvar aqui atualiza só os arquivos de papel. Defina [codex].agents no omo.jsonc você mesmo.",
"integrations.lazycodexRoles.auto.button": "Atribuir automaticamente",
"integrations.lazycodexRoles.auto.running": "Dimensionando funções…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2449,6 +2449,12 @@ export const ru: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} теперь работает на {model}. omo.jsonc не изменён: это не корректный JSON той структуры, которую читает LazyCodex.",
"integrations.lazycodexRoles.omoFailed": "{role} теперь работает на {model}, но записать omo.jsonc не удалось.",
"integrations.lazycodexRoles.retryMirror": "Повторить запись omo.jsonc",
"integrations.lazycodexRoles.history.title": "История изменений",
"integrations.lazycodexRoles.history.hint": "Здесь перечислены последние 50 сохранений и автоназначений в этом разделе, целыми действиями. Восстановление записывает прежние модель и усилие как обычное сохранение и тоже попадает сюда. Роль, у которой раньше не было закреплённой модели, сохраняет текущую; возвращается только усилие.",
"integrations.lazycodexRoles.history.unavailable": "Не удалось прочитать историю изменений, поэтому восстановление недоступно. Редактирование ролей по-прежнему работает.",
"integrations.lazycodexRoles.history.restore": "Восстановить",
"integrations.lazycodexRoles.history.restored": "Восстановлено ролей: {count}, состояние до {time}.",
"integrations.lazycodexRoles.history.partial": "Восстановление остановилось на {role}: возвращено ролей {count} из {total}, остальные сохраняют текущие значения. Исправьте ошибку выше и восстановите снова.",
"integrations.lazycodexRoles.omoCommentsState": "В omo.jsonc есть комментарии, поэтому сохранение здесь обновляет только файлы ролей. Задайте [codex].agents в omo.jsonc сами.",
"integrations.lazycodexRoles.auto.button": "Автоназначение",
"integrations.lazycodexRoles.auto.running": "Оценка ролей…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/tr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2475,6 +2475,12 @@ export const tr: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} artık {model} ile çalışıyor. omo.jsonc, LazyCodex'in okuduğu biçimde geçerli bir JSON olmadığı için değiştirilmedi.",
"integrations.lazycodexRoles.omoFailed": "{role} artık {model} ile çalışıyor, ancak omo.jsonc yazılamadı.",
"integrations.lazycodexRoles.retryMirror": "omo.jsonc'yi yeniden dene",
"integrations.lazycodexRoles.history.title": "Değişiklik geçmişi",
"integrations.lazycodexRoles.history.hint": "Bu bölümdeki en yeni 50 kaydetme ve otomatik atama, bütün işlemler halinde burada listelenir. Geri yükleme önceki modeli ve çabayı sıradan bir kaydetme gibi geri yazar ve o da listelenir. Önceden sabitlenmiş modeli olmayan bir rol mevcut modelini korur; yalnızca çabası geri döner.",
"integrations.lazycodexRoles.history.unavailable": "Değişiklik geçmişi okunamadı, bu yüzden Geri yükleme kullanılamıyor. Rol düzenleme çalışmaya devam ediyor.",
"integrations.lazycodexRoles.history.restore": "Geri yükle",
"integrations.lazycodexRoles.history.restored": "{count} rol {time} öncesindeki durumuna geri yüklendi.",
"integrations.lazycodexRoles.history.partial": "Geri yükleme {role} rolünde durdu: {total} rolden {count} tanesi geri döndü, diğerleri mevcut değerlerini koruyor. Yukarıdaki hatayı düzeltip yeniden geri yükleyin.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc yorumlar içeriyor, bu yüzden burada kaydetmek yalnızca rol dosyalarını günceller. omo.jsonc içindeki [codex].agents değerini kendiniz ayarlayın.",
"integrations.lazycodexRoles.auto.button": "Otomatik ata",
"integrations.lazycodexRoles.auto.running": "Roller değerlendiriliyor…",
Expand Down
6 changes: 6 additions & 0 deletions gui/src/i18n/vi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2484,6 +2484,12 @@ export const vi: Record<TKey, string> = {
"integrations.lazycodexRoles.omoInvalid": "{role} giờ chạy bằng {model}. omo.jsonc được giữ nguyên vì nó không phải JSON hợp lệ theo dạng LazyCodex đọc.",
"integrations.lazycodexRoles.omoFailed": "{role} giờ chạy bằng {model}, nhưng không ghi được omo.jsonc.",
"integrations.lazycodexRoles.retryMirror": "Thử lại omo.jsonc",
"integrations.lazycodexRoles.history.title": "Lịch sử thay đổi",
"integrations.lazycodexRoles.history.hint": "50 lần lưu và tự động gán gần nhất trong phần này được liệt kê ở đây, theo từng thao tác trọn vẹn. Khôi phục ghi lại mô hình và mức suy luận trước đó như một lần lưu thông thường, nên thao tác đó cũng được liệt kê. Vai trò trước đây không ghim mô hình sẽ giữ mô hình hiện tại; chỉ mức suy luận được khôi phục.",
"integrations.lazycodexRoles.history.unavailable": "Không đọc được lịch sử thay đổi nên không thể khôi phục. Bạn vẫn chỉnh sửa vai trò như bình thường.",
"integrations.lazycodexRoles.history.restore": "Khôi phục",
"integrations.lazycodexRoles.history.restored": "Đã khôi phục {count} vai trò về trạng thái trước {time}.",
"integrations.lazycodexRoles.history.partial": "Khôi phục dừng ở {role}: {count}/{total} vai trò đã được khôi phục, các vai trò còn lại giữ giá trị hiện tại. Hãy sửa lỗi ở trên rồi khôi phục lại.",
"integrations.lazycodexRoles.omoCommentsState": "omo.jsonc có chú thích, nên lưu ở đây chỉ cập nhật các tệp vai trò. Hãy tự đặt [codex].agents trong omo.jsonc.",
"integrations.lazycodexRoles.auto.button": "Tự động gán",
"integrations.lazycodexRoles.auto.running": "Đang đánh giá vai trò…",
Expand Down
Loading
Loading