@@ -17,6 +17,7 @@ const {
1717const registry = require ( "./lib/registry" ) ;
1818const nim = require ( "./lib/nim" ) ;
1919const policies = require ( "./lib/policies" ) ;
20+ const { validateInstanceName, buildSshCommand, buildRsyncCommand, shellQuote } = require ( "./lib/deploy" ) ;
2021
2122// ── Global commands ──────────────────────────────────────────────
2223
@@ -62,6 +63,7 @@ async function deploy(instanceName) {
6263 await ensureGithubToken ( ) ;
6364 }
6465 const name = instanceName ;
66+ validateInstanceName ( name ) ;
6567 const gpu = process . env . NEMOCLAW_GPU || "a2-highgpu-1g:nvidia-tesla-a100:1" ;
6668
6769 console . log ( "" ) ;
@@ -83,7 +85,7 @@ async function deploy(instanceName) {
8385
8486 if ( ! exists ) {
8587 console . log ( ` Creating Brev instance '${ name } ' (${ gpu } )...` ) ;
86- run ( `brev create ${ name } --gpu "${ gpu } "` ) ;
88+ run ( `brev create ${ shellQuote ( name ) } --gpu "${ gpu } "` ) ;
8789 } else {
8890 console . log ( ` Brev instance '${ name } ' already exists.` ) ;
8991 }
@@ -93,7 +95,7 @@ async function deploy(instanceName) {
9395 console . log ( " Waiting for SSH..." ) ;
9496 for ( let i = 0 ; i < 60 ; i ++ ) {
9597 try {
96- execSync ( `ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no ${ name } 'echo ok' 2>/dev/null` , { encoding : "utf-8" , stdio : "pipe" } ) ;
98+ execSync ( `ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=accept-new ${ shellQuote ( name ) } 'echo ok' 2>/dev/null` , { encoding : "utf-8" , stdio : "pipe" } ) ;
9799 break ;
98100 } catch {
99101 if ( i === 59 ) {
@@ -105,8 +107,12 @@ async function deploy(instanceName) {
105107 }
106108
107109 console . log ( " Syncing NemoClaw to VM..." ) ;
108- run ( `ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR ${ name } 'mkdir -p /home/ubuntu/nemoclaw'` ) ;
109- run ( `rsync -az --delete --exclude node_modules --exclude .git --exclude src -e "ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR" "${ ROOT } /scripts" "${ ROOT } /Dockerfile" "${ ROOT } /nemoclaw" "${ ROOT } /nemoclaw-blueprint" "${ ROOT } /bin" "${ ROOT } /package.json" ${ name } :/home/ubuntu/nemoclaw/` ) ;
110+ run ( buildSshCommand ( name , "mkdir -p /home/ubuntu/nemoclaw" ) ) ;
111+ run ( buildRsyncCommand (
112+ [ `${ ROOT } /scripts` , `${ ROOT } /Dockerfile` , `${ ROOT } /nemoclaw` , `${ ROOT } /nemoclaw-blueprint` , `${ ROOT } /bin` , `${ ROOT } /package.json` ] ,
113+ name ,
114+ "/home/ubuntu/nemoclaw/"
115+ ) ) ;
110116
111117 const envLines = [ `NVIDIA_API_KEY=${ process . env . NVIDIA_API_KEY } ` ] ;
112118 const ghToken = process . env . GITHUB_TOKEN ;
@@ -115,21 +121,21 @@ async function deploy(instanceName) {
115121 if ( tgToken ) envLines . push ( `TELEGRAM_BOT_TOKEN=${ tgToken } ` ) ;
116122 const envTmp = path . join ( os . tmpdir ( ) , `nemoclaw-env-${ Date . now ( ) } ` ) ;
117123 fs . writeFileSync ( envTmp , envLines . join ( "\n" ) + "\n" , { mode : 0o600 } ) ;
118- run ( `scp -q -o StrictHostKeyChecking=no -o LogLevel=ERROR "${ envTmp } " ${ name } :/home/ubuntu/nemoclaw/.env` ) ;
124+ run ( `scp -q -o StrictHostKeyChecking=accept-new -o LogLevel=ERROR "${ envTmp } " ${ shellQuote ( name ) } :/home/ubuntu/nemoclaw/.env` ) ;
119125 fs . unlinkSync ( envTmp ) ;
120126
121127 console . log ( " Running setup..." ) ;
122- run ( `ssh -t -o StrictHostKeyChecking=no -o LogLevel=ERROR ${ name } 'cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && bash scripts/brev-setup.sh'` ) ;
128+ run ( `ssh -t -o StrictHostKeyChecking=accept-new -o LogLevel=ERROR ${ shellQuote ( name ) } 'cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && bash scripts/brev-setup.sh'` ) ;
123129
124130 if ( tgToken ) {
125131 console . log ( " Starting services..." ) ;
126- run ( `ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR ${ name } ' cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && bash scripts/start-services.sh'` ) ;
132+ run ( buildSshCommand ( name , " cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && bash scripts/start-services.sh" ) ) ;
127133 }
128134
129135 console . log ( "" ) ;
130136 console . log ( " Connecting to sandbox..." ) ;
131137 console . log ( "" ) ;
132- run ( `ssh -t -o StrictHostKeyChecking=no -o LogLevel=ERROR ${ name } 'cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && openshell sandbox connect nemoclaw'` ) ;
138+ run ( `ssh -t -o StrictHostKeyChecking=accept-new -o LogLevel=ERROR ${ shellQuote ( name ) } 'cd /home/ubuntu/nemoclaw && set -a && . .env && set +a && openshell sandbox connect nemoclaw'` ) ;
133139}
134140
135141async function start ( ) {
0 commit comments