Commit Graph

81255 Commits

Author SHA1 Message Date
Peter Steinberger 96cb0b9b49 fix(ui): retire stale tools and skills after reconnects (#126826) 2026-08-20 13:47:31 -07:00
Peter Steinberger 6b3f7272dc fix(plugin-state): bound expired row cleanup (#126827) 2026-08-20 13:42:18 -07:00
Peter Steinberger ea77d4c708 fix(plugins): fence stale config-scoped loader failures (#126829) 2026-08-20 13:35:24 -07:00
Peter Steinberger a4178c7eb1 fix(discord): demote expected command truncation logs (#126824) 2026-08-20 13:26:44 -07:00
openclaw-mantis[bot] ddf73d4ca2 chore(ui): refresh control ui locales (#126614)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-20 13:16:10 -07:00
joshavant b52d2f08f5 fix(ci): trust maintainer-authored dependency changes 2026-08-20 15:09:22 -05:00
Peter Steinberger 97c0455add fix(tui): route messages to the replacement agent session (#126820) 2026-08-20 13:04:25 -07:00
Josh Avant a4901b6291 fix(gateway): preserve managed Tailscale ingress compatibility (#126519)
* fix(gateway): accept tailnet peers on managed Funnel

* fix(gateway): release Tailscale claim on interrupt

* test(gateway): cover Funnel tailnet ingress

* docs: remove Tailscale changelog entry
2026-08-20 13:04:06 -07:00
ZYV5ge adc608401e fix(control-ui): queue distinct repeated submissions instead of dropping user actions (#118884)
* fix(control-ui): preserve distinct identical chat submissions

Co-authored-by: ZYV5ge <39863830+ZYV5ge@users.noreply.github.com>

* fix(control-ui): keep submission guard key immutable

Co-authored-by: ZYV5ge <39863830+ZYV5ge@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 12:53:08 -07:00
Peter Steinberger cd04d3f82d fix(agents): stop suggesting unavailable tools in system prompts (#126792)
* fix(agents): keep system prompts truthful about available tools

* test(agents): preserve prepared message tool in delivery fixture

* test(agents): enable MCP for prepared CLI messaging fixtures
2026-08-20 12:46:55 -07:00
Peter Steinberger ba4ff7a1e9 fix(plugins): recover official catalog after failed loads (#126815) 2026-08-20 12:42:09 -07:00
Peter Steinberger b3a41e6516 fix(agents): preserve delivery causality in subagent retries (#126812) 2026-08-20 12:37:20 -07:00
Peter Steinberger af858dff8e fix(clickclack): clarify command menu permission errors (#126802) 2026-08-20 12:29:38 -07:00
Peter Steinberger 5e7f98ec1d fix(onboard): report health-check failures through the non-interactive failure owner (#126801)
A reachable gateway whose health check failed either escaped as a raw thrown
error or hit healthCommand's CLI-style runtime.exit(1), killing non-interactive
onboarding before logNonInteractiveOnboardingJson could emit the --json summary
and polluting JSON stdout with human diagnostic text. Route health failures
through logNonInteractiveOnboardingFailure (structured ok:false payload in
--json mode, framed text otherwise) via healthCommandNonExiting, and capture
healthCommand's human output off stdout in --json runs so the diagnostic lands
in the payload's detail field instead.
2026-08-20 12:25:30 -07:00
Peter Steinberger c7322d761a fix(macos): preserve session kind metadata (#126807) 2026-08-20 12:19:28 -07:00
Dinesh H Suthar 8beae99ed0 fix(ui): hydrate ClawHub verdicts on initial skills route (#110166)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 12:19:05 -07:00
Peter Steinberger 4249df34b4 improve(code-mode): call tools as global functions (#126262)
* feat(code-mode): expose tools as global functions

* fix(code-mode): harden callable tool composition

* fix(code-mode): reserve private guest globals

* fix(cron): migrate legacy code-mode triggers

* fix(code-mode): align final tool result contracts
2026-08-20 12:18:23 -07:00
Vincent Koc 15f33d9edc fix(qa): preserve Codex auth identity across restarts (#126777) 2026-08-21 03:16:22 +08:00
Peter Steinberger c0775c7f6d fix(search): preserve provider cache hits across equivalent queries (#126798) 2026-08-20 12:04:19 -07:00
Vincent Koc 701b576cc1 fix(ci): default Telegram advisory input to false (#126794) 2026-08-21 03:03:52 +08:00
Peter Steinberger 73555c5fdd fix(doctor): stop asking a fresh install to repair a registry it never had (#126799)
The first `openclaw doctor` on a freshly onboarded install reported "Persisted
plugin registry is missing or stale. Repair with `openclaw doctor --fix`".
Nothing was wrong: the `installed_plugin_index` row had never existed, `plugins
list` reported 148 plugins without it, no retired `plugins.installs` records
were present, and starting the gateway once builds the row by itself -- measured
going 0 -> 1 across a single `gateway run`.

`preflightPluginRegistryInstallMigration` returned a single `action: "migrate"`
whether the index was absent or unreadable, and the health issue name
`registry-missing-or-stale` shows the conflation: missing and stale are
different states and only one is a problem.

Split that into `initialize | migrate`. A root with no persisted index, no
install records, and no retired config records is initialization the gateway
owns, so doctor stays quiet. Install records without a readable index stays a
migration, as does a config still carrying retired `plugins.installs` records,
or a caller that supplied no config to prove otherwise. `doctor --fix` still
builds the index in every case -- this changes the warning, not the repair.

Production +5 LOC.
2026-08-20 12:02:42 -07:00
Peter Steinberger ee7146a282 fix(ui): make startup gzip runtime-independent (#126795)
Host zlib versions compress identical startup assets into different bytes, causing false Linux budget failures. Emit canonical shipped pako gzip sidecars, restore the 512 B ratchet tolerance, and lower the startup baseline from 348351 B to 344531 B.
2026-08-20 12:00:01 -07:00
Peter Steinberger 231405930a fix(discord): record activity after successful poll and sticker sends (#126791)
* fix(discord): record activity for structured outbound messages

* chore(discord): shrink structured-send assertion baseline
2026-08-20 11:56:07 -07:00
Peter Steinberger 0d555266e4 refactor(nodes): retire legacy runner inventory parsing (#126773) 2026-08-20 11:53:00 -07:00
Peter Steinberger 28ec823c3b fix(wizard): health-check failures no longer kill the configure/onboard/doctor flow (#126758)
* fix(wizard): keep embedded health-check failures visible instead of exiting mid-flow

healthCommand's reachable-gateway auth diagnostic paths call runtime.exit(1),
which with defaultRuntime hard-kills the hosting configure wizard, onboarding
finalize, or doctor daemon flow mid-render — dropping the failure framing,
docs guidance, and outro. Add healthCommandNonExiting, which traps that
CLI-style exit into ExitError so the host flow owns the outcome, and use it
at every embedded call site.

Also fix the doctor e2e harness createConfigIO mock missing configPath, which
broke doctor.runs-legacy-state-migrations on current main.

* fix(onboard): reflect a failed health check in the finalize outro

A reachable gateway whose health check failed still ended onboarding with the
plain success outro because completion gating only read the earlier
reachability probe. Record the health outcome as its own fact and end with a
dedicated outro pointing at openclaw health. (ClawSweeper P1 on #126758.)
2026-08-20 11:42:18 -07:00
Peter Steinberger c6c598c149 fix(qa-lab): normalize direct-message ingress before validation (#126782) 2026-08-20 11:37:12 -07:00
Peter Steinberger ff0113cdb2 fix(perplexity): reject empty grounded search answers (#126780) 2026-08-20 11:33:03 -07:00
Dallin Romney 8fdc6d7c36 test(gateway): bind archive terminal PTYs by owner (#126767) 2026-08-20 11:32:31 -07:00
Dallin Romney 2f602fd382 fix(plugin-sdk): deduplicate API diff declarations (#126725) 2026-08-20 11:31:48 -07:00
Peter Steinberger 31fc15b8dd fix(memory-wiki): prevent oversized wiki content from crowding out model context (#126779)
* fix(memory-wiki): bound search snippets before model context

* fix(memory-wiki): bound compiled prompt digest context
2026-08-20 11:27:40 -07:00
ClawSweeper 8b78e07d3d fix(ui): compact Guardian review rationale (#126778)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-20 11:25:52 -07:00
Peter Steinberger 0e781ea8d2 fix(skills): reuse plugin metadata for execution workspaces (#126720)
* fix(skills): reuse metadata for execution workspaces

* test(skills): make upload lease heartbeat deterministic
2026-08-20 11:22:22 -07:00
Peter Steinberger 2006049629 fix(onboard): reject a malformed API key from the environment too (#126776)
`openclaw onboard --openai-api-key 'openclaw onboard --auth-choice ...'`
correctly refuses with "Paste the API key value, not an OpenClaw onboarding
command", exits 1, and writes no config. The identical value supplied through
`OPENAI_API_KEY` -- the form `docs/start/wizard-cli-automation.md` documents for
automation -- exited 0 with empty stderr and persisted the command string as the
credential.

`isMalformedApiKeyInput` was already imported into this file but guarded only
the `flagKey` branch; both `resolveEnvKey()` branches returned unchecked. The
operator finished onboarding believing they were configured, and nothing told
them otherwise until an agent turn failed or they happened to run
`openclaw doctor`, which classifies that exact value as `malformed_api_key` and
prints the hint they never saw.

Route every operator-supplied key -- flag, env, and secret-ref env -- through one
guard, and name the environment variable in the message so an operator with
several exported keys knows which one is wrong. The stored-profile branch stays
unguarded on purpose: a bad key already on disk is doctor's to diagnose, and
refusing there would strand someone re-onboarding to replace it.
2026-08-20 11:15:48 -07:00
Patrick Erichsen 4f1172a6ca test(doctor): cover copied-state migration sequence (#126508) 2026-08-20 11:14:13 -07:00
Peter Steinberger 8efbf7ce00 fix(ui): session hovercards stop replaying unchanged PR status (#126726)
* perf(ui): avoid replaying unchanged session PR subscriptions

* test: ratchet assertion safety baseline

* test(ui): assert service worker update outcomes

* test(slack): avoid wall-clock rate-limit assertion
2026-08-20 11:11:40 -07:00
Patrick Erichsen c99bc4601f test(gateway): cover copied Codex session resume (#126502) 2026-08-20 11:11:34 -07:00
Peter Steinberger 2054c769b7 fix(sessions): query child entries directly (#126770) 2026-08-20 11:10:25 -07:00
Patrick Erichsen 7e4eeb90d7 fix(pr): batch ignored transition checks (#126759)
* fix(pr): batch ignored transition checks

* fix(pr): ignore absent ignored transition paths
2026-08-20 11:08:28 -07:00
Peter Steinberger 7f9a46ea82 fix(gateway): recover chat when session subscriptions stop responding (#126760)
* fix(gateway): prevent stalled session subscriptions from freezing chat

* fix(gateway): retire timed-out session subscription leases

* fix(gateway): preserve subscription recovery failure cause
2026-08-20 11:06:26 -07:00
Peter Steinberger b439c2f588 fix(sessions): warn when reset retains worktree (#126771) 2026-08-20 11:04:24 -07:00
Peter Steinberger a2051c9bb2 fix(onboard): support password-authenticated remote gateways (#126768)
* fix(onboard): support password-authenticated remote gateways

* fix(onboard): parse remote password without type assertions
2026-08-20 11:02:25 -07:00
Vincent Koc 2f0f65e790 fix(ci): add Telegram-only package acceptance profile (#126769) 2026-08-20 11:01:59 -07:00
Peter Steinberger 82e8855acb fix(moonshot): fail unfinished native search rounds (#126765) 2026-08-20 11:00:26 -07:00
Peter Steinberger 4963599688 fix(cron): stop retrying permanent command failures as provider overloads (#126763)
* fix(cron): avoid retrying incidental overload status codes

* fix(cron): preserve authoritative command failure classification
2026-08-20 10:53:16 -07:00
Colin Johnson 64b0e865df fix(ui): keep attributed avatars beside sent messages (#112472)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 10:50:17 -07:00
Peter Steinberger 9bdc37f4ba fix(doctor): give the operator a way out of an unparseable config (#126757)
`openclaw onboard` refuses a corrupt openclaw.json and tells the operator to run
`openclaw doctor --fix`. Doctor then answered with one sentence -- "Config could
not be parsed or recovered ... refusing to apply repairs" -- named no next step,
and exited 1. The operator was left looping between two commands that pointed at
each other.

The refuse path also wrote openclaw.json.clobbered.<timestamp> and called it
"Original preserved", but it had not clobbered anything: at that point the
snapshot is a reread of the live file, so the copy was byte-identical to the
untouched config. Three failed runs left three identical copies.

Drop the copy and say what to do instead: name the file, state that it cannot be
repaired automatically, and point at `openclaw config validate` for the exact
parse position, hand-editing, or moving the file aside and re-running
`openclaw onboard`. Commands go through formatCliCommand so profile and
container invocations stay pasteable.

`doctor-config-preflight.ts` was the only caller of the public
preserveConfigSnapshotAsClobbered wrapper, so the wrapper, its factory entry and
its barrel export go too; the genuine recovery paths keep using the core helper
and still preserve real originals. Production -16 LOC.
2026-08-20 10:36:38 -07:00
Dallin Romney 28568d0c12 test(acp): close owned state database exactly (#126746) 2026-08-20 10:34:25 -07:00
Peter Steinberger 5e03d3c495 test(web-fetch): colocate extractor coverage with runtime owner (#126755) 2026-08-20 10:34:01 -07:00
Dallin Romney 7620ac28ba test(gateway): invalidate per-case session config (#126744) 2026-08-20 10:33:58 -07:00
Dallin Romney 34e5caa15a test: repair current-main agent E2E fixtures (#123125) 2026-08-20 10:32:44 -07:00