hermes-agent/hermes_cli
Teknium 558dab0e3e feat(slack): opt-in reaction triggers, removed events, hooks, channel handoff
Build the full reaction pipeline on top of the #29916 base:

- Opt-in gate: slack.reaction_triggers (default OFF — reaction events
  stay acked-and-dropped so busy channels don't wake the agent on every
  emoji). 'true' routes reactions on the bot's OWN messages; an explicit
  emoji-name list routes those emojis from any message (handoff flows).
- reaction_removed events now route too, distinguished by the
  cross-platform text convention reaction:added:<emoji> /
  reaction:removed:<emoji> (matches the Feishu and Photon adapters, so
  agents and skills see one shape everywhere).
- Authorization: the reactor becomes the synthesized message's user, so
  the early _is_user_authorized gate and allowed_channels whitelist
  apply exactly as for typed messages. _hermes_force_process only skips
  the mention requirement (a reaction on the bot's own message is
  definitionally addressed to the bot), mirroring Feishu/Photon.
- Gateway hooks (#33111 by @johnkattenhorn): every human reaction on a
  message item fires reaction:added / reaction:removed through the new
  BasePlatformAdapter.set_reaction_handler → GatewayRunner
  ._handle_reaction_event → HookRegistry.emit, independent of the
  routing opt-in. Documented in hooks.md.
- Channel handoff (#45265 by @Kev-fs): slack.reaction_trigger_target
  routes the reaction turn to a configured channel (top-level via
  _hermes_no_thread_response + reply-anchor suppression in
  gateway/platforms/base.py) or C123:<ts> thread.
- Manifest: reaction_removed event subscription added alongside
  reaction_added/reactions:read.
- Docs: slack.md Reaction Triggers section; hooks.md event table rows.

Also credits #44508 by @harrisonmedmedmetrics (inbound reaction_added
handling — same plumbing class, superseded by this consolidated shape).

Co-authored-by: johnkattenhorn <john.kattenhorn.personal@gmail.com>
Co-authored-by: Kev-fs <kevin@fleetsmarts.net>
Co-authored-by: harrisonmedmedmetrics <harrison@medmetricsrx.com>
2026-07-23 11:50:08 -07:00
..
dashboard_auth fix(dashboard-auth): harden the public native-authorize surface 2026-07-22 06:50:50 -07:00
proxy rip out brew + pip/PyPI wheel support (#68217) 2026-07-22 16:51:01 -04:00
subcommands rip out brew + pip/PyPI wheel support (#68217) 2026-07-22 16:51:01 -04:00
__init__.py chore: release v0.19.0 (2026.7.20) (#68175) 2026-07-20 11:35:21 -07:00
_early_recovery.py fix(update): stdlib-only early recovery before hermes_cli.main imports 2026-07-23 07:33:16 -07:00
_parser.py
…
_subprocess_compat.py fix(windows): hidden-console daemons — extend the parent-console fix to every detached spawn path (#70205) 2026-07-23 11:13:14 -07:00
active_sessions.py
…
auth.py fix(auth): count MoA preset slots as explicit provider configuration 2026-07-23 11:21:13 -07:00
auth_commands.py
…
azure_detect.py
…
backup.py
…
banner.py rip out brew + pip/PyPI wheel support (#68217) 2026-07-22 16:51:01 -04:00
blueprint_cmd.py
…
browser_connect.py
…
build_info.py
…
bundles.py
…
callbacks.py fix(clarify): one canonical timeout across CLI, TUI/desktop, and gateway (#69774) 2026-07-22 23:25:13 -05:00
checkpoints.py
…
claw.py
…
cli_agent_setup_mixin.py fix(timeline): persist typed display events (#69771) 2026-07-23 14:46:24 -04:00
cli_billing_mixin.py feat(cli): plan catalog on Free + plan= deep link + top-up/auto-refill copy split (#68689) 2026-07-22 08:11:09 +05:30
cli_commands_mixin.py fix(timeline): persist typed display events (#69771) 2026-07-23 14:46:24 -04:00
cli_output.py
…
clipboard.py
…
codex_models.py fix(codex): send ChatGPT-Account-Id on /models probes 2026-07-21 05:27:13 -07:00
codex_runtime_plugin_migration.py
…
codex_runtime_switch.py
…
colors.py
…
commands.py feat(status-bar): add /battery toggle for a color-coded battery read-out 2026-07-21 13:54:11 -05:00
completion.py
…
config.py fix(gateway): bound hygiene compression failures 2026-07-23 07:26:27 -07:00
console_engine.py rip out brew + pip/PyPI wheel support (#68217) 2026-07-22 16:51:01 -04:00
container_boot.py
…
context_switch_guard.py fix(cli): honor custom_providers in preflight shrink warning 2026-07-22 21:17:21 -07:00
copilot_auth.py
…
credential_lifecycle.py
…
cron.py
…
curator.py
…
curses_ui.py Nous portal model pricing (#69579) 2026-07-22 16:47:06 -04:00
dashboard_register.py
…
debug.py
…
default_soul.py
…
dep_ensure.py
…
diagnostics_upload.py
…
dingtalk_auth.py
…
doctor.py refactor: dedupe check_info call + fix trailing whitespace in doctor 2026-07-23 17:32:38 +05:30
dump.py
…
env_loader.py fix(secrets): scope BWS-injected provider keys 2026-07-22 04:39:17 -07:00
fallback_cmd.py
…
fallback_config.py
…
gateway.py fix(windows): hidden-console daemons — extend the parent-console fix to every detached spawn path (#70205) 2026-07-23 11:13:14 -07:00
gateway_enroll.py
…
gateway_windows.py fix(windows): hidden-console daemons — extend the parent-console fix to every detached spawn path (#70205) 2026-07-23 11:13:14 -07:00
goals.py fix(goals): auto-pause goal loop on consecutive transport failures 2026-07-20 05:38:25 -07:00
gui_uninstall.py
…
hooks.py
…
input_sanitize.py
…
inventory.py Nous portal model pricing (#69579) 2026-07-22 16:47:06 -04:00
journey.py
…
kanban.py fix(kanban): harden delegated-child mutation boundary 2026-07-23 07:33:36 -07:00
kanban_db.py fix(kanban): stop decompose siblings sharing one worktree checkout 2026-07-23 09:27:13 -07:00
kanban_decompose.py
…
kanban_diagnostics.py
…
kanban_specify.py
…
kanban_swarm.py
…
logs.py
…
main.py fix(windows): hidden-console daemons — extend the parent-console fix to every detached spawn path (#70205) 2026-07-23 11:13:14 -07:00
managed_scope.py
…
managed_uv.py
…
mcp_catalog.py
…
mcp_config.py
…
mcp_picker.py
…
mcp_security.py
…
mcp_startup.py fix(mcp): allow background discovery retry after a run that connected nothing 2026-07-21 12:43:27 -07:00
memory_oauth.py
…
memory_setup.py fix: use canonical _get_platform_tools resolver for memory tool status 2026-07-23 17:50:20 +05:30
middleware.py
…
migrate.py
…
moa_cmd.py
…
moa_config.py
…
model_catalog.py
…
model_cost_guard.py
…
model_normalize.py
…
model_setup_flows.py
…
model_switch.py fix: restore base_url rstrip, extract should_clear_context_pin helper 2026-07-22 11:19:37 +05:30
models.py fix(moa): route Copilot slots by target model 2026-07-23 08:26:57 -07:00
nous_account.py
…
nous_auth_keepalive.py
…
nous_billing.py fix(billing): rename user-facing "terminal billing" copy to Remote Spending (#68355) 2026-07-21 12:20:25 +05:30
nous_subscription.py
…
onepassword_secrets_cli.py feat(secrets): one-command token rotation + actionable startup errors for all secret sources (#68605) 2026-07-21 06:41:04 -07:00
oneshot.py fix: preserve named custom provider vision overrides 2026-07-23 17:57:33 +05:30
pairing.py
…
partial_compress.py
…
pets.py
…
platforms.py
…
plugins.py
…
plugins_cmd.py
…
portal_cli.py
…
profile_describer.py
…
profile_distribution.py
…
profiles.py
…
projects_cmd.py
…
projects_db.py feat(desktop): configure repository discovery (supersedes #67630) (#68642) 2026-07-21 10:09:31 -04:00
prompt_size.py
…
provider_catalog.py
…
providers.py fix(picker): scope exact-ID resolution to lossy alias collapses only 2026-07-20 10:17:57 -07:00
psutil_android.py
…
pt_input_extras.py
…
pty_bridge.py
…
pty_session.py
…
relaunch.py
…
route_identity.py fix: restore base_url rstrip, extract should_clear_context_pin helper 2026-07-22 11:19:37 +05:30
runtime_provider.py fix(moa): route every Copilot credential path by target 2026-07-23 08:26:57 -07:00
secret_prompt.py
…
secrets_cli.py fix(secrets): validate bitwarden status token 2026-07-22 03:20:09 -07:00
security_advisories.py
…
security_audit.py
…
security_audit_startup.py
…
send_cmd.py
…
service_manager.py
…
session_export.py
…
session_export_html.py
…
session_export_md.py
…
session_filters.py
…
session_listing.py
…
session_recap.py
…
setup.py fix(models): complete kimi-k3 rollout across Kimi-direct catalog surfaces 2026-07-20 08:47:55 -07:00
setup_whatsapp_cloud.py
…
skills_config.py
…
skills_hub.py
…
skin_cmd.py feat(themes): `hermes skin set` — deterministic one-color tweak, bg untouched 2026-07-21 21:00:43 -05:00
skin_engine.py feat(themes): dedicated code-syntax palette keys 2026-07-21 21:00:43 -05:00
slack_cli.py feat(slack): opt-in reaction triggers, removed events, hooks, channel handoff 2026-07-23 11:50:08 -07:00
sqlite_util.py
…
status.py
…
stdio.py
…
suggestions_cmd.py
…
telegram_managed_bot.py
…
timeouts.py
…
tips.py fix(cli): widen startup worktree pruning to all .worktrees/ trees and detect squash-merged work (#69831) 2026-07-23 07:33:07 -07:00
tools_config.py fix: resolve cua-driver across computer-use surfaces 2026-07-23 00:42:46 -05:00
toolset_validation.py
…
uninstall.py
…
urllib_security.py
…
voice.py
…
web_git.py
…
web_server.py fix(windows): hidden-console daemons — extend the parent-console fix to every detached spawn path (#70205) 2026-07-23 11:13:14 -07:00
webhook.py
…
win_pty_bridge.py
…
windows_ssh_runtime.py
…
write_approval_commands.py
…
xai_retirement.py
…