async function listDrives (opts = {}) {
  // validate
  assert(opts && typeof opts === 'object', 'Must pass an options object')
  assert(!opts.tag || typeof opts.tag === 'string', '.tag must be a string')
  assert(!opts.writable || typeof opts.writable === 'boolean', '.writable must be a boolean')

  let perm = opts.tag ? `listDrives:${opts.tag || ''}` : 'listDrives'
  if (!(await permissions.requestPermission(perm, this.sender))) {
    throw new UserDeniedError()
  }

  let drivesList = fsListDrives()
  let records = []
  for (let drive of drivesList) {
    let url = `hyper://${drive.key}/`
    let info = await drives.getDriveInfo(drive.key, {onlyCache: true})
    if (typeof opts.writable === 'boolean' && info.writable !== opts.writable) {
      continue
    }
    if (typeof opts.tag === 'string' && !drive.tags?.includes?.(opts.tag)) {
      continue
    }
    records.push({url, title: info.title, description: info.description})
  }
  return records
}
@param {Object} [opts]
@param {boolean} [opts.writable]
@param {string} [opts.tag]
@returns {Promise<BeakerShellPublicAPIDriveRecord[]>}