Commit Graph

6749 Commits

Author SHA1 Message Date
Gustavo Madeira Santana
2d4cedbdca matrix: skip pairing-store reads for room auth 2026-04-15 14:07:42 -04:00
Tak Hoffman
4f00b76925 fix(context-window): Tighten context limits and bound memory excerpts (#67277)
* Tighten context limits and bound memory excerpts

* Align startup context defaults in config docs

* Align qmd memory_get bounds with shared limits

* Preserve qmd partial memory reads

* Fix shared memory read type import

* Add changelog entry for context bounds
2026-04-15 13:06:02 -05:00
Pavan Kumar Gondhi
6e58f1f9f5 fix(gateway): enforce localRoots containment on webchat audio embedding path [AI-assisted] (#67298)
* fix: address issue

* fix: address review feedback

* fix: address PR review feedback

* docs: add changelog entry for PR merge
2026-04-15 22:54:06 +05:30
Gustavo Madeira Santana
7c6f2c0a5a Build: prune packaged runtime test cargo (#67275)
Merged via squash.

Prepared head SHA: 403f8e5749
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-15 13:18:03 -04:00
Pavan Kumar Gondhi
f8705f512b fix(matrix): block DM pairing-store entries from authorizing room control commands [AI-assisted] (#67294)
* fix: address issue

* fix: address review feedback

* docs: add changelog entry for PR merge
2026-04-15 22:45:14 +05:30
Gustavo Madeira Santana
78ac118427 fix(plugins): stabilize bundled setup runtimes (#67200)
Merged via squash.

Prepared head SHA: e8d6738fd0
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-15 12:35:18 -04:00
neo1027144
ee6b7daca3 fix(cron): suppress trailing NO_REPLY in announce delivery path [AI-assisted] (#65004)
Merged via squash.

Prepared head SHA: b7f1996d60
Co-authored-by: neo1027144-creator <267440006+neo1027144-creator@users.noreply.github.com>
Co-authored-by: jalehman <550978+jalehman@users.noreply.github.com>
Reviewed-by: @jalehman
2026-04-15 09:31:35 -07:00
saram ali
b2753fd0de fix(matrix): fix E2EE SSSS bootstrap for passwordless token-auth bots (#66228)
Merged via squash.

Prepared head SHA: c62cebf7c3
Co-authored-by: SARAMALI15792 <140950904+SARAMALI15792@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-15 11:48:29 -04:00
Gustavo Madeira Santana
568df95736 fix: move Docker changelog entry to unreleased 2026-04-15 11:43:15 -04:00
ly85206559
3e60eaa884 fix(docker): verify matrix-sdk-crypto native addon without hardcoded pnpm path (#65608) (#67143)
Merged via squash.

Prepared head SHA: 325e97ead5
Co-authored-by: ly85206559 <12526624+ly85206559@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-15 11:37:14 -04:00
Peter Steinberger
cb790c858b build(release): bump core app versions to 2026.4.15-beta.1 2026-04-15 15:06:13 +01:00
Ayaan Zaidi
33154ce745 fix: simplify ollama onboarding (#67005)
* feat(ollama): split interactive cloud and local setup

* test(ollama): cover cloud onboarding flow

* docs(ollama): simplify provider setup docs

* docs(onboarding): update ollama wizard copy

* fix(ollama): restore web search auth helper

* fix(ollama): harden setup auth and ssrf handling

* fix(ollama): address review regressions

* fix(ollama): scope ssrf hardening to ollama

* feat(ollama): add hybrid onboarding mode

* fix(ollama): tighten cloud credential setup

* refactor(ollama): distill host-backed setup modes

* fix(ollama): preserve cloud api key in config

* fix: simplify ollama onboarding (#67005)
2026-04-15 19:06:21 +05:30
Peter Steinberger
ec4c2cb62c docs(changelog): refresh unreleased section 2026-04-15 14:24:03 +01:00
Chen Chia Yang
d2a219ea44 fix(media): allow host-local CSV and Markdown uploads via Slack (#67047)
Merged via squash.

Prepared head SHA: 5ce11d0bac
Co-authored-by: Unayung <1853105+Unayung@users.noreply.github.com>
Co-authored-by: frankekn <712880+frankekn@users.noreply.github.com>
Reviewed-by: @frankekn
2026-04-15 20:38:17 +08:00
Vincent Koc
c727388f93 fix(plugins): localize bundled runtime deps to extensions (#67099)
* fix(plugins): localize bundled runtime deps to extensions

* fix(plugins): move staged runtime deps out of root

* fix(packaging): harden prepack and runtime dep staging

* fix(packaging): preserve optional runtime dep staging

* Update CHANGELOG.md

* fix(packaging): harden runtime staging filesystem writes

* fix(docker): ship preinstall warning in bootstrap layers

* fix(packaging): exclude staged plugin node_modules from npm pack
2026-04-15 12:04:31 +01:00
Vincent Koc
f09a4d9ba0 fix(agents): move lean local-model mode behind experimental flag 2026-04-15 11:41:28 +01:00
Vincent Koc
7883412294 Update CHANGELOG.md 2026-04-15 11:40:46 +01:00
Mason Huang
edfa074e0f Tests: align pnpm test expectations with main (#67001)
Merged via squash.

Prepared head SHA: 29c8068053
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Reviewed-by: @hxy91819
2026-04-15 18:31:23 +08:00
Vincent Koc
8dd1abedec Update CHANGELOG.md 2026-04-15 11:29:47 +01:00
Vincent Koc
becd14424d fix(gateway): stabilize imsg alias test coverage 2026-04-15 11:24:19 +01:00
Pengfei Ni
804bb0f2c3 fix(configure): re-read config hash after persist to avoid stale-hash race (#64188) (#66528)
Merged via squash.

Prepared head SHA: 0c4003a5be
Co-authored-by: feiskyer <676637+feiskyer@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-04-15 11:03:09 +01:00
Pengfei Ni
e99a24d645 fix(security): redact secrets in exec approval prompts (#61077) (#64790)
Merged via squash.

Prepared head SHA: 324202d37e
Co-authored-by: feiskyer <676637+feiskyer@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-04-15 11:02:10 +01:00
Pengfei Ni
88d3620a85 feat(github-copilot): add embedding provider for memory search (#61718)
Merged via squash.

Prepared head SHA: 05a78ce7f2
Co-authored-by: feiskyer <676637+feiskyer@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-04-15 10:39:28 +01:00
Mason Huang
bb669df26a docs-i18n: harden behavior fixture path reads (#67046)
Merged via squash.

Prepared head SHA: 5db94a7c9e
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Reviewed-by: @hxy91819
2026-04-15 17:32:59 +08:00
scotthuang
7734a40a56 fix(ui): skip chat history reload during active sends to prevent mess… (#66997)
Merged via squash.

Prepared head SHA: cec28cfa90
Co-authored-by: scotthuang <1670837+scotthuang@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-04-15 09:56:24 +01:00
Srinivas Pavan
fb4395c1fe fix(cron): preserve all fields in announce delivery by removing summarization instruction (#65638)
* fix(cron): preserve all fields in announce delivery by removing summarization instruction

The delivery instruction appended to the cron agent prompt contained the word
'summary', causing LLMs to condense structured output non-deterministically and
drop fields on delivery. Replace with 'response' and add explicit instruction
to reproduce all fields exactly.

Fixes #58535

* chore(changelog): add cron announce entry

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-04-15 09:40:26 +01:00
Ayaan Zaidi
94d5c3dd6b fix: prune stale dist chunks after npm upgrades (#66959) 2026-04-15 13:22:04 +05:30
Mason Huang
059d4b6d47 docs-i18n: add behavior baseline fixtures (#64073)
Merged via squash.

Prepared head SHA: 4ccd4c5fc0
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Reviewed-by: @hxy91819
2026-04-15 15:03:49 +08:00
Chunyue Wang
6aa4515798 fix(context-engine): gracefully degrade to legacy engine on third-party plugin resolution failure (#66930)
Merged via squash.

Prepared head SHA: 969c67716c
Co-authored-by: openperf <80630709+openperf@users.noreply.github.com>
Co-authored-by: openperf <80630709+openperf@users.noreply.github.com>
Reviewed-by: @openperf
2026-04-15 14:59:29 +08:00
Ivan Fofanov
732db75279 fix: classify "No conversation found" as session_expired (#65028)
Merged via squash.

Prepared head SHA: f429ba2de0
Co-authored-by: Ivan-Fn <1247214+Ivan-Fn@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
2026-04-15 09:31:55 +03:00
Omar Shahine
507b718917 feat(ui): add Model Auth status card to Overview dashboard (#66211)
* feat(gateway,ui): add Model Auth status card to Overview

Adds a new `models.authStatus` gateway endpoint that combines
`buildAuthHealthSummary()` (token expiry/status) with
`loadProviderUsageSummary()` (rate limits) into a single response
suitable for UI rendering. Strips credentials - only ships status,
expiry, remaining time, and rate-limit windows.

Adds a corresponding "Model Auth" card to the Overview dashboard
showing provider token status and rate limits at a glance. Attention
items are raised when OAuth tokens are expiring or expired.

Also catches the OAuth token sink class of bug: if multiple profiles
exist per provider/account and tokens are drifting out of sync, this
surfaces it immediately in the dashboard instead of silently falling
back to a different provider.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* CHANGELOG: note Model Auth status card on Overview

* UI/Overview: render Model Auth card during load with N/A placeholder

* models.authStatus: env-backed OAuth escape hatch + expectsOAuth missing signal

---------

Co-authored-by: Lobster <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 22:40:42 -07:00
Mason Huang
3d2f51c0a4 CLI/plugins: stop forced-unsafe installs from falling back to hook packs (#58909)
Merged via squash.

Prepared head SHA: 7cf146efb6
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Co-authored-by: hxy91819 <8814856+hxy91819@users.noreply.github.com>
Reviewed-by: @hxy91819
2026-04-15 13:23:17 +08:00
xinmotlanthua
90c06c04c8 fix: guard against undefined event.content in cron agentTurn payload (#66302)
* fix: remove documentation fences from HEARTBEAT.md template

The HEARTBEAT.md template wrapped its content in markdown code fences
and a doc heading for display purposes. Since loadTemplate() only strips
YAML front matter, these artifacts leaked into generated workspace files,
causing isHeartbeatContentEffectivelyEmpty() to consider them non-empty
and triggering unnecessary API calls.

Remove the markdown fences and doc heading so the template produces
clean content after front-matter stripping.

Closes #66284

* fix: guard against undefined event.content in cron agentTurn payload

When a cron job fires with agentTurn payload, event.content is undefined.
parseFaceTags(undefined) returned undefined, which propagated to
userContent.startsWith("/") causing a TypeError crash.

- Fix parseFaceTags and filterInternalMarkers to return "" for falsy input
  instead of returning the falsy value itself
- Add null coalescing fallback at the gateway call site
- Add unit tests for undefined/null/empty string inputs

Closes #66283

* fix: address review — remove redundant guards, casts, and unrelated HEARTBEAT.md change

* fix: guard against undefined event.content in cron agentTurn payload (#66302) (thanks @xinmotlanthua)

---------

Co-authored-by: khanhkhanhlele <namkhanh2172@gmail.com>
Co-authored-by: sliverp <870080352@qq.com>
2026-04-15 11:47:21 +08:00
bladin
e0bf756b50 fix: handle OpenRouter Qwen3 reasoning_details streams (#66905) (thanks @bladin)
* fix(openrouter): handle reasoning_details field in Qwen3 stream parsing

Add support for the reasoning_details field returned by OpenRouter/Qwen3
models. Previously this field was not recognized, causing payloads=0 and
incomplete turn errors.

- Add reasoning_details handling in processOpenAICompletionsStream
- Extract text from reasoning_details array items with type reasoning.text
- Treat as thinking content, similar to other reasoning fields
- Add test case for reasoning_details handling

Fixes #66833

* fix(openrouter): keep tool calls with reasoning_details

* fix: handle OpenRouter Qwen3 reasoning_details streams (#66905) (thanks @bladin)

* fix: preserve streamed tool calls with reasoning deltas (#66905) (thanks @bladin)

---------

Co-authored-by: bladin <bladin@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-04-15 08:15:58 +05:30
Jim Smith
0c0463b2b7 fix: restore allowPrivateNetwork for self-hosted STT endpoints (#66692) (thanks @jhsmith409)
* fix(audio): restore allowPrivateNetwork for self-hosted STT endpoints

resolveProviderExecutionContext built the request object passed to
transcribeAudio using only sanitizeConfiguredProviderRequest on the
tool-level config and entry — which strips allowPrivateNetwork. The
provider-level request config (models.providers.*.request) was never
included in the merge, so allowPrivateNetwork:true was silently dropped.

Additionally, resolveProviderRequestPolicyConfig only read allowPrivate
Network from params.allowPrivateNetwork (a direct parameter) and ignored
params.request?.allowPrivateNetwork even when it was present.

Fix both gaps:
- runner.entries.ts: use mergeModelProviderRequestOverrides with
  sanitizeConfiguredModelProviderRequest(providerConfig?.request) so
  models.providers.*.request.allowPrivateNetwork flows through to the
  media execution context
- provider-request-config.ts: fall back to params.request?.allowPrivate
  Network when params.allowPrivateNetwork is undefined

Fixes #66691. Regression introduced in v2026.4.14.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(media-understanding): assert allowPrivateNetwork flows through resolveProviderExecutionContext

Regression test for the bug where providerConfig.request.allowPrivateNetwork
was dropped when building the AudioTranscriptionRequest passed to media
providers. Verifies that setting allowPrivateNetwork in the provider config
reaches the provider's request object after the fix to use
mergeModelProviderRequestOverrides + sanitizeConfiguredModelProviderRequest.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(media-understanding): tighten allowPrivateNetwork regression types

* fix: restore allowPrivateNetwork for self-hosted STT endpoints (#66692) (thanks @jhsmith409)

---------

Co-authored-by: Jim Smith <jhsmith0@me.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-04-15 08:05:37 +05:30
Mr.NightQ
b1d03b4057 fix: keep Telegram command sync process-local (#66730) (thanks @nightq)
* fix: use process-scoped cache for Telegram command sync to fix missing menu after restart

Fixes openclaw#66714, openclaw#66682

Root cause: The command hash cache was persisted to disk across gateway
restarts. When the hash matched (commands unchanged), setMyCommands was
skipped entirely. But Telegram bot commands can be cleared by external
factors, so the cached state becomes stale after restart.

Fix: Replace file-based hash cache with a process-scoped Map. This preserves
the rapid-restart rate-limit protection within a single process, but ensures
commands are always re-registered after a gateway restart.

* fix(telegram): drop stale async command cache calls

* fix: keep Telegram command sync process-local (#66730) (thanks @nightq)

---------

Co-authored-by: nightq <zengwei@nightq.cn>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-04-15 08:02:23 +05:30
Omar Shahine
6f1d321aab feat(bluebubbles): replay missed webhook messages after gateway restart (#66857)
Adds an in-process startup catchup pass to the BlueBubbles channel that
queries BB Server for messages delivered since a persisted per-account
cursor and re-feeds each through the existing processMessage pipeline.

Fixes the missed-message hole documented in #66721: BB's WebhookService
is fire-and-forget on POST failure, and MessagePoller only re-fires
webhooks on BB-side reconnection events, not on webhook-receiver
recovery.

- New extensions/bluebubbles/src/catchup.ts with singleflight per
  accountId, cursor persistence via the canonical state-paths
  resolver, bounded query (perRunLimit + maxAgeMinutes), failure-held
  cursor, truncation-aware page-boundary advancement, future-cursor
  recovery, isFromMe filter (pre- and post-normalization).
- monitor.ts fires catchup as a background task after the webhook
  target registers.
- config-schema.ts adds optional catchup block; accounts.ts adds
  catchup to nestedObjectKeys for deep-merge per-account overrides.
- Dedupes against #66816's persistent inbound GUID cache.
- 22 scoped tests; full BB suite 411/411; pnpm check green; live E2E
  on macOS 26.3 / BB Server 1.9.x recovered 3/3 missed messages.

Closes #66721.

Co-authored-by: Omar Shahine <omar@shahine.com>
2026-04-14 19:20:42 -07:00
Serhii
ff4edd0559 fix: restore Telegram native auto defaults (#66843) (thanks @kashevk0)
* fix(config): restore Telegram native commands under auto defaults

* chore: trigger CI rerun

* test(config): split native auto-default regressions

* fix: restore Telegram native auto defaults (#66843) (thanks @kashevk0)

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-04-15 07:46:35 +05:30
François Martin
734bb9c2e7 Telegram/documents: sanitize binary payloads to prevent prompt input inflation (#66877)
Merged via squash.

Prepared head SHA: 09a87c184f
Co-authored-by: martinfrancois <14319020+martinfrancois@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-14 20:53:00 -04:00
Gustavo Madeira Santana
0c4e0d7030 memory: block dreaming self-ingestion (#66852)
Merged via squash.

Prepared head SHA: 4742656a0d
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-14 20:29:12 -04:00
Josh Avant
1769fb2aa1 fix(secrets): align SecretRef inspect/strict behavior across preload/runtime paths (#66818)
* Config: add inspect/strict SecretRef string resolver

* CLI: pass resolved/source config snapshots to plugin preload

* Slack: keep HTTP route registration config-only

* Providers: normalize SecretRef handling for auth and web tools

* Secrets: add Exa web search target to registry and docs

* Telegram: resolve env SecretRef tokens at runtime

* Agents: resolve custom provider env SecretRef ids

* Providers: fail closed on blocked SecretRef fallback

* Telegram: enforce env SecretRef policy for runtime token refs

* Status/Providers/Telegram: tighten SecretRef preload and fallback handling

* Providers: enforce env SecretRef policy checks in fallback auth paths

* fix: add SecretRef lifecycle changelog entry (#66818) (thanks @joshavant)
2026-04-14 17:59:28 -05:00
Omar Shahine
58742acaab fix(bluebubbles): dedupe inbound webhooks across restarts (#19176, #12053) (#66816)
BlueBubbles MessagePoller replays its ~1-week lookback window as new-message
webhooks after BB Server restart or reconnect. Add a persistent file-backed
GUID dedupe (TTL=7d) at the top of processMessage using createClaimableDedupe
from the Plugin SDK. Claim/finalize/release semantics ensure transient delivery
failures release the GUID so a later replay can retry.

Fixes #19176, #12053.

Co-authored-by: Omar Shahine <omar@shahine.com>
2026-04-14 15:45:05 -07:00
Josh Lehman
75e7fc97f8 fix: preserve runtime token budget in deferred context-engine maintenance (#66820)
* fix(context-engine): pass deferred maintenance token budget

Thread tokenBudget through the after-turn runtime context so background context-engine maintenance reuses the real model context window instead of falling back to 128k. Also pass through a best-effort currentTokenCount from the latest call total and make the runtime context type explicit about both fields.

Regeneration-Prompt: |
  OpenClaw already passed the real context token budget into direct context-engine calls like afterTurn and assemble, but deferred maintain() reused only the runtimeContext object and that object did not carry tokenBudget. Lossless Claw therefore fell back to 128k during background maintenance, which made budget-trigger fire much more aggressively than the live model context warranted. Thread the real contextTokenBudget into buildAfterTurnRuntimeContext so deferred maintenance receives the same budget, and pass a straightforward best-effort currentTokenCount from the latest call total while the relevant data is already in scope. Keep the change additive, update the runtime-context type, and cover the background maintenance/runtime-context behavior with focused tests.

* fix(context-engine): use prompt usage for deferred maintenance
2026-04-14 15:30:37 -07:00
Josh Lehman
ef3ac6a58e fix: guard Anthropic Messages max tokens (#66664)
* Docs: add Anthropic max_tokens investigation memo

Regeneration-Prompt: |
  Investigate the reported OpenClaw cron isolated-agent failure where an
  Anthropic Haiku run returned "max_tokens: must be greater than or equal to 1".
  Do not implement a fix yet. Inspect the cron isolated-agent execution path,
  the embedded runner, extra param plumbing, Anthropic transport code, and any
  model-selection or token-budget logic that could synthesize maxTokens = 0.
  Produce a concise maintainer memo with concrete file references, explain why
  cron itself is not the component setting maxTokens, identify the most likely
  root cause, describe the smallest repro shape, and recommend the cleanest fix.

* openclaw-e82: guard Anthropic Messages maxTokens

Regeneration-Prompt: |
  Fix the Anthropic Messages path so OpenClaw never sends max_tokens <= 0
  to Anthropic. Match the positive-number guard already used by the
  Anthropic Vertex transport, but keep the change scoped: validate token
  limits in src/agents/anthropic-transport-stream.ts where transport
  options are resolved and where the final payload is assembled, fall back
  to the model limit when a runtime override is zero, fail locally when no
  positive token budget exists, and drop non-positive maxTokens from
  src/agents/pi-embedded-runner/extra-params.ts so hidden config params do
  not leak through. Add focused regression coverage for both the transport
  and extra-param forwarding path, and remove the earlier investigation memo
  from the branch so the PR diff only contains the fix.

* fix: scope Anthropic max token guard

* fix: document Anthropic max token guard

* fix: floor Anthropic max token overrides
2026-04-14 15:05:04 -07:00
Vincent Koc
5ddca5dd56 fix(agents): normalize mini openai reasoning 2026-04-14 22:26:47 +01:00
Josh Avant
731d4666d2 fix(reply): resolve active channel/account SecretRefs in reply runs (#66796)
* Reply: resolve active channel/account SecretRefs in agent runs

* tests(reply): assert queued config scope wiring

* fix: document reply secret-scope regression coverage (#66796) (thanks @joshavant)
2026-04-14 16:04:57 -05:00
Peter
70b67b0c68 fix(agents): preserve original prompt on model fallback retry (#65760) (#66029)
Merged via squash.

Prepared head SHA: ba919d1934
Co-authored-by: WuKongAI-CMU <210765158+WuKongAI-CMU@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
2026-04-14 23:47:01 +03:00
Rohan Santhosh Kumar
bb14412e87 fix(reply): classify billing cooldown summaries (#66363)
Merged via squash.

Prepared head SHA: 8cfc42a7ac
Co-authored-by: Rohan5commit <181558744+Rohan5commit@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
2026-04-14 23:35:04 +03:00
Agustin Rivera
62430d9f3a Harden MCP loopback request validation (#66665)
* fix(mcp): harden loopback request guards

* fix(commit): block staged user log

* Revert pre-commit USER.md guard from this PR

Out of scope for the MCP loopback hardening — keep this PR
focused on the loopback request gate and the bearer-comparison
fix. The pre-commit worklog guard can land separately if
maintainers want it.

* changelog: note MCP loopback constant-time + Origin guard (#66665)

* fix(mcp): allow loopback flows that browsers flag as cross-site

The previous Sec-Fetch-Site early-return rejected legit local
browser callers like a UI hosted on http://localhost:<ui-port>
talking to MCP on http://127.0.0.1:<mcp-port> — browsers report
that host mismatch as cross-site even though both ends are
loopback. checkBrowserOrigin already authorizes those via its
local-loopback matcher (loopback peer + loopback Origin host),
so route every Origin-bearing request through that helper and
let it decide. Native MCP clients (no Origin header) continue to
short-circuit through to the bearer check unchanged.

Adds a regression test asserting that
  origin: http://localhost:43123, sec-fetch-site: cross-site
from a loopback peer is accepted with a valid bearer.

---------

Co-authored-by: Devin Robison <drobison@nvidia.com>
2026-04-14 14:32:05 -06:00
Gustavo Madeira Santana
82a2db71e8 refactor(qa): split Matrix QA into optional plugin (#66723)
Merged via squash.

Prepared head SHA: 27241bd089
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-04-14 16:28:57 -04:00