Plugin verification failing due to PasswordSafe getAsync API change

In IJPL-199758 Asynchronous credential store API · JetBrains/intellij-community@1a72611 · GitHub the API for getAsync() changed from:

fun getAsync(attributes: CredentialAttributes): Promise<Credentials?>

to:

suspend fun getAsync(attributes: CredentialAttributes): Ephemeral<Credentials>

My plugin currently supports 2024.3+, however with the 2025.3 EAP release, the verification has begun failing on IDE Version: IU-253.28086.51 with:

Invocation of unresolved method com.intellij.ide.passwordSafe.PasswordSafe.getAsync(CredentialAttributes) : Promise [Compatibility problems]

I’m curious if anyone has insights into the following:

  1. Are there techniques for handling this in the plugin src, build or setup?
  2. Are these issues part of the flow of EAPs and the right thing to do is file on youtrack?
  3. More broadly: how does IntelliJ handle this at run time? The plugin runs and works on a relatively recent EAP release, so I’m curious if at run time it’s able to either use the old API or if there is some middle layer that allows plugins built against older APIs to work in newer versions of IntelliJ

Hello,
The com.intellij.credentialStore.CredentialStore#getAsync method is marked as @Experimental. It is not a public stable API yet.

For this specific use-case, the best bet is to use PasswordSafe#get method, which is part of the public API. From my experience, I suggest running this on background thread (not on EDT).

As of the 3.: If the experimental API is changed or removed in a specific version - say 2025.3 - then it is simply changed or removed. There is no middle layer that magically adapts old plugins for nonexistent API elements. On the other hand, there are several mechanisms and guarantees, and migration paths for stable public APIs.

Thanks for the details Robert.

I might be missing something, but where was the experimental tag for the original getAsync function? Asking so we might be able to avoid these kinds of issues in the future.

Looking more closely I see that PasswordSafe has @Suppress(“DEPRECATION”, “removal”) although it still seems to be encouraged via docs Persisting Sensitive Data | IntelliJ Platform Plugin SDK

The original getAsync function in the PasswordSafe abstract class was not marked as experimental nor was the BasePasswordSafe implementation (although the implementation is marked with @Internal).

This is suppression annotation, not a deprecation

1 Like

@matt.bbhj you are right. The original getAsync function on the implementors is not marked as @Experimental, despite the fact that the parent CredentialStore marks this as such. This is an oversight on the Platform API, since the @Experimental annotation is not inherited by implementors.

I have filed a YouTrack issue (IJPL-217715).

1 Like