From dc3c7994d10ed1c39566489c0f006ddc6a8191df Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Thu, 7 May 2026 14:09:21 -0400 Subject: [PATCH] refactor: address review comments for local protocol --- packages/core/src/agent/content-utils.test.ts | 16 ++++------------ packages/core/src/agent/content-utils.ts | 13 +++++++------ .../core/src/agent/legacy-agent-session.test.ts | 7 +++---- packages/core/src/agent/legacy-agent-session.ts | 6 ++---- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/packages/core/src/agent/content-utils.test.ts b/packages/core/src/agent/content-utils.test.ts index acf8a4a329..346b0e2a56 100644 --- a/packages/core/src/agent/content-utils.test.ts +++ b/packages/core/src/agent/content-utils.test.ts @@ -187,22 +187,14 @@ describe('contentPartsToGeminiParts', () => { ]); }); - it('serializes unknown ContentPart variants', () => { + it('throws on unknown ContentPart variants', () => { // Force an unknown variant past the type system const content = [ { type: 'custom_widget', payload: 123 }, ] as unknown as ContentPart[]; - - const warnSpy = vi.spyOn(debugLogger, 'warn'); - const result = contentPartsToGeminiParts(content); - - expect(warnSpy).toHaveBeenCalled(); - expect(result).toHaveLength(1); - expect(result[0]).toEqual({ - text: JSON.stringify({ type: 'custom_widget', payload: 123 }), - }); - - warnSpy.mockRestore(); + expect(() => contentPartsToGeminiParts(content)).toThrow( + 'Unhandled ContentPart type: {"type":"custom_widget","payload":123}', + ); }); }); diff --git a/packages/core/src/agent/content-utils.ts b/packages/core/src/agent/content-utils.ts index 42b0b7fec7..1c716ffd11 100644 --- a/packages/core/src/agent/content-utils.ts +++ b/packages/core/src/agent/content-utils.ts @@ -93,13 +93,14 @@ export function contentPartsToGeminiParts(content: ContentPart[]): Part[] { // References are converted to text for the model result.push({ text: part.text }); break; - default: - debugLogger.warn( - `Unhandled ContentPart type: ${JSON.stringify(part)} fallback to serialization`, - ); - // Serialize unknown ContentPart variants instead of dropping them - result.push({ text: JSON.stringify(part) }); + default: { + ((x: never) => { + throw new Error(`Unhandled ContentPart type: ${JSON.stringify(x)}`); + })(part); break; + } + break; + } } } return result; diff --git a/packages/core/src/agent/legacy-agent-session.test.ts b/packages/core/src/agent/legacy-agent-session.test.ts index 525548e292..1be4b023bd 100644 --- a/packages/core/src/agent/legacy-agent-session.test.ts +++ b/packages/core/src/agent/legacy-agent-session.test.ts @@ -241,11 +241,10 @@ describe('LegacyAgentSession', () => { ); }); - it('throws for non-message payloads', async () => { + it('returns null streamId for non-message payloads', async () => { const session = new LegacyAgentSession(deps); - await expect(session.send({ update: { title: 'test' } })).rejects.toThrow( - 'only supports message sends', - ); + const result = await session.send({ update: { title: 'test' } }); + expect(result.streamId).toBeNull(); }); it('throws if send is called while a stream is active', async () => { diff --git a/packages/core/src/agent/legacy-agent-session.ts b/packages/core/src/agent/legacy-agent-session.ts index e8d5e56ef5..182256323f 100644 --- a/packages/core/src/agent/legacy-agent-session.ts +++ b/packages/core/src/agent/legacy-agent-session.ts @@ -105,12 +105,10 @@ export class LegacyAgentProtocol implements AgentProtocol { }; } - async send(payload: AgentSend): Promise<{ streamId: string }> { + async send(payload: AgentSend): Promise<{ streamId: string | null }> { const message = 'message' in payload ? payload.message : undefined; if (!message) { - throw new Error( - 'LegacyAgentSession.send() only supports message sends for the moment.', - ); + return { streamId: null }; } if (this._activeStreamId) {