diff --git a/src/vs/workbench/contrib/void/browser/chatThreadService.ts b/src/vs/workbench/contrib/void/browser/chatThreadService.ts index 77fec1ba..cc2abbb7 100644 --- a/src/vs/workbench/contrib/void/browser/chatThreadService.ts +++ b/src/vs/workbench/contrib/void/browser/chatThreadService.ts @@ -189,10 +189,10 @@ class ChatThreadService extends Disposable implements IChatThreadService { private readonly _onDidChangeCurrentThread = new Emitter(); readonly onDidChangeCurrentThread: Event = this._onDidChangeCurrentThread.event; - readonly streamState: ThreadStreamState = {} private readonly _onDidChangeStreamState = new Emitter<{ threadId: string }>(); readonly onDidChangeStreamState: Event<{ threadId: string }> = this._onDidChangeStreamState.event; + readonly streamState: ThreadStreamState = {} state: ThreadsState // allThreads is persisted, currentThread is not constructor( @@ -445,7 +445,7 @@ class ChatThreadService extends Disposable implements IChatThreadService { // TODO!!! test rejection // if (Math.random() > 0) throw new Error('TESTING') const errorMessage = 'Tool call was rejected by the user.' - this._addMessageToThread(threadId, { role: 'tool', name: toolName, paramsStr: tool.paramsStr, id: tool.id, content: errorMessage, result: { type: 'error', params: toolParams, value: errorMessage }, }) + this._addMessageToThread(threadId, { role: 'tool', name: toolName, paramsStr: tool.paramsStr, id: tool.id, content: errorMessage, result: { type: 'rejected', params: toolParams, value: errorMessage }, }) shouldSendAnotherMessage = false // interrupt flow by rejecting res_() return diff --git a/src/vs/workbench/contrib/void/browser/editCodeService.ts b/src/vs/workbench/contrib/void/browser/editCodeService.ts index ae16d111..9fd24052 100644 --- a/src/vs/workbench/contrib/void/browser/editCodeService.ts +++ b/src/vs/workbench/contrib/void/browser/editCodeService.ts @@ -53,7 +53,7 @@ const configOfBG = (color: Color) => { const greenBG = new Color(new RGBA(155, 185, 85, .1)); // default is RGBA(155, 185, 85, .2) registerColor('void.greenBG', configOfBG(greenBG), '', true); -const redBG = new Color(new RGBA(255, 0, 0, .2)); // default is RGBA(255, 0, 0, .2) +const redBG = new Color(new RGBA(255, 0, 0, .05)); // default is RGBA(255, 0, 0, .2) registerColor('void.redBG', configOfBG(redBG), '', true); const sweepBG = new Color(new RGBA(100, 100, 100, .2)); diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index eb91346a..5c1cc3e7 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -656,52 +656,69 @@ export const SelectedFiles = ( const ReasoningComponent = ({ children }: { children: React.ReactNode }) => { + const [isOpen, setIsOpen] = useState(false) return children } -const ToolComponent = ({ +type ToolHeaderParams = { + icon?: React.ReactNode; + title: string; + desc1: string; + desc2?: React.ReactNode; + isError?: boolean; + requestToolId?: string; + numResults?: number; + children?: React.ReactNode; + isLastMessage?: boolean; + onClick?: () => void; +} + +const ToolHeaderComponent = ({ + icon, title, desc1, desc2, numResults, children, + isError, + requestToolId, + isLastMessage, onClick, -}: { - title: string; - desc1: string; - desc2?: React.ReactNode; - numResults?: number; - children?: React.ReactNode; - onClick?: () => void; -}) => { +}: ToolHeaderParams) => { + const [isExpanded, setIsExpanded] = useState(false); const isDropdown = !!children const isClickable = !!isDropdown || !!onClick - return ( -
-
-
{ - if (children) { setIsExpanded(v => !v); } - if (onClick) { onClick(); } - }} - > - {isDropdown && ( - - )} -
-
- {title} - {desc1} -
+ return (
+
+ + {/* header */} +
{ + if (children) { setIsExpanded(v => !v); } + if (onClick) { onClick(); } + }} + > + {isDropdown && ( + + )} +
+
+ {title} + {desc1} +
+
{desc2 && {desc2} @@ -711,19 +728,23 @@ const ToolComponent = ({ {`(`}{numResults}{` result`}{numResults !== 1 ? 's' : ''}{`)`} )} + {isError && }
-
-
- {children} -
+
+ {/* children */} +
+
+ {children}
+ {!requestToolId ? null : } +
); }; @@ -994,42 +1015,15 @@ const AssistantMessageComponent = ({ chatMessage, isLoading, messageIdx, isLast -const ToolError = ({ title, desc1, errorMessage }: { title: string, desc1: string, errorMessage: string }) => { - return ( - // px-2 py-1 - //
- // - //
- // {title + ' error'} - //
{errorMessage}
- //
- //
- - - Error - - } - > -
{errorMessage}
-
- - ) -} - - const toolNameToTitle: Record = { 'read_file': 'Read file', - 'list_dir': 'Inspected folder', - 'pathname_search': 'Searched by file name', - 'search': 'Searched files', - 'create_uri': 'Created file', - 'delete_uri': 'Deleted file', - 'edit': 'Edited file', - 'terminal_command': 'Ran terminal command' + 'list_dir': 'Inspect folder', + 'pathname_search': 'Search by file name', + 'search': 'Search', + 'create_uri': 'Create file', + 'delete_uri': 'Delete file', + 'edit': 'Edit file', + 'terminal_command': 'Run terminal command' } const toolNameToDesc = (toolName: ToolName, _toolParams: ToolCallParams[ToolName] | undefined): string => { @@ -1067,7 +1061,7 @@ const toolNameToDesc = (toolName: ToolName, _toolParams: ToolCallParams[ToolName } -const ToolRequestAcceptRejectButtons = ({ toolRequest, messageIdx, isLast }: { toolRequest: ToolRequestApproval } & Omit) => { +const ToolRequestAcceptRejectButtons = ({ voidToolId, isLastMessage: isLast }: { voidToolId: string, isLastMessage: boolean }) => { const accessor = useAccessor() const chatThreadsService = accessor.get('IChatThreadService') const metricsService = accessor.get('IMetricsService') @@ -1076,16 +1070,16 @@ const ToolRequestAcceptRejectButtons = ({ toolRequest, messageIdx, isLast }: { t const [requestState, setRequestState] = useState<'accepted' | 'rejected' | 'awaiting_response'>(initRequestState) const onAccept = useCallback(() => { - chatThreadsService.approveTool(toolRequest.voidToolId) + chatThreadsService.approveTool(voidToolId) setRequestState('accepted') metricsService.capture('Tool Request Accepted', {}) - }, [chatThreadsService, toolRequest.voidToolId, metricsService]) + }, [chatThreadsService, voidToolId, metricsService]) const onReject = useCallback(() => { - chatThreadsService.rejectTool(toolRequest.voidToolId) + chatThreadsService.rejectTool(voidToolId) setRequestState('rejected') metricsService.capture('Tool Request Rejected', {}) - }, [chatThreadsService, toolRequest.voidToolId, metricsService]) + }, [chatThreadsService, voidToolId, metricsService]) const approveButton = (