the universal sandbox runtime for agents and humans. pocketenv.io
sandbox openclaw agent claude-code vercel-sandbox deno-sandbox cloudflare-sandbox atproto sprites daytona
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

add logs

+9 -1
+9 -1
apps/sandbox/src/providers/modal/mod.ts
··· 49 49 }, ""); 50 50 const result = await this.sandbox.exec(["bash", "-c", command]); 51 51 52 + consola.info(`exec command: ${command}`); 52 53 const [stdout, stderr, exitCode] = await Promise.all([ 53 54 result.stdout.readText(), 54 55 result.stderr.readText(), 55 56 result.wait(), 56 57 ]); 58 + consola.info(`exitCode=${exitCode}`); 57 59 58 60 return { ...result, stdout, stderr, exitCode }; 59 61 } ··· 120 122 ? `${env.VOLUME_BUCKET}:${prefix}` 121 123 : env.VOLUME_BUCKET; 122 124 123 - await this.sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 125 + await this 126 + .sh`AWS_ACCESS_KEY_ID=${env.R2_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY=${env.R2_SECRET_ACCESS_KEY} nohup tigrisfs --endpoint "https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com" -o allow_other,default_permissions ${bucketPath} ${path} > /dev/null 2>&1 &`; 124 127 } 125 128 126 129 async unmount(path: string): Promise<void> { ··· 137 140 () => false, 138 141 ); 139 142 modalAppName = `${modalAppName}-${suffix}`; 143 + consola.info("Connecting to Modal with app name:", modalAppName); 140 144 const modal = new ModalClient({ 141 145 tokenId: options.modalTokenId || env.MODAL_TOKEN_ID!, 142 146 tokenSecret: options.modalTokenSecret || env.MODAL_TOKEN_SECRET!, 143 147 }); 148 + consola.info("Creating Modal sandbox with app name:", modalAppName); 144 149 const app = await modal.apps.fromName( 145 150 options.modalAppName || modalAppName, 146 151 { 147 152 createIfMissing: true, 148 153 }, 149 154 ); 155 + consola.info("Setup image for Modal sandbox with app name:", modalAppName); 150 156 const image = modal.images.fromRegistry( 151 157 options.image || "ghcr.io/pocketenv-io/daytona-openclaw:0.1.0", 152 158 ); 159 + consola.info("Creating Modal sandbox with app name:", modalAppName); 153 160 const sandbox = await modal.sandboxes.create(app, image); 161 + consola.info("Created Modal sandbox with ID:", sandbox.sandboxId); 154 162 155 163 return new ModalSandbox(sandbox); 156 164 }