diff --git a/package-lock.json b/package-lock.json index 5c783599..5158d409 100644 --- a/package-lock.json +++ b/package-lock.json @@ -299,13 +299,14 @@ "dev": true }, "node_modules/@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", + "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", "dev": true, + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", + "@azure/core-util": "^1.11.0", "tslib": "^2.6.2" }, "engines": { @@ -448,18 +449,18 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.0.tgz", - "integrity": "sha512-CeuTvsXxCUmEuxH5g/aceuSl6w2EugvNHKAtKKVdiX915EjJJxAwfzNNWZreNnbxHZ2fi0zaM6wwS23x2JVqSQ==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.20.0.tgz", + "integrity": "sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==", "dev": true, + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", + "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.9.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -479,12 +480,14 @@ } }, "node_modules/@azure/core-util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", - "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz", + "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==", "dev": true, + "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -4257,6 +4260,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.2.tgz", + "integrity": "sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@vscode/deviceid": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@vscode/deviceid/-/deviceid-0.1.1.tgz", diff --git a/product.json b/product.json index 568a2416..f284560c 100644 --- a/product.json +++ b/product.json @@ -1,8 +1,8 @@ { "nameShort": "Void", "nameLong": "Void", - "voidVersion": "1.3.7", - "voidRelease": "0031", + "voidVersion": "1.3.9", + "voidRelease": "0033", "applicationName": "void", "dataFolderName": ".void-editor", "win32MutexName": "voideditor", diff --git a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts b/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts index 1b7df00e..01fd58aa 100644 --- a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts +++ b/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts @@ -418,6 +418,7 @@ const prepareOpenAIOrAnthropicMessages = ({ else { // allowed to be empty if has a tool in it or following it if (currMsg.content.find(c => c.type === 'tool_result' || c.type === 'tool_use')) { + currMsg.content = currMsg.content.filter(c => !(c.type === 'text' && !c.text)) as any continue } if (nextMsg?.role === 'tool') continue diff --git a/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts b/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts index 49a0d524..83b3ed7b 100644 --- a/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts +++ b/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts @@ -8,6 +8,8 @@ import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase import { IExtensionTransferService } from './extensionTransferService.js'; import { os } from '../common/helpers/systemInfo.js'; import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; +import { timeout } from '../../../../base/common/async.js'; +import { getActiveWindow } from '../../../../base/browser/dom.js'; // Onboarding contribution that mounts the component at startup export class MiscWorkbenchContribs extends Disposable implements IWorkbenchContribution { @@ -31,6 +33,16 @@ export class MiscWorkbenchContribs extends Disposable implements IWorkbenchContr this.extensionTransferService.deleteBlacklistExtensions(os) } + + // after some time, trigger a resize event for the blank screen error + timeout(5_000).then(() => { + // Get the active window reference for multi-window support + const targetWindow = getActiveWindow(); + // Trigger a window resize event to ensure proper layout calculations + targetWindow.dispatchEvent(new Event('resize')) + + }) + } } 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 0252381b..7e60cac8 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 @@ -2605,7 +2605,7 @@ const CommandBarInChat = () => { // !select-text cursor-auto - const fileDetailsContent =
+ const fileDetailsContent =
{sortedCommandBarURIs.map((uri, i) => { const basename = getBasename(uri.fsPath) @@ -2862,6 +2862,7 @@ export const SidebarChat = () => { textAreaRef: textAreaRef, scrollToBottom: () => scrollToBottom(scrollContainerRef), }) + }, [chatThreadsState, threadId, textAreaRef, scrollContainerRef, isResolved]) 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 209cb7fe..20409eb0 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 @@ -17,7 +17,7 @@ import { os } from '../../../../common/helpers/systemInfo.js' import { IconLoading } from '../sidebar-tsx/SidebarChat.js' import { ToolApprovalType, toolApprovalTypes } from '../../../../common/toolsServiceTypes.js' import Severity from '../../../../../../../base/common/severity.js' -import { getModelCapabilities, ModelOverrides } from '../../../../common/modelCapabilities.js'; +import { getModelCapabilities, modelOverrideKeys, ModelOverrides } from '../../../../common/modelCapabilities.js'; import { TransferEditorType, TransferFilesInfo } from '../../../extensionTransferTypes.js'; const ButtonLeftTextRightOption = ({ text, leftButton }: { text: string, leftButton?: React.ReactNode }) => { @@ -185,6 +185,11 @@ const ConfirmButton = ({ children, onConfirm, className }: { children: React.Rea }; // ---------------- Simplified Model Settings Dialog ------------------ + +// keys of ModelOverrides we allow the user to override + + + // This new dialog replaces the verbose UI with a single JSON override box. const SimpleModelSettingsDialog = ({ isOpen, @@ -208,39 +213,26 @@ const SimpleModelSettingsDialog = ({ const currentOverrides = settingsState.overridesOfModel?.[providerName]?.[modelName] ?? undefined; const { recognizedModelName, isUnrecognizedModel } = defaultModelCapabilities - // keys of ModelOverrides we allow the user to override - const allowedKeys: (string & (keyof ModelOverrides))[] = [ - 'contextWindow', - 'reservedOutputTokenSpace', - 'supportsSystemMessage', - 'specialToolFormat', - 'supportsFIM', - 'reasoningCapabilities', - ]; - // Create the placeholder with the default values for allowed keys const partialDefaults: Partial = {}; - for (const k of allowedKeys) { if (defaultModelCapabilities[k]) partialDefaults[k] = defaultModelCapabilities[k] as any; } + for (const k of modelOverrideKeys) { if (defaultModelCapabilities[k]) partialDefaults[k] = defaultModelCapabilities[k] as any; } const placeholder = JSON.stringify(partialDefaults, null, 2); const [overrideEnabled, setOverrideEnabled] = useState(() => !!currentOverrides); - const [jsonText, setJsonText] = useState(() => currentOverrides ? JSON.stringify(currentOverrides, null, 2) : placeholder); - const [readOnlyHeight, setReadOnlyHeight] = useState(undefined); const [errorMsg, setErrorMsg] = useState(null); + const textAreaRef = useRef(null) + // reset when dialog toggles useEffect(() => { if (!isOpen) return; const cur = settingsState.overridesOfModel?.[providerName]?.[modelName]; setOverrideEnabled(!!cur); - // If there are overrides, show them; otherwise use default values - setJsonText(cur ? JSON.stringify(cur, null, 2) : placeholder); setErrorMsg(null); }, [isOpen, providerName, modelName, settingsState.overridesOfModel, placeholder]); const onSave = async () => { - // if disabled override, reset overrides if (!overrideEnabled) { await settingsStateService.setOverridesOfModel(providerName, modelName, undefined); @@ -251,9 +243,10 @@ const SimpleModelSettingsDialog = ({ // enabled overrides // parse json let parsedInput: Record - if (jsonText.trim()) { + + if (textAreaRef.current?.value) { try { - parsedInput = JSON.parse(jsonText); + parsedInput = JSON.parse(textAreaRef.current.value); } catch (e) { setErrorMsg('Invalid JSON'); return; @@ -265,10 +258,10 @@ const SimpleModelSettingsDialog = ({ // only keep allowed keys const cleaned: Partial = {}; - for (const k of allowedKeys) { + for (const k of modelOverrideKeys) { if (!(k in parsedInput)) continue const isEmpty = parsedInput[k] === '' || parsedInput[k] === null || parsedInput[k] === undefined; - if (!isEmpty && (k in partialDefaults)) { + if (!isEmpty) { cleaned[k] = parsedInput[k] as any; } } @@ -333,10 +326,11 @@ const SimpleModelSettingsDialog = ({
}