Commit Graph

3204 Commits

Author SHA1 Message Date
Lenine Júnior
428dfcdf2d docs(agentrouter): recommend native provider as the simple path (#2429)
Merged into release/v3.8.0
2026-05-20 08:36:01 -03:00
diegosouzapw
29c2f1bdc2 fix(model): resolve gpt-4o fallback ambiguity and prefer openai provider 2026-05-20 03:00:38 -03:00
diegosouzapw
dd790c38a2 refactor(gamification): raise federation token hashing cost
Increase PBKDF2 iterations for federation auth and server API key
hashes to better resist brute-force attacks and keep hashing behavior
aligned across leaderboard, score, and server connection flows.

Regenerate auto-generated docs entries for the Kiro setup,
gamification, and dashboard shakedown guides.
2026-05-20 02:21:37 -03:00
Diego Rodrigues de Sa e Souza
6248699ce5 Release/v3.8.0 — full changelog with 660+ commits (#2419)
* 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).

* 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.

* 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.

* 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.

* 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.*).

* 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.

* 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.

* 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).

* 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.

* 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.*).

* 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).

* 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).

* 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.

* 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.

* 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.

* 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.

* 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.

* docs: add AgentRouter setup guide (#2422)

Integrated into release/v3.8.0 — AgentRouter setup guide docs.

* feat: add new feature on combos - falloverBeforeRetry (#2417)

Integrated into release/v3.8.0 — falloverBeforeRetry for per-model quota skipping in combos.

* 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.

* 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

* docs(changelog): add post-release entries for #2414 #2417 #2421 #2422

- feat(batch): T3-Chat-Web executor, exhaustedProviders set (#1731), Zed Docker
- feat(combos): falloverBeforeRetry + setTry loop (#2417 — @hartmark)
- fix(gamification): SQL SELECT bug, federation auth, pagination, z-score (#2421 — @oyi77)
- docs: AgentRouter setup guide (#2422 — @leninejunior)

* fix(security): resolve CodeQL random/password-hash alerts and sync docs & tests

---------

Co-authored-by: diegosouzapw <diego.souza.pw@gmail.com>
Co-authored-by: Lenine Júnior <lenine@engrene.com.br>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
2026-05-20 02:05:50 -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
diegosouzapw
48235a3c66 feat(triage): add resolveVersion for delivered-issue tagging 2026-05-19 02:50:26 -03:00
diegosouzapw
3fbec5065e feat(triage): add detectDelivered with confidence grading 2026-05-19 02:45:31 -03:00
diegosouzapw
8cca3630ae fix(triage): use word-boundary matching in parseChangelog per spec 2026-05-19 02:41:38 -03:00
diegosouzapw
22400a4f86 feat(triage): add CHANGELOG parser for delivery detection 2026-05-19 02:31:47 -03:00
diegosouzapw
6b05fb7906 feat(triage): add classifyIssue with quarantine + engagement override 2026-05-19 02:20:30 -03:00
diegosouzapw
b34dc46bd0 fix(triage): clarify JSON parse errors in gh wrapper 2026-05-19 02:16:01 -03:00
diegosouzapw
b9c78d192a docs(changelog): add post-release hotfixes section + extended Hall of Fame
Closes the gap between the v3.8.0 cut (PR #2323) and the current state of
release/v3.8.0 by listing 24 PRs that landed after the initial release and
crediting every contributor that was missing from the Hall of Fame table.

Added entries cover:
- 4 security hotfixes (CodeQL #243-247 + Kiro Google OAuth)
- 4 dependency bumps (mermaid, electron, prod/dev groups)
- 9 dashboard/CLI/codex features
- 3 Claude/OAuth fixes
- README acknowledgment restore

Extended Hall of Fame credits new contributors @terence71-glitch, @TF0rd,
@slider23, @t-way666, @Rikonorus, @8mbe and updates PR tallies for
@oyi77, @backryun, @thepigdestroyer, @mrmm, @dhaern, @hartmark, @gleber,
@congvc-dev, @herjarsa, @payne0420, @InkshadeWoods.
2026-05-19 01:51:57 -03:00
diegosouzapw
4b3009ad7d feat(triage): add injectable gh/git CLI wrappers 2026-05-19 01:46:19 -03:00
diegosouzapw
cfd2e19267 feat(triage): add args parser with env var fallback 2026-05-19 01:37:28 -03:00
diegosouzapw
7ba05fdae5 chore(triage): ignore _ideia/_triage.json artifact 2026-05-19 01:33:47 -03:00
diegosouzapw
3957c4d76b chore: merge main into release/v3.8.0
Sincroniza release/v3.8.0 com tudo aplicado em main:
- CodeQL #243/#244/#245 (PR #2391)
- CodeQL #246 HMAC sessionPoolKey (PR #2394)
- CodeQL #247 drop hashing sessionPoolKey (PR #2396)
- Restore 9router acknowledgment (PR #2393)
- Dependabot: electron 42.1.0 (PR #2397)
- Dependabot: production group bumps (PR #2398)
- Dependabot: development group bumps (PR #2399)
2026-05-19 01:22:47 -03:00
Diego Rodrigues de Sa e Souza
5fcccc7364 Merge pull request #2399 from diegosouzapw/dependabot/npm_and_yarn/development-04962ea3c9
deps: bump the development group with 4 updates
2026-05-19 01:18:28 -03:00
Diego Rodrigues de Sa e Souza
70d55664ee Merge pull request #2398 from diegosouzapw/dependabot/npm_and_yarn/production-527605266c
deps: bump the production group with 4 updates
2026-05-19 01:18:16 -03:00
Diego Rodrigues de Sa e Souza
1410c50fa1 Merge pull request #2397 from diegosouzapw/dependabot/npm_and_yarn/electron/electron-42.1.0
deps: bump electron from 42.0.1 to 42.1.0 in /electron
2026-05-19 01:18:01 -03:00
dependabot[bot]
e1cde147df deps: bump the development group with 4 updates
Bumps the development group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react), [lint-staged](https://github.com/lint-staged/lint-staged) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 25.7.0 to 25.9.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitejs/plugin-react` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.2/packages/plugin-react)

Updates `lint-staged` from 17.0.4 to 17.0.5
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.4...v17.0.5)

Updates `typescript-eslint` from 8.59.3 to 8.59.4
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.4/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
- dependency-name: lint-staged
  dependency-version: 17.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
- dependency-name: typescript-eslint
  dependency-version: 8.59.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:49:30 +00:00
dependabot[bot]
2ebc84ea77 deps: bump the production group with 4 updates
Bumps the production group with 4 updates: [ink](https://github.com/vadimdemedes/ink), [react-reconciler](https://github.com/facebook/react/tree/HEAD/packages/react-reconciler), [tsx](https://github.com/privatenumber/tsx) and [undici](https://github.com/nodejs/undici).


Updates `ink` from 5.2.1 to 7.0.3
- [Release notes](https://github.com/vadimdemedes/ink/releases)
- [Commits](https://github.com/vadimdemedes/ink/compare/v5.2.1...v7.0.3)

Updates `react-reconciler` from 0.31.0 to 0.33.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/react-reconciler)

Updates `tsx` from 4.22.0 to 4.22.2
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.22.0...v4.22.2)

Updates `undici` from 8.2.0 to 8.3.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v8.2.0...v8.3.0)

---
updated-dependencies:
- dependency-name: ink
  dependency-version: 7.0.3
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: production
- dependency-name: react-reconciler
  dependency-version: 0.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production
- dependency-name: tsx
  dependency-version: 4.22.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: production
- dependency-name: undici
  dependency-version: 8.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:48:21 +00:00
dependabot[bot]
61de0c709a deps: bump electron from 42.0.1 to 42.1.0 in /electron
Bumps [electron](https://github.com/electron/electron) from 42.0.1 to 42.1.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v42.0.1...v42.1.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-version: 42.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-19 03:47:57 +00:00
Diego Rodrigues de Sa e Souza
e463d7945f Merge pull request #2396 from diegosouzapw/fix/codeql-247-no-hash
fix(security): drop hashing in sessionPoolKey to clear CodeQL #247
2026-05-19 00:27:28 -03:00
diegosouzapw
10c8f32bd9 fix(security): drop hashing in sessionPoolKey to clear CodeQL #247
CodeQL re-flagged the HMAC variant from #2394 at high severity (#247) —
its data-flow analysis still sees an OAuth bearer reaching .update(token)
and applies js/insufficient-password-hash, regardless of whether the hash
primitive is createHash or createHmac.

Stop hashing the token at all. The session-pool Map is keyed by the
token verbatim, falling back to "anonymous" when the input is missing
or empty. This is safe because:

  - The token is already held in CopilotSession.cookies for every pool
    entry, so the Map key adds no new in-memory exposure.
  - The pool is bounded by MAX_POOL_SIZE with LRU eviction, so memory
    stays bounded regardless of how many distinct tokens appear.
  - bcrypt/scrypt/argon2 — the only forms CodeQL accepts here — are the
    wrong tool, since their slowness exists to thwart brute-force of
    low-entropy human passwords we do not have.

Tests
- Replace the "16-char hex" shape assertion with verbatim-equality
  assertions and an explicit "empty string → anonymous" case.
- Keep the regression guard that fails if anyone ever re-introduces
  createHash/createHmac on the token (catches the alert reappearing
  before CodeQL does).
- 16/16 copilot-web tests pass.
2026-05-19 00:26:17 -03:00
Diego Rodrigues de Sa e Souza
cfa948fd9a Merge pull request #2394 from diegosouzapw/fix/codeql-246-hmac
fix(security): switch sessionPoolKey to HMAC to clear CodeQL #246
2026-05-18 23:54:27 -03:00
diegosouzapw
6fcc99ba26 fix(security): switch sessionPoolKey to HMAC to clear CodeQL #246
CodeQL re-flagged the SHA-256 inside sessionPoolKey at high severity even
after the rename/dedup in #2391 — its data-flow analysis still tracks the
OAuth bearer (accessToken → token) into createHash and applies the
js/insufficient-password-hash rule. Bcrypt/scrypt/argon2 would be wrong
here (the input is a high-entropy bearer, not a low-entropy human password
that needs brute-force protection).

Switch to HMAC-SHA-256 with a process-scope key generated at startup
(randomBytes(32)). HMAC is a MAC primitive, not a password hash, so the
CodeQL rule no longer applies; uniqueness, determinism-within-process,
and the 16-char hex shape all still hold, and as a small bonus an
off-process attacker can no longer precompute pool keys from a token
alone.

Tests
- Replace the "exact SHA-256 prefix" assertion with shape/uniqueness
  checks and a regression guard that fails if the implementation ever
  reverts to plain createHash.
- All 15 copilot-web tests pass.
2026-05-18 23:53:16 -03:00
Cong Vu Chi
65105feeaf fix(kiro): enable Google OAuth login option (#2392)
Integrated into release/v3.8.0 — enables Google OAuth login button in Kiro auth modal
2026-05-18 23:44:04 -03:00
Diego Rodrigues de Sa e Souza
205ef64ac4 Merge pull request #2393 from diegosouzapw/chore/restore-9router-acknowledgment
docs(readme): restore 9router acknowledgment
2026-05-18 23:42:37 -03:00
diegosouzapw
595e9e3b1f docs(readme): restore 9router acknowledgment
Re-adds the "Special thanks to 9router by decolua" line at the top of the
Acknowledgments section. The reference was present through v3.7.x and was
inadvertently dropped during a docs cleanup; OmniRoute is a TypeScript
rewrite that originally built on 9router's design, so this credit belongs
alongside the other "inspired-by" entries (CLIProxyAPI, Caveman, RTK).
2026-05-18 23:41:42 -03:00
Diego Rodrigues de Sa e Souza
12b34d4a93 Merge pull request #2391 from diegosouzapw/fix/codeql-243-244-245
fix(security): resolve CodeQL alerts #243/#244/#245
2026-05-18 23:40:05 -03:00
diegosouzapw
fec6164e92 fix(security): resolve CodeQL alerts #243/#244/#245
#243 (js/request-forgery, high) — providers/bulk/route.ts
- Replace `fetch(\${origin}/api/providers/validate)` (where origin came from
  spoofable `new URL(request.url).origin`) with a direct in-process call to
  validateProviderApiKey. Eliminates the SSRF vector and the HTTP round-trip
  through the same app.
- Resolve proxy once outside the loop and reuse via runWithProxyContext.
- Drop now-unused passthroughAuthHeaders helper.

#244 (js/resource-exhaustion, warn) — copilot-web.ts::solveHashcash
- Clamp upstream-supplied `difficulty` to [1, 8] before `"0".repeat(difficulty)`
  so a malicious/buggy server can't force a huge prefix allocation or push the
  10M-iteration loop into effectively unbounded work.

#245 (js/insufficient-password-hash, warn) — copilot-web.ts::getSession
- Dedupe the inline `createHash("sha256").update(accessToken)` call by reusing
  the existing sessionPoolKey helper.
- Rename its parameter from `accessToken` to `token` and document that the
  input is a high-entropy OAuth bearer used only as an in-memory Map key —
  bcrypt/scrypt/argon2 would be incorrect here, and SHA-256:16 is an
  appropriate fingerprint per docs/security/PUBLIC_CREDS.md.

Tests
- Export solveHashcash and add unit tests asserting it returns null for
  out-of-range / non-integer difficulty and produces a numeric nonce for the
  common difficulty=1 case.
- All 26 tests in copilot-web-executor.test.ts and providers-bulk-route.test.ts
  continue to pass; sessionPoolKey contract (SHA-256:16) preserved.
2026-05-18 23:27:34 -03:00
Diego Rodrigues de Sa e Souza
c24b0f9569 Merge pull request #2323 from diegosouzapw/release/v3.8.0
Release v3.8.0 — next development cycle
2026-05-18 22:59:48 -03:00
Paijo
0de964d42b feat(providers): add Gemini Web cookie-based provider (#2380)
Integrated into release/v3.8.0 — adds Gemini Web cookie-based provider with error sanitization fix applied
2026-05-18 22:55:49 -03:00
backryun
f43badc3d4 model: Add Composer 2.5 to Cursor Provider (#2381)
Integrated into release/v3.8.0 — adds Composer 2.5 models to Cursor provider and updates CLI fingerprints
2026-05-18 22:53:27 -03:00
Paijo
3394ded6bb fix: tool_use without adjacent tool_result causes Claude 400 (#2383)
Integrated into release/v3.8.0 — fixes Claude 400 error for non-adjacent tool_use/tool_result messages
2026-05-18 22:52:50 -03:00