Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,11 @@ function classifyCredentialStoreReadError(error: unknown): CredentialStoreReadEr
}

function createNativeCredentialEntry(): Entry {
// Secret Service interprets an explicit target as a collection name. The
// Windows credential target must not create a new Linux collection/prompt.
return process.platform === 'linux'
? new Entry('gemini', 'antigravity')
: Entry.withTarget('gemini:antigravity', 'gemini', 'antigravity');
// Only macOS and Linux reach the native keyring; Windows uses the
// `gemini:antigravity` credential target directly. Do not pass that target to
// `Entry.withTarget`: macOS expects a keychain kind (`User` / `System` /
// `Common` / `Dynamic`) and Secret Service treats it as a collection name.
return new Entry('gemini', 'antigravity');
}

function readViaNativeKeyring(): Uint8Array | null {
Expand Down
3 changes: 3 additions & 0 deletions src/tests/unit/antigravity-credential-store-read.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ describe('readAntigravityCredentialStoreToken', () => {
expect(await readAntigravityCredentialStoreToken()).toEqual({
refreshToken: 'refresh-macos',
});
// The macOS keyring rejects any target other than a keychain kind.
expect(mocks.createEntry).toHaveBeenCalledWith('gemini', 'antigravity');
expect(mocks.withTarget).not.toHaveBeenCalled();
});

it('uses the bounded Linux secret-tool fallback after native keyring failure', async () => {
Expand Down
Loading