@@ -212,6 +212,89 @@ describe('sdk-event-handlers', () => {
212212 expect ( getStreamingAgents ( ) . has ( 'tool-1-0' ) ) . toBe ( false )
213213 } )
214214
215+ test ( 'matches underscore direct-tool aliases to hyphenated agent ids' , ( ) => {
216+ const { ctx, getMessages, getStreamingAgents } = createTestContext ( )
217+ const handleEvent = createEventHandler ( ctx )
218+ const handleChunk = createStreamChunkHandler ( ctx )
219+
220+ handleEvent ( {
221+ type : 'tool_call' ,
222+ toolCallId : 'tool-1' ,
223+ toolName : 'spawn_agents' ,
224+ input : {
225+ agents : [
226+ {
227+ agent_type : 'code_reviewer_lite' ,
228+ prompt : 'Review this change' ,
229+ } ,
230+ ] ,
231+ } ,
232+ agentId : 'main-agent' ,
233+ parentAgentId : undefined ,
234+ } as any )
235+
236+ handleEvent ( {
237+ type : 'subagent_start' ,
238+ agentId : 'agent-real' ,
239+ agentType : 'code-reviewer-lite' ,
240+ displayName : 'Code Reviewer Lite' ,
241+ onlyChild : true ,
242+ parentAgentId : undefined ,
243+ params : undefined ,
244+ prompt : 'Review this change' ,
245+ } )
246+
247+ handleChunk ( {
248+ type : 'subagent_chunk' ,
249+ agentId : 'agent-real' ,
250+ agentType : 'code-reviewer-lite' ,
251+ chunk : 'streamed review' ,
252+ } )
253+
254+ handleEvent ( {
255+ type : 'subagent_finish' ,
256+ agentId : 'agent-real' ,
257+ agentType : 'code-reviewer-lite' ,
258+ displayName : 'Code Reviewer Lite' ,
259+ onlyChild : true ,
260+ parentAgentId : undefined ,
261+ params : undefined ,
262+ prompt : 'Review this change' ,
263+ } )
264+
265+ handleEvent ( {
266+ type : 'tool_result' ,
267+ toolCallId : 'tool-1' ,
268+ toolName : 'spawn_agents' ,
269+ output : [
270+ {
271+ type : 'json' ,
272+ value : [
273+ {
274+ agentName : 'code-reviewer-lite' ,
275+ agentType : 'code-reviewer-lite' ,
276+ value : 'streamed review' ,
277+ } ,
278+ ] ,
279+ } ,
280+ ] ,
281+ } as any )
282+
283+ const blocks = getMessages ( ) [ 0 ] . blocks ?? [ ]
284+ expect ( blocks ) . toHaveLength ( 1 )
285+ const agentBlock = blocks [ 0 ] as AgentContentBlock
286+ expect ( agentBlock . agentId ) . toBe ( 'agent-real' )
287+ expect ( agentBlock . agentName ) . toBe ( 'code-reviewer-lite' )
288+ expect ( agentBlock . agentType ) . toBe ( 'code-reviewer-lite' )
289+ expect ( agentBlock . status ) . toBe ( 'complete' )
290+ expect ( agentBlock . blocks ) . toHaveLength ( 1 )
291+ expect ( agentBlock . blocks ?. [ 0 ] ) . toMatchObject ( {
292+ type : 'text' ,
293+ content : 'streamed review' ,
294+ } )
295+ expect ( getStreamingAgents ( ) . size ) . toBe ( 0 )
296+ } )
297+
215298 test ( 'handles spawn_agents tool results and clears streaming agents' , ( ) => {
216299 const { ctx, getMessages, getStreamingAgents } = createTestContext ( )
217300 ctx . message . updater . addBlock (
0 commit comments