Commit Graph

19174 Commits

Author SHA1 Message Date
Shakker b2efac5134 fix: clarify native subagent completion handoff 2026-07-29 02:22:09 +01:00
Peter Steinberger 25909ef5da fix(ollama): preserve selected model capabilities during onboarding (#115467) 2026-07-28 21:07:48 -04:00
Peter Steinberger 5922dd4380 fix(memory): fall back to keyword search when embeddings cannot start (#115397)
* fix(memory): degrade bootstrap failures to keyword search

* docs(memory): clarify recovery status projection

* fix(memory): handle bootstrap embedding failures

* fix(memory): trust resolved provider diagnostics

* fix(memory): keep degraded syncs keyword-only

* fix(memory): confirm embedding recovery before semantic mode

* fix(memory): restore semantic readiness after recovery
2026-07-28 21:01:44 -04:00
Ayaan Zaidi b00a1aaeae test(telegram): give the media harness a bot identity instead of per-context ids
The previous commit patched me.id into 13 contexts in one suite. That treated the
symptom: the harness itself never passes botInfo, so resolveBotUserId has no
fallback when a test ctx carries only a username.

Fix the harness instead. Production always builds the bot from getMe(), so
botInfo is present in every real path; supplying telegramBotInfoForTest matches
that and drops the per-context ids.

Also revives bot.media.stickers-and-fragments.e2e.test.ts, which shares the
harness and failed 3/6 for the same reason and was not covered before.

The other ~84 bare me literals across 8 Telegram suites are fine: those tests
supply botInfo through their own harnesses. Verified, 371 pass, so no sweep.
2026-07-29 09:55:41 +09:00
Ayaan Zaidi cc434dd5fe test(telegram): cover forward-burst debounce coalescing through durable ingress
PR #115401 fixed the album split by separating durable claim lifetime from lane
occupancy (deferredLaneOccupancy="release"), and stated the same change repairs
the text/forwarded-message debounce, which defers its spooled participant the
same way. The album path got a durable-drain regression test; the debounce path
did not, because the suite that would cover it fails 10/10 on main.

Restore that suite: its harness supplies me.username without me.id, which
resolveBotUserId has required since #114532. Production grammY populates ctx.me
from getMe(), so this is harness drift, not a runtime gap.

Then extend the durable-ingress regression file to both buffers and rename it
off media-group. Two new tests admit a forwarded burst through the spool and
core drain, live and from a restart backlog, asserting one turn carrying both
notes plus independent tombstones.

Both fail with deferredLaneOccupancy reverted to "hold" (second note lands in a
separate turn), so they pin the lane contract rather than restate it.
2026-07-29 09:55:41 +09:00
metaforismo cc8fd57a01 feat(mattermost): read channel history with guarded permissions (#110875)
* feat(mattermost): add guarded channel history reads

* chore: refresh Mattermost generated metadata

* fix(channels): scope Mattermost read authorization

* test(mattermost): redact fixture credentials

* test(mattermost): use safe credential placeholders

* fix(mattermost): report directional pagination

* fix(mattermost): authorize current DM reads

* test(mattermost): cover named read policy inheritance

* fix(mattermost): make history reads opt in

* style(mattermost): align channel import ordering
2026-07-28 19:54:39 -05:00
Peter Steinberger b883b88129 fix(lmstudio): preserve valid models in mixed catalogs (#115336) 2026-07-28 20:43:16 -04:00
Shakker 5578d01777 test: remove stale persisted session file identity (#115442) 2026-07-29 00:55:13 +01:00
Peter Steinberger a49a5bfa74 perf(codex): serve catalog pages stale-while-revalidate and skip warm-client start resolution (#115403)
* perf(codex): serve catalog pages stale-while-revalidate and skip warm-client start resolution

* fix(codex): skip empty-tool runtime discovery
2026-07-28 19:24:39 -04:00
Ayaan Zaidi 895bf61ea0 feat(agents): surface watched-session awareness to the model (#114835) 2026-07-29 07:39:20 +09:00
Peter Steinberger ee3d084048 fix(telegram): coalesce durable album ingress into one turn (#115401)
* fix(telegram): coalesce durable album ingress

Split durable claim lifetime from lane occupancy so Telegram can admit later album members while every deferred claim remains heartbeated, recoverable, and independently settled.

With deferredLaneOccupancy=release, an unrelated later same-lane Telegram message can reach reply admission before an album that is still inside its 500 ms flush window. That restores the pre-f7786a16 contract, not a new defect; grammY sequentialize still preserves handler-entry order and the reply lane serializes once a turn is admitted.

* fix(telegram): preserve deferred abort semantics

Release deferred claims when their owner aborts before settlement, while preserving adoption when settlement won the race. Supersede every accepted pre-adoption state on released lanes without admitting past a surviving lane owner.

* fix(telegram): separate participant rejection from settlement failure

The detached deferred continuation chained its rejection handler with .catch
after .then, so it observed not only a participant.task rejection but also any
error thrown by onFailed()/onAdopted() and re-drove that infrastructure error
through onFailed().

That applied the wrong disposition when the claim was still pre-adoption, and
silently discarded the error once it was not: onAdopted() sets phase to adopted
before its tombstone write, so a wedged write reached a re-entrant onFailed()
that returned early on the phase guard and never reached the logging handler.

Use the two-argument then form so task rejection and lifecycle settlement
failure stay on separate paths.

* fix(channels): satisfy ingress CI guards
2026-07-28 17:50:20 -04:00
Peter Steinberger 7a1aa4eb4f feat(ui): Talk settings page with catalog-driven realtime pickers (#115409)
* feat(talk): emit realtime models and voices in talk.catalog and mirror create-time readiness

* feat(ui): add curated Talk settings page with catalog-driven pickers

* docs(talk): correct stale claims and add one-page GPT-Live setup path

* fix(ui): refresh Talk catalog on config-hash advance and neutralize GPT-Live badge

* fix(ui): provider-aware Talk selection, atomic provider switch, focus refresh

* fix(ui): resolve Talk provider fallbacks via catalog and make Default a true reset

* fix(ui): provider-compatible transports and race-free Talk catalog loads

* fix(ui): never resolve an unknown explicit Talk provider to the active one

* docs(talk): note Android relay readiness caveat for browser-only models

* fix(ui): keep the relay transport when switching Talk provider to Auto

* fix(ui): align section-ownership test and drop unused export after rebase
2026-07-28 17:38:15 -04:00
Peter Steinberger 6beb6961c9 fix(models): preserve provider ranking through discovery (#115406) 2026-07-28 17:25:33 -04:00
Alix-007 4ce534aec2 fix(codex): bound Computer Use process inspection (#109091)
* fix(codex): bound Computer Use process repair

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* test(codex): isolate review policy fixtures

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 17:14:30 -04:00
Peter Steinberger d239a59d82 fix(ui): make Control UI ownership and permissions reliable (#115364)
* fix(ui): unify connection-owned gateway event dispatch

* fix(qa): keep hosted UI smoke evidence truthful

* fix(ui): make mobile navigation drawer an accessible modal

* refactor(ui): centralize settings search destinations

* fix(ui): own chat media resource lifecycles

* fix(ui): unify sidebar session scope ownership

* refactor(ui): remove obsolete navigation backdrop styles

* refactor(ui): isolate dashboard provider lease capabilities

* fix(ui): centralize gateway operator permissions

* style(ui): format gateway event regressions

* fix(ui): render live dashboard permissions immediately

* fix(ui): enforce approval grant authority

* fix(gateway): fence retired sockets after event gaps

* fix(ui): isolate sidebar gateway fixtures across shared workers

* test(ui): isolate singleton-sensitive browser suites

* fix(ui): retire stale catalog pagination on gateway reconnect

* fix(ui): restore drawer focus after native dialog dismissal

* fix(ui): seed drawer threads and preserve modal focus ownership

* fix(ui): isolate nested native drawer overlay lifecycle

* test(ui): prove isolated dashboard lease authorization

* fix(ui): bound settled managed image resources

* fix(ui): type native modal focus and shared test helper

* fix(ui): correct approval mock types and trim dead export

* fix(ui): keep settings section metadata private

* fix(qa): keep hosted coverage regression within lint limit

* refactor(ui): keep catalog presence in its session data owner

* fix(browser): regenerate bundled copilot runtime

* test(ui): split board lease authorization regressions

* fix(ui): snapshot gateway listener fanout without redundant spread

* fix(ui): bind chat media subscriptions to image lifetime

* fix(ui): extract overlay access lifecycle

* fix(ui): restore guarded media after Lit reconnection

* test(ui): localize board lease fixture title

* fix(ui): reuse system approval fixture labels

* test(ui): narrow managed media lifecycle source

* fix(ui): prevent retired board gateway clients from rolling back leases

* fix(ui): expose pairing to pairing-scoped operators

* fix(ui): preserve legacy device pairing access

* fix(ui): preserve responsive sidebar ownership

* fix(ui): preserve responsive navigation and prove media ownership

* fix(ui): retire revoked catalog and refresh pairing grants

* test(ui): align typed catalog fixtures with main
2026-07-28 16:42:05 -04:00
Christian Lallo 811444d6db fix(memory-core): avoid cubic MMR similarity rescans (#113359)
* fix(memory): avoid cubic MMR similarity rescans

* style(memory-core): oxfmt mmr.test.ts

* test(memory-core): allow packed CI integration tests

* fix(ci): serialize targeted memory-core tests

* fix(ci): pin agentic cli worker count

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 03:53:43 +08:00
wuqxuan 5838f31431 fix(discord): preserve code-leading reasoning chunks (#103166)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 15:49:09 -04:00
joshavant a29214acd8 fix(slack): protect outbound hooks from previews 2026-07-28 14:41:50 -05:00
Peter Steinberger f78ba09120 feat(talk): support GPT-Live realtime voice over ChatGPT OAuth (#115226)
* feat(gateway): share the canonical browser-origin policy with plugins

Export resolveAcceptedBrowserOrigin through openclaw/plugin-sdk/webhook-request-guards
so browser-facing plugin routes reuse the Gateway's real origin contract instead of a
narrow allowedOrigins array check. Private LAN/Tailnet Control UI loads and the
Host-header fallback were previously rejected with 403 by plugin offer routes while the
Control UI itself worked.

Moves the loopback/forwarded-header helpers to net.ts (re-exported from auth.ts) so the
guard can delegate without importing gateway auth, and migrates the Codex realtime
broker onto the shared seam.

* feat(talk): let providers own agent delegation for realtime voice

Adds an optional runAgentConsult callback to the browser-session create request and
injects the existing embedded consult runtime from talk-client, bound to the same agent
and session key the GA tool path uses. Providers whose realtime protocol delegates work
through their own control channel (rather than GA function calls) can now reach the
OpenClaw agent without a client round-trip.

Threads the effective per-session model into browser-session capability resolution so a
request-level model override selects the right capability set, and propagates a caller
abort signal into consultRealtimeVoiceAgent so a superseded delegation stops its run.

* feat(openai): support GPT-Live realtime voice over ChatGPT OAuth

Implements OpenAI's quicksilver/frameless session natively for Talk browser sessions.
The Gateway creates the WebRTC call (multipart sdp+session to https://api.openai.com/v1/live)
and owns the sideband control socket, so the browser never holds upstream credentials;
delegation.created events run through the OpenClaw agent and stream back as speakable
context appends.

Verified end-to-end on 2026-07-28 against a ChatGPT Pro OAuth profile: call create 201
with an rtc_* id and answer SDP, sideband session.started, session.close teardown.
ChatGPT OAuth is preferred over a Platform API key because /v1/live access for platform
keys is waitlist-gated; the legacy chatgpt.com backend route returns 403 for every model
and protocol version and is not used.

Accepted models are gpt-live-1-codex and gpt-live-1-boulder-alpha; the voice allowlist is
the ten values the route actually accepts, since an invalid voice is rejected at call
creation and cannot be repaired afterwards (session.update reports immutable_field_update).

* docs: document GPT-Live Talk support and its route gotchas

Records the working route and auth, the accepted models and voices, the browser-only
scope, and the two traps that cost the most time: the chatgpt.com backend route returns
403 Voice session access denied for every model, and that same 403 is also what an
invalid voice returns, so it must not be read as an account entitlement block.

* fix(openai): resolve GPT-Live CI failures

* refactor(openai): own zod runtime dependency

* fix(openai): satisfy lint and live-shard gates for GPT-Live

Types the retry-delay finish callback as Error so the rejection reason is provably an
Error at the call site; the abort path already normalized a non-Error AbortSignal reason,
but the unknown parameter type hid that from static analysis.

Registers the new GPT-Live live test in the native-live-extensions-openai shard
expectation. The shard selector already picked the file up from the real tree; only the
hardcoded list in the tooling test lagged.

* fix(openai): clean up post-rebase capability resolver

* fix(openai): preserve GPT-Live delegation fragments

* fix(openai): close GPT-Live sideband handoff race

* fix(openai): accept UUID GPT-Live call ids

* style: apply oxfmt to GPT-Live sources and Talk docs

* style: format Talk docs after rebase

* fix(openai): keep GPT-Live transcript context across ignored delegations
2026-07-28 15:05:55 -04:00
Sally O'Malley 8799a97efc feat(openshell): add workspace selection (#114952)
Signed-off-by: sallyom <somalley@redhat.com>
2026-07-28 14:53:46 -04:00
Wynne668 9fedcf55f4 fix(discord): reject invalid UTF-8 probe responses (#111734)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:41:42 -04:00
Peter Steinberger 826beb724d feat(skills): enable self-learning review for Codex sessions (#114501)
* feat(skills): enable Codex experience review

* style(codex): keep event projector within ratchet
2026-07-28 14:21:42 -04:00
Peter Steinberger 0f91859382 fix: keep isolated gateway workspaces and skills inside state dir (#114487)
* fix: isolate non-default state workspaces and skills

* fix(codex): isolate native personal skills

* chore: refresh plugin SDK API manifest

* fix: keep SDK manifest generation scoped

* refactor(codex): keep isolation plugin-local

* test: satisfy optional skill snapshot typing

* refactor(codex): extract thread lifecycle preflight
2026-07-28 13:48:21 -04:00
Peter Steinberger e89ff13494 fix(nostr): report unavailable ingress when queue open fails (#115313)
* fix(nostr): surface durable ingress startup failures

* chore: keep changelog release-owned
2026-07-28 13:34:23 -04:00
Peter Steinberger 2964be2581 fix: prevent Slack and Feishu ingress startup leaks (#115295)
* fix(channels): clean up failed ingress startup

* chore: leave release notes to release prep

* test(feishu): initialize monitor ingress state
2026-07-28 13:29:20 -04:00
shannon0430 b954b3ae4f fix(slack): avoid unsafe emphasis boundaries (#111575)
* fix(slack): avoid invalid italic boundaries

* fix(slack): handle standalone CJK italics

* fix(slack): handle unsafe emphasis boundaries

* fix(slack): avoid unsafe emphasis boundaries

Co-authored-by: shannon0430 <shannon0430@users.noreply.github.com>

---------

Co-authored-by: shannon0430 <shannon0430@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:28:28 -04:00
Peter Steinberger 5de0366d95 fix(codex): stabilize prompts and expose real cache regressions (#115238)
* fix(codex): stabilize prompt caching and measure uncached work

* test(codex): refresh stable dynamic-tool prompt snapshots

* fix(qa): account for cache rewrites and incomplete telemetry

* fix(qa): reject inconsistent measured cache totals

* fix(qa): preserve live profile eligibility and parity topology

* fix(qa): extract acyclic runtime parity usage contract
2026-07-28 13:26:04 -04:00
Peter Steinberger 0c36fabc61 fix(slack): deduplicate message and mention events in one flush (#115302)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:20:01 -04:00
Peter Steinberger 641c82b5bd fix(qa): restore full-stack scenarios and truthful suite exits (#115290)
* fix(qa): restore full-stack scenarios and truthful suite exits

* test(qa): respect plugin boundaries and atomic media delivery
2026-07-28 13:00:22 -04:00
Peter Steinberger ca48f6c0fb feat(memory): backfill past sessions from Control UI (#115266)
* feat(memory): expose session backfill gateway methods

* feat(ui): add session memory backfill controls

* fix(memory): keep session backfill internals private
2026-07-28 12:57:21 -04:00
joshavant ba85271dbe fix(matrix): suppress previews for modifying hooks 2026-07-28 11:47:49 -05:00
Peter Steinberger 2b8e6395b9 fix: prevent node gateway hangs and runaway local inference (#115248)
* fix(node): bound gateway wake, cancellation, and local inference

* refactor(gateway): extract bounded node invocation policies
2026-07-28 12:47:30 -04:00
MatthewSynthia 7df5834511 fix(slack): cap chat.update edit text at the 4000-char limit, not the 8000 send limit (#115027)
* fix(slack): cap chat.update edit text at the 4000-char limit, not the 8000 send limit

updateMessageSlack truncated the edit text to SLACK_TEXT_LIMIT (8000), but Slack chat.update
rejects text longer than 4000 characters with msg_too_long (documented in limits.ts). Every
other edit path (actions.ts, edit-text.ts, message-action-dispatch.ts, preview-finalize.ts)
uses SLACK_EDIT_TEXT_LIMIT (4000); updateMessageSlack was the lone outlier, so a long
question-delivery status edit failed instead of landing. Use the edit limit.

* fix(slack): enforce edit text byte limits

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>

* fix(slack): preserve prepared edit text within limits

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>

---------

Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 12:41:37 -04:00
Vincent Koc 8d5a652ed8 Merge pull request #115211 from openclaw/fix/realtime-oauth-supported-protocol
* commit 'b90f2d1db8bcb65a86d2785e3956b419c5114b25':
  test(ui): reset config route hash between cases
  fix(talk): remove unsupported Codex OAuth realtime
2026-07-29 00:15:00 +08:00
Vincent Koc f9e1aac289 test(signal): verify archive limits without malformed tar (#115270) 2026-07-29 00:00:12 +08:00
Peter Steinberger 924f91ce47 refactor(sessions): isolate legacy transcript fixtures (#115231)
* test(sessions): isolate legacy file fixtures

* test(sessions): hide fixture-only manager type
2026-07-28 11:56:16 -04:00
WhatsSkiLL d22565c237 fix(discord): clear pending launch watchdog (#115100)
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-28 11:55:09 -04:00
WhatsSkiLL bb06e0fbcc fix(memory-core): recover dreaming cron reconciliation (#115174)
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-28 11:51:34 -04:00
Vincent Koc b403cb5d50 fix(qa-lab): filter incompatible channel scenarios (#115087) 2026-07-28 23:49:47 +08:00
WhatsSkiLL 3d4d2b7f5f fix(voice-call): bracket IPv6 webhook hosts (#115135)
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-28 11:47:39 -04:00
Peter Steinberger 9ae79eed2d perf(catalog): cadence-proof provider caches and parallelize the Claude scan (#115259) 2026-07-28 11:37:37 -04:00
Peter Steinberger d23ce0530b test(codex): de-flake attempt turn-watch timing tests (#115258) 2026-07-28 11:33:37 -04:00
Shakker b6adb8e25d fix: preserve retryable ACPX lease ownership (#115247) 2026-07-28 16:32:53 +01:00
Shakker 4b0d01b1b0 fix: serialize ACPX lease ownership transitions 2026-07-28 16:32:53 +01:00
Shakker a22a3ac8ff fix: retain ACPX leases across wrapper reconnects 2026-07-28 16:32:53 +01:00
Shakker f41b39147f refactor: parse ACPX lease command identity 2026-07-28 16:32:53 +01:00
Peter Steinberger 2160b97cdc refactor(config): retire compaction truncateAfterCompaction gate (#115206) 2026-07-28 11:30:50 -04:00
Vincent Koc b90f2d1db8 Merge remote-tracking branch 'origin/main' into pr-115211-prep
* origin/main:
  fix: preserve skill proposals across apply crashes and workspace moves (#114535)
  fix(qa): run maturity Docker scenarios through the aggregate scheduler (#114447)
  refactor(cli): unify configured model rows onto the shared row pipeline (#115239)
  fix(ui): stop modal autofocus steal after the open animation (#115168)
  fix(process): preserve long supervisor timeout deadlines (#115230)
  fix(slack): preserve pasted inbound tables (#115163)
  fix(codex): restore trajectory capture for canonical session targets (#115220)
  refactor(qa): make scenario selection taxonomy-owned (#114055)
  feat(plugins): match shared models across vendor-namespaced catalog ids (#115210)
2026-07-28 22:48:56 +08:00
Dallin Romney 92f6289cce fix(qa): run maturity Docker scenarios through the aggregate scheduler (#114447)
* fix(qa): batch Docker scorecard scenarios

* fix(qa): keep Docker batch types private
2026-07-28 22:41:35 +08:00
Peter Steinberger 3fa4805563 fix(slack): preserve pasted inbound tables (#115163)
* fix(slack): preserve pasted inbound tables

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* fix(slack): keep inbound text selection private

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* fix(slack): exclude unfurl tables from inbound context

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* refactor(slack): clarify aggregate table size limit

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

* docs(slack): clarify table fallback escaping

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>

---------

Co-authored-by: yash <84263676+yxshee@users.noreply.github.com>
2026-07-28 10:34:21 -04:00