Commit Graph

73831 Commits

Author SHA1 Message Date
Vincent Koc
69f10e72f2 fix(ollama): retry unreachable setup in place (#116210) 2026-07-30 12:23:56 +08:00
Yuval Dinodia
4e5bf66fb1 fix(whatsapp): silently drops inbound messages when more than 450 are waiting (#116179)
* fix(whatsapp): silently drops inbound messages when more than 450 are waiting

WhatsApp asked the shared ingress monitor to enforce a 450-entry cap and a
30-day TTL on pending durable ingress rows. Pending rows are undelivered work,
not history, and the monitor runs retention before its first claim, so an
account holding 451 accepted messages lost the oldest one to a hard DELETE
before it could ever be dispatched. Loss scaled linearly with backlog depth and
left no tombstone, no failure record, and no retained payload.

Drop pendingTtlMs and pendingMaxEntries from the WhatsApp retention config.
Completed and failed retention is unchanged so on-disk history stays bounded,
and the config now matches every other channel on the shared monitor, whose
defaults cover completed and failed only. The two values were carried over
mechanically from the pre-SQLite openKeyedStore replay-guard cache in
b0679d1f13 and inlined verbatim in #115824.

Add regression coverage driving the real monitor and the real SQLite ingress
queue over 451 accepted records.

* test(whatsapp): cover pending ingress retention

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 12:20:27 +08:00
Vincent Koc
b2136fa234 fix(test): serialize transcript mirror dirty-state setup (#116207) 2026-07-30 12:12:55 +08:00
Vincent Koc
58b4b94304 test(openai): verify superseded consult handoff 2026-07-30 12:11:06 +08:00
Vincent Koc
6b37d46b17 fix(openai): bound GPT-Live delegation work 2026-07-30 12:11:06 +08:00
Peter Steinberger
4430f8ecfd fix(e2e): use account home for daemon switch (#116217) 2026-07-29 21:06:38 -07:00
Vincent Koc
cb75290edb fix(macos): serialize voice wake trigger sync (#116202) 2026-07-30 12:01:26 +08:00
xingzhou
cc48aef143 fix(beam): prevent mirror retries from stalling on slow responses (#116174)
* fix(beam): release mirror upload responses

* test(beam): cover response cancellation failures

* fix(buzz): repair typing indicator contracts

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 11:33:22 +08:00
Vincent Koc
fa0bced544 fix(macos): preserve voice ear boost expiry (#116196) 2026-07-30 11:19:25 +08:00
Eden
9c6e06b557 fix(auto-reply): deliver ingress-retried messages after their queued run is dropped (#115891)
* fix(auto-reply): deliver ingress-retried messages after their queued run is dropped

* fix(auto-reply): key queued dedupe release by adoption lifecycle

Overflow-summary compaction clones a queued run onto a new object, so a
release keyed by the run object missed runs completed via their clone and
the ingress retry stayed suppressed on the summarize drop policy. The
adoption lifecycle reference survives cloning and already keys admission
state, so it is the identity the release must use.

* fix(auto-reply): guard queued dedupe ownership

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 11:19:01 +08:00
Shakker
e7d01b511b style: format dynamic route coverage (#116197) 2026-07-30 04:04:07 +01:00
Shakker
f645327c8e docs: clarify dynamic deep link loading 2026-07-30 04:04:07 +01:00
Shakker
6aae5c184f test: cover dynamic route startup reconnect 2026-07-30 04:04:07 +01:00
Shakker
e2ae02a0c4 refactor: keep dynamic route identity page-owned 2026-07-30 04:04:07 +01:00
Shakker
40a5d31782 docs: note dynamic deep link loading 2026-07-30 04:04:07 +01:00
Shakker
5285b28c5e fix: load dynamic deep links once 2026-07-30 04:04:07 +01:00
Peter Steinberger
9c3503a443 fix(e2e): use default state for daemon switch (#116190) 2026-07-29 20:02:19 -07:00
Shakker
7420682163 docs: clarify Buzz typing cadence (#116194) 2026-07-30 03:59:34 +01:00
Shakker
980fbf5f4e docs: document Buzz typing indicators 2026-07-30 03:59:34 +01:00
Shakker
c49bfa7382 feat: add Buzz typing indicators 2026-07-30 03:59:34 +01:00
Vincent Koc
86d300a3cb fix(macos): stop canceled voice wake timers (#116189) 2026-07-30 10:55:34 +08:00
Vincent Koc
859280ee11 fix(macos): coalesce location permission requests (#116183) 2026-07-30 10:41:51 +08:00
Vincent Koc
5128df0cdd fix(macos): guard remote tunnel restart ownership (#116172) 2026-07-30 10:29:33 +08:00
wangmiao0668000666
b942db4d56 fix(agents): throw CompactionError when summarization fails (#115500)
* fix(agents): throw CompactionError when summarization fails

Transform compaction summarization from silent infinite failure loops
into clear, actionable errors.

Previously, when all summarization attempts failed, summarizeWithFallbackResult
returned a generic fallback string blaming "size limits". This caused:
- Misleading error messages (auth/network errors reported as "size limits")
- Callers unable to distinguish real summaries from failures
- Silent infinite retry loops where token counts climbed indefinitely

Now, CompactionError is thrown with the original error details preserved.
Callers immediately know compaction failed and can take appropriate action
(switch model, notify user, etc.).

Fixes #115413

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* fixup: export CompactionError from agent-core index, remove dead code

* fixup: address ClawSweeper review - keep CompactionError internal, track last error, add failure-proof test

* fixup: type corrections in failure-proof test

* fixup: type annotate failure-proof messages as UserMessage[]

* fixup: avoid possibly-undefined array access in failure-proof test

* test(agents): prove compaction provider failure cancellation

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 10:28:01 +08:00
Vincent Koc
3016666e5c fix(test): isolate ACP startup output stream (#116076) 2026-07-30 10:27:19 +08:00
Yuval Dinodia
cee6203f44 fix(agents): deny all tools when scheduled authority names a removed account (#115932)
* fix(agents): deny all tools when scheduled authority names a removed account

resolveGroupToolPolicy returned { allow: [] } as its fail-closed sentinel
when a scheduled run named a channel account that is no longer configured.
The runtime matcher treats an empty allowlist as "allow everything not
denied", so revoking the creator account widened the scheduled tool surface
to the full set including exec and apply_patch instead of denying it.

The sentinel now carries an explicit wildcard deny, which the matcher and
the plugin-harness native-tool clamp both honor.

* test(agents): cover scheduled-run tool denial after owner account removal

Adds capability-profile level coverage that a scheduled run whose named
owner account was removed resolves to a deny-all group policy, exercising
the scheduled-authority handoff from resolveConversationCapabilityProfile
through resolveRequesterToolPolicies into resolveGroupToolPolicy.

* fix(gateway): enforce scheduled account authority for loopback tools

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 10:24:53 +08:00
Vincent Koc
3672ab6fa1 fix(test): stop collecting Vydra test helpers (#116139) 2026-07-30 10:19:42 +08:00
Vincent Koc
b660662e01 fix(discord): preserve webhook deadline errors (#116155) 2026-07-30 10:17:47 +08:00
Vincent Koc
0370fce7ff fix(test): isolate Google embedding batch timeout (#116161) 2026-07-30 10:11:29 +08:00
Riive
82af1bf7d4 fix(cron): stop replaying old schedule slots after a cron job is edited (#115779)
* fix(cron): bound restart catch-up to the active schedule

Editing a recurring job's schedule made the gateway fire it immediately on
the next restart. Startup catch-up compares the new schedule's previous slot
against lastRunAtMs, which still belongs to the retired schedule, so a slot
that never existed under the old schedule counted as missed.

Record when scheduling inputs take effect and replay a missed slot only when
it is newer than that. Jobs whose schedule never changed carry no stamp and
keep replaying every computed slot, so catch-up is unchanged for them.

The missed-slot predicate was duplicated in the runnable check and the
backoff-deferral pass; both now share one helper so the bound cannot drift.

Fixes #91944

* fix(cron): protect schedule activation ownership

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 10:07:13 +08:00
Vincent Koc
18e107f494 fix(plugins): report request timeouts for stalled response bodies (#116166)
* fix(openai): preserve device-code request timeouts

* fix(msteams): preserve SharePoint upload timeouts

* fix(qqbot): preserve channel API request timeouts
2026-07-30 10:03:39 +08:00
Peter Steinberger
5a3c3b3f4f fix(ci): explicitly serialize hosted Swift tests (#116167) 2026-07-29 18:55:37 -07:00
Vincent Koc
d5e3c68632 fix(daemon): block conflicting systemd gateway owners (#116162) 2026-07-30 09:53:38 +08:00
Vincent Koc
51f9f061f0 docs(config): clarify user timezone contract (#116160) 2026-07-30 09:49:18 +08:00
Vincent Koc
12e5eb6a23 fix(ui): clarify model setup flows (#116086) 2026-07-30 09:47:57 +08:00
joshavant
21db50efc7 refactor(whatsapp): keep inbound boundary transport-private 2026-07-29 20:34:55 -05:00
Vincent Koc
5c296b5a54 fix(whatsapp): preserve injected listener normalization 2026-07-29 20:34:55 -05:00
Vincent Koc
f970e5093b refactor(channels): add portable inbound boundary 2026-07-29 20:34:55 -05:00
Vincent Koc
f4969c33d9 fix(sessions): migrate legacy transcripts during SQLite import (#116077) 2026-07-30 09:28:47 +08:00
Vincent Koc
636d7705c4 fix(feishu): preserve source time in message envelopes (#116156) 2026-07-30 09:27:01 +08:00
Vincent Koc
ffa99ca81d fix(docker): validate timezone in runtime image (#116153) 2026-07-30 09:19:01 +08:00
Peter Steinberger
ec46d30fbf fix(codex): preserve requester across approval bridge (#116152) 2026-07-29 18:16:51 -07:00
xin zhuang
2e1bf01f51 fix(config): allow explicit main agent bindings when agents.list is non-empty (#89419)
* fix(config): preserve explicit main route bindings

* fix(config): preserve configured main-like agent bindings

* test(routing): cover implicit main roster precedence

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 09:15:44 +08:00
Vincent Koc
d9565bf677 fix(mattermost): honor configured envelope timezone (#116145) 2026-07-30 09:14:40 +08:00
Yuval Dinodia
772235cc55 fix(memory-core): stop MEMORY.md compaction from deleting user headings (#116057)
* fix(memory-core): stop MEMORY.md compaction from deleting user headings

parseMemoryBlocks segmented MEMORY.md only on "## ", so a user heading of
any other level did not close the promotion section above it. The section
ran on to the next "## " heading or EOF, and dropping it to fit the budget
deleted the user text it had swallowed, with no backup and no diagnostic.

Close the current block on any ATX heading, keeping the generator's own
"### Global" and "### Project: <key>" subheadings inside the promotion
body so multi-project sections stay droppable whole.

* fix(memory-core): identify generated promotion subsections by their entry marker

The first exception treated every "### Global" and "### Project: <key>"
heading under a promotion block as dreaming-owned, so a user who wrote one
of those headings themselves still lost it to compaction, which is the same
data-loss class this change set out to fix.

A generated subsection always leads with an openclaw-memory-promotion entry
marker comment, so require that marker as the next non-blank line before
treating the heading as part of the promotion body. User headings that
collide with the generated names now terminate the block and survive.

* fix(memory-core): recognize tab-delimited and empty ATX headings

The heading detector required a literal ASCII space after the opening #
sequence. CommonMark also allows a tab or end of line, so a user note
starting with a tab-delimited heading stayed inside the promotion block
above it and was deleted when compaction dropped that block.

Accept a space, a tab, or end of line after the # sequence. The generated
subsection pattern stays space-only because that is what buildPromotionSection
emits, so a tab-delimited heading is user-authored and is preserved.

* fix(memory-core): preserve Setext headings during compaction

Setext headings were still absorbed into the generated promotion block above them, so dropping that block could silently delete durable user notes. Move the heading paragraph into a preserved block when its underline is encountered, while keeping marker-backed generated content compactable.

* fix(memory-core): preserve indented ATX headings

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 09:13:57 +08:00
QiuYuang
87c71cf0ab fix(voice-call): reject malformed telnyx timestamps (#107565) 2026-07-30 09:12:10 +08:00
Vincent Koc
2d9cf7b6d1 improve(ui): guide optional channel setup after model setup (#116078) 2026-07-30 09:08:07 +08:00
Vincent Koc
3f918d4b3c fix(hooks): honor user timezone in session memory (#116136) 2026-07-30 09:04:52 +08:00
Yuval Dinodia
8ce1e18d2f fix(agents): apply_patch rewrites bytes on hunk context lines (#116128)
* fix(agents): apply_patch rewrites bytes on hunk context lines

A fuzzy apply_patch update replaced the entire matched span with the
model-authored patch text, so trailing whitespace, typographic punctuation,
and tab indentation on lines the hunk marked as context were overwritten
while the tool reported plain success.

The parser now records which emitted lines came in as context and which old
line each one came from, and the update applier keeps the file's own bytes
for those lines. Added and removed lines are still written from the patch.

* test(agents): cover apply_patch context preservation

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-30 09:04:04 +08:00
Brian Snyder
cce8a21492 fix(codex): accept finalizer prompt echoes (#116044)
Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
2026-07-30 09:03:01 +08:00