Commit Graph

20188 Commits

Author SHA1 Message Date
Dallin Romney 16ed3dd667 Merge remote-tracking branch 'origin/main' into HEAD 2026-08-25 18:10:10 -07:00
Dallin Romney 2b27c3ac6a fix(codex): preserve supervised effort ownership 2026-08-25 18:09:59 -07:00
Peter Steinberger 3d0df74b0f fix(openshell): sandbox cleanup, workspace sync, and gateway setup failures (#129641)
* fix(openshell): harden sandbox lifecycle and workspace sync

* fix(openshell): preserve shipped workspace root layouts

* test(gateway): reset shared agent harness state between cases

* test(qa): measure channel health startup grace directly

* chore(release): leave changelog updates to release automation
2026-08-25 18:08:55 -07:00
Dallin Romney cc1c61034f fix(qa): publish readiness only from final artifacts (#124189)
* fix(qa): publish readiness from final artifacts

* fix(qa): isolate runtime parity readiness

* test(qa): type runtime parity artifact mock
2026-08-25 18:02:17 -07:00
Peter Steinberger 1ecc35f95f fix(crabbox): keep cloud worker credentials out of process arguments (#129665)
* fix(crabbox): keep worker setup secrets out of argv

* fix(crabbox): use managed temp root
2026-08-25 17:56:09 -07:00
Dallin Romney 12dff76235 fix(qa): pin Slack draft progress transport (#127298) 2026-08-25 17:53:51 -07:00
Peter Steinberger 75a034d49b test(whatsapp): remove duplicate setup replays (#129713)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 17:47:06 -07:00
Peter Steinberger 1172d68d31 perf(anthropic): reuse provider usage suite for profile parity (#129703) 2026-08-25 17:39:54 -07:00
Yuval Dinodia 78c5d7ceb5 fix(buzz): messages sent during Gateway downtime are dropped after restart (#117259)
* fix(buzz): messages sent during Gateway downtime are dropped after restart

Every new Gateway process subscribed to Buzz rooms starting at its own
start time, because the lookback flag that enables backlog paging is
process-local. That cutoff is applied as the NIP-01 since filter, so any
room message a human sent while the process was down was never returned
by the relay and never reached the agent or the transcript.

The account gateway now persists a per-account recovery watermark in the
plugin state store. First-ever setup still starts from the current time;
later process starts resume from the saved watermark, clamped to the
existing 24 hour retention floor. The watermark advances only after
inbound handling completes and is stored at the admitted message
created_at, so the inclusive since boundary re-offers the last admitted
message to the existing persistent event-id dedupe guard.

* fix(buzz): keep the cold-start recovery cursor behind unfinished work

Codex review found two ways the recovery watermark could still drop room
messages. Backlog replay dispatches up to eight handlers concurrently, so
a newer message finishing before an older one committed the newer
timestamp; a crash then left the older message with no dedupe record and
a cursor already past it. The stored timestamp was also the sender
controlled created_at, so a future dated room event pushed the cursor
past locally observed time and excluded real downtime messages on the
next start.

The account gateway now tracks a recovery frontier per session. A
checkpoint is the highest completed message time bounded by the oldest
still running message, the oldest failed message, and the receipt time
observed when the message was admitted. Checkpointing stays closed until
the bus reports the room backlog fully drained, so a session that is
still paging history cannot commit past events it has not seen yet.
catchUpHistory now reports drained or incomplete for that signal.

* fix(buzz): scope cold-start recovery per room and fence it at enqueue

Admit replay work into the recovery frontier when it enters the dispatch queue instead of when a worker starts it, so a crash cannot persist a cutoff past an event that is still queued.

Key recovery cursors by room instead of by account, so a room configured after the first start resolves to the current time and gets no backfill, while existing rooms resume from their own cursor.

Record an account-level start marker so the first start under a watermark-aware build recovers the existing retention window instead of repeating the reported loss on the first restart after an upgrade.

* fix(buzz): keep cold-start recovery to accounts that already ran

An account with no persisted cursor is a fresh install as often as it is a
pre-watermark upgrade, and stored state cannot tell them apart, so the first
start no longer replays the retention window. It records the current time as
each room cursor and recovers only from the second start onward.

Dropping the account start marker also removes the interrupted-bootstrap
window where a marker written before the room cursors made the next start
treat cursor-less rooms as initialized.

Recovery state capacity is now derived from the supported room limit instead
of a smaller fixed number, and any non-complete history paging outcome, not
just timestamp-over-limit, holds the recovery frontier undrained.

* fix(buzz): bound the recovery cursor store to each account

ClawSweeper found that the recovery watermark opened one fixed plugin-state
namespace for every account while sizing it at the per-account supported room
count. Plugin-state capacity is enforced per plugin and namespace, so once one
account registered its full room allowance, a second account's register call
threw and its rooms stayed at the current-time cutoff, which is the same
dropped-message outcome this PR set out to fix.

The store is now opened against a namespace derived from the account identity,
so each account carries its own supported room capacity. The account moves out
of the entry key into the namespace, which leaves one account-scoped store path
rather than a fallback, and makes cross-account cursor mixing unrepresentable.

* fix(buzz): simplify durable restart recovery

Co-authored-by: yetval <yetvald@gmail.com>

* test(buzz): use real relay response in recovery fixture

Co-authored-by: yetval <yetvald@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 17:39:30 -07:00
Erick Kinnee cbdfedee84 fix(plugins): scope runtime catalog discovery by provider (#129624)
* fix: scope provider catalog discovery by selected identities

* fix(plugins): enforce agent-scoped live catalog discovery

Co-authored-by: Erick Kinnee <ekinnee@gmail.com>

* chore: keep provider release notes in pull request context

---------

Co-authored-by: Erick Kinnee <ekinnee@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 17:37:31 -07:00
Peter Steinberger 6f61184d1e fix(telegram): support polls lasting up to seven days (#129461) 2026-08-25 17:36:11 -07:00
Josh Avant 49f4240118 fix: keep session catalog mirroring within isolated profiles (#129638)
* fix: bind catalog HOME policy in active facade

* fix: report isolated catalog mirroring
2026-08-25 17:31:38 -07:00
Peter Steinberger 6a246f70d1 refactor(state): retire six dead shared-state tables at schema v10 (#129626)
* refactor(state): retire six dead shared-state tables at schema v10

agent_model_catalogs, android_notification_recent_packages,
command_log_entries, diagnostic_stability_bundles, media_blobs, and
model_capability_cache landed with the database-first squash but their
runtime writers never reached main; every stable since v2026.6.10 created
them empty (agent_model_catalogs held only rebuildable catalog cache rows
until #111173 removed its writer). State schema 10 drops all six tables
and seven indexes through both the runtime-open and doctor migration
paths, records the retirements, bumps the native reader ceiling, and
corrects stale database-first doc claims that still named these tables
as canonical stores.

* test: move cross-lane schema-version pins to v10

The v10 retirement missed current-version pins outside src/state: the
native guard vitest wrapper, placement-move and node-worker-launch
same-version assertions, and the audit outbound-progress tripwire. The
pinned pre-C04 audit reader is a v9-era build that now refuses v10
databases by the version contract, so the test projects the file back to
the exact v9 shape with the documented 10-to-9 downgrade fixture before
the reader proof; the shared fixture also seeds the v10 retirement
regression.

* test: keep only the used downgrade fixture export
2026-08-25 17:31:32 -07:00
Peter Steinberger 4a029e5279 fix(twitch): include attachments in normal agent replies (#129644) 2026-08-25 17:24:12 -07:00
Leah Armstrong 889a153171 fix(buzz): anchor threaded replies without nesting (#124884)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 17:12:26 -07:00
Peter Steinberger 2d85e9c503 fix(llama-cpp): preserve tools for fallback-capable chat templates (#129684) 2026-08-25 17:09:08 -07:00
Peter Steinberger 46f255cc87 fix(lmstudio): preserve saved model reasoning and code mode (#129675) 2026-08-25 17:00:41 -07:00
Peter Steinberger 9b2831afd5 feat(buzz): authorize different senders in each room (#129655)
* feat(buzz): support room-scoped sender authorization

* fix(buzz): synchronize generated official channel catalog
2026-08-25 16:52:42 -07:00
Josh Lehman f50e043029 fix(codex): restore Computer Use after marketplace source upgrades (#129551)
* fix(codex): migrate legacy bundled marketplace source

* test(codex): make marketplace migration regression portable

* fix(codex): scope marketplace migration to base user config (#129521)
2026-08-25 16:49:28 -07:00
wahaha1223 bf78ec9a0a fix(qa-lab): bound internal transport response reads (#109029)
* fix(qa-lab): bound local transport response bodies

* test(qa-lab): keep bounded response proof at its owner
2026-08-25 16:47:26 -07:00
Peter Steinberger a846297513 fix(memory): partition Mistral and DeepInfra embedding caches (#129669) 2026-08-25 16:44:21 -07:00
Peter Steinberger e2c8dae785 fix(ui): stop warm sidebar refreshes from blanking foreign-owned rows (#129558)
* fix(ui): stop warm sidebar refreshes from blanking foreign-owned rows

The owner-first roster plan (#128767) published its provisional owner-only
window as a full membership replacement on every primary refresh, so on
multi-owner gateways every other user's sessions blinked out of the sidebar
until the shared merge landed - up to once a second under event load. The
provisional phase now publishes only when no roster is on screen (cold start
keeps its fast first paint), and the shared phase merges the owner window
from the initial load's returned rows instead of reading published state;
the mergeExisting option is gone. A warm refresh whose shared phase fails
now keeps the previous roster instead of collapsing to owner-only rows.

The thread and child session lists also rendered rows positionally with
map()+keyed(), so any reorder tore down and rebuilt every shifted row's DOM
(spinners restarting, avatars remounting). Both now use repeat() with key
identity, matching the catalog renderer.

Regression coverage: owner-first-roster.test.ts pins the publish-sequence
invariant and shared-failure retention (both fail pre-fix); the new browser
test proves row DOM identity survives a reorder (fails on map()). The
owner-first tests moved out of index.event-refresh.test.ts, which hit the
max-lines limit.

* test(ui): prove foreign-owned rows survive a warm owner-first refresh

Browser-level regression for the warm-refresh half of this fix: holds the
shared phase deferred after a sessions.changed event and asserts the
foreign-owned row never leaves the DOM. Fails on pre-fix code (the row
count drops to zero the moment the provisional owner window publishes).

* test(anthropic): pin the local retired-profile id to the plugin-sdk constant

The provider-policy artifact keeps this id as a local literal so it never
imports the provider-auth barrel (#129052 regressed dist-less CI checkouts
into 120s jiti compiles of ~2.2k modules); this parity test stops the two
constants from drifting apart.
2026-08-25 16:38:55 -07:00
Peter Steinberger 6ad0f79ae4 fix(codex): suppress under-development features warning in chat (#129493)
Codex 0.149 emits a session-configure warning whenever UnderDevelopment-stage
features are enabled, and OpenClaw always enables features.code_mode and
features.apply_patch_streaming_events for native code mode threads. The
warning relays into chat as a SYSTEM card telling operators to edit the
managed codex-home config.toml they should never touch.

Send suppress_unstable_features_warning: true in the same thread-config
block that enables those features. When native code mode is off, OpenClaw
does not send the flag, so warnings for user-enabled under-development
features still surface. The general warning relay is untouched.

Verified live against the pinned @openai/codex 0.149.1 app-server binary:
thread/start without the flag emits the exact warning; with it, none.
2026-08-25 16:38:48 -07:00
Ebo61 dfe29eda2d fix: resumed main-session turn after a gateway restart is delivered to the session's last route instead of silently completing (#127342)
* fix(agents): deliver unclaimed restart recoveries to session route (#127339)

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* test(qa): validate restart isolation without stale inventory

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 16:37:20 -07:00
xingzhou b0526f7be7 fix(buzz): bound relay information responses (#119182)
Reject malformed relay metadata and cancel oversized response streams at the existing 16 MiB provider boundary.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 16:36:24 -07:00
Peter Steinberger 6b5b75aa01 fix(buzz): stop named account setup from replacing the existing bot identity (#129663)
* fix(buzz): reject named accounts before overwriting bot credentials

Preserve the requested account through channel setup so the existing single-account validator rejects unsupported named identities before configuration mutation. Preserve both plaintext credentials and SecretRefs.

Fixes #123200.

Co-authored-by: yu-xin-c <2182712990@qq.com>

Co-authored-by: atlas-maxjb <atlas@maximusjb.com>

* test(buzz): preserve environment-backed identity on rejected setup

Prove named --use-env setup fails before changing the existing bot credentials, disabled state, relay, or owner authentication tag.

Co-authored-by: yu-xin-c <2182712990@qq.com>
Co-authored-by: atlas-maxjb <atlas@maximusjb.com>

---------

Co-authored-by: atlas-maxjb <atlas@maximusjb.com>
Co-authored-by: yu-xin-c <2182712990@qq.com>
2026-08-25 16:32:28 -07:00
Vincent Koc d7c5771684 fix(matrix): await persistence shutdown (#129605)
* fix(matrix): await persistence shutdown

* fix(matrix): join startup during shutdown

* fix(matrix): bound startup retirement

* fix(matrix): fence late retirement ownership

* fix(matrix): centralize generation retirement
2026-08-26 07:19:16 +08:00
Vincent Koc 8c9575b972 fix(agents): honor private QA forced runtime selection (#128475)
* fix(agents): honor private QA forced runtime selection

* test(qa): detect forced runtime fallback and egress

* test(qa): satisfy runtime parity lint
2026-08-26 07:14:30 +08:00
Josh Avant bb8c04d537 fix(whatsapp): keep QR login owner-scoped (#129381) 2026-08-25 16:12:35 -07:00
Peter Steinberger 6a1dedb00c refactor(agents): remove redundant heartbeat system prompts (#129642)
* refactor(agents): remove redundant heartbeat system prompts

* test(agents): align heartbeat cleanup checks and prompt snapshots
2026-08-25 16:10:22 -07:00
Ben Badejo d2052167ec fix(matrix): let follow-ups steer active turns (#128907)
* fix(matrix): let follow-ups reach active turns

* fix(auto-reply): persist explicit steer turns

* test(matrix): stabilize active steering admission

* test: fix active steering type checks

* fix(auto-reply): route steer to active embedded owner

---------

Co-authored-by: Benjamin Badejo <ben@benbadejo.com>
Co-authored-by: Josh Lehman <550978+jalehman@users.noreply.github.com>
Co-authored-by: Josh Lehman <josh@martian.engineering>
2026-08-25 15:46:17 -07:00
Vincent Koc b6a2366f64 refactor(qa): reuse canonical string normalization (#120566) 2026-08-26 06:41:08 +08:00
Peter Steinberger 568a773beb fix(ollama): honor authoritative model thinking capabilities (#129611) 2026-08-25 15:40:44 -07:00
Peter Steinberger c86505c149 test: move trigger threshold proof to owner boundary (#129634)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 15:07:55 -07:00
Peter Steinberger e1e2818a6a fix(mattermost): preserve presentations in normal agent replies (#129579) 2026-08-25 14:46:28 -07:00
Vincent Koc aaae1f0c8d refactor(oc-path): share frontmatter formatting (#120098) 2026-08-26 05:45:20 +08:00
Peter Steinberger fee4e77d91 fix(anthropic): native Claude models show incorrect availability (#129346)
* fix(anthropic): verify native Claude login before publishing runtime auth

* fix(status): preserve native Claude CLI authentication labels

* refactor(gateway): remove retired native Claude auth projection

* fix(plugin-sdk): retain Claude compatibility types

Keep the released Claude CLI credential reader source-compatible through its documented v2026.10 retirement window and explicitly account for both retained type exports in the public SDK budget.

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* fix(plugin-sdk): preserve only shipped Claude compatibility exports

* fix(ci): align Claude native-auth contracts

Retire Doctor fixtures for credentials now owned by Claude CLI and remove the two never-shipped compatibility type exports while retaining the shipped reader through its documented v2026.10 window.

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* test(onboard): remove retired Claude credential file fixture

* fix(auth): skip incompatible profiles before plugin discovery

* fix(auth): avoid cold plugin activation for retired profiles

* test: repair upstream doctor and learning regressions

* fix(onboard): validate authored aliases without plugin discovery

* fix(agents): resolve compaction aliases without plugin discovery

* test(ui): register pairing sidebar before lifecycle teardown

* fix(anthropic): keep provider policy imports runtime-free

* test(vitest): cover codex startup retry test family

* fix(agents): avoid plugin discovery for internal sessions

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-25 14:42:08 -07:00
Vincent Koc fab76d4842 fix(workboard): index card child records (#129568) 2026-08-26 05:36:04 +08:00
Vincent Koc f21c707689 fix(logbook): index frame and batch queries (#129570) 2026-08-26 05:30:06 +08:00
Peter Steinberger 1445acb3b7 fix(ollama): cancelled cloud setup continues and returns credentials (#129541)
* fix(ollama): cancel cloud model discovery with setup

* test(ollama): normalize nullable request cancellation signal
2026-08-25 14:18:46 -07:00
Peter Steinberger 9b7c95a0f0 fix(anthropic): keep automated heartbeats on subscription usage (#129513)
* fix(anthropic): keep automated heartbeats on subscription usage

* test(agents): align retired heartbeat template expectations

* fix(anthropic): avoid heavyweight policy bootstrap imports

* chore(config): prune retired template assertion baseline

* test(vitest): cover Codex startup test family

* refactor(anthropic): remove obsolete thinking-profile re-export
2026-08-25 14:11:38 -07:00
Peter Steinberger 010417fca5 test: remove duplicate Google thinking cases (#129595)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 13:44:02 -07:00
Peter Steinberger 3c23457040 fix(kilocode): restore known default router pricing (#129546) 2026-08-25 13:27:22 -07:00
Peter Steinberger 99fbe2207f fix(ui): usage filters hide sessions when multiple providers are selected (#129482)
* fix(ui): make usage multi-select and quoted filters work

* fix(anthropic): keep provider policy artifacts lightweight

* test(vitest): assign codex startup retry to its owner shard
2026-08-25 13:19:18 -07:00
Peter Steinberger cf753e45f2 test(codex): remove duplicate approval policy assertion (#129586)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 13:18:42 -07:00
Peter Steinberger 5dd1a39e86 fix(matrix): preserve explicit replies when threading is disabled (#129415)
* fix(matrix): preserve explicit replies when threading is disabled

* fix(matrix): preserve explicit replies after prior deliveries

* fix(matrix): preserve compatible streaming drafts
2026-08-25 13:14:09 -07:00
Vito Cappello 2cd8f442f8 fix(diffs): resolve viewer assets in unified builds (#129391)
* fix(diffs): resolve viewer assets in unified builds

* refactor(diffs): share viewer asset resolution

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

Worked on by:
- @VACInc

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-25 16:05:52 -04:00
Peter Steinberger 66bfdeffb9 test: remove duplicate Cloudflare wrapper coverage (#129530)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b5-3918-749f-90bd-5c9ac1dced16

Co-authored-by: Amp <amp@ampcode.com>
2026-08-25 12:43:24 -07:00
Eden f3081bcb50 fix(line): preserve full Flex action labels up to LINE's limit (#128712)
* fix(line): preserve provider-native Flex action labels

Preserve LINE Flex action labels through destination-specific normalization while retaining template, quick-reply, callback, and URL safety limits.

Co-authored-by: 許元豪 <146086744+edenfunf@users.noreply.github.com>

* test(line): narrow Flex action-card component types

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-25 12:43:03 -07:00
Peter Steinberger f000fdb317 fix(discord): honor silent sticker and thread-reply delivery (#129479)
* fix(discord): honor silent sticker and thread reply sends

* fix(discord): preserve default silent delivery action shapes
2026-08-25 12:25:44 -07:00