Skip to content

Feature: Emit a dedicated event when user switches to a custom agent via /agent #2838

@Arithmomaniac

Description

@Arithmomaniac

Summary

When a user invokes /agent <name> to switch to a custom agent at the session root, no dedicated event is emitted. The only signal that an agent switch occurred is the <agent_instructions> block silently prepended to user.message.data.transformedContent. This makes it difficult for downstream tooling to reliably track which custom agent is active.

Current behavior

  • /agent review-pr-comments rewrites the next user message by prepending <agent_instructions>...</agent_instructions> into transformedContent
  • There is no session.agent_changed or session.agent_invoked event in events.jsonl
  • subagent.selected exists but fires rarely (21 events across 920+ sessions in one user's history) and doesn't appear to be the canonical marker for root-level /agent switches
  • session.mode_changed and session.model_change exist for other session-level state changes, but agents have no equivalent

Impact

  • Session analytics: Tools like copilot-session-tools that enrich events.jsonl into queryable databases cannot reliably count or filter by which custom agent was used. The only workaround is parsing <agent_instructions> blocks out of transformedContent, which is fragile and undocumented.
  • Skill auditing: When auditing skill/agent effectiveness, the lack of a clean event means agent usage counts are dramatically undercounted (in one audit, review-pr-comments showed 0 dispatches via task tool but actually had 390 root-level invocations hidden in transformedContent).
  • Observability: Users and platform teams can't answer "which custom agents are actually being used?" without deep parsing of message content.

Proposed solution

Emit a new event when /agent <name> is invoked at the session root:

{"type": "session.agent_invoked", "agentName": "review-pr-comments", "agentSource": "user", "timestamp": "..."}

Fields:

  • agentName: The agent identifier as it appears in the .agent.md filename
  • agentSource: "user" for custom agents in ~/.copilot/agents/, "project" for repo-level agents, "builtin" for platform agents

This would parallel the existing session.mode_changed and session.model_change events.

Workaround (current)

Parse transformedContent for <agent_instructions> blocks and extract the agent name — but this is fragile, undocumented, and requires access to the full message payload rather than just the event stream.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions