Commit Graph

81070 Commits

Author SHA1 Message Date
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
Peter Steinberger 3c5cecee06 refactor: compact recovery ownership and model metadata (#126751)
* refactor: compact recovery ownership and model metadata

* chore: respect release-owned changelog gate

* test: skip unsupported Windows permission assertions
2026-08-20 10:30:21 -07:00
Peter Steinberger aafa61be65 fix(discord): preserve message text from every embed (#126752)
* fix(discord): preserve text from every message embed

* chore(discord): shrink assertion baseline after embed cleanup
2026-08-20 10:28:20 -07:00
Jony 3f2d3f9958 fix(onboard): honor explicit provider auth choice (#117883)
* fix(onboard): honor explicit auth when keeping the current model

Co-authored-by: Jony <13896935+zyz619963502zyz@users.noreply.github.com>

* test(onboard): preserve existing config across wizard snapshots

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Jony <13896935+zyz619963502zyz@users.noreply.github.com>
2026-08-20 10:28:02 -07:00
Peter Steinberger 9dc391c75b perf(ui): keep config render helpers lazy (#126754)
Restore the cross-platform Control UI startup gzip budget by keeping render-only sensitive-path helpers outside the startup config-draft graph. Preserve existing behavior and caller APIs while moving generic schema, search, and path helpers to their existing startup owner.
2026-08-20 10:22:55 -07:00
Peter Steinberger 695c16b7bc fix(ui): stop provider probes after agent selection changes (#126750) 2026-08-20 10:21:57 -07:00
Peter Steinberger cd1de94dc5 fix(plugins): preserve strict load failures when reusing registries (#126737) 2026-08-20 10:15:07 -07:00
Peter Steinberger 62ed43dfd0 fix(ui): keep ad hoc visualizations inline and readable (#126729)
* fix(ui): keep ad hoc visualizations readable

* perf(ui): preserve startup bundle budget
2026-08-20 10:05:21 -07:00
Peter Steinberger bbbd70542b feat(sessions): recover offline device placements (#126284)
* feat(sessions): recover offline device placements

* chore(protocol): refresh session placement models

* perf(ui): lazy-load session placement recovery

* test(ui): remove dropdown timing assertion

* test(ui): await committed cloud recovery route

* fix(sessions): complete explicit abandonment locally

* fix(sessions): fence lists by runner availability

* fix(ui): preserve canonical session freshness

* fix(sessions): preserve recovery contracts after rebase

* test(ui): await durable cloud recovery entry

* test(gateway): complete current runner fixtures

* fix(gateway): publish runner availability edges

* fix(ui): preserve shared session freshness

* fix(ui): preserve canonical sidebar session state

* fix(sessions): preserve abandoned partials and run-owned replies

* fix(sessions): resume durable abandonment retries

* test(gateway): compose provisioning replay with runner availability

* fix(sessions): publish recovered move transitions
2026-08-20 09:59:59 -07:00
Peter Lee 41d05f6bdf fix(models): Web UI provider probe fails for direct-credential providers (#125816)
* fix(models): keep direct-credential gateway probes on isolated runtime generations

* fix(models): carry isolated-runtime probe mode on the loader type

Drop the call-site cast for the widened runner params: the lazy loader now
declares the isolated-read-only capable runEmbeddedAgent shape, keeping the
assertion-safety ratchet at its grandfathered baseline for this file.
2026-08-20 09:57:53 -07:00
Peter Steinberger ccabd53235 fix(telegram): make common emoji reactions work reliably (#126739)
* fix(telegram): normalize supported reaction emoji variants

* chore(telegram): prune obsolete assertion safety baseline
2026-08-20 09:57:35 -07:00
Dallin Romney d628026dd7 chore(ci): shrink media assertion baseline (#126745) 2026-08-20 09:56:18 -07:00
Peter Steinberger ddb49f61ca fix(gateway): keep liveness probes working when config reload fails (#126736) 2026-08-20 09:52:29 -07:00
Peter Steinberger d8c3d94fb1 fix(cli): fence destructive offline fallback (#126743) 2026-08-20 09:49:16 -07:00
Peter Steinberger 58cda469f5 refactor(acp): simplify ownership plumbing (#126741) 2026-08-20 09:48:04 -07:00
Dallin Romney 927755e6af fix(qa): prove cron scenarios fire naturally (#123127) 2026-08-20 09:43:05 -07:00
Dallin Romney 14cfd111ad fix(media): tolerate sparse persisted facts (#123054) 2026-08-20 09:42:21 -07:00
Dallin Romney 6f14e79fde fix(test): restore packaged Doctor E2E fixture (#126009) 2026-08-20 09:42:14 -07:00
Dallin Romney cc38771540 test(nextcloud-talk): isolate error response timing (#126740) 2026-08-20 09:39:51 -07:00
Dallin Romney d9b09a0799 test(nostr): scope private key env fixtures (#123039) 2026-08-20 09:36:29 -07:00
Peter Steinberger 46c71b564e fix(config): validate config writes against the config being written (#126734)
* fix(config): validate config writes against the config being written

writeConfigFileFromContext passed the pre-write snapshot's plugin
metadata into strict validation. During onboarding that snapshot belongs
to an intermediate config written by agent creation, which has no plugin
entries, so its scoped manifest registry is empty. Validating the final
candidate against it made every plugin entry added by the same write look
unknown, and non-interactive onboarding warned that the openai and codex
entries it had just written were stale or uninstalled.

Drop the stale snapshot so validation resolves the manifest registry from
the candidate it is actually validating. Strict semantic validation is
unchanged, and the registry load stays lazy.

* fix(ci): raise the Control UI startup JS baseline to unblock main

main is red on the Control UI startup-JS ratchet: unrelated PR #126725 measures 348289 B and this branch measures 348351 B against a 347023 B baseline + 1056 B tolerance. Twenty-six UI commits have landed since the last bump (#126474), none individually large. Baseline moves to the CI-measured 348351 B, well under the 358400 B maintainer-approved ceiling that still guards cumulative creep.
2026-08-20 09:32:57 -07:00
Peter Steinberger 7975432eb5 fix(onboard): enable Runway and Alibaba video provider authentication (#126722)
* fix(onboard): enable Runway and Alibaba video provider authentication

* perf(ui): load image lightbox only when opening images

* perf(ui): defer onboarding memory import outside setup
2026-08-20 09:30:48 -07:00
Peter Steinberger e20a3298b1 fix(macos): install CLI automatically during remote onboarding (#126723) 2026-08-20 09:14:55 -07:00
Dallin Romney d40cbfef47 chore(i18n): refresh native locales (#126696)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-20 09:06:59 -07:00
Peter Steinberger 2613565132 chore(macos): update Peekaboo source (#126709) 2026-08-20 09:04:16 -07:00
Peter Steinberger fa75cdd01c fix(ui): validate automation condition triggers (#126718) 2026-08-20 09:02:48 -07:00
Vito Cappello 094873902b fix(agents): retire delivered requester finals (#123285)
* fix(agents): retire delivered requester finals

* fix(agents): bind requester final receipts before yielded settlement

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 09:02:08 -07:00
Peter Steinberger 8b448439b6 fix(plugins): retire executable plugin caches on metadata lifecycle clears (#126719)
Plugin install, replacement, and uninstall clear process memos through
registerPluginMetadataProcessMemoLifecycleClear, but four executable-
authority caches never registered, so retired plugin callbacks kept
executing after the registry moved on:

- createConfigScopedPromiseLoader (document/web-content extractor lists)
  now self-registers its clear at the factory, so no caller can leak
  resolved plugin callbacks past a lifecycle change.
- Provider policy surface maps (bundled + external, including cached
  negative entries) clear on lifecycle changes.
- Public surface loader now drops module exports, loader closures, and
  native require cache entries, not just resolved locations.
- SDK facade loader registers the same clear for facade exports and
  loader state; imported-plugin history is preserved as diagnostics.

The tracked-roots + native-require eviction pattern from provider
discovery is extracted into clearPluginModuleLoaderLifecycleCache and
reused by provider discovery, doctor contracts, the public surface
loader, and the facade loader, removing two near-copies.

Regression tests fail pre-fix: replaced or uninstalled plugin callbacks
must not run after clearPluginMetadataLifecycleCaches, proven down to
on-disk artifact replacement through the native require chain.
2026-08-20 08:58:05 -07:00
Peter Steinberger 8feeffb1a0 perf(tests): skip incidental Claude capture waits (#126717) 2026-08-20 08:52:30 -07:00
Hiroshi Tanaka 55f1738d50 fix(control-ui): config form save corrupts 64-bit id strings in string|number fields (#126402)
* fix(control-ui): stop config form save from corrupting 64-bit id strings

Saving the schema-driven config form coerced every numeric-looking string
to a JS number before submission. For union-typed fields such as
tools.elevated.allowFrom.* (anyOf: string | number), string entries
holding 64-bit ids (Discord/Telegram snowflakes) were rewritten through
Number(), which rounds past 2^53:
"1048113311314608148" -> 1048113311314608100. The corruption also hit
untouched fields, because serialization coerces the whole form, so merely
saving an unrelated setting silently broke elevated-approval allowlists
(fail-closed: the real user id no longer matched).

Two guards fix this:
- coerceFormValues keeps a string that already satisfies a string variant
  of an anyOf/oneOf union instead of parsing it into another variant's
  number.
- coerceConfigFormNumberString refuses lossy integer parses: plain
  integer text beyond Number.MAX_SAFE_INTEGER that does not round-trip
  through BigInt stays a string, so pure number/integer fields fail
  validation loudly instead of storing a corrupted id.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(control-ui): harden 64-bit config id preservation

* fix(control-ui): validate mixed-union scalar branches

* test(control-ui): prove real gateway id preservation

* test(control-ui): use communications route for config proof

* test(control-ui): grant config proof admin scope

* test(control-ui): reopen raw config for proof

* fix(control-ui): preserve explicit union input types

* test(control-ui): exercise union collection draft

* ci: retry flaky control ui e2e

* fix(control-ui): preserve mixed scalar branch types

* ci: retry service worker e2e

* fix(control-ui): preserve typeless string union branches

* fix(control-ui): reject lossy decimal coercion

* fix(control-ui): reject lossy pure numeric input

* fix(control-ui): preserve exact numeric branch semantics

* ci: retry checkout rate limit

* ci(control-ui): capture real gateway proof

* test(control-ui): frame config proof values

* ci: retry checkout download

* test(control-ui): prove Gateway-served production bundle

* fix(control-ui): preserve exact incremental union edits

* refactor(control-ui): isolate scalar edit session state

* fix(control-ui): keep scalar edit branch type internal

* fix(control-ui): avoid detached focus selector

* fix(control-ui): round-trip exact numeric branches

* refactor(control-ui): share exact scalar formatting

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:50:24 -07:00
Ayaan Zaidi 4768ac53c5 feat(qa): acknowledge Mantis PR requests (#126702)
Give maintainers immediate visibility when Mantis is requested. Bare mentions now react, link the active run, and keep one run-owned status comment through proof, short-circuit, or failure.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-20 21:19:40 +05:30
Vito Cappello 4fdfb8b1bf fix(ollama): carry real Ollama Cloud context windows and capabilities (#126653)
* fix(ollama): carry real Ollama Cloud context windows and capabilities

The ollama-cloud catalog still described three models (minimax-m2.7, glm-5.1,
glm-5.2) plus a retired kimi-k2.5. Every other cloud model — including kimi-k3,
the current flagship — was absent, so core synthesized it at the generic
DEFAULT_CONTEXT_TOKENS of 200k. A kimi-k3 session therefore ran with 200,000 of
its real 1,048,576 token window: 80% of the context silently discarded, with no
warning anywhere in the product.

Describe the full current cloud lineup with context windows, input modalities
and reasoning support verified against live /api/show and the ollama.com model
pages. Only mistral-large-3 lacks thinking (vision + tools + cloud only).

Suffixed refs shared the same defect from the other side: the default lookup is
keyed bare, so `kimi-k3:cloud` missed it and fell to the 128k plugin default.
A hardcoded glm-5.2 literal in buildOllamaModelDefinition had been papering over
that for exactly one model; replace it with a lookup through the canonical
cloud-id normalizer, which model-reasoning.ts already owned, and drop the
duplicate spelling of that helper.

* fix(ollama): cover exact cloud catalog variants

* fix(ollama): remove invalid cloud aliases

* fix(ollama): default Ollama Cloud onboarding to minimax-m3

Cloud onboarding derives `defaultModel` from the first entry of
OLLAMA_CLOUD_DEFAULT_MODELS, so array order silently owned the out-of-box
model choice. Put minimax-m3 (524,288 ctx, thinking + tools + vision) at
index 0, add it to the bundled rows it was missing from, and document the
ordering contract at the declaration.

Pin the resolved default id in the cloud setup tests so a reorder cannot
move it unnoticed, and align the provider doc's onboarding default and
fallback row list.

Claude-Session: https://claude.ai/code/session_01QXUQuDVataA5o16kxNnmoX

* fix(ollama): preserve default and shared model contracts

* test(ollama): consolidate cloud setup capability expectations

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 08:46:39 -07:00
Peter Steinberger e50f73d331 fix(onboard): activate media-only provider authentication (#126711)
* fix(onboard): activate media-only provider authentication

* refactor(onboard): keep media model defaults plugin-private
2026-08-20 08:43:40 -07:00
ClawSweeper 8c6c7a30cf improve(ui): make mobile image previews zoomable (#126528)
* improve(ui): make mobile image previews zoomable

* fix: harden mobile image viewer

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
2026-08-20 16:39:49 +01:00
SunnyShu 9bba88dbba fix(tasks): rank terminal tasks by completion and keep Recent terminal-only (#123219)
* fix(tasks): rank terminal tasks by completion and keep Recent terminal-only

- updateTaskStateByRunId backfills lastEventAt from endedAt for terminal
  finalizers (mirrors markTaskTerminalById), keeping activity monotonic
- both taskUpdatedAt projections rank terminal tasks by the maximum
  available activity timestamp, healing stale rows while preserving later
  delivery/terminal-outcome events recorded after completion
- Tasks page Recent fetch filters to terminal statuses so queued/running
  rows cannot starve the Recent section

Related to #100911

* refactor(tasks): normalize completion at registry owner

Absorb terminal timestamp ordering into the canonical registry lifecycle boundary, remove duplicated projection and writer policy, and prove Recent remains visible behind 200 active tasks in Chromium.

Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 08:38:57 -07:00
Vito Cappello e2f841bf1c fix(cron): release session admission during cleanup (#126413)
* fix(cron): release session admission during cleanup

* test(cron): cover admission release after lifecycle error

* test(cron): scope terminal lifecycle failure injection

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 08:33:45 -07:00