Skip to content

Commit 1df9c82

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into fix/764-windows-service-stop
2 parents 5563216 + afe2aa3 commit 1df9c82

46 files changed

Lines changed: 3414 additions & 420 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

devlog/_plan/260731_macos_rss_retention/010_measurement_harness.md

Lines changed: 711 additions & 306 deletions
Large diffs are not rendered by default.

docs-site/src/content/docs/ko/reference/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ GUI가 필요하지 않습니다. `add`, `remove`, `list-custom`은 설정 파
196196
| `provider <name> <on\|off>` | `--json` | 한 프로바이더의 모든 모델을 한 번의 쓰기로 켜거나 끕니다. |
197197
| `selected <provider>` | `--set <id,id...>`, `--clear`, `--json` | 프로바이더 모델 허용 목록을 읽거나 교체합니다. `--clear`는 목록을 지워 전체 모델을 제공합니다. |
198198
| `context <status\|value <tokens>\|provider <name> <on\|off>\|all <on\|off>>` | `--json` | 컨텍스트 윈도 상한을 전역 또는 프로바이더 단위로 읽고 설정합니다. |
199-
| `shadow <status\|set> [model\|-]` | `--enabled <on\|off>`, `--json` | 백그라운드 shadow-call 모델을 읽거나 설정합니다. `-`는 모델을 지웁니다. |
199+
| `shadow <status\|set> [model\|-]` | `--enabled <on\|off>`, `--json` | Codex 백그라운드 헬퍼 호출을 대체할 모델을 읽거나 설정합니다. `-`는 모델을 지웁니다. `status`는 프록시가 가로채는 헬퍼 슬러그 `sourceModels`도 함께 보여줍니다(기본값 `gpt-5.4-mini`, 그리고 Codex 0.145.0부터 쓰이는 `gpt-5.6-luna`). |
200200

201201
```bash
202202
ocx models live --json # 지금 Codex가 실제로 보는 목록

docs-site/src/content/docs/reference/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ require the proxy to be running (`ocx start`, or an installed service).
247247
| `provider <name> <on\|off>` | `--json` | Enable or disable every model of one provider in a single write. |
248248
| `selected <provider>` | `--set <id,id...>`, `--clear`, `--json` | Read or replace the provider model allowlist. `--clear` removes the allowlist so every model is offered. |
249249
| `context <status\|value <tokens>\|provider <name> <on\|off>\|all <on\|off>>` | `--json` | Read or set the context-window cap, globally or per provider. |
250-
| `shadow <status\|set> [model\|-]` | `--enabled <on\|off>`, `--json` | Read or set the background shadow-call model. `-` clears the model. |
250+
| `shadow <status\|set> [model\|-]` | `--enabled <on\|off>`, `--json` | Read or set the replacement model for Codex's background helper calls. `-` clears the model. `status` also reports `sourceModels`, the helper slugs the proxy intercepts (default `gpt-5.4-mini` and `gpt-5.6-luna`, which Codex 0.145.0 switched to). |
251251

252252
```bash
253253
ocx models live --json # what Codex can actually see right now

docs/shadow-call-intercept.md

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,24 @@
22

33
## What are shadow calls?
44

5-
Codex Desktop App makes background API calls using `gpt-5.4-mini` for internal helper tasks:
5+
Codex Desktop App makes background API calls with a hard-coded helper model for internal tasks:
66

77
- **Thread title generation** — auto-generates 3-8 word titles after your first prompt
88
- **Commit message generation** — generates git commit messages
99
- **Skill orchestration** — internal orchestration turns
1010

1111
These calls happen independently of your selected main model and use `reasoningEffort: low`.
1212

13+
The helper model is not stable across client versions. Codex used `gpt-5.4-mini` up to 0.144.x and
14+
moved to `gpt-5.6-luna` in 0.145.0, which silently disabled a single-literal intercept
15+
([#311](https://github.com/lidge-jun/opencodex/issues/311)). The intercept therefore matches a
16+
**set** of source-model prefixes — `gpt-5.4-mini` and `gpt-5.6-luna` by default — so a client bump
17+
does not quietly turn the feature off. Routed ids (`provider/model`) are never matched: a shadow
18+
call is always a bare native slug, and an explicit routed selection must not be hijacked.
19+
1320
## The problem
1421

15-
- Non-OpenAI providers (Bedrock, Azure, etc.) may not support bare `gpt-5.4-mini`, causing 404 errors
22+
- Non-OpenAI providers (Bedrock, Azure, etc.) may not support the bare helper slug, causing 404 errors
1623
- Users have no control over which model handles these helper tasks
1724
- Shadow calls consume API quota without user awareness
1825

@@ -27,6 +34,9 @@ Related GitHub issues: [#26288](https://github.com/openai/codex/issues/26288), [
2734
3. Toggle the switch to enable
2835
4. Enter a replacement model (e.g., `gpt-5.5`)
2936

37+
The panel badge and tooltip render the source models the running proxy actually intercepts, read
38+
from `GET /api/shadow-call-settings` (`sourceModels`), so the UI never names a stale slug.
39+
3040
### Via config.json
3141

3242
```json
@@ -38,13 +48,29 @@ Related GitHub issues: [#26288](https://github.com/openai/codex/issues/26288), [
3848
}
3949
```
4050

51+
`sourceModels` is an optional override. When set to a non-empty array of strings it **replaces**
52+
the defaults rather than extending them:
53+
54+
```json
55+
{
56+
"shadowCallIntercept": {
57+
"enabled": true,
58+
"model": "gpt-5.5",
59+
"sourceModels": ["gpt-5.6-luna"]
60+
}
61+
}
62+
```
63+
4164
### Behavior
4265

43-
- When enabled, ALL requests with model IDs starting with `gpt-5.4-mini` are rewritten to the configured model
66+
- When enabled, ALL requests whose bare model id starts with one of the source-model prefixes
67+
(default `gpt-5.4-mini`, `gpt-5.6-luna`) are rewritten to the configured model
4468
- Reasoning effort is forced to `low` (matching the original behavior)
4569
- The original model ID is logged as `shadowCallRewrittenFrom` in request logs
4670
- When disabled (default), no interception occurs
4771

4872
### Warning
4973

50-
Enabling this redirects ALL gpt-5.4-mini requests. If you intentionally use gpt-5.4-mini for other tasks, those will also be redirected.
74+
Enabling this redirects every request for a source model, not just Codex's background helper turns.
75+
`gpt-5.6-luna` is also a selectable chat model, so if you pick it as your main model while the
76+
intercept is on, those turns are redirected too — narrow `sourceModels` if that matters to you.

gui/src/i18n/de.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,13 @@ export const de: Record<TKey, string> = {
185185
"dash.visionSidecar": "Vision-Sidecar",
186186
"dash.visionSidecarHint": "Backend und Modell zur Bildbeschreibung für reine Textmodelle auswählen.",
187187
"dash.shadowCallIntercept": "Shadow-Call-Abfangen",
188-
"dash.shadowCallInterceptHint": "Fängt die gpt-5.4-mini-Hintergrundaufrufe der Codex-App ab und leitet sie an das gewählte Modell um. Effort wird auf low fixiert.",
189-
"dash.shadowCallWarning": "⚠ Bei Aktivierung werden ALLE gpt-5.4-mini-Anfragen durch das gewählte Modell ersetzt.",
188+
"dash.shadowCallInterceptHint": "Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um. Effort wird auf low fixiert.",
189+
"dash.shadowCallWarning": "⚠ Bei Aktivierung werden ALLE Anfragen an {models} durch das gewählte Modell ersetzt.",
190190
"dash.shadowCallOriginal": "Original",
191191
"dash.shadowCallModel": "Ersatzmodell",
192-
"dash.shadowCallTooltip": "Die Codex-App verwendet gpt-5.4-mini im Hintergrund für Titelgenerierung, Commit-Nachrichten und Skill-Orchestrierung.",
192+
"dash.shadowCallTooltip": "Die Codex-App ruft im Hintergrund ein Hilfsmodell für Titelgenerierung, Commit-Nachrichten und Skill-Orchestrierung auf. Das Modell wechselt zwischen Client-Versionen, daher fängt opencodex diesen Satz ab: {models}.",
193193
"models.shadowCallIntercept": "Shadow-Call-Abfangen",
194-
"models.shadowCallInterceptHint": "Fängt die gpt-5.4-mini-Hintergrundaufrufe der Codex-App ab und leitet sie an das gewählte Modell um.",
194+
"models.shadowCallInterceptHint": "Fängt die Hintergrund-Hilfsaufrufe der Codex-App ({models}) ab und leitet sie an das gewählte Modell um.",
195195
"dash.sidecarBackend": "Backend",
196196
"dash.sidecarModel": "Modell",
197197
"dash.backendAuto": "Automatisch",
@@ -374,7 +374,7 @@ export const de: Record<TKey, string> = {
374374
"models.contextCapped": "350k-Limit",
375375
"models.contextCapLabel": "Kontext-Limit",
376376
"models.v2Label": "Sub-Agent",
377-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
377+
"models.shadowCallOriginal": "⚠ {models} →",
378378
"models.v2DocsLink": "Was ist v1 / v2?",
379379
"models.v2Mode_v1": "v1",
380380
"models.v2Mode_default": "base",

gui/src/i18n/en.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,13 @@ export const en = {
195195
"dash.visionSidecar": "Vision sidecar",
196196
"dash.visionSidecarHint": "Choose the backend and model used to describe images for text-only routed models.",
197197
"dash.shadowCallIntercept": "Shadow Call Intercept",
198-
"dash.shadowCallInterceptHint": "Intercepts Codex App's background gpt-5.4-mini calls (title generation, commit messages) and redirects them to your chosen model. Effort is fixed to low.",
199-
"dash.shadowCallWarning": "⚠ When enabled, ALL gpt-5.4-mini requests will be replaced with the selected model.",
198+
"dash.shadowCallInterceptHint": "Intercepts Codex App's background helper calls ({models}) for title generation and commit messages and redirects them to your chosen model. Effort is fixed to low.",
199+
"dash.shadowCallWarning": "⚠ When enabled, ALL requests for {models} will be replaced with the selected model.",
200200
"dash.shadowCallOriginal": "Original",
201201
"dash.shadowCallModel": "Replacement model",
202-
"dash.shadowCallTooltip": "Codex App uses gpt-5.4-mini in the background for thread title generation, commit message generation, and skill orchestration. Enable this to redirect those calls to your chosen model.",
202+
"dash.shadowCallTooltip": "Codex App makes background helper calls for thread title generation, commit message generation, and skill orchestration. The helper model changed across client versions, so opencodex intercepts every model in this set: {models}. Enable this to redirect those calls to your chosen model.",
203203
"models.shadowCallIntercept": "Shadow Call Intercept",
204-
"models.shadowCallInterceptHint": "Intercepts Codex App's background gpt-5.4-mini calls (titles, commit messages) and redirects them to your chosen model.",
204+
"models.shadowCallInterceptHint": "Intercepts Codex App's background helper calls ({models}) for titles and commit messages and redirects them to your chosen model.",
205205
"dash.sidecarBackend": "Backend",
206206
"dash.sidecarModel": "Model",
207207
"dash.backendAuto": "Auto",
@@ -391,7 +391,7 @@ export const en = {
391391
"models.contextCapped": "350k cap",
392392
"models.contextCapLabel": "Context cap",
393393
"models.v2Label": "Sub-agent",
394-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
394+
"models.shadowCallOriginal": "⚠ {models} →",
395395
"models.v2DocsLink": "What is v1 / v2?",
396396
"models.v2Mode_v1": "v1",
397397
"models.v2Mode_default": "base",

gui/src/i18n/ja.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ export const ja: Record<TKey, string> = {
194194
"dash.visionSidecar": "ビジョンサイドカー",
195195
"dash.visionSidecarHint": "テキスト専用ルーティングモデルで画像を説明するために使うバックエンドとモデルを選択します。",
196196
"dash.shadowCallIntercept": "シャドウコール傍受",
197-
"dash.shadowCallInterceptHint": "Codex App のバックグラウンド gpt-5.4-mini 呼び出し(タイトル生成、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。負荷は low に固定されます。",
198-
"dash.shadowCallWarning": "⚠ オンにすると、すべての gpt-5.4-mini リクエストが選択したモデルに置き換えられます。",
197+
"dash.shadowCallInterceptHint": "Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル生成、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。負荷は low に固定されます。",
198+
"dash.shadowCallWarning": "⚠ オンにすると、{models} へのリクエストがすべて選択したモデルに置き換えられます。",
199199
"dash.shadowCallOriginal": "元のモデル",
200200
"dash.shadowCallModel": "差し替えモデル",
201-
"dash.shadowCallTooltip": "Codex App はバックグラウンドでスレッドタイトル生成、コミットメッセージ生成、スキルオーケストレーションに gpt-5.4-mini を使います。これをオンにすると、それらの呼び出しを選択したモデルにリダイレクトします。",
201+
"dash.shadowCallTooltip": "Codex App はスレッドタイトル生成、コミットメッセージ生成、スキルオーケストレーションをバックグラウンドで呼び出します。使われるモデルはクライアントのバージョンによって変わるため、opencodex は {models} をまとめて傍受します。これをオンにすると、それらの呼び出しを選択したモデルにリダイレクトします。",
202202
"models.shadowCallIntercept": "シャドウコール傍受",
203-
"models.shadowCallInterceptHint": "Codex App のバックグラウンド gpt-5.4-mini 呼び出し(タイトル、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。",
203+
"models.shadowCallInterceptHint": "Codex App のバックグラウンドヘルパー呼び出し({models}: タイトル、コミットメッセージ)を傍受し、選択したモデルにリダイレクトします。",
204204
"dash.sidecarBackend": "バックエンド",
205205
"dash.sidecarModel": "モデル",
206206
"dash.backendAuto": "自動",
@@ -382,7 +382,7 @@ export const ja: Record<TKey, string> = {
382382
"models.contextCapped": "350k 上限",
383383
"models.contextCapLabel": "コンテキスト上限",
384384
"models.v2Label": "サブエージェント",
385-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
385+
"models.shadowCallOriginal": "⚠ {models} →",
386386
"models.v2DocsLink": "v1 / v2 とは?",
387387
"models.v2Mode_v1": "v1",
388388
"models.v2Mode_default": "ベース",

gui/src/i18n/ko.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,13 @@ export const ko: Record<TKey, string> = {
189189
"dash.visionSidecar": "비전 사이드카",
190190
"dash.visionSidecarHint": "텍스트 전용 라우팅 모델이 이미지를 읽을 때 쓸 백엔드와 모델을 고릅니다.",
191191
"dash.shadowCallIntercept": "쉐도우 호출 가로채기",
192-
"dash.shadowCallInterceptHint": "Codex 앱이 제목·커밋 메시지 생성에 쓰는 gpt-5.4-mini 백그라운드 호출을 가로채 선택한 모델로 바꿉니다. effort는 low로 고정됩니다.",
193-
"dash.shadowCallWarning": "⚠ 활성화하면 모든 gpt-5.4-mini 요청이 선택한 모델로 대체됩니다.",
192+
"dash.shadowCallInterceptHint": "Codex 앱이 제목·커밋 메시지 생성에 쓰는 백그라운드 호출({models})을 가로채 선택한 모델로 바꿉니다. effort는 low로 고정됩니다.",
193+
"dash.shadowCallWarning": "⚠ 활성화하면 {models} 요청이 모두 선택한 모델로 대체됩니다.",
194194
"dash.shadowCallOriginal": "원본",
195195
"dash.shadowCallModel": "대체 모델",
196-
"dash.shadowCallTooltip": "Codex 앱은 스레드 제목 자동 생성, 커밋 메시지 생성, 스킬 오케스트레이션 내부 작업에 gpt-5.4-mini를 백그라운드로 호출합니다. 이 설정을 켜면 해당 호출을 선택한 모델로 리다이렉트합니다.",
196+
"dash.shadowCallTooltip": "Codex 앱은 스레드 제목 자동 생성, 커밋 메시지 생성, 스킬 오케스트레이션 같은 내부 작업을 백그라운드로 호출합니다. 이때 쓰는 모델은 클라이언트 버전마다 달라서 opencodex는 {models}를 모두 가로챕니다. 이 설정을 켜면 해당 호출이 선택한 모델로 넘어갑니다.",
197197
"models.shadowCallIntercept": "쉐도우 호출 가로채기",
198-
"models.shadowCallInterceptHint": "Codex 앱의 백그라운드 gpt-5.4-mini 호출(제목·커밋 메시지)을 가로채 선택한 모델로 바꿉니다.",
198+
"models.shadowCallInterceptHint": "Codex 앱의 백그라운드 호출({models}, 제목·커밋 메시지)을 가로채 선택한 모델로 바꿉니다.",
199199
"dash.sidecarBackend": "백엔드",
200200
"dash.sidecarModel": "모델",
201201
"dash.backendAuto": "자동",
@@ -385,7 +385,7 @@ export const ko: Record<TKey, string> = {
385385
"models.contextCapped": "350k 제한",
386386
"models.contextCapLabel": "컨텍스트 제한",
387387
"models.v2Label": "서브에이전트",
388-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
388+
"models.shadowCallOriginal": "⚠ {models} →",
389389
"models.v2Mode_v1": "v1",
390390
"models.v2Mode_default": "base",
391391
"models.v2Mode_v2": "v2",

gui/src/i18n/ru.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,13 @@ export const ru: Record<TKey, string> = {
194194
"dash.visionSidecar": "Сайдкар для изображений",
195195
"dash.visionSidecarHint": "Выберите бэкенд и модель, которые описывают изображения для маршрутизируемых моделей, работающих только с текстом.",
196196
"dash.shadowCallIntercept": "Перехват теневых вызовов",
197-
"dash.shadowCallInterceptHint": "Перехватывает фоновые вызовы gpt-5.4-mini из Codex App (генерация заголовков, сообщений коммитов) и перенаправляет их на выбранную вами модель. Уровень рассуждений жёстко задан как low.",
198-
"dash.shadowCallWarning": "⚠ Когда функция включена, ВСЕ запросы к gpt-5.4-mini будут заменены выбранной моделью.",
197+
"dash.shadowCallInterceptHint": "Перехватывает фоновые служебные вызовы Codex App ({models}: генерация заголовков, сообщений коммитов) и перенаправляет их на выбранную вами модель. Уровень рассуждений жёстко задан как low.",
198+
"dash.shadowCallWarning": "⚠ Когда функция включена, ВСЕ запросы к {models} будут заменены выбранной моделью.",
199199
"dash.shadowCallOriginal": "Оригинал",
200200
"dash.shadowCallModel": "Модель-замена",
201-
"dash.shadowCallTooltip": "Codex App использует gpt-5.4-mini в фоновом режиме для генерации заголовков тредов, сообщений коммитов и оркестрации навыков. Включите эту функцию, чтобы перенаправлять такие вызовы на выбранную вами модель.",
201+
"dash.shadowCallTooltip": "Codex App в фоновом режиме вызывает служебную модель для генерации заголовков тредов, сообщений коммитов и оркестрации навыков. Эта модель менялась между версиями клиента, поэтому opencodex перехватывает весь набор: {models}. Включите функцию, чтобы перенаправлять такие вызовы на выбранную вами модель.",
202202
"models.shadowCallIntercept": "Перехват теневых вызовов",
203-
"models.shadowCallInterceptHint": "Перехватывает фоновые вызовы gpt-5.4-mini из Codex App (заголовки, сообщения коммитов) и перенаправляет их на выбранную вами модель.",
203+
"models.shadowCallInterceptHint": "Перехватывает фоновые служебные вызовы Codex App ({models}: заголовки, сообщения коммитов) и перенаправляет их на выбранную вами модель.",
204204
"dash.sidecarBackend": "Бэкенд",
205205
"dash.sidecarModel": "Модель",
206206
"dash.backendAuto": "Авто",
@@ -387,7 +387,7 @@ export const ru: Record<TKey, string> = {
387387
"models.contextCapped": "Лимит 350k",
388388
"models.contextCapLabel": "Лимит контекста",
389389
"models.v2Label": "Подагент",
390-
"models.shadowCallOriginal": "⚠ 5.4-mini →",
390+
"models.shadowCallOriginal": "⚠ {models} →",
391391
"models.v2DocsLink": "Что такое v1 / v2?",
392392
"models.v2Mode_v1": "v1",
393393
"models.v2Mode_default": "base",

0 commit comments

Comments
 (0)