Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 035 — Ordering and verification prerequisite landed

PR #3700 landed with an admin merge at `76356176c86aa123220c82b65321453e81897405`.
Its tree `f1950aecabdb3b73dbb4bdea18a845b27da70222` matches the tested GitHub merge
candidate. Both ordering head `e59b730b1` and Lab prerequisite head `8b5dbde02`
were verified as ancestors of dev. GitHub automatically marked #3713 merged.

Source #3571 was closed immediately after that proof. Its refreshed head
`09acfba64596011c308f0d9cbac070123bb9faeb` rebases the carried source: eight of
twelve feature-file blobs are identical; four differences are established dev
changes, and the three rewritten follow-ups have matching stable patch IDs.
The source author and `Co-authored-by: voiys <matej2714@gmail.com>` are retained.

- Exact source-head [CI 33989738843](https://github.com/lidge-jun/opencodex/actions/runs/33989738843)
completed successfully, including Linux four shards, macOS two shards and all producers.
- Remote merge candidate `33ed4751` passed the canonical full suite: 19,606 pass,
0 fail, 15 skip, plus build, typecheck and privacy checks.
- After the intervening Logs landing, candidate `88a67043` passed all dashboard
tests, lint/i18n/build, five affected root test files, typecheck, privacy and docs
build. Catalog, Lab, adapters and dependencies match the full-suite baseline.
- The earlier standalone prerequisite run is retained as cancelled: its macOS
log stopped at the client-connect file before Lab execution. It is not called green.

Independent source, contract and security reviews passed. The ordering PABCD
cycle is closed; model management and Fable remain separate incomplete work phases.
144 changes: 73 additions & 71 deletions devlog/_plan/260906_lane_b_catalog_stack/040_management.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# 041 — Static default verification boundary

Head `2e9006609` produced 281 passing catalog tests and one failure in both remote
and hosted verification. Its old Go fixture expected no models, but existing
registry ownership and capture-time enrichment already supplied `kimi-k2.7-code`
as that provider's effective default. The new static seed intentionally publishes it.

The production seed remains unchanged. The replacement assertion requires exactly
that one inherited default and no metadata-roster augmentation, for omitted and
empty model lists, with zero upstream requests. A distinct custom MiMo destination
checks the existing strict transport guard, no inherited default or list, and an
exactly empty authoritative result. Unregistered no-default, explicit-list,
retention, forward and OAuth no-request controls remain in place.

Independent source review confirmed this is an obsolete expectation for the
intentional new contract, not evidence of a new endpoint-ownership defect. The
initial failing result stays recorded; the amended tests require fresh verification.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 042 — Canonical provider-workspace model controls

The UI child carries the remaining source #3659 changes by gqchen, then adapts
them to the existing model-row authority. The proposed disabled-map API, parser
and server assertion were removed; their net diff from the static parent is zero.

The workspace adopts `/api/models` with the full selection/provenance response.
Actions require the current parent revision and matching custom ownership.
Delete removes one custom definition; Hide changes the represented row's
visibility. Neither adds a second mutation, an implicit unhide or a browser-only
removal marker. Namespaced identity separates account-native/custom collisions.

The implementation preserves ordinary raw-ID copying, native default badges and
the configured-fallback hint's prior condition. Missing discovery provenance
remains unknown; malformed present data and invalid action identity are rejected.
Icon-only actions expose their exact target in accessible names.

Regression additions cover real API persistence/restoration and UI response-order,
single-flight, uncertain-result, remount, count, focus and identity scenarios.
All nine locales and eight dashboard guides describe the same contract, retaining
other lanes' changes. Independent C4 source review passed; execution and actual
compiled-browser evidence remain C gates. The inherited source screenshot is
historical and must be replaced before this child is review-ready.
20 changes: 20 additions & 0 deletions devlog/_plan/260906_lane_b_catalog_stack/043_carry_boundary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# 043 — Preserve changes already integrated before the source carry

The first UI verification at `1b90dba7` passed 23 API tests and 157 GUI tests,
with one GUI locator failure. Its build also exposed three missing Grok text keys.

The carry used the PR's target-tip snapshot `af50c6d3` as a diff base, but source
`ff4e5cd5` actually shares merge base `6585e6a7` with that target. This accidentally
reversed an already integrated change in nine locale files and one English
provider-reference row. The original contributor's feature did not make those
reversals; this was a carry-boundary error.

Restore only that established target delta, preserving the new management keys
and controls. Future carries use the actual Git merge base and review target
drift separately. The earlier B sources #3653, #3654 and #3571 were checked:
their recorded bases equal their actual merge bases, with no overlapping drift.

The GUI locator must use the displayed provider name rather than assuming its
capitalization; all inventory, search/cap and native-selection assertions remain.
The repaired head requires fresh GUI execution and build evidence. Initial
failures remain recorded and are not reported as passing checks.
18 changes: 18 additions & 0 deletions devlog/_plan/260906_lane_b_catalog_stack/044_react_doctor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 044 — Separate React Doctor gate

The cross-platform workflow passed at `b33d9347`, but the separate pinned React
Doctor 0.9.11 workflow failed. A cold remote reproduction reported one repeated
array-lookup warning, three test-render global-publication errors, and one unused
timestamp binding in a changed test file. Ordinary lint/build success did not
resolve this gate.

Use a Set for selected-model membership while preserving the native exclusion.
Publish test controls from an effect, release only their owned handles on unmount,
and call the current harness setter directly from its retry callback. Remove the
unused pure timestamp calculation without changing the stale-coverage fixture.
No assertions, waiting bounds, scanner rules or warning threshold are relaxed.

The repaired candidate needs a cold pinned scan, the affected GUI tests and its
current-head hosted checks. Existing browser evidence remains evidence of the
recorded source; reuse requires an explicit comparison of the small membership
lookup change rather than pretending the application bytes are unchanged.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 9 additions & 2 deletions docs-site/src/content/docs/fr/guides/codex-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,15 @@ S'il manque un modèle dans Codex, ou si l'ordre ou la visibilité du catalogue
d'autorisation n'atteint jamais le catalogue.
2. **`disabledModels`** au niveau supérieur — masque les modèles dans le catalogue comme dans `/v1/models`, et
fait passer les identifiants GPT natifs non qualifiés à `visibility: "hide"`.
3. **`liveModels: false` avec `models` vide** — lorsque la découverte en direct est désactivée et que `models`
est vide ou absent, opencodex n'expose aucun modèle routé pour ce fournisseur.
3. **`liveModels: false`** — Avec `liveModels: false`, si `models` est vide ou absent, la liste initiale commence par le
`defaultModel` configuré, puis les identifiants de `retainModels`. Les doublons sont supprimés
en conservant leur première occurrence. Une liste `models` explicite non vide est au contraire
suivie de `retainModels`, sans ajout implicite d’un autre `defaultModel`. Ce dernier peut toujours
être inscrit explicitement dans `models` ou `retainModels`. Si aucun de ces champs ne fournit
d’identifiant, la liste initiale est vide. Cet ordre ne garantit pas l’ordre final du sélecteur.
`selectedModels`, `disabledModels` et la désactivation du fournisseur restent applicables.
`authMode: "forward"` conserve sa branche distincte et n’utilise pas cette liste statique routée.
Ces règles ne changent pas le repli en cas d’échec de la découverte en direct.
4. **Cursor `GetUsableModels`** — l'adaptateur Cursor découvre les modèles par son appel RPC protobuf
`GetUsableModels`, et non par `/models` ; une modification côté Cursor peut donc changer les identifiants visibles
indépendamment des autres fournisseurs.
Expand Down
21 changes: 21 additions & 0 deletions docs-site/src/content/docs/fr/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,27 @@ uniquement si la liste d'autorisation de son fournisseur l'inclut — ou si aucu
s'il n'est pas désactivé. Activer un modèle réconcilie atomiquement les deux filtres ; **Tout activer** efface
la liste d'autorisation du fournisseur afin que les modèles découverts ultérieurement soient eux aussi actifs.

### Gérer les modèles dans l’espace fournisseur

Dans l’onglet **Modèles** d’un fournisseur, **Supprimer** retire la définition personnalisée
stockée. Le modèle natif ou découvert sous-jacent peut alors réapparaître ; le nombre de modèles
peut donc rester identique. **Masquer** change uniquement la visibilité dans le catalogue, sans
supprimer la définition ni modifier la politique de routage direct. **Gérer la visibilité dans
Modèles** ouvre la page **Modèles** pour rétablir la visibilité, même si l’onglet du fournisseur
ne contient plus aucune ligne.

**Ajouter** enregistre une définition personnalisée sans effacer un masquage existant ni les
règles de sélection du fournisseur. Un modèle enregistré peut donc rester masqué. Si le modèle
est déjà connu, gérez sa visibilité dans **Modèles**. Un enregistrement confirmé reste valable
même si l’actualisation du catalogue échoue : suivez le message d’actualisation au lieu d’ajouter
le modèle à nouveau. Si la modification n’est pas confirmée, actualisez l’état des modèles avant
de réessayer.

Le compteur du fournisseur indique le nombre d’entrées uniques non désactivées dans l’inventaire
courant renvoyé par le serveur, avant recherche ou limitation de l’affichage. Il ne mesure ni la
liste d’autorisation ni les résultats de découverte en direct et ne prouve pas l’origine d’une
entrée. Les badges de sélection et les informations de découverte restent distincts.

## Sélecteur de délégation et routage des créations de sous-agents

Le sélecteur **Délégation de sous-agent** du tableau de bord enregistre `injectionModel` et, facultativement,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ sauvegarde dont le contenu diffère, puis réécrit en identifiants sans préfix
| `apiKeyTransport?` | `"x-api-key" \| "bearer"` | Style de l'en-tête de clé Anthropic. La valeur par défaut est l'en-tête natif `x-api-key` ; ce champ n'est valable que pour les fournisseurs `anthropic` authentifiés par clé. |
| `apiKeyPool?` | `ApiKeyPoolEntry[]` | Pool multi-clés. `apiKey` reflète l'entrée active ; chaque élément a `id`, `key`, `label` facultatif et `addedAt` numérique facultatif. |
| `defaultModel?` | `string` | Modèle utilisé lorsque ce fournisseur est sélectionné sans modèle explicite. |
| `models?` | `string[]` | Liste initiale ou de repli des modèles. Avec `liveModels: false`, ce sont les seuls modèles découverts. |
| `models?` | `string[]` | Liste initiale ou de repli. Avec `liveModels: false`, une liste `models` non vide est suivie de `retainModels` ; si `models` est vide ou absent, la liste commence par `defaultModel` (si configuré), puis `retainModels`, en conservant la première occurrence de chaque identifiant. |
| `liveModels?` | `boolean` | Récupère le catalogue actif au démarrage et lors de la synchronisation (true par défaut). Les fournisseurs personnalisés utilisent `${baseUrl}/models` ; les fournisseurs intégrés peuvent employer une URL de registre et un filtre. |
| `selectedModels?` | `string[]` | Liste autorisée du catalogue après la découverte. Non vide expose uniquement ces identifiants ; vide ou omis expose tous les modèles découverts. |
| `contextWindow?` | `number` | Repli contextuel à l’échelle du fournisseur lorsque les métadonnées en amont sont absentes ; sinon, un plafond qui conserve des métadonnées en direct plus petites. Le tableau de bord Modèles expose cela séparément de `providerContextCaps`. |
Expand Down Expand Up @@ -436,8 +436,17 @@ modèle. Le même mappage s'applique à un sélecteur natif `vercel/<model-id>`

## Listes autorisées de modèles statiques

Réglez `liveModels: false` pour exposer uniquement `models`. Si `models` est vide ou omis, le fournisseur n'expose
aucun modèle routé. La découverte dynamique rejette plus de 4 Mio ou 2 000 lignes de modèle brutes avant leur mise en cache ;
Avec `liveModels: false`, si `models` est vide ou absent, la liste initiale commence par le
`defaultModel` configuré, puis les identifiants de `retainModels`. Les doublons sont supprimés
en conservant leur première occurrence. Une liste `models` explicite non vide est au contraire
suivie de `retainModels`, sans ajout implicite d’un autre `defaultModel`. Ce dernier peut toujours
être inscrit explicitement dans `models` ou `retainModels`. Si aucun de ces champs ne fournit
d’identifiant, la liste initiale est vide. Cet ordre ne garantit pas l’ordre final du sélecteur.
`selectedModels`, `disabledModels` et la désactivation du fournisseur restent applicables.
`authMode: "forward"` conserve sa branche distincte et n’utilise pas cette liste statique routée.
Ces règles ne changent pas le repli en cas d’échec de la découverte en direct.

La découverte dynamique rejette plus de 4 Mio ou 2 000 lignes de modèle brutes avant leur mise en cache ;
les préréglages intégrés peuvent appliquer des limites inférieures et filtrer les lignes admissibles à la conversation. Les résultats trop volumineux ou mal formés
utilisent le catalogue obsolète ou configuré comme solution de repli. Un résultat valide ne contenant aucun modèle admissible fait autorité et n'est pas
silencieusement remplacé ou tronqué.
Expand Down
10 changes: 8 additions & 2 deletions docs-site/src/content/docs/guides/codex-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -466,8 +466,14 @@ If a model is missing from Codex, or the catalog order/visibility looks wrong, c
catalog.
2. **`disabledModels`** (top level) — hides models from both the catalog and `/v1/models`, and flips
bare native GPT slugs to `visibility: "hide"`.
3. **`liveModels: false` with empty `models`** — when live discovery is off and `models` is empty or
omitted, opencodex exposes no routed models for that provider.
3. **`liveModels: false`** — With `liveModels: false`, an empty or omitted `models` list seeds the configured `defaultModel`
first, followed by `retainModels`; duplicate ids are removed while preserving first occurrence.
A nonempty explicit `models` list instead seeds `models` followed by `retainModels`, without
implicitly adding a different `defaultModel`. That default can still be listed explicitly in
`models` or `retainModels`. If none of these fields supplies an id, the static seed is empty.
This is seed order, not a promise of final picker order. `selectedModels`, `disabledModels` and
provider-disabled policy still apply. `authMode: "forward"` keeps its separate branch and does
not use this routed static seed. These rules do not change live-discovery failure fallback.
4. **Cursor `GetUsableModels`** — the Cursor adapter discovers models through its protobuf
`GetUsableModels` RPC, not `/models`, so a Cursor-side change can alter which ids are visible
independently of other providers.
Expand Down
19 changes: 19 additions & 0 deletions docs-site/src/content/docs/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,25 @@ new or that every upstream measurement was refreshed.

The **Models** switches show final Codex visibility: a routed model is on only when its provider allowlist includes it (or no allowlist is set) and it is not disabled. Turning a model on reconciles both filters atomically; **All on** clears the provider allowlist so newly discovered models are also on.

### Managing models in a provider workspace

In a provider’s **Models** tab, **Delete** removes the stored custom definition. An underlying
native or live-discovered model may then appear again, so the model count can stay the same.
**Hide** changes catalog visibility only: it does not delete the definition or change direct
routing policy. Use **Manage visibility in Models** to open the **Models** page and restore
visibility, even when the provider tab has no rows left.

**Add** saves a custom definition; it does not clear an existing hide or provider selection rule.
A saved model can therefore remain hidden. If the model is already known, manage its visibility
in **Models**. A confirmed save with a failed catalog refresh is still saved: follow the refresh
message instead of adding it again. If the change cannot be confirmed, refresh the model state
before retrying.

The provider’s model count is the number of unique, non-disabled entries in the current model
inventory returned by the server, before search or display truncation. It is not the provider
allowlist size, a live-discovery count, or proof that an entry was discovered upstream. Selection
badges and discovery information remain separate from that count.

## Delegation picker vs spawn routing

The Dashboard's **Sub-agent delegation** picker stores `injectionModel` and, optionally,
Expand Down
10 changes: 8 additions & 2 deletions docs-site/src/content/docs/ja/guides/codex-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,14 @@ ocx sync-cache
空または省略すると、検出されたすべてのモデルが公開されます。ホワイトリストにない ID はカタログに到達しません。
2. **`disabledModels`** (トップレベル) — カタログと `/v1/models` の両方からモデルを非表示にし、反転します
裸のネイティブ GPT スラッグを `visibility: "hide"` にします。
3. **`liveModels: false` と空の `models`** — ライブ検出がオフで、`models` が空の場合、または
省略すると、opencodex はそのプロバイダーのルーティング モデルを公開しません。
3. **`liveModels: false`** — `liveModels: false` で `models` が空または省略されている場合、初期一覧には設定済みの
`defaultModel`、`retainModels` の順で ID を追加し、重複は最初の出現だけを残します。
空でない `models` が明示されている場合は、`models`、`retainModels` の順になり、別の
`defaultModel` を暗黙に追加しません。そのモデルも `models` または `retainModels` に明示すれば
含められます。どのフィールドにも ID がなければ初期一覧は空です。この順序は最終的なピッカーの
表示順を保証しません。`selectedModels`、`disabledModels`、プロバイダーの無効化は引き続き適用されます。
`authMode: "forward"` は別の分岐を維持し、このルーティング用の静的一覧を使いません。
これらの規則はライブ検出失敗時のフォールバックを変更しません。
4. **Cursor `GetUsableModels`** — Cursor アダプターはその protobuf を通じてモデルを検出します。
`/models` ではなく `GetUsableModels` RPC であるため、カーソル側の変更により、他のプロバイダーとは独立して表示される ID が変更される可能性があります。
5. **キャッシュと `ocx sync`** - ライブ カタログは約 5 分間キャッシュされます (`modelCacheTtlMs`、
Expand Down
Loading
Loading