fix(session): preserved provider session for titles

- Used the active provider session id for title credential selection.
- Covered explicit provider-session credential stickiness alongside disposal cancellation.
This commit is contained in:
roboomp
2026-07-16 07:25:06 +00:00
parent 3cb9258875
commit e3b117678d
2 changed files with 10 additions and 3 deletions
@@ -8994,7 +8994,7 @@ export class AgentSession {
firstMessage,
this.#modelRegistry,
this.settings,
this.sessionManager.getSessionId(),
this.sessionId,
this.model,
provider => this.agent.metadataForProvider(provider),
this.#titleSystemPrompt,
@@ -27,12 +27,13 @@ afterEach(async () => {
});
describe("AgentSession title generation disposal", () => {
it("aborts an in-flight automatic title request when disposal begins", async () => {
it("uses the active provider session and aborts an in-flight title request during disposal", async () => {
tempDir = TempDir.createSync("@pi-title-dispose-");
authStorage = await AuthStorage.create(path.join(tempDir.path(), "auth.db"));
authStorage.setRuntimeApiKey("anthropic", "test-key");
const model = getBundledModel("anthropic", "claude-sonnet-4-5");
if (!model) throw new Error("Expected claude-sonnet-4-5 model to exist");
const providerSessionId = "provider-session";
const settings = Settings.isolated({
"compaction.enabled": false,
@@ -44,11 +45,15 @@ describe("AgentSession title generation disposal", () => {
initialState: { model, systemPrompt: ["Test"], tools: [], messages: [] },
streamFn: createMockModel({ responses: [{ content: ["Done"] }] }).stream,
});
const modelRegistry = new ModelRegistry(authStorage);
const getApiKey = vi.spyOn(modelRegistry, "getApiKey");
const resolver = vi.spyOn(modelRegistry, "resolver");
session = new AgentSession({
agent,
sessionManager: SessionManager.inMemory(),
settings,
modelRegistry: new ModelRegistry(authStorage),
modelRegistry,
providerSessionId,
});
const started = Promise.withResolvers<void>();
const response = Promise.withResolvers<ai.AssistantMessage>();
@@ -62,6 +67,8 @@ describe("AgentSession title generation disposal", () => {
const generation = session.generateTitle("Investigate shutdown");
await started.promise;
expect(getApiKey.mock.calls[0]?.[1]).toBe(providerSessionId);
expect(resolver.mock.calls[0]?.[1]).toBe(providerSessionId);
session.beginDispose();
expect(requestSignal?.aborted).toBe(true);