Sebastian
f7d2e15a2e
test: stabilize infra tests
2026-02-16 22:37:34 -05:00
Sebastian
b7cf28f407
test(docker): cover browser install build arg
2026-02-16 22:35:27 -05:00
Sebastian
826e62a3bc
fix(sessions): purge deleted transcript archives
2026-02-16 22:35:27 -05:00
Sebastian
52b624ccae
fix(doctor): audit env-only gateway tokens
2026-02-16 22:35:27 -05:00
Sebastian
bfaa03981b
test(voice-call): cover stream disconnect auto-end
2026-02-16 22:13:08 -05:00
Sebastian
78c3e5166b
test(telegram): cover getFile file-too-big errors
2026-02-16 22:10:59 -05:00
Sebastian
def0254169
test(session): cover stale threadId fallback
2026-02-16 22:08:51 -05:00
Sebastian
81fd771cb9
fix(gateway): preserve chat.history context under hard caps
2026-02-16 21:50:01 -05:00
Sebastian
3df8305cb6
fix(ui): gate sessions refresh on successful delete
2026-02-16 21:46:04 -05:00
Sebastian
391796a3fb
fix(agents): restore multi-image image tool schema contract
2026-02-16 21:34:27 -05:00
Peter Steinberger
1f850374f6
fix(gateway): harden channel health monitor recovery
2026-02-17 03:26:26 +01:00
Sebastian
f7e75d2c5c
fix(doctor): repair googlechat open dm wildcard auto-fix
2026-02-16 21:25:35 -05:00
Sebastian
0aa28c71ca
fix(doctor): move forced exit to top-level command
2026-02-16 21:20:05 -05:00
Peter Steinberger
fb6e415d0c
fix(agents): align session lock hold budget with run timeouts
2026-02-17 03:10:36 +01:00
Peter Steinberger
9789dfd95b
fix(ui): correct usage range totals and muted styles
2026-02-17 03:04:00 +01:00
Sebastian
4ca75bed56
fix(models): sync auth-profiles before availability checks
2026-02-16 21:00:59 -05:00
Sebastian
fbda9a93fd
fix(failover): align abort timeout detection and regressions
2026-02-16 21:00:27 -05:00
Peter Steinberger
f242246839
fix(subagents): pass group context in /subagents spawn
2026-02-17 03:00:01 +01:00
Sebastian
2b3ecee7c5
fix(actions): layer per-account gate fallback
2026-02-16 20:59:30 -05:00
Sebastian
3518554e23
fix(heartbeat): bound responsePrefix strip for ack detection
2026-02-16 20:56:55 -05:00
Peter Steinberger
c219c85df3
docs(changelog): record PR 18608 fixups
2026-02-17 02:56:45 +01:00
Sebastian
bbb5fbc71f
fix(scripts): harden Windows UI spawn behavior
2026-02-16 20:49:09 -05:00
Sebastian
3fff266d52
fix(session-memory): harden reset transcript recovery
2026-02-16 20:39:06 -05:00
Sebastian
f818de7bef
docs(changelog): note slack forwarded attachment hotfix
2026-02-16 20:38:03 -05:00
Sebastian
3793424f5f
docs(changelog): note process kill-tree hotfix
2026-02-16 20:37:22 -05:00
Sebastian
67250f059a
fix(slack): scope attachment extraction to forwarded shares
2026-02-16 20:37:08 -05:00
Peter Steinberger
c20ef582cb
fix: align cron session key routing ( #18637 ) (thanks @vignesh07)
2026-02-17 01:54:59 +01:00
Rodrigo Uroz
6b3e0710f4
feat(memory): Add opt-in temporal decay for hybrid search scoring
...
Exponential decay (half-life configurable, default 30 days) applied
before MMR re-ranking. Dated daily files (memory/YYYY-MM-DD.md) use
filename date; evergreen files (MEMORY.md, topic files) are not
decayed; other sources fall back to file mtime.
Config: memorySearch.query.hybrid.temporalDecay.{enabled, halfLifeDays}
Default: disabled (backwards compatible, opt-in).
2026-02-16 23:59:19 +01:00
Rodrigo Uroz
fa9420069a
feat(memory): Add MMR re-ranking for search result diversity
...
Adds Maximal Marginal Relevance (MMR) re-ranking to hybrid search results.
- New mmr.ts with tokenization, Jaccard similarity, and MMR algorithm
- Integrated into mergeHybridResults() with optional mmr config
- 40 comprehensive tests covering edge cases and diversity behavior
- Configurable lambda parameter (default 0.7) to balance relevance vs diversity
- Updated CHANGELOG.md and memory docs
This helps avoid redundant results when multiple chunks contain similar content.
2026-02-16 23:59:19 +01:00
David Szarzynski
59eac34c2b
changelog: add channel health monitor entry
2026-02-16 23:53:35 +01:00
Yaroslav Boiko
c7681c3cff
test(media-dedup): add missing coverage for Discord media dedup wiring
...
Cover three integration points where media dedup could silently regress:
- trimMessagingToolSent FIFO cap at 200 entries
- buildReplyPayloads media filter wiring (new test file)
- followup-runner messagingToolSentMediaUrls filtering
2026-02-16 23:51:51 +01:00
Gustavo Madeira Santana
d35172cce5
docs: add changelog entry for Telegram media placeholder fix
2026-02-16 23:50:59 +01:00
Peter Steinberger
21e5c0ce57
chore: reorder latest changelog bullets by user impact
2026-02-16 23:27:23 +01:00
Vignesh Natarajan
4e930db432
fix: guard reminder note ( #18588 ) (thanks @vignesh07)
2026-02-16 14:13:17 -08:00
Seb Slight
0f6b39ea57
Docs/Changelog: add missing entry for #18586 ( #18604 )
...
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 5134983645
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com >
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com >
Reviewed-by: @sebslight
2026-02-16 17:10:14 -05:00
pip-nomel
1567d6cbb4
feat(discord): download attachments from forwarded messages ( #17049 )
...
Co-authored-by: Shadow <shadow@openclaw.ai >
2026-02-16 15:23:40 -06:00
Shadow
c593709d25
Discord: add per-button component allowlist
2026-02-16 15:15:00 -06:00
Shadow
05a83b9e97
Discord: add reusable component option
2026-02-16 14:22:49 -06:00
Shadow
fc60336c18
Discord: add native exec options
2026-02-16 14:18:17 -06:00
Sk Akram
e5eb5b3e43
feat: add stuck loop detection and exponential backoff infrastructure for agent polling ( #17118 )
...
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: eebabf679b
Co-authored-by: akramcodez <179671552+akramcodez@users.noreply.github.com >
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com >
Reviewed-by: @gumadeiras
2026-02-16 15:16:35 -05:00
Shadow
3646625dc1
Infra: skip Discord text exec approvals
2026-02-16 13:53:12 -06:00
zerone0x
81d2a91a90
fix(discord): send initial message for non-forum thread creation ( #18117 )
...
Co-authored-by: Shadow <shadow@openclaw.ai >
2026-02-16 13:48:46 -06:00
victor-wu.eth
7c240a2b58
feat(discord): faster reaction status state machine (watchdog + debounce) ( #18248 )
...
* fix(discord): avoid unnecessary message fetches in reaction notifications
* style(discord): format reaction listener for CI
* feat(discord): add reaction status machine and fix tool/final wiring
* fix(discord): harden reaction status transitions and cleanup
* revert(discord): restore status-machine flow from 0a5a72204
* fix(auto-reply): restore lifecycle callback forwarding for channels
* chore(ci): add daily upstream sync workflow for custom branch
* fix(discord): non-blocking reactions and robust cleanup
* chore: remove unrelated workflow from Discord-only PR
* Discord: streamline reaction handling
* Docs: add Discord reaction changelog
---------
Co-authored-by: Shadow <hi@shadowing.dev >
2026-02-16 13:38:39 -06:00
Vignesh Natarajan
c953cfdee7
chore (changelog): note webchat command auth fix
2026-02-16 11:30:49 -08:00
Shadow
72e228e14b
Heartbeat: allow suppressing tool warnings ( #18497 )
...
* Heartbeat: allow suppressing tool warnings
* Changelog: note heartbeat tool-warning suppression
2026-02-16 13:29:24 -06:00
nabbilkhan
03cadc4b7a
fix(auth): auto-expire stale auth profile cooldowns and reset error count
...
When an auth profile hits a rate limit, `errorCount` is incremented and
`cooldownUntil` is set with exponential backoff. After the cooldown
expires, the time-based check correctly returns false — but `errorCount`
persists. The next transient failure immediately escalates to a much
longer cooldown because the backoff formula uses the stale count:
60s × 5^(errorCount-1), max 1h
This creates a positive feedback loop where profiles appear permanently
stuck after rate limits, requiring manual JSON editing to recover.
Add `clearExpiredCooldowns()` which sweeps all profiles on every call to
`resolveAuthProfileOrder()` and clears expired `cooldownUntil` /
`disabledUntil` values along with resetting `errorCount` and
`failureCounts` — giving the profile a fair retry window (circuit-breaker
half-open → closed transition).
Key design decisions:
- `cooldownUntil` and `disabledUntil` handled independently (a profile
can have both; only the expired one is cleared)
- `errorCount` reset only when ALL unusable windows have expired
- `lastFailureAt` preserved for the existing failureWindowMs decay logic
- In-memory mutation; disk persistence happens lazily on the next store
write, matching the existing save pattern
Fixes #3604
Related: #13623 , #15851 , #11972 , #8434
2026-02-16 12:53:45 -06:00
Vignesh Natarajan
1cf3aba3f6
chore (changelog): note qmd multi-agent startup fix
2026-02-16 10:35:48 -08:00
Vignesh
b0a01fe482
Agents/Tools: preflight exec script files for shell var injection ( #18457 )
...
* fix(agents): don't force store=true for codex responses
* test: stabilize respawn + subagent usage assertions
* Agents/Tools: preflight exec to detect shell variable injection in scripts
* Changelog: fix merge marker formatting
2026-02-16 10:34:29 -08:00
Shadow
1b7301051b
Config: require Discord ID strings ( #18220 )
2026-02-16 12:22:58 -06:00
Nimrod Gutman
5a39e13c92
fix(ios): restore missing location monitor merge files ( #18260 )
...
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: f60cd10f6d
Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com >
Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com >
Reviewed-by: @ngutman
2026-02-17 01:41:53 +08:00