Commit Graph

17581 Commits

Author SHA1 Message Date
Vincent Koc 70fca59fac Merge pull request #115823 from openclaw/refactor/msteams-message-handler-decomposition
refactor(msteams): decompose inbound message handler
2026-07-29 21:57:31 +08:00
Vincent Koc 7833bab183 Merge pull request #115806 from openclaw/refactor/whatsapp-monitor-orchestration
refactor(whatsapp): split inbound monitor orchestration
2026-07-29 21:56:59 +08:00
Vincent Koc 9cf2122045 test(qa): align bootstrap profile catalog (#115898)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 21:20:59 +08:00
Peter Steinberger 8ec4a059fc fix(codex): keep stressed inference turns isolated and observable (#115893) 2026-07-29 09:11:20 -04:00
Vincent Koc 9c45302800 fix(browser): stabilize atomic download staging (#115892)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 21:05:41 +08:00
Monkey-wusky 79e0b559fe fix(google): cancel unread response body on video download error (#110045)
* fix(google): cancel unread response body on video download error

* fix(google): safely cancel failed streaming video downloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 09:00:04 -04:00
Vincent Koc bc30f92c57 fix(test): stop asserting exact video deadline budgets (#115883) 2026-07-29 20:45:44 +08:00
Peter Steinberger 32b2e161a5 fix(codex): harden app inventory invalidation and targeted publishes (#115866)
* fix(codex): harden app inventory invalidation and targeted publishes

* fix(codex): scope inventory invalidation and stop renewing unrefreshed rows

* fix(codex): retire scoped invalidations incrementally across covering refreshes

* fix(codex): renew targeted inventory freshness when refresh covers the cached scope

* fix(codex): replace expired inventory entries instead of merging into them
2026-07-29 08:33:26 -04:00
synth 151c549494 fix(browser): uploads fail when the browser runs on a remote node (#115291)
* fix(browser): resolve upload paths on the owning browser node, not the Gateway

When a browser session is proxied to a remote node, the upload action
previously ran resolveExistingUploadPaths on the Gateway, pinning paths
to a filesystem the node cannot see and rejecting node-local files. The
node-side /hooks/file-chooser route already re-resolves paths against
its own filesystem, so skip Gateway-local resolution whenever the
request is proxied and forward the requested paths as-is.

Fixes openclaw/openclaw#115251

* fix(browser): transfer uploads to remote browser nodes

* fix(browser): normalize upload abort errors

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 20:31:46 +08:00
Peter Steinberger 8e1ea3048c refactor(ollama): unify model inspection and setup (#115879) 2026-07-29 08:27:41 -04:00
Vincent Koc dcd3c5b202 fix(test): restore isolated memory manager tests (#115880) 2026-07-29 20:24:14 +08:00
Yuval Dinodia edf4aca7bc fix(agents): apply_patch destroys an existing file when a patch creates that path (#114911)
* fix(agents): stop apply_patch from silently overwriting existing files

An "*** Add File:" hunk wrote its target unconditionally. When the path
already existed, apply_patch replaced the entire file, returned Success,
and listed the path under "added", so neither the model nor the UI got
any signal that existing content had been destroyed. The "*** Move to:"
destination of an update hunk had the same gap and reported the clobbered
path as merely modified.

The add and move-to branches now check the destination through the patch
file ops before writing and fail closed when it exists. Routing the check
through fileOps keeps it correct on all three backends (workspace-scoped
fs-safe root, raw fs, sandbox bridge). The check runs per hunk in patch
order, so deleting a path earlier in the same patch and recreating it
still works.

* fix(agents): make apply_patch destination creation atomic

The previous guard checked that an add or move-to destination was absent
and then wrote it. A competing writer could create the path in that gap,
after which the write still replaced it, so the no-clobber guarantee did
not hold under contention.

Destination creation now goes through a single exclusive create-if-absent
operation on every patch backend: Root.create for the workspace-scoped
default, an O_EXCL write for the raw filesystem, and a new pinned create
operation in the sandbox mutation helper that opens the target with
O_CREAT|O_EXCL and reports a reserved exit code when it already exists.
PatchFileOps drops its separate existence check.

Resolving the host ops behind an early return removes the repeated
workspaceOnly branch inside each operation and the optional-call dance
that let a missing root silently skip a write.

* fix(agents): complete atomic apply-patch creation

* fix(agents): preserve raced create replacements

* fix(agents): handle fs-safe patch collisions

* fix(agents): publish sandbox creates atomically

* test(agents): cover exclusive create provenance rollback

* fix(agents): use typed exclusive-create signal

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 20:17:54 +08:00
Peter Steinberger 44d011380c fix(codex): classify curated marketplace load failures by sync root (#115865)
* fix(codex): classify curated marketplace load failures by sync root

* test(codex): assert deny-all patch contract instead of racy plugin/list step
2026-07-29 08:07:28 -04:00
Peter Steinberger ef63df8afd fix(memory): preserve taint across transcript runtimes (#115850)
* fix(memory): propagate taint across transcript owners

* test(copilot): consolidate taint journal coverage

* fix(codex): keep event projector within lint budget

* fix(codex): preserve projector merge-head budget
2026-07-29 08:06:17 -04:00
NIO 0316368518 fix(googlechat): cancel unread fetchOk bodies before release (#111290)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:34:19 -04:00
Peter Steinberger a2ead0a929 fix(memory): recover divergent dreaming journals (#115855)
* fix(memory): recover divergent dreaming journals

Co-authored-by: brokemac79 <martin_cleary@yahoo.co.uk>

* chore: drop changelog edit (release generation owns it)

---------

Co-authored-by: brokemac79 <martin_cleary@yahoo.co.uk>
2026-07-29 07:32:26 -04:00
ACD_RD4駱俊馳 e7f0fdfd9b fix: CJK replies are silently dropped instead of recovered when the model skips message(action=send) (#115556)
* fix(auto-reply): count CJK sentence terminators in stranded private-final detection

* fix(auto-reply): compare private-final substance thresholds with the CJK-aware estimator

* fix(auto-reply): detect CJK sentence boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:23:33 -04:00
zw-xysk ebf9fcc02c fix(feishu): log message content JSON parse failures instead of silently swallowing (#107947)
* fix(feishu): log message content JSON parse failures instead of silently swallowing

Replace formatErrorMessage(err) with safe metadata-only logging in
parseFeishuMessageContent to prevent potential message content leaks
through V8 JSON.parse error messages.

Changes:
- Remove formatErrorMessage import (security: V8 JSON.parse errors can
  include input content in the message)
- Log only msgType and optional messageId (safe metadata) when parse
  fails, never the exception message or raw content
- Add assertion that raw content is NOT present in the log output
- Pass messageId through to enable richer diagnostics

The raw content is still preserved as the function return value (existing
fallback behavior).

* fix(feishu): move parse-failure test into getMessageFeishu suite

The test 'logs a safe diagnostic (not raw content) when message content
is not valid JSON' was declared after the closing brace of
describe('getMessageFeishu'), so it did not inherit that suite's fixture
setup and reset hooks (beforeEach/afterAll). Move it inside the suite
so it benefits from the shared mock reset and cleanup.

Fixes ClawSweeper P2: 'Keep the parse-failure test inside the fetch suite'

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:16:24 -04:00
wahaha1223 8bcbc3178b fix(msteams): ignore blank certificate settings (#109112)
* fix(msteams): ignore blank certificate settings

* fix(msteams): preserve federated certificate path behavior

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 07:10:47 -04:00
Peter Steinberger e6fec4d51b fix(codex): keep completed answers over audit gaps (#115849) 2026-07-29 06:52:21 -04:00
loong 7bdd1f646b fix(memory-host-sdk): resolve stable execPath for worker fork to survive Homebrew Node upgrades (#99318)
* fix(memory): survive Homebrew Node upgrades

Co-authored-by: 袁龙辉0668001277 <yuan.longhui@xydigit.com>

* test(whatsapp): isolate last-route coverage

* fix(deepinfra): preserve offline model compatibility

* test(memory): isolate migration cleanup lifecycle

* test: stabilize aggregate extension gates

* ci: retrigger pull request workflow

* test: preserve inherited Node options

* test(cli): tolerate cold hosted startup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:49:02 -04:00
wangmiao0668000666 77e9ee092f fix(synology-chat): stop fabricating send message ids (#110770)
* fix(synology-chat): stop fabricating send message ids

The incoming-webhook send contract acks with a bare boolean and carries
no platform message id, but the adapter returned a synthetic
`sc-${Date.now()}` id and stamped it into the delivery receipt. Return
the established empty-id sentinel and an empty receipt instead, matching
the honest no-platform-id shape used by sibling channels (qqbot,
googlechat) and the plugin-sdk empty-id contract.

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

* test(synology-chat): verify truthful webhook receipts

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:44:44 -04:00
Goutam Adwant b11ed1877c fix(feishu): reply to direct messages by chat id (#109637)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:42:41 -04:00
Masato Hoshino 46b2bed375 fix(nextcloud-talk): reject reactions for disabled or unconfigured accounts (#112675)
The react message-action handler dispatched straight to the sender without
checking the resolved account, so a disabled Nextcloud Talk account
(`enabled:false`) that still had a baseUrl/botSecret in config could keep
emitting reactions. `describeMessageTool` already hides the tool for
unconfigured accounts, but an explicit accountId can reach `handleAction`
directly. Enforce the same enabled+configured gate at dispatch, mirroring
the Signal reaction fix (#112607).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-29 06:34:54 -04:00
Peter Steinberger 986e5d1758 refactor(channels): share ingress retention defaults (#115824) 2026-07-29 06:24:30 -04:00
mushuiyu886 d8935248e4 fix(nostr): profile imports vary on timestamp ties (#111798)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:22:33 -04:00
stevenlee-oai a00438a867 fix(codex): restore connected apps for token-authenticated runs (#115075)
* fix(codex): restore connected apps for token-authenticated runs

* fix(codex): keep app inventory protocol types private

* fix(codex): align native runtime with Codex 0.146.0

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): clean up latest app-server integration

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): keep internal protocol types private

* fix(ci): repair current main Codex landing gates

* fix(ci): format inherited code mode matrix

* fix(codex): reconcile native app-server contracts with main

Prepare a verified GitHub-hosted mainline merge while preserving the reviewed Codex 0.146.0 fixes and canonical OpenAI authentication.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): keep QA evidence in its owning plugin

Resolve the current-main Code Mode test rename without resurrecting the retired core test path.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): enforce canonical OpenAI app-server auth

Reject retired provider aliases without runtime compatibility, direct operators to the doctor migration, and remove the redundant OpenAI API-key predicate.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* chore(codex): reconcile latest main dependency graph

Preserve current main dependency changes while preparing the original Codex PR for an ancestry-preserving signed mainline merge.

Co-authored-by: Steven Lee <stevenlee@openai.com>

* fix(codex): unify bundled Codex 0.146 runtimes

Keep the ACP adapter on the same 0.146.0 Codex release as the managed runtime, remove obsolete 0.145.0 platform artifacts and unused semver compatibility, and preserve the latest main dependency upgrades.

Co-authored-by: Steven Lee <stevenlee@openai.com>

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:21:25 -04:00
Peter Steinberger 7bc453f508 fix(codex): classify hosted search timeouts (#115837) 2026-07-29 06:21:11 -04:00
dongdong 1219ebff9a fix(msteams): keep attachment replies in channel threads (#94348)
* fix(msteams): keep file replies in channel threads

* fix(msteams): keep SharePoint files in channel threads

Fixes #88836 by forwarding channel thread roots through the existing Microsoft Teams proactive activity boundary while preserving top-level, group chat, and personal delivery.

Co-authored-by: Jasmine Zhang <jasminezhang@JasminedeMac-mini.local>

* test(msteams): use lint-safe real SDK HTTP capture

---------

Co-authored-by: Jasmine Zhang <jasminezhang@JasminedeMac-mini.local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:19:11 -04:00
Zakaria Rahali a9391d7312 fix(telegram): linkPreview:false is ignored on streamed replies (#114125)
* fix(telegram): linkPreview:false is ignored on streamed replies

Replies delivered through draft streaming still unfurled the first URL
even with channels.telegram.linkPreview: false. Non-streamed sends
already honored the flag.

createTelegramDraftStream never received linkPreview and never set
link_preview_options, on either its initial sendMessage or its
editMessageText calls. Finalization could not clean it up: it skips the
final edit when the streamed draft text already equals the final text,
which is the common case, so the draft message stays as-is with the
preview attached.

Passes linkPreview from telegramCfg into the draft stream and applies
link_preview_options: { is_disabled: true } on the send and on every
edit, since an edit that omits the field re-enables the preview
server-side. Rich messages keep expressing this as skip_entity_detection
at render time, which already worked.

Call arity is preserved when no preview options apply, so existing edit
assertions are unaffected.

Closes #111525

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

* test(telegram): cover streamed reply option parity

Co-authored-by: Zakaria Rahali <zakariarahali288@gmail.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:18:35 -04:00
VectorPeak 404fafff77 fix(searxng): avoid duplicating search endpoint (#113661)
Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
2026-07-29 06:15:51 -04:00
Peter Steinberger 9721ca15d2 refactor(meetings): consolidate runtime facades (#115819)
* refactor(meetings): consolidate runtime facades

* fix(meetings): keep facade contracts acyclic
2026-07-29 06:13:37 -04:00
sunlit-deng da8a2208d2 fix(browser): reject malformed proxy file base64 (#115045)
* fix(browser): reject malformed proxy file base64

* fix(browser): preserve empty proxy downloads

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 06:08:01 -04:00
Peter Steinberger 20668eed03 fix(memory): quarantine writes from tainted agent turns (#115818)
* feat(memory): taint writes after network tools

* fix(memory): keep provenance mutations recoverable

* fix(memory): roll back failed provenance writes

* fix(memory): serialize provenance mutations

* docs(memory): explain flush provenance boundary

* refactor(memory): share provenance mutation wrapper

* docs(memory): clarify flush provenance fallback

* fix(memory): canonicalize provenance paths
2026-07-29 06:02:06 -04:00
Chris Zhang 70251e415d fix(feishu): cache inaccessible sender lookups (#111700)
Co-authored-by: Chris <4436110+zqchris@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 05:59:55 -04:00
Wynne668 522c747d3c fix(exa): reject invalid UTF-8 search responses (#111736) 2026-07-29 05:58:02 -04:00
Vincent Koc 99b5df0fd2 fix(openai): satisfy realtime lifecycle lint 2026-07-29 17:57:59 +08:00
Vincent Koc 5e0a75f0e5 fix(openai): close realtime lifecycle races 2026-07-29 17:57:59 +08:00
Vincent Koc 1cc2e28b5b chore(openai): keep lifecycle types internal 2026-07-29 17:57:59 +08:00
Vincent Koc 3bf40870ad refactor(openai): apply lifecycle to realtime bridge 2026-07-29 17:57:59 +08:00
Vincent Koc dd0e416303 refactor(openai): apply lifecycle to GPT-Live bridge 2026-07-29 17:57:59 +08:00
Vincent Koc 61cadc1459 refactor(openai): add realtime voice lifecycle 2026-07-29 17:57:59 +08:00
Vincent Koc 9e246deb6e test(whatsapp): rely on monitor cache coverage 2026-07-29 17:56:40 +08:00
Peter Steinberger cedeca1708 fix(zalo): normalize prefixed Bot API delivery targets (#115814)
Preserve the original Zalo provider and target-kind normalization fix and regression test from #106171. Add real configured-plugin loopback HTTP proof for both text and photo delivery through group and user aliases.

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

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: lzw112 <wang.lizhang@xydigit.com>
2026-07-29 05:53:07 -04:00
Peter Steinberger b0376d19bf fix(browser): abort cancelled CDP handshakes (#115805)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 05:48:27 -04:00
Peter Steinberger 85d2d698ff fix(nostr): deliver oversized encrypted replies as ordered chunks (#115816)
Apply the shared, surrogate-safe outbound chunker to the existing Nostr text limit so the real delivery planner produces ordered NIP-04 events. Preserve assistant-visible sanitization and prove short, word, newline, hard-split, and odd-prefix Unicode boundaries.

Co-authored-by: liyuanbin <li.yuanbin1@xydigit.com>
2026-07-29 05:47:01 -04:00
Vincent Koc 25c375e47f refactor: reuse canonical record guards (#115810)
* docs(agents): standardize canonical record guards

* refactor(model-catalog): use canonical record guard

* refactor(scripts): use canonical record guard

* refactor(ui): use canonical record guard

* refactor(codex): use canonical record guard

* refactor(agents): use canonical record guard

* refactor(sessions): use canonical record guard

* refactor(doctor): use canonical record guard

* refactor(infra): use canonical record guard
2026-07-29 11:43:36 +02:00
Vincent Koc d1c1aaaffe fix(msteams): type thread allowlist inputs 2026-07-29 17:42:39 +08:00
Vincent Koc dedb27d19c fix(msteams): keep dispatch result internal 2026-07-29 17:42:39 +08:00
Vincent Koc 40bceb9f2b refactor(msteams): isolate inbound dispatch lifecycle 2026-07-29 17:42:39 +08:00