diff --git a/extensions/void/src/DisplayChangesProvider.ts b/extensions/void/src/DisplayChangesProvider.ts index 9394b410..4cfb92e3 100644 --- a/extensions/void/src/DisplayChangesProvider.ts +++ b/extensions/void/src/DisplayChangesProvider.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import { findDiffs } from './findDiffs'; -import { Diff, BaseDiffArea, BaseDiff, DiffArea } from './shared_types'; +import { Diff, BaseDiffArea, BaseDiff, DiffArea } from './common/shared_types'; diff --git a/extensions/void/src/shared_types.ts b/extensions/void/src/common/shared_types.ts similarity index 97% rename from extensions/void/src/shared_types.ts rename to extensions/void/src/common/shared_types.ts index ad7597df..3c59f888 100644 --- a/extensions/void/src/shared_types.ts +++ b/extensions/void/src/common/shared_types.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; -import { PartialVoidConfig } from './sidebar/contextForConfig'; +import { PartialVoidConfig } from '../sidebar/contextForConfig'; diff --git a/extensions/void/src/extension.ts b/extensions/void/src/extension.ts index 46e4266d..961d585c 100644 --- a/extensions/void/src/extension.ts +++ b/extensions/void/src/extension.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import { DisplayChangesProvider } from './DisplayChangesProvider'; -import { BaseDiffArea, ChatThreads, MessageFromSidebar, MessageToSidebar } from './shared_types'; +import { BaseDiffArea, ChatThreads, MessageFromSidebar, MessageToSidebar } from './common/shared_types'; import { SidebarWebviewProvider } from './SidebarWebviewProvider'; import { v4 as uuidv4 } from 'uuid' diff --git a/extensions/void/src/findDiffs.ts b/extensions/void/src/findDiffs.ts index ee432200..e95b533a 100644 --- a/extensions/void/src/findDiffs.ts +++ b/extensions/void/src/findDiffs.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; // import { diffLines, Change } from 'diff'; -import { BaseDiff } from './shared_types'; +import { BaseDiff } from './common/shared_types'; import { diff_match_patch } from 'diff-match-patch'; diff --git a/extensions/void/src/sidebar/Sidebar.tsx b/extensions/void/src/sidebar/Sidebar.tsx index 12508cdd..d27283c8 100644 --- a/extensions/void/src/sidebar/Sidebar.tsx +++ b/extensions/void/src/sidebar/Sidebar.tsx @@ -1,11 +1,11 @@ import React, { useState, useEffect, useRef, useCallback, FormEvent } from "react" -import { CodeSelection, ChatMessage, MessageToSidebar } from "../shared_types" +import { CodeSelection, ChatMessage, MessageToSidebar } from "../common/shared_types" import { awaitVSCodeResponse, getVSCodeAPI, onMessageFromVSCode, useOnVSCodeMessage } from "./getVscodeApi" import { SidebarThreadSelector } from "./SidebarThreadSelector"; import { SidebarChat } from "./SidebarChat"; import { SidebarSettings } from './SidebarSettings'; -import { identifyUser, useMetrics } from "../metrics/posthog"; +import { identifyUser, useMetrics } from "./metrics/posthog"; const Sidebar = () => { @@ -60,7 +60,7 @@ const Sidebar = () => { return <>
-
+
setTab('chat')} />
diff --git a/extensions/void/src/sidebar/SidebarChat.tsx b/extensions/void/src/sidebar/SidebarChat.tsx index 01014564..cdb8ae91 100644 --- a/extensions/void/src/sidebar/SidebarChat.tsx +++ b/extensions/void/src/sidebar/SidebarChat.tsx @@ -5,12 +5,13 @@ import { marked } from 'marked'; import MarkdownRender from "./markdown/MarkdownRender"; import BlockCode from "./markdown/BlockCode"; import { SelectedFiles } from "./components/SelectedFiles"; -import { File, ChatMessage, CodeSelection } from "../shared_types"; +import { File, ChatMessage, CodeSelection } from "../common/shared_types"; import * as vscode from 'vscode' import { awaitVSCodeResponse, getVSCodeAPI, onMessageFromVSCode, useOnVSCodeMessage } from "./getVscodeApi"; import { useThreads } from "./contextForThreads"; import { sendLLMMessage } from "../common/sendLLMMessage"; import { useVoidConfig } from "./contextForConfig"; +import { captureEvent } from "./metrics/posthog"; @@ -93,6 +94,7 @@ const ChatBubble = ({ chatMessage }: { chatMessage: ChatMessage }) => { } + export const SidebarChat = () => { @@ -112,6 +114,23 @@ export const SidebarChat = () => { const { allThreads, currentThread, addMessageToHistory, startNewThread, switchToThread } = useThreads() const { voidConfig } = useVoidConfig() + + + // only captures number of messages and message "shape", no actual code, instructions, prompts, etc + const captureChatEvent = useCallback((eventId: string, extras?: object) => { + const whichApi = voidConfig.default['whichApi'] + const messages = currentThread?.messages + + captureEvent(eventId, { + whichApi: whichApi, + numMessages: messages?.length, + messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.displayContent.length })), + version: '2024-10-19', + ...extras, + }) + }, [currentThread?.messages, voidConfig.default]) + + // if they pressed the + to add a new chat useOnVSCodeMessage('startNewThread', (m) => { // find a thread with 0 messages and switch to it @@ -163,17 +182,25 @@ export const SidebarChat = () => { addMessageToHistory(newHistoryElt) // send message to LLM + + captureChatEvent('Chat - Sending Message', { messageLength: instructions.length }) + const submit_time = new Date() + let { abort } = sendLLMMessage({ messages: [...(currentThread?.messages ?? []).map(m => ({ role: m.role, content: m.content })), { role: 'user', content: userContent }], onText: (newText, fullText) => setMessageStream(fullText), onFinalMessage: (content) => { + captureChatEvent('Chat - Received Full Message', { messageLength: content.length, duration: new Date().getMilliseconds() - submit_time.getMilliseconds() }) + // add assistant's message to chat history, and clear selection - const newHistoryElt: ChatMessage = { role: 'assistant', content, displayContent: content, } + const newHistoryElt: ChatMessage = { role: 'assistant', content, displayContent: content } addMessageToHistory(newHistoryElt) setMessageStream('') setIsLoading(false) }, onError: (error) => { + captureChatEvent('Chat - Error', { error }) + // add assistant's message to chat history, and clear selection let content = messageStream; // just use the current content const newHistoryElt: ChatMessage = { role: 'assistant', content, displayContent: content, } @@ -189,7 +216,10 @@ export const SidebarChat = () => { } - const onStop = useCallback(() => { + const onAbort = useCallback(() => { + + captureChatEvent('Chat - Abort', { messageLengthSoFar: messageStream.length }) + // abort claude abortFnRef.current?.() @@ -201,7 +231,7 @@ export const SidebarChat = () => { setMessageStream('') setIsLoading(false) - }, [addMessageToHistory, messageStream]) + }, [captureChatEvent, messageStream, addMessageToHistory]) //Clear code selection const clearSelection = () => { @@ -263,10 +293,16 @@ export const SidebarChat = () => { {isLoading ? // stop button + className="btn btn-primary font-bold size-8 flex justify-center items-center rounded-full p-2 max-h-10" + > + + + + : // submit button (up arrow)
- {latestError} +
+ {latestError} + + {} +
} diff --git a/extensions/void/src/sidebar/SidebarSettings.tsx b/extensions/void/src/sidebar/SidebarSettings.tsx index 450f965e..27e2cdde 100644 --- a/extensions/void/src/sidebar/SidebarSettings.tsx +++ b/extensions/void/src/sidebar/SidebarSettings.tsx @@ -9,10 +9,15 @@ const SettingOfFieldAndParam = ({ field, param }: { field: VoidConfigField, para const updateState = (newValue: string) => { setConfigParam(field, param, newValue) } - const resetButton = diff --git a/extensions/void/src/sidebar/contextForThreads.tsx b/extensions/void/src/sidebar/contextForThreads.tsx index 5e9b5fd9..41cd6d48 100644 --- a/extensions/void/src/sidebar/contextForThreads.tsx +++ b/extensions/void/src/sidebar/contextForThreads.tsx @@ -1,5 +1,5 @@ import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" -import { ChatMessage, ChatThreads } from "../shared_types" +import { ChatMessage, ChatThreads } from "../common/shared_types" import { awaitVSCodeResponse, getVSCodeAPI } from "./getVscodeApi" diff --git a/extensions/void/src/sidebar/getVscodeApi.ts b/extensions/void/src/sidebar/getVscodeApi.ts index 4da06d46..d232eac4 100644 --- a/extensions/void/src/sidebar/getVscodeApi.ts +++ b/extensions/void/src/sidebar/getVscodeApi.ts @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { MessageFromSidebar, MessageToSidebar, } from "../shared_types"; +import { MessageFromSidebar, MessageToSidebar, } from "../common/shared_types"; import { v4 as uuidv4 } from 'uuid'; diff --git a/extensions/void/src/metrics/posthog.tsx b/extensions/void/src/sidebar/metrics/posthog.tsx similarity index 100% rename from extensions/void/src/metrics/posthog.tsx rename to extensions/void/src/sidebar/metrics/posthog.tsx