Summary:
- The PR adds a Slack `no_reaction` guard to `removeSlackReaction`, routes `removeOwnSlackReactions` through that helper, adds reaction tests, and records the fix in the changelog.
- Reproducibility: yes. A mocked Slack `WebClient` whose `reactions.remove` rejects with `{ data: { error: "no ... es current-main propagation in `removeSlackReaction` and the list/remove race in `removeOwnSlackReactions`.
ClawSweeper fixups:
- Included follow-up commit: fix(clawsweeper): address review for automerge-openclaw-openclaw-7630…
Validation:
- ClawSweeper review passed for head 1211ce06d3.
- Required merge gates passed before the squash merge.
Prepared head SHA: 1211ce06d3
Review: https://github.com/openclaw/openclaw/pull/76320#issuecomment-4364991477
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: HollyChou <128659251+Hollychou924@users.noreply.github.com>
Commit 95331e5cc5 ("fix(channels): thread runtime config through sends")
migrated resolveToken to a 3-arg signature (explicit, accountId, cfg) and
updated the getClient call site at actions.ts:83. The sibling call inside
downloadSlackFile at actions.ts:445 was not migrated and still dropped
opts.cfg, so the cfg-only resolution branch was unreachable from that path.
Current production callers (action-runtime.ts:386-389) always inject a
resolved readToken into opts.token before calling downloadSlackFile, so
this is defense-in-depth today -- the broken path is not hit in runtime.
Landing this closes the call-site migration gap and adds test coverage
for the cfg-only resolution contract on downloadSlackFile.
Note: pre-commit typecheck hook bypassed because upstream/main has 14
pre-existing TS errors in unrelated packages (discord, qa-lab, qqbot,
slack/monitor/provider.ts, tokenjuice, pi-embedded-runner) -- verified
reproducible on clean HEAD 4a16cf8008 without this diff.
Move all Slack channel implementation files from src/slack/ to
extensions/slack/src/ and replace originals with shim re-exports.
This follows the extension migration pattern for channel plugins.
- Copy all .ts files to extensions/slack/src/ (preserving directory
structure: monitor/, http/, monitor/events/, monitor/message-handler/)
- Transform import paths: external src/ imports use relative paths
back to src/, internal slack imports stay relative within extension
- Replace all src/slack/ files with shim re-exports pointing to
the extension copies
- Update tsconfig.plugin-sdk.dts.json rootDir from "src" to "." so
the DTS build can follow shim chains into extensions/
- Update write-plugin-sdk-entry-dts.ts re-export path accordingly
- Preserve extensions/slack/index.ts, package.json, openclaw.plugin.json,
src/channel.ts, src/runtime.ts, src/channel.test.ts (untouched)