feat: Filter agent session molecule noise from activity feed

Agent session molecules (gt-gastown-crew-joe, gt-gastown-witness, etc.)
update frequently for status tracking, creating noisy entries in the
activity feed. This change:

- Adds IsAgentSessionBead() to identify agent session beads
- Filters out "update" events for agent sessions from the event feed
- Still updates the agent tree so status is visible there
- Still shows create/complete/fail/delete events for agents

The filtering happens in addEvent() in the TUI feed model. Agent session
updates are identified by parsing the bead ID pattern and checking for
known agent roles (mayor, deacon, witness, refinery, crew, polecat).

Resolves: gt-sb6m4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-29 23:36:29 -08:00
parent e1fed7f72e
commit f9e820985d
3 changed files with 117 additions and 8 deletions

View File

@@ -8,6 +8,7 @@ import (
"github.com/charmbracelet/bubbles/key"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/steveyegge/gastown/internal/beads"
)
// Panel represents which panel has focus
@@ -252,14 +253,7 @@ func (m *Model) updateViewContent() {
// addEvent adds an event and updates the agent tree
func (m *Model) addEvent(e Event) {
m.events = append(m.events, e)
// Keep max 1000 events
if len(m.events) > 1000 {
m.events = m.events[len(m.events)-1000:]
}
// Update agent tree
// Update agent tree first (always do this for status tracking)
if e.Rig != "" {
rig, ok := m.rigs[e.Rig]
if !ok {
@@ -287,6 +281,26 @@ func (m *Model) addEvent(e Event) {
}
}
// Filter out noisy agent session updates from the event feed.
// Agent session molecules (like gt-gastown-crew-joe) update frequently
// for status tracking. These updates are visible in the agent tree,
// so we don't need to clutter the event feed with them.
// We still show create/complete/fail/delete events for agent sessions.
if e.Type == "update" && beads.IsAgentSessionBead(e.Target) {
// Skip adding to event feed, but still refresh the view
// (agent tree was updated above)
m.updateViewContent()
return
}
// Add to event feed
m.events = append(m.events, e)
// Keep max 1000 events
if len(m.events) > 1000 {
m.events = m.events[len(m.events)-1000:]
}
m.updateViewContent()
}