Commit Graph

3527 Commits

Author SHA1 Message Date
terence71-glitch
e2ad12d090 fix(proxy): show registry provider proxies in dashboard (#2963)
Integrated into release/v3.8.8
2026-05-30 22:14:53 -03:00
diegosouzapw
62de5a83b8 feat(quota): 3-step pool wizard unifying connection, plan and key allocation (Phase C1) 2026-05-30 22:08:41 -03:00
diegosouzapw
4536aabe23 Merge PR 2959 into release/v3.8.8 2026-05-30 22:02:49 -03:00
diegosouzapw
c90bed0043 Merge PR 2957 into release/v3.8.8 2026-05-30 22:01:07 -03:00
diegosouzapw
fa4bd6c68c Merge PR 2951 into release/v3.8.8 2026-05-30 22:01:04 -03:00
diegosouzapw
1a9b2bfd85 Merge PR 2943 into release/v3.8.8 2026-05-30 22:00:38 -03:00
diegosouzapw
266c145ee4 Merge PR 2940 into release/v3.8.8 2026-05-30 22:00:34 -03:00
diegosouzapw
8dafe78d79 Merge PR 2938 into release/v3.8.8 2026-05-30 22:00:31 -03:00
diegosouzapw
606b7092b6 Merge PR 2937 into release/v3.8.8 2026-05-30 22:00:29 -03:00
diegosouzapw
cf3600de11 Merge PR 2931 into release/v3.8.8 2026-05-30 22:00:20 -03:00
Raxxoor
3dd4a3b6f8 fix(antigravity): avoid visible signatureless tool history (#2927)
Integrated into release/v3.8.8
2026-05-30 21:59:20 -03:00
diegosouzapw
6a14c31280 feat(quota): reconcile key allowedQuotas when pool allocations saved as exclusive (Phase C3) 2026-05-30 21:56:05 -03:00
diegosouzapw
3742afcd64 feat(quota): /v1/models lists only quotaShared-* models for quota-exclusive keys (Phase B3) 2026-05-30 21:41:13 -03:00
diegosouzapw
78c5a30cf9 feat(quota): restrict quota-exclusive keys to their quotaShared-* models (Phase B4) 2026-05-30 21:35:41 -03:00
diegosouzapw
49f6092099 feat(quota): auto-sync quotaShared-* combos on pool allocation changes (Phase B2)
Mints one combo per model of the pool's provider when a quota pool is
created/updated/reallocated, and prunes stale quota combos on deletion.
2026-05-30 21:23:08 -03:00
diegosouzapw
ba340f18a5 Merge branch 'fix/nextcloud-json-stream-default' into release/v3.8.8 2026-05-30 21:19:50 -03:00
diegosouzapw
e7870132db Merge release/v3.8.8 2026-05-30 21:19:17 -03:00
guanbear
e51ab949fa Improve self-service provider quota visibility (#2931)
Integrated into release/v3.8.8
2026-05-30 21:18:50 -03:00
Makcim Ivanov
ec7233042c fix(claude): strip empty Read pages tool input (#2937)
Integrated into release/v3.8.8
2026-05-30 21:18:46 -03:00
Makcim Ivanov
4c38961b72 fix(claude): map WebSearch to Responses web_search (#2938)
Integrated into release/v3.8.8
2026-05-30 21:18:42 -03:00
Charith
2b613d9fb8 fix combo vision and codex tool history (#2940)
Integrated into release/v3.8.8
2026-05-30 21:18:39 -03:00
Diego Rodrigues de Sa e Souza
697946381d fix(auth): prevent Codex multi-account refresh_token family revocation (#2941)
Integrated into release/v3.8.8
2026-05-30 21:18:33 -03:00
Anton
8b074d2c29 fix(claude): sanitize tool schemas + cloak third-party tool names on native Claude OAuth (#2943)
Integrated into release/v3.8.8
2026-05-30 21:18:29 -03:00
Diego Rodrigues de Sa e Souza
2fb5979118 fix(dashboard): v3.8.8 screen fixes — agent-bridge SSR + audit/logs/memory/playground (#2944)
Integrated into release/v3.8.8
2026-05-30 21:18:25 -03:00
Paijo
7a0e803c01 feat: add Qwen Web (chat.qwen.ai) cookie provider (#2947)
Integrated into release/v3.8.8
2026-05-30 21:18:16 -03:00
mi
847799092e fix: CPU leak from Bottleneck limiter accumulation + per-request optimizations (#2951)
Integrated into release/v3.8.8
2026-05-30 21:18:12 -03:00
terence71-glitch
52503064a8 fix(skills): avoid Claude assistant tool_result blocks (#2956)
Integrated into release/v3.8.8
2026-05-30 21:18:08 -03:00
ReqX
379b72c157 fix(routing): add agy to executor map so it uses AntigravityExecutor (#2957)
Integrated into release/v3.8.8
2026-05-30 21:18:04 -03:00
Brandon Bennett
b778ad2614 feat(notion): add Notion MCP context source with 6 tools, dashboard tab, and 20 tests (#2959)
Integrated into release/v3.8.8
2026-05-30 21:17:56 -03:00
terence71-glitch
187bc509bb fix(sse): bypass web-search fallback on Claude -> Claude passthrough (#2960)
Integrated into release/v3.8.8
2026-05-30 21:17:52 -03:00
diegosouzapw
6214ea6768 feat(quota): add quotaShared-* virtual model naming helpers (Phase B1) 2026-05-30 21:12:30 -03:00
diegosouzapw
a921300a53 feat(quota): force quota-exclusive keys onto pool connection in account selection (Phase A4) 2026-05-30 21:00:36 -03:00
diegosouzapw
8316c618b2 feat(quota): enforce quota-exclusive keys by pool provider (Phase A3)
Keys with non-empty allowedQuotas may only use models whose provider belongs
to their pools' provider set; anything outside → 403 QUOTA_ONLY.
Normal allowedModels/allowedCombos checks are bypassed for quota-exclusive keys.
2026-05-30 20:53:35 -03:00
diegosouzapw
c29d6ed7a4 feat(quota): add resolveQuotaKeyScope helper (Phase A2)
Introduces src/lib/quota/quotaKey.ts with resolveQuotaKeyScope(), a
pure async helper that maps an API key's allowedQuotas pool-ID list to
the concrete connectionIds and provider slugs it is permitted to use.
Covers empty/null/undefined input, missing pools, orphaned connectionIds,
and multi-pool deduplication. No behaviour change to existing code paths.
2026-05-30 20:40:33 -03:00
Brandon Bennett
8cd77b0f49 feat(notion): add Notion MCP context source with 6 tools, dashboard tab, and 20 tests 2026-05-30 19:11:58 -04:00
ReqX
ff7a9069f0 fix(routing): add agy to executor map so it uses AntigravityExecutor
The agy provider was registered in providerRegistry.ts with
executor: "antigravity" but the executor map in executors/index.ts
only had an "antigravity" entry. getExecutor("agy") fell through to
DefaultExecutor, which returned undefined for baseUrl (agy only has
baseUrls), causing fetch(undefined) → TypeError: Cannot read properties
of undefined (reading 'toString').

Closes diegosouzapw/OmniRoute#2932
2026-05-30 22:01:00 +00:00
diegosouzapw
51b586c2af feat(quota): add allowed_quotas allow-list field to api_keys (Phase A1) 2026-05-30 18:58:23 -03:00
diegosouzapw
6b0e89fb42 fix(authz): derive LOCAL_ONLY locality from Host header (middleware has no socket IP)
The authz pipeline runs in the Next middleware runtime (proxy.ts -> runAuthzPipeline)
where ctx.request is a NextRequest with no .socket/.ip. requestPeerAddress therefore
returned null, so isLoopbackRequest was ALWAYS false and every LOCAL_ONLY path 403'd
even from loopback (Services/MCP/Traffic-Inspector were unusable). Read the Host
header instead — exactly what isLoopbackHost/isPrivateLanHost were built to parse —
which restores loopback and, combined with isPrivateLanHost, enables the
owner-authorized private-LAN access. Spawn-capable endpoints still require
manage-scope auth after this gate.
2026-05-30 18:20:39 -03:00
diegosouzapw
5a61ae9a98 feat(authz): allow LOCAL_ONLY paths from private-LAN peer IPs (owner-authorized)
Services + Traffic-Inspector (LOCAL_ONLY, spawn-capable) returned 403 when the
dashboard was reached via the LAN IP (192.168.0.x) instead of loopback. Add
isPrivateLanHost (RFC1918 IPv4 + IPv6 ULA/link-local) and widen ONLY the
local-only PATH gate to accept private-LAN socket peer IPs — based on the real
socket peer address (not the spoofable Host header), so public-internet clients
present public IPs and stay blocked. The CLI-token gate stays strictly loopback;
paths remain LOCAL_ONLY-classified (Hard Rules 15/17 unchanged). Enforcement-layer
carve-out for a LAN-deployed instance, authorized by the operator.
2026-05-30 17:26:10 -03:00
diegosouzapw
6095842ef0 fix(quota-share): guard usage.dimensions to stop "reading 'length'" ISE
The pool usage snapshot can come back without a dimensions array (e.g. when the
plan resolves to empty for catalog-only providers). PoolCard.computeStatus and
hasDimensions read usage.dimensions.length directly, crashing the whole page
("Cannot read properties of undefined (reading 'length')"). Normalize to [] in
PoolCard and in usePoolsUsageAggregate (dimensions/perKey).
2026-05-30 16:52:09 -03:00
soyelmismo
a91f352fde test: add unit tests for CPU leak fixes and registry changes
5 new test files covering all 13 changed production files:
- estimateSizeFast.test.ts: 16 tests for fast size estimator (circular ref
  protection, early exit, nested structures, Map safety)
- eviction-guards-apiKeyRotator.test.ts: 5 tests for Map eviction guards
  (!has() check prevents evicting existing keys on update)
- eviction-guards-codexQuotaFetcher.test.ts: 4 tests for connectionRegistry
  and quotaCache eviction guards
- rateLimitManager-idle-eviction.test.ts: 6 tests for idle limiter cleanup,
  limiterLastUsed tracking, and shutdown behavior
- registry-direct-exports.test.ts: 20 tests verifying all 8 registries export
  plain objects (no Proxy traps, no lazy getters, mutable entries)

Extract estimateSizeFast/isSmallEnoughForSemanticCache into standalone
open-sse/utils/estimateSize.ts to make them testable without importing
the entire chatCore.ts dependency tree.
2026-05-30 14:02:27 -05:00
Jan Leon
99d673fe5b feat(stream): add per-key JSON stream default mode 2026-05-30 18:33:47 +02:00
diegosouzapw
36c276a6d7 feat(playground): Compare freeze fix, Chat provider/model selects, Build wizard (Phase 4)
- Chat (StudioConfigPane): add Provider + Model selects reusing the translator
  hooks; order Endpoint -> Provider -> Model; ConfigState gains optional provider.
- Compare (CompareTab): add a user-prompt input and include it in the request
  body; throttle per-column stream updates via requestAnimationFrame to stop the
  UI freeze (was setColumns per chunk x N columns with an empty user message).
- Build (BuildTab + build/BuildWizard): redesign as a guided 3-step wizard
  (What to test -> Configure -> Run) reusing ToolsBuilder/StructuredOutputEditor;
  all run/tool-call handlers preserved.
- i18n: playground.build.* (18 keys) in en + pt-BR.
2026-05-30 12:54:58 -03:00
diegosouzapw
8eacd78be4 feat(memory): health auto-check, enable toggle, sqlite-vec hint (Phase 3)
- MemoriesTab: auto-run health check on mount + poll every 30s (was manual-only).
- page: add enable/disable memory toggle (role=switch) via useMemorySettings.save({ enabled }).
- MemoryEngineStatus: show "npm install sqlite-vec" hint when vector store backend is "none".
- i18n: memory.memoryEnabled + memory.engine.vectorStoreInstallHint (en + pt-BR).
2026-05-30 12:45:27 -03:00
diegosouzapw
a03d7b40d7 fix(audit): translate event types and A2A task states (Phase 2)
- Add compliance.eventTypes (36 labels) to en.json + pt-BR.json.
- ComplianceTab: render translated label via t.has/t fallback instead of raw entry.action.
- A2aAuditTab: render translated task state via a2aState* keys instead of raw task.state.
- Memory type/strategy dropdowns needed no i18n change — keys already exist; the
  Phase 1 Select fix makes them render.
2026-05-30 12:38:23 -03:00
diegosouzapw
a59a90e6a1 fix(dashboard): v3.8.8 screen quick wins (Phase 1)
- search-tools: export modal no longer opens by default / stuck — guard on
  exportOpen and drop the invalid isOpen prop the modal never read.
- logs: remove duplicate proxy/console tabs + SegmentedControl (dedicated
  /dashboard/logs/proxy and /console pages already exist in the menu).
- memory: order tabs Memories -> Engine -> Playground.
- ui(Select): render children and suppress the placeholder/options branch when
  children are provided — fixes the "empty" memory type/strategy dropdowns
  (children were being shadowed by the component's own option list).
- test: source-level regression guards for all four.
2026-05-30 12:31:08 -03:00
NomenAK
dd6104ea38 test(cliproxyapi): update executor test for the broadened tool-name cloak
The CPA executor now cloaks non-Claude-Code tool names (not just mcp_*), so the
prior "does not rewrite non-mcp_ tool names" assertion no longer holds:
my_tool is aliased to MyTool and restored on the response via _toolNameMap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 15:00:01 +00:00
NomenAK
a1e0bc7469 fix(claude): harden tool cloak + schema sanitizer (adversarial review round)
Addresses confirmed findings from an adversarial review of the prior commits:

- schema sanitizer: a truncation placeholder in a SCALAR annotation keyword
  (description/title/pattern/format) was coerced to {}, which is itself invalid
  draft-2020-12 and re-triggered the exact "input_schema is invalid" 400 the
  sanitizer exists to prevent. Placeholders are now only coerced to {} in
  subschema-expecting positions; scalar keywords are left untouched.
- schema sanitizer: numeric-string coercion is folded into
  stripInvalidSchemaConstructs so it also covers contains / propertyNames /
  additionalItems (which coerceSchemaNumericFields never visited).
- schema sanitizer: stop stripping the valid `default` keyword on the Claude
  native/passthrough surface (the #1782 default-strip is a translator concern;
  tool schemas here were previously forwarded verbatim). sanitizeClaudeToolSchema
  is now a single stripInvalidSchemaConstructs pass.
- tool-name cloak: consult TOOL_RENAME_MAP / EXTRA_TOOL_RENAME_MAP before the
  generic PascalCase fallback, so the CLIProxyAPI path uses the established
  fingerprint-evasion aliases (subagents->SubDispatch, session_status->CheckStatus,
  webfetch->WebFetch, ...) identically to the native path instead of weaker
  first-letter casing.
- kill-switch: CLAUDE_DISABLE_TOOL_NAME_CLOAK is now honoured inside
  cloakThirdPartyToolNames, so BOTH the native and CLIProxyAPI executor paths
  respect it (previously only base.ts did); .env.example + ENVIRONMENT.md updated.

Regression tests added for each. Verified end-to-end through the live CPA path:
mixture_of_agents, subagents, and a tool carrying placeholder descriptions and
`default` values all return 200 with original names restored on the response.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 14:35:53 +00:00
Jan Leon
31a734966c test(reasoning-cache): authenticate reasoning cache API route requests 2026-05-30 16:19:12 +02:00
Jan Leon
ce039778da test(chatcore): avoid pending metadata race in upstream timeout test 2026-05-30 16:13:30 +02:00