From 3bd6d08841fa37bc7b18f94d1a1989df20c8f2a9 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Tue, 15 Apr 2025 23:04:41 -0700 Subject: [PATCH 01/21] button --- .../react/src/sidebar-tsx/SidebarChat.tsx | 2 +- .../src/void-onboarding/VoidOnboarding.tsx | 59 +++++++++++++++---- 2 files changed, 47 insertions(+), 14 deletions(-) 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 97ffa768..c70166a6 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 @@ -2483,7 +2483,7 @@ export const SidebarChat = () => { const currCheckpointIdx = chatThreadsState.allThreads[threadId]?.state?.currCheckpointIdx ?? undefined // if not exist, treat like checkpoint is last message (infinity) const previousMessagesHTML = useMemo(() => { - const lastMessageIdx = previousMessages.findLastIndex(v => v.role !== 'checkpoint') + // const lastMessageIdx = previousMessages.findLastIndex(v => v.role !== 'checkpoint') // tool request shows up as Editing... if in progress return previousMessages.map((message, i) => { return ) => { + return ( + + ) +} + + type WantToUseOption = 'smart' | 'private' | 'cheap' | 'all' const VoidOnboardingContent = () => { @@ -494,10 +530,11 @@ const VoidOnboardingContent = () => {
Welcome to Void
{ setPageIndex(pageIndex + 1) }} + className='flex justify-center' > - Get Started + { setPageIndex(pageIndex + 1) }} + >Get Started @@ -736,19 +773,15 @@ const VoidOnboardingContent = () => { bottom={prevAndNextButtons} />, 4: -
Jump in
+ {/*
Jump in
*/}
{ - // TODO make a fadeout effect - voidSettingsService.setGlobalSetting('isOnboardingComplete', true) - }} - + className='flex justify-center' > - Enter the Void + { voidSettingsService.setGlobalSetting('isOnboardingComplete', true); }} + >Enter the Void
} From bd580946ce503a69b9cd032bfec1ba1134dcecf2 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 00:58:22 -0700 Subject: [PATCH 02/21] add image --- .../contrib/void/browser/media/void.css | 73 ++++++++++++------- .../src/void-onboarding/VoidOnboarding.tsx | 27 ++++--- 2 files changed, 65 insertions(+), 35 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index ac5ff5f3..4a6516f4 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -3,7 +3,7 @@ * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information. *--------------------------------------------------------------------------------------*/ - .monaco-editor .void-sweepIdxBG { +.monaco-editor .void-sweepIdxBG { background-color: var(--vscode-void-sweepIdxBG); } @@ -24,47 +24,65 @@ } .void-watermark-button { - margin: 8px 0; - padding: 8px 20px; - background-color: #3b82f6; - color: white; - border: none; - border-radius: 4px; - outline: none !important; + margin: 8px 0; + padding: 8px 20px; + background-color: #3b82f6; + color: white; + border: none; + border-radius: 4px; + outline: none !important; box-shadow: none !important; - cursor: pointer; - transition: background-color 0.2s ease; + cursor: pointer; + transition: background-color 0.2s ease; } + .void-watermark-button:hover { - background-color: #2563eb; + background-color: #2563eb; } + .void-watermark-button:active { - background-color: #2563eb; + background-color: #2563eb; } .void-settings-watermark-button { - margin: 8px 0; - padding: 8px 20px; - background-color: var(--vscode-input-background); + margin: 8px 0; + padding: 8px 20px; + background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); - border: none; - border-radius: 4px; - outline: none !important; + border: none; + border-radius: 4px; + outline: none !important; box-shadow: none !important; - cursor: pointer; - transition: all 0.2s ease; + cursor: pointer; + transition: all 0.2s ease; } + .void-settings-watermark-button:hover { filter: brightness(1.1); } + .void-settings-watermark-button:active { filter: brightness(1.1); } - +.void-slice-of-void-image { + width: 100%; + height: 100%; + object-fit: contain; + object-position: center; + max-width: 100%; + max-height: 100%; + /* Has no shadow */ + background-image: url('../../../../../../../scripts/appimage/void.png'); + /* Has shadow */ + /* background-image: url('../../../../browser/parts/editor/media/slice_of_void.png'); */ + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} .void-link { @@ -72,6 +90,7 @@ cursor: pointer; transition: all 0.2s ease; } + .void-link:hover { opacity: 80%; } @@ -86,7 +105,8 @@ .void-scope, .void-scope * { scrollbar-width: thin !important; - scrollbar-color: var(--void-bg-1) var(--void-bg-3) !important; /* For Firefox */ + scrollbar-color: var(--void-bg-1) var(--void-bg-3) !important; + /* For Firefox */ } .void-scope::-webkit-scrollbar, @@ -133,13 +153,16 @@ background-color: var(--vscode-editor-background); --scrollbar-vertical-width: 14px; --scrollbar-horizontal-height: 6px; - overflow: auto; /* Ensure scrollbars are shown when needed */ + overflow: auto; + /* Ensure scrollbars are shown when needed */ } .void-scrollable-element, .void-scrollable-element * { - scrollbar-width: thin !important; /* For Firefox */ - scrollbar-color: var(--void-bg-1) var(--void-bg-3) !important; /* For Firefox */ + scrollbar-width: thin !important; + /* For Firefox */ + scrollbar-color: var(--void-bg-1) var(--void-bg-3) !important; + /* For Firefox */ } .void-scrollable-element::-webkit-scrollbar, diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 8365d214..bf4367a0 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -109,7 +109,7 @@ const NextButton = ({ onClick, ...props }: { onClick: () => void } & React.Butto className="px-6 py-2 bg-zinc-100 enabled:hover:bg-zinc-100 disabled:bg-zinc-100/40 disabled:cursor-not-allowed rounded text-black duration-600 transition-all" {...props.disabled && { 'data-tooltip-id': 'void-tooltip', - 'data-tooltip-content': 'Disabled (Please enter all required fields or choose another provider)', + 'data-tooltip-content': 'Please enter all required fields or choose another provider', 'data-tooltip-place': 'top', }} {...props} @@ -389,10 +389,9 @@ const PrimaryActionButton = ({ children, className, ...props }: { children: Reac hover:ring-2 hover:ring-black/90 dark:hover:ring-white/90 active:ring-2 active:ring-black/90 dark:active:ring-white/90 - transition-all duration-300 + transition-all duration-300 ease-in-out rounded-lg - shadow-md hover:shadow-lg group " {...props} @@ -400,7 +399,7 @@ const PrimaryActionButton = ({ children, className, ...props }: { children: Reac {children} Welcome to Void + + {/* Slice of Void image */} +
+
+
+ + { setPageIndex(pageIndex + 1) }} - >Get Started + > + Get Started + - +
} />, 1: { } - return
+ return
{contentOfIdx[pageIndex]}
From b3bd454bad7f8aa6aeca247d02503e4034c61e2b Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 01:02:15 -0700 Subject: [PATCH 03/21] add SSH button --- .../parts/editor/editorGroupWatermark.ts | 37 +++++++++++--- .../contrib/void/browser/media/void.css | 48 +++++++++++++------ 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts index a1175ae3..67243f0a 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts @@ -22,10 +22,12 @@ import { ColorScheme } from '../../web.api.js'; import { OpenFileFolderAction, OpenFolderAction } from '../../actions/workspaceActions.js'; import { IWindowOpenable } from '../../../../platform/window/common/window.js'; import { splitRecentLabel } from '../../../../base/common/labels.js'; +import { IViewsService } from '../../../services/views/common/viewsService.js'; /* eslint-disable */ // Void import { VOID_CTRL_K_ACTION_ID, VOID_CTRL_L_ACTION_ID } from '../../../contrib/void/browser/actionIDs.js'; import { VOID_OPEN_SETTINGS_ACTION_ID } from '../../../contrib/void/browser/voidSettingsPane.js'; +import { VIEWLET_ID as REMOTE_EXPLORER_VIEWLET_ID } from '../../../contrib/remote/browser/remoteExplorer.js'; /* eslint-enable */ // interface WatermarkEntry { @@ -98,6 +100,7 @@ export class EditorGroupWatermark extends Disposable { @ICommandService private readonly commandService: ICommandService, @IHostService private readonly hostService: IHostService, @ILabelService private readonly labelService: ILabelService, + @IViewsService private readonly viewsService: IViewsService, ) { super(); @@ -182,13 +185,19 @@ export class EditorGroupWatermark extends Disposable { // Void - if the workbench is empty, show open if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { + // Create a flex container for buttons + const buttonContainer = $('div'); + buttonContainer.style.display = 'flex'; + buttonContainer.style.justifyContent = 'center'; + buttonContainer.style.marginBottom = '16px'; + voidIconBox.appendChild(buttonContainer); + // Open a folder const openFolderButton = h('button') - openFolderButton.root.classList.add('void-watermark-button') - openFolderButton.root.style.display = 'block' - openFolderButton.root.style.marginLeft = 'auto' - openFolderButton.root.style.marginRight = 'auto' - openFolderButton.root.style.marginBottom = '16px' + openFolderButton.root.classList.add('void-openfolder-button') + openFolderButton.root.style.display = 'inline-block' + openFolderButton.root.style.marginRight = '8px' + openFolderButton.root.style.width = '124px' openFolderButton.root.textContent = 'Open a folder' openFolderButton.root.onclick = () => { this.commandService.executeCommand(isMacintosh && isNative ? OpenFileFolderAction.ID : OpenFolderAction.ID) @@ -198,7 +207,20 @@ export class EditorGroupWatermark extends Disposable { // this.commandService.executeCommand(isMacintosh ? 'workbench.action.files.openFileFolder' : 'workbench.action.files.openFolder'); // } } - voidIconBox.appendChild(openFolderButton.root); + buttonContainer.appendChild(openFolderButton.root); + + // Open SSH button + const openSSHButton = h('button') + openSSHButton.root.classList.add('void-openssh-button') + openSSHButton.root.style.display = 'inline-block' + openSSHButton.root.style.marginLeft = '8px' + openSSHButton.root.style.backgroundColor = '#5a5a5a' // Made darker than the default gray + openSSHButton.root.style.width = '124px' + openSSHButton.root.textContent = 'Open SSH' + openSSHButton.root.onclick = () => { + this.viewsService.openViewContainer(REMOTE_EXPLORER_VIEWLET_ID); + } + buttonContainer.appendChild(openSSHButton.root); // Recents @@ -244,6 +266,9 @@ export class EditorGroupWatermark extends Disposable { const dirSpan = $('span'); dirSpan.style.paddingLeft = '4px'; + dirSpan.style.whiteSpace = 'nowrap'; + dirSpan.style.overflow = 'hidden'; + dirSpan.style.maxWidth = '300px'; dirSpan.innerText = parentPath; dirSpan.title = fullPath; diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index 4a6516f4..64ac4872 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -23,28 +23,46 @@ background-color: var(--vscode-void-redBG); } -.void-watermark-button { - margin: 8px 0; - padding: 8px 20px; - background-color: #3b82f6; - color: white; - border: none; - border-radius: 4px; - outline: none !important; + +/* Renamed from void-watermark-button to void-openfolder-button */ +.void-openfolder-button { + margin: 8px 0; + padding: 8px 20px; + background-color: #3b82f6; + color: white; + border: none; + border-radius: 4px; + outline: none !important; box-shadow: none !important; cursor: pointer; transition: background-color 0.2s ease; } - -.void-watermark-button:hover { - background-color: #2563eb; +.void-openfolder-button:hover { + background-color: #2563eb; +} +.void-openfolder-button:active { + background-color: #2563eb; } -.void-watermark-button:active { - background-color: #2563eb; +/* Added for Open SSH button with slightly darker color */ +.void-openssh-button { + margin: 8px 0; + padding: 8px 20px; + background-color: #656565; /* Slightly darker than the #5a5a5a in the TS file */ + color: white; + border: none; + border-radius: 4px; + outline: none !important; + box-shadow: none !important; + cursor: pointer; + transition: background-color 0.2s ease; +} +.void-openssh-button:hover { + background-color: #474747; /* Darker on hover */ +} +.void-openssh-button:active { + background-color: #474747; } - - .void-settings-watermark-button { From 091855a89a6e480e68970e9645dcf7d5675118bc Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 01:02:25 -0700 Subject: [PATCH 04/21] linux version for deb, rem, snap --- build/gulpfile.vscode.linux.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js index 620548ec..4d1b7462 100644 --- a/build/gulpfile.vscode.linux.js +++ b/build/gulpfile.vscode.linux.js @@ -86,7 +86,7 @@ function prepareDebPackage(arch) { const dependencies = await dependenciesGenerator.getDependencies('deb', binaryDir, product.applicationName, debArch); gulp.src('resources/linux/debian/control.template', { base: '.' }) .pipe(replace('@@NAME@@', product.applicationName)) - .pipe(replace('@@VERSION@@', `${packageJson.version}.${packageJson.release}`)) + .pipe(replace('@@VERSION@@', `${product.voidVersion}.${packageJson.release}`)) .pipe(replace('@@ARCHITECTURE@@', debArch)) .pipe(replace('@@DEPENDS@@', dependencies.join(', '))) .pipe(replace('@@RECOMMENDS@@', debianRecommendedDependencies.join(', '))) @@ -201,7 +201,7 @@ function prepareRpmPackage(arch) { .pipe(replace('@@NAME@@', product.applicationName)) .pipe(replace('@@NAME_LONG@@', product.nameLong)) .pipe(replace('@@ICON@@', product.linuxIconName)) - .pipe(replace('@@VERSION@@', `${packageJson.version}.${packageJson.release}`)) + .pipe(replace('@@VERSION@@', `${product.voidVersion}.${packageJson.release}`)) .pipe(replace('@@ARCHITECTURE@@', rpmArch)) .pipe(replace('@@LICENSE@@', product.licenseName)) .pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@')) @@ -277,7 +277,7 @@ function prepareSnapPackage(arch) { const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' }) .pipe(replace('@@NAME@@', product.applicationName)) - .pipe(replace('@@VERSION@@', `${packageJson.version}.${packageJson.release}`)) + .pipe(replace('@@VERSION@@', `${product.voidVersion}.${packageJson.release}`)) // Possible run-on values https://snapcraft.io/docs/architectures .pipe(replace('@@ARCHITECTURE@@', arch === 'x64' ? 'amd64' : arch)) .pipe(rename('snap/snapcraft.yaml')); From fece3b254841701efa1eaf86878812c037b87956 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 01:18:59 -0700 Subject: [PATCH 05/21] update settings page --- .../react/src/void-settings-tsx/Settings.tsx | 459 ++++++++---------- 1 file changed, 203 insertions(+), 256 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index 9dbb164e..a4fb5294 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -572,182 +572,6 @@ const RedoOnboardingButton = ({ className }: { className?: string }) => { } - -export const FeaturesTab = () => { - const voidSettingsState = useSettingsState() - const accessor = useAccessor() - const voidSettingsService = accessor.get('IVoidSettingsService') - - - return <> -

Models

- - - - - - - - - -

Local Providers

- {/*

{`Keep your data private by hosting AI locally on your computer.`}

*/} - {/*

{`Instructions:`}

*/} - {/*

{`Void can access any model that you host locally. We automatically detect your local models by default.`}

*/} -

{`Void can access any model that you host locally. We automatically detect your local models by default.`}

- -
- {ollamaSetupInstructions} -
- - - - - -

Providers

-

{`Void can access models from Anthropic, OpenAI, OpenRouter, and more.`}

- {/*

{`Access models like ChatGPT and Claude. We recommend using Anthropic or OpenAI as providers, or Groq as a faster alternative.`}

*/} - - - - - - -

Feature Options

- - {/* L1 */} -
- {/* FIM */} -
-

{displayInfoOfFeatureName('Autocomplete')}

-
- - Experimental.{' '} - - - Only works with FIM models.* - -
- -
- {/* Enable Switch */} -
- voidSettingsService.setGlobalSetting('enableAutocomplete', newVal)} - /> - {voidSettingsState.globalSettings.enableAutocomplete ? 'Enabled' : 'Disabled'} -
- {/* Model Dropdown */} -
- -
-
- -
- - {/* Apply */} -
-

{displayInfoOfFeatureName('Apply')}

-
Settings that control the behavior of the Apply button and the Edit tool.
- -
- {/* Sync to Chat Switch */} -
- voidSettingsService.setGlobalSetting('syncApplyToChat', newVal)} - /> - {voidSettingsState.globalSettings.syncApplyToChat ? 'Same as Chat model' : 'Different model'} -
- - {/* Model Dropdown */} -
- -
-
- - -
- {/* Fast Apply Method Dropdown */} -
- -
-
- -
- -
- - {/* L2 */} -
- - {/* Tools Section */} -
-

Tools

-
{`Tools are functions that LLMs can call. Some tools require user approval.`}
- -
- {/* Auto Accept Switch */} -
- voidSettingsService.setGlobalSetting('autoApprove', newVal)} - /> - {voidSettingsState.globalSettings.autoApprove ? 'Auto-approve' : 'Auto-approve'} -
- - {/* Tool Lint Errors Switch */} -
- voidSettingsService.setGlobalSetting('includeToolLintErrors', newVal)} - /> - {voidSettingsState.globalSettings.includeToolLintErrors ? 'Fix lint errors' : `Fix lint errors`} -
-
-
- - - -
-

Editor

-
{`Settings that control the visibility of suggestions and widgets in the code editor.`}
- -
- {/* Auto Accept Switch */} -
- voidSettingsService.setGlobalSetting('showInlineSuggestions', newVal)} - /> - {voidSettingsState.globalSettings.showInlineSuggestions ? 'Show suggestions on select' : 'Show suggestions on select'} -
-
-
- - -
- - -
- - - - -} - - type TransferEditorType = 'VS Code' | 'Cursor' | 'Windsurf' // https://github.com/VSCodium/vscodium/blob/master/docs/index.md#migrating-from-visual-studio-code-to-vscodium // https://code.visualstudio.com/docs/editor/extension-marketplace#_where-are-extensions-installed @@ -954,113 +778,236 @@ export const OneClickSwitchButton = ({ fromEditor = 'VS Code', className = '' }: } -const GeneralTab = () => { - const accessor = useAccessor() - const commandService = accessor.get('ICommandService') - const environmentService = accessor.get('IEnvironmentService') - const nativeHostService = accessor.get('INativeHostService') - - return <> -
-

One-Click Switch

-

{`Transfer your settings from another editor to Void in one click.`}

- -
- - - -
-
- - - -
-

Built-in Settings

-

{`IDE settings, keyboard settings, and theme customization.`}

- -
- { commandService.executeCommand('workbench.action.openSettings') }}> - General Settings - -
-
- { commandService.executeCommand('workbench.action.openGlobalKeybindings') }}> - Keyboard Settings - -
-
- { commandService.executeCommand('workbench.action.selectTheme') }}> - Theme Settings - -
-
- { nativeHostService.showItemInFolder(environmentService.logsHome.fsPath) }}> - Open Logs - -
-
- - -
-

AI Instructions

-

{`Instructions to include on all AI requests.`}

- -
- - - -} - // full settings export const Settings = () => { const isDark = useIsDark() - - const [tab, setTab] = useState('models') + const accessor = useAccessor() + const commandService = accessor.get('ICommandService') + const environmentService = accessor.get('IEnvironmentService') + const nativeHostService = accessor.get('INativeHostService') + const settingsState = useSettingsState() + const voidSettingsService = accessor.get('IVoidSettingsService') return
-
+

{`Void's Settings`}

{/* separator */}
-
+ {/* Models section (formerly FeaturesTab) */} + +

Models

+ + + + + +
+ + +

Local Providers

+

{`Void can access any model that you host locally. We automatically detect your local models by default.`}

+ +
+ {ollamaSetupInstructions} +
+ + + + + +

Providers

+

{`Void can access models from Anthropic, OpenAI, OpenRouter, and more.`}

+ + + + + + +

Feature Options

+ {/* L1 */} + + +
+ {/* FIM */} +
+

{displayInfoOfFeatureName('Autocomplete')}

+
+ + Experimental.{' '} + + + Only works with FIM models.* + +
+ +
+ {/* Enable Switch */} +
+ voidSettingsService.setGlobalSetting('enableAutocomplete', newVal)} + /> + {settingsState.globalSettings.enableAutocomplete ? 'Enabled' : 'Disabled'} +
+ {/* Model Dropdown */} +
+ +
+
+ +
+ + {/* Apply */} +
+

{displayInfoOfFeatureName('Apply')}

+
Settings that control the behavior of the Apply button and the Edit tool.
+ +
+ {/* Sync to Chat Switch */} +
+ voidSettingsService.setGlobalSetting('syncApplyToChat', newVal)} + /> + {settingsState.globalSettings.syncApplyToChat ? 'Same as Chat model' : 'Different model'} +
+ + {/* Model Dropdown */} +
+ +
+
+ + +
+ {/* Fast Apply Method Dropdown */} +
+ +
+
+ +
- {/* tabs */} -
- -
- - {/* separator */} -
+ - {/* content */} -
+ {/* L2 */} + -
- +
+ + {/* Tools Section */} +
+

Tools

+
{`Tools are functions that LLMs can call. Some tools require user approval.`}
+ +
+ {/* Auto Accept Switch */} +
+ voidSettingsService.setGlobalSetting('autoApprove', newVal)} + /> + {settingsState.globalSettings.autoApprove ? 'Auto-approve' : 'Auto-approve'} +
+ + {/* Tool Lint Errors Switch */} +
+ voidSettingsService.setGlobalSetting('includeToolLintErrors', newVal)} + /> + {settingsState.globalSettings.includeToolLintErrors ? 'Fix lint errors' : `Fix lint errors`} +
+
-
- -
+ +
+

Editor

+
{`Settings that control the visibility of suggestions and widgets in the code editor.`}
+ +
+ {/* Auto Accept Switch */} +
+ voidSettingsService.setGlobalSetting('showInlineSuggestions', newVal)} + /> + {settingsState.globalSettings.showInlineSuggestions ? 'Show suggestions on select' : 'Show suggestions on select'} +
+
+
+
+ + + + {/* General section (formerly GeneralTab) */} +
+

One-Click Switch

+

{`Transfer your settings from another editor to Void in one click.`}

+ +
+ + +
+ + +
+

Built-in Settings

+

{`IDE settings, keyboard settings, and theme customization.`}

+ +
+ { commandService.executeCommand('workbench.action.openSettings') }}> + General Settings + +
+
+ { commandService.executeCommand('workbench.action.openGlobalKeybindings') }}> + Keyboard Settings + +
+
+ { commandService.executeCommand('workbench.action.selectTheme') }}> + Theme Settings + +
+
+ { nativeHostService.showItemInFolder(environmentService.logsHome.fsPath) }}> + Open Logs + +
+
+ + +
+

AI Instructions

+

{`Instructions to include on all AI requests.`}

+ +
-
} From 3e0e0bd4aa3a0ca4c84c844e6d9c9d3e5494c4de Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 01:23:25 -0700 Subject: [PATCH 06/21] SSH buttons --- .../browser/parts/editor/editorGroupWatermark.ts | 16 ++++++++-------- .../contrib/void/browser/media/void.css | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts index 67243f0a..da97ee90 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts @@ -185,19 +185,20 @@ export class EditorGroupWatermark extends Disposable { // Void - if the workbench is empty, show open if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) { - // Create a flex container for buttons + // Create a flex container for buttons with vertical direction const buttonContainer = $('div'); buttonContainer.style.display = 'flex'; - buttonContainer.style.justifyContent = 'center'; + buttonContainer.style.flexDirection = 'column'; // Change to column for vertical stacking + buttonContainer.style.alignItems = 'center'; // Center the buttons horizontally + buttonContainer.style.gap = '8px'; // Reduce gap between buttons from 16px to 8px buttonContainer.style.marginBottom = '16px'; voidIconBox.appendChild(buttonContainer); // Open a folder const openFolderButton = h('button') openFolderButton.root.classList.add('void-openfolder-button') - openFolderButton.root.style.display = 'inline-block' - openFolderButton.root.style.marginRight = '8px' - openFolderButton.root.style.width = '124px' + openFolderButton.root.style.display = 'block' + openFolderButton.root.style.width = '124px' // Set width to 124px as requested openFolderButton.root.textContent = 'Open a folder' openFolderButton.root.onclick = () => { this.commandService.executeCommand(isMacintosh && isNative ? OpenFileFolderAction.ID : OpenFolderAction.ID) @@ -212,10 +213,9 @@ export class EditorGroupWatermark extends Disposable { // Open SSH button const openSSHButton = h('button') openSSHButton.root.classList.add('void-openssh-button') - openSSHButton.root.style.display = 'inline-block' - openSSHButton.root.style.marginLeft = '8px' + openSSHButton.root.style.display = 'block' openSSHButton.root.style.backgroundColor = '#5a5a5a' // Made darker than the default gray - openSSHButton.root.style.width = '124px' + openSSHButton.root.style.width = '124px' // Set width to 124px as requested openSSHButton.root.textContent = 'Open SSH' openSSHButton.root.onclick = () => { this.viewsService.openViewContainer(REMOTE_EXPLORER_VIEWLET_ID); diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index 64ac4872..9aec392f 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -26,7 +26,6 @@ /* Renamed from void-watermark-button to void-openfolder-button */ .void-openfolder-button { - margin: 8px 0; padding: 8px 20px; background-color: #3b82f6; color: white; @@ -46,7 +45,6 @@ /* Added for Open SSH button with slightly darker color */ .void-openssh-button { - margin: 8px 0; padding: 8px 20px; background-color: #656565; /* Slightly darker than the #5a5a5a in the TS file */ color: white; From 79eacad18b64bc70254d86f49c1be09b357566be Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 02:21:17 -0700 Subject: [PATCH 07/21] error boundaries everywhere + misc (BROKEN) --- .../parts/editor/editorGroupWatermark.ts | 2 +- .../void/browser/autocompleteService.ts | 4 +- .../contrib/void/browser/media/void.css | 2 +- .../react/src/sidebar-tsx/ErrorBoundary.tsx | 12 +- .../react/src/sidebar-tsx/SidebarChat.tsx | 13 +- .../src/void-settings-tsx/ModelDropdown.tsx | 5 +- .../react/src/void-settings-tsx/Settings.tsx | 145 ++++++++++-------- .../void/browser/voidCommandBarService.ts | 2 - 8 files changed, 108 insertions(+), 77 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts index da97ee90..09c89795 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts @@ -199,7 +199,7 @@ export class EditorGroupWatermark extends Disposable { openFolderButton.root.classList.add('void-openfolder-button') openFolderButton.root.style.display = 'block' openFolderButton.root.style.width = '124px' // Set width to 124px as requested - openFolderButton.root.textContent = 'Open a folder' + openFolderButton.root.textContent = 'Open Folder' openFolderButton.root.onclick = () => { this.commandService.executeCommand(isMacintosh && isNative ? OpenFileFolderAction.ID : OpenFolderAction.ID) // if (this.contextKeyService.contextMatchesRules(ContextKeyExpr.and(WorkbenchStateContext.isEqualTo('workspace')))) { diff --git a/src/vs/workbench/contrib/void/browser/autocompleteService.ts b/src/vs/workbench/contrib/void/browser/autocompleteService.ts index 5bf1200d..95ec65c2 100644 --- a/src/vs/workbench/contrib/void/browser/autocompleteService.ts +++ b/src/vs/workbench/contrib/void/browser/autocompleteService.ts @@ -792,7 +792,6 @@ export class AutocompleteService extends Disposable implements IAutocompleteServ const featureName: FeatureName = 'Autocomplete' const modelSelection = this._settingsService.state.modelSelectionOfFeature[featureName] const modelSelectionOptions = modelSelection ? this._settingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName] : undefined - const aiInstructions = this._settingsService.state.globalSettings.aiInstructions // set parameters of `newAutocompletion` appropriately newAutocompletion.llmPromise = new Promise((resolve, reject) => { @@ -804,8 +803,7 @@ export class AutocompleteService extends Disposable implements IAutocompleteServ prefix: llmPrefix, suffix: llmSuffix, stopTokens: stopTokens, - }, - aiInstructions + } }), modelSelection, modelSelectionOptions, diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index 9aec392f..ec14e2d5 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -27,7 +27,7 @@ /* Renamed from void-watermark-button to void-openfolder-button */ .void-openfolder-button { padding: 8px 20px; - background-color: #3b82f6; + background-color: #306dce; color: white; border: none; border-radius: 4px; diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/ErrorBoundary.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/ErrorBoundary.tsx index 2ccc54b2..3720d1a6 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/ErrorBoundary.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/ErrorBoundary.tsx @@ -5,6 +5,7 @@ import React, { Component, ErrorInfo, ReactNode } from 'react'; import { ErrorDisplay } from './ErrorDisplay.js'; +import { WarningBox } from '../void-settings-tsx/WarningBox.js'; interface Props { children: ReactNode; @@ -51,11 +52,12 @@ class ErrorBoundary extends Component { // Use ErrorDisplay component as the default error UI return ( - + + // ); } 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 c70166a6..0cefd52d 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 @@ -29,6 +29,7 @@ import { acceptAllBg, acceptBorder, buttonFontSize, buttonTextColor, rejectAllBg import { ToolName, toolNames } from '../../../../common/prompt/prompts.js'; import { RawToolCallObj } from '../../../../common/sendLLMMessageTypes.js'; import { MAX_FILE_CHARS_PAGE } from '../../../toolsService.js'; +import ErrorBoundary from './ErrorBoundary.js'; @@ -2620,14 +2621,20 @@ export const SidebarChat = () => {
{/* History selector */}
- + + +
- {messagesHTML} + + {messagesHTML} +
- {inputForm} + + {inputForm} +
) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx index a445e3bf..87ddf7d6 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx @@ -12,6 +12,7 @@ import { IconWarning } from '../sidebar-tsx/SidebarChat.js' import { VOID_OPEN_SETTINGS_ACTION_ID, VOID_TOGGLE_SETTINGS_ACTION_ID } from '../../../voidSettingsPane.js' import { modelFilterOfFeatureName, ModelOption } from '../../../../../../../workbench/contrib/void/common/voidSettingsService.js' import { WarningBox } from './WarningBox.js' +import ErrorBoundary from '../sidebar-tsx/ErrorBoundary.js' const optionsEqual = (m1: ModelOption[], m2: ModelOption[]) => { if (m1.length !== m2.length) return false @@ -92,5 +93,7 @@ export const ModelDropdown = ({ featureName, className }: { featureName: Feature : 'Provider required' } /> - return + return + + } diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index a4fb5294..f6073774 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -831,9 +831,9 @@ export const Settings = () => {

Feature Options

{/* L1 */} - -
+
+ {/* FIM */}

{displayInfoOfFeatureName('Autocomplete')}

@@ -853,23 +853,32 @@ export const Settings = () => {
{/* Enable Switch */} -
- voidSettingsService.setGlobalSetting('enableAutocomplete', newVal)} - /> - {settingsState.globalSettings.enableAutocomplete ? 'Enabled' : 'Disabled'} -
+ +
+ voidSettingsService.setGlobalSetting('enableAutocomplete', newVal)} + /> + {settingsState.globalSettings.enableAutocomplete ? 'Enabled' : 'Disabled'} +
+
+ {/* Model Dropdown */} -
- -
+ +
+ +
+
+
+
+ + {/* Apply */} + - {/* Apply */}

{displayInfoOfFeatureName('Apply')}

Settings that control the behavior of the Apply button and the Edit tool.
@@ -900,23 +909,25 @@ export const Settings = () => {
+ + +
-
-
{/* L2 */} - -
+
- {/* Tools Section */} -
-

Tools

-
{`Tools are functions that LLMs can call. Some tools require user approval.`}
+ {/* Tools Section */} +
+

Tools

+
{`Tools are functions that LLMs can call. Some tools require user approval.`}
+ +
+ {/* Auto Accept Switch */} + -
- {/* Auto Accept Switch */}
{ /> {settingsState.globalSettings.autoApprove ? 'Auto-approve' : 'Auto-approve'}
+ + + {/* Tool Lint Errors Switch */} + - {/* Tool Lint Errors Switch */}
{ /> {settingsState.globalSettings.includeToolLintErrors ? 'Fix lint errors' : `Fix lint errors`}
-
+
+
-
-

Editor

-
{`Settings that control the visibility of suggestions and widgets in the code editor.`}
+
+

Editor

+
{`Settings that control the visibility of suggestions and widgets in the code editor.`}
-
- {/* Auto Accept Switch */} +
+ {/* Auto Accept Switch */} +
{ /> {settingsState.globalSettings.showInlineSuggestions ? 'Show suggestions on select' : 'Show suggestions on select'}
-
+
- +
{/* General section (formerly GeneralTab) */}
-

One-Click Switch

-

{`Transfer your settings from another editor to Void in one click.`}

+ +

One-Click Switch

+

{`Transfer your settings from another editor to Void in one click.`}

-
- - - -
+
+ + + +
+
+

Built-in Settings

{`IDE settings, keyboard settings, and theme customization.`}

-
- { commandService.executeCommand('workbench.action.openSettings') }}> - General Settings - -
-
- { commandService.executeCommand('workbench.action.openGlobalKeybindings') }}> - Keyboard Settings - -
-
- { commandService.executeCommand('workbench.action.selectTheme') }}> - Theme Settings - -
-
- { nativeHostService.showItemInFolder(environmentService.logsHome.fsPath) }}> - Open Logs - -
+ +
+ { commandService.executeCommand('workbench.action.openSettings') }}> + General Settings + +
+
+ { commandService.executeCommand('workbench.action.openGlobalKeybindings') }}> + Keyboard Settings + +
+
+ { commandService.executeCommand('workbench.action.selectTheme') }}> + Theme Settings + +
+
+ { nativeHostService.showItemInFolder(environmentService.logsHome.fsPath) }}> + Open Logs + +
+

AI Instructions

{`Instructions to include on all AI requests.`}

- + + +
diff --git a/src/vs/workbench/contrib/void/browser/voidCommandBarService.ts b/src/vs/workbench/contrib/void/browser/voidCommandBarService.ts index 02eadbde..6cfcb1d0 100644 --- a/src/vs/workbench/contrib/void/browser/voidCommandBarService.ts +++ b/src/vs/workbench/contrib/void/browser/voidCommandBarService.ts @@ -362,8 +362,6 @@ export class VoidCommandBarService extends Disposable implements IVoidCommandBar registerSingleton(IVoidCommandBarService, VoidCommandBarService, InstantiationType.Delayed); // delayed is needed here :( -// registerWorkbenchContribution2(VoidCommandBarService.ID, VoidCommandBarService, WorkbenchPhase.BlockRestore); - export type VoidCommandBarProps = { uri: URI | null; From 23f1e8c6417e19879f50f6519fa465865bd3a116 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 02:21:36 -0700 Subject: [PATCH 08/21] .voidinstructions file --- .../browser/convertToLLMMessageService.ts | 50 +++++++++++++++---- .../convertToLLMMessageWorkbenchContrib.ts | 37 ++++++++++++++ .../contrib/void/browser/void.contribution.ts | 1 + 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts diff --git a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts b/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts index 053d25bd..19606415 100644 --- a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts +++ b/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts @@ -13,6 +13,8 @@ import { IVoidSettingsService } from '../common/voidSettingsService.js'; import { ChatMode, FeatureName, ModelSelection } from '../common/voidSettingsTypes.js'; import { IDirectoryStrService } from './directoryStrService.js'; import { ITerminalToolService } from './terminalToolService.js'; +import { IVoidModelService } from '../common/voidModelService.js'; +import { URI } from '../../../../base/common/uri.js'; @@ -412,9 +414,9 @@ const prepareMessages = ({ export interface IConvertToLLMMessageService { readonly _serviceBrand: undefined; - prepareLLMSimpleMessages: (opts: { simpleMessages: SimpleLLMMessage[], systemMessage: string, modelSelection: ModelSelection | null, featureName: FeatureName }) => { messages: LLMChatMessage[], separateSystemMessage: string | undefined }; + prepareLLMSimpleMessages: (opts: { simpleMessages: SimpleLLMMessage[], systemMessage: string, modelSelection: ModelSelection | null, featureName: FeatureName }) => { messages: LLMChatMessage[], separateSystemMessage: string | undefined } prepareLLMChatMessages: (opts: { chatMessages: ChatMessage[], chatMode: ChatMode, modelSelection: ModelSelection | null }) => Promise<{ messages: LLMChatMessage[], separateSystemMessage: string | undefined }> - prepareFIMMessage(opts: { messages: LLMFIMMessage, aiInstructions: string, }): { prefix: string, suffix: string, stopTokens: string[] } + prepareFIMMessage(opts: { messages: LLMFIMMessage, }): { prefix: string, suffix: string, stopTokens: string[] } } @@ -431,10 +433,35 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess @IDirectoryStrService private readonly directoryStrService: IDirectoryStrService, @ITerminalToolService private readonly terminalToolService: ITerminalToolService, @IVoidSettingsService private readonly voidSettingsService: IVoidSettingsService, + @IVoidModelService private readonly voidModelService: IVoidModelService, ) { super() } + // Read .voidinstructions files from workspace folders + private _getVoidInstructionsFileContents(): string { + const workspaceFolders = this.workspaceContextService.getWorkspace().folders; + let voidInstructions = ''; + for (const folder of workspaceFolders) { + const uri = URI.joinPath(folder.uri, '.voidinstructions') + const { model } = this.voidModelService.getModel(uri) + if (!model) continue + voidInstructions += model.getValue() + '\n\n'; + } + return voidInstructions.trim(); + } + + // Get combined AI instructions from settings and .voidinstructions files + private _getCombinedAIInstructions(): string { + const globalAIInstructions = this.voidSettingsService.state.globalSettings.aiInstructions; + const voidInstructionsFileContent = this._getVoidInstructionsFileContents(); + + const ans: string[] = [] + if (globalAIInstructions) ans.push(globalAIInstructions) + if (voidInstructionsFileContent) ans.push(voidInstructionsFileContent) + return ans.join('\n\n') + } + // system message private _generateChatMessagesSystemMessage = async (chatMode: ChatMode, specialToolFormat: 'openai-style' | 'anthropic-style' | undefined) => { @@ -502,7 +529,9 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess } = getModelCapabilities(providerName, modelName) const modelSelectionOptions = this.voidSettingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName] - const aiInstructions = this.voidSettingsService.state.globalSettings.aiInstructions + + // Get combined AI instructions + const aiInstructions = this._getCombinedAIInstructions(); const isReasoningEnabled = getIsReasoningEnabledState(featureName, providerName, modelName, modelSelectionOptions) const maxOutputTokens = getMaxOutputTokens(providerName, modelName, { isReasoningEnabled }) @@ -518,7 +547,6 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess maxOutputTokens, }) return { messages, separateSystemMessage }; - } prepareLLMChatMessages: IConvertToLLMMessageService['prepareLLMChatMessages'] = async ({ chatMessages, chatMode, modelSelection }) => { if (modelSelection === null) return { messages: [], separateSystemMessage: undefined } @@ -531,7 +559,9 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess const systemMessage = await this._generateChatMessagesSystemMessage(chatMode, specialToolFormat) const modelSelectionOptions = this.voidSettingsService.state.optionsOfModelSelection['Chat'][modelSelection.providerName]?.[modelSelection.modelName] - const aiInstructions = this.voidSettingsService.state.globalSettings.aiInstructions + + // Get combined AI instructions + const aiInstructions = this._getCombinedAIInstructions(); const isReasoningEnabled = getIsReasoningEnabledState('Chat', providerName, modelName, modelSelectionOptions) const maxOutputTokens = getMaxOutputTokens(providerName, modelName, { isReasoningEnabled }) @@ -548,19 +578,20 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess maxOutputTokens, }) return { messages, separateSystemMessage }; - } // --- FIM --- - prepareFIMMessage: IConvertToLLMMessageService['prepareFIMMessage'] = ({ messages, aiInstructions }) => { + prepareFIMMessage: IConvertToLLMMessageService['prepareFIMMessage'] = ({ messages }) => { + // Get combined AI instructions with the provided aiInstructions as the base + const combinedInstructions = this._getCombinedAIInstructions(); let prefix = `\ -${!aiInstructions ? '' : `\ +${!combinedInstructions ? '' : `\ // Instructions: // Do not output an explanation. Try to avoid outputting comments. Only output the middle code. -${aiInstructions.split('\n').map(line => `//${line}`).join('\n')}`} +${combinedInstructions.split('\n').map(line => `//${line}`).join('\n')}`} ${messages.prefix}` @@ -573,7 +604,6 @@ ${messages.prefix}` } -// pick one and delete the other: registerSingleton(IConvertToLLMMessageService, ConvertToLLMMessageService, InstantiationType.Eager); diff --git a/src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts b/src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts new file mode 100644 index 00000000..9e65f9da --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts @@ -0,0 +1,37 @@ +/*-------------------------------------------------------------------------------------- + * Copyright 2025 Glass Devtools, Inc. All rights reserved. + * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information. + *--------------------------------------------------------------------------------------*/ + +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { URI } from '../../../../base/common/uri.js'; +import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js'; +import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../common/contributions.js'; +import { IVoidModelService } from '../common/voidModelService.js'; + +class ConvertContribWorkbenchContribution extends Disposable implements IWorkbenchContribution { + static readonly ID = 'workbench.contrib.void.convertcontrib' + _serviceBrand: undefined; + + constructor( + @IVoidModelService private readonly voidModelService: IVoidModelService, + @IWorkspaceContextService private readonly workspaceContext: IWorkspaceContextService, + ) { + super() + + const initializeURI = (uri: URI) => { + this.workspaceContext.getWorkspace() + const voidInstrsURI = URI.joinPath(uri, '.voidinstructions') + this.voidModelService.initializeModel(voidInstrsURI) + } + + // call + this._register(this.workspaceContext.onDidChangeWorkspaceFolders((e) => { + [...e.changed, ...e.added].forEach(w => { initializeURI(w.uri) }) + })) + this.workspaceContext.getWorkspace().folders.forEach(w => { initializeURI(w.uri) }) + } +} + + +registerWorkbenchContribution2(ConvertContribWorkbenchContribution.ID, ConvertContribWorkbenchContribution, WorkbenchPhase.BlockRestore); diff --git a/src/vs/workbench/contrib/void/browser/void.contribution.ts b/src/vs/workbench/contrib/void/browser/void.contribution.ts index 30cdfc8b..cd7b6f60 100644 --- a/src/vs/workbench/contrib/void/browser/void.contribution.ts +++ b/src/vs/workbench/contrib/void/browser/void.contribution.ts @@ -32,6 +32,7 @@ import './media/void.css' // update (frontend part, also see platform/) import './voidUpdateActions.js' +import './convertToLLMMessageWorkbenchContrib.js' // tools import './toolsService.js' From 78f9463da1efcf479c75c3b84fe8e22d0e919e6b Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 02:27:29 -0700 Subject: [PATCH 09/21] .voidinstructions --- .../void/browser/react/src/void-settings-tsx/Settings.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index f6073774..2c386760 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -1024,7 +1024,12 @@ export const Settings = () => {

AI Instructions

-

{`Instructions to include on all AI requests.`}

+

+ +

From 55c4f9e1cf7726614e3c1ac11ea88e5bf3389a53 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 02:47:17 -0700 Subject: [PATCH 10/21] onboarding decent final draft --- .../src/void-onboarding/VoidOnboarding.tsx | 46 +++++++++++++------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index bf4367a0..4d6889cb 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -144,7 +144,7 @@ const OnboardingPageShell = ({ top, bottom, content, hasMaxWidth = true, classNa
{top && {top}} {content && {content}} - {bottom &&
{bottom}
} + {bottom &&
{bottom}
}
) } @@ -376,35 +376,50 @@ const TableOfModelsForProvider = ({ providerName }: { providerName: ProviderName -const PrimaryActionButton = ({ children, className, ...props }: { children: React.ReactNode } & React.ButtonHTMLAttributes) => { +const PrimaryActionButton = ({ children, className, ringSize, ...props }: { children: React.ReactNode, ringSize?: undefined | 'xl' | 'screen' } & React.ButtonHTMLAttributes) => { + + return ( ) @@ -529,13 +544,13 @@ const VoidOnboardingContent = () => {
Welcome to Void
{/* Slice of Void image */} -
+
{ setPageIndex(pageIndex + 1) }} @@ -560,7 +575,7 @@ const VoidOnboardingContent = () => {
From 35e8cf59ffc894200569fa54c99117f22ce441a7 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 03:14:52 -0700 Subject: [PATCH 12/21] better ending screen onboarding --- .../src/void-onboarding/VoidOnboarding.tsx | 57 ++++++++++++------- .../react/src/void-tooltip/VoidTooltip.tsx | 3 +- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index cf883b32..1b94ea7f 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -498,6 +498,19 @@ const VoidOnboardingContent = () => {
+ const lastPagePrevAndNextButtons =
+
+ { setPageIndex(pageIndex - 1) }} + /> + { voidSettingsService.setGlobalSetting('isOnboardingComplete', true); }} + ringSize={voidSettingsState.globalSettings.isOnboardingComplete ? 'screen' : undefined} + >Enter the Void +
+
+ + // cannot be md const basicDescOfWantToUseOption: { [wantToUseOption in WantToUseOption]: string } = { smart: "Models with the best performance on benchmarks.", @@ -793,29 +806,29 @@ const VoidOnboardingContent = () => {
} - bottom={prevAndNextButtons} - />, - 4: - {/*
Jump in
*/} -
- { voidSettingsService.setGlobalSetting('isOnboardingComplete', true); }} - ringSize={voidSettingsState.globalSettings.isOnboardingComplete ? 'screen' :'xl'} - className='text-4xl' - >Enter the Void -
- - } - bottom={ - { setPageIndex(pageIndex - 1) }} - /> - } + bottom={lastPagePrevAndNextButtons} + // bottom={prevAndNextButtons} />, + // 4: + //
+ // { voidSettingsService.setGlobalSetting('isOnboardingComplete', true); }} + // ringSize={voidSettingsState.globalSettings.isOnboardingComplete ? 'screen' : undefined} + // className='text-4xl' + // >Enter the Void + //
+ // + // } + // bottom={ + // { setPageIndex(pageIndex - 1) }} + // /> + // } + // />, } diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx index 0bd7d9e0..9c2eec45 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx @@ -102,8 +102,7 @@ export const VoidTooltip = () => { id="void-tooltip-ollama-settings" border='1px solid rgba(100,100,100,.2)' opacity={1} - openOnClick - openEvents={{ mouseover: true }} + openEvents={{ mouseover: true, click: true, focus: true }} place='right' style={{ pointerEvents: 'all', userSelect: 'text', fontSize: 11 }} > From afc5cf512b9579564362492425bf7aea45f0fb7e Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 03:21:14 -0700 Subject: [PATCH 13/21] remove tooltip for now --- .../browser/react/src/void-onboarding/VoidOnboarding.tsx | 5 +++++ .../void/browser/react/src/void-settings-tsx/Settings.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 1b94ea7f..bb875d13 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -623,6 +623,11 @@ const VoidOnboardingContent = () => {
} + bottom={ +
+ { setPageIndex(pageIndex - 1) }} /> +
+ } />, 2:
From 64d4e264bfedd8fb6f654d4965ce8fdb1dbb01eb Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 03:27:44 -0700 Subject: [PATCH 14/21] onboarding --- .../react/src/void-onboarding/VoidOnboarding.tsx | 2 +- .../react/src/void-settings-tsx/Settings.tsx | 2 +- .../contrib/void/common/modelCapabilities.ts | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index bb875d13..7e7ecde1 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -752,7 +752,7 @@ const VoidOnboardingContent = () => { {/* Add provider section - simplified styling */}
-
+
Add {displayInfoOfProviderName(selectedProviderName).title} diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index 1cd34910..2c386760 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -551,7 +551,7 @@ export const ollamaSetupInstructions =
diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 5d5b4169..4cbf5444 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -783,7 +783,7 @@ const groqSettings: VoidStaticProviderInfo = { } const ollamaModelOptions = { - 'qwen2.5-coder:3b': { + 'qwen2.5-coder:1.5b': { contextWindow: 32_000, maxOutputTokens: null, cost: { input: 0, output: 0 }, @@ -792,6 +792,15 @@ const ollamaModelOptions = { supportsSystemMessage: 'system-role', reasoningCapabilities: false, }, + 'llama3.1': { + contextWindow: 128_000, + maxOutputTokens: null, + cost: { input: 0, output: 0 }, + downloadable: { sizeGb: 4.9 }, + supportsFIM: false, + supportsSystemMessage: 'system-role', + reasoningCapabilities: false, + }, 'qwen2.5-coder': { contextWindow: 128_000, maxOutputTokens: null, @@ -822,7 +831,7 @@ const ollamaModelOptions = { } as const satisfies Record -export const ollamaRecommendedModels = ['qwen2.5-coder:3b', 'qwq', 'deepseek-r1'] as const satisfies (keyof typeof ollamaModelOptions)[] +export const ollamaRecommendedModels = ['qwen2.5-coder:1.5b', 'llama3.1', 'qwq', 'deepseek-r1'] as const satisfies (keyof typeof ollamaModelOptions)[] From 3a0eedc9fa49c7a6db37f25035d54f09f3a6ad8d Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 03:29:15 -0700 Subject: [PATCH 15/21] py --- .../browser/react/src/void-onboarding/VoidOnboarding.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 7e7ecde1..dba64ca5 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -752,11 +752,12 @@ const VoidOnboardingContent = () => { {/* Add provider section - simplified styling */}
-
+
Add {displayInfoOfProviderName(selectedProviderName).title} - - {selectedProviderName === 'ollama' ? ollamaSetupInstructions : ''} +
+ {selectedProviderName === 'ollama' ? ollamaSetupInstructions : ''} +
From 4b30990e920b58974534d3b0f7c62a4eaccd5754 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 03:35:25 -0700 Subject: [PATCH 16/21] fix long api key --- .../void/browser/react/src/void-onboarding/VoidOnboarding.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index dba64ca5..642b7808 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -743,7 +743,7 @@ const VoidOnboardingContent = () => { {/* ModelsTable and ProviderFields */} - {selectedProviderName &&
+ {selectedProviderName &&
{/* Models Table */} @@ -751,7 +751,7 @@ const VoidOnboardingContent = () => { {/* Add provider section - simplified styling */} -
+
Add {displayInfoOfProviderName(selectedProviderName).title} From 05bd1790a7fbc0a160ce8539d258c303fdb18efb Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 03:46:12 -0700 Subject: [PATCH 17/21] mistral --- .../browser/react/src/void-onboarding/VoidOnboarding.tsx | 6 +++--- src/vs/workbench/contrib/void/common/voidSettingsService.ts | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 642b7808..ca44a194 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -157,7 +157,7 @@ const OllamaDownloadOrRemoveModelButton = ({ modelName, isModelInstalled, sizeGb href={`https://ollama.com/library/${modelName}`} target="_blank" rel="noopener noreferrer" - className="flex items-center text-void-fg-2 hover:text-void-fg-1" + className="flex items-center justify-center text-void-fg-2 hover:text-void-fg-1" > @@ -353,7 +353,7 @@ const TableOfModelsForProvider = ({ providerName }: { providerName: ProviderName {/* */} - {isDetectableLocally && {!!isDownloaded ? : <>}} + {isDetectableLocally && {!!isDownloaded ? : <>}} {providerName === 'ollama' && } @@ -523,7 +523,7 @@ const VoidOnboardingContent = () => { const detailedDescOfWantToUseOption: { [wantToUseOption in WantToUseOption]: string } = { smart: "Most intelligent and best for agent mode.", private: "Private-hosted so your data never leaves your computer or network. [Email us](mailto:founders@voideditor.com) for help setting up at your company.", - cheap: "Great deals like Gemini 2.5 Pro or self-host a model with Ollama or vLLM for free.", + cheap: "Use great deals like Gemini 2.5 Pro, or self-host a model with Ollama or vLLM for free.", all: "", } diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index 09be5a02..240f76a3 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -245,6 +245,10 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { } // the stored data structure might be outdated, so we need to update it here + readS = { + ...readS, + settingsOfProvider: { ...defaultSettingsOfProvider, ...readS.settingsOfProvider } // we added mistral + } this.state = readS this.state = _stateWithUpdatedDefaultModels(this.state) this.state = _validatedModelState(this.state); From dbbaa619613aaa3f91822a6bf70f4e5822a23151 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 03:49:41 -0700 Subject: [PATCH 18/21] try again --- .../workbench/contrib/void/common/voidSettingsService.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index 240f76a3..2f839732 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -247,7 +247,14 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { // the stored data structure might be outdated, so we need to update it here readS = { ...readS, - settingsOfProvider: { ...defaultSettingsOfProvider, ...readS.settingsOfProvider } // we added mistral + settingsOfProvider: { + ...defaultSettingsOfProvider, + ...readS.settingsOfProvider, + mistral: { + ...defaultSettingsOfProvider.mistral, + ...readS.settingsOfProvider.mistral, + }, + } // we added mistral } this.state = readS this.state = _stateWithUpdatedDefaultModels(this.state) From 27d9cc29167d1bc2c795725d71e3e964b2cb6b33 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 03:50:56 -0700 Subject: [PATCH 19/21] comment --- src/vs/workbench/contrib/void/common/voidSettingsService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index 2f839732..819a01b7 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -250,7 +250,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { settingsOfProvider: { ...defaultSettingsOfProvider, ...readS.settingsOfProvider, - mistral: { + mistral: { // we added mistral ...defaultSettingsOfProvider.mistral, ...readS.settingsOfProvider.mistral, }, From 6db29526ec5d4070e418c270be45b80da43b62e1 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 16 Apr 2025 04:04:49 -0700 Subject: [PATCH 20/21] add letterpress image --- .../parts/editor/media/editorgroupview.css | 4 ++++ .../contrib/void/browser/media/void.css | 17 ----------------- .../src/void-onboarding/VoidOnboarding.tsx | 2 +- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css index 93cf0be6..f79d0c9c 100644 --- a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css +++ b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css @@ -50,6 +50,7 @@ } /* light */ +.void-void-icon, .monaco-workbench .part.editor > .content .editor-group-container > .editor-group-watermark > .letterpress { width: 100%; max-height: 100%; @@ -60,14 +61,17 @@ background-repeat: no-repeat; } +.void-void-icon, .monaco-workbench.vs-dark .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { background-image: url('./void_cube_noshadow.png'); /* // Void */ } +.void-void-icon, .monaco-workbench.hc-light .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { background-image: url('./void_cube_noshadow.png'); /* // Void */ } +.void-void-icon, .monaco-workbench.hc-black .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { background-image: url('./void_cube_noshadow.png'); /* // Void */ } diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index ec14e2d5..d732c4bf 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -84,23 +84,6 @@ filter: brightness(1.1); } -.void-slice-of-void-image { - width: 100%; - height: 100%; - object-fit: contain; - object-position: center; - max-width: 100%; - max-height: 100%; - /* Has no shadow */ - background-image: url('../../../../../../../scripts/appimage/void.png'); - /* Has shadow */ - /* background-image: url('../../../../browser/parts/editor/media/slice_of_void.png'); */ - background-size: contain; - background-position: center; - background-repeat: no-repeat; -} - - .void-link { color: #3b82f6; cursor: pointer; diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index ca44a194..a60c5169 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -559,7 +559,7 @@ const VoidOnboardingContent = () => { {/* Slice of Void image */}
-
+
From ff2ed836c746226706288f63305988317a3cf958 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 16 Apr 2025 04:26:35 -0700 Subject: [PATCH 21/21] onboarding style --- .../src/void-onboarding/VoidOnboarding.tsx | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index a60c5169..40ee767c 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -3,13 +3,14 @@ * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information. *--------------------------------------------------------------------------------------*/ -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useAccessor, useIsDark, useSettingsState } from '../util/services.js'; import { Brain, Check, ChevronRight, DollarSign, ExternalLink, Lock, X } from 'lucide-react'; import { displayInfoOfProviderName, ProviderName, providerNames, refreshableProviderNames } from '../../../../common/voidSettingsTypes.js'; import { getModelCapabilities, ollamaRecommendedModels } from '../../../../common/modelCapabilities.js'; import { ChatMarkdownRender } from '../markdown/ChatMarkdownRender.js'; import { AddModelInputBox, AnimatedCheckmarkButton, ollamaSetupInstructions, OneClickSwitchButton, SettingsForProvider } from '../void-settings-tsx/Settings.js'; +import { ColorScheme } from '../../../../../../../platform/theme/common/theme.js'; const OVERRIDE_VALUE = false @@ -34,6 +35,30 @@ export const VoidOnboarding = () => { ) } +const VoidIcon = () => { + const accessor = useAccessor() + const themeService = accessor.get('IThemeService') + + const divRef = useRef(null) + + useEffect(() => { + // void icon style + const updateTheme = () => { + const theme = themeService.getColorTheme().type + const isDark = theme === ColorScheme.DARK || theme === ColorScheme.HIGH_CONTRAST_DARK + if (divRef.current) { + divRef.current.style.maxWidth = '220px' + divRef.current.style.opacity = '50%' + divRef.current.style.filter = isDark ? '' : 'invert(1)' //brightness(.5) + } + } + updateTheme() + const d = themeService.onDidColorThemeChange(updateTheme) + return () => d.dispose() + }, []) + + return
+} const FADE_DURATION_MS = 2000 @@ -558,8 +583,8 @@ const VoidOnboardingContent = () => {
Welcome to Void
{/* Slice of Void image */} -
-
+
+
@@ -589,7 +614,7 @@ const VoidOnboardingContent = () => {