Skip to content

fix(approval): show full command in dangerous command approval (#1553)#1649

Merged
teknium1 merged 7 commits into
mainfrom
hermes/hermes-6bb9911e
Mar 17, 2026
Merged

fix(approval): show full command in dangerous command approval (#1553)#1649
teknium1 merged 7 commits into
mainfrom
hermes/hermes-6bb9911e

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

Fixes #1553 — salvaged from PR #1566 by @crazywriter1.

The dangerous command approval prompt truncated commands, making it impossible to see what you were approving. Now the full command is always shown.

Changes

  • CLI: Removed 80-char truncation and [v]iew full menu option — full command always displayed
  • Gateway (TG/Slack): approval_required message now includes full command in a code block
  • Discord: Embed shows full command up to Discord's 4096-char limit (was 500)
  • Windows: Skip SIGALRM-based test timeout fixture (Unix-only)
  • Tests: Updated TestViewFullCommandTestFullCommandAlwaysShown — replaced view-flow tests with direct approval tests

Test plan

  • All 65 approval tests pass

teknium1 and others added 7 commits March 17, 2026 01:45
When a gateway session exceeds the model's context window, Anthropic may
return a generic 400 invalid_request_error with just 'Error' as the
message.  This bypassed the phrase-based context-length detection,
causing the agent to treat it as a non-retryable client error.  Worse,
the failed user message was still persisted to the transcript, making
the session even larger on each attempt — creating an infinite loop.

Three-layer fix:

1. run_agent.py — Fallback heuristic: when a 400 error has a very short
   generic message AND the session is large (>40% of context or >80
   messages), treat it as a probable context overflow and trigger
   compression instead of aborting.

2. run_agent.py + gateway/run.py — Don't persist failed messages:
   when the agent returns failed=True before generating any response,
   skip writing the user's message to the transcript/DB. This prevents
   the session from growing on each failure.

3. gateway/run.py — Smarter error messages: detect context-overflow
   failures and suggest /compact or /reset specifically, instead of a
   generic 'try again' that will fail identically.
Adds two security layers to prevent prompt injection via skills hub
cache files (#1558):

1. read_file: blocks direct reads of ~/.hermes/skills/.hub/ directory
   (index-cache, catalog files). The 3.5MB clawhub_catalog_v1.json
   was the original injection vector — untrusted skill descriptions
   in the catalog contained adversarial text that the model executed.

2. skill_view: warns when skills are loaded from outside the trusted
   ~/.hermes/skills/ directory, and detects common injection patterns
   in skill content ("ignore previous instructions", "<system>", etc.).

Cherry-picked from PR #1562 by ygd58.
…1552)

Long messages sent via send_message tool or cron delivery silently
failed when exceeding platform limits. Gateway adapters handle this
via truncate_message(), but the standalone senders in send_message_tool
bypassed that entirely.

- Apply truncate_message() chunking in _send_to_platform() before
  dispatching to individual platform senders
- Remove naive message[i:i+2000] character split in _send_discord()
  in favor of centralized smart splitting
- Attach media files to last chunk only for Telegram
- Add regression tests for chunking and media placement

Cherry-picked from PR #1557 by llbn.
Previously the command was truncated to 80 chars in CLI (with a
[v]iew full option), 500 chars in Discord embeds, and missing entirely
in Telegram/Slack approval messages. Now the full command is always
displayed everywhere:

- CLI: removed 80-char truncation and [v]iew full menu option
- Gateway (TG/Slack): approval_required message includes full command
  in a code block
- Discord: embed shows full command up to 4096-char limit
- Windows: skip SIGALRM-based test timeout (Unix-only)
- Updated tests: replaced view-flow tests with direct approval tests

Cherry-picked from PR #1566 by crazywriter1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: critical: Dangerous Command approval flow truncates the listing of what command approval is being requested for

4 participants