From e906bffbb92c6929bfbb861846fe76daa63fe5d9 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sat, 21 Feb 2026 11:48:18 +0700 Subject: [PATCH] server: add ws hello/welcome message schemas --- packages/server/src/shared/messages.ts | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/server/src/shared/messages.ts b/packages/server/src/shared/messages.ts index 0ac572de0..cb0a8380c 100644 --- a/packages/server/src/shared/messages.ts +++ b/packages/server/src/shared/messages.ts @@ -197,6 +197,19 @@ const ToolCallDetailPayloadSchema: z.ZodType = z.discriminatedUn ), truncated: z.boolean().optional(), }), + z.object({ + type: z.literal('sub_agent'), + subAgentType: z.string().optional(), + description: z.string().optional(), + log: z.string(), + actions: z.array( + z.object({ + index: z.number().int().positive(), + toolName: z.string(), + summary: z.string().optional(), + }) + ), + }), z.object({ type: z.literal('unknown'), input: UnknownValueSchema, @@ -2201,6 +2214,29 @@ export const WSPongMessageSchema = z.object({ type: z.literal('pong'), }) +export const WSHelloMessageSchema = z.object({ + type: z.literal('hello'), + clientId: z.string().min(1), + clientType: z.enum(['mobile', 'browser', 'cli', 'mcp']), + protocolVersion: z.number().int(), + capabilities: z + .object({ + voice: z.boolean().optional(), + pushNotifications: z.boolean().optional(), + }) + .passthrough() + .optional(), +}) + +export const WSWelcomeMessageSchema = z.object({ + type: z.literal('welcome'), + serverId: z.string(), + hostname: z.string().nullable(), + version: z.string().nullable(), + resumed: z.boolean(), + capabilities: ServerCapabilitiesSchema.optional(), +}) + export const WSRecordingStateMessageSchema = z.object({ type: z.literal('recording_state'), isRecording: z.boolean(), @@ -2220,17 +2256,21 @@ export const WSSessionOutboundSchema = z.object({ // Complete WebSocket message schemas export const WSInboundMessageSchema = z.discriminatedUnion('type', [ WSPingMessageSchema, + WSHelloMessageSchema, WSRecordingStateMessageSchema, WSSessionInboundSchema, ]) export const WSOutboundMessageSchema = z.discriminatedUnion('type', [ WSPongMessageSchema, + WSWelcomeMessageSchema, WSSessionOutboundSchema, ]) export type WSInboundMessage = z.infer export type WSOutboundMessage = z.infer +export type WSHelloMessage = z.infer +export type WSWelcomeMessage = z.infer // ============================================================================ // Helper functions for message conversion