Peter Steinberger
b1c30f0ba9
refactor: dedupe cli config cron and install flows
2026-03-02 19:57:33 +00:00
Peter Steinberger
c424836fbe
refactor: harden outbound, matrix bootstrap, and plugin entry resolution
2026-03-02 19:55:09 +00:00
Peter Steinberger
e1bc5cad25
fix(outbound): harden plain-text HTML sanitization paths ( #32034 )
2026-03-02 19:28:47 +00:00
AytuncYildizli
62d0cfeee7
fix(delivery): strip HTML tags for plain-text messaging surfaces
...
Models occasionally produce HTML tags in their output. While these render
fine on web surfaces, they appear as literal text on WhatsApp, Signal,
SMS, IRC, and Telegram.
Add sanitizeForPlainText() utility that converts common inline HTML to
lightweight-markup equivalents and strips remaining tags. Applied in the
outbound delivery pipeline for non-HTML surfaces only.
Closes #31884
See also: #18558
2026-03-02 19:28:47 +00:00
Peter Steinberger
be3a62c5e0
test(perf): defer delivery queue fixture cleanup to suite end
2026-03-02 17:10:55 +00:00
Peter Steinberger
db7a8a6982
test(perf): reuse delivery queue suite temp root
2026-03-02 16:55:18 +00:00
Peter Steinberger
741e74972b
refactor(plugin-sdk): share boolean action param parsing
2026-03-02 14:36:41 +00:00
Peter Steinberger
d3e0c0b29c
test(gateway): dedupe gateway and infra test scaffolds
2026-03-02 07:13:10 +00:00
Peter Steinberger
c0bf42f2a8
refactor: centralize delivery/path/media/version lifecycle
2026-03-02 04:04:36 +00:00
Peter Steinberger
e1bf9591c3
fix(web-tools): land #31176 allow RFC2544 trusted fetch range (@sunkinux)
...
Landed from contributor PR #31176 by @sunkinux.
Co-authored-by: sunkinux <sunkinux@users.noreply.github.com>
2026-03-02 03:43:25 +00:00
Ayaan Zaidi
c13b35b83d
feat(telegram): improve DM topics support ( #30579 ) (thanks @kesor)
2026-03-02 09:06:45 +05:30
Peter Steinberger
493ebb915b
refactor: simplify telegram delivery and outbound session resolver flow
2026-03-02 03:09:40 +00:00
Brian Le
f64d25bd3e
fix(telegram): scope DM topic thread keys by chat id ( #31064 )
...
* fix(telegram): scope DM topic thread keys by chat id
* test(telegram): update dm topic session-key expectation
* fix(telegram): parse scoped dm thread ids in outbound recovery
* chore(telegram): format accounts config merge block
* test(nodes): simplify mocked exports for ts tuple spreads
2026-03-02 02:54:45 +00:00
Peter Steinberger
c823a85302
fix: harden sandbox media reads against TOCTOU escapes
2026-03-02 01:04:01 +00:00
msvechla
2c5b898eea
feat(slack): add download-file action for on-demand file attachment access ( #24723 )
...
* feat(slack): add download-file action for on-demand file attachment access
Adds a new `download-file` message tool action that allows the agent to
download Slack file attachments by file ID on demand. This is a prerequisite
for accessing images posted in thread history, where file attachments are
not automatically resolved.
Changes:
- Add `files` field to `SlackMessageSummary` type so file IDs are
visible in message read results
- Add `downloadSlackFile()` to fetch a file by ID via `files.info`
and resolve it through the existing `resolveSlackMedia()` pipeline
- Register `download-file` in `CHANNEL_MESSAGE_ACTION_NAMES`,
`MESSAGE_ACTION_TARGET_MODE`, and `listSlackMessageActions`
- Add `downloadFile` dispatch case in `handleSlackAction`
- Wire agent-facing `download-file` → internal `downloadFile` in
`handleSlackMessageAction`
Closes #24681
* style: fix formatting in slack-actions and actions
* test(slack): cover download-file action path
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-03-01 11:45:05 -06:00
Glucksberg
6dbbc58a8d
fix(slack): use SLACK_USER_TOKEN when connecting to Slack ( #28103 )
...
* fix(slack): use SLACK_USER_TOKEN when connecting to Slack (closes #26480 )
* test(slack): fix account fixture typing for user token source
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-03-01 11:05:35 -06:00
neverland
6a8d83b6dd
fix(feishu): Remove incorrect oc_ prefix assumption in resolveFeishuSession ( #10407 )
...
* fix(feishu): remove incorrect oc_ prefix assumption in resolveFeishuSession
- Feishu oc_ is a generic chat_id that can represent both groups and DMs
- Must use chat_mode field from API to distinguish, not ID prefix
- Only ou_/on_ prefixes reliably indicate user IDs (always DM)
- Fixes session misrouting for DMs with oc_ chat IDs
This bug caused DM messages with oc_ chat_ids to be incorrectly
created as group sessions, breaking session isolation and routing.
* docs: update Feishu ID format comment to reflect oc_ ambiguity
The previous comment incorrectly stated oc_ is always a group chat.
This update clarifies that oc_ chat_ids can be either groups or DMs,
and explicit prefixes (dm:/group:) should be used to distinguish.
* feishu: add regression coverage for oc session routing
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-02-27 22:16:20 -06:00
Ayaan Zaidi
69c39368ec
fix: enforce telegram shared outbound chunking
2026-02-28 08:13:59 +05:30
Peter Steinberger
10c7ae1eca
refactor(outbound): split recovery counters and normalize legacy retry entries
2026-02-26 22:42:15 +01:00
Peter Steinberger
cceefe833a
fix: harden delivery recovery backoff eligibility and tests ( #27710 ) (thanks @Jimmy-xuzimo)
2026-02-26 21:37:00 +00:00
Xu Zimo
0cfd448bab
fix(delivery-queue): change break to continue to prevent head-of-line blocking
...
When an entry's backoff exceeds the recovery budget, the code was using
break which blocked all subsequent entries from being processed. This
caused permanent queue blockage for any installation with a delivery entry
at retryCount >= 2.
Fix: Changed break to continue so entries whose backoff exceeds the
remaining budget are skipped individually rather than blocking the
entire loop.
Closes #27638
2026-02-26 21:37:00 +00:00
Peter Steinberger
df65ed7e9e
test(gateway): align outbound session assertion shape
2026-02-26 22:14:32 +01:00
Peter Steinberger
a1628d89ec
refactor: unify outbound session context wiring
2026-02-26 21:03:28 +01:00
Lucas Teixeira Campos Araujo
a4408a917e
fix: pass sessionKey to deliverOutboundPayloads for message:sent hook dispatch
...
Several call sites of deliverOutboundPayloads() were not passing the
sessionKey parameter, causing the internal message:sent hook to never
fire (the guard `if (!sessionKeyForInternalHooks) return` in deliver.ts
silently skipped the triggerInternalHook call).
Fixed call sites:
- commands/agent/delivery.ts (agent loop replies — main fix)
- infra/heartbeat-runner.ts (heartbeat OK + alert delivery)
- infra/outbound/message.ts (message tool sends)
- cron/isolated-agent/delivery-dispatch.ts (cron job delivery)
- gateway/server-node-events.ts (node event forwarding)
The sessionKey parameter already existed in DeliverOutboundPayloadsCoreParams
and was used by deliver.ts to emit the message:sent internal hook event,
but was simply not being passed from most callers.
2026-02-26 19:56:27 +00:00
Onur Solmaz
a7d56e3554
feat: ACP thread-bound agents ( #23580 )
...
* docs: add ACP thread-bound agents plan doc
* docs: expand ACP implementation specification
* feat(acp): route ACP sessions through core dispatch and lifecycle cleanup
* feat(acp): add /acp commands and Discord spawn gate
* ACP: add acpx runtime plugin backend
* fix(subagents): defer transient lifecycle errors before announce
* Agents: harden ACP sessions_spawn and tighten spawn guidance
* Agents: require explicit ACP target for runtime spawns
* docs: expand ACP control-plane implementation plan
* ACP: harden metadata seeding and spawn guidance
* ACP: centralize runtime control-plane manager and fail-closed dispatch
* ACP: harden runtime manager and unify spawn helpers
* Commands: route ACP sessions through ACP runtime in agent command
* ACP: require persisted metadata for runtime spawns
* Sessions: preserve ACP metadata when updating entries
* Plugins: harden ACP backend registry across loaders
* ACPX: make availability probe compatible with adapters
* E2E: add manual Discord ACP plain-language smoke script
* ACPX: preserve streamed spacing across Discord delivery
* Docs: add ACP Discord streaming strategy
* ACP: harden Discord stream buffering for thread replies
* ACP: reuse shared block reply pipeline for projector
* ACP: unify streaming config and adopt coalesceIdleMs
* Docs: add temporary ACP production hardening plan
* Docs: trim temporary ACP hardening plan goals
* Docs: gate ACP thread controls by backend capabilities
* ACP: add capability-gated runtime controls and /acp operator commands
* Docs: remove temporary ACP hardening plan
* ACP: fix spawn target validation and close cache cleanup
* ACP: harden runtime dispatch and recovery paths
* ACP: split ACP command/runtime internals and centralize policy
* ACP: harden runtime lifecycle, validation, and observability
* ACP: surface runtime and backend session IDs in thread bindings
* docs: add temp plan for binding-service migration
* ACP: migrate thread binding flows to SessionBindingService
* ACP: address review feedback and preserve prompt wording
* ACPX plugin: pin runtime dependency and prefer bundled CLI
* Discord: complete binding-service migration cleanup and restore ACP plan
* Docs: add standalone ACP agents guide
* ACP: route harness intents to thread-bound ACP sessions
* ACP: fix spawn thread routing and queue-owner stall
* ACP: harden startup reconciliation and command bypass handling
* ACP: fix dispatch bypass type narrowing
* ACP: align runtime metadata to agentSessionId
* ACP: normalize session identifier handling and labels
* ACP: mark thread banner session ids provisional until first reply
* ACP: stabilize session identity mapping and startup reconciliation
* ACP: add resolved session-id notices and cwd in thread intros
* Discord: prefix thread meta notices consistently
* Discord: unify ACP/thread meta notices with gear prefix
* Discord: split thread persona naming from meta formatting
* Extensions: bump acpx plugin dependency to 0.1.9
* Agents: gate ACP prompt guidance behind acp.enabled
* Docs: remove temp experiment plan docs
* Docs: scope streaming plan to holy grail refactor
* Docs: refactor ACP agents guide for human-first flow
* Docs/Skill: add ACP feature-flag guidance and direct acpx telephone-game flow
* Docs/Skill: add OpenCode and Pi to ACP harness lists
* Docs/Skill: align ACP harness list with current acpx registry
* Dev/Test: move ACP plain-language smoke script and mark as keep
* Docs/Skill: reorder ACP harness lists with Pi first
* ACP: split control-plane manager into core/types/utils modules
* Docs: refresh ACP thread-bound agents plan
* ACP: extract dispatch lane and split manager domains
* ACP: centralize binding context and remove reverse deps
* Infra: unify system message formatting
* ACP: centralize error boundaries and session id rendering
* ACP: enforce init concurrency cap and strict meta clear
* Tests: fix ACP dispatch binding mock typing
* Tests: fix Discord thread-binding mock drift and ACP request id
* ACP: gate slash bypass and persist cleared overrides
* ACPX: await pre-abort cancel before runTurn return
* Extension: pin acpx runtime dependency to 0.1.11
* Docs: add pinned acpx install strategy for ACP extension
* Extensions/acpx: enforce strict local pinned startup
* Extensions/acpx: tighten acp-router install guidance
* ACPX: retry runtime test temp-dir cleanup
* Extensions/acpx: require proactive ACPX repair for thread spawns
* Extensions/acpx: require restart offer after acpx reinstall
* extensions/acpx: remove workspace protocol devDependency
* extensions/acpx: bump pinned acpx to 0.1.13
* extensions/acpx: sync lockfile after dependency bump
* ACPX: make runtime spawn Windows-safe
* fix: align doctor-config-flow repair tests with default-account migration (#23580 ) (thanks @osolmaz)
2026-02-26 11:00:09 +01:00
Peter Steinberger
8a006a3260
feat(heartbeat): add directPolicy and restore default direct delivery
2026-02-26 03:57:03 +01:00
Peter Steinberger
1e7ec8bfd2
fix(routing): preserve explicit cron account and bound message defaults
...
Co-authored-by: lbo728 <72309817+lbo728@users.noreply.github.com>
Co-authored-by: stakeswky <64798754+stakeswky@users.noreply.github.com>
2026-02-26 02:56:03 +00:00
Peter Steinberger
aaeed3c4ea
test(agents): add missing announce delivery regressions
2026-02-26 00:38:34 +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
Peter Steinberger
2011edc9e5
fix(gateway): preserve agentId through gateway send path
...
Landed from #23249 by @Sid-Qin.
Includes extra regression tests for agentId precedence + blank fallback.
Co-authored-by: Sid <201593046+Sid-Qin@users.noreply.github.com>
2026-02-25 23:31:35 +00:00
Peter Steinberger
24d7612ddf
refactor(heartbeat): harden dm delivery classification
2026-02-25 02:13:07 +00:00
Peter Steinberger
885452f5c1
fix: fail-closed shared-session reply routing ( #24571 ) (thanks @brandonwise)
2026-02-25 02:11:34 +00:00
Peter Steinberger
a805d6b439
fix(heartbeat): block dm targets and internalize blocked prompts
2026-02-25 02:05:45 +00:00
Brandon Wise
389ccda0f6
fix: remove unused DeliverableMessageChannel import
2026-02-25 01:41:31 +00:00
Brandon Wise
f35c902bd6
style: fix oxfmt formatting in targets.test.ts
2026-02-25 01:41:31 +00:00
Brandon Wise
455fbc6b6d
fix(security): prevent cross-channel reply routing in shared sessions
2026-02-25 01:41:31 +00:00
Peter Steinberger
e2362d352d
fix(heartbeat): default target none and internalize relay prompts
2026-02-25 01:28:47 +00:00
Peter Steinberger
2157c490af
test: normalize tmp media path assertion for windows
2026-02-25 00:58:17 +00:00
Peter Steinberger
5c6b2cbc8e
refactor: extract iMessage echo cache and unify suppression guards
2026-02-25 00:53:39 +00:00
Peter Steinberger
2a11c09a8d
fix: harden iMessage echo dedupe and reasoning suppression ( #25897 )
2026-02-25 00:46:56 +00:00
Peter Steinberger
316fad13aa
refactor(outbound): unify attachment hydration flow
2026-02-24 23:48:43 +00:00
Peter Steinberger
5c2a483375
refactor(outbound): centralize attachment media policy
2026-02-24 23:29:05 +00:00
Peter Steinberger
9b53102100
test: add routing/session isolation edge-case regressions
2026-02-24 23:28:58 +00:00
Peter Steinberger
ccbeb332e0
fix: harden routing/session isolation for followups and heartbeat
2026-02-24 23:20:27 +00:00
Peter Steinberger
270ab03e37
fix: enforce local media root checks for attachment hydration
2026-02-24 23:17:48 +00:00
Peter Steinberger
d3da67c7a9
fix(security): lock sandbox tmp media paths to openclaw roots
2026-02-24 23:10:19 +00:00
Marcus Castro
01c1f68ab3
fix(hooks): decouple message:sent internal hook from mirror param
...
(cherry picked from commit 1afd7030f8e5e9dda682f1de5942a9662ac7dbcf)
2026-02-24 04:20:30 +00:00
Vignesh Natarajan
8d9d01447e
chore: align plugin versions and harden outbound cross-provider test
2026-02-22 23:04:17 -08:00
Peter Steinberger
e16f93af0c
fix: stabilize ci test typings and mocks
2026-02-22 21:38:47 +00:00
Peter Steinberger
7bbd597383
fix(media): enforce agent media roots in plugin send actions
...
Co-authored-by: Oliver Drobnik <333270+odrobnik@users.noreply.github.com>
Co-authored-by: thisischappy <257418353+thisischappy@users.noreply.github.com>
2026-02-22 22:24:27 +01:00