@@ -281,6 +281,91 @@ describe('DynamicAgentConfigSchema', () => {
281281 const result = DynamicAgentTemplateSchema . safeParse ( template )
282282 expect ( result . success ) . toBe ( true )
283283 } )
284+
285+ it ( 'should reject template with set_output tool but non-json outputMode' , ( ) => {
286+ const template = {
287+ ...validBaseTemplate ,
288+ outputMode : 'last_message' as const ,
289+ toolNames : [ 'end_turn' , 'set_output' ] , // set_output without json mode
290+ }
291+
292+ const result = DynamicAgentTemplateSchema . safeParse ( template )
293+ expect ( result . success ) . toBe ( false )
294+ if ( ! result . success ) {
295+ const setOutputError = result . error . issues . find ( ( issue ) =>
296+ issue . message . includes (
297+ "'set_output' tool requires outputMode to be 'json'" ,
298+ ) ,
299+ )
300+ expect ( setOutputError ) . toBeDefined ( )
301+ expect ( setOutputError ?. message ) . toContain (
302+ "'set_output' tool requires outputMode to be 'json'" ,
303+ )
304+ }
305+ } )
306+
307+ it ( 'should reject template with set_output tool and all_messages outputMode' , ( ) => {
308+ const template = {
309+ ...validBaseTemplate ,
310+ outputMode : 'all_messages' as const ,
311+ toolNames : [ 'end_turn' , 'set_output' ] , // set_output without json mode
312+ }
313+
314+ const result = DynamicAgentTemplateSchema . safeParse ( template )
315+ expect ( result . success ) . toBe ( false )
316+ if ( ! result . success ) {
317+ const setOutputError = result . error . issues . find ( ( issue ) =>
318+ issue . message . includes (
319+ "'set_output' tool requires outputMode to be 'json'" ,
320+ ) ,
321+ )
322+ expect ( setOutputError ) . toBeDefined ( )
323+ }
324+ } )
325+
326+ it ( 'should reject template with non-empty subagents but missing spawn_agents tool' , ( ) => {
327+ const template = {
328+ ...validBaseTemplate ,
329+ subagents : [ 'researcher' , 'file-picker' ] , // Non-empty subagents
330+ toolNames : [ 'end_turn' , 'read_files' ] , // Missing spawn_agents
331+ }
332+
333+ const result = DynamicAgentTemplateSchema . safeParse ( template )
334+ expect ( result . success ) . toBe ( false )
335+ if ( ! result . success ) {
336+ const spawnAgentsError = result . error . issues . find ( ( issue ) =>
337+ issue . message . includes (
338+ "Non-empty subagents array requires the 'spawn_agents' tool" ,
339+ ) ,
340+ )
341+ expect ( spawnAgentsError ) . toBeDefined ( )
342+ expect ( spawnAgentsError ?. message ) . toContain (
343+ "Non-empty subagents array requires the 'spawn_agents' tool" ,
344+ )
345+ }
346+ } )
347+
348+ it ( 'should accept template with non-empty subagents and spawn_agents tool' , ( ) => {
349+ const template = {
350+ ...validBaseTemplate ,
351+ subagents : [ 'researcher' , 'file-picker' ] ,
352+ toolNames : [ 'end_turn' , 'spawn_agents' ] ,
353+ }
354+
355+ const result = DynamicAgentTemplateSchema . safeParse ( template )
356+ expect ( result . success ) . toBe ( true )
357+ } )
358+
359+ it ( 'should accept template with empty subagents and no spawn_agents tool' , ( ) => {
360+ const template = {
361+ ...validBaseTemplate ,
362+ subagents : [ ] , // Empty subagents
363+ toolNames : [ 'end_turn' , 'read_files' ] , // No spawn_agents needed
364+ }
365+
366+ const result = DynamicAgentTemplateSchema . safeParse ( template )
367+ expect ( result . success ) . toBe ( true )
368+ } )
284369 } )
285370
286371 describe ( 'Edge Cases' , ( ) => {
0 commit comments