diff --git a/packages/store/src/connection-store.ts b/packages/store/src/connection-store.ts index b2951b38..fd5c09e0 100644 --- a/packages/store/src/connection-store.ts +++ b/packages/store/src/connection-store.ts @@ -20,7 +20,6 @@ import { GatewayClient, StreamAction, type ConnectionState, - type SendErrorResponse, type StreamPayload, type AgentEvent, type GetAgentMessagesResult, @@ -35,7 +34,7 @@ interface ConnectionStoreState { hubId: string | null agentId: string | null connectionState: ConnectionState - lastError: SendErrorResponse | null + lastError: { code: string; message: string } | null } interface ConnectionStoreActions { @@ -146,13 +145,20 @@ function createClient( return } + // Handle error messages from Hub (e.g. UNAUTHORIZED) + if (msg.action === "error") { + const payload = msg.payload as { code: string; message: string } + set({ lastError: { code: payload.code, message: payload.message } }) + return + } + // Handle direct (non-streaming) messages const payload = msg.payload as { agentId?: string; content?: string } if (payload?.agentId && payload?.content) { useMessagesStore.getState().addAssistantMessage(payload.content, payload.agentId) } }) - .onSendError((error) => set({ lastError: error })) + .onSendError((error) => set({ lastError: { code: error.code, message: error.error } })) } /** Fetch message history from Hub via RPC after connection is established */ diff --git a/packages/ui/src/components/chat.tsx b/packages/ui/src/components/chat.tsx index fa3d7773..60f7519a 100644 --- a/packages/ui/src/components/chat.tsx +++ b/packages/ui/src/components/chat.tsx @@ -16,6 +16,7 @@ export function Chat() { const agentId = useConnectionStore((s) => s.agentId) const gwState = useConnectionStore((s) => s.connectionState) const hubId = useConnectionStore((s) => s.hubId) + const lastError = useConnectionStore((s) => s.lastError) const messages = useMessagesStore((s) => s.messages) const streamingIds = useMessagesStore((s) => s.streamingIds) @@ -65,6 +66,23 @@ export function Chat() { )} + {/* Error banner */} + {lastError && ( +
+
+ {lastError.message} ({lastError.code}) + +
+
+ )} + {/* Footer */}