@@ -146,6 +146,78 @@ describe('CloudflareAgentSandbox', () => {
146146 ensureBootstrapWrapper . mockRestore ( ) ;
147147 } ) ;
148148
149+ it ( 'reclaims stale bootstrap workspaces without inspecting Docker' , async ( ) => {
150+ const bootstrapSession = { } ;
151+ const createSession = vi . fn ( ) . mockResolvedValue ( bootstrapSession ) ;
152+ const ensureBootstrapWrapper = vi
153+ . spyOn ( WrapperClient , 'ensureBootstrapWrapper' )
154+ . mockResolvedValueOnce ( { client : { } as WrapperClient } ) ;
155+ const exec = vi
156+ . fn ( )
157+ . mockResolvedValueOnce ( { exitCode : 1 , stdout : '' , stderr : '' } )
158+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '536870912 10485760000\n' , stderr : '' } )
159+ . mockResolvedValueOnce ( {
160+ exitCode : 0 ,
161+ stdout : 'agent_stale-aaaa\nagent_cloudflare\n' ,
162+ stderr : '' ,
163+ } )
164+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '0\n' , stderr : '' } )
165+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '' , stderr : '' } )
166+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '' , stderr : '' } )
167+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '3145728000 10485760000\n' , stderr : '' } ) ;
168+ const sandbox = new CloudflareAgentSandbox ( { } as Env , metadata ( ) , {
169+ resolveSandbox : ( ) =>
170+ ( {
171+ exec,
172+ listProcesses : vi . fn ( ) . mockResolvedValue ( [ ] ) ,
173+ createSession,
174+ } ) as unknown as SandboxInstance ,
175+ } ) ;
176+
177+ await expect ( sandbox . ensureWrapper ( ensureRequest ( ) ) ) . resolves . toMatchObject ( {
178+ status : 'wrapper-running' ,
179+ } ) ;
180+ expect ( exec . mock . calls . every ( call => ! call [ 0 ] . includes ( 'docker' ) ) ) . toBe ( true ) ;
181+ expect ( createSession ) . toHaveBeenCalled ( ) ;
182+ ensureBootstrapWrapper . mockRestore ( ) ;
183+ } ) ;
184+
185+ it ( 'keeps unresolved DIND bootstrap cleanup fail-closed' , async ( ) => {
186+ const unresolvedDindMetadata = {
187+ ...metadata ( ) ,
188+ workspace : { sandboxId : 'dind-unresolved' } ,
189+ } satisfies SessionMetadata ;
190+ const request = ensureRequest ( ) ;
191+ request . plan . workspace = { sandboxId : 'dind-unresolved' , metadata : unresolvedDindMetadata } ;
192+ const exec = vi
193+ . fn ( )
194+ . mockResolvedValueOnce ( { exitCode : 1 , stdout : '' , stderr : '' } )
195+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '536870912 10485760000\n' , stderr : '' } )
196+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : 'agent_stale-aaaa\n' , stderr : '' } )
197+ . mockResolvedValueOnce ( {
198+ exitCode : 0 ,
199+ stdout : '/run/user/1000/docker.sock' ,
200+ stderr : '' ,
201+ } )
202+ . mockRejectedValueOnce ( new Error ( 'docker inspection unavailable' ) )
203+ . mockResolvedValueOnce ( { exitCode : 0 , stdout : '536870912 10485760000\n' , stderr : '' } ) ;
204+ const sandbox = new CloudflareAgentSandbox ( { } as Env , unresolvedDindMetadata , {
205+ resolveSandbox : ( ) =>
206+ ( {
207+ exec,
208+ listProcesses : vi . fn ( ) . mockResolvedValue ( [ ] ) ,
209+ createSession : vi . fn ( ) ,
210+ } ) as unknown as SandboxInstance ,
211+ } ) ;
212+
213+ await expect ( sandbox . ensureWrapper ( request ) ) . rejects . toBeInstanceOf (
214+ WorkspaceCapacityAdmissionRejectedError
215+ ) ;
216+ expect ( exec . mock . calls [ 4 ] [ 0 ] ) . toContain ( 'docker ps' ) ;
217+ expect ( exec . mock . calls . every ( call => ! call [ 0 ] . includes ( 'stat' ) ) ) . toBe ( true ) ;
218+ expect ( exec . mock . calls . every ( call => ! call [ 0 ] . includes ( 'rm -rf' ) ) ) . toBe ( true ) ;
219+ } ) ;
220+
149221 it ( 'passes a leased physical identity into bootstrap startup' , async ( ) => {
150222 const bootstrapSession = { } ;
151223 const ensureBootstrapWrapper = vi
0 commit comments