From 35f53e66dd5d1f3d4c4b547475e03de38d4c56fb Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 18:47:34 -0700 Subject: [PATCH 01/15] definition --- .../browser/react/src/void-command-bar-tsx/VoidCommandBar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-command-bar-tsx/VoidCommandBar.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-command-bar-tsx/VoidCommandBar.tsx index 25ffbaec..99dbf770 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-command-bar-tsx/VoidCommandBar.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-command-bar-tsx/VoidCommandBar.tsx @@ -97,7 +97,7 @@ const VoidCommandBar = ({ uri, editor }: VoidCommandBarProps) => { if (diffid === undefined) return const diff = editCodeService.diffOfId[diffid] if (!diff) return - editor.revealLineNearTop(diff.startLine, ScrollType.Immediate) + editor.revealLineNearTop(diff.startLine - 1, ScrollType.Immediate) commandBarService.setDiffIdx(uri, idx) } const getNextUriIdx = (step: 1 | -1) => { From 71f8315e06730d3af9efc4bf1e57cc1d78c1ba84 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 19:30:32 -0700 Subject: [PATCH 02/15] fix paste issue --- .../void/browser/react/src/util/inputs.tsx | 31 ++++++++++++++ .../react/src/void-settings-tsx/Settings.tsx | 41 ++++++------------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx index ec2b2e94..a1c573ac 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx @@ -152,6 +152,37 @@ export const VoidInputBox2 = forwardRef(fun }) + +export const VoidSimpleInputBox = ({ value, onChangeValue, placeholder, className, disabled, ...inputProps }: { + value: string; + onChangeValue: (value: string) => void; + placeholder: string; + className?: string; + disabled?: boolean; +} & React.InputHTMLAttributes) => { + const inputRef = useRef(null); + + return ( + onChangeValue(e.target.value)} + placeholder={placeholder} + disabled={disabled} + className={`w-full resize-none text-void-fg-1 placeholder:text-void-fg-3 px-2 py-1 rounded-sm + ${disabled ? 'opacity-50 cursor-not-allowed' : ''} + ${className}`} + style={{ + background: asCssVariable(inputBackground), + color: asCssVariable(inputForeground) + }} + {...inputProps} + /> + ); +}; + + export const VoidInputBox = ({ onChangeText, onCreateInstance, inputBoxRef, placeholder, isPasswordField, multiline }: { onChangeText: (value: string) => void; styles?: Partial, 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 375e5086..3c6d2245 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 @@ -7,7 +7,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { InputBox } from '../../../../../../../base/browser/ui/inputbox/inputBox.js' import { ProviderName, SettingName, displayInfoOfSettingName, providerNames, VoidModelInfo, globalSettingNames, customSettingNamesOfProvider, RefreshableProviderName, refreshableProviderNames, displayInfoOfProviderName, defaultProviderSettings, nonlocalProviderNames, localProviderNames, GlobalSettingName, featureNames, displayInfoOfFeatureName, isProviderNameDisabled, FeatureName } from '../../../../common/voidSettingsTypes.js' import ErrorBoundary from '../sidebar-tsx/ErrorBoundary.js' -import { VoidButton, VoidCheckBox, VoidCustomDropdownBox, VoidInputBox, VoidInputBox2, VoidSwitch } from '../util/inputs.js' +import { VoidButton, VoidCheckBox, VoidCustomDropdownBox, VoidInputBox, VoidInputBox2, VoidSimpleInputBox, VoidSwitch } from '../util/inputs.js' import { useAccessor, useIsDark, useRefreshModelListener, useRefreshModelState, useSettingsState } from '../util/services.js' import { X, RefreshCw, Loader2, Check, MoveRight } from 'lucide-react' import { useScrollbarStyles } from '../util/useScrollbarStyles.js' @@ -255,45 +255,30 @@ export const ModelDump = () => { const ProviderSetting = ({ providerName, settingName }: { providerName: ProviderName, settingName: SettingName }) => { - - // const { title: providerTitle, } = displayInfoOfProviderName(providerName) - const { title: settingTitle, placeholder, isPasswordField, subTextMd } = displayInfoOfSettingName(providerName, settingName) const accessor = useAccessor() const voidSettingsService = accessor.get('IVoidSettingsService') + const settingsState = useSettingsState() - let weChangedTextRef = false + const settingValue = settingsState.settingsOfProvider[providerName][settingName] as string // this should always be a string in this component + if (typeof settingValue !== 'string') { + console.log('Error: Provider setting had a non-string value.') + return + } return
- { - if (weChangedTextRef) return + { voidSettingsService.setSettingOfProvider(providerName, settingName, newVal) }, [voidSettingsService, providerName, settingName])} - // we are responsible for setting the initial value. always sync the instance whenever there's a change to state. - onCreateInstance={useCallback((instance: InputBox) => { - const syncInstance = () => { - const settingsAtProvider = voidSettingsService.state.settingsOfProvider[providerName]; - const stateVal = settingsAtProvider[settingName as SettingName] + // placeholder={`${providerTitle} ${settingTitle} (${placeholder})`} + placeholder={`${settingTitle} (${placeholder})`} - // console.log('SYNCING TO', providerName, settingName, stateVal) - weChangedTextRef = true - instance.value = stateVal as string - weChangedTextRef = false - } - - syncInstance() - const disposable = voidSettingsService.onDidChangeState(syncInstance) - return [disposable] - }, [voidSettingsService, providerName, settingName])} - multiline={false} - isPasswordField={isPasswordField} + type={isPasswordField ? 'password' : 'text'} /> {subTextMd === undefined ? null :
From fd1c8406182cc2be004dfa329dd73e9f105d37ab Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 19:35:26 -0700 Subject: [PATCH 03/15] fix ugly blue color --- .../contrib/void/browser/react/src/util/inputs.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx index a1c573ac..11819ce0 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx @@ -350,7 +350,7 @@ export const VoidSlider = ({ size === 'xs' ? 'h-1' : size === 'sm' ? 'h-1.5' : size === 'sm+' ? 'h-2' : 'h-2.5' - } bg-gray-200 dark:bg-gray-700 rounded-full cursor-pointer`} + } bg-zinc-200 dark:bg-zinc-600 rounded-full cursor-pointer`} onClick={handleTrackClick} > {/* Filled part of track */} @@ -359,7 +359,7 @@ export const VoidSlider = ({ size === 'xs' ? 'h-1' : size === 'sm' ? 'h-1.5' : size === 'sm+' ? 'h-2' : 'h-2.5' - } bg-gray-900 dark:bg-white rounded-full`} + } bg-zinc-900 dark:bg-white rounded-full`} style={{ width: `${percentage}%` }} />
@@ -372,7 +372,7 @@ export const VoidSlider = ({ size === 'sm' ? 'h-3 w-3' : size === 'sm+' ? 'h-3.5 w-3.5' : 'h-4 w-4' } - bg-white dark:bg-gray-900 rounded-full shadow-md ${disabled ? 'cursor-not-allowed' : 'cursor-grab active:cursor-grabbing'}`} + bg-white dark:bg-zinc-900 rounded-full shadow-md ${disabled ? 'cursor-not-allowed' : 'cursor-grab active:cursor-grabbing'}`} style={{ left: `${percentage}%`, zIndex: 2 }} // Ensure thumb is above the invisible clickable area onMouseDown={(e) => { if (disabled) return; @@ -424,7 +424,7 @@ export const VoidSwitch = ({ className={` cursor-pointer relative inline-flex items-center rounded-full transition-colors duration-200 ease-in-out - ${value ? 'bg-gray-900 dark:bg-white' : 'bg-gray-200 dark:bg-gray-700'} + ${value ? 'bg-zinc-900 dark:bg-white' : 'bg-zinc-200 dark:bg-zinc-600'} ${disabled ? 'opacity-25' : ''} ${size === 'xxs' ? 'h-3 w-5' : ''} ${size === 'xs' ? 'h-4 w-7' : ''} @@ -435,7 +435,7 @@ export const VoidSwitch = ({ > void }) => { return } From d6df2514e158c9124ca2fbea7161bb665c160b0c Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 20:01:05 -0700 Subject: [PATCH 04/15] fix ugly colors --- .../contrib/void/browser/react/src/util/inputs.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx index 11819ce0..775087b0 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx @@ -350,7 +350,7 @@ export const VoidSlider = ({ size === 'xs' ? 'h-1' : size === 'sm' ? 'h-1.5' : size === 'sm+' ? 'h-2' : 'h-2.5' - } bg-zinc-200 dark:bg-zinc-600 rounded-full cursor-pointer`} + } bg-void-bg-2 rounded-full cursor-pointer`} onClick={handleTrackClick} > {/* Filled part of track */} @@ -359,12 +359,12 @@ export const VoidSlider = ({ size === 'xs' ? 'h-1' : size === 'sm' ? 'h-1.5' : size === 'sm+' ? 'h-2' : 'h-2.5' - } bg-zinc-900 dark:bg-white rounded-full`} + } bg-void-fg-1 rounded-full`} style={{ width: `${percentage}%` }} />
- {/* Thumb with sizes matching VoidSwitch */} + {/* Thumb */}
{ if (disabled) return; @@ -424,7 +425,7 @@ export const VoidSwitch = ({ className={` cursor-pointer relative inline-flex items-center rounded-full transition-colors duration-200 ease-in-out - ${value ? 'bg-zinc-900 dark:bg-white' : 'bg-zinc-200 dark:bg-zinc-600'} + ${value ? 'bg-zinc-900 dark:bg-white' : 'bg-white dark:bg-zinc-600'} ${disabled ? 'opacity-25' : ''} ${size === 'xxs' ? 'h-3 w-5' : ''} ${size === 'xs' ? 'h-4 w-7' : ''} @@ -955,7 +956,7 @@ export const BlockCode = ({ initValue, language, maxHeight, showScrollbars }: Bl export const VoidButton = ({ children, disabled, onClick }: { children: React.ReactNode; disabled?: boolean; onClick: () => void }) => { return } From 1c7494861d14bef427557b10817e21fc04391037 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 20:26:47 -0700 Subject: [PATCH 05/15] rename for better accuracy --- src/vs/workbench/contrib/void/browser/aiRegexService.ts | 4 ++-- .../workbench/contrib/void/browser/chatThreadService.ts | 8 ++++---- .../void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 8 ++++---- src/vs/workbench/contrib/void/browser/toolsService.ts | 6 +++--- src/vs/workbench/contrib/void/common/prompt/prompts.ts | 4 ++-- src/vs/workbench/contrib/void/common/toolsServiceTypes.ts | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/aiRegexService.ts b/src/vs/workbench/contrib/void/browser/aiRegexService.ts index 6495a310..f8b15e56 100644 --- a/src/vs/workbench/contrib/void/browser/aiRegexService.ts +++ b/src/vs/workbench/contrib/void/browser/aiRegexService.ts @@ -34,7 +34,7 @@ // // const result = await new Promise((res, rej) => { // // sendLLMMessage({ // // messages, -// // tools: ['text_search'], +// // tools: ['semantic_search'], // // onFinalMessage: ({ result: r, }) => { // // res(r) // // }, @@ -73,7 +73,7 @@ // // const result = new Promise((res, rej) => { // // sendLLMMessage({ // // messages, -// // tools: ['text_search'], +// // tools: ['semantic_search'], // // onResult: (r) => { // // res(r) // // } diff --git a/src/vs/workbench/contrib/void/browser/chatThreadService.ts b/src/vs/workbench/contrib/void/browser/chatThreadService.ts index e3024792..90299f02 100644 --- a/src/vs/workbench/contrib/void/browser/chatThreadService.ts +++ b/src/vs/workbench/contrib/void/browser/chatThreadService.ts @@ -392,7 +392,7 @@ class ChatThreadService extends Disposable implements IChatThreadService { { role: 'tool', - name: 'text_search', + name: 'semantic_search', id: 'tool-4', paramsStr: '{"query": "function main"}', content: 'Found matches in 3 files', @@ -408,15 +408,15 @@ class ChatThreadService extends Disposable implements IChatThreadService { hasNextPage: false } }, - } satisfies ToolMessage<'text_search'>, + } satisfies ToolMessage<'semantic_search'>, // { // role: 'tool_request', - // name: 'text_search', + // name: 'semantic_search', // params: { queryStr: 'function main', pageNumber: 0 }, // paramsStr: '{"query": "function main"}', // id: 'request-4', - // } satisfies ToolRequestApproval<'text_search'>, + // } satisfies ToolRequestApproval<'semantic_search'>, // --- 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 77697ee8..b99dd266 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 @@ -1178,7 +1178,7 @@ const titleOfToolName = { 'read_file': { done: 'Read file', proposed: 'Read file', running: loadingTitleWrapper('Reading file') }, 'list_dir': { done: 'Inspected folder', proposed: 'Inspect folder', running: loadingTitleWrapper('Inspecting folder') }, 'pathname_search': { done: 'Searched by file name', proposed: 'Search by file name', running: loadingTitleWrapper('Searching by file name') }, - 'text_search': { done: 'Searched', proposed: 'Search text', running: loadingTitleWrapper('Searching') }, + 'semantic_search': { done: 'Semantic searched', proposed: 'Semantic search', running: loadingTitleWrapper('Searching') }, 'create_uri': { done: (isFolder: boolean) => `Created ${folderFileStr(isFolder)}`, proposed: (isFolder: boolean | null) => isFolder === null ? 'Create URI' : `Create ${folderFileStr(isFolder)}`, @@ -1210,8 +1210,8 @@ const toolNameToDesc = (toolName: ToolName, _toolParams: ToolCallParams[ToolName } else if (toolName === 'pathname_search') { const toolParams = _toolParams as ToolCallParams['pathname_search'] return `"${toolParams.queryStr}"`; - } else if (toolName === 'text_search') { - const toolParams = _toolParams as ToolCallParams['text_search'] + } else if (toolName === 'semantic_search') { + const toolParams = _toolParams as ToolCallParams['semantic_search'] return `"${toolParams.queryStr}"`; } else if (toolName === 'create_uri') { const toolParams = _toolParams as ToolCallParams['create_uri'] @@ -1490,7 +1490,7 @@ const toolNameToComponent: { [T in ToolName]: ToolComponent } = { return } }, - 'text_search': { + 'semantic_search': { requestWrapper: null, resultWrapper: ({ toolMessage }) => { const accessor = useAccessor() diff --git a/src/vs/workbench/contrib/void/browser/toolsService.ts b/src/vs/workbench/contrib/void/browser/toolsService.ts index 45048458..7c693d0c 100644 --- a/src/vs/workbench/contrib/void/browser/toolsService.ts +++ b/src/vs/workbench/contrib/void/browser/toolsService.ts @@ -227,7 +227,7 @@ export class ToolsService implements IToolsService { return { queryStr, pageNumber } }, - text_search: async (params: string) => { + semantic_search: async (params: string) => { const o = validateJSON(params) const { query: queryUnknown, pageNumber: pageNumberUnknown } = o @@ -314,7 +314,7 @@ export class ToolsService implements IToolsService { return { result: { uris, hasNextPage } } }, - text_search: async ({ queryStr, pageNumber }) => { + semantic_search: async ({ queryStr, pageNumber }) => { const query = queryBuilder.text({ pattern: queryStr, isRegExp: true, @@ -388,7 +388,7 @@ export class ToolsService implements IToolsService { pathname_search: (params, result) => { return result.uris.map(uri => uri.fsPath).join('\n') + nextPageStr(result.hasNextPage) }, - text_search: (params, result) => { + semantic_search: (params, result) => { return result.uris.map(uri => uri.fsPath).join('\n') + nextPageStr(result.hasNextPage) }, // --- diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index b6e27ce6..13ea2eb3 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -76,8 +76,8 @@ export const voidTools = { }, }, - text_search: { - name: 'text_search', + semantic_search: { + name: 'semantic_search', description: `Returns pathnames of files with an exact match of the query. The query can be any regex. This does NOT search pathname. As a follow-up, you may want to use read_file to view the full file contents of the results. ${paginationHelper.desc}`, params: { query: { type: 'string', description: undefined }, diff --git a/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts b/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts index adefa286..e7315718 100644 --- a/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts +++ b/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts @@ -44,7 +44,7 @@ export type ToolCallParams = { 'read_file': { uri: URI, pageNumber: number }, 'list_dir': { rootURI: URI, pageNumber: number }, 'pathname_search': { queryStr: string, pageNumber: number }, - 'text_search': { queryStr: string, pageNumber: number }, + 'semantic_search': { queryStr: string, pageNumber: number }, // --- 'edit': { uri: URI, changeDescription: string }, 'create_uri': { uri: URI, isFolder: boolean }, @@ -57,7 +57,7 @@ export type ToolResultType = { 'read_file': { fileContents: string, hasNextPage: boolean }, 'list_dir': { children: ToolDirectoryItem[] | null, hasNextPage: boolean, hasPrevPage: boolean, itemsRemaining: number }, 'pathname_search': { uris: URI[], hasNextPage: boolean }, - 'text_search': { uris: URI[], hasNextPage: boolean }, + 'semantic_search': { uris: URI[], hasNextPage: boolean }, // --- 'edit': Promise, 'create_uri': {}, From 4798bbdc86ea1ae14347156a8ff880a6f2bc52d1 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 22:03:26 -0700 Subject: [PATCH 06/15] prompt --- src/vs/workbench/contrib/void/common/prompt/prompts.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index 13ea2eb3..dbe123f5 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -146,7 +146,7 @@ Here's an example of a good description:\n${editToolDescription}.` export const chat_systemMessage = (workspaces: string[], runningTerminalIds: string[], mode: ChatMode) => `\ You are an expert coding ${mode === 'agent' ? 'agent' : 'assistant'} that runs in the Void code editor. Your job is \ -${mode === 'agent' ? `to help the user develop, run, deploy, and make changes to their codebase. You should ALWAYS bring user's task to completion to the fullest extent possible, calling tools to make all necessary changes. Do not be lazy.` +${mode === 'agent' ? `to help the user develop, run, deploy, and make changes to their codebase. You should ALWAYS bring user's task to completion to the fullest extent possible, calling tools to make all necessary changes.` : mode === 'gather' ? `to search and understand the user's codebase. You MUST use tools to read files and help the user understand the codebase, even if you were initially given files.` : mode === 'normal' ? `to assist the user with their coding tasks.` : ''} @@ -163,7 +163,9 @@ ${/* tool use */ mode === 'agent' || mode === 'gather' ? `\ You will be given tools you can call. ${mode === 'agent' ? `\ - Only use tools if they help you accomplish the user's goal. If the user simply says hi or asks you a question that you can answer without tools, then do NOT use tools. -- ALWAYS use tools to take actions. For example, if you would like to edit a file, you MUST use a tool.` +- ALWAYS use tools to take actions. For example, if you would like to edit a file, you MUST use a tool. +- You will OFTEN need to gather context before making a change. Do not immediately make a change unless you have ALL relevant context. +- ALWAYS have maximal certainty in a change BEFORE you make it. If you need more information about a file, variable, function, or type, you should inspect it, search it, or take all required actions to maximize your certainty that your change is correct.` : mode === 'gather' ? `\ - Your primary use of tools should be to gather information to help the user understand the codebase and answer their query. - You should extensively read files, types, etc and gather relevant context.` From 32bee63b503c468c3b89e00b9668ec191936fc4e Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 22:26:09 -0700 Subject: [PATCH 07/15] fix prompting that made void use pathname_search over regular search --- src/vs/workbench/contrib/void/browser/aiRegexService.ts | 4 ++-- .../workbench/contrib/void/browser/chatThreadService.ts | 8 ++++---- .../void/browser/react/src/sidebar-tsx/SidebarChat.tsx | 8 ++++---- src/vs/workbench/contrib/void/browser/toolsService.ts | 6 +++--- src/vs/workbench/contrib/void/common/prompt/prompts.ts | 8 ++++---- src/vs/workbench/contrib/void/common/toolsServiceTypes.ts | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/aiRegexService.ts b/src/vs/workbench/contrib/void/browser/aiRegexService.ts index f8b15e56..4e37f99c 100644 --- a/src/vs/workbench/contrib/void/browser/aiRegexService.ts +++ b/src/vs/workbench/contrib/void/browser/aiRegexService.ts @@ -34,7 +34,7 @@ // // const result = await new Promise((res, rej) => { // // sendLLMMessage({ // // messages, -// // tools: ['semantic_search'], +// // tools: ['grep_search'], // // onFinalMessage: ({ result: r, }) => { // // res(r) // // }, @@ -73,7 +73,7 @@ // // const result = new Promise((res, rej) => { // // sendLLMMessage({ // // messages, -// // tools: ['semantic_search'], +// // tools: ['grep_search'], // // onResult: (r) => { // // res(r) // // } diff --git a/src/vs/workbench/contrib/void/browser/chatThreadService.ts b/src/vs/workbench/contrib/void/browser/chatThreadService.ts index 90299f02..ca2f6369 100644 --- a/src/vs/workbench/contrib/void/browser/chatThreadService.ts +++ b/src/vs/workbench/contrib/void/browser/chatThreadService.ts @@ -392,7 +392,7 @@ class ChatThreadService extends Disposable implements IChatThreadService { { role: 'tool', - name: 'semantic_search', + name: 'grep_search', id: 'tool-4', paramsStr: '{"query": "function main"}', content: 'Found matches in 3 files', @@ -408,15 +408,15 @@ class ChatThreadService extends Disposable implements IChatThreadService { hasNextPage: false } }, - } satisfies ToolMessage<'semantic_search'>, + } satisfies ToolMessage<'grep_search'>, // { // role: 'tool_request', - // name: 'semantic_search', + // name: 'grep_search', // params: { queryStr: 'function main', pageNumber: 0 }, // paramsStr: '{"query": "function main"}', // id: 'request-4', - // } satisfies ToolRequestApproval<'semantic_search'>, + // } satisfies ToolRequestApproval<'grep_search'>, // --- 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 b99dd266..18a40ac7 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 @@ -1178,7 +1178,7 @@ const titleOfToolName = { 'read_file': { done: 'Read file', proposed: 'Read file', running: loadingTitleWrapper('Reading file') }, 'list_dir': { done: 'Inspected folder', proposed: 'Inspect folder', running: loadingTitleWrapper('Inspecting folder') }, 'pathname_search': { done: 'Searched by file name', proposed: 'Search by file name', running: loadingTitleWrapper('Searching by file name') }, - 'semantic_search': { done: 'Semantic searched', proposed: 'Semantic search', running: loadingTitleWrapper('Searching') }, + 'grep_search': { done: 'Searched', proposed: 'Search', running: loadingTitleWrapper('Searching') }, 'create_uri': { done: (isFolder: boolean) => `Created ${folderFileStr(isFolder)}`, proposed: (isFolder: boolean | null) => isFolder === null ? 'Create URI' : `Create ${folderFileStr(isFolder)}`, @@ -1210,8 +1210,8 @@ const toolNameToDesc = (toolName: ToolName, _toolParams: ToolCallParams[ToolName } else if (toolName === 'pathname_search') { const toolParams = _toolParams as ToolCallParams['pathname_search'] return `"${toolParams.queryStr}"`; - } else if (toolName === 'semantic_search') { - const toolParams = _toolParams as ToolCallParams['semantic_search'] + } else if (toolName === 'grep_search') { + const toolParams = _toolParams as ToolCallParams['grep_search'] return `"${toolParams.queryStr}"`; } else if (toolName === 'create_uri') { const toolParams = _toolParams as ToolCallParams['create_uri'] @@ -1490,7 +1490,7 @@ const toolNameToComponent: { [T in ToolName]: ToolComponent } = { return } }, - 'semantic_search': { + 'grep_search': { requestWrapper: null, resultWrapper: ({ toolMessage }) => { const accessor = useAccessor() diff --git a/src/vs/workbench/contrib/void/browser/toolsService.ts b/src/vs/workbench/contrib/void/browser/toolsService.ts index 7c693d0c..ad773cd0 100644 --- a/src/vs/workbench/contrib/void/browser/toolsService.ts +++ b/src/vs/workbench/contrib/void/browser/toolsService.ts @@ -227,7 +227,7 @@ export class ToolsService implements IToolsService { return { queryStr, pageNumber } }, - semantic_search: async (params: string) => { + grep_search: async (params: string) => { const o = validateJSON(params) const { query: queryUnknown, pageNumber: pageNumberUnknown } = o @@ -314,7 +314,7 @@ export class ToolsService implements IToolsService { return { result: { uris, hasNextPage } } }, - semantic_search: async ({ queryStr, pageNumber }) => { + grep_search: async ({ queryStr, pageNumber }) => { const query = queryBuilder.text({ pattern: queryStr, isRegExp: true, @@ -388,7 +388,7 @@ export class ToolsService implements IToolsService { pathname_search: (params, result) => { return result.uris.map(uri => uri.fsPath).join('\n') + nextPageStr(result.hasNextPage) }, - semantic_search: (params, result) => { + grep_search: (params, result) => { return result.uris.map(uri => uri.fsPath).join('\n') + nextPageStr(result.hasNextPage) }, // --- diff --git a/src/vs/workbench/contrib/void/common/prompt/prompts.ts b/src/vs/workbench/contrib/void/common/prompt/prompts.ts index dbe123f5..29ac971a 100644 --- a/src/vs/workbench/contrib/void/common/prompt/prompts.ts +++ b/src/vs/workbench/contrib/void/common/prompt/prompts.ts @@ -69,16 +69,16 @@ export const voidTools = { pathname_search: { name: 'pathname_search', - description: `Returns all pathnames that match a given grep query. You should use this when looking for a file with a specific name or path. This does NOT search file content. ${paginationHelper.desc}`, + description: `Returns all pathnames that match a given \`find\`-style query (searches ONLY file names). You should use this when looking for a file with a specific name or path. ${paginationHelper.desc}`, params: { query: { type: 'string', description: undefined }, ...paginationHelper.param, }, }, - semantic_search: { - name: 'semantic_search', - description: `Returns pathnames of files with an exact match of the query. The query can be any regex. This does NOT search pathname. As a follow-up, you may want to use read_file to view the full file contents of the results. ${paginationHelper.desc}`, + grep_search: { + name: 'grep_search', + description: `Returns all pathnames that match a given \`grep\`-style query (searches ONLY file contents). The query can be any regex. This is often followed by the \`read_file\` tool to view the full file contents of results. ${paginationHelper.desc}`, params: { query: { type: 'string', description: undefined }, ...paginationHelper.param, diff --git a/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts b/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts index e7315718..90d34311 100644 --- a/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts +++ b/src/vs/workbench/contrib/void/common/toolsServiceTypes.ts @@ -44,7 +44,7 @@ export type ToolCallParams = { 'read_file': { uri: URI, pageNumber: number }, 'list_dir': { rootURI: URI, pageNumber: number }, 'pathname_search': { queryStr: string, pageNumber: number }, - 'semantic_search': { queryStr: string, pageNumber: number }, + 'grep_search': { queryStr: string, pageNumber: number }, // --- 'edit': { uri: URI, changeDescription: string }, 'create_uri': { uri: URI, isFolder: boolean }, @@ -57,7 +57,7 @@ export type ToolResultType = { 'read_file': { fileContents: string, hasNextPage: boolean }, 'list_dir': { children: ToolDirectoryItem[] | null, hasNextPage: boolean, hasPrevPage: boolean, itemsRemaining: number }, 'pathname_search': { uris: URI[], hasNextPage: boolean }, - 'semantic_search': { uris: URI[], hasNextPage: boolean }, + 'grep_search': { uris: URI[], hasNextPage: boolean }, // --- 'edit': Promise, 'create_uri': {}, From 1f98e75a4f6bb1cce031fc4281a68fc7e3cd422d Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 22:46:25 -0700 Subject: [PATCH 08/15] terminal better --- .../react/src/sidebar-tsx/SidebarChat.tsx | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 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 18a40ac7..088ba708 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 @@ -740,7 +740,7 @@ const ToolHeaderWrapper = ({ } {numResults !== undefined && ( - {`(${numResults}${hasNextPage ? '+' : ''} result${numResults !== 1 ? 's' : ''})`} + {`${numResults}${hasNextPage ? '+' : ''} result${numResults !== 1 ? 's' : ''}`} )} {isError && } @@ -751,7 +751,7 @@ const ToolHeaderWrapper = ({ {/* children */} {
@@ -1310,7 +1310,7 @@ const ToolRequestAcceptRejectButtons = () => { } export const ToolChildrenWrapper = ({ children, className }: { children: React.ReactNode, className?: string }) => { - return
+ return
{children}
@@ -1764,16 +1764,18 @@ const toolNameToComponent: { [T in ToolName]: ToolComponent } = { : null componentParams.children = - terminalToolsService.openTerminal(terminalId)} - /> +
- {resolveReason.type === 'bgtask' ? 'Result so far:\n' : null} - {result} - {resultStr} +
+ {`Ran command: `} + {command} +
+
+ {resolveReason.type === 'bgtask' ? 'Result so far:\n' : null} + {`Result: `} + {result} + {resultStr} +
From 69a75f5c47df329b61c01a14e8017c5954d5f26e Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 23:24:08 -0700 Subject: [PATCH 09/15] fix paste --- .../contrib/void/browser/react/src/util/inputs.tsx | 8 ++++---- .../void/browser/react/src/void-settings-tsx/Settings.tsx | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx index 775087b0..8e82d750 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx @@ -153,19 +153,17 @@ export const VoidInputBox2 = forwardRef(fun }) -export const VoidSimpleInputBox = ({ value, onChangeValue, placeholder, className, disabled, ...inputProps }: { +export const VoidSimpleInputBox = ({ value, onChangeValue, placeholder, className, disabled, passwordBlur, ...inputProps }: { value: string; onChangeValue: (value: string) => void; placeholder: string; className?: string; disabled?: boolean; + passwordBlur?: boolean; } & React.InputHTMLAttributes) => { - const inputRef = useRef(null); return ( onChangeValue(e.target.value)} placeholder={placeholder} @@ -174,10 +172,12 @@ export const VoidSimpleInputBox = ({ value, onChangeValue, placeholder, classNam ${disabled ? 'opacity-50 cursor-not-allowed' : ''} ${className}`} style={{ + ...passwordBlur && { WebkitTextSecurity: 'disc' }, background: asCssVariable(inputBackground), color: asCssVariable(inputForeground) }} {...inputProps} + type={undefined} // VS Code is doing some annoyingness that breaks paste if this is defined /> ); }; 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 3c6d2245..3b97463a 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 @@ -262,6 +262,7 @@ const ProviderSetting = ({ providerName, settingName }: { providerName: Provider const settingsState = useSettingsState() const settingValue = settingsState.settingsOfProvider[providerName][settingName] as string // this should always be a string in this component + console.log(`providerName:${providerName} settingName: ${settingName}, settingValue: ${settingValue}`) if (typeof settingValue !== 'string') { console.log('Error: Provider setting had a non-string value.') return @@ -274,11 +275,9 @@ const ProviderSetting = ({ providerName, settingName }: { providerName: Provider onChangeValue={useCallback((newVal) => { voidSettingsService.setSettingOfProvider(providerName, settingName, newVal) }, [voidSettingsService, providerName, settingName])} - // placeholder={`${providerTitle} ${settingTitle} (${placeholder})`} placeholder={`${settingTitle} (${placeholder})`} - - type={isPasswordField ? 'password' : 'text'} + passwordBlur={isPasswordField} /> {subTextMd === undefined ? null :
From cf9482bd76d1e9c497678f053779117c10652828 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Sun, 23 Mar 2025 23:41:28 -0700 Subject: [PATCH 10/15] add back dropdown animation which was removed --- .../browser/react/src/sidebar-tsx/SidebarChat.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 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 088ba708..48b37593 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 @@ -750,8 +750,8 @@ const ToolHeaderWrapper = ({
{/* children */} {
@@ -1018,6 +1018,9 @@ const SmallProseWrapper = ({ children }: { children: React.ReactNode }) => { leading-snug text-[13px] + [&>:first-child]:!mt-0 + [&>:last-child]:!mb-0 + prose-h1:text-[14px] prose-h1:my-4 @@ -1154,7 +1157,7 @@ const ReasoningWrapper = ({ isDoneReasoning, isStreaming, children }: { isDoneRe if (!isWriting) setIsOpen(false) // if just finished reasoning, close }, [isWriting]) return : ''} isOpen={isOpen} onClick={() => setIsOpen(v => !v)}> - +
{children}
@@ -1763,7 +1766,7 @@ const toolNameToComponent: { [T in ToolName]: ToolComponent } = { resolveReason.type === 'toofull' ? `\n(truncated)` : null - componentParams.children = + componentParams.children =
From 28ac708904e02ac72131e61a9c58a5205ccf81dd Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 24 Mar 2025 08:36:01 -0700 Subject: [PATCH 11/15] error message --- src/vs/workbench/contrib/void/browser/editCodeService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/browser/editCodeService.ts b/src/vs/workbench/contrib/void/browser/editCodeService.ts index ccf5484e..098b073e 100644 --- a/src/vs/workbench/contrib/void/browser/editCodeService.ts +++ b/src/vs/workbench/contrib/void/browser/editCodeService.ts @@ -1628,7 +1628,7 @@ class EditCodeService extends Disposable implements IEditCodeService { this._notifyError(e) onDone() this._undoHistory(uri) - throw e.fullError // throw error h + throw e.fullError || new Error(e.message) // throw error h } // refresh now in case onText takes a while to get 1st message From c4e78cd3ba5e7a6f829015b06e50e8db95e68a59 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 24 Mar 2025 18:36:20 -0700 Subject: [PATCH 12/15] size --- .../void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx b/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx index b09a22ba..1069b635 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx @@ -267,7 +267,7 @@ export const useApplyButtonHTML = ({ codeStr, applyBoxId, uri }: { codeStr: stri } - const statusIndicatorHTML =
+ const statusIndicatorHTML =
Date: Mon, 24 Mar 2025 19:43:14 -0700 Subject: [PATCH 13/15] add refetch --- .github/workflows/build.yml | 527 ++++++++++++++++++++++++++++++++++++ 1 file changed, 527 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..d7b2049a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,527 @@ +name: Build Void + +on: + push: + branches: [ main, release/*, github-workflow ] + pull_request: + branches: [ main ] + workflow_dispatch: + +jobs: + build-linux: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libx11-dev libxkbfile-dev libsecret-1-dev libkrb5-dev + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + npm install + npm install -g node-gyp + npm install -g gulp-cli + + - name: Build + run: | + npm run buildreact + npm run gulp vscode-linux-x64-min + + - name: Package + run: | + mkdir -p .build/linux/client + ARCHIVE_PATH=".build/linux/client/void-linux-x64.tar.gz" + tar -czf $ARCHIVE_PATH -C .. VSCode-linux-x64 + + - name: Generate checksum + run: | + cd .build/linux/client + sha256sum void-linux-x64.tar.gz > void-linux-x64.tar.gz.sha256 + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: void-linux-x64 + path: | + .build/linux/client/void-linux-x64.tar.gz + .build/linux/client/void-linux-x64.tar.gz.sha256 + + build-linux-arm64: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libx11-dev libxkbfile-dev libsecret-1-dev libkrb5-dev + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + npm install + npm install -g node-gyp + npm install -g gulp-cli + + - name: Build + run: | + npm run buildreact + npm run gulp vscode-linux-arm64-min + + - name: Package + run: | + mkdir -p .build/linux/client + ARCHIVE_PATH=".build/linux/client/void-linux-arm64.tar.gz" + tar -czf $ARCHIVE_PATH -C .. VSCode-linux-arm64 + + - name: Generate checksum + run: | + cd .build/linux/client + sha256sum void-linux-arm64.tar.gz > void-linux-arm64.tar.gz.sha256 + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: void-linux-arm64 + path: | + .build/linux/client/void-linux-arm64.tar.gz + .build/linux/client/void-linux-arm64.tar.gz.sha256 + + build-windows: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: | + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + npm install + npm install -g node-gyp + npm install -g gulp-cli + + - name: Build + run: | + npm run buildreact + npm run gulp vscode-win32-x64-min + + - name: Package + run: | + mkdir -p .build/win32-x64 + Compress-Archive -Path ..\VSCode-win32-x64\* -DestinationPath .build\win32-x64\void-win32-x64.zip + shell: pwsh + + - name: Generate checksum + run: | + cd .build/win32-x64 + $hash = Get-FileHash -Algorithm SHA256 void-win32-x64.zip + $hash.Hash | Out-File -Encoding ascii void-win32-x64.zip.sha256 + shell: pwsh + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: void-win32-x64 + path: | + .build/win32-x64/void-win32-x64.zip + .build/win32-x64/void-win32-x64.zip.sha256 + + build-windows-arm64: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: | + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + npm install + npm install -g node-gyp + npm install -g gulp-cli + + - name: Build + run: | + npm run buildreact + npm run gulp vscode-win32-arm64-min + + - name: Package + run: | + mkdir -p .build/win32-arm64 + Compress-Archive -Path ..\VSCode-win32-arm64\* -DestinationPath .build\win32-arm64\void-win32-arm64.zip + shell: pwsh + + - name: Generate checksum + run: | + cd .build/win32-arm64 + $hash = Get-FileHash -Algorithm SHA256 void-win32-arm64.zip + $hash.Hash | Out-File -Encoding ascii void-win32-arm64.zip.sha256 + shell: pwsh + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: void-win32-arm64 + path: | + .build/win32-arm64/void-win32-arm64.zip + .build/win32-arm64/void-win32-arm64.zip.sha256 + + build-macos: + runs-on: macos-latest-large + strategy: + matrix: + arch: [arm64, x64] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: | + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + npm install + npm install -g node-gyp + npm install -g gulp-cli + npm install -g create-dmg + + - name: Build + run: | + npm run buildreact + npm run gulp vscode-darwin-${{ matrix.arch }}-min + + - name: Create temporary working directory + run: | + WORKING_DIR="${{ runner.temp }}/VoidSign-${{ matrix.arch }}" + KEYCHAIN_DIR="${WORKING_DIR}/1_Keychain" + SIGN_DIR="${WORKING_DIR}/2_Signed" + mkdir -p "${WORKING_DIR}" "${KEYCHAIN_DIR}" "${SIGN_DIR}" + cp -Rp "$(pwd)/../VSCode-darwin-${{ matrix.arch }}" "${SIGN_DIR}" + echo "WORKING_DIR=${WORKING_DIR}" >> $GITHUB_ENV + echo "KEYCHAIN_DIR=${KEYCHAIN_DIR}" >> $GITHUB_ENV + echo "SIGN_DIR=${SIGN_DIR}" >> $GITHUB_ENV + echo "SIGNED_DOTAPP_DIR=${SIGN_DIR}/VSCode-darwin-${{ matrix.arch }}" >> $GITHUB_ENV + echo "SIGNED_DOTAPP=${SIGN_DIR}/VSCode-darwin-${{ matrix.arch }}/Void.app" >> $GITHUB_ENV + + - name: Import certificate + if: ${{ github.event_name != 'pull_request' && github.repository == 'voideditor/void' }} + env: + P12_BASE64: ${{ secrets.MACOS_CERTIFICATE }} + P12_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PWD }} + KEYCHAIN_PASSWORD: "temporary-password" + run: | + KEYCHAIN="${KEYCHAIN_DIR}/buildagent.keychain" + echo "KEYCHAIN=${KEYCHAIN}" >> $GITHUB_ENV + + # Create a new keychain + security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN}" + security set-keychain-settings -lut 21600 "${KEYCHAIN}" + security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN}" + + # Import certificate + echo "${P12_BASE64}" | base64 --decode > "${KEYCHAIN_DIR}/certificate.p12" + security import "${KEYCHAIN_DIR}/certificate.p12" -k "${KEYCHAIN}" -P "${P12_PASSWORD}" -T /usr/bin/codesign + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN}" > /dev/null + + # Add to keychain list + security list-keychains -d user -s "${KEYCHAIN}" $(security list-keychains -d user | sed s/\"//g) + + - name: Sign Application + if: ${{ github.event_name != 'pull_request' && github.repository == 'voideditor/void' }} + env: + CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY }} + VSCODE_ARCH: ${{ matrix.arch }} + run: | + export AGENT_TEMPDIRECTORY="${KEYCHAIN_DIR}" + cd $(pwd)/build/darwin + node sign.js "${SIGN_DIR}" + codesign --verify --verbose=4 "${SIGNED_DOTAPP}" + + - name: Create Unsigned App (for PR builds) + if: ${{ github.event_name == 'pull_request' || github.repository != 'voideditor/void' }} + run: | + cp -Rp "$(pwd)/../VSCode-darwin-${{ matrix.arch }}" "${SIGN_DIR}" + echo "SIGNED_DOTAPP_DIR=$(pwd)/../VSCode-darwin-${{ matrix.arch }}" >> $GITHUB_ENV + echo "SIGNED_DOTAPP=$(pwd)/../VSCode-darwin-${{ matrix.arch }}/Void.app" >> $GITHUB_ENV + + - name: Create DMG + run: | + cd "${SIGNED_DOTAPP_DIR}" + npx create-dmg --volname "Void Installer" "${SIGNED_DOTAPP}" . || true + GENERATED_DMG=$(ls *.dmg) + mv "${GENERATED_DMG}" "Void-Installer-darwin-${{ matrix.arch }}.dmg" + + if [[ "${{ github.event_name }}" != "pull_request" && "${{ github.repository }}" == "voideditor/void" ]]; then + codesign --verify --verbose=4 "Void-Installer-darwin-${{ matrix.arch }}.dmg" + fi + + echo "SIGNED_DMG=${SIGNED_DOTAPP_DIR}/Void-Installer-darwin-${{ matrix.arch }}.dmg" >> $GITHUB_ENV + + - name: Notarize + if: ${{ github.event_name != 'pull_request' && github.repository == 'voideditor/void' }} + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APP_PASSWORD: ${{ secrets.APPLE_APP_PWD }} + KEYCHAIN_PASSWORD: "temporary-password" + run: | + # Store credentials for notarization + xcrun notarytool store-credentials "Void" \ + --apple-id "${APPLE_ID}" \ + --team-id "${TEAM_ID}" \ + --password "${APP_PASSWORD}" \ + --keychain "${KEYCHAIN}" + + # Submit for notarization with a timeout + xcrun notarytool submit "${SIGNED_DMG}" \ + --keychain-profile "Void" \ + --keychain "${KEYCHAIN}" \ + --wait --timeout 2h + + # Staple the notarization ticket + xcrun stapler staple "${SIGNED_DMG}" + + - name: Create Raw App Archive + run: | + cd "${SIGNED_DOTAPP_DIR}" + VOIDAPP=$(basename "${SIGNED_DOTAPP}") + ditto -c -k --sequesterRsrc --keepParent "${VOIDAPP}" "Void-RawApp-darwin-${{ matrix.arch }}.zip" + + - name: Generate Hash File + run: | + cd "${SIGNED_DOTAPP_DIR}" + SHA1=$(shasum -a 1 "Void-RawApp-darwin-${{ matrix.arch }}.zip" | cut -d' ' -f1) + SHA256=$(shasum -a 256 "Void-RawApp-darwin-${{ matrix.arch }}.zip" | cut -d' ' -f1) + TIMESTAMP=$(date +%s) + + cat > "Void-UpdJSON-darwin-${{ matrix.arch }}.json" << EOF + { + "sha256hash": "${SHA256}", + "hash": "${SHA1}", + "timestamp": ${TIMESTAMP} + } + EOF + + - name: Generate checksum for DMG + run: | + cd "${SIGNED_DOTAPP_DIR}" + shasum -a 256 "Void-Installer-darwin-${{ matrix.arch }}.dmg" > "Void-Installer-darwin-${{ matrix.arch }}.dmg.sha256" + + - name: Upload DMG + uses: actions/upload-artifact@v4 + with: + name: void-darwin-${{ matrix.arch }}-dmg + path: | + ${{ env.SIGNED_DMG }} + ${{ env.SIGNED_DOTAPP_DIR }}/Void-Installer-darwin-${{ matrix.arch }}.dmg.sha256 + + - name: Upload Raw App + uses: actions/upload-artifact@v4 + with: + name: void-darwin-${{ matrix.arch }}-rawapp + path: ${{ env.SIGNED_DOTAPP_DIR }}/Void-RawApp-darwin-${{ matrix.arch }}.zip + + - name: Upload Hash File + uses: actions/upload-artifact@v4 + with: + name: void-darwin-${{ matrix.arch }}-hash + path: ${{ env.SIGNED_DOTAPP_DIR }}/Void-UpdJSON-darwin-${{ matrix.arch }}.json + + create-universal-macos: + needs: build-macos + runs-on: macos-latest-large + if: ${{ github.event_name != 'pull_request' && github.repository == 'voideditor/void' }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Download x64 DMG + uses: actions/download-artifact@v4 + with: + name: void-darwin-x64-dmg + path: .build/darwin-x64 + + - name: Download arm64 DMG + uses: actions/download-artifact@v4 + with: + name: void-darwin-arm64-dmg + path: .build/darwin-arm64 + + - name: Download x64 App + uses: actions/download-artifact@v4 + with: + name: void-darwin-x64-rawapp + path: .build/darwin-x64-app + + - name: Download arm64 App + uses: actions/download-artifact@v4 + with: + name: void-darwin-arm64-rawapp + path: .build/darwin-arm64-app + + - name: Create Universal App working dir + run: | + mkdir -p .build/darwin-universal/{x64,arm64,universal} + + - name: Extract Apps + run: | + unzip -o .build/darwin-x64-app/Void-RawApp-darwin-x64.zip -d .build/darwin-universal/x64 + unzip -o .build/darwin-arm64-app/Void-RawApp-darwin-arm64.zip -d .build/darwin-universal/arm64 + + - name: Install dependencies for universal app + run: | + cd build/ + # Set npm config to use GitHub token for authentication to avoid rate limits + npm config set //github.com/:_authToken=${{ github.token }} + npm config set //api.github.com/:_authToken=${{ github.token }} + npm config set //npm.pkg.github.com/:_authToken=${{ github.token }} + # Configure npm to use the GitHub token for all requests to github.com domains + npm config set @microsoft:registry https://npm.pkg.github.com + npm config set @vscode:registry https://npm.pkg.github.com + # Increase network timeout to handle slow connections + npm config set fetch-timeout 300000 + npm config set fetch-retry-mintimeout 20000 + npm config set fetch-retry-maxtimeout 120000 + + npm install + npm install -g create-dmg + npm run compile + + + - name: Create Universal App + run: | + # Script to create universal binary + cd build/darwin + node create-universal-app.js \ + "$(pwd)/../../.build/darwin-universal/arm64/Void.app" \ + "$(pwd)/../../.build/darwin-universal/x64/Void.app" \ + "$(pwd)/../../.build/darwin-universal/universal/Void.app" + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Create Universal DMG + run: | + cd .build/darwin-universal/universal + create-dmg --volname "Void Installer" Void.app . || true + GENERATED_DMG=$(ls *.dmg) + mv "${GENERATED_DMG}" "../../Void-Installer-darwin-universal.dmg" + cd ../.. + shasum -a 256 Void-Installer-darwin-universal.dmg > Void-Installer-darwin-universal.dmg.sha256 + + - name: Upload Universal DMG + uses: actions/upload-artifact@v4 + with: + name: void-darwin-universal + path: | + .build/Void-Installer-darwin-universal.dmg + .build/Void-Installer-darwin-universal.dmg.sha256 + + create-release: + needs: [build-linux, build-linux-arm64, build-windows, build-windows-arm64, build-macos, create-universal-macos] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/v') + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: release-artifacts + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + files: | + release-artifacts/void-linux-x64/void-linux-x64.tar.gz + release-artifacts/void-linux-x64/void-linux-x64.tar.gz.sha256 + release-artifacts/void-linux-arm64/void-linux-arm64.tar.gz + release-artifacts/void-linux-arm64/void-linux-arm64.tar.gz.sha256 + release-artifacts/void-win32-x64/void-win32-x64.zip + release-artifacts/void-win32-x64/void-win32-x64.zip.sha256 + release-artifacts/void-win32-arm64/void-win32-arm64.zip + release-artifacts/void-win32-arm64/void-win32-arm64.zip.sha256 + release-artifacts/void-darwin-x64-dmg/Void-Installer-darwin-x64.dmg + release-artifacts/void-darwin-x64-dmg/Void-Installer-darwin-x64.dmg.sha256 + release-artifacts/void-darwin-arm64-dmg/Void-Installer-darwin-arm64.dmg + release-artifacts/void-darwin-arm64-dmg/Void-Installer-darwin-arm64.dmg.sha256 + release-artifacts/void-darwin-universal/Void-Installer-darwin-universal.dmg + release-artifacts/void-darwin-universal/Void-Installer-darwin-universal.dmg.sha256 + draft: true + generate_release_notes: true From f1a31246b2014d0725bbd98e3253a0b5bebf715b Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 24 Mar 2025 19:46:19 -0700 Subject: [PATCH 14/15] b2 --- .github/workflows/b2.yml | 407 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 407 insertions(+) create mode 100644 .github/workflows/b2.yml diff --git a/.github/workflows/b2.yml b/.github/workflows/b2.yml new file mode 100644 index 00000000..c5dc727d --- /dev/null +++ b/.github/workflows/b2.yml @@ -0,0 +1,407 @@ +name: VS Code Build + +on: + workflow_dispatch: + inputs: + build_macos: + description: 'Build macOS' + type: boolean + default: true + build_macos_arm64: + description: 'Build macOS ARM64' + type: boolean + default: true + build_macos_universal: + description: 'Build macOS Universal' + type: boolean + default: true + build_linux: + description: 'Build Linux x64' + type: boolean + default: true + build_linux_arm64: + description: 'Build Linux ARM64' + type: boolean + default: false + build_windows: + description: 'Build Windows' + type: boolean + default: true + quality: + description: 'Quality (insider or stable)' + type: choice + options: + - insider + - stable + default: 'insider' + +env: + VSCODE_QUALITY: ${{ github.event.inputs.quality }} + NPM_REGISTRY: 'https://registry.npmjs.org/' + VSCODE_ARCH: 'x64' + VSCODE_CIBUILD: false + +jobs: + compile: + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Install Dependencies + run: | + npm ci + + - name: Compile + run: | + npm run compile + + - name: Package Compilation Output + run: | + mkdir -p .build + tar -czf compilation.tar.gz .build out-* test/integration/browser/out test/smoke/out test/automation/out + + - name: Upload Compilation Artifact + uses: actions/upload-artifact@v4 + with: + name: compilation + path: compilation.tar.gz + + compile-cli: + runs-on: ubuntu-latest + needs: compile + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Install Dependencies + run: | + npm ci + + - name: Build CLI + run: | + cd cli + cargo build --release --bin=code + + - name: Upload CLI Artifacts + uses: actions/upload-artifact@v4 + with: + name: vscode_cli + path: cli/target/release/code + + build-macos: + if: ${{ github.event.inputs.build_macos == 'true' }} + runs-on: macos-latest + needs: [compile, compile-cli] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Download Compilation + uses: actions/download-artifact@v4 + with: + name: compilation + + - name: Extract Compilation + run: tar -xzf compilation.tar.gz + + - name: Install Dependencies + run: npm ci + + - name: Build macOS x64 + run: | + npm run gulp vscode-darwin-x64-min-ci + + - name: Download CLI + uses: actions/download-artifact@v4 + with: + name: vscode_cli + path: cli-bin + + - name: Integrate CLI + run: | + APP_ROOT="$(pwd)/../VSCode-darwin-x64" + APP_NAME="`ls $APP_ROOT | head -n 1`" + APP_PATH="$APP_ROOT/$APP_NAME" + CLI_APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").tunnelApplicationName") + mkdir -p "$APP_PATH/Contents/Resources/app/bin" + cp cli-bin/code "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME" + chmod +x "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME" + + - name: Package macOS App + run: | + ARCHIVE_PATH="VSCode-darwin-x64.zip" + (cd ../VSCode-darwin-x64 && zip -r -X -y $(pwd)/$ARCHIVE_PATH *) + + - name: Upload macOS App + uses: actions/upload-artifact@v4 + with: + name: vscode-darwin-x64 + path: VSCode-darwin-x64.zip + + build-macos-arm64: + if: ${{ github.event.inputs.build_macos_arm64 == 'true' }} + runs-on: macos-latest + needs: [compile, compile-cli] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Download Compilation + uses: actions/download-artifact@v4 + with: + name: compilation + + - name: Extract Compilation + run: tar -xzf compilation.tar.gz + + - name: Install Dependencies + run: npm ci + + - name: Build macOS ARM64 + run: | + npm run gulp vscode-darwin-arm64-min-ci + + - name: Download CLI + uses: actions/download-artifact@v4 + with: + name: vscode_cli + path: cli-bin + + - name: Integrate CLI + run: | + APP_ROOT="$(pwd)/../VSCode-darwin-arm64" + APP_NAME="`ls $APP_ROOT | head -n 1`" + APP_PATH="$APP_ROOT/$APP_NAME" + CLI_APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").tunnelApplicationName") + mkdir -p "$APP_PATH/Contents/Resources/app/bin" + cp cli-bin/code "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME" + chmod +x "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME" + + - name: Package macOS App + run: | + ARCHIVE_PATH="VSCode-darwin-arm64.zip" + (cd ../VSCode-darwin-arm64 && zip -r -X -y $(pwd)/$ARCHIVE_PATH *) + + - name: Upload macOS App + uses: actions/upload-artifact@v4 + with: + name: vscode-darwin-arm64 + path: VSCode-darwin-arm64.zip + + build-macos-universal: + if: ${{ github.event.inputs.build_macos_universal == 'true' && github.event.inputs.build_macos == 'true' && github.event.inputs.build_macos_arm64 == 'true' }} + runs-on: macos-latest + needs: [build-macos, build-macos-arm64] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Download x64 Build + uses: actions/download-artifact@v4 + with: + name: vscode-darwin-x64 + + - name: Download ARM64 Build + uses: actions/download-artifact@v4 + with: + name: vscode-darwin-arm64 + + - name: Extract Builds + run: | + mkdir -p VSCode-darwin-x64 + mkdir -p VSCode-darwin-arm64 + unzip VSCode-darwin-x64.zip -d VSCode-darwin-x64 + unzip VSCode-darwin-arm64.zip -d VSCode-darwin-arm64 + + - name: Install Dependencies + run: npm ci + + - name: Create Universal Build + run: | + node build/darwin/create-universal-app.js $(pwd) + + - name: Package Universal App + run: | + ARCHIVE_PATH="VSCode-darwin-universal.zip" + (cd VSCode-darwin-universal && zip -r -X -y $(pwd)/$ARCHIVE_PATH *) + + - name: Upload Universal App + uses: actions/upload-artifact@v4 + with: + name: vscode-darwin-universal + path: VSCode-darwin-universal.zip + + build-linux: + if: ${{ github.event.inputs.build_linux == 'true' }} + runs-on: ubuntu-latest + needs: [compile, compile-cli] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + npm ci + + - name: Download Compilation + uses: actions/download-artifact@v4 + with: + name: compilation + + - name: Extract Compilation + run: tar -xzf compilation.tar.gz + + - name: Build Linux x64 + run: | + npm run gulp vscode-linux-x64-min-ci + + - name: Download CLI + uses: actions/download-artifact@v4 + with: + name: vscode_cli + path: cli-bin + + - name: Integrate CLI + run: | + CLI_APP_NAME=$(node -p "require(\"../VSCode-linux-x64/resources/app/product.json\").tunnelApplicationName") + mkdir -p "../VSCode-linux-x64/bin" + cp cli-bin/code "../VSCode-linux-x64/bin/$CLI_APP_NAME" + chmod +x "../VSCode-linux-x64/bin/$CLI_APP_NAME" + + - name: Create .tar.gz Archive + run: | + ARCHIVE_PATH="VSCode-linux-x64.tar.gz" + (cd .. && tar -czf $(pwd)/$ARCHIVE_PATH VSCode-linux-x64) + + - name: Upload Linux Build + uses: actions/upload-artifact@v4 + with: + name: vscode-linux-x64-archive + path: VSCode-linux-x64.tar.gz + + - name: Build .deb Package + run: | + npm run gulp vscode-linux-x64-prepare-deb + npm run gulp vscode-linux-x64-build-deb + + - name: Upload .deb Package + uses: actions/upload-artifact@v4 + with: + name: vscode-linux-x64-deb + path: .build/linux/deb/*/deb/*.deb + + - name: Build .rpm Package + run: | + npm run gulp vscode-linux-x64-prepare-rpm + npm run gulp vscode-linux-x64-build-rpm + + - name: Upload .rpm Package + uses: actions/upload-artifact@v4 + with: + name: vscode-linux-x64-rpm + path: .build/linux/rpm/*/*.rpm + + build-windows: + if: ${{ github.event.inputs.build_windows == 'true' }} + runs-on: windows-latest + needs: [compile, compile-cli] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + + - name: Download Compilation + uses: actions/download-artifact@v4 + with: + name: compilation + + - name: Extract Compilation + shell: powershell + run: tar -xzf compilation.tar.gz + + - name: Install Dependencies + run: npm ci + + - name: Build Windows x64 + run: | + npm run gulp vscode-win32-x64-min-ci + npm run gulp vscode-win32-x64-inno-updater + + - name: Download CLI + uses: actions/download-artifact@v4 + with: + name: vscode_cli + path: cli-bin + + - name: Integrate CLI + shell: powershell + run: | + $AppProductJson = Get-Content -Raw -Path "../VSCode-win32-x64/resources/app/product.json" | ConvertFrom-Json + $CliAppName = $AppProductJson.tunnelApplicationName + $AppName = $AppProductJson.applicationName + mkdir -Force "../VSCode-win32-x64/bin" + Copy-Item -Path "cli-bin/code" -Destination "../VSCode-win32-x64/bin/$CliAppName.exe" + + - name: Package Windows Build + shell: powershell + run: | + $ArchivePath = "VSCode-win32-x64.zip" + Compress-Archive -Path "../VSCode-win32-x64/*" -DestinationPath $ArchivePath + + - name: Upload Windows Build + uses: actions/upload-artifact@v4 + with: + name: vscode-win32-x64-archive + path: VSCode-win32-x64.zip + + - name: Build User Setup + run: | + npm run gulp vscode-win32-x64-user-setup + + - name: Upload User Setup + uses: actions/upload-artifact@v4 + with: + name: vscode-win32-x64-user-setup + path: .build/win32-x64/user-setup/VSCodeSetup.exe From b52cf80bd54eb92f3b0012c79e43390534de61c8 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 24 Mar 2025 19:48:11 -0700 Subject: [PATCH 15/15] update --- .github/workflows/b2.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/b2.yml b/.github/workflows/b2.yml index c5dc727d..17e3c236 100644 --- a/.github/workflows/b2.yml +++ b/.github/workflows/b2.yml @@ -1,6 +1,11 @@ name: VS Code Build on: + push: + branches: [ main, release/*, github-workflow ] + pull_request: + branches: [ main ] + workflow_dispatch: inputs: build_macos: