Commit Graph

24501 Commits

Author SHA1 Message Date
Peter Steinberger 5e830508b6 test: stabilize release validation lanes 2026-05-03 16:24:17 +01:00
MkDev11 38eea33062 fix(opencode): expose Claude thinking policy (#76760)
Summary:
- Adds an OpenCode provider-policy public artifact that delegates Claude thinking profiles, plus regression tests and a changelog entry for preserving `xhigh` on `opencode/claude-opus-4-7`.
- Reproducibility: yes. Source inspection on current main shows the model-switch path remaps unsupported store ... vider-policy-api` artifact for the fallback resolver; the proposed test exercises that stored-`xhigh` path.

Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.

Validation:
- ClawSweeper review passed for head efa152cca5.
- Required merge gates passed before the squash merge.

Prepared head SHA: efa152cca5
Review: https://github.com/openclaw/openclaw/pull/76760#issuecomment-4366483080

Co-authored-by: mkdev11 <MkDev11@users.noreply.github.com>
2026-05-03 15:22:07 +00:00
Peter Steinberger 9e56cfcc35 perf(gateway): cache startup metadata probes 2026-05-03 16:07:06 +01:00
vinhnguyenthanhdn f8141da4a6 test(session): prevent regression where session repair trims final assistant response after tool usage (#76538)
Summary:
- Adds a Vitest regression case in `src/agents/session-file-repair.test.ts` for `repairSessionFileIfNeeded` preserving a final stop assistant message after a tool-call/tool-result pair.
- Reproducibility: yes. The added JSONL sequence can be traced through current `repairSessionFileIfNeeded`: no ... ry, so the function returns `repaired: false`; I did not execute the test because this review is read-only.

Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.

Validation:
- ClawSweeper review passed for head ee3aa0e036.
- Required merge gates passed before the squash merge.

Prepared head SHA: ee3aa0e036
Review: https://github.com/openclaw/openclaw/pull/76538#issuecomment-4365670008

Co-authored-by: Vinh Nguyen <vinhnt36@fpt.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 15:06:28 +00:00
Peter Steinberger 11e05e86a2 fix(agents): scope gpt-5.4-mini chat reasoning fallback (#76727)
Fixes #76176.

OpenAI live verification showed `gpt-5.4-mini` supports reasoning effort generally, but rejects `/v1/chat/completions` payloads that combine function tools with `reasoning_effort`. This keeps reasoning effort for tool-free Chat Completions and Responses, and omits it only for the rejected Chat Completions + function tools combination.

Validation:
- Live OpenAI API matrix on 2026-05-03
- pnpm test src/agents/openai-reasoning-effort.test.ts src/agents/openai-transport-stream.test.ts -- --reporter=verbose
- GitHub PR CI green on ea3915308c

Thanks @ThisIsAdilah and @chinar-amrutkar.
2026-05-03 16:02:15 +01:00
rolandrscheel aeac10f5ce fix(plugins): reuse workspace metadata for session model refs (#76655)
Fixes the session-list plugin metadata hot path by reusing the active workspace-scoped plugin metadata snapshot for manifest model-id normalization and setup CLI backend fallback. Also keeps model-pricing collection on its provided manifest registry and fixes the CI-only hoisted test mock failure.

Validated with targeted plugin/gateway/model-selection tests, CI-shaped gateway startup shard, Testbox `pnpm check:changed`, and green PR CI.

Thanks @rolandrscheel.
2026-05-03 15:58:14 +01:00
Peter Steinberger 935f078a89 perf(gateway): skip force port scan when free 2026-05-03 15:52:57 +01:00
Peter Steinberger 72072d8b2e perf(gateway): lazy load ws and aux handlers 2026-05-03 15:52:57 +01:00
Peter Steinberger bd79b25bb7 perf(gateway): defer task registry startup imports 2026-05-03 15:52:57 +01:00
Peter Steinberger 34bc31fb2c test: accept concise transport replay response 2026-05-03 15:37:21 +01:00
ANURAG BHEEMAPPA GNANAMURTHY 727398f41a fix(onboarding): mask token/credential inputs in CLI wizard prompts (#76693)
Summary:
- The PR adds `sensitive` support to wizard text prompts, routes sensitive Clack prompts through `password()`, ...  preserves existing gateway secrets through masked-preview confirms, and adds tests plus a changelog entry.
- Reproducibility: yes. Source inspection shows current main routes onboarding credential entry through visibl ... y provides a concrete Windows PowerShell `openclaw onboard --install-daemon` reproduction with screenshots.

Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.

Validation:
- ClawSweeper review passed for head a3db64c265.
- Required merge gates passed before the squash merge.

Prepared head SHA: a3db64c265
Review: https://github.com/openclaw/openclaw/pull/76693#issuecomment-4366253531

Co-authored-by: anurag-bg-neu <bheemappagnanamurt.a@northeastern.edu>
2026-05-03 14:33:58 +00:00
MkDev11 d6900ee500 fix(plugins): load explicit hook plugins at startup (#76684) (thanks @MkDev11)
Includes explicitly enabled hook-capable plugins in the Gateway startup runtime scope and adds regression coverage for startup hook plugin gating.
2026-05-03 15:20:42 +01:00
Vincent Koc 877eb1cbed fix(heartbeat): align response tool prompts (#76458)
* fix(heartbeat): align response tool prompts

* docs(changelog): credit heartbeat prompt fix
2026-05-03 07:19:56 -07:00
Peter Steinberger 103b6d50a5 fix: resolve bundled public surfaces from packaged dist
(cherry picked from commit 8771cfb5b7)
2026-05-03 15:15:56 +01:00
Tyler Nishida 796c1e67c3 fix message-tool-only telegram fallback (#76272) 2026-05-03 23:15:53 +09:00
Josh Lehman 30018bddc6 fix: restore verbose tool progress in chats (#76716)
* fix: restore verbose tool progress in chats

* test: fix gateway verbose mock types
2026-05-03 07:14:39 -07:00
Peter Steinberger 95f5b265c1 test: align support-boundary expectations 2026-05-03 15:04:02 +01:00
Peter Steinberger 54c0f982d5 fix: keep reply context out of image scanning (#76659) 2026-05-03 15:04:02 +01:00
Michael Romero abed4231aa fix: preserve reply context in embedded prompts 2026-05-03 15:04:02 +01:00
Dash d35c79edd6 fix(agents): suppress duplicate user persistence on fallback retries (#63696)
* fix(agents): suppress duplicate user persistence on fallback retries

* refactor(agents): align persisted-user callback types

* docs: note fallback transcript dedupe

* refactor(agents): remove fallback persistence casts

---------

Co-authored-by: Altay <altay@uinaf.dev>
2026-05-03 16:55:45 +03:00
Peter Steinberger 89ac126180 fix: mark plan compaction event delivery fire-and-forget (#76651) (thanks @simplyclever914) 2026-05-03 14:43:13 +01:00
Peter Steinberger 63ff9244c7 fix: allow async compaction event delivery (#76651) (thanks @simplyclever914) 2026-05-03 14:43:13 +01:00
Peter Steinberger 825ad57513 fix: deliver compaction hook messages (#76651) (thanks @simplyclever914) 2026-05-03 14:43:13 +01:00
simplyclever914 9de06e3dee Format compaction PR changes and validate locally
- apply oxfmt formatting to changed files
- keep replay-safety, typed hook, and changelog fixes
- validated targeted tests, oxfmt check, and check:changed locally
2026-05-03 14:43:13 +01:00
simplyclever914 cb4f4f5f3a Address compaction review feedback
- gate the compaction continuation retry on existing replay side-effect metadata
- type the bundled compaction notifier hook without explicit any
- add an Unreleased changelog entry
2026-05-03 14:43:13 +01:00
simplyclever914 e84ceb47f6 Make compaction visible and resume final replies
When an automatic compaction happens mid-turn, chat users currently see a long stall and the run can finish without a final visible answer.

This adds an optional bundled compaction notifier hook and a one-shot compacted-transcript continuation retry when a compaction produced no user-visible final payload.
2026-05-03 14:43:13 +01:00
Alex Knight 349106065a fix(tools): allow no-tool llm-task runs (#76686)
Summary:
- The branch marks runtime `toolsAllow` sources as enforceable during disabled-tool runs, filters inherited allowlist sources in the guard, adds focused guard coverage, and updates the changelog.
- Reproducibility: yes. The linked report gives concrete config and invocation steps, and source inspection on ... sables tools while the guard still treats inherited allowlist sources plus zero callable tools as an error.

Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.

Validation:
- ClawSweeper review passed for head 9c3e5f773e.
- Required merge gates passed before the squash merge.

Prepared head SHA: 9c3e5f773e
Review: https://github.com/openclaw/openclaw/pull/76686#issuecomment-4366216196

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-05-03 13:42:32 +00:00
Peter Steinberger db5f96cdc1 refactor: remove history limit alias 2026-05-03 14:30:52 +01:00
Peter Steinberger 928c70fb6b perf(gateway): trim startup watcher imports 2026-05-03 14:30:36 +01:00
Peter Steinberger 399d7f6178 fix(agents): forward model maxTokens by default 2026-05-03 14:30:16 +01:00
Peter Steinberger 41bbc4c048 test(plugins): cover pinned npm installs 2026-05-03 14:27:58 +01:00
Lucenx9 fb3ee066d8 fix(plugins): pin npm plugin installs 2026-05-03 14:27:58 +01:00
Peter Steinberger 97cdd73aa6 refactor: remove bootstrap warning alias 2026-05-03 14:24:17 +01:00
Peter Steinberger 8f20d03373 fix: cap idle timeouts without completed progress (#76345)
Co-authored-by: adhiraj <vacationadhi@gmail.com>
2026-05-03 14:12:11 +01:00
Alex Knight ccce342a24 fix(agents): keep web_search runtime providers visible (#76685)
Summary:
- The PR changes the agent web_search wrapper to keep runtime provider discovery enabled when runtime metadata is absent, adds focused regression coverage, and records an unreleased changelog fix.
- Reproducibility: yes. at source level: current main passes preferRuntimeProviders: false when runtime web-se ... d issue supplies live Brave CLI-vs-agent evidence; this read-only review did not rerun a live Gateway call.

Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.

Validation:
- ClawSweeper review passed for head e7f379c68d.
- Required merge gates passed before the squash merge.

Prepared head SHA: e7f379c68d
Review: https://github.com/openclaw/openclaw/pull/76685#issuecomment-4366216450

Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-05-03 13:11:35 +00:00
Peter Steinberger c02bf2f399 refactor: share transcript append path 2026-05-03 14:10:09 +01:00
Peter Steinberger 68b56108f6 fix(plugins): tighten shadowed install diagnostics 2026-05-03 13:59:21 +01:00
Yuyummy f73a614d66 fix(plugins): warn when npm install is shadowed 2026-05-03 13:59:21 +01:00
Peter Steinberger 6f9a9241a6 perf(gateway): defer early maintenance startup 2026-05-03 13:51:02 +01:00
Peter Steinberger f30dd51d5f fix(gateway): stop lazy cron startup on hot reload 2026-05-03 13:44:28 +01:00
Craig baf8b8effe fix: continue update runs after restart (#74362) (thanks @100menotu001) 2026-05-03 18:13:25 +05:30
Steven Chou fa533101d8 Run doctor after global gateway updates 2026-05-03 13:43:00 +01:00
Peter Steinberger 74f9a2aedd test: allow capability provider runtime registry lookup 2026-05-03 13:35:42 +01:00
Peter Steinberger 0b1fbeabed perf(gateway): defer cron and sentinel startup work 2026-05-03 13:30:35 +01:00
Peter Steinberger ca69917153 test(sandbox): cover registry migration 2026-05-03 13:25:32 +01:00
Peter Steinberger 1402997489 fix(sandbox): move registry file migration to doctor 2026-05-03 13:25:32 +01:00
Peter Steinberger 1cebe32d76 fix(sandbox): harden sharded registry storage 2026-05-03 13:25:32 +01:00
Vincent Koc 164dfc4218 fix(sandbox): remove registry helper generics 2026-05-03 13:25:32 +01:00
hobo 975891153f perf(sandbox): shard container registry into per-entry files to remove cross-session lock contention
The sandbox registry stores one JSON document per scope (containers
and browsers), with every writer serialized through
`acquireSessionWriteLock` against that single file. In a host running
several sessions in parallel — multiple pairings, subagent spawns, or
just an `ensureSandboxContainer` landing at the same moment as a
`removeRegistryEntry` — each writer waits up to 60s for the lock, and
a crashed process can leave the lock file behind long enough to
wedge every subsequent sandbox operation until the stale-lock
threshold elapses. The lock's only job is to keep entries from
trampling each other inside one JSON blob, so it is a whole-file
mutex gating reads/writes that touch disjoint entries.

Each container already has a unique name (enforced at creation), so
each entry's storage can be disjoint too. This change turns the
`~/.openclaw/sandbox/containers.json` and `browsers.json`
monolithic files into per-entry JSON files under
`~/.openclaw/sandbox/containers/` and `~/.openclaw/sandbox/browsers/`
directories. `writeJsonAtomic` (tmp-file + rename) keeps each
per-entry write crash-safe, and because concurrent writers only
touch their own files there is nothing left to serialize across.

Changes:

- `src/agents/sandbox/constants.ts`: add `SANDBOX_CONTAINERS_DIR`
  and `SANDBOX_BROWSERS_DIR` sibling to the existing monolithic
  paths. The old paths stay exported because the one-shot migration
  still needs to locate the legacy file.
- `src/agents/sandbox/registry.ts`: replace the
  `withRegistryLock` / `readRegistryFromFile("strict")` /
  `writeRegistryFile` loop with per-entry read/write/remove
  primitives against the sharded directories, and drop the
  `acquireSessionWriteLock` import. The existing upstream additions
  are preserved: the zod `RegistryEntrySchema`, the
  `backendId`/`runtimeLabel`/`configLabelKind` fields on
  `SandboxRegistryEntry`, and `normalizeSandboxRegistryEntry` still
  decorate reads. Upsert merge semantics (preserve `createdAtMs` and
  `image` from the prior entry, prefer the newer `configHash`) are
  kept bit-for-bit.
- `src/agents/sandbox/registry.ts`: add `readRegistryEntry(name)`
  for O(1) single-container lookup. The previous hot path in
  `ensureSandboxContainer` had to read the whole registry and
  `Array.find` the one entry it wanted; the new API avoids both the
  full directory scan and the JSON round-trip on every other entry.
- `src/agents/sandbox/registry.ts`: add a one-shot
  `migrateMonolithicIfNeeded` helper invoked at the top of every
  public read/write. If a legacy `containers.json` / `browsers.json`
  exists, its entries are fanned out into per-entry files, the old
  file and its `.lock` are removed, and subsequent calls skip the
  migration branch entirely. Malformed legacy files are dropped
  rather than throwing forever, because a corrupt single-file
  registry that has already been superseded by the new storage
  would otherwise block every sandbox ensure/remove on every boot.
  Live per-entry files still go through the same schema validation
  the upstream strict path used — a corrupt per-entry file is
  simply skipped during enumeration so that one bad file cannot
  hide every other running container from the operator.
- `src/agents/sandbox/docker.ts`: swap the `readRegistry()` +
  `Array.find` lookup in `ensureSandboxContainer` for the new
  `readRegistryEntry(containerName)`. This is the only in-tree
  caller that needed the full scan just to pick one entry.
- `src/agents/sandbox/registry.test.ts`: rewrite around the new
  per-file semantics. The old tests covered two properties that no
  longer exist — "the lock serializes concurrent update/remove so
  the later write cannot resurrect a removed entry" and "a
  malformed monolithic file makes every `update` throw" — both of
  which were artifacts of the single-file design. The rewrite keeps
  the normalizeSandboxRegistryEntry contract, the
  concurrent-updates-succeed contract (now without any lock in
  play), the malformed-legacy-migration contract, and adds coverage
  for `readRegistryEntry`, the stale-`.lock` cleanup, and the
  "corrupt per-entry file does not hide its siblings" guarantee.
- `src/agents/sandbox/docker.config-hash-recreate.test.ts`: update
  the mock module to expose `readRegistryEntry` instead of
  `readRegistry`, and return single-entry objects or `null` rather
  than `{ entries: [...] }`.

Other in-tree consumers (`manage.ts`, `prune.ts`, `browser.ts`,
`context.ts`) only call the public `readRegistry` / `updateRegistry`
/ `remove*` surface, whose return shapes and observable behavior
are unchanged; their existing tests (`manage.test.ts`,
`browser.create.test.ts`, `sandbox.resolveSandboxContext.test.ts`)
all pass unmodified.

Default behavior is unchanged from the operator's point of view:
the first boot on the new code sees the legacy files, migrates them
in place, and deletes them. Subsequent boots never touch the
migration path. No config surface, no types, and no public exports
are removed.
2026-05-03 13:25:32 +01:00
HCL deb7b821c1 fix(plugins): include selected context-engine slot plugin in gateway startup (#76576)
External context-engine plugins (e.g. lossless-claw) register via
api.registerContextEngine at load time but ship without
activation.onStartup in their manifest. The gateway startup planner
only considered memory plugins and explicit sidecar plugins, so a
selected non-legacy context engine was omitted from the startup load
plan and never loaded before agent turns resolved the active engine,
producing the "Context engine X is not registered; falling back to
default engine legacy" warning.

Fix: add resolveContextEngineSlotStartupPluginId mirroring the memory
slot pattern; pass contextEngineSlotStartupPluginId into
shouldConsiderForGatewayStartup so the selected context-engine plugin
is included in pluginIds regardless of its manifest activation shape.

Tests: added four regression cases covering include, exclude, legacy
bypass, and id normalization. 82 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 13:22:47 +01:00