Commit Graph

16724 Commits

Author SHA1 Message Date
Peter Steinberger
d4ed08994d fix(onboard): validate reset preflight (#111348) 2026-07-19 02:42:49 -07:00
xingzhou
e2ca148d4b fix(codex): preserve JSONL framing across WebSocket writes (#110384)
* fix(codex): preserve UTF-8 websocket frames

* test(codex): satisfy websocket transport lint

* fix(codex): preserve websocket JSONL framing
2026-07-19 17:07:03 +08:00
xingzhou
48ecb31bc6 fix(discord): time out stalled Activity token bodies (#110667) 2026-07-19 17:05:58 +08:00
Peter Steinberger
e20d4cd450 fix(media): gate inbound audio on structured media facts (#111315)
hasInboundAudio previously accepted <media:audio> placeholder bodies,
[Audio transcript headers, and filename sniffing alongside MediaTypes.
It now consumes only the structured facts channels already carry
(MediaType/MediaTypes, kind audio or audio/*), removing the string
reverse-engineering ahead of the placeholder-elimination program.
Discord — the one channel with a coverage hole — now carries its native
audio classification (MIME, voice fields, constrained filename fallback)
as structured kind: "audio", with definitive fetched/declared MIME
precedence so generic container types cannot erase declared audio and
filename hints cannot override definitive non-audio MIME.
2026-07-19 01:55:26 -07:00
Peter Steinberger
96c9cc112c fix(cron): preserve script state and stop stale runs after restart (#111292)
* fix(cron): preserve script execution boundaries

* chore: keep release changelog unchanged
2026-07-19 01:24:19 -07:00
xingzhou
7b3a8dba14 fix(meeting-bot): preserve spawn failure diagnostics (#107614) 2026-07-19 16:17:46 +08:00
Peter Steinberger
4efcea1fd2 feat(browser): send pages to OpenClaw from the Chrome extension (#111158)
* feat(browser): send pages to the main session from the Chrome extension

One-click page share in the OpenClaw Chrome extension: toolbar popup with an
optional note, page/selection context menu, and Alt+Shift+S. Capture is
selection-first with a readability heuristic, X/Twitter thread extraction, and
Google Docs plain-text export via the user's session cookies. Payloads ride the
existing paired relay WebSocket as a new pageShare message; the gateway-only
page-share sink wraps page text in the external-content safety boundary, then
enqueues a main-session system event and requests an immediate heartbeat
(hooks/wake semantics). Node-hosted relays report a clear unsupported error.

Capture heuristics adapted from Nat Eliason's MIT-licensed send-to-openclaw.

Co-authored-by: Codex <codex@openai.com>

* fix(browser): keep page-controlled metadata inside the share safety boundary

Review findings: move title/URL inside wrapExternalContent (a hostile <title>
must not become trusted header text), prefer the user's selection over the
full Google Docs export, and pass the context-menu selectionText through so
iframe selections and selections cleared during relay reconnect still win.

* fix(browser): bind context-menu shares to the click-time document

Selection shares from the context menu now send the click snapshot directly
(no recapture), so navigations during relay reconnect cannot mislabel the
source and iframe selections are preserved. The Google Docs selection probe
scans all accessible frames before falling back to the full-document export.

* test(browser): expect the page-share handler in relay server args

* fix(browser): probe only the main frame for Google Docs selections

All-frame injection rejects wholesale when one frame is inaccessible and
returns child frames in nondeterministic order, so the probe now reads the
main frame only. Child-frame selections still share correctly through the
context menu's click-time selectionText; toolbar/shortcut entry sends the
full page for that case (named tradeoff in the code comment).

* fix(browser): satisfy page-share CI gates

---------

Co-authored-by: Codex <codex@openai.com>
2026-07-19 01:07:28 -07:00
Peter Steinberger
58452de711 refactor(config): config-surface reduction tranche 1 — retire dead keys, dedupe channel schemas, add growth ratchet (#111142)
* refactor(config): retire dead and aliased config keys via doctor migrations

* refactor(config): dedupe bundled channel config schemas into shared builders

* feat(config): add config-surface count ratchet to doc-baseline check

* test(config): drop stale fixtures for retired config keys

* fix(doctor): migrate only positive finite MCP timeout aliases

* fix(migrate-hermes): emit canonical MCP timeouts only

* fix(config): satisfy lint and contract gates
2026-07-19 00:52:37 -07:00
Jason (Json)
9c7800467c feat(mcp): open App views from channel replies (#111211)
* feat(mcp): add portable channel app actions

* test(gateway): keep origin reset private

* fix(mcp): require a resolved reply channel
2026-07-19 01:44:15 -06:00
Peter Steinberger
c163daa4ed refactor(channels): share durable ingress monitor (#111249)
* refactor(mattermost): share ingress monitor

* refactor(nextcloud-talk): share ingress monitor

* refactor(msteams): share ingress monitor

* refactor(zalo): share ingress monitor

* refactor(sms): share ingress monitor

* refactor(line): share ingress monitor
2026-07-19 00:26:28 -07:00
Peter Steinberger
ea54060223 feat(codex): fork upstream-linked sessions at a message via thread/fork (#111149)
* feat(codex): fork upstream-linked sessions at a message via thread/fork

* fix(gateway): fail closed for rewind and branch switch on upstream-linked sessions

* fix(codex): fail closed on first-message forks, image-only prompts, and orphan archival

* fix(codex): baseline retained history and reject paginated threads on upstream fork

* fix(codex): validate the full fork prefix and fail closed across crash windows

* fix(codex): treat all non-text inputs as unverifiable in fork drift checks

* fix(codex): support first-message forks as empty-history upstream cuts

* fix(codex): reject source-id reuse and unverifiable hidden inputs in fork boundaries

* refactor(codex): materialize upstream forks from verified thread read-back

* fix(codex): satisfy strict type lanes and knip for upstream fork
2026-07-19 00:11:10 -07:00
Peter Steinberger
ee0e3a4d47 refactor(channels): share durable ingress monitor (#111214)
* refactor(telegram): share durable ingress monitor

* refactor(whatsapp): share durable ingress monitor

* refactor(feishu): share durable ingress monitor

* refactor(qqbot): share durable ingress monitor

* refactor(zalouser): share durable ingress monitor

* refactor(nostr): share durable ingress monitor
2026-07-18 23:33:24 -07:00
Peter Steinberger
ba62b944fa fix(streams): preserve stable results when body cleanup fails (#111245)
* fix(proxy): preserve validation after cleanup failure

* fix(msteams): preserve attachment cleanup outcomes

* fix(gateway): preserve loopback size diagnostics
2026-07-18 23:25:20 -07:00
LZY3538
55a2a90610 fix(mxc): preserve Windows path fallbacks for blank env values (#111077)
* fix(mxc): ignore blank Windows path env overrides

* test(mxc): cover blank Windows path defaults

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 23:24:54 -07:00
FMLS
4074e0cae1 fix(browser): close tracked tabs after gateway restart (#110797)
* fix(browser): preserve tab cleanup across restarts

* fix(browser): disambiguate restart tab aliases

* fix(browser): keep untrack selection type private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 22:24:20 -07:00
Peter Steinberger
e23dde3de5 feat: disable automatic session resets by default (#111140)
* feat(config): disable automatic session resets by default

* fix(sessions): honor pending reset tombstones

* test(sessions): align reset coverage with disabled default

* fix(sessions): preserve explicit reset override fallback

* fix(sessions): inherit active mode in partial type resets
2026-07-18 21:50:48 -07:00
Marcus Castro
d5cb708623 fix(qa): repair WhatsApp live scenario regressions (#110754)
* fix(qa): make WhatsApp scenarios account-aware

* test(qa): cover configured WhatsApp SUT account

* refactor(qa): centralize QA target encoding

* fix(qa): configure scenario policies at startup
2026-07-19 01:43:38 -03:00
Peter Steinberger
938e3d5f20 refactor(channels): share durable ingress monitor (#111186)
* refactor(signal): share durable ingress monitor

* refactor(slack): share durable ingress monitor

* refactor(discord): share durable ingress monitor

* refactor(imessage): share durable ingress monitor

* refactor(twitch): share durable ingress monitor

* refactor(tlon): share durable ingress monitor
2026-07-18 21:33:09 -07:00
Peter Steinberger
835adff126 refactor(whatsapp): simplify doctor streaming materialization (#111188) 2026-07-18 21:21:22 -07:00
Peter Steinberger
cc57514e68 refactor(agents): make API registry ownership lifecycle-local (#111137)
* refactor(agents): make API registries lifecycle-owned

* refactor(agents): keep registry runtime ownership internal

* fix(agents): bind session streams to registry runtime

* refactor(agents): keep prepared runtime ownership internal

* test(agents): model lifecycle runtime fixtures

* fix(amazon-bedrock): adapt lifecycle stream types

* fix(agents): complete lifecycle runtime migration

* test(agents): satisfy lifecycle registry static gates
2026-07-18 20:55:07 -07:00
Alix-007
84ad63ef00 fix(tlon): reject unusable setup URLs (#111099)
* fix(tlon): reject unusable setup URLs

* fix(tlon): preserve validated partial setup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 20:47:13 -07:00
LiLan0125
86bd524a75 fix(whatsapp): keep LID ack reaction participants (#110053)
* fix(whatsapp): keep LID ack reaction participants

* test(whatsapp): trim reaction participant coverage

---------

Co-authored-by: Marcus Castro <mcaxtr@openclaw.ai>
2026-07-19 00:45:16 -03:00
Momo
198d2f000f fix(telegram): preserve authored file-reference links (#105911)
* fix(telegram): preserve authored file links

* fix(telegram): preserve authored file links after wrapping

* refactor(telegram): rely on markdown link provenance

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 20:33:05 -07:00
Peter Steinberger
208036afdc fix(codex): session permissions persist across resumed turns (#111136)
* test: harden Codex compaction command oracle

* test: accept omitted Codex command exit code

* fix(codex): apply stored session permissions

* test: harden Codex gateway stress evidence

* test: accept successful Codex command retries

* test: classify Codex evidence as live helper
2026-07-18 19:56:42 -07:00
Arseniy Palagin
bdfe2a4e60 fix(telegram): polling worker pins a CPU core when the Bot API answers empty getUpdates instantly (#111063)
* fix(telegram): pace fast empty ingress polls

Some Bot API deployments (notably self-hosted telegram-bot-api servers and
intermediary proxies) can answer getUpdates immediately instead of holding
the connection for the requested long-poll timeout. With no pending updates
that turns the polling ingress worker loop into a busy spin: each empty
poll completes in milliseconds and the next one starts right away, pinning
a CPU core.

Enforce a 1s floor between consecutive empty getUpdates cycles, measured
from poll start so responses that honor the long-poll timeout are never
delayed. The wait listens to the worker stop signal, keeping shutdown
immediate. Non-empty polls are not paced, so pending traffic still drains
at full speed.

* fix(telegram): adapt empty poll backoff

---------

Co-authored-by: Arseniy Palagin <valeradzigurda3@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:54:03 -07:00
Wynne668
491b87c936 fix(openrouter): preserve completed music when stream cleanup fails (#111056)
* fix(openrouter): preserve completed music when stream cleanup fails

* test(openrouter): clarify stream cleanup authority

* test(openrouter): propagate stream cancellation
2026-07-18 19:49:59 -07:00
Eden
8365383391 fix(line): deliver rich replies on the reply token instead of the push quota (#109011)
* fix(line): deliver rich replies on the reply token instead of the push quota

A reply token carries five messages for free, while push spends the account's
monthly quota. Text rode the token and the rich/media bubbles were pushed after
it, so an extracted table vanished with a 429 once that quota was gone. Bundle
both onto the token and push only the overflow.

Quick replies now ride the trailing message instead of the last reply-token
slot: LINE hides them as soon as a newer message arrives, so an overflowing
batch pushed its bubbles after the buttons and wiped them.

* refactor(line): unify auto-reply batching

* test(line): remove unused token fixture

* refactor(line): delete legacy reply chunk path

* fix(line): recover text from rejected mixed batches

* test(line): split auto-reply recovery coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:41:43 -07:00
Wynne668
5bb969f7de fix(tlon): preserve shutdown when body cancellation fails (#111106)
* fix(tlon): observe shutdown body cancellation failures

* test(tlon): streamline shutdown cleanup proof

* test(tlon): narrow shutdown fixtures

---------

Co-authored-by: ZengWen-DT <290981215+ZengWen-DT@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:32:04 -07:00
sunlit-deng
4dbeb84c25 fix(tlon): account checks leave streaming responses open (#111081)
* fix(tlon): release account probe response bodies

* test(tlon): assert probe cleanup ordering

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:18:30 -07:00
xingzhou
69aeba9d86 fix(discord): sustained gateway bursts stop growing memory (#110954)
* fix(discord): sustained gateway bursts stop growing memory

* fix(discord): contain gateway queue overflow

* fix(discord): drop oldest saturated gateway sends

Co-authored-by: 张贵萍0668001030 <zhang.guiping@xydigit.com>

* fix(discord): surface gateway overflow warnings

Co-authored-by: 张贵萍0668001030 <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:14:16 -07:00
Wynne668
ead8f691ea fix(matrix): preserve redirects when body cancellation fails (#111105)
* fix(matrix): observe redirect body cancellation failures

* test(matrix): verify rejection listener cleanup

---------

Co-authored-by: ZengWen-DT <290981215+ZengWen-DT@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:06:46 -07:00
tiffanychum
feb6da25f5 fix(googlechat): keep accounts.default streaming when doctor migrates named accounts (#106018)
* fix(googlechat): keep accounts.default streaming when doctor migrates named accounts

* fix(googlechat): canonicalize migrated streaming

Replace the layered doctor migration with canonical root/default/account materialization and prove runtime resolution matches the stored config.\n\nCo-authored-by: tiffanychum <71036662+tiffanychum@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 19:05:57 -07:00
Peter Steinberger
ced95b3fce refactor(discord): split message process runtime (#111119) 2026-07-18 19:04:30 -07:00
Jason (Json)
047232bd16 fix(telegram): fall back for web apps outside DMs (#111116) 2026-07-18 19:52:19 -06:00
Peter Steinberger
0a8c485395 fix(browser): make copilot runtime bundle deterministic (#111109) 2026-07-18 18:49:38 -07:00
wahaha1223
ecc56749e1 fix(anthropic): guard invalid timestamps in history imports (#110536)
* fix(anthropic): guard invalid timestamps in history imports

* fix(anthropic): reject pre-epoch history timestamps

* fix(anthropic): preserve valid transcript dates

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 18:45:10 -07:00
Marcus Castro
f2137f41b8 fix(whatsapp): serialize source runtime loading (#111094) 2026-07-18 22:40:19 -03:00
Eden
2e16660f18 fix(line): retry inbound media through the ingress drain on transient download failure (#110921)
* fix(line): retry inbound media through the ingress drain on transient download failure

* fix(line): retry all transient inbound media failures

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

* style(line): format media retry test

* test(line): use scanner-safe quote token

* fix(line): narrow durable media retries

* fix(line): preserve status after body cleanup

* chore(changelog): avoid concurrent entry conflict

* style(line): format retry helper signature

* test(line): assert rejected media chunk

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 18:26:33 -07:00
Ted Li
50e81ce493 fix(diagnostics-otel): classify model calls as client spans (#104211)
Model-call spans wrap outbound provider inference requests, so classify them as CLIENT independently of the optional GenAI naming convention. Generic tool spans remain unchanged because their shared events can represent local work.

Release note: operators filtering dashboards or alerts on span kind will see model-call spans move from INTERNAL to CLIENT.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 18:21:45 -07:00
mushuiyu886
c3adaa3195 fix(nostr): report relay connections only after they succeed (#110878)
* fix(nostr): report relay connections only after they succeed

* test(nostr): exercise relay callback during subscription

* test(nostr): reuse resolved account fixture

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 18:18:39 -07:00
Peter Steinberger
968f9ad0f3 test(codex): split event projector suites (#111097) 2026-07-18 18:17:25 -07:00
Peter Steinberger
b96d5cf554 fix(qa): resume channel cursor after gateway restart (#111096) 2026-07-18 18:16:14 -07:00
Peter Steinberger
03c3c4b978 fix(browser): keep copilot runtime bundle in sync (#111089) 2026-07-18 18:15:21 -07:00
Peter Steinberger
47afe8f88f refactor(discord): split message process tests (#111066)
* refactor(discord): split message process tests

* test(discord): register split suite lifecycle

* test(discord): keep process harness internals private
2026-07-18 17:49:19 -07:00
qingminlong
fc30a6c67d fix(oc-path): reject oversized multibyte JSONC input (#104140)
* fix(oc-path): enforce JSONC byte limit for multibyte input

* fix(oc-path): surface JSONC size diagnostics in CLI

* fix(oc-path): classify oversized JSONC as parse error

* test(oc-path): cover JSONC byte cap boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 17:47:15 -07:00
Kris Wu
e5b2ca3c6b feat(config): add compaction.thinkingLevel to override thinking level during compaction (#98074)
* feat(config): add compaction.thinkingLevel to override thinking during compaction

* fix: make compaction.thinkingLevel override inherited session thinking

* fix: warn on compaction.thinkingLevel ignored by Codex native runtime

* feat(config): add compaction thinking override

Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com>

* test(agents): remove duplicate compaction harness

Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com>

* test(plugin-sdk): account for thinking level export

Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com>

* chore: keep release note in PR metadata

* chore: reconcile plugin SDK surface budgets

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 17:18:28 -07:00
mushuiyu886
9fe92cf5ce fix(nostr): profile imports no longer crash on invalid fields (#110684)
* fix(nostr): profile imports no longer crash on invalid fields

* test(nostr): define invalid profile import policy

* test(nostr): cover invalid imported URL types

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 17:18:23 -07:00
Peter Steinberger
b4187ced90 feat: add live-validated Zoom meeting guest plugin (#111048)
* feat(zoom-meetings): add browser guest transport

* fix(zoom-meetings): type reusable refresh result

* test(meeting-bot): bind reusable refresh callback

* chore(zoom-meetings): use existing plugin label

* chore(zoom-meetings): defer changelog to release

* test(zoom-meetings): cover node setup through public host
2026-07-18 17:17:26 -07:00
NIO
86b5e279fb fix(voice-call): clamp continue poll RPCs to remaining deadline (#109053)
* fix(voice-call): clamp continue poll RPCs to remaining deadline

* test(voice-call): prove continue deadline bound

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 17:01:59 -07:00
Ted Li
10f5a7ac58 fix(groq): keep default Llama agent turns within TPM limit (#104904)
* fix(groq): recover oversized requests safely

* fix(groq): clear parallel tool aliases on fallback

* fix(groq): require provenance-aware host

* fix(groq): preserve configured request budgets

---------
authored-by: @MonkeyLeeT
Co-authored-by: Colin <colin@solvely.net>
2026-07-18 20:00:12 -04:00