Commit Graph

1137 Commits

Author SHA1 Message Date
Vincent Koc 0758316883 feat(sms): track Twilio delivery status (#118665)
* feat(sms): track Twilio delivery status

* fix(sms): preserve Twilio delivery callbacks under inbound load

* fix(sms): correct delivery status contracts

* fix(sms): retry transient Twilio callback reads

* fix(sms): bound delivery callback admission

* docs(sms): clarify delivery callback recovery
2026-08-04 06:39:17 +08:00
Peter Steinberger 14fe739ee9 fix(feishu): enforce exact signed webhook request boundaries (#118758)
* fix(feishu): enforce exact signed webhook request targets

* fix(feishu): preserve explicitly configured signed webhook query targets

* fix(feishu): preserve shipped relative webhook paths

* fix(feishu): normalize and migrate legacy webhook callback paths

* fix(feishu): preserve transformed webhook schema defaults

* fix(feishu): require canonical webhook paths before runtime startup

* docs(feishu): document canonical webhook routes and doctor recovery
2026-08-03 14:52:58 -07:00
Vincent Koc 554a6f3bbf feat(sms): add Twilio MMS support (#118664)
* feat(sms): add Twilio MMS support

* fix(sms): harden hosted media bearer handling

* fix(sms): discard staged media before dispatch

* fix(sms): close staged media cleanup races

* fix(sms): finalize MMS metadata and race proof

* fix(media): bind local reads to authorized descriptors

* fix(sms): close MMS review gaps

* fix(media): make inbound root matching type-safe

* fix(media): route bounded reads through fs-safe facade

* test(media): satisfy async lint contracts
2026-08-04 05:46:37 +08:00
Peter Steinberger 76cc60a452 docs: correct onboarding risk flags and Google Chat credential shapes (#118936) 2026-08-03 13:59:29 -07:00
Pavan Kumar Gondhi f63f2fd3db fix(reef): restrict management commands to owners [AI] (#118578)
* fix(reef): require owner for management commands

* fix(reef): preserve general command access

* fix: preserve explicit owner authority

* fix(discord): separate voice admission from ownership

* docs(reef): explain owner command recovery

* docs(reef): clarify owner recovery paths
2026-08-03 23:18:05 +05:30
Vincent Koc f9baa3e894 fix(channels): generate discovery docs from catalog (#118106) 2026-08-03 23:42:55 +08:00
Peter Steinberger ec7e5dd769 fix(gateway): recover channel autostart after crash loops (#118311)
* fix(gateway): recover channel autostart after crash loops

* docs(gateway): clarify crash-loop recovery steps

* test(gateway): type crash-loop recovery context

* test(gateway): correct recovery mock context

* test(gateway): keep recovery monitor coverage compact

* chore: leave crash-loop note to release flow

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
2026-08-02 18:01:39 -07:00
Shakker c2d6ecee3c fix: align Buzz explicit mention semantics 2026-08-02 10:30:32 +01:00
Shakker 0ee44d551a feat: guide Buzz room targeting and mentions 2026-08-02 10:30:32 +01:00
Peter Steinberger b1f97bb7b3 refactor(discord): remove retired subagent progress runtime (#117802) 2026-08-01 21:36:28 -07:00
Vincent Koc 89aadef6ef feat(plugins): externalize iMessage channel (#117101) 2026-08-01 08:01:18 +08:00
Peter Steinberger eb0087dc7c fix(discord): connect mention-only bots without Message Content intent (#116962)
* fix(discord): support mention-only gateway intent

* chore: keep release changelog owner-only
2026-07-31 12:04:16 -07:00
Shakker 5cd00cfbaa fix: reserve Buzz relay subscription capacity (#116799) 2026-07-31 13:40:34 +01:00
Shakker b3c4ea0291 docs: explain Buzz archived room handling 2026-07-31 13:40:34 +01:00
Shakker 729d21336b docs: clarify Buzz directory reconnects 2026-07-31 13:40:33 +01:00
Shakker 6c7a96e588 fix: budget Buzz relay subscriptions 2026-07-31 13:40:32 +01:00
Shakker 3c78fe00f3 docs: document Buzz directory identities 2026-07-31 13:40:32 +01:00
Patrick Erichsen 61cf4b9246 test(buzz): add live QA Lab channel lane (#116298)
* feat(buzz): add live QA runner

* ci(qa): add gated Buzz live lane

* docs(qa): document Buzz live testing

* fix(buzz): keep QA relay type private

* test(buzz): type QA suite mock

* fix(buzz): preserve racing QA reply relations

* fix(qa): harden Buzz credential redaction

* fix(buzz): ignore retained QA relay events

* fix(buzz): clean up observer setup failures

* test(buzz): return complete racing messages

* fix(buzz): default QA credentials to file

* fix(qa): validate pooled Buzz secrets

* fix(qa): redact structured Buzz auth tags

* fix(buzz): preserve QA credential env override

* fix(qa): redact inspected Buzz auth tags

* test(buzz): limit live QA to supported scenarios

* ci(qa): run Buzz lane in release checks

* fix(qa): require secure remote Buzz relays

* fix(qa): satisfy Buzz QA validation gates

* fix(qa): inject credential leasing into transport adapters
2026-07-30 17:44:27 -07:00
Shakker 154e67b1e2 fix: recognize ClickClack handle mentions 2026-07-30 15:42:17 +01:00
Jacqueline Henriksen ba9e9fec13 fix: gate ClickClack group replies on mentions 2026-07-30 15:42:17 +01:00
Ayaan Zaidi dcb0ad5c29 fix(ci): satisfy docs formatting, lint, and the SDK API baseline
Three gates my own changes broke:

- docs/channels/telegram.md needed a blank line before </Note>; I formatted the
  TypeScript but never ran the docs formatter over the pages I edited.
- The mock harness matched a literal with a regex, which oxlint's prefer-includes
  rejects.
- Widening resolveChannelPreviewStreamMode's defaultMode to StreamingMode and
  adding rendersRollingLinesNatively changes the exported plugin-SDK surface, so
  the API baseline hash had to be regenerated.
2026-07-30 13:36:21 +09:00
Ayaan Zaidi 9f821d103f docs(telegram): call out the changed default preview on upgrade
ClawSweeper's accepted-migration path requires operator-facing docs for the
default change: state what an existing install sees after upgrading and the
one-line setting that restores streamed answer text.
2026-07-30 13:36:21 +09:00
Ayaan Zaidi 06aa81a73f fix(channels): show tool lines under the progress status headline
A status headline replaced the rolling tool lines instead of sitting above
them, so a default Discord draft showed one preamble sentence for an entire
tool-heavy turn. Operators reached for `/verbose` to see any activity, which
delivers durable per-tool-call messages and floods the channel.

- Render the headline above the lines; both stay visible in one message.
- Shorten the start gate from 5s to 1.5s. The gate only creates the draft
  when the timer fires and finalize cancels it, so quick answers still post
  no draft while a 3s tool turn stops being silent.
- Drop Discord's label-gated tool-progress default so
  resolveChannelStreamingPreviewToolProgress is the single owner. An explicit
  `toolProgress: false` still silences the lines.
- Resolve that toggle against a "progress" mode guess when `streaming.mode`
  is unset, so the progress-draft channels stop ignoring an explicit
  `progress.toolProgress` opt-out.

Telegram now defaults to `streaming.mode: "progress"` like Discord; set
`"partial"` to keep streamed answer text. Its renderer draws work lines from
the compositor's structured lines, so `rendersRollingLinesNatively` keeps
them out of the composed text rather than printing every line twice.
2026-07-30 13:36:21 +09:00
Shakker 7420682163 docs: clarify Buzz typing cadence (#116194) 2026-07-30 03:59:34 +01:00
Shakker 980fbf5f4e docs: document Buzz typing indicators 2026-07-30 03:59:34 +01:00
Shakker 9cdb4d09ca docs: document Buzz message fidelity 2026-07-29 23:07:22 +01:00
clawSean 864259486b fix(sms): isolate validated webhook quotas per sender (#104862)
* fix(sms): isolate validated webhook quotas per sender

* fix(sms): isolate validated webhook quotas per sender

---------

Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:23:24 +08:00
Eden 601a405430 fix(channels): mark durable webhook acceptance on Zalo, Google Chat, SMS, Feishu, Nextcloud Talk, and Synology Chat (#115586)
* fix(channels): extend the durable-acceptance marker to zalo, googlechat, and sms

* fix(feishu): mark durable webhook acceptance

* fix(channels): extend the durable-acceptance marker to nextcloud-talk and synology-chat

* fix(channels): extend the durable-acceptance marker to zalo, googlechat, and sms

* fix(feishu): mark durable webhook acceptance

* fix(channels): extend the durable-acceptance marker to nextcloud-talk and synology-chat

* fix(channels): carry durable webhook admission results

* docs(changelog): note durable webhook acceptance

* test(channels): tighten webhook admission types

* chore: leave release changelog to release prep

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:07:08 +08:00
Peter Steinberger cc2ba80639 docs: expand Telegram Mini App guide (#115981) 2026-07-29 12:39:54 -04: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
Peter Steinberger 94025985f7 fix(feishu): reject unsupported initial document content (#115697) 2026-07-29 04:53:11 -04: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
clawSean a47c6b0ace docs(slack): clarify group DM bot membership (#101944)
* docs(slack): clarify group DM bot membership

* docs(slack): qualify MPDM API errors

* docs(slack): clarify MPDM invite requirements

Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>

---------

Co-authored-by: clawSean <260045960+clawSean@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:27:09 -04: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
Dallin Romney 9feb6ad161 refactor(qa): make scenario selection taxonomy-owned (#114055)
* refactor(qa): remove scenario execution profiles

* fix(qa): preserve smoke CI membership

* test(qa): drop redundant smoke pack order check

* refactor(qa): remove Matrix runner profiles

* refactor(qa): simplify Matrix CI orchestration

* refactor(qa): derive execution sets from taxonomy

* fix(qa): keep Matrix shard helper private

* refactor(qa): derive profile scenarios from taxonomy

* refactor(qa): reconcile taxonomy selection

* refactor(qa): use canonical profile planning

* refactor(qa): select canonical coverage owners

* fix(qa): keep profile selector internal

* refactor(qa): remove representative coverage owners
2026-07-28 22:23:41 +08:00
Peter Steinberger 4233301c7c fix(slack): keep previews with custom outbound identity (#115114)
* fix(slack): preserve previews with custom identity

Co-authored-by: goutamadwant <workwithgoutam@gmail.com>

* test(models): isolate configured visibility policy

---------

Co-authored-by: goutamadwant <workwithgoutam@gmail.com>
2026-07-28 06:33:59 -04:00
Peter Steinberger 78d6c6c047 fix(slack): bound read-only Web API calls (#115018)
Co-authored-by: zw-xysk <zhao.wang1@xydigit.com>
2026-07-28 03:37:54 -04:00
joshavant 2987571782 fix(imessage): unblock text approval fallback 2026-07-28 01:23:35 -05:00
Omar Shahine 42aeccd149 feat(imessage): add native poll approval controls 2026-07-28 01:23:35 -05:00
Peter Steinberger 960b050add refactor(extensions): remove orphaned shadow trial and retired config aliases (#114709)
* refactor(memory-core): remove orphaned shadow trials

* refactor(qqbot): migrate direct voice upload formats

Release note: QQBot configs using voiceDirectUploadFormats now migrate through openclaw doctor --fix to audioFormatPolicy.uploadDirectFormats at root and account scope. Existing nested uploadDirectFormats values win conflicts, and runtime reads only the nested policy.

* refactor(feishu): migrate tools base alias

Release note: Feishu configs using tools.base now migrate through openclaw doctor --fix to tools.bitable at root and account scope. Existing bitable values win conflicts, and runtime accepts only the canonical key.

* refactor(extensions): remove dead runtime state

* chore(config): refresh bundled channel metadata

* refactor(codex): keep realtime fallback type private

* test(ci): align QA compatibility scenario count
2026-07-27 17:12:41 -04:00
Peter Steinberger 0e37f143f5 refactor(slack)!: retire inline interactive directives for typed presentation (#114738)
* refactor(slack): retire inline interactive directives

Release note: Slack configs using channels.slack.capabilities.interactiveReplies, including per-account settings, are removed by openclaw doctor --fix. Slack-only [[slack_buttons:...]] and [[slack_select:...]] markup is no longer parsed; emit typed presentation buttons and selects instead.

* docs: refresh Slack docs map
2026-07-27 16:41:00 -04:00
Pavan Kumar Gondhi 33f44caa5d fix: restrict QQBot quoted context [AI] (#114136)
* fix: restrict qqbot quoted context

* fix: narrow qqbot bot quote exemption

* test: use valid qqbot ingress reasons

* fix: honor narrowed qqbot open dm quotes

* fix: honor narrowed qqbot open group quotes

* test: use valid qqbot blocked ingress decisions

* fix: honor qqbot quote visibility mode

* docs: mention qqbot context visibility

* fix: validate qqbot context visibility config

* fix: hide denied qqbot quote sender

* test: avoid unbound qqbot access mock

* test: allow auth migration isolation to finish

* Revert "test: allow auth migration isolation to finish"

This reverts commit f2b9a4f5e9.
2026-07-27 12:23:21 +05:30
Jesse Merhi d7627d6f4c refactor(prompt): use plain inbound context labels and drop system-tag sanitizer (#112000)
* refactor(prompt): plain inbound context labels with a provenance marker

Replaces trust-worded inbound context labels ("(untrusted metadata)",
"(untrusted, for context)") with plain labels plus a fixed provenance
marker suffix appended to every OpenClaw-injected context header.

Detection keys on the marker, not label text, so strippers stay correct
across UI, TUI, replay, /trace segmentation, memory recall, and the Swift
chat preprocessor. Drops sanitizeInboundSystemTags in favor of the marker
boundary plus trusted system-prompt narration.

Renames the untrusted-named plugin SDK context identifiers to
channel-provenance names, keeping deprecated aliases registered for
removal after 2026-09-08.

Adds `openclaw doctor --fix` migrations that rewrite legacy inbound
labels in stored SQLite transcripts and purge legacy envelope-
contaminated LanceDB recall rows.

* fix(ci): resolve gate failures for plain inbound context labels

- doctor sqlite readers: open read-only connections via openNodeSqliteDatabase
  so the Kysely connection-boundary guardrail holds; unexport the now-internal
  transcript snapshot type (Knip unused-export gate).
- compat registry: split the record table into registry-records.ts and
  plugin-sdk-subpath-records.ts. The new compat record pushed registry.ts past
  the 700-line oxlint cap; suppressions are disallowed, so follow the existing
  sibling record-module pattern. Public exports and PluginCompatCode literals
  unchanged.
- acp-runtime test: assert current finalization behavior (newline normalization
  only). The bracket de-fang and System: rewrite it expected were removed with
  sanitizeInboundSystemTags; forged system lines are neutralized at the
  system-event queue, the single chokepoint feeding the System:-per-line render.
- regenerate docs_map and the plugin SDK API baseline manifest.

* fix(prompt): harden inbound context label migration and drop in-band sanitizer

Review follow-ups on the plain-label + provenance-marker change:

- Remove src/security/system-tags.ts. Rewriting inbound text to neutralize
  look-alike `System:`/`[System]` markers corrupted legitimate user text and is
  not a real injection boundary; role separation plus external-content wrapping
  is. Explicit product decision, recorded at the system-event queue.
- Narrow the LanceDB legacy-row purge so it cannot delete benign memories. It
  now requires a complete known legacy sentinel line, a legacy label followed by
  a fenced JSON body, or the complete legacy external-content header. The prior
  predicates matched ordinary prose such as `Notes (untrusted metadata):`, and
  deletion is irreversible.
- Make explicit-empty canonical ChannelStructuredContext win over the deprecated
  alias via a present/absent result instead of collapsing `[]` to undefined.
- Keep `\r?` in the active-memory doctor rule. It is the only rule spanning the
  header's line break, migrated assistant rows skip newline normalization, and
  without it the marked-header replace wins and the body strips to empty. Added
  a CRLF regression test.
- Fix stale comments that described removed behavior, and cover the Swift
  prose-block strip path.

Claude-Session: https://claude.ai/code/session_01WNzsPddQmxy9Y7jKD4wAxH
2026-07-27 11:27:53 +10:00
Peter Steinberger cca5b14785 feat(ui): path-based session and dashboard URLs (#113883)
* feat(ui): path-based session and dashboard URLs

* docs(ui): document control UI URLs

* fix(ui): finalize session path routing

* feat(ui): anchor session URLs on stable keys

* docs(ui): clarify stable session URL identity

* fix(ui): resolve session prefixes with full prefix and pagination

Query sessions.list with the full supplied prefix instead of an eight-char
truncation, and paginate up to a bounded page count so longer disambiguation
links resolve instead of being reported ambiguous. Zero strict-prefix matches
now fall through to literal-key resolution rather than rendering an empty
ambiguity view.

Also document the ~dot/~dotdot segment escape: peer ids reach session keys
trimmed and lowercased only (src/routing/session-key.ts), so a literal '.' or
'..' segment is reachable and browsers would normalize it away.

* fix(ui): synchronize committed session routes

* test(ui): split native shell host coverage

* fix(ui): thread configured mainKey through session URL builders

Reserved-set disambiguation needs the operator-configured mainKey at runtime, so
thread it from agentsList through every session path builder and the ClickClack
control URL. Unambiguous non-hex single-segment rests now resolve literally while
short-id-shaped rests still fail closed, which restores ClickClack channel
compatibility detection and control-link reconciliation.

Also bound prefix-resolution retries, preserve catalog thread identity, and keep
draft state on ambiguous candidate links.

* fix(ui): repair session URL CI integration

* perf(ui): lazy-load session route resolution

* perf(ui): isolate session prefix resolution

* perf(ui): defer session path parsing

* perf(ui): defer session navigation startup

* fix(ui): preserve first-run and literal session navigation

* fix(ui): satisfy session routing type and export gates

* fix(clickclack): preserve unscoped control link agent

* style(ui): satisfy chat page line limit

* refactor(ui): move chat page helpers to owning modules

* fix(ui): preserve destination session route identity

* fix(ui): preserve agent identity in session routes

* fix(ui): escape dots in literal session path segments

encodeURIComponent leaves periods intact, so a literal key segment like
channel:release.js produced /chat/main/channel/release.js. In-app navigation is
intercepted by the SPA, but a refresh, an external link, or a ClickClack link
would be served as a static asset request and never reach the app.

pathForWorkboardBoard already escapes dots for this reason; mirror it in both the
session URL contract and the ClickClack encoder, route the agent id through the
same segment encoder, and pin the case in both shared vector tables.

* fix(ui): stop bootstrap after teardown race

* refactor(ui): centralize session navigation targets

* fix(ui): consume bootstrap teardown abort

* fix(ui): canonicalize configured main session routes

* fix(ui): preserve distinct session references

* fix(ui): redirect released session query links

* fix(ui): make bootstrap teardown abort-safe
2026-07-26 12:46:04 -04:00
Shakker 04cafe601b fix: make Buzz rooms usable by default (#113419) 2026-07-26 14:09:23 +01:00
Shakker ffb00ca624 fix: register Buzz agent identities 2026-07-26 14:09:23 +01:00
Shakker 3e858a2a6f fix: streamline Buzz guided setup 2026-07-26 14:09:23 +01:00
Shakker 2478134fa6 fix: publish Buzz bot presence 2026-07-26 14:09:23 +01:00
Shakker 08eac200b3 fix: publish Buzz bot profile names 2026-07-26 14:09:23 +01:00
Shakker 0e0698b6bc fix: correct Buzz room authorization guidance 2026-07-26 14:09:23 +01:00