Conversation
…provider audit fixes, OpenVecta, Semantic Cache New Features: - Combos page total redesign: 3 tabs (Overview/Combos/Templates), KPI row, search/filter, expandable cards with strategy indicators - Combo modal redesign: drag-reorder, strategy tips, model count badge, cleaner layout - v0.app executor rewrite: new endpoint + custom diff protocol parser (replaces v0.dev SSE) - v0.app profile + balance display (avatar, plan, credits remaining) - FreeBuff cookie provider: NextAuth SSE executor + profile + auto-refresh cookies - FreeBuff profile display (avatar, name, email, session expiry) - OpenVecta API-key provider (OpenAI-compatible, 9 seed models) - Semantic Cache: Jaccard similarity-based response cache with configurable threshold - Model Cost Estimator in Playground stats bar - Provider Health Timeline sparkline in detail page - Retry exponential backoff + jitter + retry visualization chart - Per-model Thinking Level Picker + Thought Level toggle per provider - 'New' badge system for unseen providers + sidebar nav items - MITM stale-lock recovery (auto-delete orphan lock files) - Ponytail: 12 dedicated regression tests - Webhook alerts dedicated page + camelCase/snake_case bug fix Fix Bug: - Step reasoning_effort normalization (minimal→low, auto→omit) - Kimi reasoning_effort normalization (minimal→low, xhigh→high, auto→omit) - buildOutput filter missing from RTK registry - PassthroughModelsSection dead import removed - Meta AI: AttachmentInput GraphQL schema change (omit attachments field) - C1: api-airforce missing from validate/route.js - C2: Thinking suffix (level) override dead code — pass original model to translateRequest - C3: freebuff-web + zenmux-free ignore proxyOptions - C4: freebuff-web + zenmux-free no abort check in read loops - H1: refreshedCookie race condition (per-connection debounce) - H2: retryCount dropped in sseToJsonHandler - H3: Vault LAST_ISSUED race (thread keyName through auth.js) - H4: getActiveVaultProviders only checks seed[0] - M1-M2: mimo-free, devin, vertex test probes added - M3: openvecta missing from validate/route.js - M4: *o1*/*o3*/*o4* capability patterns too broad (tightened) - M5: *claude* catch-all too broad (tightened to *claude-*) - M6: zenmux-free missing SVG icon - M7: Vault cooldown cap hardcoded 5min (use MAX_RATE_LIMIT_COOLDOWN_MS) - M8: Unrecognized reasoning_effort values leak to upstream (whitelist filter) - RTK git-log filter + caveman upstream-aligned style rules - Ponytail dedicated tests - v0-vercel-web executor: 3 critical + 4 medium audit fixes
There was a problem hiding this comment.
Pull request overview
This PR advances ExtremeRouter to v0.7.0, combining a major Combos UI redesign/refactor with several provider/executor additions and reliability fixes across the SSE gateway and dashboard (vault concurrency handling, cookie refresh, provider validation, and web-cookie executors).
Changes:
- Refactors the Combos page into a modular 3-tab experience (Overview / Combos / Templates) with redesigned cards and modal UX.
- Adds/updates providers and web-cookie integrations (FreeBuff + OpenVecta + v0.app rewrite) plus associated profile endpoints and UI widgets.
- Improves operational reliability (vault key rate-limit targeting, MITM stale-lock recovery, capability pattern tightening, retry/usage plumbing).
Reviewed changes
Copilot reviewed 38 out of 41 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| src/sse/services/auth.js | Vault rate-limit marking now supports passing the explicit issued key name and uses the shared cooldown cap constant. |
| src/sse/handlers/chat.js | Threads the vault-issued key name into markAccountUnavailable() to avoid LAST_ISSUED concurrency races. |
| src/mitm/manager.js | Adds stale-lock recovery logic when the MITM start lockfile is orphaned. |
| src/app/api/providers/validate/route.js | Adds validation probes for devin/openvecta/api-airforce/freebuff-web provider credentials. |
| src/app/api/providers/[id]/v0-profile/route.js | New API route to fetch v0.app user profile + plan/balance for dashboard display. |
| src/app/api/providers/[id]/test/testUtils.js | Adds connection test probes for mimo-free/devin/vertex/openvecta/freebuff-web. |
| src/app/api/providers/[id]/freebuff-profile/route.js | New API route to fetch FreeBuff user profile from NextAuth session. |
| src/app/(dashboard)/dashboard/providers/components/ProviderCardV2.js | Adds SVG icon IDs for new providers. |
| src/app/(dashboard)/dashboard/providers/[id]/V0Profile.js | New client component to render v0.app profile + credits in provider detail UI. |
| src/app/(dashboard)/dashboard/providers/[id]/page.js | Displays FreeBuff/v0 profile widgets and re-enables the Thought Level selector UI. |
| src/app/(dashboard)/dashboard/providers/[id]/FreeBuffProfile.js | New client component to render FreeBuff profile + expiry badge. |
| src/app/(dashboard)/dashboard/overview/components/FreeProvidersGrid.js | Adds SVG icon IDs for new providers in overview grid. |
| src/app/(dashboard)/dashboard/combos/page.js | Replaces the previous large page with a Suspense wrapper around the new inner page module. |
| src/app/(dashboard)/dashboard/combos/components/ModelItem.js | New sortable, inline-editable model row component for combo modal. |
| src/app/(dashboard)/dashboard/combos/components/helpers.js | New shared helpers/constants for strategy metadata, filtering, sorting, and KPIs. |
| src/app/(dashboard)/dashboard/combos/components/ComboTemplatesTab.js | New templates tab UI and apply logic for templates. |
| src/app/(dashboard)/dashboard/combos/components/ComboOverview.js | New overview tab: KPIs, strategy distribution, and combo health summary. |
| src/app/(dashboard)/dashboard/combos/components/ComboList.js | New combos tab: search/filter/sort + expandable cards. |
| src/app/(dashboard)/dashboard/combos/components/ComboFormModal.js | New create/edit combo modal with drag reorder and improved UX. |
| src/app/(dashboard)/dashboard/combos/components/ComboCard.js | New expandable combo card with strategy indicator + fusion/swarm config. |
| src/app/(dashboard)/dashboard/combos/CombosPageInner.js | New container handling tab routing, fetching, modals, and strategy patching. |
| public/providers/zenmux-free.svg | Adds missing Zenmux Free SVG icon asset. |
| public/providers/openvecta.svg | Adds OpenVecta SVG icon asset. |
| public/providers/freebuff-web.svg | Adds FreeBuff Web SVG icon asset. |
| package.json | Bumps app version to 0.7.0. |
| open-sse/translator/concerns/thinkingUnified.js | Adds thinking level whitelist to prevent invalid enums from leaking upstream. |
| open-sse/services/credentialVault.js | Improves vault provider visibility by checking decryptability across all seed entries. |
| open-sse/providers/registry/v0-vercel-web.js | Updates v0 provider metadata for v0.app and new custom transport format. |
| open-sse/providers/registry/openvecta.js | Adds OpenVecta OpenAI-compatible provider registry entry with seed models. |
| open-sse/providers/registry/index.js | Registers OpenVecta and FreeBuff providers. |
| open-sse/providers/registry/freebuff-web.js | Adds FreeBuff web-cookie provider registry entry. |
| open-sse/providers/capabilities.js | Tightens capability matching patterns for o-series and Claude IDs to reduce false positives. |
| open-sse/handlers/chatCore/sseToJsonHandler.js | Plumbs retryCount through forced-SSE-to-JSON usage recording. |
| open-sse/handlers/chatCore.js | Adds per-connection debounce for cookie auto-refresh and passes original model to translation for thinking suffix. |
| open-sse/executors/zenmux-free.js | Adds proxy support + abort checks and improves non-streaming collection abort safety. |
| open-sse/executors/v0-vercel-web.js | Rewrites executor for v0.app custom diff protocol (stream + non-stream parsing + cookie refresh). |
| open-sse/executors/muse-spark-web.js | Updates Meta AI GraphQL request body to omit removed attachments field. |
| open-sse/executors/index.js | Registers the FreeBuff specialized executor. |
| open-sse/executors/freebuff-web.js | New FreeBuff executor translating FreeBuff SSE to OpenAI-compatible streaming/JSON with cookie refresh. |
| cli/package.json | Bumps CLI version to 0.7.0. |
| .zcode/plans/plan-sess_0fb14beb-f5bd-4d7a-9f96-6a643f3434a8.md | Adds a Combos redesign planning document. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+31
to
+35
| await fetch("/api/settings", { | ||
| method: "PATCH", | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: JSON.stringify({ comboStrategies: { [template.name]: { fallbackStrategy: template.strategy } } }), | ||
| }); |
| JSON.stringify({ | ||
| id: cid, object: "chat.completion", created, model: modelId, | ||
| choices: [{ index: 0, message: msg, finish_reason: "stop" }], | ||
| usage: { prompt_tokens: Math.ceil(fullText.length / 4), completion_tokens: Math.ceil(content.length / 4), total_tokens: 0 }, |
Comment on lines
+1060
to
+1067
| const res = await fetch("https://api.devin.ai/v1/sessions", { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` }, | ||
| body: JSON.stringify({ prompt: "ping", idempotency_id: "validation-" + Date.now() }), | ||
| }); | ||
| isValid = res.status !== 401 && res.status !== 403; | ||
| if (!isValid) error = "Invalid Devin API key"; | ||
| } catch (err) { |
Comment on lines
+1
to
+2
| import { NextResponse } from "next/server"; | ||
| import { getProviderConnectionById, updateProviderConnection } from "@/lib/localDb"; |
Comment on lines
+128
to
132
| if (cfg.mode === "level") { | ||
| // Validate against known levels — reject unknown client-injected values. | ||
| return VALID_LEVELS.has(cfg.level) ? cfg.level : null; | ||
| } | ||
| if (cfg.mode === "level") return cfg.level; |
Comment on lines
+1
to
+5
| ## Plan: Combos Page Total Redesign | ||
|
|
||
| ### Struktur: 3 Tab (URL-synced, mirip Usage page) | ||
|
|
||
| ``` |
Comment on lines
+1057
to
+1059
| // 401/403 = bad key, 200/201 = valid, other = unknown | ||
| const valid = res.status !== 401 && res.status !== 403; | ||
| return { valid, error: valid ? null : "Invalid Devin API key" }; |
Comment on lines
+166
to
+178
| const messages = body?.messages || []; | ||
| const userMessages = messages.filter((m) => m.role === "user"); | ||
| const sysMessages = messages.filter((m) => m.role === "system"); | ||
| const lastUser = userMessages[userMessages.length - 1]; | ||
| const userText = typeof lastUser?.content === "string" | ||
| ? lastUser.content | ||
| : Array.isArray(lastUser?.content) | ||
| ? lastUser.content.filter((c) => c.type === "text").map((c) => c.text).join("\n") | ||
| : "Hello"; | ||
| const sysText = sysMessages.length > 0 | ||
| ? (typeof sysMessages[0].content === "string" ? sysMessages[0].content : "") | ||
| : null; | ||
| const fullText = sysText ? `${sysText}\n\n${userText}` : userText; |
Comment on lines
+64
to
+76
| const messages = body?.messages || []; | ||
| const userMessages = messages.filter((m) => m.role === "user"); | ||
| const sysMessages = messages.filter((m) => m.role === "system"); | ||
| const lastUser = userMessages[userMessages.length - 1]; | ||
| const userText = typeof lastUser?.content === "string" | ||
| ? lastUser.content | ||
| : Array.isArray(lastUser?.content) | ||
| ? lastUser.content.filter((c) => c.type === "text").map((c) => c.text).join("\n") | ||
| : "Hello"; | ||
| const sysText = sysMessages.length > 0 | ||
| ? (typeof sysMessages[0].content === "string" ? sysMessages[0].content : "") | ||
| : null; | ||
| const fullText = sysText ? `${sysText}\n\n${userText}` : userText; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…provider audit fixes, OpenVecta, Semantic Cache
New Features:
Fix Bug: