Commit Graph

14712 Commits

Author SHA1 Message Date
Ted Li
b67df3797a fix(telegram): explain disabled plugin approval failures (#95973)
* fix: explain disabled Telegram plugin approvals

* fix: handle disabled Telegram native plugin approvals

* fix: resolve exec approval surface independently

* fix: tie plugin approval setup guidance to plugin surface

* Revert "fix: tie plugin approval setup guidance to plugin surface"

This reverts commit 34e3c10e23.

* fix: gate plugin approval setup guidance

* fix: gate plugin approval availability by delivery

* fix: preserve plugin approval approver auth

* fix: make plugin setup guidance explicit

* test: trim approval guidance proof radius

* Avoid setup guidance on routed approval timeout

* Carry plugin approval delivery route into timeouts

* Keep turn-source approval route visible

* fix(approvals): prefer delivered approval clients

* fix(approvals): prefer delivered approval clients

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-02 14:15:25 -07:00
Allen Hurff
968aa51b80 [codex] fix(memory-lancedb): align apache arrow peer dependency (#99118)
* fix(memory-lancedb): align apache arrow peer dependency

* fix(memory-lancedb): refresh arrow dependency graph

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-07-02 15:59:13 -05:00
Peter Lee
2d764dd8fe fix(feishu): preserve button command values in fallback text and add Feishu comment guidance with callback privacy (#94385)
* fix(interactive): preserve button command values in fallback text for degraded approval UX

* fix(interactive): keep callback values private in fallback text and narrow Feishu interactive detection

- P1: Skip rendering action.type === "callback" values in
  renderMessagePresentationFallbackText to avoid leaking opaque
  channel/plugin data into user-visible text. Command and legacy
  values are still rendered.
- P2: Replace hasMessagePresentationBlocks/hasInteractiveReplyBlocks
  with isMessagePresentationInteractiveBlock so Feishu comment
  guidance only appears when the presentation actually contains
  buttons or selects, not for text-only blocks.
- Update tests: callback button now shows label-only; all 137 tests pass.

* fix(interactive): only render typed command values in fallback text, keep legacy value private

* fix(feishu): gate document-comment command guidance on actual command action

* docs(message-presentation): document command/callback value fallback visibility

* fix(feishu): omit command guidance when URL overrides fallback command text

* docs: regenerate docs_map.md

* fix(interactive): exclude disabled buttons from fallback command rendering and guidance

* fix(interactive): extract hasRenderedCommandAction, exclude disabled buttons from command fallback

* fix(feishu): preserve command guidance marker through core presentation rendering

* fix(feishu): type-narrow channelData.feishu with isRecord before reading rendered-command marker

* fix(feishu): move hasRenderedCommandAction from public SDK into Feishu plugin as local helper

Keep the helper local to the only caller (Feishu outbound) instead of
adding a new public plugin SDK API contract. The shared fallback renderer
in renderMessagePresentationFallbackText already inlines the same
command-visibility logic; a local helper is sufficient for the Feishu
comment-thread guidance gate.

* refactor(feishu): tighten fallback command marker

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-02 12:42:31 -07:00
Ayaan Zaidi
dad7768da8 docs(telegram): document group history removal 2026-07-02 09:22:59 -07:00
Ayaan Zaidi
b07fd6f1b4 fix(telegram): keep group history always on 2026-07-02 09:22:59 -07:00
Ayaan Zaidi
5fc9b20d24 fix(gemini): stage CLI auth inside run queue
Fixes #98945
2026-07-02 08:49:40 -07:00
Pavan Kumar Gondhi
5bcd25f0fb fix(discord): gate guild metadata reads [AI] (#98966)
* fix(discord): gate guild metadata reads

* fix(discord): require guild-wide active thread reads
2026-07-02 15:26:36 +05:30
areslp
22d686d13e fix(feishu): include video upload duration (#98235) 2026-07-02 02:28:21 -07:00
qingminlong
a741956448 fix(mattermost): paginate peer directory members (#98877) 2026-07-02 00:40:24 -07:00
Peter Steinberger
2913d3aee9 fix(anthropic): restore Fable 5 Vertex simple completions (#98932)
* fix(anthropic): restore Fable 5 Vertex simple completions

* test(agents): satisfy custom API model types

* test(ci): route reliability test from temp helper

* test(agents): satisfy custom API model types
2026-07-02 07:16:39 +01:00
Vincent Koc
4d7d34e6a5 fix(qa-matrix): accept final command preview edits 2026-07-01 23:15:33 -07:00
Vincent Koc
75240f4385 fix(qa-matrix): read account state from sqlite 2026-07-01 22:56:12 -07:00
rabsef-bicrym
c8dba85b5d fix: keep Telegram outbound context on transcript time (#98769) 2026-07-01 22:15:10 -07:00
Omar Shahine
8c7ac9b9b9 fix(imessage): native poll vote-cue, echo suppression, and same-sender comment fold
Makes native iMessage polls behave correctly end to end.

What changed:
- Inbound polls render with a numbered-options vote cue so the agent casts a native vote instead of answering the poll in prose.
- poll-vote resolves the poll reference from pollId/pollGuid/messageId and now defaults to the current inbound poll message when the model omits it; still errors when no reference exists.
- poll-vote echo suppression is session-scoped, so the redundant spoken answer is dropped across the separate poll and comment runs.
- A poll's inline-reply caption is folded (not delivered as a standalone question) only when the poll creator and reply sender are both known and equal; unknown/mismatched sender falls through to the normal inbound decision gate, so no inbound reply is silently dropped.

Evidence:
- 64 passing tests in the poll suites (poll-comment, poll-render, actions), incl. sender fail-closed regressions; pnpm build clean.
- Two Codex autoreviews clean (patch is correct); ClawSweeper re-review rated it platinum hermit.
- Live-verified on macOS 26.4.1 on the deployed gateway: poll "What color pill?" -> native vote delivered with a 7333-byte payload, caption folded, zero echo.

Note: vote delivery also depends on the imsg vote-stamp fix (openclaw/imsg#150); OpenClaw ships ahead of imsg per owner decision.
2026-07-01 21:30:29 -07:00
Dave Nicoll
6e79ca3cbc fix(fal): route grok-imagine and nano-banana-2-lite edits to correct endpoints (#98688)
* fix(fal): route grok-imagine and nano-banana-2-lite edits to correct endpoints

The fal image-generation provider appends '/image-to-image' to any model
that isn't 'openai/gpt-image-*' or 'fal-ai/nano-banana-*' when reference
images are supplied. That's wrong for two models fal serves:

- `xai/grok-imagine-image`: fal 404s on '/image-to-image'. The real edit
  endpoint is '/quality/edit'. The endpoint also expects lowercase
  resolution values ('1k'/'2k' only) and a distinct aspect_ratio enum.

- `google/nano-banana-2-lite`: fal 404s on '/image-to-image'. The real
  edit endpoint is '/edit'. The endpoint does not accept a 'resolution'
  parameter.

Add schema entries for both models so ensureFalModelPath and
applyFalImageGeometry pick the right suffix and body shape. Introduce
resolution allowlist support ('resolutions: readonly string[]') and
lowercase transform ('resolutionCase: "lower"') on the schema; existing
schemas keep their behaviour (nb2 still forwards uppercase resolution
unchanged; flux/gpt-image/nb2/krea untouched). Refactor
ensureFalModelPath to consult schema.appendEditPath instead of hardcoded
prefix checks so future models only need a schema entry.

Tested:
- Existing 49 fal unit tests still pass; added 9 new tests covering the
  two new endpoints and their guard conditions (32 -> 34 tests in the
  image-generation-provider suite).
- Live fal.ai calls confirm both endpoints return 200 with real
  reference images; the buggy old URLs still return 404.

* fix(fal): preserve standard edit routing

* fix(image): apply inferred resolution per model

* fix(image): preserve provider reference limits

* fix(image): resolve reference limits per model

* fix(fal): preserve nano banana family limits

* test(ios): stub generated file list helper

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-01 20:42:25 -07:00
Ayaan Zaidi
6a96bbc7ad fix(telegram): keep timed-out webhook lanes guarded (#98806) 2026-07-01 20:33:38 -07:00
Ayaan Zaidi
2643c8cbfb fix(telegram): stop rate-limiting authenticated webhook traffic 2026-07-01 20:33:38 -07:00
Ayaan Zaidi
ac10e6bff5 fix(telegram): close webhook and evicted probe transports 2026-07-01 20:33:38 -07:00
Ayaan Zaidi
b23500a935 fix(telegram): retry transient webhook startup init errors 2026-07-01 20:33:38 -07:00
Ayaan Zaidi
b7ec2851f3 fix(telegram): spool webhook updates durably before acking Telegram 2026-07-01 20:33:38 -07:00
Ayaan Zaidi
13613ecaf1 fix(telegram): align account inspection default routing 2026-07-01 20:29:18 -07:00
yetval
85771aec05 fix(telegram): honor configured defaultAccount for omitted-account sends and actions
When no accountId was provided, resolveTelegramAccount and resolveTelegramToken
resolved the implicit default account first. Any leftover TELEGRAM_BOT_TOKEN or
top-level channels.telegram.botToken then shadowed the configured
channels.telegram.defaultAccount and default-agent binding, so gateway sends,
heartbeats, and message actions went out through the wrong bot and typically
failed with chat not found in groups the stale bot never joined. Message
actions could also fail with a missing-token error when only the named default
account had a token.

Resolve the configured default account id up front in both optional-account
entry points, matching the nextcloud-talk resolver and createTelegramActionGate.
2026-07-01 20:29:18 -07:00
Vincent Koc
1f38396239 test(memory): align dreaming corpus promotion expectations 2026-07-01 20:26:18 -07:00
Vincent Koc
1fcce9f1ee test(vercel-ai-gateway): complete guarded fetch fixtures 2026-07-01 19:49:38 -07:00
Vincent Koc
76db9a3376 fix(memory-wiki): preserve guarded collision handling 2026-07-01 19:49:38 -07:00
Vincent Koc
cc76e06e7a test(plugins): align release fixtures with runtime contracts 2026-07-01 18:34:53 -07:00
Yuval Dinodia
db6a3c2e87 fix(memory-wiki): retry transient existing-page reads in wiki_apply and chatgpt import (#98787)
* fix(memory-wiki): retry transient existing-page reads in wiki_apply and chatgpt import

A create_synthesis re-run and a ChatGPT conversations re-import swallowed
every existing-page read error and treated the page as brand-new, so one
transient read failure silently emptied the user's ## Notes block and
dropped hand-added frontmatter. Route both reads through a retry-once
helper that treats only a missing page as new and propagates persistent
failures, matching the ingest and imported-source fix from #98360.

* fix(memory-wiki): preserve fs-safe policy failures

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-01 18:19:49 -07:00
wangmiao0668000666
a7a444e7ef fix(nostr): clear per-relay publish timeout timer to prevent dangling handles (#98720) 2026-07-01 18:10:38 -07:00
Vincent Koc
c0511692d8 test(plugins): repair prerelease validation fixtures 2026-07-01 18:02:09 -07:00
lsr911
050e1f3b5c fix(discord): guard JSON.parse against malformed API response bodies (#97889)
* fix(discord): guard JSON.parse against malformed API response bodies

Wrap JSON.parse(text) in requestDiscord with try/catch to prevent a malformed Discord API response body from throwing an unhandled SyntaxError and crashing the process. On parse failure, throw a DiscordApiError with a descriptive message so the caller can handle it gracefully.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* fix(clawsweeper): address review for automerge-openclaw-openclaw-97889 (validation-1)

* chore: trigger CI re-run for flaky checks-node-compact-small-whole-2

Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* chore: trigger CI re-run for flaky runtime-inventory-drift-check

Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* chore: trigger CI re-run for flaky checks-node-compact-large-whole-1

Signed-off-by: lsr911 <liao.shirong@xydigit.com>

* fix(discord): guard JSON.parse against malformed API response bodies

* fix(discord): guard JSON.parse against malformed API response bodies

---------

Signed-off-by: lsr911 <liao.shirong@xydigit.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
2026-07-01 17:50:01 -07:00
Peter Steinberger
27104c1afb fix(codex): preserve app approvals in side forks (#98812)
Co-authored-by: Peter Steinberger <58493+steipete@users.noreply.github.com>
2026-07-02 01:42:28 +01:00
zhangLei99586
273729bd95 fix(browser): guard setDeep against empty keys array (#98138)
When keys is empty, keys[keys.length - 1] returns undefined, and the
previous ??  fallback would silently create a property with an empty
string key on the target object. Add an early return so empty keys are
a no-op instead of silently polluting the object.
2026-07-01 17:29:56 -07:00
Ayaan Zaidi
3558391a75 docs(telegram): move maintainer decisions into scoped AGENTS.md 2026-07-01 17:19:16 -07:00
Ayaan Zaidi
f8769559ae fix(telegram): honor long flood-wait retry_after on outbound sends 2026-07-01 16:22:34 -07:00
Ayaan Zaidi
fd18e39e51 fix(telegram): drop rejected native quotes instead of failing the send 2026-07-01 16:22:34 -07:00
Ayaan Zaidi
a53833e842 fix(telegram): fall back to plain captions when Telegram rejects caption HTML 2026-07-01 16:22:34 -07:00
Ayaan Zaidi
6ef0abbaae fix(telegram): fall back to plain text when rich entities are rejected on the durable send path 2026-07-01 16:22:34 -07:00
Ayaan Zaidi
55d31beeef fix(telegram): age-gate retry-limit spool tombstones (#98776) 2026-07-01 15:32:00 -07:00
Ayaan Zaidi
ce9ec4e1c3 fix(telegram): tombstone completed spooled updates to dedupe refetches 2026-07-01 15:32:00 -07:00
Ayaan Zaidi
eb41c7d2d3 fix(telegram): requeue spooled replays on transient store errors 2026-07-01 15:32:00 -07:00
Ayaan Zaidi
8dbcf6db16 fix(telegram): back off and dead-letter poisoned spooled updates 2026-07-01 15:32:00 -07:00
Ayaan Zaidi
5a10a29807 fix(telegram): retry transient getUpdates API errors in ingress worker 2026-07-01 15:24:05 -07:00
Ayaan Zaidi
abaef63a35 fix(telegram): persist only new sent-message cache entries 2026-07-01 15:24:05 -07:00
Kevin Lin
d9b5afad18 fix(codex): rename destructive approval mode to ask (#98501)
* fix(codex): rename destructive approval mode to ask

* fix(codex): keep ask reviewer app-scoped

* test: fix current-main CI regressions
2026-07-01 15:14:55 -07:00
Ayaan Zaidi
44e88f550b fix(telegram): keep media retry policy local 2026-07-01 13:05:42 -07:00
luoyanglang
f9d7afda10 fix(telegram): narrow durable inbound media retry to transient + abort (#98076)
Review on #98102: the durable-retry classifier treated every MediaFetchError
`fetch_failed` as retryable, but `fetch_failed` also covers permanent failures
(SSRF/guard denials, local Bot API path/read errors). On spooled replay those
would requeue forever with the user-facing warning suppressed.

Move the policy to its owner: add `isDurablyRetryableMediaFetchError` to
`src/media/fetch.ts`, defined as `shouldRetryMediaFetch` (the canonical in-loop
transient policy) plus shutdown/abort `fetch_failed`. A restart-window abort is
the primary inbound-media loss vector and is recoverable on replay, whereas
in-loop retry mid-shutdown is futile; permanent `fetch_failed`, other 4xx, and
size limits stay non-retryable so they cannot loop in the spool.

Telegram reuses the shared helper instead of a local classifier
(`isAbortError`/`isTransientNetworkError` live in core; the classification must
not drift). Adds permanent-`fetch_failed` regression coverage at the unit and
behavioral level. Media-group partial delivery (#55216) unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 13:05:42 -07:00
luoyanglang
14a6cd9ee6 fix(telegram): durably retry inbound media dropped during restart (#98076)
A single-message inbound media fetch failure was handled best-effort: warn
and let the update complete, so bot-core acked the spooled update. During a
restart window the warning send also failed and the document was silently
lost with no durable retry.

Classify transient media fetch failures (network/abort fetch_failed and
408/429/5xx HTTP) and record them as failed-retryable, so spooled-replay
updates are kept and re-driven by the ingress spool with backoff instead of
acked. Live updates still ack and warn; permanent failures (size limit, 4xx)
stay best-effort. The retry notice is suppressed on spooled replay to avoid
repeating it on each replay.

The durable-retry classifier deliberately diverges from media/fetch.ts
shouldRetryMediaFetch on shutdown aborts: in-loop retry of a shutdown abort
is futile, but durable re-spool must retry it -- that abort is the primary
restart-window loss vector. Media-group partial delivery (#55216) is left
unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 13:05:42 -07:00
Peter Steinberger
24d94a54a5 fix: migrate QQBot credential backups to SQLite KV (#89597)
* fix: migrate qqbot credential backups to sqlite kv

* fix: complete qqbot sqlite migration cleanup

* fix: harden qqbot doctor state migration
2026-07-01 20:03:59 +01:00
Mark
5db7c3797d Fix Telegram plugin callback routing (#97174)
* fix telegram plugin callback routing

* Add Telegram callback proof coverage

* Fix proof script lint

* Fix Telegram proof CI regressions

* test: fix telegram callback proof CI regressions

* fix: retire registry-owned callbacks

* fix: retire registry-owned callbacks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-01 19:49:54 +01:00
Agustin Rivera
fe43343af0 fix(nvidia): use Nemotron Super 1M context (#98726)
* fix(nvidia): correct Nemotron Super context
2026-07-01 11:46:06 -07:00