Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
6bbf46a
fix(acp): resolve session by exact id and handle listener cleanup on …
diegogodinezr Sep 30, 2026
7b58789
fix(acp): address review comments for input validation, cleanup error…
diegogodinezr Sep 30, 2026
dfef2f9
Merge branch 'main' into GH-29288
diegogodinezr Sep 30, 2026
fddb84d
fix(acp): defer storage initialization and guard dispose catch
diegogodinezr Sep 30, 2026
25606e6
fix(acp): safeguard config disposal and fallback optional timestamp i…
diegogodinezr Sep 30, 2026
c04a424
Merge branch 'main' into GH-29288
diegogodinezr Sep 30, 2026
3a2185f
fix(acp): dispose existing session prior to initializing new config i…
diegogodinezr Sep 30, 2026
0a88197
fix(acp): make session disposal async and ensure config cleanup durin…
diegogodinezr Sep 30, 2026
37a5149
Update packages/cli/src/utils/sessionUtils.ts
diegogodinezr Oct 1, 2026
e880910
fix(acp): make session manager dispose async and cleanup session inst…
diegogodinezr Oct 1, 2026
15429eb
Update packages/cli/src/acp/acpSessionManager.ts
diegogodinezr Oct 1, 2026
fce2190
fix(acp): handle floating promises with explicit error logging in loa…
diegogodinezr Oct 1, 2026
8c9bcaf
fix(acp): defer background session tasks until response construction …
diegogodinezr Oct 1, 2026
0769119
fix(acp): validate sessionId with regex and handle optional messages …
diegogodinezr Oct 1, 2026
d9c3462
Merge branch 'main' into GH-29288
diegogodinezr Oct 1, 2026
aeb2452
Merge branch 'main' into GH-29288
diegogodinezr Oct 1, 2026
de9fd8d
fix(acp): guard individual session disposals in dispose and loadSession
diegogodinezr Oct 1, 2026
5db182e
Merge branch 'main' into GH-29288
diegogodinezr Oct 1, 2026
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
12 changes: 12 additions & 0 deletions packages/cli/src/acp/acpRpcDispatcher.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -336,4 +336,16 @@ describe('GeminiAgent - RPC Dispatcher', () => {
}),
).rejects.toThrow('Session not found: unknown');
});

it('should delegate dispose to sessionManager', async () => {
const disposeMock = vi.fn().mockResolvedValue(undefined);
(agent as unknown as { sessionManager: { dispose: Mock } }).sessionManager =
{
dispose: disposeMock,
};

await agent.dispose();

expect(disposeMock).toHaveBeenCalledTimes(1);
});
});
4 changes: 2 additions & 2 deletions packages/cli/src/acp/acpRpcDispatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ export class GeminiAgent {
this.sessionManager = new AcpSessionManager(settings, argv, connection);
}

dispose(): void {
this.sessionManager.dispose();
async dispose(): Promise<void> {
await this.sessionManager.dispose();
}

async initialize(
Expand Down
14 changes: 14 additions & 0 deletions packages/cli/src/acp/acpSession.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1366,4 +1366,18 @@ describe('Session', () => {
);
});
});

describe('dispose', () => {
it('should safely dispose without throwing when config.dispose is undefined', async () => {
delete (mockConfig as { dispose?: unknown }).dispose;
await expect(session.dispose()).resolves.toBeUndefined();
});

it('should catch rejection when config.dispose rejects', async () => {
mockConfig.dispose = vi
.fn()
.mockRejectedValue(new Error('Disposal failed'));
await expect(session.dispose()).resolves.toBeUndefined();
});
});
});
9 changes: 8 additions & 1 deletion packages/cli/src/acp/acpSession.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,12 +188,19 @@ export class Session {
}
};

dispose(): void {
async dispose(): Promise<void> {
coreEvents.off(
CoreEvent.ApprovalModeChanged,
this.handleApprovalModeChanged,
);
this.disposeController.abort();
if (this.context.config?.dispose) {
try {
await this.context.config.dispose();
} catch (err) {
debugLogger.error(`Error disposing config: ${err}`);
}
}
}

async cancelPendingPrompt(): Promise<void> {
Expand Down
Loading
Loading