diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ce4eeea6..8ad9e7b81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -### Fixed -- Fixed onboarding infinite loop when GCP IAP Auth is enabled. [#381](https://github.com/sourcebot-dev/sourcebot/pull/381) - ### Added - Introducing Ask Sourcebot - ask natural langauge about your codebase. Get back comprehensive Markdown responses with inline citations back to the code. Bring your own LLM api key. [#392](https://github.com/sourcebot-dev/sourcebot/pull/392) +### Fixed +- Fixed onboarding infinite loop when GCP IAP Auth is enabled. [#381](https://github.com/sourcebot-dev/sourcebot/pull/381) + ## [4.5.3] - 2025-07-20 ### Changed diff --git a/packages/web/src/features/chat/actions.ts b/packages/web/src/features/chat/actions.ts index 1005e5657..17a1335c8 100644 --- a/packages/web/src/features/chat/actions.ts +++ b/packages/web/src/features/chat/actions.ts @@ -212,14 +212,14 @@ export const deleteChat = async ({ chatId }: { chatId: string }, domain: string) ) ); -export const submitFeedback = async ({ - chatId, - messageId, - feedbackType -}: { - chatId: string, - messageId: string, - feedbackType: 'like' | 'dislike' +export const submitFeedback = async ({ + chatId, + messageId, + feedbackType +}: { + chatId: string, + messageId: string, + feedbackType: 'like' | 'dislike' }, domain: string) => sew(() => withAuth((userId) => withOrgMembership(userId, domain, async ({ org }) => { @@ -246,13 +246,16 @@ export const submitFeedback = async ({ ...message, metadata: { ...message.metadata, - feedback: { - type: feedbackType, - timestamp: new Date().toISOString(), - userId: userId, - } + feedback: [ + ...(message.metadata?.feedback ?? []), + { + type: feedbackType, + timestamp: new Date().toISOString(), + userId: userId, + } + ] } - }; + } satisfies SBChatMessage; } return message; }); diff --git a/packages/web/src/features/chat/components/chatThread/answerCard.tsx b/packages/web/src/features/chat/components/chatThread/answerCard.tsx index 1a894ae71..d37ee67ee 100644 --- a/packages/web/src/features/chat/components/chatThread/answerCard.tsx +++ b/packages/web/src/features/chat/components/chatThread/answerCard.tsx @@ -23,7 +23,6 @@ interface AnswerCardProps { answerText: string; messageId: string; chatId: string; - feedback?: 'like' | 'dislike' | undefined; traceId?: string; } @@ -36,7 +35,6 @@ export const AnswerCard = forwardRef(({ answerText, messageId, chatId, - feedback: _feedback, traceId, }, forwardedRef) => { const markdownRendererRef = useRef(null); @@ -45,7 +43,7 @@ export const AnswerCard = forwardRef(({ const { toast } = useToast(); const domain = useDomain(); const [isSubmittingFeedback, setIsSubmittingFeedback] = useState(false); - const [feedback, setFeedback] = useState<'like' | 'dislike' | undefined>(_feedback); + const [feedback, setFeedback] = useState<'like' | 'dislike' | undefined>(undefined); const captureEvent = useCaptureEvent(); useImperativeHandle( diff --git a/packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx b/packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx index 0cd1ac71b..85a080688 100644 --- a/packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx +++ b/packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx @@ -409,7 +409,6 @@ export const ChatThreadListItem = forwardRef ) : !isStreaming && ( diff --git a/packages/web/src/features/chat/types.ts b/packages/web/src/features/chat/types.ts index 8b04c88e2..2bbea7985 100644 --- a/packages/web/src/features/chat/types.ts +++ b/packages/web/src/features/chat/types.ts @@ -45,11 +45,11 @@ export const sbChatMessageMetadataSchema = z.object({ totalOutputTokens: z.number().optional(), totalTokens: z.number().optional(), totalResponseTimeMs: z.number().optional(), - feedback: z.object({ + feedback: z.array(z.object({ type: z.enum(['like', 'dislike']), timestamp: z.string(), // ISO date string userId: z.string(), - }).optional(), + })).optional(), selectedRepos: z.array(z.string()).optional(), traceId: z.string().optional(), });