Commit Graph

34672 Commits

Author SHA1 Message Date
Martin Kessler
840cfd69cd fix(telegram): bind bot mentions to assistant identity (#93088)
* fix(telegram): bind bot mentions to assistant identity

* fix(telegram): satisfy context payload mention typing

* refactor(telegram): carry mention facts as one context object

* test(telegram): use neutral bot handle fixture

* fix(ci): terminate heartbeat command groups

* fix(ci): preserve heartbeat shell functions

* fix(telegram): project effective mention facts

* fix(telegram): keep mention identity portable

* test(telegram): align mention facts mock

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 14:35:14 +08:00
Bhargav Chinta
e06f5f2edc fix(cron): preserve aborted isolated-run failure (#93471)
Merged via squash.

Prepared head SHA: dfbba9aa40
Co-authored-by: BhargavSatya <24696554+BhargavSatya@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-06-16 14:33:25 +08:00
Harjoth Khara
d7cebdc215 fix(gateway): rotate already-stale generated transcript filename on /reset (#93496)
Merged via squash.

Prepared head SHA: 6ae356c34a
Co-authored-by: harjothkhara <48686985+harjothkhara@users.noreply.github.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Reviewed-by: @vincentkoc
2026-06-16 14:32:38 +08:00
Vincent Koc
d2439d2f7d fix(onboard): skip Homebrew prompt on unsupported platforms (#93521)
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
2026-06-16 14:30:27 +08:00
Vincent Koc
52280351bb fix(workspace): store setup state outside workspace dot-dir (#93520)
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
Co-authored-by: Lai Quang Huy <64073540+1qh@users.noreply.github.com>
2026-06-16 14:30:01 +08:00
Vincent Koc
1884cedd35 fix(skills): refresh persisted snapshots after restart (#93513)
* fix(skills): refresh persisted snapshots after restart

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>

Co-authored-by: Oleksandr Zakotyanskyi <28755978+fif911@users.noreply.github.com>

Co-authored-by: Stephan Kadauke <10904538+skadauke@users.noreply.github.com>

* fix(clownfish): address review for ghcrawl-156600-autonomous-smoke (1)

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>

Co-authored-by: Oleksandr Zakotyanskyi <28755978+fif911@users.noreply.github.com>

Co-authored-by: Stephan Kadauke <10904538+skadauke@users.noreply.github.com>

---------

Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
Co-authored-by: Stephan Kadauke <10904538+skadauke@users.noreply.github.com>
2026-06-16 14:20:47 +08:00
zhang-guiping
bb164384c2 [Bug]: ollama-cloud runtime fails DNS lookup for ai.ollama.com, while ollama/<model>:cloud works (#92594)
* fix(ollama): repair retired cloud provider endpoint

Route configured Ollama Cloud provider ids through plugin doctor compatibility migrations so doctor --fix can rewrite the retired ai.ollama.com endpoint before runtime reads persisted config.

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

* test(doctor): align provider fixture with typed config

Ensure the doctor registry provider-scoped migration test uses a fully typed provider fixture so the test type-check shard validates the intended behavior.

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

* test(ollama): align doctor fixture with typed config

Use fully typed provider and model fixtures in the Ollama doctor contract tests so the extension test type-check shard validates the migration behavior.

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

* fix(ollama): preserve custom cloud provider base url

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

* fix(ollama): avoid logging retired endpoint secrets

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 14:17:57 +08:00
zhang-guiping
2196ea2930 fix #85871: [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23) (#88970)
* fix heartbeat deferral during active embedded runs

* fix heartbeat admission busy retry

* fix(heartbeat): bind retry to local admission

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 14:17:37 +08:00
Vincent Koc
ccf83ace38 fix(plugins): repair missing required platform packages 2026-06-16 14:00:11 +08:00
xydigit-sj
2b752ac0d1 fix(doctor): repair null agents.list[].workspace values (#93105)
A literal null `workspace` field in an agent entry failed schema validation at
startup, producing a crash loop that `openclaw doctor --fix` could not recover
from because the compatibility pipeline never normalized the malformed field.

Add a narrow doctor migration that removes null `workspace` values from
`agents.list` entries and relies on the existing fallback path (defaults or
stateDir-derived workspace) at runtime.

Fixes #77718.
2026-06-16 13:59:36 +08:00
Alix-007
01d3505d7c fix(auto-reply): redact secrets in /debug show and /debug set output (#93333)
PR #88496 routed /config show and /config set chat output through the
shared schema-aware redaction path, but the sibling /debug commands in
the same handler were left untouched. /debug show JSON-stringified the
full runtime override tree verbatim and /debug set echoed the raw value,
so a secret-shaped override (e.g. gateway.auth.token, channels.*.botToken)
set via /debug set was rendered in plaintext to chat-visible output.

Apply redactConfigObject(overrides, schema.uiHints) to the override tree
before rendering /debug show, and reuse formatConfigSetValueLabel for the
/debug set acknowledgement, matching the existing /config redaction
contract. Non-secret fields and env placeholders are preserved.
2026-06-16 13:59:28 +08:00
lizeyu-xydt
5afddf547e fix(discord): apply tool status emojis immediately to avoid override by thinking reactions (#93488)
* fix(discord): apply tool status emojis immediately to avoid override by thinking reactions

Tool emoji reactions (🛠️, 🌐, 🔎, etc.) during Discord tool/skill execution
were not appearing because setTool() used a 700ms debounce shared with
setThinking(). Rapid onReasoningStream calls from overlapping reasoning
would repeatedly overwrite the pending tool emoji with 🧠, so the tool
emoji never reached Discord.

Fix by making setTool() apply emojis immediately (skip debounce). Tool
transitions are user-facing state changes that should be visible without
delay, and the terminal done/error transitions already flush any pending
state.

Fixes #92715.

* fix(discord): forward quiet tool lifecycle status

* fix(slack): preserve tool status reactions

* test(channels): type quiet tool lifecycle options

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 13:33:32 +08:00
Goutam Adwant
325d0208d0 fix(ui): add agent selector to skills page (#93487)
* fix(ui): add agent selector to skills page

* test(ui): stabilize skills agent selector checks

* fix(skills): preserve agent-scoped state

* fix(skills): refresh current scope after config updates

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 13:30:25 +08:00
ly-wang19
ca5c3e677a fix(cron): clear delivery routing fields from cron edit (#93495)
* fix(cron): clear delivery routing fields from cron edit

cron edit could set delivery channel/to/thread-id/account but could not unset them: an empty value (e.g. --to "") builds delivery.X = undefined, which is omitted from the JSON-RPC patch, so mergeCronDelivery never sees the key and the field is silently kept. The gateway RPC already accepts an explicit null to clear each field (CronDeliveryPatchSchema + mergeCronDelivery via normalizeOptionalString); the CLI just never sent it.

Add --clear-channel/--clear-to/--clear-thread-id/--clear-account, each emitting null (mirroring the existing --clear-model), with mutual-exclusion guards against the matching set flag and against --webhook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(cron): preserve delivery defaults when clearing routes

* fix(cron): validate cleared prefixed routes

---------

Co-authored-by: ly-wang19 <ly-wang19@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-06-16 13:24:33 +08:00
ooiuuii
9d1dec4678 fix(cli): honor route-first log level (#93460) 2026-06-16 13:15:52 +08:00
Edward Abrams
ef3e5f5e31 perf(plugins): thread prepared manifest plugins through runtime normalization (#85254)
Carry prepared manifest model-id normalization records through the runtime bridge so hot callers reuse existing metadata instead of consulting the snapshot fallback.

The final change preserves the existing no-prepared-record behavior, adds focused forwarding coverage, and removes the one-off proof script before landing.

Thanks @zeroaltitude.

Verification:
- 224 focused tests
- full CI run 27594070734
- real behavior proof run 27594081022
- final whole-branch autoreview clean

Co-authored-by: zeroaltitude <zeroaltitude@gmail.com>
2026-06-16 06:31:36 +02:00
Vincent Koc
6f53f84af3 fix(gateway): normalize paired access lists 2026-06-16 12:31:24 +08:00
wangmiao0668000666
d6eefa191f fix(device-pairing): guard mergeRoles/mergeScopes against non-string entries (#90654) 2026-06-16 12:31:24 +08:00
wangmiao0668000666
481652d78a fix(gateway): guard formatAuditList against non-string items to prevent handshake trim crash (#90654) 2026-06-16 12:31:24 +08:00
Agustin Rivera
300794520b fix(discord): block cross-provider guild admin actions (#93354)
* fix(discord): block cross-provider guild admin actions

* fix(discord): reject cross-provider moderation actions

* fix(discord): preserve manual admin action trust

* fix(discord): align admin action trust guard
2026-06-15 21:28:53 -07:00
Onur Solmaz
8c108c294d fix(agents): honor disabled envelope timestamps at model boundary (#93238)
Merged via squash.

Prepared head SHA: 53f7117a4b
Co-authored-by: osolmaz <2453968+osolmaz@users.noreply.github.com>
Reviewed-by: @osolmaz
2026-06-16 12:13:24 +08:00
Vincent Koc
48d96cd8a1 fix(update): retry launchd handoff recovery 2026-06-16 12:09:01 +08:00
yetval
d1f6ca20a1 fix(update): keep CLI plugin post-update failure behavior unchanged 2026-06-16 12:09:01 +08:00
yetval
c9418b8afd fix(update): restart managed gateway when update handoff fails after stop 2026-06-16 12:09:01 +08:00
Vincent Koc
6ffa0fb348 test(plugins): narrow session extension registry coverage 2026-06-16 11:36:43 +08:00
杨浩宇0668001029
0fb0c2cb8e fix(plugins): keep empty session extension pins authoritative
Pinned session-extension registries now remain the owner even when empty, preventing later active registry churn from leaking agent-owned extensions into the gateway surface.
2026-06-16 11:36:43 +08:00
杨浩宇0668001029
0e71ce1174 test(plugins): cover session extension registry lifecycle
Exercise pinned startup session extensions through WebSocket patching, release cleanup, standalone loading, and active-registry churn.
2026-06-16 11:36:43 +08:00
杨浩宇0668001029
ffa736f713 fix(plugins): satisfy session extension lint 2026-06-16 11:36:43 +08:00
杨浩宇0668001029
b85ae9fb1b fix(plugins): pin session extension registry 2026-06-16 11:36:43 +08:00
Alex Knight
67c80e941e fix(gateway): fall back to managed path when inbound PDF sandbox staging fails (#90097) 2026-06-16 13:19:32 +10:00
Alex Knight
e850750754 fix(media): extract large managed inbound PDFs via media-understanding (#90096, #90097)
Inbound PDF/document text already flows to agents through the canonical
media-understanding pipeline (applyMediaUnderstanding -> extractFileBlocks),
but it inherited the OpenResponses input_file limits (5MB / 4 pages), so large
managed PDFs from channels/Control UI were skipped and locked-down agents saw
only an attachment marker.

- Size inbound file extraction from agents.defaults.mediaMaxMb (default 20MB,
  cap 25MB) and pdfMaxPages (default 20, cap 150) via a new
  resolveFileExtractionLimits; explicit gateway responses.files config still
  wins per-field. (#90096)
- chat.send: let oversized (>5MB) managed inbound PDFs pass through sandbox
  staging with their managed media path instead of a 4xx, so host-side
  extraction reaches sandboxed agents without copying the file into every
  sandbox; non-PDF oversize files are still rejected. (#90097)

Reuses the existing extraction/injection path; no parallel module or extra
prompt-injection sites.
2026-06-16 13:19:32 +10:00
Vincent Koc
7c6ad2327c fix(infra): narrow inherited gateway pid protection 2026-06-16 11:11:25 +08:00
amittell
d88f1bf217 fix(infra): preserve inherited gateway PID across reparent during cleanStaleGatewayProcessesSync
When a child openclaw process is spawned via a backgrounded subshell that
exits before the new process reaches the stale-pid sweep, the new process
is reparented to the supervisor (PID 1 / launchd) and the ancestor walk
in getSelfAndAncestorPidsSync can no longer see the running gateway. The
running gateway then shows up on lsof as an unrelated sibling on the
port and gets SIGKILL'd by cleanStaleGatewayProcessesSync, recreating
the issue #68451 supervisor restart loop across a reparent boundary.

Real-world trigger: a user ~/.zshrc auto-start block
  if ! pgrep -x openclaw-gateway >/dev/null; then
    (openclaw gateway >/dev/null 2>&1 &)
  fi
combined with codex per-turn `zsh -c "set -e; . shell_snapshot"` invocations
caused every chat turn on rh-bot to SIGKILL its launchd-managed gateway,
producing HTTP 000 errors and ~33 kill events captured by a forensic
launchd unified-log tracker before the zshrc was patched.

Fix: gateway-cli captures OPENCLAW_GATEWAY_SERVICE_PID from inherited env
BEFORE overwriting it with process.pid, then threads the captured PID
through cleanStaleGatewayProcessesSync into getSelfAndAncestorPidsSync's
exclusion set. The protection is opt-in per call site so existing
maintainer paths (openclaw update / openclaw doctor restart helpers) keep
their ability to terminate a running gateway intentionally.

The inherited-PID parser is strict positive-integer only: a malformed
inherited env value (`"123abc"`, `"123.4"`, `"0x7b"`, etc.) is rejected
rather than silently protecting PID 123 from cleanup and leaving the
stale listener alive. New focused unit tests cover the parser
contract.

Existing regression tests cover the reparent suicide-kill scenario and
the defensive ignore-non-positive-PID contract on the cleanup side.
2026-06-16 11:11:25 +08:00
Vincent Koc
2b05bd7b0d fix(cli): preserve sessions_yield over MCP 2026-06-16 10:53:58 +08:00
张贵萍0668001030
eea350f2ff fix: preserve yielded CLI lifecycle state 2026-06-16 10:53:58 +08:00
张贵萍0668001030
c8c94e15ad fix(gateway): refresh loopback yield cache lifecycle 2026-06-16 10:53:58 +08:00
张贵萍0668001030
d7a09b13e6 fix(gateway): satisfy lint for MCP yield context 2026-06-16 10:53:58 +08:00
张贵萍0668001030
88e4a0f0d5 fix(gateway): propagate MCP yield session context 2026-06-16 10:53:58 +08:00
Vincent Koc
00160ea6ee fix(workboard): refuse unsafe SSHFS SQLite storage
Preserve rollback journaling for NFS and SMB-backed stores, refuse SSHFS after symlink-aware mount classification, and close Workboard database handles when filesystem policy rejects initialization.
2026-06-16 04:34:14 +02:00
Vincent Koc
ffb67d2d2e fix(qa): suppress empty WhatsApp debug artifacts
Suppress empty WhatsApp gateway-debug artifact publication and keep the public QA run view redacted and consistent across report/evidence output.

Verification:
- Testbox focused WhatsApp QA runtime format/lint/test run passed: https://github.com/openclaw/openclaw/actions/runs/27589031659
- Testbox changed gate passed: https://github.com/openclaw/openclaw/actions/runs/27589128132
- PR CI passed on final head: https://github.com/openclaw/openclaw/actions/runs/27589903708
- git diff --check passed locally
2026-06-16 10:32:53 +08:00
Aniruddha Adak
11a0ad10e9 test: make install-safe-path symlink tests compatible with Windows 2026-06-16 10:12:47 +08:00
Vincent Koc
386b0e6c74 fix(backup): snapshot all live SQLite state
Use transactionally consistent VACUUM INTO snapshots for every state-root SQLite database and exclude original journal sidecars so verified backups cannot restore torn plugin or memory state.
2026-06-16 04:00:43 +02:00
Vincent Koc
ac8a3f367c fix(sqlite): disable WAL on network filesystems 2026-06-16 09:36:32 +08:00
openclaw-clownfish[bot]
8694fe7e81 fix(gateway): block internal HTTP session overrides
Reject HTTP session-key overrides that target reserved internal session namespaces while preserving normal explicit session keys.

Co-authored-by: RichardCao <4612401+RichardCao@users.noreply.github.com>
2026-06-16 09:30:27 +08:00
openclaw-clownfish[bot]
073343e2e2 fix(outbound): ignore schema-padded poll metadata on send
Ignore schema-padded poll metadata on plain send actions unless content-bearing poll fields are present.

Co-authored-by: 鄧 偉程 <148790968+weichengdeng@users.noreply.github.com>
2026-06-16 09:29:16 +08:00
Vincent Koc
c70b9849d9 fix(agents): handle string assistant message content 2026-06-16 09:23:40 +08:00
Shakker
a447f9a43d fix: guard session message cache payloads 2026-06-16 02:08:24 +01:00
Vincent Koc
ea346f4361 fix(sqlite): close databases after failed initialization 2026-06-16 03:00:23 +02:00
Vincent Koc
d5c9e7ea99 test(plugin-sdk): ratchet surface budget checks 2026-06-16 02:56:41 +02:00
Vincent Koc
6326395c0a fix(state): make SQLite sidecar archives retriable
Archive the canonical legacy database before SQLite sidecars, then detect and finish pending sidecar cleanup on retry without reopening the migrated database.
2026-06-16 02:52:29 +02:00