merge: DurinDoor 2.2.0 release - #360
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 69f165a558
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| { id: "gemini-2.5-pro-stt", name: "Gemini 2.5 Pro (Best)", params: ["language","prompt"], kind: "stt" }, | ||
| { id: "gemini-2.5-flash-stt", name: "Gemini 2.5 Flash", params: ["language","prompt"], kind: "stt" }, | ||
| { id: "gemini-2.5-flash-lite-stt", name: "Gemini 2.5 Flash Lite (Cheapest)", params: ["language","prompt"], kind: "stt" }, |
There was a problem hiding this comment.
Keep Gemini STT IDs provider-facing
When a user selects any of these STT rows, the request reaches handleSttCore with this catalog id unchanged; transcribeGemini() builds the upstream URL as ${cfg.baseUrl}/${model}:generateContent (open-sse/handlers/sttCore.js:110). Google documents audio transcription through normal Gemini audio-understanding model ids (docs), and this commit renamed only the catalog ids without adding an upstream mapping, so the default STT selection will call /models/gemini-2.5-pro-stt:generateContent and fail upstream. Keep the displayed id equal to the provider id or add a mapping that the STT path honors.
Useful? React with 👍 / 👎.
| category: "apikey", | ||
| transport: { | ||
| baseUrl: "https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions", | ||
| baseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions", |
There was a problem hiding this comment.
Keep alicode-intl on its coding endpoint
alicode-intl is still treated elsewhere as the Coding Plan provider: the connection test path and model discovery configs continue to hardcode coding-intl.dashscope.aliyuncs.com (src/app/api/providers/[id]/test/testUtils.js:737-739, src/app/api/providers/[id]/models/providerModelsConfig.js:219-224), while alibaba already covers the standard dashscope-intl endpoint. Alibaba's base-url docs state API keys must match their billing plan/base URL (docs), so existing Coding Plan keys saved under this provider will now be sent to the standard DashScope host for chat and fail auth; update the provider identity/code paths consistently or keep the coding-plan base here.
Useful? React with 👍 / 👎.
| // OpenAI transport does not require Claude spoof headers; keep an empty | ||
| // headers object so DefaultExecutor does not try to fall back to the | ||
| // primary transport's headers and break the cookie-shape request. | ||
| headers: {}, |
There was a problem hiding this comment.
Add OpenAI transport auth without Claude overlay
For AgentRouter requests routed to this OpenAI transport, DefaultExecutor.buildHeaders() uses rt?.auth || AUTH_DESCRIPTORS[this.provider] (open-sse/executors/default.js:400). Because this transport defines no auth, any prior Claude Code request that populated the global Claude header cache makes the OpenAI /v1/chat/completions call run the provider-level claudeOverlay hook and receive Anthropic/Claude CLI identity headers, despite the comment saying this endpoint should not inherit Claude spoof headers. Give this runtime transport its own x-api-key auth descriptor without the Claude hook.
Useful? React with 👍 / 👎.
| apiKeyUsageTotals: { | ||
| columns: { | ||
| apiKeyId: "TEXT PRIMARY KEY", | ||
| totalTokens: "INTEGER DEFAULT 0", | ||
| totalCost: "REAL DEFAULT 0", |
There was a problem hiding this comment.
Preserve the API-key totals table shape
On fresh databases, migration 001 builds tables from TABLES before migration 006 runs, and this second apiKeyUsageTotals entry overrides the earlier definition that included REFERENCES apiKeys(id) ON DELETE CASCADE and NOT NULL constraints. Fresh installs therefore create a different published table shape, so deleteApiKey() removes only the API-key row and leaves stale usage totals behind, while upgraded installs still cascade. Keep a single definition matching the migration shape or add an explicit migration for the intended constraint change.
Useful? React with 👍 / 👎.
| * Either a "provider/model" string or an object with provider/model fields. | ||
| * @returns {Promise<{ provider: string | null, model: string | null, maxOutputTokens: number | null }>} | ||
| */ | ||
| export async function getResolvedModelCapabilities(input) { |
There was a problem hiding this comment.
Wire capability overrides into chat dispatch
modelCapabilityOverrides are never applied on the request path: the only references to this resolver are its own exports, while chat dispatch still gets caps from loadCustomCapabilities() and then handleChatCore reads modelCapabilities.maxOutput (not this helper's maxOutputTokens). As a result, rows saved in the new table cannot change max-token clamps or thinking/vision decisions in production. Wire this resolver into loadCustomCapabilities/chat dispatch and return the existing capability shape.
Useful? React with 👍 / 👎.
Summary
release/2.1.3pattern).Type
chore:— release mergeBreaking changes
Testing
node /tmp/gate.mjs) confirmed 6072 tests with 5 pre-existing baseline failures and 0 novel regressions.cd tests && npm run test:ci;node /tmp/gate.mjs.'/home/cortexos/.omp/agent/sessions/-Developer-github.com-bloodf-durindoor/2026-07-20T00-26-30-784Z_019f7cea-ce00-7000-8304-4bfada25617f/local/release-cutover-plan.md','/home/cortexos/.omp/agent/sessions/-Developer-github.com-bloodf-durindoor/2026-07-20T00-26-30-784Z_019f7cea-ce00-7000-8304-4bfada25617f/local/release-cutover-0709-report.md','/home/cortexos/.omp/agent/sessions/-Developer-github.com-bloodf-durindoor/2026-07-20T00-26-30-784Z_019f7cea-ce00-7000-8304-4bfada25617f/local/release-cutover-0710-0713-report.md','/home/cortexos/.omp/agent/sessions/-Developer-github.com-bloodf-durindoor/2026-07-20T00-26-30-784Z_019f7cea-ce00-7000-8304-4bfada25617f/local/release-cutover-final-merges-report.md'.Checklist
# 2.2.0section)Release v2.2.0 highlights
targetFormat.expiresAt).open-sse/AGENTS.mdreference inCLAUDE.mdcorrected to point at rootAGENTS.md.Notes
feat/durindoor-fixes-portsandfeat/durindoor-full-syncwere NOT wholesale-merged (full-sync would have wiped dev's MCP/compression/quota/icons/skills evolution). Three hand-port commits landed the genuine fix-class changes (agentrouter transports, AliCode endpoint, xai expiresAt).fb5d20bd9; P2 CLAUDE.md pointer fixed in839cc2065; remaining 3 P2 concerns tracked as post-release follow-ups: Gemini STT IDs, apiKeyUsageTotals TABLES ordering, capability-override runtime wiring).