Commit Graph

98 Commits

Author SHA1 Message Date
Eugene 45b74fb56c
fix(telegram): move network fallback to resolver-scoped dispatchers (#40740)
Merged via squash.

Prepared head SHA: a4456d48b4
Co-authored-by: sircrumpet <4436535+sircrumpet@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
2026-03-10 11:28:51 +05:30
Harold Hunt de49a8b72c
Telegram: exec approvals for OpenCode/Codex (#37233)
Merged via squash.

Prepared head SHA: f243379094
Co-authored-by: huntharo <5617868+huntharo@users.noreply.github.com>
Co-authored-by: huntharo <5617868+huntharo@users.noreply.github.com>
Reviewed-by: @huntharo
2026-03-09 23:04:35 -04:00
Peter Steinberger f866e57de3 refactor(telegram): dedupe non-idempotent request setup 2026-03-08 01:14:16 +00:00
Peter Steinberger eb09d8dd71 fix(telegram): land #34238 from @hal-crackbot
Landed from contributor PR #34238 by @hal-crackbot.

Co-authored-by: Hal Crackbot <hal@crackbot.dev>
2026-03-08 00:56:58 +00:00
Peter Steinberger 1aaca517e3 fix(media): harden unknown mime handling from #39199 (thanks @nicolasgrasset)
Co-authored-by: Nicolas Grasset <nicolas.grasset@gmail.com>
2026-03-07 23:30:32 +00:00
Vincent Koc 9c1786bdd6
Telegram/Discord: honor outbound mediaMaxMb uploads (#38065)
* Telegram: default media cap to 100MB

* Telegram: honor outbound mediaMaxMb

* Discord: add shared media upload cap

* Discord: pass mediaMaxMb to outbound sends

* Telegram: cover outbound media cap sends

* Discord: cover media upload cap config

* Docs: update Telegram media cap guide

* Docs: update Telegram config reference

* Changelog: note media upload cap fix

* Docs: note Discord upload cap behavior
2026-03-06 10:53:06 -05:00
Josh Avant 646817dd80
fix(outbound): unify resolved cfg threading across send paths (#33987) 2026-03-04 00:20:44 -06:00
Peter Steinberger ea3b7dfde5 fix(channels): normalize MIME kind parsing and reaction fallbacks 2026-03-02 23:48:11 +00:00
Peter Steinberger e1f3ded033 refactor: split telegram delivery and unify media/frontmatter/i18n pipelines 2026-03-02 04:14:06 +00:00
Peter Steinberger 4258a3307f refactor(agents): unify subagent announce delivery pipeline
Co-authored-by: Smith Labs <SmithLabsLLC@users.noreply.github.com>
Co-authored-by: Do Cao Hieu <docaohieu2808@users.noreply.github.com>
2026-02-26 00:30:44 +00:00
Ayaan Zaidi dcc52850c3 fix: persist resolved telegram delivery targets at runtime 2026-02-23 11:45:18 +05:30
Gustavo Madeira Santana 2f46308d5a
refactor(logging): migrate non-agent internal console calls to subsystem logger (#22964)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: b4a5b12422
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-02-21 17:44:00 -05:00
Peter Steinberger b8b43175c5 style: align formatting with oxfmt 0.33 2026-02-18 01:34:35 +00:00
Peter Steinberger 31f9be126c style: run oxfmt and fix gate failures 2026-02-18 01:29:02 +00:00
Nick Lamb f42e13c17c
feat(telegram): add forum topic creation support (#17035)
* Revert "fix(gateway): set explicit chat timeouts for mesh gateway calls"

This reverts commit c529e6005a.

* Revert "fix: capture init script exit codes instead of swallowing via pipe"

This reverts commit 8b14052ebe.

* Revert "feat(docker): add init script support via /openclaw-init.d/"

This reverts commit 53af9f7437.

* Revert "Agents: improve Windows scaffold helpers for venture studio"

This reverts commit b6d934c2c7.

* chore: Fix types in tests 1/N.

* chore: Fix types in tests 2/N.

* Revert "fix: remove stderr suppression so install failures are visible in build logs"

This reverts commit 717caa97fb.

* Revert "fix(docker): ensure memory-lancedb deps installed in Docker image"

This reverts commit 2ab6313d99.

* Revert "fix: add windowsHide: true to spawn in runCommandWithTimeout"

This reverts commit 32c66aff49.

* Revert "Onboarding: fix webchat URL loopback and canonical session"

This reverts commit 59e0e7e4ff.

* Revert "feat(linq): add interactive onboarding adapter"

This reverts commit b91e43714b.

* Revert "feat: add Linq channel — real iMessage via API, no Mac required"

This reverts commit d4a142fd8f.

* docs: clarify discord proxy scope for startup REST calls

* Revert "fix: flatten remaining anyOf/oneOf in Gemini schema cleaning"

This reverts commit 06b961b037.

* Revert "fix: session-memory hook finds previous session file after /new/reset"

This reverts commit d6acd71576.

* Revert "fix: respect OPENCLAW_HOME for isolated gateway instances"

This reverts commit 34b18ea9db.

* fix(process): harden graceful kill-tree cancellation semantics

* fix(slack): scope attachment extraction to forwarded shares

* docs(changelog): note process kill-tree hotfix

* docs(changelog): note slack forwarded attachment hotfix

* fix(session-memory): harden reset transcript recovery

* revert(telegram): undo accidental merge of PR #18601

* fix(ui): preserve locale bootstrap and trusted-proxy overview behavior

* fix(scripts): harden Windows UI spawn behavior

* fix(slack): validate interaction payloads and handle malformed actions

* fix(mattermost): harden react remove flag parsing

* docs(changelog): record PR 18608 fixups

* fix(heartbeat): bound responsePrefix strip for ack detection

* chore: Fix types in tests 3/N.

* chore: chore: Fix types in tests 4/N.

* chore: Fix types in tests 5/N.

* chore: Fix types in tests 6/N.

* chore: Format files.

* chore: Fix types that were broken due to reverts.

* chore: Cleanup unused vars that were leftover from the reverts.

* fix(actions): layer per-account gate fallback

* fix(subagents): pass group context in /subagents spawn

* fix(failover): align abort timeout detection and regressions

* fix(models): sync auth-profiles before availability checks

* fix(ui): correct usage range totals and muted styles

* Revert "feat: show transcript file size in session status"

This reverts commit 15dd2cda20.

* revert(doctor): undo accidental merge of PR #18591

* fix(agents): align session lock hold budget with run timeouts

* Revert "fix: resolve #12770 - update Antigravity default model and trim leading whitespace in BlueBubbles replies"

This reverts commit e179d453c7.

* revert(tools): undo accidental merge of PR #18584

* revert(tools): finish rollback of PR #18584

* chore: Fix Slack test.

* revert: remove accidentally merged video-quote-finder skill (#18550)

* revert: accidental merge of OC-09 sandbox env sanitization change

* fix(doctor): move forced exit to top-level command

* chore: Fix types in tests 7/N.

* chore: Fix types in tests 8/N.

* chore: Fix types in tests 9/N.

* chore: Fix types in tests 10/N.

* chore: Fix types in tests 11/N.

* chore: chore: Fix types in tests 12/N.

* chore: Fix type errors from reverts.

* fix(gateway): remove watch-mode build/start race (#18782)

* fix(doctor): repair googlechat open dm wildcard auto-fix

* test(extensions): cast fetch mocks to satisfy tsgo

* fix(gateway): harden channel health monitor recovery

* fix(reply): track messaging media aliases for dedupe

* refactor(plugins): split before-agent hooks by model and prompt phases

* revert(telegram): undo accidental merge of PR #18564

* fix(agents): restore multi-image image tool schema contract

* chore: Format files.

* fix(ui): gate sessions refresh on successful delete

* revert(docs): undo accidental merge of #18516

* revert(exec): undo accidental merge of PR #18521

* docs(cron): clarify webhook posting summary condition

* fix(gateway): preserve chat.history context under hard caps

* chore: Fix types in tests 13/N.

* chore: Fix types in tests 14/N.

* chore: Fix types in tests 15/N.

* chore: Fix types in tests 16/N.

* chore: Fix types in tests 17/N.

* chore: Fix types in tests 18/N.

* chore: Format files.

* revert(sandbox): revert SHA-1 slug restoration

* test(session): cover stale threadId fallback

* test(status): cover token summary variants

* test(telegram): cover getFile file-too-big errors

* test(voice-call): cover stream disconnect auto-end

* chore(format): fix test import order

* test(agents): cover tool result media placeholders

* chore: chore: Fix types in tests 19/N.

* chore: Fix types in tests 20/N.

* chore: Fix types in tests 21/N.

* chore: Fix types in tests 22/N.

* chore: Fix types in tests 23/N.

* docs(voice-call): document stale call reaper config

* fix(doctor): audit env-only gateway tokens

* fix(sessions): purge deleted transcript archives

* test(docker): cover browser install build arg

* revert(gateway): restore loopback auth setup

* revert(voice-call): undo cached greeting note

* revert(voice-call): undo oxfmt formatting

* revert(voice-call): undo oxfmt formatting pass

* revert(voice-call): remove cached inbound greeting

* test: stabilize infra tests

* fix(subagents): harden announce retry guards

* Revert "fix(whatsapp): allow per-message link preview override\n\nWhatsApp messages default to enabling link previews for URLs. This adds\nsupport for overriding this behavior per-message via the \nparameter (e.g. from  tool options), consistent with Telegram.\n\nFix: Updated internal WhatsApp Web API layers to pass  option\ndown to Baileys ."

This reverts commit 1bef2fc68b.

* fix(telegram): clear offsets on token change

* test(agents): cover exec non-zero exits

* CI: use self-hosted for labeler/automation

* Revert "channels: migrate extension account listing to factory"

This reverts commit d24340d75b.

* chore(format)

* chore: wtf.

* chore: Fix types.

* chore: Fix types in tests 24/N.

* chore: Fix types in tests 25/N.

* chore: Fix types in tests 26/N.

* chore: Fix types in tests 27/N.

* chore: Fix types in tests 28/N.

* chore: Fix types in tests 29/N.

* chore: Fix types in tests 30/N.

* chore: Fix types in tests 31/N.

* chore: Fix types in tests 32/N.

* fix(telegram): add initial message debounce for better push notifications (#18147)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 5e2285b6a0
Co-authored-by: Marvae <11957602+Marvae@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus

* style(telegram): format dispatch files

* chore: Fix types in tests 33/N.

* chore: Fix types in tests 34/N.

* chore: Fix types in tests 35/N.

* chore: Fix types in tests 36/N.

* chore: Fix types in tests 37/N.

* chore: Fix types in tests 38/N.

* chore: Fix types in tests 39/N.

* chore: Fix types in tests 40/N.

* chore: Fix types in tests 41/N.

* chore: Fix types in tests 42/N.

* chore: Fix types in tests 43/N.

* chore: Fix types in tests 44/N.

* chore: Fix types in tests 45/N.

* chore: Typecheck tests.

* chore: Fix broken test.

* chore: Fix hanging test.

* fix(telegram): avoid duplicate preview bubbles in partial stream mode (#18956)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: cf4eca71d4
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus

* fix: before_tool_call hook double-fires with abort signal (#16852)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 6269d617f3
Co-authored-by: sreuter <550246+sreuter@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus

* Revert "Default Telegram polls to public"

This reverts commit c43e95e011.

* Revert "Fix Telegram poll action wiring"

This reverts commit 556b531a14.

* Revert "Add Telegram polls action to config typing"

This reverts commit 5cbfaf5cc7.

* Revert "fix(telegram): wire sendPollTelegram into channel action handler (#16977)"

This reverts commit 7bb9a7dcfc.

* CI: remove formal models conformance workflow (#19007)

* fix: preserve telegram dm topic thread ids

* style: drop aidev-note prefix in telegram comments

* test: pass extensionContext in abort dedupe e2e

* fix: align tool execute arg parsing for hooks

* test: type telegram action mock passthrough args

* Configure: make model picker allowlist searchable

* Configure: improve searchable model picker token matching

* Docs: add screenshot showing model picker usability issue

* fix: searchable model picker in configure (#19010) (thanks @bjesuiter)

* fix(extensions): revert openai codex auth plugin (PR #18009)

* feat(telegram): add channel_post support for bot-to-bot communication (#17857)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 27a343cd4d
Co-authored-by: theSamPadilla <35386211+theSamPadilla@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus

* Revert "fix: handle forum/topics in Telegram DM thread routing (#17980)"

This reverts commit e20b87f1ba.

* Revert: undo #17974 README change

* voice-call: harden closed-loop turn loop and transcript routing (#19140)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 14a3edb005
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

* iOS onboarding: stop auth step-3 retry loop churn (#19153)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: a38ec42bdd
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

* Revert: fully roll back #17974 zh-cn UI README

* chore(subagents): add regression coverage and changelog

* fix(daemon): scope token drift warnings

* test(web): fix baileys mock typing

* test(cron): cover webhook session rollover overrides

* docs(changelog): note webhook session reuse fix

* fix(discord): normalize command allowFrom prefixes

* fix(cli): honor update restart overrides

* fix(cron): add spin-loop regression coverage

* test(gateway): cover trusted proxy trimming

* test(discord): cover audioAsVoice replies

* test(feishu): cover post mentions for other users

* fix(discord): preserve DM lastRoute user target

* Revert "fix(browser): track original port mapping for EADDRINUSE fallback"

This reverts commit 8e55503d77.

* Revert "fix(browser): handle EADDRINUSE with automatic port fallback"

This reverts commit 0e6daa2e6e.

* test(discord): fix mock call arg typing

* Revert: fully roll back #17986 templates

* test: add fetch mock helper and reaction coverage

* CLI: approve latest pending device request

* docs(readme): remove Android install link

* revert(agents): remove llms.txt discovery prompt (#19192)

* fix(ui): revert PR #18093 directive tags (#19188)

* test(discord): cover auto-thread skip types

* test(update): cover restart gating

* docs(zai): document tool_stream defaults

* revert: per-model thinkingDefault override (#19195)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: fe2c59e222
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Reviewed-by: @sebslight

* fix(gateway): make stale token cleanup non-fatal

* Agents: add before_message_write persistence regression tests

* fix(mattermost): surface reactions support

* Tests: fix fetch mock typings for type-aware checks

* revert: fix models set catalog validation (#19194)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 7e3b2ff7af
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Reviewed-by: @sebslight

* test: cover cron telemetry and typed fetch mocks

* revert(agents): revert base64 image validation (#19221)

* docs(cli): add components send example

* test(sessions): add delivery info regression coverage

* fix(daemon): guard preferred node selection

* test(auto-reply): cover sender_id metadata

* revert: PR 18288 accidental merge (#19224)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 3cda31578c
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Reviewed-by: @sebslight

* test(telegram): cover autoSelectFamily env precedence

* test(cron): add model fallback regression coverage

* test(release): add appcast regression coverage

* docs(changelog): remove revert entries

* docs: add maintainer application section

* docs: refine maintainer application guidance

* docs: add vision doc and link from README

* docs: add community plugins guide

* Update auto-response message for third-party extensions

* update my contributing list

* iOS: use operator session for ChatSheet RPCs (#19320)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 0753b3a1a2
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

* fix: sanitize native command names for Telegram API (#19257)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: b608be3488
Co-authored-by: akramcodez <179671552+akramcodez@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus

* docs(slack): add assistant:write requirement for typing status

* chore: document sessions_spawn response note and subagent context prefix

* feat(ios): auto-select local signing team (#18421)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: bbb9c3aa48
Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com>
Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com>
Reviewed-by: @ngutman

* fix(bluebubbles): recover outbound message IDs and include sender metadata

* fix cron announce routing and timeout handling

* changelog: add @tyler6204 credit for today's entries

* feat: share to openclaw ios app (#19424)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 0a7ab8589a
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky

* Docs: expand multi-agent routing

* docs(changelog): add missing 2026.2.16 entries and reorder by user impact

* chore(release): bump version to 2026.2.17

* fix(signal): canonicalize message targets in tool and inbound flows

* docs: tighten contribution guidance and vision links

* docs: tighten PR scope and review-size policy in vision

* fix(gateway): block cross-session fallback in node event delivery

* fix(gateway): make health monitor checks single-flight

* fix(ios): harden share relay routing and delivery guards

* fix(telegram): normalize topic-create targets and add regression tests

* feat(cron): add default stagger controls for scheduled jobs

* fix(cron): retry next-second schedule compute on undefined

* docs(security): harden gateway security guidance

* feat(models): support anthropic sonnet 4.6

* fix: wire agents.defaults.imageModel into media understanding auto-discovery

resolveAutoEntries only checked a hardcoded list of providers
(openai, anthropic, google, minimax) when looking for an image model.
agents.defaults.imageModel was never consulted by the media understanding
pipeline — it was only wired into the explicit `image` tool.

Add resolveImageModelFromAgentDefaults that reads the imageModel config
(primary + fallbacks) and inserts it into the auto-discovery chain before
the hardcoded provider list.  runProviderEntry already falls back to
describeImageWithModel (via pi-ai) for providers not in the media
understanding registry, so no additional provider registration is needed.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
(cherry picked from commit b381029ede)

* docs: update AGENTS instructions

* fix(subagent): harden read-tool overflow guards and sticky reply threading (#19508)

* fix(gateway): avoid premature agent.wait completion on transient errors

* fix(agent): preemptively guard tool results against context overflow

* fix: harden tool-result context guard and add message_id metadata

* fix: use importOriginal in session-key mock to include DEFAULT_ACCOUNT_ID

The run.skill-filter test was mocking ../../routing/session-key.js with only
buildAgentMainSessionKey and normalizeAgentId, but the module also exports
DEFAULT_ACCOUNT_ID which is required transitively by src/web/auth-store.ts.

Switch to importOriginal pattern so all real exports are preserved alongside
the mocked functions.

* pi-runner: guard accumulated tool-result overflow in transformContext

* PI runner: compact overflowing tool-result context

* Subagent: harden tool-result context recovery

* Enhance tool-result context handling by adding support for legacy tool outputs and improving character estimation for message truncation. This includes a new function to create legacy tool results and updates to existing functions to better manage context overflow scenarios.

* Enhance iMessage handling by adding reply tag support in send functions and tests. This includes modifications to prepend or rewrite reply tags based on provided replyToId, ensuring proper message formatting for replies.

* Enhance message delivery across multiple channels by implementing sticky reply context for chunked messages. This includes preserving reply references in Discord, Telegram, and iMessage, ensuring that follow-up messages maintain their intended reply targets. Additionally, improve handling of reply tags in system prompts and tests to support consistent reply behavior.

* Enhance read tool functionality by implementing auto-paging across chunks when no explicit limit is provided, scaling output budget based on model context window. Additionally, add tests for adaptive reading behavior and capped continuation guidance for large outputs. Update related functions to support these features.

* Refine tool-result context management by stripping oversized read-tool details payloads during compaction, ensuring repeated read calls do not bypass context limits. Introduce new utility functions for handling truncation content and enhance character estimation for tool results. Add tests to validate the removal of excessive details in context overflow scenarios.

* Refine message delivery logic in Matrix and Telegram by introducing a flag to track if a text chunk was sent. This ensures that replies are only marked as delivered when a text chunk has been successfully sent, improving the accuracy of reply handling in both channels.

* fix: tighten reply threading coverage and prep fixes (#19508) (thanks @tyler6204)

* fix(hooks): backport internal message hook bridge with safe delivery semantics

* fix(subagent): update SUBAGENT_SPAWN_ACCEPTED_NOTE for clarity on auto-announcement behavior

* fix: follow-up slack streaming routing/tests (#9972) (thanks @natedenh)

* fix: reduce default image dimension from 2000px to 1200px

Large images (2000px) consume excessive context tokens when sent to LLMs.
1200px provides sufficient detail for most use cases while significantly
reducing token usage.

The 5MB byte limit remains unchanged as JPEG compression at 1200px
naturally produces smaller files.

(cherry picked from commit 40182123dd)

* fix(agents): make image sanitization dimension configurable

* docs(tokens): document image dimension token tradeoffs

* Whatsapp/add resolve outbound target tests (#19345)

* test(whatsapp): add resolveWhatsAppOutboundTarget test suite

* style: auto-format files

* fix(test): correct mock order for invalid allowList entry test

* feat(skills): Add 'Use when / Don't use when' routing blocks (#14521)

* feat(skills): add 'Use when / Don't use when' blocks to skill descriptions

Based on OpenAI's Shell + Skills + Compaction best practices article.

Key changes:
- Added clear routing logic to skill descriptions
- Added negative examples to prevent misfires
- Added templates/examples to github skill
- Included Blake's specific setup notes for openhue

Skills updated:
- apple-reminders: Clarify vs Clawdbot cron
- github: Clarify vs local git operations
- imsg: Clarify vs other messaging channels
- openhue: Add device inventory, room layout
- tmux: Clarify vs exec tool
- weather: Add location defaults, format codes

Reference: https://developers.openai.com/blog/skills-shell-tips

* fix(skills): restore metadata and generic CLI examples

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* feat(agents): add generic provider api key rotation (#19587)

* feat(skills): improve descriptions with routing logic (#14577)

* feat(skills): improve descriptions with routing logic

Apply OpenAI's recommended pattern for skill descriptions:
- Add 'Use when' conditions for clear triggering
- Add 'NOT for' negative examples to reduce misfires
- Make descriptions act as routing logic, not marketing copy

Based on: https://developers.openai.com/blog/skills-shell-tips/

Skills updated:
- coding-agent: clarify when to delegate vs direct edit
- github: add boundaries vs browser/scripting
- weather: add scope limitations

Glean reported 20% drop in skill triggering without negative
examples, recovering after adding them. This change brings
Clawdbot skills in line with that pattern.

* docs(skills): clarify routing boundaries (openclaw#14577) (thanks @DylanWoodAkers)

* docs(changelog): add PR 14577 release note (openclaw#14577) (thanks @DylanWoodAkers)

---------

Co-authored-by: ClawdBotWolf <clawdbotwolf@proton.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>

* Add frontend-design skill

* feat(telegram): add forum topic creation support (#10427)

Add `topic-create` action to the Telegram message adapter, enabling
programmatic creation of forum topics in supergroups.

Changes:
- Add `createForumTopicTelegram()` to `src/telegram/send.ts`
- Add `createForumTopic` handler in `telegram-actions.ts`
- Wire `topic-create` action in Telegram adapter
- Register `topic-create` in message action names and spec

The bot requires `can_manage_topics` permission in the target group.
Supports optional `iconColor` and `iconCustomEmojiId` parameters.

Closes #10427

* chore: fix formatting in frontend-design SKILL.md

* fix: add action gate check and config type for createForumTopic

Address review feedback:
- Add isActionEnabled() gate in telegram-actions.ts
- Add gate() check in telegram adapter listActions
- Add createForumTopic to TelegramActionConfig type

* fix(telegram): normalize topic-create targets and add regression tests

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
Co-authored-by: Josh Avant <830519+joshavant@users.noreply.github.com>
Co-authored-by: Shadow <hi@shadowing.dev>
Co-authored-by: Hongwei Ma <Marvae@users.noreply.github.com>
Co-authored-by: Marvae <11957602+Marvae@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Sascha Reuter <s.reuter@geek-it.de>
Co-authored-by: sreuter <550246+sreuter@users.noreply.github.com>
Co-authored-by: Nimrod Gutman <nimrod.g@singular.net>
Co-authored-by: Vignesh <mailvgnsh@gmail.com>
Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com>
Co-authored-by: Sam Padilla <35386211+theSamPadilla@users.noreply.github.com>
Co-authored-by: Muhammed Mukhthar CM <mukhtharcm@gmail.com>
Co-authored-by: Mariano <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Mariano Belinky <mbelinky@gmail.com>
Co-authored-by: Shadow <shadow@openclaw.ai>
Co-authored-by: Sk Akram <skcodewizard786@gmail.com>
Co-authored-by: akramcodez <179671552+akramcodez@users.noreply.github.com>
Co-authored-by: Onur <onur@textcortex.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
Co-authored-by: ngutman <1540134+ngutman@users.noreply.github.com>
Co-authored-by: Pablo Nunez <pnunfe@gmail.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: Han Xiao <han.xiao@jina.ai>
Co-authored-by: Verite Igiraneza <69280208+VeriteIgiraneza@users.noreply.github.com>
Co-authored-by: Blakeshannon <blake@blakeshannon.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: DylanWoodAkers <dylan@lec.com>
Co-authored-by: ClawdBotWolf <clawdbotwolf@proton.me>
Co-authored-by: Claw <claw@openclaw.ai>
2026-02-18 01:38:44 +01:00
Ayaan Zaidi 900b97e3c7 test: type telegram action mock passthrough args 2026-02-17 13:30:29 +05:30
Ayaan Zaidi 1903c685c0 style: drop aidev-note prefix in telegram comments 2026-02-17 13:30:29 +05:30
Ayaan Zaidi 9d9630c83a fix: preserve telegram dm topic thread ids 2026-02-17 13:30:29 +05:30
Nimrod Gutman b2fef5ebc4 Revert "Default Telegram polls to public"
This reverts commit c43e95e011.
2026-02-17 09:38:15 +02:00
cpojer d0cb8c19b2
chore: wtf. 2026-02-17 13:36:48 +09:00
Sebastian ed11e93cf2 chore(format) 2026-02-16 23:20:16 -05:00
cpojer 950d5a46b2
chore: Fix types in tests 2/N. 2026-02-17 10:26:49 +09:00
cpojer 90ef2d6bdf
chore: Update formatting. 2026-02-17 09:18:40 +09:00
artale b4a90bb743 fix(telegram): suppress message_thread_id for private chat sends (#17242)
Private chats (positive numeric chat IDs) never support forum topics.
Sending message_thread_id to a private chat causes Telegram to reject
the request with '400: Bad Request: message thread not found', silently
dropping the message.

Guard all three send functions (sendMessageTelegram, sendStickerTelegram,
sendPollTelegram) to omit thread-related parameters when the target is a
private chat.

Root cause: the auto-reply pipeline can set messageThreadId from a
previous forum-group context, then reuse it when sending a DM.

Tests: add private-chat suppression assertions; update existing thread-
retry tests to use group chat IDs so the retry path is still exercised.
2026-02-17 00:01:26 +01:00
Krish 0a02b91638 Handle Telegram poll vote updates for agent context 2026-02-16 23:54:56 +01:00
Krish c43e95e011 Default Telegram polls to public 2026-02-16 23:54:56 +01:00
Ayaan Zaidi 16327f21da
feat(telegram): support inline button styles (#18241)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 239cb3552e
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
2026-02-16 22:48:47 +05:30
Ayaan Zaidi b6a9741ba4
refactor(telegram): simplify send/dispatch/target handling (#17819)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: fcb7aeeca3
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
Reviewed-by: @obviyus
2026-02-16 14:00:34 +05:30
Peter Steinberger ac2ede5bb1 fix(telegram): treat no-op editMessage as success 2026-02-16 04:18:24 +01:00
Mr. Guy e927fd1e35
fix: allow agent workspace directories in media local roots (#17136)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 7545ef1e19
Co-authored-by: MisterGuy420 <255743668+MisterGuy420@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-02-15 10:53:45 -05:00
Ayaan Zaidi a69e82765f fix(telegram): stream replies in-place without duplicate final sends 2026-02-15 20:32:51 +05:30
Robby 8e5689a84d
feat(telegram): add sendPoll support (#16193) (#16209)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: b58492cfed
Co-authored-by: robbyczgw-cla <239660374+robbyczgw-cla@users.noreply.github.com>
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
Reviewed-by: @steipete
2026-02-14 18:34:30 +01:00
0xRain 4b86c9e555
fix(telegram): surface REACTION_INVALID as non-fatal warning (#14340)
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-02-12 00:28:47 -06:00
clawdinator[bot] fb8e4489a3
feat: Implement Telegram video note support with tests and docs (#12408)
* feat: Implement Telegram video note support with tests and docs

* fixing lint

* feat: add doctor-state-integrity command, Telegram messaging, and PowerShell Docker setup scripts.

* Update src/telegram/send.video-note.test.ts

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix: Set video note follow-up text to undefined for empty input and adjust caption test expectation.

* test: add assertion for `sendMessage` with reply markup and HTML parse mode in `send.video-note` test.

* docs: add changelog entry for Telegram video notes

---------

Co-authored-by: Evgenii Utkin <thewulf7@gmail.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: CLAWDINATOR Bot <clawdinator[bot]@users.noreply.github.com>
2026-02-09 07:00:57 +00:00
Ayaan Zaidi d85f0566a9 fix: tighten thread-clear and telegram retry guards 2026-02-09 08:59:21 +05:30
Ayaan Zaidi d7bd68ff24 fix: recover telegram sends from stale thread ids 2026-02-09 08:59:21 +05:30
Ayaan Zaidi 1d7dd5f261 fix: require thread specs for telegram sends 2026-02-02 09:26:59 +05:30
cpojer f06dd8df06
chore: Enable "experimentalSortImports" in Oxfmt and reformat all imorts. 2026-02-01 10:03:47 +09:00
cpojer 5ceff756e1
chore: Enable "curly" rule to avoid single-statement if confusion/errors. 2026-01-31 16:19:20 +09:00
A. Duk 284b54af42
feat: Add support for Telegram quote (partial message replies) (#2900)
* feat: Add support for Telegram quote (partial message replies)

- Enhanced describeReplyTarget() to detect and extract quoted text from msg.quote
- Updated reply formatting to distinguish between full message replies and quotes
- Added isQuote flag to replyTarget object for proper identification
- Quote replies show as [Quoting user] "quoted text" [/Quoting]
- Regular replies unchanged: [Replying to user] full message [/Replying]

Resolves need for partial message reply support in Telegram Bot API.
Backward compatible with existing reply functionality.

* updating references

* Mac: finish Moltbot rename

* Mac: finish Moltbot rename (paths)

* fix(macOS): rename Clawdbot directories to Moltbot for naming consistency

Directory renames:
- apps/macos/Sources/Clawdbot → Moltbot
- apps/macos/Sources/ClawdbotDiscovery → MoltbotDiscovery
- apps/macos/Sources/ClawdbotIPC → MoltbotIPC
- apps/macos/Sources/ClawdbotMacCLI → MoltbotMacCLI
- apps/macos/Sources/ClawdbotProtocol → MoltbotProtocol
- apps/macos/Tests/ClawdbotIPCTests → MoltbotIPCTests
- apps/shared/ClawdbotKit → MoltbotKit
- apps/shared/MoltbotKit/Sources/Clawdbot* → Moltbot*
- apps/shared/MoltbotKit/Tests/ClawdbotKitTests → MoltbotKitTests

Resource renames:
- Clawdbot.icns → Moltbot.icns

Code fixes:
- Update Package.swift paths to reference Moltbot* directories
- Fix clawdbot* → moltbot* symbol references in Swift code:
  - clawdbotManagedPaths → moltbotManagedPaths
  - clawdbotExecutable → moltbotExecutable
  - clawdbotCommand → moltbotCommand
  - clawdbotNodeCommand → moltbotNodeCommand
  - clawdbotOAuthDirEnv → moltbotOAuthDirEnv
  - clawdbotSelectSettingsTab → moltbotSelectSettingsTab

* fix: update remaining ClawdbotKit path references to MoltbotKit

- scripts/bundle-a2ui.sh: A2UI_APP_DIR path
- package.json: format:swift and protocol:check paths
- scripts/protocol-gen-swift.ts: output paths
- .github/dependabot.yml: directory path and comment
- .gitignore: build cache paths
- .swiftformat: exclusion paths
- .swiftlint.yml: exclusion path
- apps/android/app/build.gradle.kts: assets.srcDir path
- apps/ios/project.yml: package path
- apps/ios/README.md: documentation reference
- docs/concepts/typebox.md: documentation reference
- apps/shared/MoltbotKit/Package.swift: fix argument order

* chore: update Package.resolved after dependency resolution

* fix: add MACOS_APP_SOURCES_DIR constant and update test to use new path

The cron-protocol-conformance test was using LEGACY_MACOS_APP_SOURCES_DIR
which points to the old Clawdbot path. Added a new MACOS_APP_SOURCES_DIR
constant for the current Moltbot path and updated the test to use it.

* fix: finish Moltbot macOS rename (#2844) (thanks @fal3)

* Extensions: use workspace moltbot in memory-core

* fix(security): recognize Venice-style claude-opus-45 as top-tier model

The security audit was incorrectly flagging venice/claude-opus-45 as
'Below Claude 4.5' because the regex expected -4-5 (with dash) but
Venice uses -45 (without dash between 4 and 5).

Updated isClaude45OrHigher() regex to match both formats.
Added test case to prevent regression.

* Branding: update bot.molt bundle IDs + launchd labels

* Branding: remove legacy android packages

* fix: wire telegram quote support (#2900)

Co-authored-by: aduk059 <aduk059@users.noreply.github.com>

* fix: support Telegram quote replies (#2900) (thanks @aduk059)

---------

Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: Shadow <shadow@clawd.bot>
Co-authored-by: Alex Fallah <alexfallah7@gmail.com>
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
Co-authored-by: jonisjongithub <jonisjongithub@users.noreply.github.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: aduk059 <aduk059@users.noreply.github.com>
2026-01-27 15:59:24 -05:00
Josh Long 506bed5aed feat(telegram): add sticker support with vision caching
Add support for receiving and sending Telegram stickers:

Inbound:
- Receive static WEBP stickers (skip animated/video)
- Process stickers through dedicated vision call for descriptions
- Cache vision descriptions to avoid repeated API calls
- Graceful error handling for fetch failures

Outbound:
- Add sticker action to send stickers by fileId
- Add sticker-search action to find cached stickers by query
- Accept stickerId from shared schema, convert to fileId

Cache:
- Store sticker metadata (fileId, emoji, setName, description)
- Fuzzy search by description, emoji, and set name
- Persist to ~/.clawdbot/telegram/sticker-cache.json

Config:
- Single `channels.telegram.actions.sticker` option enables both
  send and search actions

🤖 AI-assisted: Built with Claude Code (claude-opus-4-5)
Testing: Fully tested - unit tests pass, live tested on dev gateway
The contributor understands and has reviewed all code changes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 12:47:23 +05:30
Shadow 9e200068dc
telegram: centralize api error logging 2026-01-26 20:27:36 -06:00
Gustavo Madeira Santana b861a0bd73 Telegram: harden network retries and config
Co-authored-by: techboss <techboss@users.noreply.github.com>
2026-01-26 19:36:43 -05:00
vignesh07 343882d45c feat(telegram): add edit message action (#2394) (thanks @marcelomar21) 2026-01-26 15:34:47 -08:00
Suksham 20f6a5546f
feat(telegram): add silent message option (#2382)
* feat(telegram): add silent message option (disable_notification)

Add support for sending Telegram messages silently without notification
sound via the `silent` parameter on the message tool.

Changes:
- Add `silent` boolean to message tool schema
- Extract and pass `silent` through telegram plugin
- Add `disable_notification: true` to Telegram API calls
- Add `--silent` flag to CLI `message send` command
- Add unit test for silent flag

Closes #2249

AI-assisted (Claude) - fully tested with unit tests + manual Telegram testing

* feat(telegram): add silent send option (#2382) (thanks @Suksham-sharma)

---------

Co-authored-by: Pocket Clawd <pocket@Pockets-Mac-mini.local>
2026-01-26 13:14:13 -08:00
Peter Steinberger 7e9aa3c275 fix(telegram): honor outbound proxy config (#1774, thanks @radek-paclt)
Co-authored-by: Radek Paclt <developer@muj-partak.cz>
2026-01-25 11:41:54 +00:00
Developer 65e2d939e1 fix(telegram): use configured proxy for outbound API calls
The proxy configuration (`channels.telegram.proxy`) was only used for
the gateway monitor (polling), but not for outbound sends (sendMessage,
reactMessage, deleteMessage). This caused outbound messages to bypass
the configured proxy, which is problematic for users behind corporate
proxies or those who want to route all traffic through a specific proxy.

This change ensures that all three outbound functions use the same
proxy configuration as the monitor:
- sendMessageTelegram
- reactMessageTelegram
- deleteMessageTelegram

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 11:41:54 +00:00
Peter Steinberger 612a27f3dd feat: add diagnostics flags 2026-01-25 10:40:27 +00:00
Peter Steinberger 653401774d
fix(telegram): honor linkPreview on fallback (#1730)
* feat: add notice directive parsing

* fix: honor telegram linkPreview config (#1700) (thanks @zerone0x)
2026-01-25 07:55:39 +00:00
zerone0x 92ab3f22dc feat(telegram): add linkPreview config option
Add channels.telegram.linkPreview config to control whether link previews
are shown in outbound messages. When set to false, uses Telegram's
link_preview_options.is_disabled to suppress URL previews.

- Add linkPreview to TelegramAccountConfig type
- Add Zod schema validation for linkPreview
- Pass link_preview_options to sendMessage in send.ts and bot/delivery.ts
- Propagate linkPreview config through deliverReplies callers
- Add tests for link preview behavior

Fixes #1675

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-25 06:00:05 +00:00