I tracked it down to a missing line
In jsdb_source_1.8.0.7/rs/io_file.cpp at line 223 add
IsText=textmode;
Without that, IsText is left uninitialized, sometimes 0, sometimes not.
When it is not 0, read() removes \r (0x0d) when reading from a file at lines 553, 564.
When jsdb standalone program starts it reads its own program file looking for the appending zip file.
If your zip file happens to have 0x0d's in its last block before the directory marker, then when IsText
happens to be non 0, jsdb will not parse the zip correctly, will not find main.js and will start in interactive mode.