Commit Graph

4934 Commits

Author SHA1 Message Date
Paijo
8536593bdc fix(gamification): resolve SQL bug, auth gap, pagination, and anomaly scoring (#2421)
Integrated into release/v3.8.0 — 6 critical gamification bug fixes: SQL SELECT in checkActionCountBadges, federation auth enforcement, leaderboard pagination offset, real z-score computation, addXp level calculation, and barrel index.ts
2026-05-20 01:36:56 -03:00
Diego Rodrigues de Sa e Souza
7dfcd0a4fd feat(batch): implement 10 feature requests harvested (#2414)
Integrated into release/v3.8.0 — batch of 10 feature requests: llama.cpp local provider, upstream error exposure, Termux detection, providers rotate CLI, t3.chat web skeleton, Zed Docker integration, Kiro multi-account OAuth isolation, auto-combo cost blending, auto-combo context filter, combo provider-level exhaustion tracking (#1731). Conflicts with #2417 (falloverBeforeRetry) resolved.
2026-05-20 01:29:23 -03:00
diegosouzapw
a9cef6dbad chore(merge): resolve combo.ts conflict — preserve exhaustedProviders (#1731) + falloverBeforeRetry (#2417) 2026-05-20 01:29:02 -03:00
Markus Hartung
ae94b268f0 feat: add new feature on combos - falloverBeforeRetry (#2417)
Integrated into release/v3.8.0 — falloverBeforeRetry for per-model quota skipping in combos.
2026-05-20 01:17:50 -03:00
Lenine Júnior
8bd125ed2f docs: add AgentRouter setup guide (#2422)
Integrated into release/v3.8.0 — AgentRouter setup guide docs.
2026-05-20 01:17:27 -03:00
diegosouzapw
ec23a0461d fix(mitm): point runtime manager re-export to js entrypoint
Use the emitted `.js` path for the runtime manager re-export so dynamic
runtime loading resolves correctly outside the Turbopack alias handling.
2026-05-20 00:58:55 -03:00
diegosouzapw
fbf37ae0da fix(claude): drop orphan tool_result after fixToolAdjacency strip (discussion #2410)
Discussion #2410 reports Claude returning 400 for sequences like:
  assistant: tool_use(id=X)
  user: <plain text>           ← breaks adjacency
  user: tool_result(id=X)

The previous round added `fixToolAdjacency` (commit 44d9abac9) which
correctly strips the orphan tool_use from the assistant message. But
that left the now-unmatched tool_result intact, so the upstream
rejected the request with:

  messages.N.content.M: unexpected `tool_use_id` found in `tool_result`
  blocks: X. Each tool_result block must have a corresponding tool_use
  block in the previous message.

Fix: after running `fixToolAdjacency`, re-run `fixToolPairs` to drop
the orphaned tool_result blocks. All three call sites updated:
  - contextManager.purifyHistory (both inside the binary-search loop
    and the final pass)
  - BaseExecutor message-prep (Claude path)
  - claudeCodeCompatible request signer

Also tightens an unrelated dynamic-key access in
readNestedString (claudeCodeCompatible) to satisfy the prototype-
pollution scanner triggered by the post-tool semgrep hook.
2026-05-20 00:57:10 -03:00
diegosouzapw
3ff3e3dd15 fix(playground): guard ChatPlayground filteredModels for non-string ids
Same root cause as commit 49fe356b9: ChatPlayground filtered models
with m.id.startsWith(...) which crashed on null/undefined ids returned
by /v1/models (synthetic combo entries). Apply the same defensive guard
and dedupe used in the parent page.
2026-05-20 00:43:15 -03:00
diegosouzapw
49fe356b91 fix(playground): guard against non-string model ids before .split/.startsWith
The /v1/models endpoint can include synthetic entries (combos, locals,
in-progress imports) with a null/undefined id. The playground used to
call m.id.split("/") in the provider-discovery loop, which threw on the
first non-string entry; the surrounding .catch(() => {}) silently
swallowed the error, so the provider/model/account dropdowns ended up
empty even though /v1/models returned thousands of valid entries.

- Skip entries without a string id before split/startsWith.
- Log the rejection in the .catch handler so future regressions are
  visible in DevTools instead of silently emptying the UI.
2026-05-20 00:40:00 -03:00
diegosouzapw
5ef3482254 fix(playground): dedupe filteredModels to avoid duplicate React key warning
The /v1/models endpoint can return the same model id twice (e.g., when a
model is listed by both an alias and its canonical provider), which made
the <Select> emit two <option> elements with the same key — triggering
"Encountered two children with the same key, codex/gpt-5.5".

Replace the chained filter + map with a single pass that skips ids
already added.
2026-05-20 00:32:34 -03:00
diegosouzapw
8a44ed57d7 chore(i18n): finalize round-6 keys for batch/cache/endpoint/usage
Adds the remaining keys produced by parallel agents A4, A6, A8, A9:
- common: batch-related labels (BatchDetailModal, BatchListTab,
  FileDetailModal, FilesListTab, page) + profile/leaderboard
- cache: hit rate, latency, retry, avg chars
- endpoint: token saver, API endpoints, copy URL, cloud/local labels
- usage: noSpend, activeSessions, quotaAlerts, budget timing
- skills: install/marketplace/filter
- proxyRegistry/quotaShare/mcpDashboard: misc labels

Hardcoded total: 60 → 48. Real missing keys: 0 (modePack remaining is a
false positive — combos.modePack exists but the audit can't resolve it
since IntelligentComboPanel receives t as a prop).
2026-05-19 23:52:34 -03:00
diegosouzapw
6e1105e2c2 chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 6 — 10 parallel agents)
Round-6 dispatched 10 parallel subagents covering all 57 remaining
dashboard files. Each agent worked on a disjoint file set to avoid
en.json race conditions. Added ~60 new i18n keys across 9 namespaces
covering small UI labels, table headers, search placeholders, and
empty-state messages.

Major changes:
- analytics: SearchAnalyticsTab, ProviderUtilizationTab, DiversityScoreCard, CompressionAnalyticsTab (new useTranslations + keys)
- batch: BatchDetailModal, BatchListTab, FileDetailModal, FilesListTab (new useTranslations + keys)
- settings: CliproxyapiSettingsTab, PayloadRulesTab, ModelCooldownsCard, AppearanceTab, PricingTab (mostly new useTranslations)
- endpoint: TokenSaverCard, ApiEndpointsTab, EndpointPageClient
- cache: CachePerformance, IdempotencyLayer, ReasoningCacheTab, MediaPageClient, page
- combos: IntelligentComboPanel, page
- playground: ChatPlayground, SearchPlayground
- providers: ProviderCard
- onboarding: TierFlowDiagram
- changelog: ChangelogViewer
- home: ProviderTopology, TierCoverageWidget, BootstrapBanner, BadgeToast
- usage: BudgetTab, BudgetTelemetryCards, QuotaTable
- quotaShare: QuotaSharePageClient
- profile: page
- leaderboard: page
- skills: page

Hardcoded total: 131 → 60. Real missing keys: 0 plus 1 false-positive
for combos.modePack (lookup via prop-passed t).
2026-05-19 23:47:16 -03:00
diegosouzapw
c0c2efff97 chore(i18n): resolve last 2 missing providers/[id] keys
Adds providerDetailMyClaudeAccountPlaceholder and
providerDetailPathAutoDetected — the final user-visible labels in the
providers/[id] page that the round-5 subagent rewrote to t() calls
without yet adding to en.json.

Real missing keys: 0 (6 remaining are exampleTemplates.tsx false
positives — t is passed as a parameter so the audit cannot resolve the
namespace; keys do exist at translator.templatePayloads.*).
2026-05-19 22:58:45 -03:00
diegosouzapw
546d7e95da chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 5)
Round-5 agent began processing the remaining smaller dashboard files.
Added 5 more keys to en.json for providers/[id]/page.tsx OAuth flow
labels and the cross-OS auto-detection hint.

Pages affected:
- providers/[id]/page.tsx (5 keys)

Hardcoded total: 140 → 136. Real missing keys: 0.
2026-05-19 22:53:35 -03:00
diegosouzapw
42e1466cf4 chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 4)
Round-4 subagent + manual key-resolution refactored remaining strings in
3 high-traffic settings/API tabs, plus extracted English values for
keys that were already added as t() calls but lost during the previous
en.json race-condition resets.

Pages affected:
- api-manager/ApiManagerPageClient (7 → 0 missing key)
- settings/CompressionSettingsTab (8 → 0 missing key)
- settings/MemorySkillsTab (8 → 0 missing key)
- settings/ResilienceTab (4 more keys recovered)

Hardcoded total: 164 → 140. Real missing keys: 0 (6 remaining are the
exampleTemplates.tsx false positives — t passed as parameter).
2026-05-19 22:45:17 -03:00
diegosouzapw
16277bd6df chore(i18n): localize remaining dashboard settings labels
Replace hardcoded labels in compression and resilience settings with
translation lookups to continue the dashboard i18n cleanup.

Add the v3.8.0 dashboard shakedown runbook to document the manual
smoke-test process and known dev environment pitfalls.
2026-05-19 22:35:02 -03:00
diegosouzapw
55913d1c42 chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 3)
Round-3 subagents and manual edits refactored 9 more dashboard pages
(plus 2 small extras), replacing ~80 hardcoded strings with
useTranslations() lookups. Added 79 corresponding keys to en.json
across analytics, cloudAgents, combos, common, health, settings, and
usage namespaces.

Pages affected:
- analytics/ComboHealthTab (new useTranslations + 15 keys)
- analytics/CompressionAnalyticsTab (new useTranslations + 11 keys)
- settings/SystemStorageTab (21 → 0 missing key)
- tokens/page (new useTranslations + 13 keys)
- usage/BudgetTab (9 missing fixed)
- health/page (manual: 6 keys)
- cloud-agents/page (manual: 3 keys)
- combos/page (manual: 1 key)

Hardcoded total: 249 → 164. Real missing keys: 0 (6 remaining are
exampleTemplates.tsx false positives).

Also adds scripts/i18n/build-pending-from-missing.mjs which reads
_audit.json and locates English values from HEAD to rebuild
_pending-keys.json after race-condition resets between subagent edits.
2026-05-19 22:26:29 -03:00
diegosouzapw
f8d9873e27 chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 2)
Continues round 1 (commit 8d34f4c65). Round-2 subagents refactored
additional dashboard pages, replacing 77 more hardcoded strings with
useTranslations() lookups. Added 79 corresponding keys to en.json
across the a2aDashboard, agents, analytics, apiManager, cliTools,
common, and settings namespaces.

Pages affected:
- a2a/page (new useTranslations + 6 keys)
- agent-skills/page (new useTranslations + 9 keys)
- AutoRoutingAnalyticsTab (new useTranslations + 6 keys)
- AppearanceTab (8 → 6 remaining)
- OneproxyTab (10 → 0)
- ResilienceTab (18 → 0 missing key)
- RoutingTab (7 → 0 missing key)
- VisionBridgeSettingsTab (new useTranslations + 6 keys)
- CopilotToolCard (7 → 0 missing key)
- ApiManagerPageClient (13 → 0 missing key)
- gamification/admin (new useTranslations + 7 keys)

Hardcoded total: 326 → 249. Real missing keys: 0 (the 6 still flagged
are false positives in exampleTemplates.tsx where t is passed as a
parameter — keys exist at translator.templatePayloads.*).
2026-05-19 21:50:02 -03:00
diegosouzapw
8d34f4c650 chore(i18n): replace hardcoded UI text with t() calls across dashboard (round 1)
Subagents refactored 8 high-impact dashboard pages, replacing 81 of the
407 hardcoded English/PT strings flagged by the audit with proper
useTranslations() lookups. Added 73 corresponding keys to en.json across
the home, apiManager, providers, settings, and usage namespaces.

Pages affected:
- BudgetTab (27 → 0)
- HomePageClient (2 → 0)
- RoutingTab (25 → 7)
- ResilienceTab (38 → 18)
- SystemStorageTab (42 → 21)
- providers/[id] (17 → 15)
- ApiManagerPageClient (14 → 13)
- OneproxyTab (13 → 10)

Also adds two helper scripts:
- scripts/i18n/extract-keys-from-diff.mjs — extracts new keys from git diff
- scripts/i18n/merge-keys.mjs — merges a pending-keys JSON into en.json

Remaining hardcoded strings will be addressed in follow-up rounds.
2026-05-19 21:21:46 -03:00
diegosouzapw
5f37f0f804 chore(i18n): add missing en.json keys for translator, cli-tools, memory, onboarding
Adds 58 missing keys identified by the new dashboard audit script:
- cliTools: 18 custom CLI builder keys (CustomCliCard)
- translator: 24 keys covering stream transformer, live monitor, test bench
- memory: 12 health/pagination/dialog keys
- onboarding.tier: 8 keys for the tier tour walkthrough

Also adds scripts/i18n/audit-dashboard-pages.mjs which scans all dashboard
pages, reports t() calls referencing missing en.json keys, and flags
candidate hardcoded JSX/attribute strings.
2026-05-19 20:29:33 -03:00
diegosouzapw
ef800eee40 fix(offline): avoid SSR/CSR hydration mismatch on navigator.onLine
Replace useState+lazy-initializer with useSyncExternalStore so the server
snapshot (() => false) and client snapshot (() => navigator.onLine) are
declared separately. React hydrates with the server value and switches to
the real online status client-side without a mismatch.
2026-05-19 19:58:21 -03:00
diegosouzapw
29c5a03efe fix(cli-tools): guard modelId type before calling indexOf
E2E shakedown v3.8.0: cli-tools quebrava com TypeError quando dynamicModels
continha entradas sem .id (objeto retornado diretamente em vez de string).
2026-05-19 19:41:12 -03:00
diegosouzapw
b9af4553cd docs: fix audit gaps — CHANGELOG entry for #2306 + AUTO-COMBO blended-cost notes for #1812 2026-05-19 13:18:49 -03:00
diegosouzapw
61683e0c3d chore(privacy): untrack implement-features workflow/skill/command (keep local only) 2026-05-19 13:16:14 -03:00
diegosouzapw
db674c8be0 chore(tests): move #1731 integration test to tests/integration/ 2026-05-19 12:32:26 -03:00
diegosouzapw
5040c8b254 feat(combo): track provider-level exhaustion across combo targets (#1731) 2026-05-19 12:17:16 -03:00
diegosouzapw
bfe90c0d0d feat(combo): filter auto-combo candidates by context window (#1808) 2026-05-19 11:54:56 -03:00
diegosouzapw
4bc6b33f16 fix(combo): blend output token cost into auto-combo scoring (#1812) 2026-05-19 11:41:56 -03:00
diegosouzapw
3b9cb7d568 feat(zed): complete Docker integration with manual import endpoint + UI panel (#2306)
- Refactor dockerDetect.ts to accept optional deps for testability
- Add Docker guard (HTTP 422 + zedDockerEnvironment flag) to import route
- Add POST /api/providers/zed/manual-import endpoint with Zod validation
- Add collapsible Manual Token Import panel to Zed provider page (auto-expands on Docker error)
- Add 4 unit tests for isRunningInDocker via dependency injection
- Add docs/providers/ZED-DOCKER.md Docker setup guide
2026-05-19 11:26:28 -03:00
diegosouzapw
e7eb777969 feat(providers): add t3.chat web provider skeleton (#1909)
Registers t3-web / t3chat-alias executor, 24-model registry, WEB_COOKIE_PROVIDERS
entry, i18n hints, docs row, and 19-case test suite (all passing). Endpoint URL
and SSE chunk schema require a post-devtools-capture follow-up — marked with
TODO(post-devtools-capture) comments throughout.
2026-05-19 10:56:54 -03:00
diegosouzapw
8b8bb3da1b feat(cli): add providers rotate command for upstream key rotation (#1881) 2026-05-19 10:52:47 -03:00
diegosouzapw
e57cf437db feat(kiro): isolate OAuth sessions per connection for multi-account support (#2328) 2026-05-19 10:50:50 -03:00
diegosouzapw
6756006b4f feat(errors): expose sanitized upstream error details in client responses (#1718) 2026-05-19 10:50:01 -03:00
diegosouzapw
3355920db9 feat(installer): detect Termux and skip incompatible setup steps (#1764) 2026-05-19 10:43:11 -03:00
Diego Rodrigues de Sa e Souza
f04c02c221 Merge pull request #2402 from diegosouzapw/release/v3.8.0
Release v3.8.0 — post-release hotfixes
2026-05-19 10:14:05 -03:00
diegosouzapw
ae07f437b1 fix(providers): add missing isLocalProvider import and update changelog 2026-05-19 10:12:56 -03:00
clousky2020
2ae523b12c feat(T07): API Key health tracking with A3 guard, dashboard notification, and toast navigation fixes (#2412)
Integrated into release/v3.8.0
2026-05-19 09:50:51 -03:00
Benson K B
6959e067fa Merge branch 'main' resolving upstream conflicts (#2408)
Integrated into release/v3.8.0
2026-05-19 09:48:16 -03:00
Paijo
81fb3f50e8 feat: gamification & leaderboard system (#2405)
Integrated into release/v3.8.0
2026-05-19 09:46:20 -03:00
diegosouzapw
4b2e9b780a fix(db): detect missing better-sqlite3 native binding from bun/skipped postinstall (#2358)
`bun add -g omniroute` (and any runtime that does not reliably run the
better-sqlite3 postinstall script) leaves the *.node binary undownloaded.
The `bindings()` loader then throws "Could not locate the bindings file"
BEFORE any DLOPEN happens, which the previous detector missed — the user
saw a generic 500 page instead of the friendly "Run npm rebuild
better-sqlite3" guide.

Extended isNativeSqliteLoadError() to recognise:
- "Could not locate the bindings file" (bindings module preflight)
- "Cannot find module 'better-sqlite3'" (package not even installed)
- code === "MODULE_NOT_FOUND" (Node loader fallback)

isNativeSqliteLoadError is now exported so tests can pin the contract; the
detector covers both the "wrong NODE_MODULE_VERSION" and "binary never
shipped" failure modes operators have hit in practice.
2026-05-19 04:05:36 -03:00
diegosouzapw
ca42874098 fix(providers): skip CLI runtime check for kilocode OAuth-based provider (#2404)
The kilocode provider uses OAuth device flow + direct HTTPS to api.kilo.ai
and never depends on the local kilocode CLI binary at runtime. The connection
test was hard-failing with "Local CLI runtime is not installed" even when the
OAuth token itself was perfectly valid, blocking all kilocode setups on hosts
where the CLI binary was not also installed.

Removed kilocode from CLI_RUNTIME_PROVIDER_MAP and extracted the constant to
a dedicated module so unit tests can pin the contract without dragging the
full Next.js route + DB initialization into the test runtime.

CLI Tools integration (/api/cli-tools/kilo-settings, used to configure the
Kilo VSCode extension to point at OmniRoute) keeps its own runtime check
since it actually does need the CLI binary to be present.
2026-05-19 04:04:26 -03:00
diegosouzapw
266dd038f1 docs(changelog): add feature-triage entry 2026-05-19 03:39:26 -03:00
diegosouzapw
6f6837d070 fix(triage): replace timelineItems with separate gh pr open search
Remove the unsupported `timelineItems` field from `ghIssueView`, add
`ghPrSearchOpen` wrapper, and synthesize `issue.timelineItems` in the
main loop so `classifyIssue` stays unchanged.
2026-05-19 03:33:58 -03:00
diegosouzapw
7c11b952a7 feat(skill,command): mirror Phase 0 + templates from workflow
Sync body of .agents/skills/implement-features/SKILL.md and
.claude/commands/implement-features-cc.md with the canonical
.agents/workflows/implement-features-ag.md (Phase 0 pre-flight
triage + comment templates already applied in the workflow file).
SKILL.md Codex Execution Notes section preserved.
2026-05-19 03:26:04 -03:00
diegosouzapw
2e3b6d0bc6 feat(workflow): add Phase 0 pre-flight triage + new templates
Inserts Phase 0 (deterministic triage gate), collapses Phase 1.1/1.2
into stubs, replaces Phase 1.3 issue-fetch with triage-JSON iteration,
adds YAML frontmatter to idea-file template, adds 4 comment templates
(ALREADY_DELIVERED ×3 + STALE_NEED_DETAILS), expands Phase 3.1a table
to 12 verdict rows, and extends Phase 5.4 counters to cover all triage
buckets.
2026-05-19 03:22:42 -03:00
diegosouzapw
639061ac2f test(triage): add end-to-end integration test with mocked deps 2026-05-19 03:10:38 -03:00
diegosouzapw
1110ec9d37 feat(triage): add CLI entrypoint composing all triage modules 2026-05-19 03:07:00 -03:00
diegosouzapw
d3c187a62f feat(triage): add incremental resyncIdeaFile (append-only) 2026-05-19 03:02:51 -03:00
diegosouzapw
48c2d675fb feat(triage): add lifecycle detectors (stale + closed_externally) 2026-05-19 02:58:44 -03:00
diegosouzapw
f74d276e50 feat(triage): add minimal YAML frontmatter parser/serializer 2026-05-19 02:54:21 -03:00