Skip to content

feat(v0.7.0): Combos redesign, v0.app rewrite, FreeBuff/v0 profiles, …#1

Merged
rsalmn merged 1 commit into
mainfrom
v0.7.0
Jul 15, 2026
Merged

feat(v0.7.0): Combos redesign, v0.app rewrite, FreeBuff/v0 profiles, …#1
rsalmn merged 1 commit into
mainfrom
v0.7.0

Conversation

@rsalmn

@rsalmn rsalmn commented Jul 15, 2026

Copy link
Copy Markdown
Owner

…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

…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
@rsalmn
rsalmn merged commit 5904802 into main Jul 15, 2026
@rsalmn
rsalmn requested a review from Copilot July 17, 2026 19:00
@rsalmn rsalmn self-assigned this Jul 17, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants