Conversation
…forwarded role (lidge-jun#5334 follow-up) lidge-jun#5334 made the developer wire role tri-state: an undeclared destination folds it to system. Two suites asserting role:"developer" on the Chat wire were missed because they are about tool-result repair ordering and document parts, not role selection — declare the destination, per the convention the change established. Verified: both files fail on dev@600075d2 with system-for-developer wire roles and pass with the declaration. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Repository: luvs01/opencodex/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
✅ Deterministic PR hygiene checks passed. |
…etadata alias The transport guard added in a2aadb7 looked the provider name up as a registry id only, so a provider saved under a canonical metadata alias (gemini, anthropic-key, gemini-vertex, ...) failed the lookup and its vendor metadata verdict was discarded — generated text-only models fell back to unknown, bypassing vision preprocessing and picker exclusion. providerMatchesRegistryTransportOrAlias resolves the name to the entry that owns it (by id or declared extraMetadataAliases, case-folded like resolveMetadataProvider) and validates the configured transport against that entry, so an aliased row follows its owner's pinning rule. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
Fixed in 3cb3d0a. Added |
|
Fixed in 3cb3d0a — same root cause. The guard now calls |
Routing binds a name to a registry transport by exact id only, so an alias- or case-named row keeps its configured destination. The owning entry's generated verdict is now authoritative only when the configured adapter, auth mode, and normalized endpoint literally equal that entry's declared transport; the previous fallback applied the owner's pinning rule (google is name-pinned, so it returned true unconditionally) and let a custom gemini/anthropic-key/case-varied destination inherit verdicts for an upstream it never reaches. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
…ility Co-Authored-By: Epinephrine <luvs01@hanmail.net>
…stry.ts The alias/case-varied transport check grew src/providers/registry.ts to 280 lines, over its file-size-ratchet cap of 232. Move the matcher to a dedicated module and export normalizedProviderEndpoint; behavior unchanged. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
End-to-end verified on Windows ( Seeded Vision-sidecar picker ( Write gate + regression details
|
|
Fixed in c1d7a58 (extracted to |
|
Addressed — the description now documents the alias/case-varied ownership semantics explicitly: generated-metadata aliases and case-varied ids resolve to the declaring registry entry, and for non-exact names the configured adapter, auth mode, and normalized endpoint must literally equal that entry's declared transport rather than reusing the owner's pinning rule. |
…ry endpoints providerMatchesRegistryTransportOrAlias returned true unconditionally for exact ids on presets whose URL routing honors (allowBaseUrlOverride) and dropped verdicts for names at declared former endpoints. Both paths now share declared-destination validation: the configured adapter, auth mode, and normalized endpoint must literally equal the fixed transport, a documented baseUrlChoices endpoint, or a destinationAliases former endpoint; arbitrary custom endpoints are unknown. metadataImageInput folds the provider name case-insensitively so bundle keys (all lowercase) resolve for case-varied configured names like ZAI. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
Resolved — fixed in 82ef87e. |
1 similar comment
|
Resolved — fixed in 82ef87e. |
|
Resolved — consolidation landed in 82ef87e. |
For an exact allowBaseUrlOverride id, routedProviderConfig canonicalizes the adapter to entry.adapter and derives the auth mode — only the configured URL reaches the wire — so literal adapter/auth matching dropped valid verdicts from canonical rows missing fields like authMode (a legacy google-antigravity row on the declared Google transport became unknown and skipped preprocessing). Override ids now prove ownership by endpoint membership in the entry's declared destinations, while preserveCustomDestination rows — never canonicalized — keep literal adapter/auth/endpoint matching, and the alias/case path is unchanged. Co-Authored-By: Epinephrine <luvs01@hanmail.net>
|
Resolved — fixed in 2fc1892. |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Summary
src/vision/eligibility.tsnow returnsundefined(unknown) unlessproviderMatchesRegistryTransportOrAliasproves the configured transport belongs to the registry row that owns the name.src/providers/registry-transport.tscentralizes that check: generated-metadata aliases (gemini→google,anthropic-key→anthropic-apikey,gemini-vertex,antigravity/gemini-antigravity) and case-varied registry ids resolve to the declaring entry —resolveMetadataProviderbinds those names to the owner's bundle, so an id-only lookup would drop verdicts the registry still owns.allowBaseUrlOverridepresets, andpreserveCustomDestinationpresets — is validated against the owner's declared destinations: the configured adapter, auth mode, and normalized endpoint must literally equal the fixed transport, a documentedbaseUrlChoicesendpoint (a "custom" choice declares no URL and cannot match), or adestinationAliasesformer endpoint on that destination's own adapter. Routing binds transports by case-sensitive exactentry.id === providerName, so the owner's pinning rule would otherwise apply vendor verdicts to destinations routing still serves as custom — e.g. amoonshotrow pointed at an arbitrary gateway, or a customgemini/Geminiendpoint.metadataImageInputfolds the provider name case-insensitively (bundle keys are all lowercase), so a case-varied configured name such asZAIreaches its owner's bundle once the transport check passes.src/providers/registry.tsstays inside its file-size-ratchet cap by placing the matcher in the dedicatedregistry-transport.tsmodule and exportingnormalizedProviderEndpoint.structure/runtime.mddocuments that vendor metadata applies only at a declared destination (fixed,baseUrlChoices, ordestinationAliases), because routing binds transports by exact registry id only.Verification
./node_modules/.bin/bun test tests/vision/vision-eligibility.test.ts— 29 tests, 0 failures (repo-pinned Bun 1.4.0; covers azhipu-bigmodel-responsescustom preset, alias/case-variedgemini/Gemini/GOOGLEdestinations,moonshotat canonical/declaredbaseUrlChoices/arbitrary gateway, andZAIon thezaidestinationAliasesformer Chat endpoint keepingglm-5.3text-only)../node_modules/.bin/bun test tests/providers/provider-registry-parity.test.ts tests/server/config.test.ts tests/providers/provider-model-discovery-contract.test.ts— 323 tests, 0 failures../node_modules/.bin/bun run typecheck,bun run structure:check,bun run privacy:scan,bun scripts/file-size-ratchet.ts— all clean.gemini/GOOGLE/googleat canonical transport and preserved at custom endpoints.Checklist
Link to Devin session: https://app.devin.ai/sessions/ac686e5ea38b4a64940ec31393b906de
Open in Devin Desktop: https://app.devin.ai/desktop/session/ac686e5ea38b4a64940ec31393b906de?variant=devin
Requested by: @luvs01