Summary
When a new .agent.md file is added to .github/agents/ during an active conversation, the task tool's agent_type enum does not update - even after session.agent.reload successfully rescans the disk and the server's agent registry is refreshed. Users must start a new conversation (/clear) for the task tool to recognize newly added agents.
Expected Behavior
After session.agent.reload is triggered (via extension or other mechanism), the task tool should recognize newly loaded agents within the same conversation - no restart required.
Actual Behavior
The task tool captures its agent list once in a closure at creation time and never refreshes it. Even though session.agent.reload RPC exists, works, and the server emits session.custom_agents_updated event, the task tool's closure remains stale.
Reproduction Steps
- Start a Copilot CLI conversation in a repo with
.github/agents/
- Create a new agent file:
.github/agents/my-new-agent.agent.md
- Trigger reload (via extension calling
session.agent.reload RPC, or manually)
- Try to use
task tool with agent_type: "my-new-agent" - fails validation
- Run
/clear and try again - now it works
Root Cause
taskTool.ts builds the allAgentNames array in a closure when the tool is first created. There is no mechanism to rebuild this closure when agents change. The refreshTools path only handles externalToolsVersion changes (extension tools), not agent list mutations.
Proposed Fix
When session.custom_agents_updated is emitted (after reload), the task tool's agent enum should be refreshed. Options:
- Lazy validation - Instead of validating against a static enum, query the current agent registry at invocation time
- Tool rebuild - Re-create the task tool when agents change, similar to how
refreshTools handles extension tool changes
- Event subscription - Have the task tool subscribe to
session.custom_agents_updated and update its internal list
Option 1 (lazy validation) is simplest and most resilient.
Additional Context
session.agent.reload is defined in the schema with stability: experimental
- Node SDK 1.0.10 does not expose
agent.reload() in typed client - must use raw connection.sendRequest
- Extensions CAN trigger reload successfully; the gap is only in the task tool's stale closure
- This blocks agent hot-reload workflows where developers iterate without restarting conversations
Environment
- Copilot CLI (latest as of 2025-07)
- @github/copilot SDK 1.0.10
- Windows 11
Summary
When a new
.agent.mdfile is added to.github/agents/during an active conversation, thetasktool'sagent_typeenum does not update - even aftersession.agent.reloadsuccessfully rescans the disk and the server's agent registry is refreshed. Users must start a new conversation (/clear) for the task tool to recognize newly added agents.Expected Behavior
After
session.agent.reloadis triggered (via extension or other mechanism), thetasktool should recognize newly loaded agents within the same conversation - no restart required.Actual Behavior
The task tool captures its agent list once in a closure at creation time and never refreshes it. Even though
session.agent.reloadRPC exists, works, and the server emitssession.custom_agents_updatedevent, the task tool's closure remains stale.Reproduction Steps
.github/agents/.github/agents/my-new-agent.agent.mdsession.agent.reloadRPC, or manually)tasktool withagent_type: "my-new-agent"- fails validation/clearand try again - now it worksRoot Cause
taskTool.tsbuilds theallAgentNamesarray in a closure when the tool is first created. There is no mechanism to rebuild this closure when agents change. TherefreshToolspath only handlesexternalToolsVersionchanges (extension tools), not agent list mutations.Proposed Fix
When
session.custom_agents_updatedis emitted (after reload), the task tool's agent enum should be refreshed. Options:refreshToolshandles extension tool changessession.custom_agents_updatedand update its internal listOption 1 (lazy validation) is simplest and most resilient.
Additional Context
session.agent.reloadis defined in the schema with stability: experimentalagent.reload()in typed client - must use rawconnection.sendRequestEnvironment