Commit Graph

73628 Commits

Author SHA1 Message Date
Peter Steinberger 841bfcdcb8 fix(memory): make legacy session backfill rollback re-applicable (#116004)
* fix(memory): reset legacy backfill cursors on rollback

* fix(memory): track complete backfill rewind baselines
2026-07-29 13:08:25 -04:00
Yuval Dinodia 4823d7fe7b fix(security): fence external hook job name in isolated-agent prompts (#112501)
* fix(security): fence external hook job name in isolated-agent prompts

buildSafeExternalPrompt wrapped the hook message inside the external-content
boundary but placed the job name on a Task: line above it, unsanitized. The job
name comes from the same hook-controlled configuration or request data as the
message, so a crafted name could inject a forged end-marker and instruction-like
text into the trusted prompt region.

Pass the job name to wrapExternalContent as taskName so it is sanitized and
rendered as a Task: metadata line inside the boundary, matching the sender and
subject handling. Job ID and Received remain in the trusted prefix because they
are OpenClaw-generated.

* fix(security): fence external hook job name in isolated-agent prompts

Move hook-controlled job names into the existing sanitized external-content metadata boundary. Keep generated job IDs and timestamps in the trusted prefix.

Replays and narrows openclaw/openclaw#112501.

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:07:52 +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
Vincent Koc b8a5a61822 fix(test): restore stdin TTY descriptors (#115985) 2026-07-30 01:03:48 +08:00
ljy-1351 0ef7b4581f fix(plugins): remove incorrect modifying hook timeout fallback in getClaimingHookTimeoutMs (#107996)
* fix(plugins): keep claiming hook timeouts explicit

Co-authored-by: ljy-1351 <lin.jingya@xydigit.com>

* fix(plugins): keep claiming hook timeouts explicit

Co-authored-by: ljy-1351 <lin.jingya@xydigit.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:03:34 +08:00
Brandon bfc99c97c5 docs(plugins): clarify hook runtime activation (#77629)
* docs(plugins): clarify hook runtime activation

* docs(plugins): correct hook startup activation guidance

* docs(plugins): clarify hook runtime activation

* docs(plugins): clarify hook runtime startup

Co-authored-by: Brandon Zarnitz <bzarnitz13@gmail.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:02:31 +08:00
Sascha Kuhlmann 814b9f6e36 fix(hooks): bound agent runner admission (#104712)
* fix(hooks): gate agent admission on runner entry

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* fix(hooks): bound agent runner admission

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 01:01:46 +08:00
Gorkem Erdogan 5cf756e258 fix(plugins): prevent prompt-build hook reentrancy (#102554)
* fix(agents): prevent prompt hook reentrancy

Co-authored-by: Gorkem <gorkem.erdogan@outlook.com>

* fix(agents): prevent prompt hook reentrancy

Move the reentrancy invariant to the plugin hook runner so every caller is protected while sibling hook families and independent runners remain active.

Co-authored-by: Gorkem Erdogan <29964484+gorkem2020@users.noreply.github.com>

* test(plugins): type prompt hook reentrancy event

Co-authored-by: Gorkem Erdogan <29964484+gorkem2020@users.noreply.github.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Gorkem Erdogan <29964484+gorkem2020@users.noreply.github.com>
2026-07-30 01:00:52 +08:00
Peter Steinberger ca36be96e0 docs: add cross-client media playback guide (#116005)
* docs: add media playback guide

* docs: complete media playback glossary
2026-07-29 13:00:40 -04:00
Yuval Dinodia 8ae0a896bc fix(agents): apply_patch converts CRLF files to mixed line endings (#115943)
* fix(agents): preserve CRLF line endings in apply_patch update hunks

applyUpdateHunk split file contents on "\n" and rejoined with "\n", so
every line the hunk covered lost its carriage return, including the
context lines the patch declares unchanged. On a CRLF working tree a
one-line patch left a mixed-ending file on disk.

Detect the file line ending, run the hunk matcher on LF-normalized lines,
and restore the original ending on write. The line-ending helpers move
out of the edit tool into src/agents/line-endings.ts so both file-mutating
tools share one implementation.

* fix(agents): avoid normalizing mixed line endings

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 00:59:44 +08:00
lee-xydt b7f014036f fix(plugin-sdk): restore provider stream compatibility exports (#115757)
* fix(plugin-sdk): add missing thinking stream hooks to provider-stream-family exports

The provider-stream-family subpath was missing re-exports for deprecated
thinking-stream hook constants (MOONSHOT_THINKING_STREAM_HOOKS,
GOOGLE_THINKING_STREAM_HOOKS, KILOCODE_THINKING_STREAM_HOOKS,
MINIMAX_FAST_MODE_STREAM_HOOKS, OPENROUTER_THINKING_STREAM_HOOKS,
TOOL_STREAM_DEFAULT_ON_HOOKS) that are defined in provider-stream.js.

This caused @openclaw/moonshot-provider to fail at load time with:
  SyntaxError: does not provide an export named 'MOONSHOT_THINKING_STREAM_HOOKS'

Fixes #115580

* test(plugin-sdk): preserve provider stream family exports

* test(plugin-sdk): cover provider stream compatibility exports

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 00:58:05 +08:00
Peter Steinberger dc60a9442d feat(talk): support GPT-Live over gateway relay (#115831)
* feat(talk): add GPT-Live gateway relay peer

* fix(talk): ignore duplicate GPT-Live sideband audio

* fix(openai): harden GPT-Live relay startup

* fix(deps): replace vulnerable werift ip helper

* fix(deps): scope werift ip override version

* fix(openai): normalize relay startup errors

* test(ci): register GPT-Live gateway live shard

* fix(talk): tighten GPT-Live relay readiness

* fix(talk): keep relay override helper private

* fix(talk): resolve relay readiness with launch model

* fix(openai): preserve GPT-Live media clock

* fix(talk): align GPT-Live relay readiness and framing

* fix(openai): expire pending GPT-Live reservations

* fix(openai): harden GPT-Live delegation audio

* style(openai): satisfy RTP reorder lint
2026-07-29 12:54:23 -04:00
Peter Steinberger c87e545c88 fix(ui): rename the Memory Palace browser to Memory Wiki and document it (#115954)
* fix(ui): rename the Memory Palace browser to Memory Wiki and document it

* refactor(memory-wiki): drop the old memory-palace module files

* docs: refresh generated docs map

* test(ui): align dream-diary hub-tab assertion with the wiki sub-tab id

* docs: describe memory wiki clustering behavior accurately

* docs(memory-wiki): record the wiki.overview rename decision at the registration site

* test(ui): query the Agents channels hub tab by tab role after the hub-tabs refactor
2026-07-29 12:51:37 -04:00
wings1029 a4aaa1cd74 fix(scripts): keep cross-os command output tails UTF-8 safe (#109152)
* fix(scripts): keep cross-os command output tails UTF-8 safe

* fix(scripts): avoid possibly-undefined buffer index in cross-os UTF-8 tail skip

Buffer bracket indexing returns number | undefined under strict
TypeScript. Use .at() with an explicit undefined guard to satisfy
check-test-types.

* fix: add curly braces to single-line if statements (lint)

ESLint curly rule requires { } around all if/while/for bodies.

* fix(scripts): preserve streamed UTF-8 command output tails

Co-authored-by: 陈志强0668000989 <chen.zhiqiang1@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 12:51:13 -04:00
wahaha1223 030dbe9a7e fix(tlon): stop SSE reconnects after client close (#108168)
* fix(tlon): stop reconnecting after SSE client close

* fix(tlon): cancel SSE reconnect timers when monitoring stops

Preserve the original Tlon SSE reconnect fix while canceling both retry timers at stopReceiving(), the real monitor shutdown boundary.

Verified against an authenticated, SSRF-guarded loopback SSE server; both reconnect waits settle immediately without changing replay, close cleanup, or uninterrupted reconnection.

Co-authored-by: wahaha1223 <0668001153@xydigit.com>

* fix(tlon): prepare conflict-free reconnect refresh

Prepare a conflict-free refresh of the original Tlon SSE shutdown correction without changing its ownership or losing the contributor commit.

Co-authored-by: wahaha1223 <0668001153@xydigit.com>

* fix(tlon): cancel reconnect timers when monitoring stops

Cancel both Tlon SSE reconnect waits at stopReceiving(), the monitor-owned shutdown boundary, while preserving guarded HTTP, durable same-channel replay, and the original contributor's fix.

Verified with authenticated loopback SSE, both real retry delays, normal reconnection, all 252 Tlon tests, extension type checks, lint, and focused owner regressions.

Co-authored-by: wahaha1223 <0668001153@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 12:49:11 -04:00
Peter Steinberger d16e33e08e fix: restore trustworthy end-to-end QA and cross-channel delivery (#115404)
* fix(qa): repair verified end-to-end and channel regressions

* fix(gateway): make interrupted restart recovery lifecycle-safe

* test(heartbeat): target the canonical recovery session store

* fix(gateway): prioritize durable restart recovery before heartbeat

* fix(qa): preserve safe restart recovery and channel expiry

* fix(qa): fail closed and fence restart recovery

* test(agents): isolate restart recovery timing

* test(agents): prove actual restart retry timing

* fix(qa): report incompatible profile scenarios

* fix(scripts): resolve symlinked docker scheduler entrypoints

* fix(qa): require fresh native test evidence

* fix(heartbeat): fence active restart recovery delivery

* fix(gateway): consume untargeted restart acknowledgements

* fix(qa): satisfy exhaustive hosted validation gates

* fix(agents): fence stopped restart recovery dispatch

* style(agents): format restart recovery lifecycle regression

* test(gateway): isolate context prewarm sidecar lifecycle

* test(qa): make scenario process timeout cleanup deterministic

* fix(qa): stamp synthetic gateway configs with current version

* fix(openai): preserve vision capabilities in stale model catalogs

* test(qa): align profile channel rejection with current main

* fix(openai): forward supported moderation for image edits

* fix: restore latest-main CI and image edit documentation

* fix(qa): retain relocated code-mode evidence validation

* fix(openai): expose GPT-5.4 vision in static catalog

* fix(pricing): honor explicit model cost overrides

* test(pricing): keep isolated provider regressions deterministic

* fix(openai): inherit transport for discovered static models

* fix(gateway): honor agent-owned static image capabilities

* test(gateway): preserve prepared-snapshot attachment races

* test(gateway): isolate subagent persistence failure injection

* test(gateway): exercise concurrent voice replay admission

* fix(gateway): restore stale model image capabilities

* fix(agents): publish configured model vision capabilities

* fix(agents): isolate detached media transcript ownership

* test(agents): preserve generic transcript lock regression

* fix(gateway): require proven static model route identity

* fix(qa): accept bounded full-size generated image attachments

* fix(qa): require fresh script producer evidence

* test(qa): prove native E2E scenario execution
2026-07-29 12:45:27 -04:00
Peter Steinberger cc2ba80639 docs: expand Telegram Mini App guide (#115981) 2026-07-29 12:39:54 -04:00
Peter Steinberger 4229e96e0e feat(media): lazy playback transcode for exotic containers (#115987)
* feat(media): add lazy playback transcodes

* fix(media): harden playback transcodes

* fix(media): normalize raw AAC and WAV playback

* fix(media): finalize playback cache and codec policy

* fix(media): serialize playback cache enforcement

* fix(media): retain playback transcodes for seven days

* fix(media): keep playback internals private
2026-07-29 12:33:42 -04:00
Peter Steinberger a914fcd1f7 fix(mac): hide duplicate Gateway in dashboard picker over SSH (#115963)
* fix(mac): dedupe active SSH gateway profile

* fix(mac): dedupe gateway before tunnel readiness

* chore(mac): defer release note to release process
2026-07-29 12:27:32 -04:00
Peter Steinberger 6dc13c63b6 fix(memory-core): adopt legacy dreaming jobs (#115986) 2026-07-29 12:26:43 -04:00
Peter Steinberger ea967be0df feat(gateway): add loopback locality controls (#115959)
* feat(gateway): add loopback locality controls

* fix(gateway): keep loopback auth delays enforced under concurrency

The pending-timer cap let an attacker park cheap failures in every slot and then guess without penalty. Delays now key off a per-key deadline, so parallel guesses wait out the same escalating penalty and are still bounded by the max delay.

* fix(gateway): share one loopback penalty timer per key

Concurrent failures on a key now share a single timer and deadline instead of allocating one per in-flight request. Also corrects the security doc: the delay raises the cost of repeated guessing from one source, but credentials are compared before the failure response is delayed, so it is not a defense against parallel fan-out.

* docs(gateway): record why loopback delay stays post-verification

* docs: refresh generated docs map

* docs: refresh plugin SDK API baseline

* test: update loopback locality CI expectations
2026-07-29 12:25:57 -04:00
Peter Steinberger a877fe1b32 fix(cron): prevent stalled schedules, duplicate runs, and lost heartbeats (#115979)
* fix(cron): prevent stalled schedules and lost heartbeat work

* fix(heartbeat): preserve global task wake flush barriers

* fix(cron): canonicalize symlinked store locks
2026-07-29 12:25:14 -04:00
Peter Steinberger b4d14d7848 refactor(config): move model normalization to input owners (#115965)
* refactor(config): move model normalization to input owners

* fix(config): merge canonical doctor model rows

* fix(config): align touched model map identities

* ci(env): lower production variable budget

* chore: leave changelog to release automation
2026-07-29 12:04:07 -04:00
Peter Steinberger c6dfee1b78 fix(gateway): reject stale node connectivity probes (#115971) 2026-07-29 11:53:57 -04:00
Peter Steinberger 5bfc65d7f4 refactor: remove 3,543 lines of redundant runtime and tests (#115961)
* refactor: remove 3,543 lines of redundant runtime and tests

* refactor: ratchet production environment variable budget
2026-07-29 11:43:41 -04:00
sunlit-deng 190307137a fix(file-transfer): strip BOM from inline file fetch text (#115906) 2026-07-29 23:40:20 +08:00
Peter Steinberger af717db39c feat(ui): add per-connector tool access to composer (#115907)
* feat(ui): per-connector tool access in composer menu

* fix(ui): harden tool access loading and dynamic keys

* fix(ui): harden tool access reads and catalog freshness

* fix(ui): invalidate tool catalog on connector edits

* test(ui): fix composer capability checks
2026-07-29 11:39:53 -04:00
Peter Steinberger 68a3ca740d fix(ui): harden chat and session interactions (#115967) 2026-07-29 11:39:10 -04:00
chengzhichao-xydt 29497b4e1e fix(agents): keep subagent run ID mask from splitting UTF-16 surrogate pairs (#104874)
* fix(agents): keep subagent run ID mask from splitting UTF-16 surrogate pairs

* fix(agents): drop unnecessary export on run ID mask and test through warnings

* test(agents): avoid String(unknown) in run ID mask warning capture

CI check-lint (oxlint typescript/no-base-to-string) rejects String() on an
unknown-typed field; the toMatchObject assertion above already pins the
shape, so read runId as a string field directly.

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

* fix(agents): refresh Unicode run-id contributor baseline

Restore the original run-id lifecycle files to the reviewed upstream baseline before preserving the contributor branch and applying the verified Unicode fix.

Co-authored-by: chengzhichao-xydt <cheng.zhichao@xydigit.com>

* fix(agents): preserve Unicode subagent run identities

Preserve valid Unicode run identifiers through subagent lifecycle masking and prove authenticated plugin Gateway admission, registry tracking, and idempotent retries.

Co-authored-by: chengzhichao-xydt <cheng.zhichao@xydigit.com>

---------

Co-authored-by: chengzhichao-xydt <chengzhichao-xydt@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 11:35:43 -04:00
Peter Steinberger 2dfdfd5442 test(gateway): cover voice-node Talk reconnect (#115966) 2026-07-29 11:33:24 -04:00
Vincent Koc f083518506 Merge pull request #115942 from openclaw/fix/macos-keyboard-accessibility
fix(accessibility): restore web view navigation and layout-aware shortcuts

* commit 'fd28cd3becfded364107f236f526b08422f8ebab':
  fix(ui): support shortcuts on non-Latin keyboards
  fix(macos): enable keyboard navigation in web views
2026-07-29 23:29:56 +08:00
Peter Steinberger df3674f577 refactor(ui): unify tab navigation on the shared hub tabs (#115934)
* refactor(ui): unify tab navigation on shared hub tabs

* refactor(ui): move cron navigation to hub tabs

* test(ui): update agent overview tab locator
2026-07-29 11:24:44 -04:00
Peter Steinberger e0c384b771 fix(ci): tighten ClawHub environment variable ratchet (#115958) 2026-07-29 11:22:06 -04:00
xingzhou 4fde85fc31 fix(discord): reject malformed UTF-8 API responses (#115918) 2026-07-29 23:18:26 +08:00
Sascha Kuhlmann 819961a292 fix(hooks): avoid implicit hook delivery targets (#100486)
* fix(gateway): bind hook delivery before scheduling

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* test(cli): make stderr tail fixture deterministic

* test(cli): allow loaded runners to start

* fix(gateway): narrow hook delivery binding

Co-authored-by: Sascha Kuhlmann <117685070+coolmanns@users.noreply.github.com>

* fix(gateway): keep hook delivery normalization internal

* style(gateway): format hook delivery helper

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 23:14:46 +08:00
Vincent Koc 6fd100d878 fix(test): run Gmail watcher process integration on Unix (#115937) 2026-07-29 23:11:33 +08:00
Peter Steinberger 383f8947c1 fix: doctor skips host services for isolated state (#115922)
* fix(doctor): isolate host service management

* fix(doctor): clarify service isolation recovery

* test(doctor): isolate service identity fixtures

* test(daemon): keep lifecycle fixtures lint-clean

* test(daemon): isolate install identity fixtures
2026-07-29 11:09:56 -04:00
Vincent Koc fd28cd3bec fix(ui): support shortcuts on non-Latin keyboards 2026-07-29 23:09:22 +08:00
Yiğit ERDOĞAN 6ec3dbd92d fix(ai): tool calls fail when an unsupported schema keyword is nested (#115741)
* fix(ai): tool calls fail when an unsupported schema keyword is nested

The strip walked only properties, items, anyOf, oneOf and allOf, copying every
other value through untouched. A keyword the model rejects therefore survived
inside additionalProperties, prefixItems, patternProperties, contains,
propertyNames, not, if/then/else, dependentSchemas and $defs, and the request
was refused by the provider even though the strip reported success.

Walk the same containers the caller already enumerates in
agent-tools-parameter-schema.ts.

* fix(ai): cover all nested schema containers

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 23:08:19 +08:00
Peter Steinberger 34e81ca0dc feat(codex): support the openai-api-curated marketplace wire name (#115955) 2026-07-29 11:07:16 -04:00
Vincent Koc e94693aa52 fix(macos): enable keyboard navigation in web views 2026-07-29 22:59:39 +08:00
Vincent Koc 5fa8c4a4e5 fix(test): require fleet doctor healthy checks (#115946) 2026-07-29 22:59:09 +08:00
Vincent Koc 41f118cec3 fix(plugins): forward tool cancellation to hooks (#115817)
* fix(plugins): forward tool cancellation to hooks

* test(plugins): prove hook cancellation propagation
2026-07-29 22:54:01 +08:00
Peter Steinberger 9c065b57cb fix(agents): count runtime acquisition as lane progress and stop retrying terminal auth-migration reviews (#115950) 2026-07-29 10:53:56 -04:00
Vincent Koc 0570d53691 fix(ui): keep hide confirmation in viewport (#115928) 2026-07-29 22:51:08 +08:00
sunlit-deng 0871864691 fix(agents): keep MCP resolvers from live registries (#112579)
* fix(agents): keep MCP resolvers from live registries

* test(agents): prove authenticated live-registry MCP streams

* test(agents): prove complete pinned MCP revocation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 10:50:44 -04:00
Peter Steinberger 53815217e9 fix(memory): session backfill drains and rolls back reversibly (#115926)
* fix(memory): complete reversible session backfill

* refactor(memory): split backfill lifecycle helpers

* fix(memory): break backfill lifecycle import cycle

* fix(memory): keep lifecycle contract exports minimal
2026-07-29 10:48:16 -04:00
Miorbnli 7e3e4f6cd9 fix(ui): do not report stopped channels as connected (#112518)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 10:47:10 -04:00
Peter Steinberger 17a8961a6a fix(active-memory): inject cold first-turn memory in QA-channel DMs (#115936)
* fix(active-memory): prewarm trigger recall for channel turns

* test(active-memory): satisfy timing test lint

* test(plugins): declare active-memory prewarm hook
2026-07-29 10:38:42 -04:00
Vincent Koc b732322540 fix(logging): avoid Vitest exit listener leaks (#115929) 2026-07-29 22:37:30 +08:00