Commit Graph

51799 Commits

Author SHA1 Message Date
Kaspre
fd2a9adbe6 fix(ollama): bypass managed proxy for loopback embeddings (#85707)
* fix(ollama): bypass proxy for local embeddings

* fix(ollama): keep managed proxy bypass loopback-only

* fix(ollama): keep proxy bypass internal

* fix(ollama): keep proxy bypass private

* fix(ollama): harden internal proxy bypass

* chore(plugin-sdk): refresh api baseline

* fix(ollama): keep internal bypass out of qa aliases

* test(ollama): keep ssrf runtime mock complete

* fix(ollama): keep dist sdk aliases public-only

* fix(ollama): keep fetch bypass out of infra runtime

* fix(ollama): preserve packaged private sdk alias

* test(ollama): harden private ssrf alias coverage

* test(ollama): cover private ssrf resolver edges

* fix(ollama): scope private sdk native aliases

* test(ollama): audit blocked loopback bypasses

* fix(plugins): keep staged sdk aliases public-only

* test(ollama): harden proxy bypass proof

* test(ollama): cover origin mismatch proxy path

* test(ollama): cover ipv6 and batch bypass paths

* fix lint findings in Ollama proxy tests

* refactor: tighten Ollama proxy bypass

* fix: widen private sdk owner registry type

* test: stabilize Ollama proxy PR checks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-23 21:17:55 +01:00
Peter Steinberger
f6b332c735 test: make Codex diagnostic test deterministic 2026-05-23 21:13:41 +01:00
pashpashpash
8ede81af66 fix(image): hint safe provider timeout (#85812) 2026-05-23 13:10:03 -07:00
Peter Steinberger
2656f13ff8 docs(skills): require autoreview before bug sweep URLs 2026-05-23 20:51:46 +01:00
Peter Steinberger
6fc9d7b14f test: bound Codex app-server cleanup waits 2026-05-23 20:48:03 +01:00
sallyom
266f38b261 fix(control-ui): restore light select arrows
Signed-off-by: sallyom <somalley@redhat.com>
2026-05-23 15:43:42 -04:00
Linux2010
ae79e6e5ec fix(web-ui): improve light theme visibility for select arrows and bubble hover
Problem:
- Select dropdown arrow uses hardcoded #888 SVG stroke, barely visible on
  light backgrounds
- Chat bubble hover border uses 28% accent blend, too subtle in light theme
  for meaningful visual feedback

Fix:
- Darken dropdown arrow SVG to #444 in light theme (.cfg-select)
- Increase chat-bubble:hover accent blend from 28% to 48% in light theme
- Add subtle box-shadow on bubble hover for clearer feedback

Fixes: #85713
2026-05-23 15:43:42 -04:00
Peter Steinberger
d2e9f91cec test: align full release dispatch assertion 2026-05-23 20:24:30 +01:00
Vincent Koc
353d13248e fix(scripts): route check stages through managed runner 2026-05-23 21:20:52 +02:00
Peter Steinberger
9cef99f184 test: clean up Codex app-server run failures 2026-05-23 20:12:44 +01:00
Peter Steinberger
ee61f79b90 ci: retry release child workflow dispatch 2026-05-23 19:56:23 +01:00
Peter Steinberger
071c3e364b test: isolate Codex report snapshot tests 2026-05-23 19:48:06 +01:00
Peter Steinberger
edbd833351 perf(gateway): reduce startup filesystem probes 2026-05-23 19:38:53 +01:00
Peter Steinberger
fcb9c46af0 ci: retry GHCR docker login 2026-05-23 19:28:03 +01:00
Peter Steinberger
d42bc0b684 ci: harden manual checkout auth 2026-05-23 19:11:13 +01:00
Vincent Koc
208a0679e2 fix(scripts): avoid Windows shell argv warnings 2026-05-23 20:00:24 +02:00
Peter Steinberger
02b1c8c902 ci: fix release reachability auth 2026-05-23 18:59:14 +01:00
Peter Steinberger
388b24a34f docs: note docs publishing routing 2026-05-23 18:57:47 +01:00
Peter Steinberger
41f4605020 ci: harden release package validation 2026-05-23 18:48:17 +01:00
Peter Steinberger
3e14f54ffc ci(testbox): expose stable pnpm through corepack 2026-05-23 18:32:04 +01:00
Peter Steinberger
1f2d8f98ba ci(testbox): avoid ready raw runners after hydration failure 2026-05-23 18:30:37 +01:00
Peter Steinberger
f1226aeb6c perf(gateway): defer startup-idle runtime work 2026-05-23 18:27:04 +01:00
Peter Steinberger
391f29baad ci: harden beta release validation flakes 2026-05-23 18:23:39 +01:00
Peter Steinberger
86a0502711 test: type codex thread request mocks 2026-05-23 18:03:19 +01:00
Peter Steinberger
85664f8e71 test: avoid codex heartbeat lifecycle timeout 2026-05-23 17:56:26 +01:00
Vincent Koc
8a94e825cd fix(scripts): run Windows check commands through shims 2026-05-23 18:30:14 +02:00
Peter Steinberger
f4b5e58231 fix: aggressively prune retired model catalogs 2026-05-23 17:29:50 +01:00
Jason O'Neal
7fffbf60b0 fix: harden package URL downloads (#85578)
* fix: harden package URL downloads

Guard package acceptance URL downloads with HTTPS-only validation, no embedded credentials, private/special-use DNS and IP rejection, manual redirect checks, bounded timeout/size limits, pinned lookup, and atomic temp-file writes. Add tooling tests for unsafe URLs, redirect validation, size limits, and successful writes.

* fix: cancel redirect response bodies before closing dispatcher

ClawSweeper P2: the redirect branch in openPackageDownloadResponse cleared
the timeout and awaited dispatcher.close() without first cancelling
response.body. Undici's close() is graceful — it waits for in-flight
requests to complete — so a malicious redirect with a slow/never-ending
body could hang the hardened downloader.

Fix: call response.body?.cancel() before dispatcher.close() to abort the
redirect body immediately.

Test: add a regression test that uses a ReadableStream with an indefinite
interval to simulate a hanging body, and asserts cancel() was called.

Refs: clawsweeper review on PR #85512

* test: harden redirect body cancellation race in regression test

Guard the ReadableStream controller.enqueue() call with a cancelled
flag and try/catch to prevent ERR_INVALID_STATE when the interval
fires after cancel() closes the controller.

* fix: cancel final response body before closing dispatcher in downloadUrl

ClawSweeper P2: the HTTP-error and declared-oversize early-exit paths
in downloadUrl threw before consuming or canceling response.body. The
finally block then cleared the timeout and awaited graceful
dispatcher.close() with the body still open, allowing a slow/never-ending
response to hang release tooling.

Fix: add response.body?.cancel() in the finally block before
dispatcher.close().

Tests: add two regressions:
- HTTP 500 with slow body: asserts cancel() called before dispatcher close
- Declared content-length oversize with slow body: same assertion

* fix: add trusted package URL source policy

* fix: keep package URL resolver dependency-free

* test: cover encoded IPv6 package URL bypasses

* docs: sync package acceptance source overview

* docs: restore release doc formatting

* docs: sync package acceptance trusted-url source

* test: cover dotted IPv4 embedded IPv6 package URLs

* fix: parse dotted IPv4 embedded in IPv6 package URLs

* test: isolate anthropic pruning defaults

* test: move anthropic dated model coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-23 17:28:29 +01:00
Peter Steinberger
35969ff440 ci: retry npm Telegram release dispatch 2026-05-23 17:19:00 +01:00
Peter Steinberger
a04566da11 test: isolate Telegram spooled timeout from stall watchdog 2026-05-23 17:08:00 +01:00
Sebastien Tardif
9dc1afe9bb fix(exec-approvals): add .catch() to expiry delivery fire-and-forget (#83106)
* fix(exec-approvals): add .catch() to expiry delivery fire-and-forget

When exec-approval expiry fires, deliverToTargets is called as a
fire-and-forget promise with no .catch(). If delivery fails, the
unhandled rejection swallows the error and the notification is lost.

Add .catch() with log.warn to match the ackDelivery error handling
pattern. Keep pending.delete() before the await (the entry is expired
regardless of delivery success).

Closes #83113

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix(approvals): label expiry delivery errors by kind

---------

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-23 16:56:58 +01:00
davidbennett1979
983a3b94c9 fix(memory-core): avoid double bulleting promoted snippets (#85724) 2026-05-23 16:56:06 +01:00
Joey Frasier (Boothe)
ec65b71f5e fix(doctor): skip empty entries and memoize routes in plugin session repairs (#85718)
* fix(doctor): skip empty entries and memoize routes in plugin session repairs

runPluginSessionStateDoctorRepairs called resolveConfiguredDoctorSessionStateRoute
once per session-store key, even for entries that carry no plugin route state
fields. On stores with many CLI sessions (observed ~800 entries), each call
takes ~1.5s due to resolveAgentHarnessPolicy walking config and provider
metadata, so the doctor's state-integrity contribution hangs for minutes
and the surrounding 'openclaw doctor' run effectively never completes.

scanEntryForOwner can only produce repair/manual-review findings when the
entry exposes one of the fields covered by entryMayContainPluginSessionRouteState
(providerOverride/modelOverride/agentHarnessId/cliSessionBindings/etc.), so
the route resolution for empty entries was pure waste. The route itself is
also a function of agentId (sessionKey is only used to derive agentId), so
sessions sharing an agent can reuse one resolved route.

Filter the store by entryMayContainPluginSessionRouteState before resolving,
and memoize resolveConfiguredDoctorSessionStateRoute by agentId within the
remaining entries. On the repro store this drops the contribution from
'never completes' to <100ms.

Adds a guard test that builds a 200-entry store with 2 route-state-carrying
entries and asserts (a) the repair fires exactly once on the codex owner
and (b) the run completes in under 2s (pre-fix would take >5 minutes).

* fix(doctor): skip manifest model-id normalization in plugin session repairs

After the previous filter+memoize fix, runPluginSessionStateDoctorRepairs was
still ~38s on a 230-entry store because every scanned entry calls parseModelRef
on its runtime model. That implicitly enters manifest-driven model-id
normalization via normalizeStaticProviderModelId, which calls
loadPluginMetadataSnapshot when no current snapshot is bound to process state.

loadPluginMetadataSnapshot is filesystem-heavy and is only memoized when a
'current' snapshot is bound (it is not, during doctor), so each parseModelRef
call paid ~40ms of fresh plugin-metadata loading. 672 calls × ~40ms = ~27s
of doctor wall-clock, all of it useless for doctor's purposes: the scan only
needs the normalized provider id of the configured runtime/route to compare
against an owner's providerIds, never the manifest-normalized model id.

Pass allowManifestNormalization: false alongside the existing
allowPluginNormalization: false on all three parseModelRef call sites in
this file. normalizeStaticProviderModelId short-circuits to
normalizeBuiltInProviderModelId when allowManifestNormalization is false,
which is what doctor wants here.

On the same 230-entry store doctor:state-integrity drops from ~38s to ~2.4s
and total openclaw doctor wall-clock drops from ~91s to ~56s.
2026-05-23 16:55:35 +01:00
Peter Steinberger
6191750deb ci: avoid duplicate release-check auth headers 2026-05-23 16:55:03 +01:00
Peter Steinberger
b6530beb05 fix: prune retired model catalog entries 2026-05-23 16:46:59 +01:00
Peter Steinberger
0c192e2915 ci: authenticate release-check reachability fetches 2026-05-23 16:45:13 +01:00
Peter Steinberger
c5f1344faf docs(changelog): note Telegram attachment action fix 2026-05-23 16:43:23 +01:00
Peter Steinberger
054002529d refactor(telegram): simplify action media sends 2026-05-23 16:43:23 +01:00
Keshav's Bot
fdf01db62b fix(telegram): send attachment paths as media 2026-05-23 16:43:23 +01:00
Gio Della-Libera
c897384ae9 fix(doctor): canonicalize git checkout detection (#85735) 2026-05-23 08:42:23 -07:00
Peter Steinberger
030b7bb4b7 test(ci): update plugin prerelease checkout expectation 2026-05-23 16:31:34 +01:00
Peter Steinberger
d9f73cfe33 ci: persist checkout credentials for release validation 2026-05-23 16:17:24 +01:00
Peter Steinberger
5e8c71bf9f test(codex): avoid searchable-tool registration flake 2026-05-23 16:03:45 +01:00
Gio Della-Libera
056378efd5 refactor: simplify doctor repair checks (#83753) 2026-05-23 07:55:12 -07:00
Peter Steinberger
24de3047e5 docs(changelog): credit landed bug sweep PRs 2026-05-23 15:50:38 +01:00
Will.hou
bf84b3089d perf(utils): preserve message identity in stripInlineDirectiveTagsFromMessageForDisplay (#85682)
Consume the existing { text, changed } signal from
stripInlineDirectiveTagsForDisplay so unchanged text-parts keep their
references and the original message is returned when nothing was
stripped. Avoids spurious downstream rerenders/diff churn for consumers
relying on reference equality, and keeps the public SDK helper's text
output and message shape stable.

Fixes #37589.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 15:50:06 +01:00
Sebastien Tardif
49e9c3eb13 fix(agents): add openai-responses family to non-visible turn retry guard (#85603)
openai-codex-responses can return turns where usage.output > 0 but
assistantTexts is empty (hidden reasoning tokens only). The empty
response retry guard only covered openai-completions, anthropic-messages,
and Ollama, so these turns passed through as successful completions
with no content delivered to the user.

Add the full openai-responses API family (openai-responses,
openai-codex-responses, azure-openai-responses, and their transport
variants) to RETRY_GUARD_MODEL_APIS so the empty response and
reasoning-only retry paths can fire for these providers.

Closes #85364

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
2026-05-23 15:50:01 +01:00
ItsOtherMauridian
6e289b4889 fix(status): show configured cost for aws-sdk models (#85619)
* fix(status): show configured cost for aws-sdk models

Decouple status cost display from provider auth mode so explicit model pricing is used for Bedrock and other non-api-key providers. Include cache read/write tokens in the status cost estimate and cover the behavior with regression tests.

* fix: show configured response usage costs

* docs: align configured cost visibility

* fix(status): keep usage tokens mode cost-free

---------

Co-authored-by: ItsOtherMauridian <165866613+ItsOtherMauridian@users.noreply.github.com>
Co-authored-by: ItsOtherMauridian <itsothermauridian@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-23 15:49:57 +01:00
Roslin Mahmud Joy
ec43acb432 fix(microsoft-foundry): DeepSeek V4 models incorrectly use openai-completions API (#85549)
When onboarding Microsoft Foundry-hosted DeepSeek-V4 models (Pro/Flash),
the onboarding wizard assigned api: 'openai-completions' because
usesFoundryResponsesByDefault() only matched GPT/o-series models.

These V4 models require the Responses API (openai-responses) to work
correctly against the Foundry endpoint. Without this fix, all calls fail
with 'provider rejected the request schema or tool payload'.

Fix: Add 'deepseek-v4' prefix to usesFoundryResponsesByDefault() so only
the verified V4 family defaults to openai-responses. Older DeepSeek
families (e.g., V3) remain on openai-completions until proven compatible.

Closes: DeepSeek V4 models deployed via Microsoft Foundry onboarding
failing immediately due to wrong API adapter.

Co-authored-by: Roslin <rmj010203@gmail.com>
2026-05-23 15:49:53 +01:00
ANIRUDDHA ADAK
74e65f4d85 fix(skills): show empty state notice in config wizard (#85032)
* fix(skills): show empty state notice when no dependencies to install

* fix(skills): gate empty dependency notice

* fix(skills): tighten all-ready dependency notice

---------

Co-authored-by: Aniruddha Adak <aniruddhaadak80@users.noreply.github.com>
Co-authored-by: Gio Della-Libera <giodl73@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-23 15:49:49 +01:00