The UI delete option that @Tinkerer mentions calls the auth/delete_refresh_token webservice too, so looks like this is the only method.
Looking through the code it looks like a LLAT is just a refresh token with a long expiry so I guess it is just a terminology difference and deleting refresh token is deleting the LLAT.
Delete code from UI - /src/panels/profile/ha-long-lived-access-tokens-card.ts
Core code to create tokens - homeassistant/auth/init.py
if user.system_generated != (token_type == models.TOKEN_TYPE_SYSTEM):
raise ValueError(
"System generated users can only have system type refresh tokens"
)
if token_type == models.TOKEN_TYPE_NORMAL and client_id is None:
raise ValueError("Client is required to generate a refresh token.")
if (
token_type == models.TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN
and client_name is None
):
raise ValueError("Client_name is required for long-lived access token")
if token_type == models.TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN:
for token in user.refresh_tokens.values():
if (
token.client_name == client_name
and token.token_type == models.TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN
):
# Each client_name can only have one
# long_lived_access_token type of refresh token
raise ValueError(f"{client_name} already exists")
return await self._store.async_create_refresh_token(
user,
client_id,
client_name,
client_icon,
token_type,
access_token_expiration,
credential,
)