* fix(active-memory): share one recall per run across retries
Register in-flight recalls per ctx.runId so overlapping or changed-prompt
attempts join a single execution, and gate replacement recalls on settled
timeout cleanup. Entries clear on agent_end. Fixes#106957.
* fix(active-memory): evict rejected recall entries
* test(active-memory): clarify run result retention
* test(active-memory): complete recall result fixture
signalRpcRequest returns the JSON-RPC result via a bare cast, so getAttachment data reaches Buffer.from unvalidated. Node drops out-of-alphabet characters instead of throwing, so a damaged payload was silently written to disk as a corrupted attachment. Canonicalize after the existing size guard and fail with the attachment id instead.
Track full dispatch completion separately for error handling and shutdown drain while allowing same-session follow-ups to steer active runs. Fixes#113180.
Co-authored-by: Taksh <takshkothari09@gmail.com>
* fix(signal): escape real newlines in inbound verbose-log preview
The inbound preview regex matched the literal two-character sequence
backslash-n instead of the actual LF control character, so multi-line
message bodies kept real newlines and split the single-line log record.
Align Signal with the six sibling channels that use replace(/\n/g, "\\n").
Adds a focused test that mocks shouldLogVerbose and asserts the logged
preview stays single-line for an LF-separated body.
* chore: retrigger CI to clear stale checks
* fix(signal): escape all inbound log line breaks
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Use the existing surrogate-safe helpers at the dreaming lead and heading boundaries. Preserve contributor investigations in #107882 and #107910.
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Publish the existing Slack route-based doctor capabilities in channel metadata so cold doctor scans no longer falsely report dropped messages or recommend schema-invalid sender allowlists. Add metadata-only discovery regression. Fixes#110489; thanks @ari-hjunk for the report.
* fix(slack): make MPIM app mentions type-safe
Resolve typeless app mentions through explicit metadata, the scoped event cache, then conversations.info so modern C-prefixed MPIMs cannot be misclassified by event ordering. Add a real Slack QA scenario that requires one reply and cleans up its temporary MPIM.
Co-authored-by: moeealii <75953662+moeealii@users.noreply.github.com>
* fix(slack): type unresolved mention metadata
* fix(slack): satisfy MPIM type contracts
---------
Co-authored-by: moeealii <75953662+moeealii@users.noreply.github.com>
* fix(telegram): surface draft stream delivery failures at warn level
createTelegramDraftController wired the draft stream's warn callback to
logVerbose, so preview send/edit/cleanup failures ("telegram stream
preview failed: ...", "telegram stream preview cleanup failed: ...")
were only emitted when verbose logging was enabled. In the default
configuration a dying preview/draft stream left no operator-visible
trace: the bot just went quiet, especially in progress stream mode
where the activity window is the only delivery surface.
Route the warn callback through the telegram subsystem logger
(telegram/draft-stream) at warn level with lane, chatId, and threadId
context so draft delivery failures show up in default logs. The
verbose log callback is unchanged.
Co-authored-by: Claude <noreply@anthropic.com>
* test(telegram): simplify draft warning logger proof
Co-authored-by: Arseniy Palagin <valeradzigurda3@gmail.com>
* fix(telegram): emit draft terminal delivery diagnostics
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: d1bd0f71-7638-463a-958d-d5b3e2da1047
* fix(telegram): keep draft visibility change scoped
Remove the diagnostic expansion so this contributor PR remains focused on its original warn-level logging repair.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: d1bd0f71-7638-463a-958d-d5b3e2da1047
---------
Co-authored-by: Arseniy Palagin <valeradzigurda3@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Gio Della-Libera <giodl73@gmail.com>
Copilot-Session: d1bd0f71-7638-463a-958d-d5b3e2da1047
app_mention events carry no channel_type, and modern Slack group DMs
(mpims) use C-prefixed channel ids, so prefix inference classifies them
as channels. Mentions in group DMs then bypass the handler's im/mpim
dedupe guard and are processed down the channel path — misrouting
replies, and double-handling alongside message.mpim when dm.groupEnabled
is on.
Confirm against the event-carried type cache and, on a miss, the cached
conversations.info lookup before treating a channel_type-less mention as
a channel mention. Only an authoritative "mpim" answer changes behavior;
a C-prefixed id can never be an im.
Fixes#115463
Co-authored-by: moeealii <>