Merge branch 'voideditor:main' into main

This commit is contained in:
Jérôme Commaret
2025-03-31 16:48:53 +02:00
committed by GitHub
8 changed files with 37 additions and 18 deletions
+1 -1
View File
@@ -71,7 +71,7 @@
"type": "string",
"description": "The URL from where the vscode server will be downloaded. You can use the following variables and they will be replaced dynamically:\n- ${quality}: vscode server quality, e.g. stable or insiders\n- ${version}: vscode server version, e.g. 1.69.0\n- ${commit}: vscode server release commit\n- ${arch}: vscode server arch, e.g. x64, armhf, arm64\n- ${release}: release number",
"scope": "application",
"default": "https://github.com/voideditor/${NAME_OF_REPO}/releases/download/${version}.${release}/void-server-${os}-${arch}-${version}.${release}.tar.gz"
"default": "https://github.com/voideditor/binaries/releases/download/${version}.${release}/void-reh-${os}-${arch}-${version}.${release}.tar.gz"
},
"remote.SSH.remotePlatform": {
"type": "object",
@@ -32,12 +32,14 @@ export async function getVSCodeServerConfig(): Promise<IServerConfig> {
const customServerBinaryName = vscode.workspace.getConfiguration('remote.SSH.experimental').get<string>('serverBinaryName', '');
return {
version: vscode.version.replace('-insider', ''),
// version: vscode.version.replace('-insider', ''),
commit: productJson.commit,
quality: productJson.quality,
release: productJson.release,
serverApplicationName: customServerBinaryName || productJson.serverApplicationName,
serverDataFolderName: productJson.serverDataFolderName,
serverDownloadUrlTemplate: productJson.serverDownloadUrlTemplate
serverDownloadUrlTemplate: productJson.serverDownloadUrlTemplate,
// Void changed this
version: productJson.voidVersion
};
}
@@ -39,7 +39,7 @@ export class ServerInstallError extends Error {
}
}
const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/voideditor/void-updates-server/releases/download/test/void-server-${os}-${arch}.tar.gz';
const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/voideditor/binaries/releases/download/${version}.${release}/void-reh-${os}-${arch}-${version}.${release}.tar.gz';
export async function installCodeServer(conn: SSHConnection, serverDownloadUrlTemplate: string | undefined, extensionIds: string[], envVariables: string[], platform: string | undefined, useSocketPath: boolean, logger: Log): Promise<ServerInstallResult> {
let shell = 'powershell';
+1 -1
View File
@@ -117,7 +117,7 @@
"cssnano": "^6.0.3",
"debounce": "^1.0.0",
"deemon": "^1.8.0",
"electron": "^34.3.2",
"electron": "34.3.2",
"eslint": "^9.11.1",
"eslint-formatter-compact": "^8.40.0",
"eslint-plugin-header": "3.1.1",
+1 -1
View File
@@ -178,7 +178,7 @@
"cssnano": "^6.0.3",
"debounce": "^1.0.0",
"deemon": "^1.8.0",
"electron": "^34.3.2",
"electron": "34.3.2",
"eslint": "^9.11.1",
"eslint-formatter-compact": "^8.40.0",
"eslint-plugin-header": "3.1.1",
@@ -412,17 +412,20 @@ export const ButtonStop = ({ className, ...props }: ButtonHTMLAttributes<HTMLBut
}
const scrollToBottom = (divRef: { current: HTMLElement | null }) => {
if (divRef.current) {
divRef.current.scrollTop = divRef.current.scrollHeight;
}
};
const ScrollToBottomContainer = ({ children, className, style, scrollContainerRef }: { children: React.ReactNode, className?: string, style?: React.CSSProperties, scrollContainerRef: React.MutableRefObject<HTMLDivElement | null> }) => {
const [isAtBottom, setIsAtBottom] = useState(true); // Start at bottom
const divRef = scrollContainerRef
const scrollToBottom = () => {
if (divRef.current) {
divRef.current.scrollTop = divRef.current.scrollHeight;
}
};
const onScroll = () => {
const div = divRef.current;
if (!div) return;
@@ -437,13 +440,13 @@ const ScrollToBottomContainer = ({ children, className, style, scrollContainerRe
// When children change (new messages added)
useEffect(() => {
if (isAtBottom) {
scrollToBottom();
scrollToBottom(divRef);
}
}, [children, isAtBottom]); // Dependency on children to detect new messages
// Initial scroll to bottom
useEffect(() => {
scrollToBottom();
scrollToBottom(divRef);
}, []);
return (
@@ -735,6 +738,8 @@ const ToolHeaderWrapper = ({
{/* right */}
<div className="flex items-center gap-x-2 flex-shrink-0">
{isError && <AlertTriangle className='text-void-warning opacity-90 flex-shrink-0' size={14} />}
{isRejected && <Ban className='text-void-fg-4 opacity-90 flex-shrink-0' size={14} />}
{desc2 && <span className="text-void-fg-4 text-xs">
{desc2}
</span>}
@@ -743,8 +748,6 @@ const ToolHeaderWrapper = ({
{`${numResults}${hasNextPage ? '+' : ''} result${numResults !== 1 ? 's' : ''}`}
</span>
)}
{isError && <AlertTriangle className='text-void-warning opacity-90 flex-shrink-0' size={14} />}
{isRejected && <Ban className='text-void-fg-4 opacity-90 flex-shrink-0' size={14} />}
</div>
</div>
</div>
@@ -806,7 +809,7 @@ const SimplifiedToolHeader = ({
const UserMessageComponent = ({ chatMessage, messageIdx, isCommitted }: { chatMessage: ChatMessage & { role: 'user' }, messageIdx: number, isCommitted: boolean, }) => {
const UserMessageComponent = ({ chatMessage, messageIdx, isCommitted, _scrollToBottom }: { chatMessage: ChatMessage & { role: 'user' }, messageIdx: number, isCommitted: boolean, _scrollToBottom: (() => void) | null }) => {
const accessor = useAccessor()
const chatThreadsService = accessor.get('IChatThreadService')
@@ -907,6 +910,7 @@ const UserMessageComponent = ({ chatMessage, messageIdx, isCommitted }: { chatMe
console.error('Error while editing message:', e)
}
sidebarStateService.fireFocusChat()
requestAnimationFrame(() => _scrollToBottom?.())
}
const onAbort = () => {
@@ -1816,9 +1820,10 @@ type ChatBubbleProps = {
chatIsRunning: IsRunningType,
threadId: string,
isToolBeingWritten: boolean,
_scrollToBottom: (() => void) | null,
}
const ChatBubble = ({ chatMessage, isCommitted, messageIdx, isLast, chatIsRunning, threadId, isToolBeingWritten }: ChatBubbleProps) => {
const ChatBubble = ({ chatMessage, isCommitted, messageIdx, isLast, chatIsRunning, threadId, isToolBeingWritten, _scrollToBottom }: ChatBubbleProps) => {
const role = chatMessage.role
if (role === 'user') {
@@ -1826,6 +1831,7 @@ const ChatBubble = ({ chatMessage, isCommitted, messageIdx, isLast, chatIsRunnin
chatMessage={chatMessage}
messageIdx={messageIdx}
isCommitted={isCommitted}
_scrollToBottom={_scrollToBottom}
/>
}
else if (role === 'assistant') {
@@ -1999,6 +2005,7 @@ export const SidebarChat = () => {
isLast={isLast}
threadId={threadId}
isToolBeingWritten={toolIsLoading}
_scrollToBottom={() => scrollToBottom(scrollContainerRef)}
/>
})
}, [previousMessages, isRunning, currentThread, numMessages])
@@ -2019,6 +2026,7 @@ export const SidebarChat = () => {
isLast={true}
threadId={threadId}
isToolBeingWritten={toolIsLoading}
_scrollToBottom={null}
/> : null
@@ -46,6 +46,7 @@ import { ILanguageService } from '../../../../../../../editor/common/languages/l
import { IVoidModelService } from '../../../../common/voidModelService.js'
import { IWorkspaceContextService } from '../../../../../../../platform/workspace/common/workspace.js'
import { IVoidCommandBarService } from '../../../voidCommandBarService.js'
import { INativeHostService } from '../../../../../../../platform/native/common/native.js';
// normally to do this you'd use a useEffect that calls .onDidChangeState(), but useEffect mounts too late and misses initial state changes
@@ -213,6 +214,7 @@ const getReactAccessor = (accessor: ServicesAccessor) => {
IWorkspaceContextService: accessor.get(IWorkspaceContextService),
IVoidCommandBarService: accessor.get(IVoidCommandBarService),
INativeHostService: accessor.get(INativeHostService),
} as const
return reactAccessor
@@ -665,6 +665,8 @@ const OneClickSwitchButton = () => {
const GeneralTab = () => {
const accessor = useAccessor()
const commandService = accessor.get('ICommandService')
const environmentService = accessor.get('IEnvironmentService')
const nativeHostService = accessor.get('INativeHostService')
return <>
@@ -696,6 +698,11 @@ const GeneralTab = () => {
Theme Settings
</VoidButton>
</div>
<div className='my-4'>
<VoidButton onClick={() => { nativeHostService.showItemInFolder(environmentService.logsHome.fsPath) }}>
Open Logs
</VoidButton>
</div>
</div>