Skip to content

feat(matrix): handle voice preflight and threads#90415

Merged
steipete merged 7 commits into
mainfrom
matrix
Jun 5, 2026
Merged

feat(matrix): handle voice preflight and threads#90415
steipete merged 7 commits into
mainfrom
matrix

Conversation

@steipete

@steipete steipete commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds Matrix inbound audio preflight so voice notes can be transcribed before the mention gate, echoed after acceptance, and marked as already transcribed for downstream tools.
  • Fixes Matrix thread reads/replies so room reads exclude thread traffic, thread reads use Matrix relations pagination, and outbound thread replies preserve Matrix fallback metadata.
  • Adds Matrix QA scenario wiring for voice preflight coverage and documents the Matrix voice-message behavior.

Fixes #78016.
Supersedes #78069 and #71738 with maintainer-owned fixes and real Matrix QA proof.

Verification

  • node scripts/run-vitest.mjs extensions/matrix/src/matrix/actions/messages.test.ts
  • node scripts/run-vitest.mjs extensions/matrix
  • node scripts/run-vitest.mjs extensions/qa-matrix/src/substrate/config.test.ts extensions/qa-matrix/src/runners/contract/scenarios.test.ts extensions/matrix/src/matrix/monitor/handler.audio-preflight.test.ts - 107 tests passed
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test.tsbuildinfo - passed
  • oxfmt --check extensions/qa-matrix/src/substrate/config.ts extensions/qa-matrix/src/substrate/config.test.ts extensions/qa-matrix/src/runners/contract/scenario-catalog.ts extensions/qa-matrix/src/runners/contract/scenarios.test.ts - passed
  • git diff --check - passed
  • .agents/skills/autoreview/scripts/autoreview --mode local - clean
  • AWS Crabbox real Matrix server QA: provider aws, lease cbx_afd9f0439dab, run run_8f0cdf1afdb8, matrix-thread-follow-up, matrix-thread-root-preservation, matrix-thread-nested-reply-shape, matrix-thread-isolation, matrix-room-thread-reply-override, matrix-dm-thread-reply-override, suite 9/9
  • AWS Crabbox live OpenAI voice-STT Matrix QA: provider aws, lease cbx_21488e75b770, run run_f9edb5fe2a5f, matrix-voice-preflight-mention, provider mode live-frontier, suite 4/4

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: matrix Channel integration: matrix size: XL maintainer Maintainer-authored PR labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 4, 2026, 2:24 PM ET / 18:24 UTC.

Summary
The PR adds Matrix inbound voice-note preflight transcription, thread-scoped Matrix reads/history/replies, QA scenario coverage, docs, and small deprecation annotations.

PR surface: Source +1009, Tests +1561, Docs +14. Total +2584 across 32 files.

Reproducibility: not applicable. as a PR patch rather than a standalone bug report. The PR body provides focused unit/typing proof plus real Matrix QA run IDs for thread scenarios and live voice-STT behavior.

Review metrics: 1 noteworthy metric.

  • Matrix Read Action Parameter: 1 added (threadId). The PR extends the model-facing Matrix read action surface, so maintainers should verify docs, tool behavior, and upgrade expectations before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Refresh/rebase the branch so GitHub reports a clean current-main merge result.
  • Rerun the focused Matrix tests and Matrix voice/thread Crabbox QA after refresh.

Risk before merge

  • [P1] The live PR context reports a dirty merge state, and local git could not compute a current-main merge result for the PR head; maintainers need a refreshed branch and exact merge-result review before relying on the final patch.
  • [P1] Allowed Matrix audio, including decrypted E2EE attachments after Matrix access checks, is sent to the configured STT provider before the textual mention gate; that is a privacy, billing, and operator-policy boundary that needs explicit maintainer acceptance.
  • [P2] Thread-scoped reads/history and explicit-only fallback metadata intentionally change existing Matrix room timeline, message-tool read, and unthreaded-client visibility behavior, so upgrade behavior remains compatibility-sensitive even with good focused tests.

Maintainer options:

  1. Refresh And Revalidate (recommended)
    Rebase or otherwise refresh the PR onto current main, inspect the exact merge result, and rerun focused Matrix tests plus the Matrix voice/thread QA lanes before merge.
  2. Accept The Boundary Changes
    Maintainership can intentionally accept that allowed Matrix audio is transcribed before mention gating and that thread reads/replies become thread-scoped with reduced fallback visibility.
  3. Pause Or Split The PR
    If the privacy and thread-compatibility choices need separate ownership decisions, pause this PR and split voice preflight from thread isolation before landing.

Next step before merge

  • [P2] Protected maintainer-labeled PR with dirty merge state and explicit privacy/compatibility choices; the next action is human refresh, risk acceptance, and post-refresh validation rather than an automated repair.

Security
Needs attention: The diff intentionally expands the Matrix privacy boundary by sending allowed voice media to the configured STT provider before textual mention gating.

Review details

Best possible solution:

Refresh the branch onto current main, inspect the exact merge result, rerun the focused Matrix tests plus Matrix voice/thread Crabbox QA, then merge only if maintainers accept the pre-mention STT and thread timeline compatibility changes.

Do we have a high-confidence way to reproduce the issue?

Not applicable as a PR patch rather than a standalone bug report. The PR body provides focused unit/typing proof plus real Matrix QA run IDs for thread scenarios and live voice-STT behavior.

Is this the best way to solve the issue?

The implementation appears to be in the right owner boundary: Matrix plugin code reuses the shared media preflight helper and matrix-js-sdk relation APIs. It is not ready to call merge-safe until the dirty branch is refreshed and maintainers accept the privacy and compatibility changes.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 17fc1c430fed.

Label changes

Label justifications:

  • P2: This is a normal-priority Matrix channel feature/fix with meaningful user impact but limited blast radius to one bundled plugin and QA harness.
  • merge-risk: 🚨 compatibility: Thread-scoped reads/history and changed fallback metadata can change existing Matrix room timeline and tool-read behavior for upgraded users.
  • merge-risk: 🚨 message-delivery: The PR changes how Matrix thread replies preserve fallback reply metadata, which can affect where clients display or suppress messages.
  • merge-risk: 🚨 security-boundary: The PR sends allowed Matrix audio bytes, including decrypted E2EE media, to the configured STT provider before textual mention gating.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (logs): The PR body includes after-fix real Matrix proof with AWS Crabbox run IDs for real Matrix server thread QA and live OpenAI voice-STT Matrix QA.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix real Matrix proof with AWS Crabbox run IDs for real Matrix server thread QA and live OpenAI voice-STT Matrix QA.
Evidence reviewed

PR surface:

Source +1009, Tests +1561, Docs +14. Total +2584 across 32 files.

View PR surface stats
Area Files Added Removed Net
Source 21 1123 114 +1009
Tests 10 1573 12 +1561
Docs 1 14 0 +14
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 32 2710 126 +2584

Security concerns:

  • [medium] Accept pre-mention STT for Matrix audio — extensions/matrix/src/matrix/monitor/handler.ts:1116
    After Matrix access checks, the handler downloads Matrix audio and calls resolveMatrixPreflightAudioTranscript before mention resolution, so allowed but unmentioned voice notes can still send plaintext audio to the configured STT provider.
    Confidence: 0.88

What I checked:

Likely related people:

  • steipete: Current-main blame for the central Matrix handler/actions/send/docs files points to Peter Steinberger, and the PR branch also comes from this account. (role: recent area contributor; confidence: high; commits: d3cabb0fc6bb, eeb1ce96090c; files: extensions/matrix/src/matrix/monitor/handler.ts, extensions/matrix/src/matrix/actions/messages.ts, extensions/matrix/src/matrix/send/formatting.ts)
  • gumadeiras: Gustavo Madeira Santana appears repeatedly in Matrix monitor/runtime history, including E2EE hooks, room auth, streaming, and monitor seam changes adjacent to this PR's behavior. (role: recent Matrix area contributor; confidence: high; commits: 0f7c40e50885, 2bfd808a8311, 8a841b531fd2; files: extensions/matrix/src/matrix/monitor/handler.ts, extensions/matrix/src/matrix/monitor/threads.ts, extensions/matrix/src/matrix/send.ts)
  • vincentkoc: Vincent Koc has recent release, Matrix retry, CI guardrail, and SDK baseline work touching the Matrix plugin/runtime boundary. (role: adjacent owner; confidence: medium; commits: 2e08f0f4221f, 6c4cfa585fb9, 25a3d3797075; files: extensions/matrix/src/matrix/monitor/handler.ts, extensions/matrix/src/matrix/actions/messages.ts, extensions/matrix/src/matrix/sdk.ts)
  • teconomix: History shows Teconomix introduced Matrix thread-isolated sessions and per-chat-type threadReplies, which this PR extends into history/read/reply behavior. (role: threading feature contributor; confidence: medium; commits: 697dddbeb61d; files: extensions/matrix/src/matrix/monitor/threads.ts, extensions/matrix/src/session-route.ts, docs/channels/matrix.md)
  • chain710: History shows chain710 added Matrix group chat history context for agent triggers, the queue that this PR changes to be thread-scoped. (role: adjacent history feature contributor; confidence: medium; commits: 943163a419df; files: extensions/matrix/src/matrix/monitor/room-history.ts, extensions/matrix/src/matrix/monitor/handler.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f809e2945c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 604 to 609
const threadId = normalizeThreadId(opts.threadId);
if (threadId) {
// Thread-aware replace: Synapse needs the thread context to keep the
// edited event visible in the thread timeline.
replaceRelation["m.in_reply_to"] = { event_id: threadId };
// Matrix keeps edit events threaded through m.new_content, not the
// outer replace relation. The outer relation must stay a pure replace.
newContent["m.relates_to"] = buildThreadRelation(threadId);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't rely on m.new_content for thread relations

When editMessageMatrix is called with a threadId for an original event that does not already have the thread relation, this does not make the replacement threaded: the Matrix spec's Applying m.new_content section says the original event's m.relates_to is preserved and any m.relates_to inside m.new_content is ignored. Since the outer relation here remains only m.replace, callers/tests that expect this branch to keep or add thread context will silently get an unthreaded edit unless the original event was already threaded.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in a46be7e262.

extensions/matrix/src/matrix/send.ts now keeps edit events as pure m.replace and rejects attempts to add or move thread membership. extensions/matrix/src/matrix/sdk/event-helpers.ts preserves original/wire m.relates_to when matrix-js-sdk exposes edited current content without the relation, so threaded edited events still stay out of flat reads and keep relatesTo summaries.

Verification after the fix:

  • node scripts/run-vitest.mjs extensions/matrix/src/matrix/sdk/event-helpers.test.ts extensions/matrix/src/matrix/send.test.ts extensions/matrix/src/matrix/actions/messages.test.ts
  • node scripts/run-vitest.mjs extensions/matrix
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test.tsbuildinfo
  • node scripts/run-bundled-extension-oxlint.mjs
  • .agents/skills/autoreview/scripts/autoreview --mode local clean

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a46be7e262

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +220 to +224
if (
!rootEvent ||
rootEvent.unsigned?.redacted_because ||
rootEvent.type !== EventType.RoomMessage
) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include poll thread roots in threaded reads

When the Matrix thread root is a poll event, this early rootEvent.type !== EventType.RoomMessage return drops the starter entirely. The rest of readMatrixMessages already summarizes poll events via fetchMatrixPollMessageSummary, but relation pages never contain the root itself, so readMessages({ threadId }) for a thread started from a poll begins with replies and loses the poll question/options (and the root no longer counts toward the first-page limit). Try resolving a poll summary for the fetched root before rejecting non-m.room.message events.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 3f8dc24bc7.

extensions/matrix/src/matrix/actions/messages.ts now summarizes thread roots that are actual Matrix poll start events through the poll summary path, seeds poll dedupe with the displayed root event id, and leaves non-start poll relation events out of root summaries. extensions/matrix/src/matrix/actions/messages.test.ts covers both poll-start thread roots and poll-response thread roots.

Verification:

  • node scripts/run-vitest.mjs extensions/matrix/src/matrix/actions/messages.test.ts extensions/matrix/src/matrix/sdk/event-helpers.test.ts extensions/matrix/src/matrix/send.test.ts - 63 tests passed
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test.tsbuildinfo - passed
  • oxfmt --check extensions/matrix/src/matrix/actions/messages.ts extensions/matrix/src/matrix/actions/messages.test.ts && git diff --check - passed
  • .agents/skills/autoreview/scripts/autoreview --mode local - clean
  • AWS Matrix QA run_ca858a3f1be2 (provider=aws, lease=cbx_afd9f0439dab) - 12/12 passed

@openclaw-barnacle openclaw-barnacle Bot added commands Command implementations plugin: bonjour Plugin integration: bonjour labels Jun 4, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 4, 2026
@steipete steipete self-assigned this Jun 5, 2026
@steipete

steipete commented Jun 5, 2026

Copy link
Copy Markdown
Contributor Author

Land-ready after rebase onto origin/main at e4de53a460.

Rebase fixes:

  • Resolved extensions/matrix/src/matrix/actions/messages.ts header/import conflict by keeping the Matrix thread relations Direction import.
  • Resolved compatibility-alias comment conflicts in extensions/bonjour/src/ciao.ts and src/commands/migrate/skill-selection-prompt.ts by keeping the deprecated alias annotations.

Local verification after rebase:

  • node scripts/run-vitest.mjs extensions/matrix/src/matrix/actions/messages.test.ts extensions/matrix/src/matrix/sdk/event-helpers.test.ts extensions/matrix/src/matrix/send.test.ts extensions/qa-matrix/src/substrate/config.test.ts extensions/qa-matrix/src/runners/contract/scenarios.test.ts extensions/matrix/src/matrix/monitor/handler.audio-preflight.test.ts - 170 tests passed
  • node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.extensions.test.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/extensions-test.tsbuildinfo - passed
  • oxfmt --check extensions/matrix/src/matrix/actions/messages.ts extensions/bonjour/src/ciao.ts src/commands/migrate/skill-selection-prompt.ts extensions/qa-matrix/src/substrate/config.ts extensions/qa-matrix/src/substrate/config.test.ts extensions/qa-matrix/src/runners/contract/scenario-catalog.ts extensions/qa-matrix/src/runners/contract/scenarios.test.ts - passed
  • git diff --check - passed

Remote/live proof already recorded in the PR body:

  • AWS Crabbox Matrix QA run_8f0cdf1afdb8, provider aws, lease cbx_afd9f0439dab, suite 9/9
  • AWS Crabbox live OpenAI voice-STT Matrix QA run_f9edb5fe2a5f, provider aws, lease cbx_21488e75b770, matrix-voice-preflight-mention, suite 4/4

CI at head 26e0faee20c2889ef1f40ec6a1b98b68da6e22a2: clean, no pending or failing checks.

  • CI 27024749934
  • CodeQL 27024749782
  • CodeQL Critical Quality 27024749808
  • OpenGrep PR Diff 27024749771
  • Workflow Sanity 27024749881
  • Dependency Guard 27024748556
  • Real behavior proof 27024748557

Known proof gaps: none for the touched Matrix behavior; post-rebase proof reused the previously recorded live Matrix/voice-STT runs plus fresh local and CI proof.

@steipete steipete merged commit 2514980 into main Jun 5, 2026
159 checks passed
@steipete steipete deleted the matrix branch June 5, 2026 15:49

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 26e0faee20

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1069 to +1079
const reserved = roomHistoryTracker.reservePending(
_route.agentId,
roomId,
{
sender: senderId,
body: pendingHistoryText,
timestamp: eventTs ?? undefined,
messageId,
},
historyThreadId,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Discard deferred audio history slots on errors

When room audio preflight is deferred, this reserves a history slot and then runs the rest of continueIngress outside the room gate; if any later step throws before prepareReservedTrigger/finalizePending/discardPending runs (for example mention/config/runtime setup after transcription), the outer catch only logs and releases the inbound claim, leaving this slot permanently reserved. consumeHistory treats earlier reserved entries as gaps, so subsequent successful triggers for the same room/thread cannot advance past the stuck slot and later room history is filtered out; the deferred continuation needs a catch/finally that discards the reserved slot when it exits via an unexpected error before consumption.

Useful? React with 👍 / 👎.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 6, 2026
* feat(matrix): handle voice preflight and threads

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>

* test(matrix): satisfy ci guards

* fix(matrix): preserve thread relations on edits

* chore: annotate deprecated compatibility aliases

* fix(matrix): include poll thread roots in reads

* test(matrix): enable audio preflight qa config

* test(matrix): make voice preflight QA mention deterministic

---------

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>
849261680 pushed a commit to 849261680/openclaw that referenced this pull request Jun 7, 2026
* feat(matrix): handle voice preflight and threads

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>

* test(matrix): satisfy ci guards

* fix(matrix): preserve thread relations on edits

* chore: annotate deprecated compatibility aliases

* fix(matrix): include poll thread roots in reads

* test(matrix): enable audio preflight qa config

* test(matrix): make voice preflight QA mention deterministic

---------

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 9, 2026
* feat(matrix): handle voice preflight and threads

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>

* test(matrix): satisfy ci guards

* fix(matrix): preserve thread relations on edits

* chore: annotate deprecated compatibility aliases

* fix(matrix): include poll thread roots in reads

* test(matrix): enable audio preflight qa config

* test(matrix): make voice preflight QA mention deterministic

---------

Co-authored-by: Frank Dierolf <frank_dierolf@web.de>
Co-authored-by: marc.wilson <marcwilson@gazasrv15i5.globaladvisors.biz>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 9, 2026
…26.6.5) (#963)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.1` → `2026.6.5` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.5`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202665)

[Compare Source](openclaw/openclaw@v2026.6.1...v2026.6.5)

##### Highlights

- QQBot now strips model reasoning/thinking scaffolding before native delivery, preventing raw `<thinking>` content from leaking into channel replies. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- MCP tool results now coerce `resource_link`, `resource`, `audio`, malformed image, and future non-text/image blocks at the materialize boundary, preventing Anthropic 400s and poisoned session history after a tool returns richer MCP content. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic extended-thinking sessions recover after prompt-cache expiry or Gateway restart because stream start events wait for `message_start`, letting pre-generation signature errors trigger the existing recovery retry. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Parallel is now a bundled `web_search` provider with `PARALLEL_API_KEY` discovery, guarded endpoint handling, cache-safe session ids, onboarding picker support, and docs. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Google Vertex ADC users get static catalog rows and runtime model resolution again, while single-provider cooldown recovery and memory adapter status checks are more reliable. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90816](openclaw/openclaw#90816)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Matrix can preflight voice notes before mention gating, preserve thread reads/replies through Matrix relations pagination, and carry QA coverage for voice and thread flows. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Auth and plugin install state is more durable: auth profiles now live in SQLite, official npm plugin install records keep their trusted pins, and prerelease fallback integrity checks avoid carrying stale integrity forward. ([#&#8203;89102](openclaw/openclaw#89102), [#&#8203;88585](openclaw/openclaw#88585))
- macOS node mode no longer silently self-reconnects away from a healthy direct Gateway session, reducing unexpected companion app session churn. ([#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;vrurg](https://github.com/vrurg).
- Upgrade and service paths are safer: cron legacy JSON stores migrate during doctor preflight, service env placeholders no longer mask state-dir secrets, WhatsApp startup waits are bounded, and disabled WhatsApp accounts tear down on config reload. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT), [@&#8203;sallyom](https://github.com/sallyom), [@&#8203;mcaxtr](https://github.com/mcaxtr), and [@&#8203;MukundaKatta](https://github.com/MukundaKatta).

##### Changes

- Search/providers: add the Parallel bundled web-search plugin, live provider tests, registration contracts, onboarding/docs wiring, and guarded `api.parallel.ai/v1/search` support. ([#&#8203;85158](openclaw/openclaw#85158)) Thanks [@&#8203;NormallyGaussian](https://github.com/NormallyGaussian).
- Matrix/channels: add voice-message preflight and thread-aware read/reply behavior, including Matrix QA scenario wiring and docs for voice-message behavior. ([#&#8203;78016](openclaw/openclaw#78016), [#&#8203;90415](openclaw/openclaw#90415))
- Skills/ClawHub: install ClawHub skills backed by GitHub repositories through the resolved install API, download the pinned GitHub commit, keep install-policy checks, and report install telemetry after success. ([#&#8203;90478](openclaw/openclaw#90478)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- Google Chat/channels: add native approval card actions and click handling so Google Chat approvals use platform-native cards instead of generic message flow.
- Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, while iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, and unavailable Talk controls reachable.
- Memory: QMD search can use the new rerank toggle, and memory adapter status uses the resolved default model identity when checking plain status. ([#&#8203;61834](openclaw/openclaw#61834))
- Docs/tooling: add Parallel search docs, refresh weather-skill guidance toward `web_fetch`, clarify legacy `openai-codex` auth, document release/test helper scripts, and tighten changed-test routing docs for CI/debugging work. ([#&#8203;90028](openclaw/openclaw#90028), [#&#8203;90250](openclaw/openclaw#90250)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Release/process: switch release trains to `YYYY.M.PATCH` monthly patch numbering, keep pre-transition tags compatible, and pin the June 2026 floor at `2026.6.5` after the published beta.
- Platform maintenance: refresh Android, Swift/macOS, Docker, CodeQL, Buildx, Docker build/push, and Codex Action dependencies for this release train. ([#&#8203;74980](openclaw/openclaw#74980), [#&#8203;81757](openclaw/openclaw#81757), [#&#8203;86481](openclaw/openclaw#86481), [#&#8203;86483](openclaw/openclaw#86483), [#&#8203;90601](openclaw/openclaw#90601))
- QQBot: add `/bot-group-allways on|off` slash command (with named-account and default-account support) to toggle whether group messages require an `@mention` before the bot replies, and clear the runtime config snapshot after the write so the new account-level `defaultRequireMention` takes effect immediately without restart. ([#&#8203;91423](openclaw/openclaw#91423)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh).

##### Fixes

- Channel content boundaries: QQBot now strips reasoning/thinking tags before sending, preserving final answers while hiding internal model narration from users. ([#&#8203;89913](openclaw/openclaw#89913), [#&#8203;90132](openclaw/openclaw#90132)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Agents/MCP/providers: coerce non-text/image MCP tool-result blocks before they reach provider converters, preserving valid images and turning richer MCP content into text instead of malformed image blocks. ([#&#8203;90710](openclaw/openclaw#90710), [#&#8203;90728](openclaw/openclaw#90728)) Thanks [@&#8203;RanSHammer](https://github.com/RanSHammer) and [@&#8203;849261680](https://github.com/849261680).
- Anthropic/Codex/ACP/agent recovery: defer Anthropic stream start events until `message_start`, strip stale compaction thinking signatures before Anthropic replay, detect unsigned thinking-only stalls, refresh prompt fences after compaction writes, reject empty completion handoffs, preserve parent streaming-off overrides/shared progress commentary, forward heartbeat metadata to context-engine hooks, and cover Codex session/thread migration edge cases. ([#&#8203;90667](openclaw/openclaw#90667), [#&#8203;90697](openclaw/openclaw#90697), [#&#8203;90163](openclaw/openclaw#90163), [#&#8203;90108](openclaw/openclaw#90108), [#&#8203;89874](openclaw/openclaw#89874), [#&#8203;89505](openclaw/openclaw#89505), [#&#8203;90632](openclaw/openclaw#90632), [#&#8203;89302](openclaw/openclaw#89302), [#&#8203;90729](openclaw/openclaw#90729), [#&#8203;90317](openclaw/openclaw#90317), [#&#8203;90319](openclaw/openclaw#90319)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;100yenadmin](https://github.com/100yenadmin), and [@&#8203;ooiuuii](https://github.com/ooiuuii).
- Provider/model resolution: preserve Google Vertex ADC auth markers in generated catalogs, re-probe a single-provider primary after cooldown, share Codex model visibility, fail closed for unknown model auth, preserve Codex alias availability, keep unresolved profile refs unknown, and avoid resolving auth while listing models. ([#&#8203;90506](openclaw/openclaw#90506), [#&#8203;90609](openclaw/openclaw#90609), [#&#8203;90717](openclaw/openclaw#90717), [#&#8203;90702](openclaw/openclaw#90702)) Thanks [@&#8203;849261680](https://github.com/849261680).
- Gateway/macOS/mobile: avoid duplicate Gateway probe warnings by identity, rate-limit node pairing requests while preserving paired-node reconnects, keep macOS node mode on a healthy direct Gateway session, keep iOS diagnostics and gateway rows reachable, and avoid Linux ARM Gradle resource tasks during Android builds. ([#&#8203;85791](openclaw/openclaw#85791), [#&#8203;90147](openclaw/openclaw#90147), [#&#8203;90668](openclaw/openclaw#90668), [#&#8203;90815](openclaw/openclaw#90815)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo) and [@&#8203;vrurg](https://github.com/vrurg).
- TUI/chat/Workboard/auto-reply: optimistic user messages stay stable across stale history reloads, runId reassignment, and abort windows instead of disappearing, jumping, or lingering as ghost rows; Workboard stale lifecycle bulk updates no longer overwrite newer status/provenance; message-tool sends now count as delivery. ([#&#8203;86205](openclaw/openclaw#86205), [#&#8203;89600](openclaw/openclaw#89600), [#&#8203;88592](openclaw/openclaw#88592), [#&#8203;90123](openclaw/openclaw#90123)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. ([#&#8203;90072](openclaw/openclaw#90072), [#&#8203;90208](openclaw/openclaw#90208), [#&#8203;90277](openclaw/openclaw#90277), [#&#8203;90488](openclaw/openclaw#90488)) Thanks [@&#8203;MonkeyLeeT](https://github.com/MonkeyLeeT) and [@&#8203;sallyom](https://github.com/sallyom).
- Security/config/tooling: guard MCP HTTP redirects, protect global agent config defaults, and keep release/test/tooling proof failures bounded and explicit. ([#&#8203;89732](openclaw/openclaw#89732), [#&#8203;90145](openclaw/openclaw#90145))
- Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`. ([#&#8203;87951](openclaw/openclaw#87951), [#&#8203;87965](openclaw/openclaw#87965), [#&#8203;90486](openclaw/openclaw#90486), [#&#8203;68113](openclaw/openclaw#68113), [#&#8203;90534](openclaw/openclaw#90534), [#&#8203;90181](openclaw/openclaw#90181), [#&#8203;90607](openclaw/openclaw#90607), [#&#8203;89500](openclaw/openclaw#89500)) Thanks [@&#8203;MukundaKatta](https://github.com/MukundaKatta), [@&#8203;mcaxtr](https://github.com/mcaxtr), [@&#8203;infoanton](https://github.com/infoanton), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), and [@&#8203;sahibzada-allahyar](https://github.com/sahibzada-allahyar).
- Feishu: retry transient send rate-limit errors (HTTP 429, per-chat code 230020, tenant-level code 11232) with linear backoff, including SDK responses that fulfill with rate-limit bodies instead of throwing, and route streaming-card sends through the retry wrapper. ([#&#8203;89659](openclaw/openclaw#89659)) Thanks [@&#8203;ladygege](https://github.com/ladygege).
- Release/CI/E2E: main CI guard drift, PR merge diff scoping, live Docker credential staging, base-image qualification, installer Docker classification, Playwright dependency install recovery, API-key auth for Codex live Docker lanes, Parallels option terminators, and JSON-mode progress handling are tighter so release proof fails cleaner. ([#&#8203;90532](openclaw/openclaw#90532), [#&#8203;90287](openclaw/openclaw#90287), [#&#8203;90058](openclaw/openclaw#90058)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;hxy91819](https://github.com/hxy91819), and [@&#8203;mrunalp](https://github.com/mrunalp).
- Release/CI/E2E: Docker E2E and live Docker harness runs now apply default memory, CPU, and process ceilings while preserving explicit per-lane overrides.
- Release/CI/E2E: plugin lifecycle matrix resource sampling now fails phases that exceed RSS, wall-clock, or CPU ceilings instead of only logging the measurements.
- Release/CI/E2E: Codex npm plugin live assertions now cap transcript discovery and diagnostic log reads so failure proof stays bounded.
- Tests/state isolation: QA Lab valid-tool-call metrics now require runtime tool-call evidence when runtime parity data is available instead of counting tool-backed scenario pass status alone.
- Tests/state isolation: QA Lab runtime parity now fails planned-only tool-call rows without matching tool results instead of treating matching mock plans as real tool evidence.
- Tests/state isolation: provider, media, auth, cron, task, session, sandbox, Gateway, and Codex timeout fixtures now scope more home/state/env data per test, reducing cross-test leakage and making release validation failures less noisy. ([#&#8203;90027](openclaw/openclaw#90027), [#&#8203;89974](openclaw/openclaw#89974))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/963
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: matrix Channel integration: matrix commands Command implementations docs Improvements or additions to documentation maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. plugin: bonjour Plugin integration: bonjour proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Voice messages to agent don't work on Matrix

1 participant