Skip to content

feat(chat): Add per-agent verbosity control across all chat frontends (Discord, Slack, Web) #181

@edspencer

Description

@edspencer

Summary

Add a configurable verbosity level per agent across all chat frontends (Discord, Slack, Web) so users can control how much output they see — from "just the final answer" to "everything I'd see in Claude Code."

Reported by community member Oliver on Discord.

Current Behavior

Each agent can configure output via chat.<platform>.output, backed by the shared ChatOutputSchema:

chat:
  discord:
    output:
      tool_results: true
      tool_result_max_length: 900
      system_status: true
      errors: true

This provides basic toggles, but there's no way to:

  • Show/hide tool calls themselves (only tool results are toggleable)
  • Suppress all intermediate output and only show the final assistant text
  • Show streaming/progress events for a fully verbose mode

Users currently have to modify each frontend's implementation to achieve different verbosity levels per agent.

Proposed Solution

Add a verbosity field to the shared ChatOutputSchema so it applies to all three chat frontends:

chat:
  discord:
    output:
      verbosity: minimal
  slack:
    output:
      verbosity: standard
  web:
    output:
      verbosity: verbose
Level Behavior
minimal Only final assistant text + errors. No tool calls, no tool results, no system status.
standard Current default behavior (tool results, system status, errors).
verbose Everything: tool calls, tool results, system status, streaming/progress events. Closest to the raw Claude Code experience.

The existing granular toggles (tool_results, system_status, etc.) should continue to work and override the verbosity preset when explicitly set.

Implementation Notes

Schema (shared)

  • packages/core/src/config/schema.ts — Add verbosity enum to the shared ChatOutputSchema so all platform-specific schemas (DiscordOutputSchema, SlackOutputSchema, etc.) inherit it automatically.

Frontend-specific filtering

Each frontend has its own message handler that would need verbosity-aware filtering:

  1. packages/discord/src/manager.tsonMessage callback (~line 449-605)
  2. packages/slack/src/manager.ts — equivalent message handler
  3. packages/web/ — web dashboard message display

Shared utilities

Consider extracting a shared shouldShowMessage(messageType, outputConfig) helper into @herdctl/chat so all three frontends apply verbosity rules consistently rather than duplicating the filtering logic.

Scope

  • Schema change: ~10 lines
  • Shared helper: ~30-50 lines
  • Per-frontend wiring: ~20-30 lines each
  • Fully backward-compatible — existing configs default to "standard"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions