diff --git a/config/quality/eslint-suppressions.json b/config/quality/eslint-suppressions.json index da35ba2eeb..bb23407f93 100644 --- a/config/quality/eslint-suppressions.json +++ b/config/quality/eslint-suppressions.json @@ -396,11 +396,6 @@ "count": 1 } }, - "open-sse/services/antigravityIdentity.ts": { - "@typescript-eslint/no-unused-vars": { - "count": 1 - } - }, "open-sse/services/antigravityProjectBootstrap.ts": { "@typescript-eslint/no-unused-vars": { "count": 1 diff --git a/open-sse/services/antigravityIdentity.ts b/open-sse/services/antigravityIdentity.ts index 3703cd9c35..cbdd7815b2 100644 --- a/open-sse/services/antigravityIdentity.ts +++ b/open-sse/services/antigravityIdentity.ts @@ -76,6 +76,7 @@ export function getAntigravitySessionId( ): string { return ( toNonEmptyString(fallback) || + deriveAntigravitySessionId(getAntigravityAccountKey(credentials)) || generateAntigravitySessionId() ); } diff --git a/tests/unit/antigravity-dynamic-session-id-10443.test.ts b/tests/unit/antigravity-dynamic-session-id-10443.test.ts index af5d198ff9..885015d39c 100644 --- a/tests/unit/antigravity-dynamic-session-id-10443.test.ts +++ b/tests/unit/antigravity-dynamic-session-id-10443.test.ts @@ -2,17 +2,39 @@ import assert from "node:assert/strict"; import { test } from "node:test"; import { getAntigravitySessionId } from "../../open-sse/services/antigravityIdentity.ts"; -test("getAntigravitySessionId yields dynamic random session IDs per request to avoid session pinning", () => { +test("getAntigravitySessionId derives a stable session ID from credentials for prompt-cache reuse", () => { const credentials = { email: "user@example.com", connectionId: "conn_123" }; const id1 = getAntigravitySessionId(credentials); const id2 = getAntigravitySessionId(credentials); - assert.notEqual(id1, id2, "getAntigravitySessionId should not pin to a static account email hash"); + assert.equal(id1, id2, "same credentials must produce the same session ID for cache reuse"); assert.equal(typeof id1, "string"); - assert.equal(typeof id2, "string"); + assert.ok(id1.length > 0, "session ID must be non-empty"); const explicitFallback = "custom-session-456"; const idWithFallback = getAntigravitySessionId(credentials, explicitFallback); assert.equal(idWithFallback, explicitFallback, "explicit fallback session ID should take precedence"); }); + +test("getAntigravitySessionId falls back to random ID when no credentials are available", () => { + const id1 = getAntigravitySessionId(); + const id2 = getAntigravitySessionId(); + + assert.equal(typeof id1, "string"); + assert.ok(id1.length > 0, "random session ID must be non-empty"); + + // Without credentials, each call should produce a different random ID + // (this is acceptable since there's no account to pin cache to) + assert.notEqual(id1, id2, "without credentials, IDs should be random per call"); +}); + +test("getAntigravitySessionId produces different IDs for different accounts", () => { + const credsA = { email: "alice@example.com" }; + const credsB = { email: "bob@example.com" }; + + const idA = getAntigravitySessionId(credsA); + const idB = getAntigravitySessionId(credsB); + + assert.notEqual(idA, idB, "different accounts must produce different session IDs"); +});