Commit Graph

81131 Commits

Author SHA1 Message Date
Vincent Koc 8a09e71953 fix(release): bind GitHub and Windows writers 2026-08-20 21:20:07 -07:00
Vincent Koc ac8018edcf fix(release): preserve trusted dispatch identity 2026-08-20 20:54:18 -07:00
Vincent Koc 20a01f9308 fix(release): bind npm publishers to live tooling 2026-08-20 20:17:17 -07:00
Vincent Koc c89a3dde28 fix(release): revalidate tooling at npm publish 2026-08-20 17:17:22 -07:00
Vincent Koc 87c1c4cc1d fix(release): honor live tooling contracts 2026-08-20 17:10:14 -07:00
Vincent Koc 7f595f04a6 fix(release): cover protected tooling recovery paths 2026-08-20 16:51:20 -07:00
Vincent Koc 7daa6c02d7 fix(release): keep protected tooling trusted after main moves 2026-08-20 16:28:28 -07:00
Peter Steinberger 91b8a03453 fix(ui): recover failed new-session navigation without duplicate tasks (#126873)
* fix(ui): preserve committed sessions when chat navigation fails

* test(ui): keep committed-session retry fixtures fully typed
2026-08-20 16:27:26 -07:00
Peter Steinberger e78b9d3ce4 fix(install): defer success until verification (#126871) 2026-08-20 15:57:11 -07:00
Vincent Koc fa71a6f27b fix(qa): isolate packaged mock auth bootstrap (#126247)
* fix(qa): isolate packaged mock auth config

Punchcard-Session: frost-orchard-lantern-ze
(cherry picked from commit 648bd40a4f)

* fix(qa): scrub inherited shell startup env

* fix(qa): block exported Bash functions
2026-08-21 06:51:34 +08:00
Peter Steinberger 40e3ab8784 fix(heartbeat): report the cadence of active agent heartbeats (#126869) 2026-08-20 15:48:19 -07:00
Peter Steinberger b00734bd4c fix(plugins): invalidate replaced web runtime artifacts (#126867) 2026-08-20 15:43:21 -07:00
Vincent Koc c19bdb3a1d fix(agents): preserve explicit harness runtime selection (#126259) 2026-08-21 06:32:23 +08:00
Conan-Scott 7c959c85f9 fix(openai): preserve OAuth realtime session policy (#126363)
Co-authored-by: Clawdbot <clawdbot@apilab.us>
2026-08-20 15:17:03 -07:00
Eden c972fda893 fix(channels): keep started ingress deliveries admissible after their inherited root releases (#126590) 2026-08-20 15:10:34 -07:00
Peter Steinberger 6c9aae7cee fix(firecrawl): prevent canceled requests from caching late results (#126857) 2026-08-20 15:09:38 -07:00
Peter Steinberger 6086ccb85b fix(gateway): own post-ready drain cancellation (#126855) 2026-08-20 15:05:18 -07:00
Sarah Fortune 67bcea131e feat(slack): add compact commentary progress (#126480)
* feat(slack): add compact progress style

* chore(slack): protect compact progress contract

* chore(slack): clarify compact progress comment

* chore(slack): document compact task card behavior

* chore(slack): document compact draft card behavior

* chore(slack): document compact progress config contract

* fix(slack): enforce compact commentary-only progress

* chore(slack): strengthen compact style guard

* fix(slack): type compact progress config

* fix(slack): scope compact plan suppression

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-20 15:02:33 -07:00
Ben Badejo 784a228781 fix(matrix): recover after late leases drain (#126712)
Co-authored-by: Benjamin Badejo <ben@benbadejo.com>
2026-08-20 14:44:29 -07:00
Peter Steinberger d00cbd1593 fix(web-fetch): honor Unicode BOM before HTTP charset (#126854) 2026-08-20 14:43:35 -07:00
Peter Steinberger a8a9f284fb fix(auth): create a fresh install with canonical shared-auth ownership (#126783)
* fix(auth): create a fresh install with canonical shared-auth ownership

A brand-new install was born in the retired shape. `parseSharedAuthStoreOwnership(undefined)` returns
`legacy-main`, which is the correct compat answer for an existing install whose profiles really do
live in the main agent database -- but a new install has no ownership row and no legacy data either,
so onboarding wrote its first credential into `agents/main/agent/openclaw-agent.sqlite` and the
operator's very first `openclaw doctor` told them to run a migration for state OpenClaw had created
seconds earlier. The main agent also stayed undeletable until they did.

Record `auth.sharedStore = {"location":"state-db"}` when the shared store is first written and the
legacy source provably holds nothing: no `auth_profile_store` row, no `auth_profile_state` row, and
no unfinished cleanup ledger entry. Any legacy row, or any inspection error, leaves ownership alone
so doctor keeps owning the relocation. The check is memoized per ownership generation with a WeakSet
keyed on the process-stable ownership object, so a legacy root is inspected once per process and
doctor's committed flip naturally invalidates it.

The legacy row inspection moves out of `state-migrations.shared-auth-store.ts` into the auth-profiles
owner so doctor and runtime share one contract instead of runtime importing migration code. Explicit
main-agent credential writes now follow the shared target, which is a no-op on legacy roots where
both routes already resolve to the same file.

No SQLite schema change; the ownership row is data. Existing installs take exactly the path they take
today.

* fix(auth): preserve JSON-era shared credentials

* docs(auth): explain why doctor names the main agent dir during a shared JSON import

* test(auth): assert shared-owner runtime reads

* test(doctor): read migrated catalog credentials through the shared owner

A fresh root records state-db shared ownership, so the model-catalog credential migration persists into the shared store rather than the agent file. The assertion read the agent file directly and saw an empty store while all three credentials were present and correct in state/openclaw.sqlite. Read through the owner for that state root instead of pinning storage layout; the credential contents are still asserted exactly.
2026-08-20 14:39:11 -07:00
Peter Steinberger 1d3d65e924 fix(workers): preserve results after scratch cleanup (#126849) 2026-08-20 14:29:54 -07:00
Peter Steinberger cd5002610d fix(web-fetch): extract readable content from XHTML pages (#126835) 2026-08-20 14:26:50 -07:00
Eden 4c52d3fe9d fix(cli): message send cannot address channels from npm-installed plugins (#126700)
* fix(cli): message send cannot address channels from npm-installed plugins

Target resolution, channel enumeration, and target-prefix inference only consulted the process-root channel registry, so message CLI actions running against a scoped registry handle could not see installed channel plugins even though selection and send execution could. Carry the selection-resolved plugin into target resolution, fall back to the registry handle in scope for resolver-owned lookups, and list runtime-visible channel plugins for channel selection and prefix inference.

* fix(cli): keep runtime-visible channel reads import-light

Importing channel-resolution from the target-prefix leaf pulled the plugin bootstrap/loader graph into every consumer and reordered module loading under distant vi.mock factories (subagent-registry.steer-restart failed in CI with a hoisting TDZ). Move the scoped-registry reads into a dedicated import-light module, share its registry matcher with channel-resolution, and drop the mock workarounds the heavier graph had required.

* chore(ui): re-baseline startup JS for the outbound scoped-registry reads

CI measured 348285 B gzip on the merge ref (baseline 347023 + 1056 tolerance). The first CI round measured 347784 B, so most of the growth is main-side drift since the 2026-08-19 baseline; the outbound changes account for roughly 60 B in a local A/B. Updated with the documented --update-baseline --startup-js-bytes flow using the CI value.

* Revert "chore(ui): re-baseline startup JS for the outbound scoped-registry reads"

This reverts commit f60bd4c45f.

* fix(cli): plan broadcast accounts from runtime-visible channel plugins

The unscoped message broadcast --account planner still enumerated only process-root plugins, so a registry-scoped installed channel could not join broadcast candidate planning. Use the runtime-visible read and cover the scoped and no-scope paths.

* fix(cli): honor scoped channel plugin precedence

* fix(outbound): preserve loaded plugin fallback order

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-20 13:56:01 -07:00
Peter Steinberger 1362490b80 refactor(sandbox): canonicalize backend ownership (#126828) 2026-08-20 13:52:15 -07:00
Peter Steinberger 21bab3a8ac fix(gateway): honor local port for usage and stability queries (#126832) 2026-08-20 13:51:36 -07:00
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