@@ -2784,6 +2784,104 @@ Deno.test("child deck timeout override tightens inherited deadline", async () =>
27842784 }
27852785} ) ;
27862786
2787+ Deno . test ( "child deck timeoutMs=0 disables deck-local timeout" , async ( ) => {
2788+ const origNow = performance . now ;
2789+ let now = 0 ;
2790+ ( performance as { now : ( ) => number } ) . now = ( ) => now ;
2791+
2792+ const dir = await Deno . makeTempDir ( ) ;
2793+ const modHref = modImportPath ( ) ;
2794+ const deckPath = await writeTempDeck (
2795+ dir ,
2796+ "child-timeout-zero.deck.ts" ,
2797+ `
2798+ import { defineDeck } from "${ modHref } ";
2799+ import { z } from "zod";
2800+ export default defineDeck({
2801+ inputSchema: z.any(),
2802+ outputSchema: z.string(),
2803+ guardrails: { timeoutMs: 0 },
2804+ run() {
2805+ (globalThis).__advanceNow?.(20);
2806+ return "late";
2807+ }
2808+ });
2809+ ` ,
2810+ ) ;
2811+
2812+ try {
2813+ ( globalThis as { __advanceNow ?: ( delta : number ) => void } ) . __advanceNow = (
2814+ delta ,
2815+ ) => {
2816+ now += delta ;
2817+ } ;
2818+ const result = await runDeck ( {
2819+ path : deckPath ,
2820+ input : { } ,
2821+ modelProvider : dummyProvider ,
2822+ isRoot : true ,
2823+ guardrails : { timeoutMs : 1_000 } ,
2824+ runDeadlineMs : 1_000 ,
2825+ } ) ;
2826+ assertEquals ( result , "late" ) ;
2827+ } finally {
2828+ delete ( globalThis as { __advanceNow ?: ( delta : number ) => void } )
2829+ . __advanceNow ;
2830+ ( performance as { now : ( ) => number } ) . now = origNow ;
2831+ }
2832+ } ) ;
2833+
2834+ Deno . test ( "child deck timeoutMs=0 still respects inherited deadline" , async ( ) => {
2835+ const origNow = performance . now ;
2836+ let now = 0 ;
2837+ ( performance as { now : ( ) => number } ) . now = ( ) => now ;
2838+
2839+ const dir = await Deno . makeTempDir ( ) ;
2840+ const modHref = modImportPath ( ) ;
2841+ const deckPath = await writeTempDeck (
2842+ dir ,
2843+ "child-timeout-zero-inherited.deck.ts" ,
2844+ `
2845+ import { defineDeck } from "${ modHref } ";
2846+ import { z } from "zod";
2847+ export default defineDeck({
2848+ inputSchema: z.any(),
2849+ outputSchema: z.string(),
2850+ guardrails: { timeoutMs: 0 },
2851+ run() {
2852+ (globalThis).__advanceNow?.(20);
2853+ return "late";
2854+ }
2855+ });
2856+ ` ,
2857+ ) ;
2858+
2859+ try {
2860+ ( globalThis as { __advanceNow ?: ( delta : number ) => void } ) . __advanceNow = (
2861+ delta ,
2862+ ) => {
2863+ now += delta ;
2864+ } ;
2865+ await assertRejects (
2866+ ( ) =>
2867+ runDeck ( {
2868+ path : deckPath ,
2869+ input : { } ,
2870+ modelProvider : dummyProvider ,
2871+ isRoot : true ,
2872+ guardrails : { timeoutMs : 1_000 } ,
2873+ runDeadlineMs : 10 ,
2874+ } ) ,
2875+ Error ,
2876+ "Timeout exceeded" ,
2877+ ) ;
2878+ } finally {
2879+ delete ( globalThis as { __advanceNow ?: ( delta : number ) => void } )
2880+ . __advanceNow ;
2881+ ( performance as { now : ( ) => number } ) . now = origNow ;
2882+ }
2883+ } ) ;
2884+
27872885Deno . test ( "worker sandbox flag defaults false when env access is denied" , async ( ) => {
27882886 const dir = await Deno . makeTempDir ( ) ;
27892887 const modHref = modImportPath ( ) ;
0 commit comments