Commit Graph

19174 Commits

Author SHA1 Message Date
Dallin Romney 92d9da9432 fix(qa): use SQLite Matrix E2EE state (#115748) 2026-07-29 17:32:04 +08:00
Hannes Rudolph 6dc55fa65e fix(plugins): recover user turns with scoped reply hooks (#114836)
Allow before_agent_reply plugins to declare host-enforced trigger eligibility so scheduled-only hooks do not block interrupted user-turn recovery. Keep omitted and malformed scopes fail-closed, scope both memory-core maintenance hooks, and cover three runner reload cycles through the public registration contract.

Refs: #111442

Source: #114836

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 17:22:16 +08:00
Vincent Koc 6d6908eabc fix(whatsapp): keep monitor helper types internal 2026-07-29 17:18:57 +08:00
Peter Steinberger 20764dae6d fix(mattermost): preserve private-channel origin identity (#115726)
Preserve the authoritative inbound group origin for private Mattermost channels without changing public channels, direct messages, thread keys, or the native channel delivery target. Prove both Bot API channel types over real HTTP, gateway discovery, and SQLite-backed outbound persistence.

Credit the original group-origin observation in #95669.

Co-authored-by: hansraj <hansraj136@gmail.com>
2026-07-29 05:18:17 -04:00
Peter Steinberger cb8351604e fix(line): mark durably accepted webhook deliveries (#115796)
Emit the established OpenClaw durable-delivery response marker only after an authenticated, non-empty LINE webhook event has been persisted. Verify the production gateway route with signed real HTTP requests covering verification, delayed admission, invalid signatures, and storage failures.

Co-authored-by: 許元豪 <146086744+edenfunf@users.noreply.github.com>
2026-07-29 05:17:15 -04:00
Peter Steinberger 4232126bba chore: update dependencies across workspace (#115677)
* chore(deps): update dependencies

* fix(deps): restore CI compatibility
2026-07-29 05:16:42 -04:00
Peter Steinberger e8524a5839 feat: add Fish Audio S2.1 and local MLX speech (#115790)
* feat: add Fish Audio speech support

* chore: remove unused speech exports

* chore: keep Fish API constant private

* test: remove stale code mode import

* style: use bracket access for Fish voice ids

* test: restore QA evidence validator import
2026-07-29 05:15:33 -04:00
Peter Steinberger 13563478fb fix(mattermost): preserve safe denied-sender group history (#115773)
* fix(mattermost): record pending history for non-allowlisted group senders

When `groupPolicy` is `"allowlist"`, messages from senders not in
`groupAllowFrom` were silently dropped before reaching
`recordPendingHistoryEntryIfEnabled()`. This meant the bot had no
context of what non-allowlisted users said, breaking use cases like
conversation summarization.

This change introduces a `senderBlockedByGroupAllowlist` flag so that
non-allowlisted messages continue through the history-recording code
path before returning without generating a response.

Changes:
1. Add `senderBlockedByGroupAllowlist` flag before access check
2. `GROUP_POLICY_NOT_ALLOWLISTED` sets flag instead of returning
3. Skip `commandGate` check for blocked senders
4. Call `recordPendingHistory()` then return before response processing

Fixes openclaw/openclaw#57607

* test(mattermost): verify denied history over real transport

Co-authored-by: Jason Wang <jasonwang@barkingdog.ai>

---------

Co-authored-by: Jason Wang <jasonwang@barkingdog.ai>
2026-07-29 05:08:22 -04:00
Dallin Romney 0723c68b57 refactor(qa): remove execution sharding (#115787) 2026-07-29 17:06:57 +08:00
Peter Steinberger 994ca7d259 fix(msteams): honor group and channel conversation allowlists (#115746)
* fix(msteams): honor group conversation allowlists

Fixes #95737. Preserve opaque Teams conversation identities, the documented group fallback, personal-DM isolation, and display-name spoof protection.

Based on the original contributor fix in #95764.

Co-authored-by: 周鹤0668001310 <zhou.he3@xydigit.com>

* test(msteams): isolate conversation allowlist regression proof

Co-authored-by: 周鹤0668001310 <zhou.he3@xydigit.com>

---------

Co-authored-by: 周鹤0668001310 <zhou.he3@xydigit.com>
2026-07-29 05:05:42 -04:00
Vincent Koc e2df9be989 refactor(whatsapp): bound delivery helper responsibilities 2026-07-29 17:05:09 +08:00
Peter Steinberger dbba7e5c4b fix(nostr): keep private tool traces out of encrypted messages (#115769)
Sanitize both Nostr delivery paths with the shared assistant-visible text contract. Preserve ordinary replies and suppress internal-only messages before Markdown conversion.

Related: #90684

Co-authored-by: liyuanbin <li.yuanbin1@xydigit.com>
2026-07-29 05:01:27 -04:00
Peter Steinberger fb788b79cf feat(memory): retain recent project scopes per session (#115731)
* feat(memory): retain active project set

* refactor(memory): require prepared active set

* docs(memory): explain active project set
2026-07-29 04:58:14 -04:00
Vincent Koc 5242deedcb test(whatsapp): label monitor owner behaviors 2026-07-29 16:54:23 +08:00
Vincent Koc 2f53bb5ab7 refactor(whatsapp): extract inbound delivery coordinator 2026-07-29 16:54:23 +08:00
Vincent Koc 3b1cbbe178 refactor(whatsapp): extract attached socket session 2026-07-29 16:54:23 +08:00
Vincent Koc 703826c692 refactor(whatsapp): extract group metadata cache owner 2026-07-29 16:54:23 +08:00
Peter Steinberger 94025985f7 fix(feishu): reject unsupported initial document content (#115697) 2026-07-29 04:53:11 -04:00
Peter Steinberger c402688894 feat(media): probe duration and dimensions for playback metadata (#115728)
* feat(media): probe playback metadata

* fix(media): satisfy CI gates

* fix(media): satisfy lint rules
2026-07-29 04:52:17 -04:00
Vincent Koc 30346f9788 fix(sandbox): scope runtimes by workspace (#115766)
Qualify non-shared sandbox identities by resolved workspace while preserving shared runtime names. Existing non-shared runtimes reset once under the new identity.

Related: #51363

Co-authored-by: Tayoun <39609208+tayoun@users.noreply.github.com>
2026-07-29 16:50:38 +08:00
Peter Steinberger 4a19f399be fix(zalo): stop provider startup after gateway shutdown (#115763)
Reconstruct the verified Zalo lifecycle fix from #109990 on current main and preserve its exact production and regression-test blobs.

Source: https://github.com/openclaw/openclaw/pull/109990

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: LZY3538 <liu.zhenye@xydigit.com>
2026-07-29 04:45:50 -04:00
Peter Steinberger 382ea7b74e refactor: centralize channel streaming config hints (#115739)
* refactor: centralize channel streaming config hints

* fix: repair code mode static checks

* fix: restore QA evidence validator import
2026-07-29 04:42:23 -04:00
ndholakia 726d348bbd fix(msteams): finalize sent replies after dispatch (#82354)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 16:40:52 +08:00
Peter Steinberger c5d0b7dd39 refactor: retire legacy provider and secret paths (#115655)
* refactor: retire legacy provider and secret paths

* fix: remove stale cache retention import

* test: remove retired secret marker fallback
2026-07-29 04:36:20 -04:00
Pavan Kumar Gondhi 36984fe1af fix(diagnostics): keep internal thinking out of telemetry [AI] (#115261)
* fix(diagnostics): exclude internal thinking from telemetry

* fix(diagnostics): redact replay reasoning fields

* fix(diagnostics): omit replay signatures from telemetry

* chore: sync removed test helper
2026-07-29 14:05:45 +05:30
Peter Steinberger ed6010ed54 fix(memory): keep dreaming consolidation within project scope (#115721)
* fix(memory): isolate consolidation by project

* test(memory): align dreaming status threshold
2026-07-29 04:27:24 -04:00
Edward Abrams 6c000dc696 fix(discord): keep tool rows under verbose progress (#111947)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 04:26:28 -04:00
Peter Steinberger 1b6ad8da8f fix(memory): avoid phantom continuation pages (#115722)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 04:24:19 -04:00
Peter Steinberger 104322c5cc fix(telegram): prevent false empty replies after message-tool delivery (#115588)
* fix(telegram): suppress message-tool-only reply fallbacks

Honor message-tool-only delivery when a non-silent Telegram reply is skipped in both ordinary group dispatch and native slash-command turns. Keep the existing visible fallback for genuinely empty native replies and cover both dispatch surfaces with regression tests.

Fixes #90091

* fix(telegram): preserve genuine delivery failure fallbacks

Suppress only non-silent skips owned by message-tool-only delivery. Preserve visible fallbacks when the same turn also encounters a real dispatch or final-delivery failure, with an explicit regression for the mixed failure path.

* fix(telegram): preserve native message-tool delivery errors

Track genuine native slash delivery failures so message-tool-only skip suppression never hides a failed response. Cover the exact mixed empty-skip and real-error path with a regression while preserving true-empty and intentionally cancelled fallbacks.

* test(telegram): preserve synchronous native delivery callbacks
2026-07-29 04:19:43 -04:00
Peter Steinberger 7441362014 feat(openai): support GPT-Live over backend WebSocket (#115622)
* feat(openai): add GPT-Live websocket bridge

* chore: defer GPT-Live changelog to release

* fix(android): preserve GPT-Live relay readiness gate

* fix(openai): normalize GPT-Live assistant completion
2026-07-29 04:15:03 -04:00
Peter Steinberger 43127e12f9 refactor: consolidate Teams and Zoom meeting plugin shells (#115707)
* refactor(meetings): consolidate plugin shells

* chore(plugin-sdk): refresh meeting runtime baseline

* refactor(meetings): consolidate SDK shell surface

* refactor(meetings): trim plugin shell exports

* fix(meetings): preserve shell callback types

* fix(meetings): type gateway timeout callback

* fix(meetings): preserve plugin package boundaries

* fix(meetings): preserve adapter package declarations
2026-07-29 04:11:57 -04:00
Peter Steinberger 452abbaf8a fix(browser): release unread CDP response streams (#115675) 2026-07-29 04:11:35 -04:00
Peter Steinberger 302f262e6b refactor: deduplicate extension normalization primitives (#115650)
* refactor(plugins): reuse SDK normalization primitives

* fix(ci): repair code-mode matrix checks

* fix(ci): satisfy code-mode matrix gates

* fix(ci): use matrix evidence export

* fix(ci): validate matrix evidence artifact
2026-07-29 04:10:06 -04:00
Peter Steinberger b3ec2b1a1a fix(whatsapp): infer native media from filenames (#115725)
Recover native image, video, voice, and document delivery when upstream media supplies no MIME or a generic binary document. Preserve authoritative MIME, explicitly selected documents, unknown binaries, and existing Opus conversion; prove the actual platform payload across a 14-case delivery matrix.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: MatthewSynthia <matthewsynthia@users.noreply.github.com>
2026-07-29 04:08:47 -04:00
Peter Steinberger 5692baafc3 fix(memory): exclude annotation carriers from recall text (#115719) 2026-07-29 04:03:12 -04:00
Peter Steinberger c650d2c8c9 fix(telegram): keep update retry checks read-only (#115613)
Use the non-mutating dedupe-cache contract when checking unaccepted Telegram updates. Preserve active handler and completed-update deduplication while allowing a real update to be accepted after repeated handler skip probes.

Fixes #105192
2026-07-29 04:02:55 -04:00
Peter Steinberger b2cc5f5042 fix(memory): promote durable facts after repeated recall (#115715)
* fix(memory): calibrate promotion gate defaults

* docs: refresh generated docs map
2026-07-29 03:51:59 -04:00
Peter Steinberger 945ac651ec fix(msteams): prevent duplicate replies after streaming failures (#115669) 2026-07-29 03:47:15 -04:00
Peter Steinberger c392268a05 fix(whatsapp): keep QR login compatible with grammar-constrained models (#115656)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: guanbear <123guan@gmail.com>
2026-07-29 03:46:13 -04:00
Peter Steinberger 42e9558110 fix(qa): bound paired-node gateway startup readiness (#115693) 2026-07-29 03:45:56 -04:00
Peter Steinberger c29d889b9c fix: prevent sustained inbound messages from starving delivery (#115682)
Fixes #104106

Reported-by: @masatohoshino (#104106)
2026-07-29 03:44:35 -04:00
Peter Steinberger a7cecc85d3 fix(codex): safely deliver remote workspace files and images (#115668)
* fix(codex): safely deliver remote workspace files and images

* chore(codex): keep release notes in pull request

* style(scripts): repair current main formatting gate

* refactor(codex): remove unused remote filesystem RPC types

* docs: refresh generated documentation map

* test(codex): type remote workspace reader mock

* fix(ci): preserve plugin test ownership boundary

* refactor(codex): split remote transfer protocol and projection types
2026-07-29 03:37:50 -04:00
Peter Steinberger d37fd8f2d4 fix(matrix): accept documented automatic approval mode (#115676)
Restore the explicitly shipped Matrix approval mode without changing omitted, boolean, invalid, or non-strict configuration behavior. Regenerate the canonical channel metadata and prove native Matrix approvals against a real homeserver.

Co-authored-by: mingdideng <deng.mingdi@xydigit.com>
2026-07-29 03:37:19 -04:00
Peter Steinberger 6090386dc7 fix: make Codex harness caching and benchmark parity exact (#115663) 2026-07-29 03:33:36 -04:00
Peter Steinberger dd459ac1d7 refactor(memory): deduplicate promotion and CLI flows (#115706) 2026-07-29 03:29:48 -04:00
Dallin Romney f027d7bcf6 refactor(qa): make Matrix sharding execution-owned (#115589)
* refactor(qa): make sharding execution-owned

* test(qa): simplify transport selection coverage
2026-07-29 15:23:37 +08:00
iloveleon19 c193ffd554 fix(mattermost): key private channels as group on outbound routing (#96645)
* fix(mattermost): key private channels as group on outbound routing

A Mattermost private channel (server type `P`) is authoritatively chat_type
`group`, but it is addressed as the delivery target `channel:<id>` — the same
prefix as a public channel. Inbound classified it correctly as `group`, while
outbound/session reconstruction re-derived `channel` from the target string, so
one conversation was keyed under two session namespaces
(`...:mattermost:group:<id>:thread` inbound vs a phantom `...:channel:<id>:thread`
on delivery). Threaded/scheduled deliveries bound to one then failed to match the
other (fail-closed delivery, or a conversation split across two session keys).

The Mattermost outbound path could not represent `group` at all:
resolveMattermostOutboundSessionRoute only produced direct/channel, and
resolveMattermostOpaqueTarget only classified user/channel.

- session-route: key a conversation as `group` from an authoritative signal — the
  resolved target kind, an explicit `group:` prefix, or the inbound
  currentSessionKey peer kind — so outbound shares the inbound `group:<id>`
  namespace instead of forking `channel:<id>`.
- target-resolution: classify a bare channel id by its real channel type
  (P/G -> group, O -> channel), cached per id.

The wire target stays `channel:<id>` (Mattermost posts to the channel id either
way; parseMattermostTarget only accepts channel:/user:) — the group distinction
lives in the session key. Adds unit coverage for both paths.

Resolves #95646.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(cron): route bound-session cron deliveries under the bound namespace

An isolated cron run executes under an ephemeral agentSessionKey that does not
carry the source conversation's namespace. resolveDirectCronDeliverySessionKey
resolved the outbound delivery route from that isolated key, so for a job bound
to a real conversation thread (e.g. the gitlab-pipeline-watch recheck bound to
agent:...:mattermost:group:<id>🧵<root>) the lossy channel:<id> target was
re-derived as `channel`, forking a phantom channel:<id> session and splitting the
private-channel thread across two namespaces (#95646).

Prefer the job's bound conversation identity as the currentSessionKey used to
resolve the route (new selectCronRouteCurrentSessionKey helper), so the existing
currentSessionKey-based namespace resolution keeps group:<id>. No channel-type
cache is introduced — which is what made the cache-based attempts brittle on cold
restart (a sibling PR documented exactly that failure mode). Falls back to the
isolated key for unbound jobs and cron-namespace bindings. Adds unit coverage.

Refs #95646.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(mattermost): key public channels as channel in directory listing

listMattermostDirectoryGroups labeled every joined channel — public `O`
and private `P` — as kind `group`. A name-resolved public channel could
then be keyed as `mattermost:group:<id>` on outbound routing, forking a
phantom group session and splitting the transcript from the inbound
`channel:<id>` one. Derive the kind from the authoritative Mattermost
channel type (`O` -> channel, `P`/`G` -> group) and add a regression
test. This closes the public-channel regression path flagged in review
for #95646 while keeping private channels keyed as `group`.

* fix(mattermost): harden private channel routing

* test: expose cron route selection through production module

* fix. scope cron session reuse to Mattermost delivery

* fix(cron): validate bound delivery peer and channel authority

* fix(cron): capture validated delivery destination peer

---------

Co-authored-by: leon <leon@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 02:43:21 -04:00
Peter Steinberger bf4122b0a7 fix(telegram): stop retrying blocked recipients (#115640)
Classify pinned Grammy blocked, kicked, and deactivated recipient 403 responses as permanently unreachable. Preserve retry behavior for recoverable permissions and flood control, inspect wrapped causes, and prove real SQLite ingress drain dead-lettering without duplicate dispatch.

Fixes #112893
2026-07-29 02:39:48 -04:00
Peter Steinberger f466ad0e71 fix(ollama): keep active streams within their idle timeout (#115648)
Retain the existing guarded-fetch timeout callback while consuming native Ollama NDJSON. Prove active slow HTTP streams remain alive and genuine stalls still expire.

Reconstructed from the independently reviewed contributor fix for #94251.

Co-authored-by: Henry <henrybrewer93@icloud.com>
2026-07-29 02:27:02 -04:00
Peter Steinberger ddd0b48673 refactor: remove 3,527 lines of runtime and test duplication (#115626)
* refactor: remove obsolete runtime and test duplication

* test: preserve typed cron and realtime fixtures
2026-07-29 02:21:20 -04:00