From 5acc53311d991a419ed7516af261bd4aa29a8cde Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 1 Nov 2024 21:23:38 -0700 Subject: [PATCH 001/107] add files to make native insets work! #124 --- extensions/void/src/extension/extension.ts | 10 ++ .../browser/services/inlineDiffService.ts | 115 ++++++++++++++++++ .../browser/widget/diffEditor/style.css | 24 ++++ .../api/browser/mainThreadInlineDiff.ts | 82 +++++++++++++ .../workbench/api/common/extHost.api.impl.ts | 10 ++ .../workbench/api/common/extHost.protocol.ts | 19 ++- .../workbench/api/common/extHostInlineDiff.ts | 62 ++++++++++ src/vscode-dts/vscode.d.ts | 4 +- 8 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 src/vs/editor/browser/services/inlineDiffService.ts create mode 100644 src/vs/workbench/api/browser/mainThreadInlineDiff.ts create mode 100644 src/vs/workbench/api/common/extHostInlineDiff.ts diff --git a/extensions/void/src/extension/extension.ts b/extensions/void/src/extension/extension.ts index cc7cbed63..e0eb3e909 100644 --- a/extensions/void/src/extension/extension.ts +++ b/extensions/void/src/extension/extension.ts @@ -25,6 +25,13 @@ declare module 'vscode' { } } +// this comes from vscode.d.ts +declare module 'vscode' { + export namespace languages { + export function addInlineDiff(editor: vscode.TextEditor, originalText: string, modifiedRange: Range): void; + } +} + const roundRangeToLines = (selection: vscode.Selection) => { let endLine = selection.end.character === 0 ? selection.end.line - 1 : selection.end.line // e.g. if the user triple clicks, it selects column=0, line=line -> column=0, line=line+1 return new vscode.Range(selection.start.line, 0, endLine, Number.MAX_SAFE_INTEGER) @@ -62,6 +69,9 @@ export function activate(context: vscode.ExtensionContext) { const { selectionStr, filePath } = getSelection(editor) + vscode.languages.addInlineDiff(editor, 'oldText', editor.selection) + + // send message to the webview (Sidebar.tsx) sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+l', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); }) diff --git a/src/vs/editor/browser/services/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService.ts new file mode 100644 index 000000000..c694405a1 --- /dev/null +++ b/src/vs/editor/browser/services/inlineDiffService.ts @@ -0,0 +1,115 @@ +// This file was added by the Void team + +// src/vs/editor/browser/services/inlineDiffService.ts +import { Disposable } from '../../../base/common/lifecycle.js'; +import { registerSingleton, InstantiationType } from '../../../platform/instantiation/common/extensions.js'; +import { createDecorator } from '../../../platform/instantiation/common/instantiation.js'; +import { IModelDecorationOptions, IModelDeltaDecoration } from '../../common/model.js'; +import { ICodeEditor, IViewZone } from '../editorBrowser.js'; +import { IRange } from '../../common/core/range.js'; + + +export interface IInlineDiffService { + readonly _serviceBrand: undefined; + + addDiff(editor: ICodeEditor, originalText: string, modifiedRange: IRange): void; + removeDiffs(editor: ICodeEditor): void; +} + +export const IInlineDiffService = createDecorator('inlineDiffService'); + +class InlineDiffService extends Disposable implements IInlineDiffService { + private readonly _diffDecorations = new Map(); + private readonly _diffZones = new Map(); + _serviceBrand: undefined; + + private static readonly ADDED_DECORATION: IModelDecorationOptions = { + className: 'inline-diff-added', + description: 'inline-diff-added', + isWholeLine: false, + minimap: { + color: { id: 'minimapGutter.addedBackground' }, + position: 2 + }, + overviewRuler: { + color: { id: 'editorOverviewRuler.addedForeground' }, + position: 7 + } + }; + + constructor( + + ) { + super(); + } + + public addDiff: IInlineDiffService['addDiff'] = (editor, originalText, modifiedRange) => { + + // Clear existing diffs + this.removeDiffs(editor); + + // Add decoration for modified text + const decorations: IModelDeltaDecoration[] = [{ + range: modifiedRange, + options: InlineDiffService.ADDED_DECORATION + }]; + + const newDecorations = editor.deltaDecorations([], decorations); + this._diffDecorations.set(editor, newDecorations); + + // Add view zone for original text + editor.changeViewZones(accessor => { + const domNode = document.createElement('div'); + domNode.className = 'inline-diff-deleted monaco-editor'; + + // Create inner container for proper padding + const innerContainer = document.createElement('div'); + innerContainer.className = 'view-line'; + innerContainer.textContent = originalText; + domNode.appendChild(innerContainer); + + const viewZone: IViewZone = { + afterLineNumber: modifiedRange.startLineNumber - 1, + heightInLines: originalText.split('\n').length, + domNode: domNode, + suppressMouseDown: true, + marginDomNode: this.createGutterElement(editor) + }; + + const zoneId = accessor.addZone(viewZone); + this._diffZones.set(editor, [zoneId]); + }); + } + + private createGutterElement(editor: ICodeEditor): HTMLElement { + const gutterDiv = document.createElement('div'); + gutterDiv.className = 'inline-diff-gutter'; + gutterDiv.innerHTML = '
-
'; + return gutterDiv; + } + + public removeDiffs(editor: ICodeEditor): void { + // Clear decorations + const decorationIds = this._diffDecorations.get(editor) || []; + editor.deltaDecorations(decorationIds, []); + this._diffDecorations.delete(editor); + + // Clear view zones + editor.changeViewZones(accessor => { + const zoneIds = this._diffZones.get(editor) || []; + zoneIds.forEach(id => accessor.removeZone(id)); + }); + this._diffZones.delete(editor); + } + + override dispose(): void { + super.dispose(); + this._diffDecorations.clear(); + this._diffZones.clear(); + } +} + +// Register the service +registerSingleton(IInlineDiffService, InlineDiffService, InstantiationType.Eager); + + diff --git a/src/vs/editor/browser/widget/diffEditor/style.css b/src/vs/editor/browser/widget/diffEditor/style.css index 4489d84be..0c48cc0dd 100644 --- a/src/vs/editor/browser/widget/diffEditor/style.css +++ b/src/vs/editor/browser/widget/diffEditor/style.css @@ -425,3 +425,27 @@ margin: 0 4px; } } + +/* Void added this: */ +.inline-diff-deleted { + background-color: var(--vscode-diffEditor-removedTextBackground); + text-decoration: line-through; +} + +.inline-diff-added { + background-color: var(--vscode-diffEditor-insertedTextBackground); +} + +.inline-diff-gutter { + width: 100%; + height: 100%; +} + +.inline-diff-deleted-gutter { + opacity: 0.7; + padding-left: 4px; +} + +.view-line { + padding: 0 4px; +} diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts new file mode 100644 index 000000000..899e59acc --- /dev/null +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -0,0 +1,82 @@ +// Void created this file +// it comes from mainThreadCodeInsets.ts + +import { Disposable } from '../../../base/common/lifecycle.js'; +import { ICodeEditorService } from '../../../editor/browser/services/codeEditorService.js'; +import { MainContext, MainThreadInlineDiffShape } from '../common/extHost.protocol.js'; +import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffService.js'; +import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; +import { IRange } from '../../../editor/common/core/range.js'; +import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; + + +@extHostNamedCustomer(MainContext.MainThreadInlineDiff) +export class MainThreadInlineDiff extends Disposable implements MainThreadInlineDiffShape { + + // private readonly _proxy: ExtHostEditorInsetsShape; + // private readonly _disposables = new DisposableStore(); + + constructor( + context: IExtHostContext, + @IInlineDiffService private readonly _inlineDiff: IInlineDiffService, + @ICodeEditorService private readonly _editorService: ICodeEditorService, + ) { + super(); + } + // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); + + // dispose(): void { + // this._disposables.dispose(); + // } + + $addDiff(editorId: string, originalText: string, range: IRange): void { + + let editor: ICodeEditor | undefined; + editorId = editorId.substr(0, editorId.indexOf(',')); //todo@jrieken HACK + + for (const candidate of this._editorService.listCodeEditors()) { + if (candidate.getId() === editorId + // && candidate.hasModel() && isEqual(candidate.getModel().uri, URI.revive(uri)) + ) { + editor = candidate; + break; + } + } + + if (!editor) { + // setTimeout(() => this._proxy.$onDidDispose(editorId)); + return; + } + + this._inlineDiff.addDiff(editor, originalText, range) + + + // return editor + + // const disposables = new DisposableStore(); + + // const remove = () => { + // disposables.dispose(); + // this._proxy.$onDidDispose(handle); + // this._insets.delete(handle); + // }; + + // disposables.add(editor.onDidChangeModel(remove)); + // disposables.add(editor.onDidDispose(remove)); + + } + + // $disposeEditorInset(handle: number): void { + // const inset = this.getInset(handle); + // this._insets.delete(handle); + // inset.dispose(); + // } + + // private getInset(handle: number): EditorWebviewZone { + // const inset = this._insets.get(handle); + // if (!inset) { + // throw new Error('Unknown inset'); + // } + // return inset; + // } +} diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 3635e182a..250dfd253 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -109,6 +109,7 @@ import { ProxyIdentifier } from '../../services/extensions/common/proxyIdentifie import { ExcludeSettingOptions, TextSearchCompleteMessageType, TextSearchContextNew, TextSearchMatchNew } from '../../services/search/common/searchExtTypes.js'; import type * as vscode from 'vscode'; import { ExtHostCodeMapper } from './extHostCodeMapper.js'; +import { ExtHostInlineDiff } from './extHostInlineDiff.js'; export interface IExtensionRegistries { mine: ExtensionDescriptionRegistry; @@ -221,6 +222,9 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostSpeech = rpcProtocol.set(ExtHostContext.ExtHostSpeech, new ExtHostSpeech(rpcProtocol)); const extHostEmbeddings = rpcProtocol.set(ExtHostContext.ExtHostEmbeddings, new ExtHostEmbeddings(rpcProtocol)); + // Void added this: + const extHostInlineDiff = rpcProtocol.set(ExtHostContext.ExtHostInlineDiff, new ExtHostInlineDiff(rpcProtocol.getProxy(MainContext.MainThreadInlineDiff), extHostEditors)); + // Check that no named customers are missing const expected = Object.values>(ExtHostContext); rpcProtocol.assertRegistered(expected); @@ -519,6 +523,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I // namespace: languages const languages: typeof vscode.languages = { + createDiagnosticCollection(name?: string): vscode.DiagnosticCollection { return extHostDiagnostics.createDiagnosticCollection(extension.identifier, name); }, @@ -553,6 +558,11 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I return extHostLanguageFeatures.registerCodeLensProvider(extension, checkSelector(selector), provider); }, + // Void added addInlineDiff here: + addInlineDiff(editor: vscode.TextEditor, originalText: string, modifiedRange: vscode.Range): void { + extHostInlineDiff.addDiff(editor, originalText, modifiedRange) + }, + // Void added this (I think will need to add this back when add ctrl+K) // registerVoidCtrlKProvider(selector: vscode.DocumentSelector, provider: vscode.CodeLensProvider): vscode.Disposable { // return extHostLanguageFeatures.registerCodeLensProvider(extension, checkSelector(selector), provider); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 4900f545f..6f631861c 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2984,7 +2984,10 @@ export const MainContext = { MainThreadTesting: createProxyIdentifier('MainThreadTesting'), MainThreadLocalization: createProxyIdentifier('MainThreadLocalizationShape'), MainThreadAiRelatedInformation: createProxyIdentifier('MainThreadAiRelatedInformation'), - MainThreadAiEmbeddingVector: createProxyIdentifier('MainThreadAiEmbeddingVector') + MainThreadAiEmbeddingVector: createProxyIdentifier('MainThreadAiEmbeddingVector'), + + // Void added this: + MainThreadInlineDiff: createProxyIdentifier('MainThreadInlineDiff'), }; export const ExtHostContext = { @@ -3055,5 +3058,17 @@ export const ExtHostContext = { ExtHostTimeline: createProxyIdentifier('ExtHostTimeline'), ExtHostTesting: createProxyIdentifier('ExtHostTesting'), ExtHostTelemetry: createProxyIdentifier('ExtHostTelemetry'), - ExtHostLocalization: createProxyIdentifier('ExtHostLocalization') + ExtHostLocalization: createProxyIdentifier('ExtHostLocalization'), + + // Void added this: + ExtHostInlineDiff: createProxyIdentifier('ExtHostInlineDiff'), // Void added this }; + + +// Void added these: +export interface ExtHostInlineDiffShape { + $onDidDispose(handle: number): void; +} +export interface MainThreadInlineDiffShape { + $addDiff(editorId: string, originalText: string, range: IRange): void; +} diff --git a/src/vs/workbench/api/common/extHostInlineDiff.ts b/src/vs/workbench/api/common/extHostInlineDiff.ts new file mode 100644 index 000000000..cacfe8fa6 --- /dev/null +++ b/src/vs/workbench/api/common/extHostInlineDiff.ts @@ -0,0 +1,62 @@ +// This file was created by Void +// reference extHostCodeInsets.ts + +import { Emitter } from '../../../base/common/event.js'; +import { DisposableStore } from '../../../base/common/lifecycle.js'; +import { ExtHostInlineDiffShape, MainThreadInlineDiffShape } from './extHost.protocol.js'; +import * as vscode from 'vscode' +import { ExtHostTextEditor } from './extHostTextEditor.js'; +import { ExtHostEditors } from './extHostTextEditors.js'; +import { Range } from '../../../workbench/api/common/extHostTypeConverters.js' + +export class ExtHostInlineDiff implements ExtHostInlineDiffShape { + + private readonly _disposables = new DisposableStore(); + private _insets = new Map }>(); + + constructor( + private readonly _proxy: MainThreadInlineDiffShape, + private readonly _editors: ExtHostEditors, + ) { } + + + dispose(): void { + this._insets.forEach(value => value.inset.dispose()); + this._disposables.dispose(); + } + + + addDiff(editor: vscode.TextEditor, originalText: string, modifiedRange: vscode.Range) { + + let apiEditor: ExtHostTextEditor | undefined; + for (const candidate of this._editors.getVisibleTextEditors(true)) { + if (candidate.value === editor) { + apiEditor = candidate; + break; + } + } + if (!apiEditor) { + throw new Error('not a visible editor'); + } + + const id = apiEditor.id; + // let uri = apiEditor.value.document.uri; + + // convert to IRange + const range = Range.from(modifiedRange) + + this._proxy.$addDiff(id, originalText, range) + + } + + + + // main thread calls this when disposes diff with this particular handle + $onDidDispose(handle: number): void { + const value = this._insets.get(handle); + if (value) { + value.inset.dispose(); + } + } + +} diff --git a/src/vscode-dts/vscode.d.ts b/src/vscode-dts/vscode.d.ts index d4c58df41..770907f79 100644 --- a/src/vscode-dts/vscode.d.ts +++ b/src/vscode-dts/vscode.d.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ declare module 'vscode' { - /** * The version of the editor. */ @@ -14074,6 +14073,9 @@ declare module 'vscode' { */ export namespace languages { + /** Void added this: */ + export function addInlineDiff(editor: TextEditor, originalText: string, modifiedRange: Range): void; + /** * Return the identifiers of all known languages. * @returns Promise resolving to an array of identifier strings. From 584d026256fb4a8f7dfa59d3424e6dc301b661c8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 2 Nov 2024 00:50:18 -0700 Subject: [PATCH 002/107] renders oldText nicely! --- CONTRIBUTING.md | 2 +- extensions/void/package-lock.json | 8 -- .../browser/services/inlineDiffService.ts | 99 ++++++++++--------- .../browser/widget/diffEditor/style.css | 22 ----- .../api/browser/extensionHost.contribution.ts | 3 + 5 files changed, 58 insertions(+), 76 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 675ea6ed2..901b6bc0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -146,7 +146,7 @@ We're always glad to talk about new ideas, help you get set up, and make sure yo ## Submitting a Pull Request -Please submit a pull request once you've made a change. You don't need to submit an issue. +Please submit a pull request once you've made a change. You don't need to submit an issue. Please don't use AI to write your PR 🙂. diff --git a/extensions/void/package-lock.json b/extensions/void/package-lock.json index 2c69af189..9aec96fad 100644 --- a/extensions/void/package-lock.json +++ b/extensions/void/package-lock.json @@ -6024,14 +6024,6 @@ "node": ">=10" } }, - "node_modules/monaco-editor": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.0.tgz", - "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/src/vs/editor/browser/services/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService.ts index c694405a1..e44f8d6a7 100644 --- a/src/vs/editor/browser/services/inlineDiffService.ts +++ b/src/vs/editor/browser/services/inlineDiffService.ts @@ -1,17 +1,13 @@ -// This file was added by the Void team - -// src/vs/editor/browser/services/inlineDiffService.ts import { Disposable } from '../../../base/common/lifecycle.js'; import { registerSingleton, InstantiationType } from '../../../platform/instantiation/common/extensions.js'; import { createDecorator } from '../../../platform/instantiation/common/instantiation.js'; -import { IModelDecorationOptions, IModelDeltaDecoration } from '../../common/model.js'; +import { IModelDeltaDecoration } from '../../common/model.js'; import { ICodeEditor, IViewZone } from '../editorBrowser.js'; import { IRange } from '../../common/core/range.js'; - +import { EditorOption } from '../../common/config/editorOptions.js'; export interface IInlineDiffService { readonly _serviceBrand: undefined; - addDiff(editor: ICodeEditor, originalText: string, modifiedRange: IRange): void; removeDiffs(editor: ICodeEditor): void; } @@ -23,78 +19,94 @@ class InlineDiffService extends Disposable implements IInlineDiffService { private readonly _diffZones = new Map(); _serviceBrand: undefined; - private static readonly ADDED_DECORATION: IModelDecorationOptions = { - className: 'inline-diff-added', - description: 'inline-diff-added', - isWholeLine: false, - minimap: { - color: { id: 'minimapGutter.addedBackground' }, - position: 2 - }, - overviewRuler: { - color: { id: 'editorOverviewRuler.addedForeground' }, - position: 7 - } - }; - - constructor( - - ) { + constructor() { super(); } - public addDiff: IInlineDiffService['addDiff'] = (editor, originalText, modifiedRange) => { + public addDiff: IInlineDiffService['addDiff'] = (editor, originalText, modifiedRange) => { // Clear existing diffs this.removeDiffs(editor); - // Add decoration for modified text - const decorations: IModelDeltaDecoration[] = [{ + // green decoration + const greenDecoration: IModelDeltaDecoration[] = [{ range: modifiedRange, - options: InlineDiffService.ADDED_DECORATION + options: { + className: 'line-insert', // .monaco-editor .line-insert + description: 'line-insert', + isWholeLine: true, + minimap: { + color: { id: 'inlineDiff.minimapGutter.addedBackground' }, + position: 2 + }, + overviewRuler: { + color: { id: 'inlineDiff.editorOverviewRuler.addedForeground' }, + position: 7 + } + } }]; - const newDecorations = editor.deltaDecorations([], decorations); - this._diffDecorations.set(editor, newDecorations); + this._diffDecorations.set(editor, editor.deltaDecorations([], greenDecoration)); - // Add view zone for original text + // red in a view zone editor.changeViewZones(accessor => { + // Get the editor's font info + const fontInfo = editor.getOption(EditorOption.fontInfo); + const domNode = document.createElement('div'); - domNode.className = 'inline-diff-deleted monaco-editor'; + domNode.className = 'monaco-editor view-zones line-delete monaco-mouse-cursor-text'; + domNode.style.fontSize = `${fontInfo.fontSize}px`; + domNode.style.fontFamily = fontInfo.fontFamily; + domNode.style.lineHeight = `100%`; + + // div + const lineContent = document.createElement('div'); + lineContent.className = 'view-line'; // .monaco-editor .inline-deleted-text - // Create inner container for proper padding - const innerContainer = document.createElement('div'); - innerContainer.className = 'view-line'; - innerContainer.textContent = originalText; - domNode.appendChild(innerContainer); + // span + const contentSpan = document.createElement('span'); + + // span + const codeSpan = document.createElement('span'); + codeSpan.className = 'mtk1'; // char-delete + codeSpan.textContent = originalText; + + // Mount + contentSpan.appendChild(codeSpan); + lineContent.appendChild(contentSpan); + domNode.appendChild(lineContent); const viewZone: IViewZone = { afterLineNumber: modifiedRange.startLineNumber - 1, - heightInLines: originalText.split('\n').length, + heightInLines: 1, domNode: domNode, suppressMouseDown: true, - marginDomNode: this.createGutterElement(editor) + marginDomNode: this.createGutterElement() }; const zoneId = accessor.addZone(viewZone); + // editor.layout(); this._diffZones.set(editor, [zoneId]); }); } - private createGutterElement(editor: ICodeEditor): HTMLElement { + private createGutterElement(): HTMLElement { const gutterDiv = document.createElement('div'); gutterDiv.className = 'inline-diff-gutter'; - gutterDiv.innerHTML = '
-
'; + + const minusDiv = document.createElement('div'); + minusDiv.className = 'inline-diff-deleted-gutter'; + minusDiv.textContent = '-'; + + gutterDiv.appendChild(minusDiv); return gutterDiv; } public removeDiffs(editor: ICodeEditor): void { - // Clear decorations const decorationIds = this._diffDecorations.get(editor) || []; editor.deltaDecorations(decorationIds, []); this._diffDecorations.delete(editor); - // Clear view zones editor.changeViewZones(accessor => { const zoneIds = this._diffZones.get(editor) || []; zoneIds.forEach(id => accessor.removeZone(id)); @@ -109,7 +121,4 @@ class InlineDiffService extends Disposable implements IInlineDiffService { } } -// Register the service registerSingleton(IInlineDiffService, InlineDiffService, InstantiationType.Eager); - - diff --git a/src/vs/editor/browser/widget/diffEditor/style.css b/src/vs/editor/browser/widget/diffEditor/style.css index 0c48cc0dd..f2268db02 100644 --- a/src/vs/editor/browser/widget/diffEditor/style.css +++ b/src/vs/editor/browser/widget/diffEditor/style.css @@ -426,26 +426,4 @@ } } -/* Void added this: */ -.inline-diff-deleted { - background-color: var(--vscode-diffEditor-removedTextBackground); - text-decoration: line-through; -} - -.inline-diff-added { - background-color: var(--vscode-diffEditor-insertedTextBackground); -} - -.inline-diff-gutter { - width: 100%; - height: 100%; -} - -.inline-diff-deleted-gutter { - opacity: 0.7; - padding-left: 4px; -} -.view-line { - padding: 0 4px; -} diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index 2764905f8..4eafcebe2 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -90,6 +90,9 @@ import './mainThreadProfileContentHandlers.js'; import './mainThreadAiRelatedInformation.js'; import './mainThreadAiEmbeddingVector.js'; +// Void added this: +import './mainThreadInlineDiff.js'; + export class ExtensionPoints implements IWorkbenchContribution { static readonly ID = 'workbench.contrib.extensionPoints'; From 3d629396bec576259a86376b02ab06a637fffc3f Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 2 Nov 2024 20:42:08 -0700 Subject: [PATCH 003/107] backup of a working version --- extensions/void/src/extension/DiffProvider.ts | 2 + extensions/void/src/extension/extension.ts | 3 -- .../browser/services/inlineDiffService.ts | 14 +++---- .../api/browser/mainThreadInlineDiff.ts | 40 +++++-------------- 4 files changed, 18 insertions(+), 41 deletions(-) diff --git a/extensions/void/src/extension/DiffProvider.ts b/extensions/void/src/extension/DiffProvider.ts index 9836dfde2..971c3d259 100644 --- a/extensions/void/src/extension/DiffProvider.ts +++ b/extensions/void/src/extension/DiffProvider.ts @@ -205,6 +205,8 @@ export class DiffProvider implements vscode.CodeLensProvider { } + + // update green highlighting editor.setDecorations( greenDecoration, diff --git a/extensions/void/src/extension/extension.ts b/extensions/void/src/extension/extension.ts index e0eb3e909..8dbb1c86c 100644 --- a/extensions/void/src/extension/extension.ts +++ b/extensions/void/src/extension/extension.ts @@ -69,9 +69,6 @@ export function activate(context: vscode.ExtensionContext) { const { selectionStr, filePath } = getSelection(editor) - vscode.languages.addInlineDiff(editor, 'oldText', editor.selection) - - // send message to the webview (Sidebar.tsx) sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+l', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); }) diff --git a/src/vs/editor/browser/services/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService.ts index e44f8d6a7..02b5ef927 100644 --- a/src/vs/editor/browser/services/inlineDiffService.ts +++ b/src/vs/editor/browser/services/inlineDiffService.ts @@ -23,12 +23,11 @@ class InlineDiffService extends Disposable implements IInlineDiffService { super(); } - public addDiff: IInlineDiffService['addDiff'] = (editor, originalText, modifiedRange) => { // Clear existing diffs this.removeDiffs(editor); - // green decoration + // green decoration and gutter decoration const greenDecoration: IModelDeltaDecoration[] = [{ range: modifiedRange, options: { @@ -36,11 +35,11 @@ class InlineDiffService extends Disposable implements IInlineDiffService { description: 'line-insert', isWholeLine: true, minimap: { - color: { id: 'inlineDiff.minimapGutter.addedBackground' }, + color: { id: 'minimapGutter.addedBackground' }, position: 2 }, overviewRuler: { - color: { id: 'inlineDiff.editorOverviewRuler.addedForeground' }, + color: { id: 'editorOverviewRuler.addedForeground' }, position: 7 } } @@ -57,7 +56,7 @@ class InlineDiffService extends Disposable implements IInlineDiffService { domNode.className = 'monaco-editor view-zones line-delete monaco-mouse-cursor-text'; domNode.style.fontSize = `${fontInfo.fontSize}px`; domNode.style.fontFamily = fontInfo.fontFamily; - domNode.style.lineHeight = `100%`; + domNode.style.lineHeight = `${fontInfo.lineHeight}px`; // div const lineContent = document.createElement('div'); @@ -78,7 +77,7 @@ class InlineDiffService extends Disposable implements IInlineDiffService { const viewZone: IViewZone = { afterLineNumber: modifiedRange.startLineNumber - 1, - heightInLines: 1, + heightInLines: originalText.split('\n').length + 1, domNode: domNode, suppressMouseDown: true, marginDomNode: this.createGutterElement() @@ -90,13 +89,14 @@ class InlineDiffService extends Disposable implements IInlineDiffService { }); } + // gutter is the thing to the left private createGutterElement(): HTMLElement { const gutterDiv = document.createElement('div'); gutterDiv.className = 'inline-diff-gutter'; const minusDiv = document.createElement('div'); minusDiv.className = 'inline-diff-deleted-gutter'; - minusDiv.textContent = '-'; + // minusDiv.textContent = '-'; gutterDiv.appendChild(minusDiv); return gutterDiv; diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index 899e59acc..192e07cd7 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -8,6 +8,7 @@ import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffS import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; import { IRange } from '../../../editor/common/core/range.js'; import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; +// import { IHistoryService } from '../../services/history/common/history.js'; @extHostNamedCustomer(MainContext.MainThreadInlineDiff) @@ -20,14 +21,18 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline context: IExtHostContext, @IInlineDiffService private readonly _inlineDiff: IInlineDiffService, @ICodeEditorService private readonly _editorService: ICodeEditorService, + // @IHistoryService private readonly _historyService: IHistoryService, ) { super(); + // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); + // this._wcHistoryService.addEntry() } - // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); - // dispose(): void { - // this._disposables.dispose(); - // } + initStream() { + + } + + $addDiff(editorId: string, originalText: string, range: IRange): void { @@ -50,33 +55,6 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline this._inlineDiff.addDiff(editor, originalText, range) - - // return editor - - // const disposables = new DisposableStore(); - - // const remove = () => { - // disposables.dispose(); - // this._proxy.$onDidDispose(handle); - // this._insets.delete(handle); - // }; - - // disposables.add(editor.onDidChangeModel(remove)); - // disposables.add(editor.onDidDispose(remove)); - } - // $disposeEditorInset(handle: number): void { - // const inset = this.getInset(handle); - // this._insets.delete(handle); - // inset.dispose(); - // } - - // private getInset(handle: number): EditorWebviewZone { - // const inset = this._insets.get(handle); - // if (!inset) { - // throw new Error('Unknown inset'); - // } - // return inset; - // } } From 9d972f72eab04f381a9a1dfdf583bff5626bbd0d Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 2 Nov 2024 21:25:39 -0700 Subject: [PATCH 004/107] update and add imports of sendLLMMessage --- .../void/src/extension/applyDiffLazily.ts | 80 ++++--- package-lock.json | 220 +++++++++++++++--- package.json | 4 + .../inlineDiffService.ts | 26 ++- .../inlineDiffService/sendLLMMessage.ts | 0 .../api/browser/mainThreadInlineDiff.ts | 23 +- 6 files changed, 259 insertions(+), 94 deletions(-) rename src/vs/editor/browser/services/{ => inlineDiffService}/inlineDiffService.ts (78%) create mode 100644 src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts diff --git a/extensions/void/src/extension/applyDiffLazily.ts b/extensions/void/src/extension/applyDiffLazily.ts index 9b3500824..74bf2d990 100644 --- a/extensions/void/src/extension/applyDiffLazily.ts +++ b/extensions/void/src/extension/applyDiffLazily.ts @@ -12,8 +12,6 @@ const LINES_PER_CHUNK = 20 // number of lines to search at a time type CompetedReturn = { isFinished: true, } | { isFinished?: undefined, } const streamChunk = ({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, diffArea, voidConfig, abortRef }: { diffProvider: DiffProvider, docUri: vscode.Uri, oldFileStr: string, completedStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) => { - const NUM_MATCHUP_TOKENS = 20 - const promptContent = `ORIGINAL_FILE \`\`\` ${oldFileStr} @@ -83,52 +81,52 @@ ${completedStr} } -const shouldApplyDiff = ({ diffRepr, oldFileStr: fileStr, speculationStr, voidConfig, abortRef }: { diffRepr: string, oldFileStr: string, speculationStr: string, voidConfig: VoidConfig, abortRef: AbortRef }) => { +// const shouldApplyDiff = ({ diffRepr, oldFileStr: fileStr, speculationStr, voidConfig, abortRef }: { diffRepr: string, oldFileStr: string, speculationStr: string, voidConfig: VoidConfig, abortRef: AbortRef }) => { - const promptContent = `DIFF -\`\`\` -${diffRepr} -\`\`\` +// const promptContent = `DIFF +// \`\`\` +// ${diffRepr} +// \`\`\` -FILES -\`\`\` -${fileStr} -\`\`\` +// FILES +// \`\`\` +// ${fileStr} +// \`\`\` -SELECTION -\`\`\` -${speculationStr} -\`\`\` +// SELECTION +// \`\`\` +// ${speculationStr} +// \`\`\` -Return \`true\` if ANY part of the chunk should be modified, and \`false\` if it should not be modified. You should respond only with \`true\` or \`false\` and nothing else. -` +// Return \`true\` if ANY part of the chunk should be modified, and \`false\` if it should not be modified. You should respond only with \`true\` or \`false\` and nothing else. +// ` - // create new promise - return new Promise((resolve, reject) => { - // send message to LLM - sendLLMMessage({ - messages: [{ role: 'system', content: searchDiffChunkInstructions, }, { role: 'user', content: promptContent, }], - onFinalMessage: (finalMessage) => { +// // create new promise +// return new Promise((resolve, reject) => { +// // send message to LLM +// sendLLMMessage({ +// messages: [{ role: 'system', content: searchDiffChunkInstructions, }, { role: 'user', content: promptContent, }], +// onFinalMessage: (finalMessage) => { - const containsTrue = finalMessage - .slice(-10) // check for `true` in last 10 characters - .toLowerCase() - .includes('true') +// const containsTrue = finalMessage +// .slice(-10) // check for `true` in last 10 characters +// .toLowerCase() +// .includes('true') - resolve(containsTrue) - }, - onError: (e) => { - resolve(false); - console.error('Error in shouldApplyDiff: ', e) - }, - onText: () => { }, - voidConfig, - abortRef, - }) +// resolve(containsTrue) +// }, +// onError: (e) => { +// resolve(false); +// console.error('Error in shouldApplyDiff: ', e) +// }, +// onText: () => { }, +// voidConfig, +// abortRef, +// }) - }) +// }) -} +// } @@ -147,7 +145,7 @@ export const applyDiffLazily = async ({ docUri, oldFileStr, voidConfig, abortRef // ask LLM if we should apply the diff to the chunk const START = new Date().getTime() - let shouldApplyDiff_ = await shouldApplyDiff({ oldFileStr, speculationStr: chunkStr, diffRepr, voidConfig, abortRef }) + let shouldApplyDiff_ = true; //await shouldApplyDiff({ oldFileStr, speculationStr: chunkStr, diffRepr, voidConfig, abortRef }) const END = new Date().getTime() // if should not change the chunk @@ -155,7 +153,7 @@ export const applyDiffLazily = async ({ docUri, oldFileStr, voidConfig, abortRef console.log('KEEP CHUNK time: ', END - START) speculativeIndex += LINES_PER_CHUNK writtenTextSoFar.push(chunkStr) - diffProvider.updateStream(docUri.toString(), diffArea, writtenTextSoFar.join('\n')) + // diffProvider.updateStream(docUri.toString(), diffArea, writtenTextSoFar.join('\n')) continue; } diff --git a/package-lock.json b/package-lock.json index ac0ebde0f..e6cac59f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "@anthropic-ai/sdk": "^0.31.0", + "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -43,7 +45,9 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", + "ollama": "^0.5.9", "open": "^8.4.2", + "openai": "^4.70.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", "vscode-oniguruma": "1.7.0", @@ -180,6 +184,30 @@ "node": ">=6.0.0" } }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.31.0.tgz", + "integrity": "sha512-9EX90YMUtj0d1aHPsnjgurUWAUoNQA/kMaN+UUN7eL3jhl1cijBIGKHQPrR4/ctvD9A065QnzzJDy5Oxb/Bk8A==", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@azure-rest/ai-translation-text": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/@azure-rest/ai-translation-text/-/ai-translation-text-1.0.0-beta.1.tgz", @@ -1135,6 +1163,15 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@google/generative-ai": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", + "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@gulp-sourcemaps/identity-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", @@ -2231,33 +2268,18 @@ "version": "20.14.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-fetch": { - "version": "2.5.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", - "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", - "dev": true, + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "license": "MIT", "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "form-data": "^4.0.0" } }, "node_modules/@types/responselike": { @@ -3584,6 +3606,18 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -3647,6 +3681,18 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4192,8 +4238,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/atob": { "version": "2.1.2", @@ -5228,7 +5273,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5240,7 +5284,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -6906,6 +6949,15 @@ "through": "~2.3.1" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -7737,7 +7789,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7747,6 +7798,25 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -10832,6 +10902,15 @@ "node": ">= 14" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/husky/-/husky-0.13.4.tgz", @@ -13249,7 +13328,6 @@ "version": "1.45.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -13258,7 +13336,6 @@ "version": "2.1.28", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, "dependencies": { "mime-db": "1.45.0" }, @@ -13847,11 +13924,29 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14379,6 +14474,15 @@ "node": ">=0.10.0" } }, + "node_modules/ollama": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", + "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", + "license": "MIT", + "dependencies": { + "whatwg-fetch": "^3.6.20" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -14445,6 +14549,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.70.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.70.2.tgz", + "integrity": "sha512-Q2ymi/KPUYv+LJ9rFxeYxpkVAhcrZFTVvnJbdF1pUHg9eMC6lY8PU4TO1XOK5UZzOZuuVicouRwVMi1iDrT4qw==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/opn": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", @@ -18868,8 +19007,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tree-kill": { "version": "1.2.2", @@ -19295,8 +19433,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/union-value": { "version": "1.0.1", @@ -19773,6 +19910,15 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/web-tree-sitter": { "version": "0.20.8", "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", @@ -19782,8 +19928,7 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { "version": "5.94.0", @@ -20040,11 +20185,16 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index 92fc72759..b21c2a8c8 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,8 @@ "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" }, "dependencies": { + "@anthropic-ai/sdk": "^0.31.0", + "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -105,7 +107,9 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", + "ollama": "^0.5.9", "open": "^8.4.2", + "openai": "^4.70.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", "vscode-oniguruma": "1.7.0", diff --git a/src/vs/editor/browser/services/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts similarity index 78% rename from src/vs/editor/browser/services/inlineDiffService.ts rename to src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts index 02b5ef927..2e59181c4 100644 --- a/src/vs/editor/browser/services/inlineDiffService.ts +++ b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts @@ -1,10 +1,11 @@ -import { Disposable } from '../../../base/common/lifecycle.js'; -import { registerSingleton, InstantiationType } from '../../../platform/instantiation/common/extensions.js'; -import { createDecorator } from '../../../platform/instantiation/common/instantiation.js'; -import { IModelDeltaDecoration } from '../../common/model.js'; -import { ICodeEditor, IViewZone } from '../editorBrowser.js'; -import { IRange } from '../../common/core/range.js'; -import { EditorOption } from '../../common/config/editorOptions.js'; +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js'; +import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; +import { IModelDeltaDecoration } from '../../../common/model.js'; +import { ICodeEditor, IViewZone } from '../../editorBrowser.js'; +import { IRange } from '../../../common/core/range.js'; +import { EditorOption } from '../../../common/config/editorOptions.js'; +// import { sendLLMMessage } from './sendLLMMessage.js'; export interface IInlineDiffService { readonly _serviceBrand: undefined; @@ -23,6 +24,17 @@ class InlineDiffService extends Disposable implements IInlineDiffService { super(); } + initStream() { + + + + + // start streaming + // const streamChunk = ({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, diffArea, voidConfig, abortRef }: { diffProvider: DiffProvider, docUri: vscode.Uri, oldFileStr: string, completedStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) => { + // } + } + + public addDiff: IInlineDiffService['addDiff'] = (editor, originalText, modifiedRange) => { // Clear existing diffs this.removeDiffs(editor); diff --git a/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts b/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index 192e07cd7..4ca7731c9 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -4,13 +4,14 @@ import { Disposable } from '../../../base/common/lifecycle.js'; import { ICodeEditorService } from '../../../editor/browser/services/codeEditorService.js'; import { MainContext, MainThreadInlineDiffShape } from '../common/extHost.protocol.js'; -import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffService.js'; +import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffService/inlineDiffService.js'; import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; import { IRange } from '../../../editor/common/core/range.js'; import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; // import { IHistoryService } from '../../services/history/common/history.js'; + @extHostNamedCustomer(MainContext.MainThreadInlineDiff) export class MainThreadInlineDiff extends Disposable implements MainThreadInlineDiffShape { @@ -26,15 +27,11 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline super(); // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); // this._wcHistoryService.addEntry() - } - initStream() { } - - - $addDiff(editorId: string, originalText: string, range: IRange): void { + _getEditor = (editorId: string): ICodeEditor | undefined => { let editor: ICodeEditor | undefined; editorId = editorId.substr(0, editorId.indexOf(',')); //todo@jrieken HACK @@ -47,14 +44,18 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline break; } } + return editor + } - if (!editor) { - // setTimeout(() => this._proxy.$onDidDispose(editorId)); - return; - } - this._inlineDiff.addDiff(editor, originalText, range) + $addDiff(editorId: string, originalText: string, range: IRange): void { + + const editor = this._getEditor(editorId); + if (!editor) return + this._inlineDiff.addDiff(editor, originalText, range) } + + } From e4e1c7fb6cff7deeb20891ab58dced77380c952f Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 2 Nov 2024 21:53:08 -0700 Subject: [PATCH 005/107] vscode types in extension --- extensions/void/package-lock.json | 18 +- extensions/void/package.json | 3 +- extensions/void/src/common/sendLLMMessage.ts | 60 +-- .../void/src/extension/applyDiffLazily.ts | 3 +- extensions/void/src/extension/extension.ts | 22 -- .../providers/CtrlKWebviewProvider.ts | 16 - extensions/void/tsconfig.json | 5 +- .../inlineDiffService/sendLLMMessage.ts | 365 ++++++++++++++++++ 8 files changed, 410 insertions(+), 82 deletions(-) diff --git a/extensions/void/package-lock.json b/extensions/void/package-lock.json index 9aec96fad..7e012ead2 100644 --- a/extensions/void/package-lock.json +++ b/extensions/void/package-lock.json @@ -23,7 +23,6 @@ "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", "@types/uuid": "^10.0.0", - "@types/vscode": "1.92.0", "@typescript-eslint/eslint-plugin": "^8.3.0", "@typescript-eslint/parser": "^8.3.0", "@vscode/test-cli": "^0.0.10", @@ -53,7 +52,7 @@ "uuid": "^10.0.0" }, "engines": { - "vscode": "^1.92.0" + "vscode": "*" } }, "node_modules/@alloc/quick-lru": { @@ -1257,13 +1256,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/vscode": { - "version": "1.92.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.92.0.tgz", - "integrity": "sha512-DcZoCj17RXlzB4XJ7IfKdPTcTGDLYvTOcTNkvtjXWF+K2TlKzHHkBEXNWQRpBIXixNEUgx39cQeTFunY0E2msw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -6024,6 +6016,14 @@ "node": ">=10" } }, + "node_modules/monaco-editor": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.0.tgz", + "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/extensions/void/package.json b/extensions/void/package.json index 7322c2779..5ef96e21e 100644 --- a/extensions/void/package.json +++ b/extensions/void/package.json @@ -5,7 +5,7 @@ "description": "", "version": "0.0.1", "engines": { - "vscode": "^1.92.0" + "vscode": "*" }, "categories": [ "Other" @@ -127,7 +127,6 @@ "@types/react-dom": "^18.3.0", "@types/react-syntax-highlighter": "^15.5.13", "@types/uuid": "^10.0.0", - "@types/vscode": "1.92.0", "@typescript-eslint/eslint-plugin": "^8.3.0", "@typescript-eslint/parser": "^8.3.0", "@vscode/test-cli": "^0.0.10", diff --git a/extensions/void/src/common/sendLLMMessage.ts b/extensions/void/src/common/sendLLMMessage.ts index 8e4c59dd4..71259613e 100644 --- a/extensions/void/src/common/sendLLMMessage.ts +++ b/extensions/void/src/common/sendLLMMessage.ts @@ -1,6 +1,6 @@ import Anthropic from '@anthropic-ai/sdk'; import OpenAI from 'openai'; -import { Ollama } from 'ollama/browser' +import { Ollama } from 'ollama' import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; import { VoidConfig } from '../webviews/common/contextForConfig' @@ -11,36 +11,36 @@ export type OnText = (newText: string, fullText: string) => void export type OnFinalMessage = (input: string) => void export type LLMMessageAnthropic = { - role: 'user' | 'assistant', - content: string, + role: 'user' | 'assistant'; + content: string; } export type LLMMessage = { - role: 'system' | 'user' | 'assistant', - content: string, + role: 'system' | 'user' | 'assistant'; + content: string; } type SendLLMMessageFnTypeInternal = (params: { - messages: LLMMessage[], - onText: OnText, - onFinalMessage: OnFinalMessage, - onError: (error: string) => void, - voidConfig: VoidConfig, - abortRef: AbortRef, + messages: LLMMessage[]; + onText: OnText; + onFinalMessage: OnFinalMessage; + onError: (error: string) => void; + voidConfig: VoidConfig; + abortRef: AbortRef; }) => void type SendLLMMessageFnTypeExternal = (params: { - messages: LLMMessage[], - onText: OnText, - onFinalMessage: (fullText: string) => void, - onError: (error: string) => void, - voidConfig: VoidConfig | null, - abortRef: AbortRef, + messages: LLMMessage[]; + onText: OnText; + onFinalMessage: (fullText: string) => void; + onError: (error: string) => void; + voidConfig: VoidConfig | null; + abortRef: AbortRef; }) => void const parseMaxTokensStr = (maxTokensStr: string) => { // parse the string but only if the full string is a valid number, eg parseInt('100abc') should return NaN - let int = isNaN(Number(maxTokensStr)) ? undefined : parseInt(maxTokensStr) + const int = isNaN(Number(maxTokensStr)) ? undefined : parseInt(maxTokensStr) if (Number.isNaN(int)) return undefined return int @@ -79,7 +79,7 @@ const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFi stream.on('finalMessage', (claude_response) => { if (did_abort) return // stringify the response's content - let content = claude_response.content.map(c => { if (c.type === 'text') { return c.text } }).join('\n'); + const content = claude_response.content.map(c => c.type === 'text' ? c.text : c.type).join('\n'); onFinalMessage(content) }) @@ -117,7 +117,7 @@ const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, o // remove system messages that get sent to Gemini // str of all system messages - let systemMessage = messages + const systemMessage = messages .filter(msg => msg.role === 'system') .map(msg => msg.content) .join('\n'); @@ -173,7 +173,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinal let openai: OpenAI let options: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming - let maxTokens = parseMaxTokensStr(voidConfig.default.maxTokens) + const maxTokens = parseMaxTokensStr(voidConfig.default.maxTokens) if (voidConfig.default.whichApi === 'openAI') { openai = new OpenAI({ apiKey: voidConfig.openAI.apikey, dangerouslyAllowBrowser: true }); @@ -181,10 +181,10 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinal } else if (voidConfig.default.whichApi === 'openRouter') { openai = new OpenAI({ - baseURL: "https://openrouter.ai/api/v1", apiKey: voidConfig.openRouter.apikey, dangerouslyAllowBrowser: true, + baseURL: 'https://openrouter.ai/api/v1', apiKey: voidConfig.openRouter.apikey, dangerouslyAllowBrowser: true, defaultHeaders: { - "HTTP-Referer": 'https://voideditor.com', // Optional, for including your app on openrouter.ai rankings. - "X-Title": 'Void Editor', // Optional. Shows in rankings on openrouter.ai. + 'HTTP-Referer': 'https://voideditor.com', // Optional, for including your app on openrouter.ai rankings. + 'X-Title': 'Void Editor', // Optional. Shows in rankings on openrouter.ai. }, }); options = { model: voidConfig.openRouter.model, messages: messages, stream: true, max_completion_tokens: maxTokens } @@ -235,7 +235,7 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinal export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { let didAbort = false - let fullText = "" + let fullText = '' // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either abortRef.current = () => { @@ -289,9 +289,9 @@ const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFin fetch('https://api.greptile.com/v2/query', { method: 'POST', headers: { - "Authorization": `Bearer ${voidConfig.greptile.apikey}`, - "X-Github-Token": `${voidConfig.greptile.githubPAT}`, - "Content-Type": `application/json`, + 'Authorization': `Bearer ${voidConfig.greptile.apikey}`, + 'X-Github-Token': `${voidConfig.greptile.githubPAT}`, + 'Content-Type': `application/json`, }, body: JSON.stringify({ messages, @@ -310,7 +310,7 @@ const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFin if (didAbort) return - for (let response of responseArr) { + for (const response of responseArr) { const type: string = response['type'] const message = response['message'] @@ -321,7 +321,7 @@ const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFin onText(message, fullText) } else if (type === 'sources') { - const { filepath, linestart, lineend } = message as { filepath: string, linestart: number | null, lineend: number | null } + const { filepath, linestart: _, lineend: _2 } = message as { filepath: string; linestart: number | null; lineend: number | null } fullText += filepath onText(filepath, fullText) } diff --git a/extensions/void/src/extension/applyDiffLazily.ts b/extensions/void/src/extension/applyDiffLazily.ts index 74bf2d990..50161bab4 100644 --- a/extensions/void/src/extension/applyDiffLazily.ts +++ b/extensions/void/src/extension/applyDiffLazily.ts @@ -1,4 +1,5 @@ -import * as vscode from 'vscode'; +import type * as vscode from 'vscode'; + import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; import { DiffArea } from '../common/shared_types'; import { writeFileWithDiffInstructions, searchDiffChunkInstructions } from '../common/systemPrompts'; diff --git a/extensions/void/src/extension/extension.ts b/extensions/void/src/extension/extension.ts index 8dbb1c86c..6a29e5df1 100644 --- a/extensions/void/src/extension/extension.ts +++ b/extensions/void/src/extension/extension.ts @@ -10,28 +10,6 @@ import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; import { SidebarWebviewProvider } from './providers/SidebarWebviewProvider'; import { CtrlKWebviewProvider } from './providers/CtrlKWebviewProvider'; -// this comes from vscode.proposed.editorInsets.d.ts -declare module 'vscode' { - export interface WebviewEditorInset { - readonly editor: vscode.TextEditor; - readonly line: number; - readonly height: number; - readonly webview: vscode.Webview; - readonly onDidDispose: Event; - dispose(): void; - } - export namespace window { - export function createWebviewTextEditorInset(editor: vscode.TextEditor, line: number, height: number, options?: vscode.WebviewOptions): WebviewEditorInset; - } -} - -// this comes from vscode.d.ts -declare module 'vscode' { - export namespace languages { - export function addInlineDiff(editor: vscode.TextEditor, originalText: string, modifiedRange: Range): void; - } -} - const roundRangeToLines = (selection: vscode.Selection) => { let endLine = selection.end.character === 0 ? selection.end.line - 1 : selection.end.line // e.g. if the user triple clicks, it selects column=0, line=line -> column=0, line=line+1 return new vscode.Range(selection.start.line, 0, endLine, Number.MAX_SAFE_INTEGER) diff --git a/extensions/void/src/extension/providers/CtrlKWebviewProvider.ts b/extensions/void/src/extension/providers/CtrlKWebviewProvider.ts index 8ef55198a..a8e2c881e 100644 --- a/extensions/void/src/extension/providers/CtrlKWebviewProvider.ts +++ b/extensions/void/src/extension/providers/CtrlKWebviewProvider.ts @@ -3,22 +3,6 @@ import * as vscode from 'vscode'; import { updateWebviewHTML as _updateWebviewHTML, updateWebviewHTML } from '../extensionLib/updateWebviewHTML'; -// this comes from vscode.proposed.editorInsets.d.ts -declare module 'vscode' { - export interface WebviewEditorInset { - readonly editor: vscode.TextEditor; - readonly line: number; - readonly height: number; - readonly webview: vscode.Webview; - readonly onDidDispose: Event; - dispose(): void; - } - export namespace window { - export function createWebviewTextEditorInset(editor: vscode.TextEditor, line: number, height: number, options?: vscode.WebviewOptions): WebviewEditorInset; - } -} - - export class CtrlKWebviewProvider { diff --git a/extensions/void/tsconfig.json b/extensions/void/tsconfig.json index 63e3afa9a..0eac21ecf 100644 --- a/extensions/void/tsconfig.json +++ b/extensions/void/tsconfig.json @@ -1,6 +1,7 @@ { "include": [ - "src/**/*" + "src/**/*", + "../../src/vscode-dts/vscode.d.ts", ], "exclude": [ "node_modules" @@ -27,4 +28,4 @@ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ } -} \ No newline at end of file +} diff --git a/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts b/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts index e69de29bb..3bf99b114 100644 --- a/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts +++ b/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts @@ -0,0 +1,365 @@ +// import Anthropic from '@anthropic-ai/sdk'; +// import OpenAI from 'openai'; +// import { Ollama } from 'ollama' +// import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; +// import { VoidConfig } from '../webviews/common/contextForConfig' + +// export type AbortRef = { current: (() => void) | null } + +// export type OnText = (newText: string, fullText: string) => void + +// export type OnFinalMessage = (input: string) => void + +// export type LLMMessageAnthropic = { +// role: 'user' | 'assistant'; +// content: string; +// } + +// export type LLMMessage = { +// role: 'system' | 'user' | 'assistant'; +// content: string; +// } + +// type SendLLMMessageFnTypeInternal = (params: { +// messages: LLMMessage[]; +// onText: OnText; +// onFinalMessage: OnFinalMessage; +// onError: (error: string) => void; +// voidConfig: VoidConfig; +// abortRef: AbortRef; +// }) => void + +// type SendLLMMessageFnTypeExternal = (params: { +// messages: LLMMessage[]; +// onText: OnText; +// onFinalMessage: (fullText: string) => void; +// onError: (error: string) => void; +// voidConfig: VoidConfig | null; +// abortRef: AbortRef; +// }) => void + +// const parseMaxTokensStr = (maxTokensStr: string) => { +// // parse the string but only if the full string is a valid number, eg parseInt('100abc') should return NaN +// const int = isNaN(Number(maxTokensStr)) ? undefined : parseInt(maxTokensStr) +// if (Number.isNaN(int)) +// return undefined +// return int +// } + +// // Anthropic +// const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig }) => { + +// const anthropic = new Anthropic({ apiKey: voidConfig.anthropic.apikey, dangerouslyAllowBrowser: true }); // defaults to process.env["ANTHROPIC_API_KEY"] + +// // find system messages and concatenate them +// const systemMessage = messages +// .filter(msg => msg.role === 'system') +// .map(msg => msg.content) +// .join('\n'); + +// // remove system messages for Anthropic +// const anthropicMessages = messages.filter(msg => msg.role !== 'system') as LLMMessageAnthropic[] + +// const stream = anthropic.messages.stream({ +// system: systemMessage, +// messages: anthropicMessages, +// model: voidConfig.anthropic.model, +// max_tokens: parseMaxTokensStr(voidConfig.default.maxTokens)!, // this might be undefined, but it will just throw an error for the user +// }); + +// let did_abort = false + +// // when receive text +// stream.on('text', (newText, fullText) => { +// if (did_abort) return +// onText(newText, fullText) +// }) + +// // when we get the final message on this stream (or when error/fail) +// stream.on('finalMessage', (claude_response) => { +// if (did_abort) return +// // stringify the response's content +// const content = claude_response.content.map(c => c.type === 'text' ? c.text : c.type).join('\n'); +// onFinalMessage(content) +// }) + +// stream.on('error', (error) => { +// // the most common error will be invalid API key (401), so we handle this with a nice message +// if (error instanceof Anthropic.APIError && error.status === 401) { +// onError('Invalid API key.') +// } +// else { +// onError(error.message) +// } +// }) + +// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either +// const abort = () => { +// did_abort = true +// stream.controller.abort() // TODO need to test this to make sure it works, it might throw an error +// } + +// return { abort } +// }; + +// // Gemini +// const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { + +// let didAbort = false +// let fullText = '' + +// abortRef.current = () => { +// didAbort = true +// } + +// const genAI = new GoogleGenerativeAI(voidConfig.gemini.apikey); +// const model = genAI.getGenerativeModel({ model: voidConfig.gemini.model }); + +// // remove system messages that get sent to Gemini +// // str of all system messages +// const systemMessage = messages +// .filter(msg => msg.role === 'system') +// .map(msg => msg.content) +// .join('\n'); + +// // Convert messages to Gemini format +// const geminiMessages: Content[] = messages +// .filter(msg => msg.role !== 'system') +// .map((msg, i) => ({ +// parts: [{ text: msg.content }], +// role: msg.role === 'assistant' ? 'model' : 'user' +// })) + +// model.generateContentStream({ contents: geminiMessages, systemInstruction: systemMessage, }) +// .then(async response => { +// abortRef.current = () => { +// // response.stream.return(fullText) +// didAbort = true; +// } +// for await (const chunk of response.stream) { +// if (didAbort) return; +// const newText = chunk.text(); +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); +// }) +// .catch((error) => { +// if (error instanceof GoogleGenerativeAIFetchError) { +// if (error.status === 400) { +// onError('Invalid API key.'); +// } +// else { +// onError(`${error.name}:\n${error.message}`); +// } +// } +// else { +// onError(error); +// } +// }) +// } + +// // OpenAI, OpenRouter, OpenAICompatible +// const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { + +// let didAbort = false +// let fullText = '' + +// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either +// abortRef.current = () => { +// didAbort = true; +// }; + +// let openai: OpenAI +// let options: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming + +// const maxTokens = parseMaxTokensStr(voidConfig.default.maxTokens) + +// if (voidConfig.default.whichApi === 'openAI') { +// openai = new OpenAI({ apiKey: voidConfig.openAI.apikey, dangerouslyAllowBrowser: true }); +// options = { model: voidConfig.openAI.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else if (voidConfig.default.whichApi === 'openRouter') { +// openai = new OpenAI({ +// baseURL: 'https://openrouter.ai/api/v1', apiKey: voidConfig.openRouter.apikey, dangerouslyAllowBrowser: true, +// defaultHeaders: { +// 'HTTP-Referer': 'https://voideditor.com', // Optional, for including your app on openrouter.ai rankings. +// 'X-Title': 'Void Editor', // Optional. Shows in rankings on openrouter.ai. +// }, +// }); +// options = { model: voidConfig.openRouter.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else if (voidConfig.default.whichApi === 'openAICompatible') { +// openai = new OpenAI({ baseURL: voidConfig.openAICompatible.endpoint, apiKey: voidConfig.openAICompatible.apikey, dangerouslyAllowBrowser: true }) +// options = { model: voidConfig.openAICompatible.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else { +// console.error(`sendOpenAIMsg: invalid whichApi: ${voidConfig.default.whichApi}`) +// throw new Error(`voidConfig.whichAPI was invalid: ${voidConfig.default.whichApi}`) +// } + +// openai.chat.completions +// .create(options) +// .then(async response => { +// abortRef.current = () => { +// // response.controller.abort() +// didAbort = true; +// } +// // when receive text +// for await (const chunk of response) { +// if (didAbort) return; +// const newText = chunk.choices[0]?.delta?.content || ''; +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); +// }) +// // when error/fail - this catches errors of both .create() and .then(for await) +// .catch(error => { +// if (error instanceof OpenAI.APIError) { +// if (error.status === 401) { +// onError('Invalid API key.'); +// } +// else { +// onError(`${error.name}:\n${error.message}`); +// } +// } +// else { +// onError(error); +// } +// }) + +// }; + +// // Ollama +// export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { + +// let didAbort = false +// let fullText = '' + +// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either +// abortRef.current = () => { +// didAbort = true; +// }; + +// const ollama = new Ollama({ host: voidConfig.ollama.endpoint }) + +// ollama.chat({ +// model: voidConfig.ollama.model, +// messages: messages, +// stream: true, +// options: { num_predict: parseMaxTokensStr(voidConfig.default.maxTokens) } // this is max_tokens +// }) +// .then(async stream => { +// abortRef.current = () => { +// // stream.abort() +// didAbort = true +// } +// // iterate through the stream +// for await (const chunk of stream) { +// if (didAbort) return; +// const newText = chunk.message.content; +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); + +// }) +// // when error/fail +// .catch(error => { +// onError(error) +// }) + +// }; + +// // Greptile +// // https://docs.greptile.com/api-reference/query +// // https://docs.greptile.com/quickstart#sample-response-streamed + +// const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { + +// let didAbort = false +// let fullText = '' + +// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either +// abortRef.current = () => { +// didAbort = true +// } + +// fetch('https://api.greptile.com/v2/query', { +// method: 'POST', +// headers: { +// 'Authorization': `Bearer ${voidConfig.greptile.apikey}`, +// 'X-Github-Token': `${voidConfig.greptile.githubPAT}`, +// 'Content-Type': `application/json`, +// }, +// body: JSON.stringify({ +// messages, +// stream: true, +// repositories: [voidConfig.greptile.repoinfo], +// }), +// }) +// // this is {message}\n{message}\n{message}...\n +// .then(async response => { +// const text = await response.text() +// console.log('got greptile', text) +// return JSON.parse(`[${text.trim().split('\n').join(',')}]`) +// }) +// // TODO make this actually stream, right now it just sends one message at the end +// .then(async responseArr => { +// if (didAbort) +// return + +// for (const response of responseArr) { + +// const type: string = response['type'] +// const message = response['message'] + +// // when receive text +// if (type === 'message') { +// fullText += message +// onText(message, fullText) +// } +// else if (type === 'sources') { +// const { filepath, linestart: _, lineend: _2 } = message as { filepath: string; linestart: number | null; lineend: number | null } +// fullText += filepath +// onText(filepath, fullText) +// } +// // type: 'status' with an empty 'message' means last message +// else if (type === 'status') { +// if (!message) { +// onFinalMessage(fullText) +// } +// } +// } + +// }) +// .catch(e => { +// onError(e) +// }); + +// } + +// export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { +// if (!voidConfig) return; + +// // trim message content (Anthropic and other providers give an error if there is trailing whitespace) +// messages = messages.map(m => ({ ...m, content: m.content.trim() })) + +// switch (voidConfig.default.whichApi) { +// case 'anthropic': +// return sendAnthropicMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); +// case 'openAI': +// case 'openRouter': +// case 'openAICompatible': +// return sendOpenAIMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); +// case 'gemini': +// return sendGeminiMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); +// case 'ollama': +// return sendOllamaMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); +// case 'greptile': +// return sendGreptileMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); +// default: +// onError(`Error: whichApi was ${voidConfig.default.whichApi}, which is not recognized!`) +// } +// } From 36c3cd53e1d703c87a02291030529c3f1e3d9b2a Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 3 Nov 2024 00:31:32 -0700 Subject: [PATCH 006/107] add new logging algo and move applyDiffLazily to diffProvider --- extensions/void/package-lock.json | 28 +- extensions/void/package.json | 4 +- extensions/void/src/common/sendLLMMessage.ts | 152 ++++++---- extensions/void/src/extension/DiffProvider.ts | 64 ++++- .../void/src/extension/applyDiffLazily.ts | 267 +++++++++--------- extensions/void/src/extension/ctrlK.ts | 3 +- extensions/void/src/extension/extension.ts | 3 +- .../void/src/webviews/sidebar/SidebarChat.tsx | 27 +- package-lock.json | 197 ++----------- package.json | 4 - .../inlineDiffService/inlineDiffService.ts | 5 - 11 files changed, 324 insertions(+), 430 deletions(-) diff --git a/extensions/void/package-lock.json b/extensions/void/package-lock.json index 7e012ead2..e5e2b52fb 100644 --- a/extensions/void/package-lock.json +++ b/extensions/void/package-lock.json @@ -8,7 +8,7 @@ "name": "void", "version": "0.0.1", "devDependencies": { - "@anthropic-ai/sdk": "^0.29.2", + "@anthropic-ai/sdk": "^0.31.0", "@eslint/js": "^9.9.1", "@google/generative-ai": "^0.21.0", "@monaco-editor/react": "^4.6.0", @@ -37,7 +37,7 @@ "lodash": "^4.17.21", "marked": "^14.1.0", "ollama": "^0.5.9", - "openai": "^4.68.4", + "openai": "^4.70.2", "postcss": "^8.4.41", "posthog-js": "^1.176.0", "react": "^18.3.1", @@ -69,9 +69,9 @@ } }, "node_modules/@anthropic-ai/sdk": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.29.2.tgz", - "integrity": "sha512-5dwiOPO/AZvhY4bJIG9vjFKU9Kza3hA6VEsbIQg6L9vny2RQIpCFhV50nB9IrG2edZaHZb4HuQ9Wmsn5zgWyZg==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.31.0.tgz", + "integrity": "sha512-9EX90YMUtj0d1aHPsnjgurUWAUoNQA/kMaN+UUN7eL3jhl1cijBIGKHQPrR4/ctvD9A065QnzzJDy5Oxb/Bk8A==", "dev": true, "license": "MIT", "dependencies": { @@ -85,9 +85,9 @@ } }, "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.59.tgz", - "integrity": "sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ==", + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6288,9 +6288,9 @@ } }, "node_modules/openai": { - "version": "4.68.4", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.68.4.tgz", - "integrity": "sha512-LRinV8iU9VQplkr25oZlyrsYGPGasIwYN8KFMAAFTHHLHjHhejtJ5BALuLFrkGzY4wfbKhOhuT+7lcHZ+F3iEA==", + "version": "4.70.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.70.2.tgz", + "integrity": "sha512-Q2ymi/KPUYv+LJ9rFxeYxpkVAhcrZFTVvnJbdF1pUHg9eMC6lY8PU4TO1XOK5UZzOZuuVicouRwVMi1iDrT4qw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6315,9 +6315,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.59.tgz", - "integrity": "sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ==", + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/extensions/void/package.json b/extensions/void/package.json index 5ef96e21e..855e2190e 100644 --- a/extensions/void/package.json +++ b/extensions/void/package.json @@ -112,7 +112,7 @@ "test": "vscode-test" }, "devDependencies": { - "@anthropic-ai/sdk": "^0.29.2", + "@anthropic-ai/sdk": "^0.31.0", "@eslint/js": "^9.9.1", "@google/generative-ai": "^0.21.0", "@monaco-editor/react": "^4.6.0", @@ -141,7 +141,7 @@ "lodash": "^4.17.21", "marked": "^14.1.0", "ollama": "^0.5.9", - "openai": "^4.68.4", + "openai": "^4.70.2", "postcss": "^8.4.41", "posthog-js": "^1.176.0", "react": "^18.3.1", diff --git a/extensions/void/src/common/sendLLMMessage.ts b/extensions/void/src/common/sendLLMMessage.ts index 71259613e..9c3fd131a 100644 --- a/extensions/void/src/common/sendLLMMessage.ts +++ b/extensions/void/src/common/sendLLMMessage.ts @@ -3,6 +3,8 @@ import OpenAI from 'openai'; import { Ollama } from 'ollama' import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; import { VoidConfig } from '../webviews/common/contextForConfig' +import { captureEvent } from '../webviews/common/posthog'; +import { ChatMessage } from './shared_types'; export type AbortRef = { current: (() => void) | null } @@ -26,7 +28,8 @@ type SendLLMMessageFnTypeInternal = (params: { onFinalMessage: OnFinalMessage; onError: (error: string) => void; voidConfig: VoidConfig; - abortRef: AbortRef; + + _setAborter: (aborter: () => void) => void; }) => void type SendLLMMessageFnTypeExternal = (params: { @@ -36,6 +39,10 @@ type SendLLMMessageFnTypeExternal = (params: { onError: (error: string) => void; voidConfig: VoidConfig | null; abortRef: AbortRef; + + logging: { + loggingName: string, + }; }) => void const parseMaxTokensStr = (maxTokensStr: string) => { @@ -47,7 +54,7 @@ const parseMaxTokensStr = (maxTokensStr: string) => { } // Anthropic -const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig }) => { +const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { const anthropic = new Anthropic({ apiKey: voidConfig.anthropic.apikey, dangerouslyAllowBrowser: true }); // defaults to process.env["ANTHROPIC_API_KEY"] @@ -67,17 +74,14 @@ const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFi max_tokens: parseMaxTokensStr(voidConfig.default.maxTokens)!, // this might be undefined, but it will just throw an error for the user }); - let did_abort = false // when receive text stream.on('text', (newText, fullText) => { - if (did_abort) return onText(newText, fullText) }) // when we get the final message on this stream (or when error/fail) stream.on('finalMessage', (claude_response) => { - if (did_abort) return // stringify the response's content const content = claude_response.content.map(c => c.type === 'text' ? c.text : c.type).join('\n'); onFinalMessage(content) @@ -93,25 +97,16 @@ const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFi } }) - // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either - const abort = () => { - did_abort = true - stream.controller.abort() // TODO need to test this to make sure it works, it might throw an error - } + // TODO need to test this to make sure it works, it might throw an error + _setAborter(() => stream.controller.abort()) - return { abort } }; // Gemini -const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { +const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { - let didAbort = false let fullText = '' - abortRef.current = () => { - didAbort = true - } - const genAI = new GoogleGenerativeAI(voidConfig.gemini.apikey); const model = genAI.getGenerativeModel({ model: voidConfig.gemini.model }); @@ -132,12 +127,9 @@ const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, o model.generateContentStream({ contents: geminiMessages, systemInstruction: systemMessage, }) .then(async response => { - abortRef.current = () => { - // response.stream.return(fullText) - didAbort = true; - } + _setAborter(() => response.stream.return(fullText)) + for await (const chunk of response.stream) { - if (didAbort) return; const newText = chunk.text(); fullText += newText; onText(newText, fullText); @@ -160,16 +152,10 @@ const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, o } // OpenAI, OpenRouter, OpenAICompatible -const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { +const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { - let didAbort = false let fullText = '' - // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either - abortRef.current = () => { - didAbort = true; - }; - let openai: OpenAI let options: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming @@ -201,13 +187,9 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinal openai.chat.completions .create(options) .then(async response => { - abortRef.current = () => { - // response.controller.abort() - didAbort = true; - } + _setAborter(() => response.controller.abort()) // when receive text for await (const chunk of response) { - if (didAbort) return; const newText = chunk.choices[0]?.delta?.content || ''; fullText += newText; onText(newText, fullText); @@ -232,16 +214,10 @@ const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinal }; // Ollama -export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { +export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { - let didAbort = false let fullText = '' - // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either - abortRef.current = () => { - didAbort = true; - }; - const ollama = new Ollama({ host: voidConfig.ollama.endpoint }) ollama.chat({ @@ -251,13 +227,9 @@ export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, options: { num_predict: parseMaxTokensStr(voidConfig.default.maxTokens) } // this is max_tokens }) .then(async stream => { - abortRef.current = () => { - // stream.abort() - didAbort = true - } + _setAborter(() => stream.abort()) // iterate through the stream for await (const chunk of stream) { - if (didAbort) return; const newText = chunk.message.content; fullText += newText; onText(newText, fullText); @@ -276,16 +248,10 @@ export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, // https://docs.greptile.com/api-reference/query // https://docs.greptile.com/quickstart#sample-response-streamed -const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { +const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { - let didAbort = false let fullText = '' - // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either - abortRef.current = () => { - didAbort = true - } - fetch('https://api.greptile.com/v2/query', { method: 'POST', headers: { @@ -306,12 +272,10 @@ const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFin return JSON.parse(`[${text.trim().split('\n').join(',')}]`) }) // TODO make this actually stream, right now it just sends one message at the end + // TODO add _setAborter() when add streaming .then(async responseArr => { - if (didAbort) - return for (const response of responseArr) { - const type: string = response['type'] const message = response['message'] @@ -340,26 +304,90 @@ const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFin } -export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { + + + + +export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ + messages, + onText: onText_, + onFinalMessage: onFinalMessage_, + onError: onError_, + abortRef: abortRef_, + voidConfig, + logging: { loggingName } +}) => { if (!voidConfig) return; // trim message content (Anthropic and other providers give an error if there is trailing whitespace) messages = messages.map(m => ({ ...m, content: m.content.trim() })) + // only captures number of messages and message "shape", no actual code, instructions, prompts, etc + const captureChatEvent = (eventId: string, extras?: object) => { + captureEvent(eventId, { + whichApi: voidConfig.default['whichApi'], + numMessages: messages?.length, + messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.content.length })), + version: '2024-11-02', + ...extras, + }) + } + const submit_time = new Date() + + let _fullTextSoFar = '' + let _aborter: (() => void) | null = null + let _setAborter = (fn: () => void) => { _aborter = fn } + let _didAbort = false + + const onText = (newText: string, fullText: string) => { + if (_didAbort) return + onText_(newText, fullText) + _fullTextSoFar = fullText + } + + const onFinalMessage = (fullText: string) => { + if (_didAbort) return + captureChatEvent(`${loggingName} - Received Full Message`, { messageLength: fullText.length, duration: new Date().getMilliseconds() - submit_time.getMilliseconds() }) + onFinalMessage_(fullText) + } + + const onError = (error: string) => { + if (_didAbort) return + captureChatEvent(`${loggingName} - Error`, { error }) + onError_(error) + } + + const onAbort = () => { + captureChatEvent(`${loggingName} - Abort`, { messageLengthSoFar: _fullTextSoFar.length }) + _aborter?.() + _didAbort = true + } + abortRef_.current = onAbort + + captureChatEvent(`${loggingName} - Sending Message`, { messageLength: messages[messages.length - 1]?.content.length }) + switch (voidConfig.default.whichApi) { case 'anthropic': - return sendAnthropicMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); + sendAnthropicMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); + break; case 'openAI': case 'openRouter': case 'openAICompatible': - return sendOpenAIMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); + sendOpenAIMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); + break; case 'gemini': - return sendGeminiMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); + sendGeminiMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); + break; case 'ollama': - return sendOllamaMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); + sendOllamaMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); + break; case 'greptile': - return sendGreptileMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); + sendGreptileMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); + break; default: onError(`Error: whichApi was ${voidConfig.default.whichApi}, which is not recognized!`) + break; } + + } diff --git a/extensions/void/src/extension/DiffProvider.ts b/extensions/void/src/extension/DiffProvider.ts index 971c3d259..9289eb95c 100644 --- a/extensions/void/src/extension/DiffProvider.ts +++ b/extensions/void/src/extension/DiffProvider.ts @@ -3,7 +3,9 @@ import { findDiffs } from './findDiffs'; import { throttle } from 'lodash'; import { DiffArea, BaseDiff, Diff } from '../common/shared_types'; import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; -import { updateWebviewHTML } from './extensionLib/updateWebviewHTML'; +import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; +import { writeFileWithDiffInstructions } from '../common/systemPrompts'; +import { VoidConfig } from '../webviews/common/contextForConfig'; const THROTTLE_TIME = 100 @@ -397,8 +399,66 @@ export class DiffProvider implements vscode.CodeLensProvider { + + + + + + + async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { + + + const promptContent = `\ +ORIGINAL_FILE +\`\`\` +${oldFileStr} +\`\`\` + +DIFF +\`\`\` +${diffRepr} +\`\`\` + +INSTRUCTIONS +Please finish writing the new file by applying the diff to the original file. Return ONLY the completion of the file, without any explanation. + +` + // ask LLM to rewrite file with diff (if there is significant matchup with the original file, we stop rewriting) + const START = new Date().getTime() + + // make LLM complete the file to include the diff + await new Promise((resolve, reject) => { + sendLLMMessage({ + logging: { loggingName: 'streamChunk' }, + messages: [ + { role: 'system', content: writeFileWithDiffInstructions, }, + // TODO include more context too + { role: 'user', content: promptContent, } + ], + onText: (newText, fullText) => { + this._updateStream(docUri.toString(), diffArea, fullText) + }, + onFinalMessage: (fullText) => { + this._updateStream(docUri.toString(), diffArea, fullText) + resolve(); + }, + onError: (e) => { + console.error('Error rewriting file with diff', e); + resolve(); + }, + voidConfig, + abortRef, + }) + }) + + const END = new Date().getTime() + console.log('EDIT CHUNK time: ', END - START); + + } + + // used by us only - public updateStream = throttle(async (docUriStr: string, diffArea: DiffArea, newDiffAreaCode: string) => { + private _updateStream = throttle(async (docUriStr: string, diffArea: DiffArea, newDiffAreaCode: string) => { const editor = vscode.window.activeTextEditor // TODO the editor should be that of `docUri` and not necessarily the current editor if (!editor) { diff --git a/extensions/void/src/extension/applyDiffLazily.ts b/extensions/void/src/extension/applyDiffLazily.ts index 50161bab4..60ad49590 100644 --- a/extensions/void/src/extension/applyDiffLazily.ts +++ b/extensions/void/src/extension/applyDiffLazily.ts @@ -1,180 +1,181 @@ -import type * as vscode from 'vscode'; +// import type * as vscode from 'vscode'; -import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; -import { DiffArea } from '../common/shared_types'; -import { writeFileWithDiffInstructions, searchDiffChunkInstructions } from '../common/systemPrompts'; -import { VoidConfig } from '../webviews/common/contextForConfig'; -import { DiffProvider } from './DiffProvider'; -import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; +// import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; +// import { DiffArea } from '../common/shared_types'; +// import { writeFileWithDiffInstructions, searchDiffChunkInstructions } from '../common/systemPrompts'; +// import { VoidConfig } from '../webviews/common/contextForConfig'; +// import { DiffProvider } from './DiffProvider'; +// import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; -const LINES_PER_CHUNK = 20 // number of lines to search at a time +// const LINES_PER_CHUNK = 20 // number of lines to search at a time -type CompetedReturn = { isFinished: true, } | { isFinished?: undefined, } -const streamChunk = ({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, diffArea, voidConfig, abortRef }: { diffProvider: DiffProvider, docUri: vscode.Uri, oldFileStr: string, completedStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) => { +// type CompetedReturn = { isFinished: true, } | { isFinished?: undefined, } +// const streamChunk = ({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, diffArea, voidConfig, abortRef }: { diffProvider: DiffProvider, docUri: vscode.Uri, oldFileStr: string, completedStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) => { - const promptContent = `ORIGINAL_FILE -\`\`\` -${oldFileStr} -\`\`\` +// const promptContent = `ORIGINAL_FILE +// \`\`\` +// ${oldFileStr} +// \`\`\` -DIFF -\`\`\` -${diffRepr} -\`\`\` +// DIFF +// \`\`\` +// ${diffRepr} +// \`\`\` -INSTRUCTIONS -Please finish writing the new file \`NEW_FILE\`. Return ONLY the completion of the file, without any explanation. +// INSTRUCTIONS +// Please finish writing the new file \`NEW_FILE\`. Return ONLY the completion of the file, without any explanation. -NEW_FILE -\`\`\` -${completedStr} -\`\`\` -` - // create a promise that can be awaited - return new Promise((resolve, reject) => { +// NEW_FILE +// \`\`\` +// ${completedStr} +// \`\`\` +// ` +// // create a promise that can be awaited +// return new Promise((resolve, reject) => { - let isAnyChangeSoFar = false +// let isAnyChangeSoFar = false - // make LLM complete the file to include the diff - sendLLMMessage({ - messages: [{ role: 'system', content: writeFileWithDiffInstructions, }, { role: 'user', content: promptContent, }], - onText: (newText, fullText) => { - const fullCompletedStr = completedStr + fullText +// // make LLM complete the file to include the diff +// sendLLMMessage({ +// logging: { loggingName: 'applyDiffLazily' }, +// messages: [{ role: 'system', content: writeFileWithDiffInstructions, }, { role: 'user', content: promptContent, }], +// onText: (newText, fullText) => { +// const fullCompletedStr = completedStr + fullText - diffProvider.updateStream(docUri.toString(), diffArea, fullCompletedStr) +// diffProvider.updateStream(docUri.toString(), diffArea, fullCompletedStr) - // if there was any change from the original file - if (!oldFileStr.includes(fullCompletedStr)) { - isAnyChangeSoFar = true - } +// // if there was any change from the original file +// if (!oldFileStr.includes(fullCompletedStr)) { +// isAnyChangeSoFar = true +// } - const isRecentMatchup = false - // the final NUM_MATCHUP_TOKENS characters of fullCompletedStr are the same as the final NUM_MATCHUP_TOKENS characters of the last item in the diffs of oldFileStr that had 0 changes +// const isRecentMatchup = false +// // the final NUM_MATCHUP_TOKENS characters of fullCompletedStr are the same as the final NUM_MATCHUP_TOKENS characters of the last item in the diffs of oldFileStr that had 0 changes - if (isAnyChangeSoFar && isRecentMatchup) { - diffProvider.updateStream(docUri.toString(), diffArea, fullCompletedStr) +// if (isAnyChangeSoFar && isRecentMatchup) { +// diffProvider.updateStream(docUri.toString(), diffArea, fullCompletedStr) - // TODO resolve the promise - // resolve({ speculativeIndex: newCurrentLine + 1 }); +// // TODO resolve the promise +// // resolve({ speculativeIndex: newCurrentLine + 1 }); - // abort the LLM call - abortRef.current?.() +// // abort the LLM call +// abortRef.current?.() - } +// } - }, +// }, - onFinalMessage: (fullText) => { - const newCompletedStr = completedStr + fullText - diffProvider.updateStream(docUri.toString(), diffArea, newCompletedStr) - resolve({ isFinished: true }); - }, - onError: (e) => { - resolve({ isFinished: true }); - console.error('Error rewriting file with diff', e); - }, - voidConfig, - abortRef, - }) - }) -} +// onFinalMessage: (fullText) => { +// const newCompletedStr = completedStr + fullText +// diffProvider.updateStream(docUri.toString(), diffArea, newCompletedStr) +// resolve({ isFinished: true }); +// }, +// onError: (e) => { +// resolve({ isFinished: true }); +// console.error('Error rewriting file with diff', e); +// }, +// voidConfig, +// abortRef, +// }) +// }) +// } -// const shouldApplyDiff = ({ diffRepr, oldFileStr: fileStr, speculationStr, voidConfig, abortRef }: { diffRepr: string, oldFileStr: string, speculationStr: string, voidConfig: VoidConfig, abortRef: AbortRef }) => { +// // const shouldApplyDiff = ({ diffRepr, oldFileStr: fileStr, speculationStr, voidConfig, abortRef }: { diffRepr: string, oldFileStr: string, speculationStr: string, voidConfig: VoidConfig, abortRef: AbortRef }) => { -// const promptContent = `DIFF -// \`\`\` -// ${diffRepr} -// \`\`\` +// // const promptContent = `DIFF +// // \`\`\` +// // ${diffRepr} +// // \`\`\` -// FILES -// \`\`\` -// ${fileStr} -// \`\`\` +// // FILES +// // \`\`\` +// // ${fileStr} +// // \`\`\` -// SELECTION -// \`\`\` -// ${speculationStr} -// \`\`\` +// // SELECTION +// // \`\`\` +// // ${speculationStr} +// // \`\`\` -// Return \`true\` if ANY part of the chunk should be modified, and \`false\` if it should not be modified. You should respond only with \`true\` or \`false\` and nothing else. -// ` +// // Return \`true\` if ANY part of the chunk should be modified, and \`false\` if it should not be modified. You should respond only with \`true\` or \`false\` and nothing else. +// // ` -// // create new promise -// return new Promise((resolve, reject) => { -// // send message to LLM -// sendLLMMessage({ -// messages: [{ role: 'system', content: searchDiffChunkInstructions, }, { role: 'user', content: promptContent, }], -// onFinalMessage: (finalMessage) => { +// // // create new promise +// // return new Promise((resolve, reject) => { +// // // send message to LLM +// // sendLLMMessage({ +// // messages: [{ role: 'system', content: searchDiffChunkInstructions, }, { role: 'user', content: promptContent, }], +// // onFinalMessage: (finalMessage) => { -// const containsTrue = finalMessage -// .slice(-10) // check for `true` in last 10 characters -// .toLowerCase() -// .includes('true') +// // const containsTrue = finalMessage +// // .slice(-10) // check for `true` in last 10 characters +// // .toLowerCase() +// // .includes('true') -// resolve(containsTrue) -// }, -// onError: (e) => { -// resolve(false); -// console.error('Error in shouldApplyDiff: ', e) -// }, -// onText: () => { }, -// voidConfig, -// abortRef, -// }) +// // resolve(containsTrue) +// // }, +// // onError: (e) => { +// // resolve(false); +// // console.error('Error in shouldApplyDiff: ', e) +// // }, +// // onText: () => { }, +// // voidConfig, +// // abortRef, +// // }) -// }) +// // }) -// } +// // } -// lazily applies the diff to the file -// we chunk the text in the file, and ask an LLM whether it should edit each chunk -export const applyDiffLazily = async ({ docUri, oldFileStr, voidConfig, abortRef, diffRepr, diffProvider, diffArea }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffProvider: DiffProvider, diffArea: DiffArea, abortRef: AbortRef }) => { +// // lazily applies the diff to the file +// // we chunk the text in the file, and ask an LLM whether it should edit each chunk +// export const applyDiffLazily = async ({ docUri, oldFileStr, voidConfig, abortRef, diffRepr, diffProvider, diffArea }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffProvider: DiffProvider, diffArea: DiffArea, abortRef: AbortRef }) => { - // stateful variables - let speculativeIndex = 0 - let writtenTextSoFar: string[] = [] +// // stateful variables +// let speculativeIndex = 0 +// let writtenTextSoFar: string[] = [] - while (speculativeIndex < oldFileStr.split('\n').length) { +// while (speculativeIndex < oldFileStr.split('\n').length) { - const chunkStr = oldFileStr.split('\n').slice(speculativeIndex, speculativeIndex + LINES_PER_CHUNK).join('\n') +// const chunkStr = oldFileStr.split('\n').slice(speculativeIndex, speculativeIndex + LINES_PER_CHUNK).join('\n') - // ask LLM if we should apply the diff to the chunk - const START = new Date().getTime() - let shouldApplyDiff_ = true; //await shouldApplyDiff({ oldFileStr, speculationStr: chunkStr, diffRepr, voidConfig, abortRef }) - const END = new Date().getTime() +// // ask LLM if we should apply the diff to the chunk +// const START = new Date().getTime() +// let shouldApplyDiff_ = true; //await shouldApplyDiff({ oldFileStr, speculationStr: chunkStr, diffRepr, voidConfig, abortRef }) +// const END = new Date().getTime() - // if should not change the chunk - if (!shouldApplyDiff_) { - console.log('KEEP CHUNK time: ', END - START) - speculativeIndex += LINES_PER_CHUNK - writtenTextSoFar.push(chunkStr) - // diffProvider.updateStream(docUri.toString(), diffArea, writtenTextSoFar.join('\n')) - continue; - } +// // if should not change the chunk +// if (!shouldApplyDiff_) { +// console.log('KEEP CHUNK time: ', END - START) +// speculativeIndex += LINES_PER_CHUNK +// writtenTextSoFar.push(chunkStr) +// // diffProvider.updateStream(docUri.toString(), diffArea, writtenTextSoFar.join('\n')) +// continue; +// } - // ask LLM to rewrite file with diff (if there is significant matchup with the original file, we stop rewriting) - const START2 = new Date().getTime() - const completedStr = (await readFileContentOfUri(docUri)).split('\n').slice(0, speculativeIndex).join('\n'); - const result = await streamChunk({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, voidConfig, diffArea, abortRef, }) - const END2 = new Date().getTime() +// // ask LLM to rewrite file with diff (if there is significant matchup with the original file, we stop rewriting) +// const START2 = new Date().getTime() +// const completedStr = (await readFileContentOfUri(docUri)).split('\n').slice(0, speculativeIndex).join('\n'); +// const result = await streamChunk({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, voidConfig, diffArea, abortRef, }) +// const END2 = new Date().getTime() - console.log('EDIT CHUNK time: ', END2 - START2); +// console.log('EDIT CHUNK time: ', END2 - START2); - // if we are finished, stop the loop - if (result.isFinished) { - break; - } +// // if we are finished, stop the loop +// if (result.isFinished) { +// break; +// } - // TODO - // speculativeIndex = result.speculativeIndex +// // TODO +// // speculativeIndex = result.speculativeIndex - } +// } -} +// } diff --git a/extensions/void/src/extension/ctrlK.ts b/extensions/void/src/extension/ctrlK.ts index 63aaf200f..61302cbe8 100644 --- a/extensions/void/src/extension/ctrlK.ts +++ b/extensions/void/src/extension/ctrlK.ts @@ -66,6 +66,7 @@ Complete the following: // update stream sendLLMMessage({ + logging: { loggingName: 'Ctrl+K' }, messages: [{ role: 'user', content: promptContent, }], onText: async (tokenStr, completionStr) => { // TODO update stream @@ -97,4 +98,4 @@ Complete the following: -export { applyCtrlK } \ No newline at end of file +export { applyCtrlK } diff --git a/extensions/void/src/extension/extension.ts b/extensions/void/src/extension/extension.ts index 6a29e5df1..ef975b67b 100644 --- a/extensions/void/src/extension/extension.ts +++ b/extensions/void/src/extension/extension.ts @@ -4,7 +4,6 @@ import { v4 as uuidv4 } from 'uuid' import { AbortRef } from '../common/sendLLMMessage'; import { MessageToSidebar, MessageFromSidebar, DiffArea, ChatThreads } from '../common/shared_types'; import { getVoidConfigFromPartial } from '../webviews/common/contextForConfig'; -import { applyDiffLazily } from './applyDiffLazily'; import { DiffProvider } from './DiffProvider'; import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; import { SidebarWebviewProvider } from './providers/SidebarWebviewProvider'; @@ -131,7 +130,7 @@ export function activate(context: vscode.ExtensionContext) { const fileStr = await readFileContentOfUri(docUri) const voidConfig = getVoidConfigFromPartial(context.globalState.get('partialVoidConfig') ?? {}) - await applyDiffLazily({ docUri, oldFileStr: fileStr, diffRepr: m.diffRepr, voidConfig, diffProvider, diffArea, abortRef: abortApplyRef }) + await diffProvider.startStreamingInDiffArea({ docUri, oldFileStr: fileStr, diffRepr: m.diffRepr, voidConfig, diffArea, abortRef: abortApplyRef }) } else if (m.type === 'getPartialVoidConfig') { const partialVoidConfig = context.globalState.get('partialVoidConfig') ?? {} diff --git a/extensions/void/src/webviews/sidebar/SidebarChat.tsx b/extensions/void/src/webviews/sidebar/SidebarChat.tsx index 038fedf7f..81591fa4e 100644 --- a/extensions/void/src/webviews/sidebar/SidebarChat.tsx +++ b/extensions/void/src/webviews/sidebar/SidebarChat.tsx @@ -167,21 +167,6 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject { - const whichApi = voidConfig.default['whichApi'] - const messages = getCurrentThread()?.messages - - captureEvent(eventId, { - whichApi: whichApi, - numMessages: messages?.length, - messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.displayContent?.length })), - version: '2024-10-19', - ...extras, - }) - }, [getCurrentThread, voidConfig.default]) - - // if they pressed the + to add a new chat useOnVSCodeMessage('startNewThread', (m) => { const allThreads = getAllThreads() @@ -235,15 +220,12 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject ({ role: m.role, content: m.content })),], onText: (newText, fullText) => setMessageStream(fullText), onFinalMessage: (content) => { - captureChatEvent('Chat - Received Full Message', { messageLength: content.length, duration: new Date().getMilliseconds() - submit_time.getMilliseconds() }) // add assistant's message to chat history, and clear selection const newHistoryElt: ChatMessage = { role: 'assistant', content, displayContent: content } @@ -252,8 +234,6 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject { - captureChatEvent('Chat - Error', { error }) - // add assistant's message to chat history, and clear selection let content = messageStream; // just use the current content const newHistoryElt: ChatMessage = { role: 'assistant', content, displayContent: content, } @@ -271,9 +251,6 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject { - - captureChatEvent('Chat - Abort', { messageLengthSoFar: messageStream.length }) - // abort claude abortFnRef.current?.() @@ -285,7 +262,7 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject diff --git a/package-lock.json b/package-lock.json index e6cac59f3..5833d14a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,6 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@anthropic-ai/sdk": "^0.31.0", - "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -45,9 +43,7 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", - "ollama": "^0.5.9", "open": "^8.4.2", - "openai": "^4.70.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", "vscode-oniguruma": "1.7.0", @@ -184,30 +180,6 @@ "node": ">=6.0.0" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.31.0.tgz", - "integrity": "sha512-9EX90YMUtj0d1aHPsnjgurUWAUoNQA/kMaN+UUN7eL3jhl1cijBIGKHQPrR4/ctvD9A065QnzzJDy5Oxb/Bk8A==", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@azure-rest/ai-translation-text": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/@azure-rest/ai-translation-text/-/ai-translation-text-1.0.0-beta.1.tgz", @@ -1163,15 +1135,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@google/generative-ai": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", - "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@gulp-sourcemaps/identity-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", @@ -2268,6 +2231,7 @@ "version": "20.14.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2276,6 +2240,7 @@ "version": "2.6.11", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -3606,18 +3571,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -3681,18 +3634,6 @@ "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4238,7 +4179,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/atob": { "version": "2.1.2", @@ -5273,6 +5215,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5284,6 +5227,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -6949,15 +6893,6 @@ "through": "~2.3.1" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -7789,6 +7724,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7798,25 +7734,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -10902,15 +10819,6 @@ "node": ">= 14" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/husky": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/husky/-/husky-0.13.4.tgz", @@ -13328,6 +13236,7 @@ "version": "1.45.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13336,6 +13245,7 @@ "version": "2.1.28", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, "dependencies": { "mime-db": "1.45.0" }, @@ -13924,29 +13834,11 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14474,15 +14366,6 @@ "node": ">=0.10.0" } }, - "node_modules/ollama": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", - "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", - "license": "MIT", - "dependencies": { - "whatwg-fetch": "^3.6.20" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -14549,41 +14432,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openai": { - "version": "4.70.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.70.2.tgz", - "integrity": "sha512-Q2ymi/KPUYv+LJ9rFxeYxpkVAhcrZFTVvnJbdF1pUHg9eMC6lY8PU4TO1XOK5UZzOZuuVicouRwVMi1iDrT4qw==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/opn": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", @@ -19007,7 +18855,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/tree-kill": { "version": "1.2.2", @@ -19433,7 +19282,8 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/union-value": { "version": "1.0.1", @@ -19910,15 +19760,6 @@ "node": ">=10.13.0" } }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/web-tree-sitter": { "version": "0.20.8", "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", @@ -19928,7 +19769,8 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { "version": "5.94.0", @@ -20185,16 +20027,11 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index b21c2a8c8..92fc72759 100644 --- a/package.json +++ b/package.json @@ -72,8 +72,6 @@ "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" }, "dependencies": { - "@anthropic-ai/sdk": "^0.31.0", - "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -107,9 +105,7 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", - "ollama": "^0.5.9", "open": "^8.4.2", - "openai": "^4.70.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", "vscode-oniguruma": "1.7.0", diff --git a/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts index 2e59181c4..8666a1644 100644 --- a/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts +++ b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts @@ -27,11 +27,6 @@ class InlineDiffService extends Disposable implements IInlineDiffService { initStream() { - - - // start streaming - // const streamChunk = ({ diffProvider, docUri, oldFileStr, completedStr, diffRepr, diffArea, voidConfig, abortRef }: { diffProvider: DiffProvider, docUri: vscode.Uri, oldFileStr: string, completedStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) => { - // } } From a5090b80255c75b8806a3f504c873b126cc6d81f Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 3 Nov 2024 01:57:05 -0800 Subject: [PATCH 007/107] simplify --- extensions/void/src/common/sendLLMMessage.ts | 2 +- extensions/void/src/extension/DiffProvider.ts | 132 ++++++------------ 2 files changed, 40 insertions(+), 94 deletions(-) diff --git a/extensions/void/src/common/sendLLMMessage.ts b/extensions/void/src/common/sendLLMMessage.ts index 9c3fd131a..d079f3ff8 100644 --- a/extensions/void/src/common/sendLLMMessage.ts +++ b/extensions/void/src/common/sendLLMMessage.ts @@ -1,6 +1,6 @@ import Anthropic from '@anthropic-ai/sdk'; import OpenAI from 'openai'; -import { Ollama } from 'ollama' +import { Ollama } from 'ollama/browser' import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; import { VoidConfig } from '../webviews/common/contextForConfig' import { captureEvent } from '../webviews/common/posthog'; diff --git a/extensions/void/src/extension/DiffProvider.ts b/extensions/void/src/extension/DiffProvider.ts index 9289eb95c..f641b6374 100644 --- a/extensions/void/src/extension/DiffProvider.ts +++ b/extensions/void/src/extension/DiffProvider.ts @@ -11,10 +11,6 @@ import { VoidConfig } from '../webviews/common/contextForConfig'; const THROTTLE_TIME = 100 // TODO in theory this should be disposed -const greenDecoration = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(0 255 51 / 0.2)', - isWholeLine: false, // after: { contentText: ' [original]', color: 'rgba(0 255 60 / 0.5)' } // hoverMessage: originalText // this applies to hovering over after:... -}) const lightGrayDecoration = vscode.window.createTextEditorDecorationType({ backgroundColor: 'rgba(218 218 218 / .2)', isWholeLine: true, @@ -63,7 +59,7 @@ export class DiffProvider implements vscode.CodeLensProvider { const changes = e.contentChanges.map(c => ({ startLine: c.range.start.line, endLine: c.range.end.line, text: c.text, })) // on user change, grow/shrink/merge/delete diff areas - this.refreshDiffAreasModel(docUriStr, changes, 'currentFile') + this.resizeDiffAreas(docUriStr, changes, 'currentFile') // refresh the diffAreas this.refreshStylesAndDiffs(docUriStr) @@ -102,18 +98,18 @@ export class DiffProvider implements vscode.CodeLensProvider { // used by us only // changes the start/line locations based on the changes that were recently made. does not change any of the diffs in the diff areas // changes tells us how many lines were inserted/deleted so we can grow/shrink the diffAreas accordingly - public refreshDiffAreasModel(docUriStr: string, changes: { text: string, startLine: number, endLine: number }[], changesTo: 'originalFile' | 'currentFile') { + public resizeDiffAreas(docUriStr: string, changes: { text: string, startLine: number, endLine: number }[], changesTo: 'originalFile' | 'currentFile') { const diffAreas = this._diffAreasOfDocument[docUriStr] || [] - let endName - let startName + let endLine + let startLine if (changesTo === 'originalFile') { - endName = 'originalEndLine' as const - startName = 'originalStartLine' as const + endLine = 'originalEndLine' as const + startLine = 'originalStartLine' as const } else { - endName = 'endLine' as const - startName = 'startLine' as const + endLine = 'endLine' as const + startLine = 'startLine' as const } for (const change of changes) { @@ -130,11 +126,11 @@ export class DiffProvider implements vscode.CodeLensProvider { for (const diffArea of diffAreas) { // if the change is fully within the diffArea, elongate it by the delta amount of newlines - if (change.startLine >= diffArea[startName] && change.endLine <= diffArea[endName]) { - diffArea[endName] += deltaNewlines + if (change.startLine >= diffArea[startLine] && change.endLine <= diffArea[endLine]) { + diffArea[endLine] += deltaNewlines } // check if the `diffArea` was fully deleted and remove it if so - if (diffArea[startName] > diffArea[endName]) { + if (diffArea[startLine] > diffArea[endLine]) { //remove it const index = diffAreas.findIndex(da => da === diffArea) diffAreas.splice(index, 1) @@ -146,9 +142,9 @@ export class DiffProvider implements vscode.CodeLensProvider { // if a diffArea is below the last character of the change, shift the diffArea up/down by the delta amount of newlines for (const diffArea of diffAreas) { - if (diffArea[startName] > change.endLine) { - diffArea[startName] += deltaNewlines - diffArea[endName] += deltaNewlines + if (diffArea[startLine] > change.endLine) { + diffArea[startLine] += deltaNewlines + diffArea[endLine] += deltaNewlines } } @@ -178,6 +174,9 @@ export class DiffProvider implements vscode.CodeLensProvider { // reset all diffs (we update them below) this._diffsOfDocument[docUriStr] = [] + // TODO!!!! + // vscode.languages.clearInlineDiffs(editor) + // for each diffArea for (const diffArea of diffAreas) { @@ -189,50 +188,30 @@ export class DiffProvider implements vscode.CodeLensProvider { const diffs = findDiffs(originalCode, currentCode) // add the diffs to `this._diffsOfDocument[docUriStr]` - this.createDiffs(editor.document.uri, diffs, diffArea) - - - // // print diffs - // console.log('!ORIGINAL FILE:', JSON.stringify(originalFile)) - // console.log('!NEW FILE :', JSON.stringify(editor.document.getText().replace(/\r\n/g, '\n'))) - // console.log('!AREA originalCode:', JSON.stringify(originalCode)) - // console.log('!AREA currentCode :', JSON.stringify(currentCode)) - // for (const diff of this._diffsOfDocument[docUriStr]) { - // console.log('------------') - // console.log('originalCode:', JSON.stringify(diff.originalCode)) - // console.log('currentCode:', JSON.stringify(diff.code)) - // console.log('originalRange:', diff.originalRange.start.line, diff.originalRange.end.line,) - // console.log('currentRange:', diff.range.start.line, diff.range.end.line,) - // } - - } - - - - // update green highlighting - editor.setDecorations( - greenDecoration, - (this._diffsOfDocument[docUriStr] - .filter(diff => diff.range !== undefined) - .map(diff => diff.range) - ) - ); - - // update red highlighting - // this._diffsOfDocument[docUriStr] - // .filter(diff => diff.originalCode !== '') - // .forEach(diff => { - // const text = originalFile.split('\n').slice(diff.originalRange.start.line, diff.originalRange.start.line + 1).join('\n') - // const height = text.split('\n').length - // const line = diff.range.start.line - 1 - // const inset = vscode.window.createWebviewTextEditorInset(editor, line, height); - // updateWebviewHTML(inset.webview, this._extensionUri, { jsOutLocation: 'dist/webviews/diffline/index.js', cssOutLocation: 'dist/webviews/styles.css' }, - // { text } - // ) + // if no diffs, set diffs to [] + if (!this._diffsOfDocument[docUriStr]) + this._diffsOfDocument[docUriStr] = [] + + // add each diff and its codelens to the document + for (let i = diffs.length - 1; i > -1; i -= 1) { + let suggestedDiff = diffs[i] + + this._diffsOfDocument[docUriStr].push({ + ...suggestedDiff, + diffid: this._diffidPool, + // originalCode: suggestedDiff.deletedText, + lenses: [ + new vscode.CodeLens(suggestedDiff.range, { title: 'Accept', command: 'void.acceptDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }), + new vscode.CodeLens(suggestedDiff.range, { title: 'Reject', command: 'void.rejectDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }) + ] + }); + vscode.languages.addInlineDiff(editor, suggestedDiff.originalCode, suggestedDiff.range) + this._diffidPool += 1 + } + } - // }) // for each diffArea, highlight its sweepIndex in dark gray editor.setDecorations( @@ -263,32 +242,6 @@ export class DiffProvider implements vscode.CodeLensProvider { } - // used by us only - public createDiffs(docUri: vscode.Uri, diffs: BaseDiff[], diffArea: DiffArea) { - - const docUriStr = docUri.toString() - - // if no diffs, set diffs to [] - if (!this._diffsOfDocument[docUriStr]) - this._diffsOfDocument[docUriStr] = [] - - // add each diff and its codelens to the document - for (let i = diffs.length - 1; i > -1; i -= 1) { - let suggestedDiff = diffs[i] - - this._diffsOfDocument[docUriStr].push({ - ...suggestedDiff, - diffid: this._diffidPool, - // originalCode: suggestedDiff.deletedText, - lenses: [ - new vscode.CodeLens(suggestedDiff.range, { title: 'Accept', command: 'void.acceptDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }), - new vscode.CodeLens(suggestedDiff.range, { title: 'Reject', command: 'void.rejectDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }) - ] - }); - this._diffidPool += 1 - } - - } // called on void.acceptDiff public async acceptDiff({ diffid, diffareaid }: { diffid: number, diffareaid: number }) { @@ -325,7 +278,7 @@ export class DiffProvider implements vscode.CodeLensProvider { this._originalFileOfDocument[docUriStr] = newOriginalLines.join('\n'); // Update diff areas based on the change - this.refreshDiffAreasModel(docUriStr, [{ + this.resizeDiffAreas(docUriStr, [{ text: changedLines.join('\n'), startLine: diff.originalRange.start.line, endLine: diff.originalRange.end.line @@ -398,13 +351,6 @@ export class DiffProvider implements vscode.CodeLensProvider { - - - - - - - async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { From 49072d43eac7654fce604f0ac2a67a3914e75da7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 3 Nov 2024 18:06:40 -0800 Subject: [PATCH 008/107] minor changes --- extensions/void/src/extension/DiffProvider.ts | 141 +----------------- .../browser/services/codeEditorService.ts | 1 + .../api/browser/mainThreadInlineDiff.ts | 74 ++++++++- 3 files changed, 77 insertions(+), 139 deletions(-) diff --git a/extensions/void/src/extension/DiffProvider.ts b/extensions/void/src/extension/DiffProvider.ts index f641b6374..853a544f8 100644 --- a/extensions/void/src/extension/DiffProvider.ts +++ b/extensions/void/src/extension/DiffProvider.ts @@ -102,8 +102,9 @@ export class DiffProvider implements vscode.CodeLensProvider { const diffAreas = this._diffAreasOfDocument[docUriStr] || [] - let endLine - let startLine + let endLine: 'originalEndLine' | 'endLine' + let startLine: 'originalStartLine' | 'startLine' + if (changesTo === 'originalFile') { endLine = 'originalEndLine' as const startLine = 'originalStartLine' as const @@ -291,11 +292,6 @@ export class DiffProvider implements vscode.CodeLensProvider { const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') const originalArea = newOriginalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - console.log('ACCEPT change', changedLines.join('\n'), diff.originalRange.start.line, diff.originalRange.end.line) - console.log('ACCEPT area lines', diffArea.startLine, diffArea.endLine, diffArea.originalStartLine, diffArea.originalEndLine) - console.log('ACCEPT currentArea', currentArea) - console.log('ACCEPT originalArea', originalArea) - if (originalArea === currentArea) { const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) this._diffAreasOfDocument[docUriStr].splice(index, 1) @@ -336,11 +332,6 @@ export class DiffProvider implements vscode.CodeLensProvider { const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') const originalArea = originalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - console.log('REJECT diff lines', diff.originalRange.start.line, diff.originalRange.end.line) - console.log('REJECT area lines', diffArea.startLine, diffArea.endLine, diffArea.originalStartLine, diffArea.originalEndLine) - console.log('REJECT currentArea', currentArea) - console.log('REJECT originalArea', originalArea) - if (originalArea === currentArea) { const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) this._diffAreasOfDocument[docUriStr].splice(index, 1) @@ -349,8 +340,6 @@ export class DiffProvider implements vscode.CodeLensProvider { this.refreshStylesAndDiffs(docUriStr) } - - async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { @@ -369,9 +358,6 @@ INSTRUCTIONS Please finish writing the new file by applying the diff to the original file. Return ONLY the completion of the file, without any explanation. ` - // ask LLM to rewrite file with diff (if there is significant matchup with the original file, we stop rewriting) - const START = new Date().getTime() - // make LLM complete the file to include the diff await new Promise((resolve, reject) => { sendLLMMessage({ @@ -397,9 +383,6 @@ Please finish writing the new file by applying the diff to the original file. Re }) }) - const END = new Date().getTime() - console.log('EDIT CHUNK time: ', END - START); - } @@ -465,121 +448,3 @@ Please finish writing the new file by applying the diff to the original file. Re - -/* -import * as vscode from 'vscode'; -import { SuggestedEdit } from './findDiffs'; - -const greenDecoration = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(0 255 51 / 0.2)', - isWholeLine: false, // after: { contentText: ' [original]', color: 'rgba(0 255 60 / 0.5)' } // hoverMessage: originalText // this applies to hovering over after:... -}) - - - - -export class DiffProvider { - - originalCodeOfDocument: { [docUri: string]: string } - - diffsOfDocument: { - [docUri: string]: { - startLine, - startCol, - endLine, - endCol, - originalText, - - inset, - diffid, - } - } - - // sweep - currentLine: { [docUri: string]: undefined | number } - weAreEditing: boolean = false - - - constructor() { - - vscode.workspace.onDidChangeTextDocument((e) => { - // on user change, grow/shrink/merge/delete diff AREAS - // you dont have to do anything to the diffs here bc they all get recomputed in refresh() - // user changes only get highlighted if theyre in a diffarea - - // go thru all diff areas and adjust line numbers based on the user's change - - - this.refreshStyles(e.document.uri.toString()) - }) - - } - - - - // refreshes styles on page - refreshStyles(docUriStr: string) { - - if (this.weAreEditing) return - - // recompute all diffs on the page - // run inset.dispose() on all diffs - - // original and current code -> diffs - // originalCodeOfDocument[docUriStr] - - // create new diffs - const inset = vscode.window.createWebviewTextEditorInset(editor, lineStart, height, {}) - inset.webview.html = ` - - Hello World! - - `; - - } - - // called on void.acceptDiff - public async acceptDiff({ diffid }: { diffid: number }) { - - // update original based on the diff - // refresh() - - } - - - // called on void.rejectDiff - public async rejectDiff({ diffid }: { diffid: number }) { - - // get diffs[diffid] - - // revert current file based on diff - // refresh() - - } - - - - - // sweep - initializeSweep({ startLine }) { - // reject all diffs on the page - // store original code - // currentLine=start of sweep - } - - onUpdateSweep(addedText) { - // update final - // refresh() ? - // currentLine += number of newlines in addedText - } - - onAbortSweep() { - - } - - - -} - - -*/ diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index 733018fae..b6d66c2cc 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + import { Event } from '../../../base/common/event.js'; import { ICodeEditor, IDiffEditor } from '../editorBrowser.js'; import { IDecorationRenderOptions } from '../../common/editorCommon.js'; diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index 4ca7731c9..38c43bf6e 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -8,6 +8,8 @@ import { IInlineDiffService } from '../../../editor/browser/services/inlineDiffS import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; import { IRange } from '../../../editor/common/core/range.js'; import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; +import { IUndoRedoElement, IUndoRedoService, UndoRedoElementType, UndoRedoGroup } from '../../../platform/undoRedo/common/undoRedo.js'; +import { URI } from '../../../base/common/uri.js'; // import { IHistoryService } from '../../services/history/common/history.js'; @@ -22,12 +24,82 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline context: IExtHostContext, @IInlineDiffService private readonly _inlineDiff: IInlineDiffService, @ICodeEditorService private readonly _editorService: ICodeEditorService, - // @IHistoryService private readonly _historyService: IHistoryService, + // @IHistoryService private readonly _historyService: IHistoryService, // history service is the history of pressing alt left/right + @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, // undoRedo service is the history of pressing ctrl+z + ) { super(); + // this._proxy = context.getProxy(ExtHostContext.ExtHostEditorInsets); // this._wcHistoryService.addEntry() + } + + _streamingState: 'streaming' | 'idle' = 'idle' + + startStreaming(editor: ICodeEditor) { + + this._streamingState = 'streaming' + + // count all changes towards the group + + + // const versionId = editor.getModel()?.getVersionId() + + this._register(editor.onDidChangeModelContent((e) => { + + + // user presses undo (and there is something to undo) + if (e.isUndoing) { + // cancel the stream, then undo normally + return + } + // user presses redo (and there is something to redo) + if (e.isRedoing) { + // cancel the stream, then redo normally + return + + } + + // for good measure + if (e.isEolChange) { + // cancel stream and apply change normally + return + } + + // ignore any other kind of change (make it not happen) + if (this._streamingState === 'streaming') { + // completely ignore the change + return + } + + + })); + + // streamChange(){ + + // } + + + + // all changes made when streaming should be a part of the group so we can undo them all together + const group = new UndoRedoGroup() + + const elt: IUndoRedoElement = { + type: UndoRedoElementType.Resource, + resource: URI.parse('file:///path/to/file.txt'), + label: 'Add Diffs', + code: 'undoredo.inlineDiff', + undo: () => { + + // reapply diffareas and diffs here + }, + redo: () => { + + // reapply diffareas and diffs here + } + } + this._undoRedoService.pushElement(elt, group) } From 6c93028ce316645a582b4f111243726af92353d4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 3 Nov 2024 19:39:57 -0800 Subject: [PATCH 009/107] misc --- extensions/void/package-lock.json | 8 -------- .../void/src/webviews/common/{posthog.tsx => posthog.ts} | 0 2 files changed, 8 deletions(-) rename extensions/void/src/webviews/common/{posthog.tsx => posthog.ts} (100%) diff --git a/extensions/void/package-lock.json b/extensions/void/package-lock.json index e5e2b52fb..e79e69b01 100644 --- a/extensions/void/package-lock.json +++ b/extensions/void/package-lock.json @@ -6016,14 +6016,6 @@ "node": ">=10" } }, - "node_modules/monaco-editor": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.0.tgz", - "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/extensions/void/src/webviews/common/posthog.tsx b/extensions/void/src/webviews/common/posthog.ts similarity index 100% rename from extensions/void/src/webviews/common/posthog.tsx rename to extensions/void/src/webviews/common/posthog.ts From 83b95477014f38edfcd223a73123868ca5d77c6f Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Tue, 5 Nov 2024 18:38:30 -0800 Subject: [PATCH 010/107] add compilation of openai so we can use it internally --- .../inlineDiffService/inlineDiffService.ts | 1 - .../inlineDiffService/sendLLMMessage.ts | 365 --- .../api/browser/mainThreadInlineDiff.ts | 2 + .../workbench/contrib/void/browser/.gitignore | 1 + src/vs/workbench/workbench.common.main.ts | 7 + void-imports/build-index.mjs | 20 + void-imports/package-lock.json | 2081 +++++++++++++++++ void-imports/package.json | 18 + void-imports/void-imports.js | 5 + 9 files changed, 2134 insertions(+), 366 deletions(-) delete mode 100644 src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts create mode 100644 src/vs/workbench/contrib/void/browser/.gitignore create mode 100755 void-imports/build-index.mjs create mode 100644 void-imports/package-lock.json create mode 100644 void-imports/package.json create mode 100644 void-imports/void-imports.js diff --git a/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts index 8666a1644..d49ed2b4d 100644 --- a/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts +++ b/src/vs/editor/browser/services/inlineDiffService/inlineDiffService.ts @@ -5,7 +5,6 @@ import { IModelDeltaDecoration } from '../../../common/model.js'; import { ICodeEditor, IViewZone } from '../../editorBrowser.js'; import { IRange } from '../../../common/core/range.js'; import { EditorOption } from '../../../common/config/editorOptions.js'; -// import { sendLLMMessage } from './sendLLMMessage.js'; export interface IInlineDiffService { readonly _serviceBrand: undefined; diff --git a/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts b/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts deleted file mode 100644 index 3bf99b114..000000000 --- a/src/vs/editor/browser/services/inlineDiffService/sendLLMMessage.ts +++ /dev/null @@ -1,365 +0,0 @@ -// import Anthropic from '@anthropic-ai/sdk'; -// import OpenAI from 'openai'; -// import { Ollama } from 'ollama' -// import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; -// import { VoidConfig } from '../webviews/common/contextForConfig' - -// export type AbortRef = { current: (() => void) | null } - -// export type OnText = (newText: string, fullText: string) => void - -// export type OnFinalMessage = (input: string) => void - -// export type LLMMessageAnthropic = { -// role: 'user' | 'assistant'; -// content: string; -// } - -// export type LLMMessage = { -// role: 'system' | 'user' | 'assistant'; -// content: string; -// } - -// type SendLLMMessageFnTypeInternal = (params: { -// messages: LLMMessage[]; -// onText: OnText; -// onFinalMessage: OnFinalMessage; -// onError: (error: string) => void; -// voidConfig: VoidConfig; -// abortRef: AbortRef; -// }) => void - -// type SendLLMMessageFnTypeExternal = (params: { -// messages: LLMMessage[]; -// onText: OnText; -// onFinalMessage: (fullText: string) => void; -// onError: (error: string) => void; -// voidConfig: VoidConfig | null; -// abortRef: AbortRef; -// }) => void - -// const parseMaxTokensStr = (maxTokensStr: string) => { -// // parse the string but only if the full string is a valid number, eg parseInt('100abc') should return NaN -// const int = isNaN(Number(maxTokensStr)) ? undefined : parseInt(maxTokensStr) -// if (Number.isNaN(int)) -// return undefined -// return int -// } - -// // Anthropic -// const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig }) => { - -// const anthropic = new Anthropic({ apiKey: voidConfig.anthropic.apikey, dangerouslyAllowBrowser: true }); // defaults to process.env["ANTHROPIC_API_KEY"] - -// // find system messages and concatenate them -// const systemMessage = messages -// .filter(msg => msg.role === 'system') -// .map(msg => msg.content) -// .join('\n'); - -// // remove system messages for Anthropic -// const anthropicMessages = messages.filter(msg => msg.role !== 'system') as LLMMessageAnthropic[] - -// const stream = anthropic.messages.stream({ -// system: systemMessage, -// messages: anthropicMessages, -// model: voidConfig.anthropic.model, -// max_tokens: parseMaxTokensStr(voidConfig.default.maxTokens)!, // this might be undefined, but it will just throw an error for the user -// }); - -// let did_abort = false - -// // when receive text -// stream.on('text', (newText, fullText) => { -// if (did_abort) return -// onText(newText, fullText) -// }) - -// // when we get the final message on this stream (or when error/fail) -// stream.on('finalMessage', (claude_response) => { -// if (did_abort) return -// // stringify the response's content -// const content = claude_response.content.map(c => c.type === 'text' ? c.text : c.type).join('\n'); -// onFinalMessage(content) -// }) - -// stream.on('error', (error) => { -// // the most common error will be invalid API key (401), so we handle this with a nice message -// if (error instanceof Anthropic.APIError && error.status === 401) { -// onError('Invalid API key.') -// } -// else { -// onError(error.message) -// } -// }) - -// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either -// const abort = () => { -// did_abort = true -// stream.controller.abort() // TODO need to test this to make sure it works, it might throw an error -// } - -// return { abort } -// }; - -// // Gemini -// const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { - -// let didAbort = false -// let fullText = '' - -// abortRef.current = () => { -// didAbort = true -// } - -// const genAI = new GoogleGenerativeAI(voidConfig.gemini.apikey); -// const model = genAI.getGenerativeModel({ model: voidConfig.gemini.model }); - -// // remove system messages that get sent to Gemini -// // str of all system messages -// const systemMessage = messages -// .filter(msg => msg.role === 'system') -// .map(msg => msg.content) -// .join('\n'); - -// // Convert messages to Gemini format -// const geminiMessages: Content[] = messages -// .filter(msg => msg.role !== 'system') -// .map((msg, i) => ({ -// parts: [{ text: msg.content }], -// role: msg.role === 'assistant' ? 'model' : 'user' -// })) - -// model.generateContentStream({ contents: geminiMessages, systemInstruction: systemMessage, }) -// .then(async response => { -// abortRef.current = () => { -// // response.stream.return(fullText) -// didAbort = true; -// } -// for await (const chunk of response.stream) { -// if (didAbort) return; -// const newText = chunk.text(); -// fullText += newText; -// onText(newText, fullText); -// } -// onFinalMessage(fullText); -// }) -// .catch((error) => { -// if (error instanceof GoogleGenerativeAIFetchError) { -// if (error.status === 400) { -// onError('Invalid API key.'); -// } -// else { -// onError(`${error.name}:\n${error.message}`); -// } -// } -// else { -// onError(error); -// } -// }) -// } - -// // OpenAI, OpenRouter, OpenAICompatible -// const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { - -// let didAbort = false -// let fullText = '' - -// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either -// abortRef.current = () => { -// didAbort = true; -// }; - -// let openai: OpenAI -// let options: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming - -// const maxTokens = parseMaxTokensStr(voidConfig.default.maxTokens) - -// if (voidConfig.default.whichApi === 'openAI') { -// openai = new OpenAI({ apiKey: voidConfig.openAI.apikey, dangerouslyAllowBrowser: true }); -// options = { model: voidConfig.openAI.model, messages: messages, stream: true, max_completion_tokens: maxTokens } -// } -// else if (voidConfig.default.whichApi === 'openRouter') { -// openai = new OpenAI({ -// baseURL: 'https://openrouter.ai/api/v1', apiKey: voidConfig.openRouter.apikey, dangerouslyAllowBrowser: true, -// defaultHeaders: { -// 'HTTP-Referer': 'https://voideditor.com', // Optional, for including your app on openrouter.ai rankings. -// 'X-Title': 'Void Editor', // Optional. Shows in rankings on openrouter.ai. -// }, -// }); -// options = { model: voidConfig.openRouter.model, messages: messages, stream: true, max_completion_tokens: maxTokens } -// } -// else if (voidConfig.default.whichApi === 'openAICompatible') { -// openai = new OpenAI({ baseURL: voidConfig.openAICompatible.endpoint, apiKey: voidConfig.openAICompatible.apikey, dangerouslyAllowBrowser: true }) -// options = { model: voidConfig.openAICompatible.model, messages: messages, stream: true, max_completion_tokens: maxTokens } -// } -// else { -// console.error(`sendOpenAIMsg: invalid whichApi: ${voidConfig.default.whichApi}`) -// throw new Error(`voidConfig.whichAPI was invalid: ${voidConfig.default.whichApi}`) -// } - -// openai.chat.completions -// .create(options) -// .then(async response => { -// abortRef.current = () => { -// // response.controller.abort() -// didAbort = true; -// } -// // when receive text -// for await (const chunk of response) { -// if (didAbort) return; -// const newText = chunk.choices[0]?.delta?.content || ''; -// fullText += newText; -// onText(newText, fullText); -// } -// onFinalMessage(fullText); -// }) -// // when error/fail - this catches errors of both .create() and .then(for await) -// .catch(error => { -// if (error instanceof OpenAI.APIError) { -// if (error.status === 401) { -// onError('Invalid API key.'); -// } -// else { -// onError(`${error.name}:\n${error.message}`); -// } -// } -// else { -// onError(error); -// } -// }) - -// }; - -// // Ollama -// export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { - -// let didAbort = false -// let fullText = '' - -// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either -// abortRef.current = () => { -// didAbort = true; -// }; - -// const ollama = new Ollama({ host: voidConfig.ollama.endpoint }) - -// ollama.chat({ -// model: voidConfig.ollama.model, -// messages: messages, -// stream: true, -// options: { num_predict: parseMaxTokensStr(voidConfig.default.maxTokens) } // this is max_tokens -// }) -// .then(async stream => { -// abortRef.current = () => { -// // stream.abort() -// didAbort = true -// } -// // iterate through the stream -// for await (const chunk of stream) { -// if (didAbort) return; -// const newText = chunk.message.content; -// fullText += newText; -// onText(newText, fullText); -// } -// onFinalMessage(fullText); - -// }) -// // when error/fail -// .catch(error => { -// onError(error) -// }) - -// }; - -// // Greptile -// // https://docs.greptile.com/api-reference/query -// // https://docs.greptile.com/quickstart#sample-response-streamed - -// const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { - -// let didAbort = false -// let fullText = '' - -// // if abort is called, onFinalMessage is NOT called, and no later onTexts are called either -// abortRef.current = () => { -// didAbort = true -// } - -// fetch('https://api.greptile.com/v2/query', { -// method: 'POST', -// headers: { -// 'Authorization': `Bearer ${voidConfig.greptile.apikey}`, -// 'X-Github-Token': `${voidConfig.greptile.githubPAT}`, -// 'Content-Type': `application/json`, -// }, -// body: JSON.stringify({ -// messages, -// stream: true, -// repositories: [voidConfig.greptile.repoinfo], -// }), -// }) -// // this is {message}\n{message}\n{message}...\n -// .then(async response => { -// const text = await response.text() -// console.log('got greptile', text) -// return JSON.parse(`[${text.trim().split('\n').join(',')}]`) -// }) -// // TODO make this actually stream, right now it just sends one message at the end -// .then(async responseArr => { -// if (didAbort) -// return - -// for (const response of responseArr) { - -// const type: string = response['type'] -// const message = response['message'] - -// // when receive text -// if (type === 'message') { -// fullText += message -// onText(message, fullText) -// } -// else if (type === 'sources') { -// const { filepath, linestart: _, lineend: _2 } = message as { filepath: string; linestart: number | null; lineend: number | null } -// fullText += filepath -// onText(filepath, fullText) -// } -// // type: 'status' with an empty 'message' means last message -// else if (type === 'status') { -// if (!message) { -// onFinalMessage(fullText) -// } -// } -// } - -// }) -// .catch(e => { -// onError(e) -// }); - -// } - -// export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }) => { -// if (!voidConfig) return; - -// // trim message content (Anthropic and other providers give an error if there is trailing whitespace) -// messages = messages.map(m => ({ ...m, content: m.content.trim() })) - -// switch (voidConfig.default.whichApi) { -// case 'anthropic': -// return sendAnthropicMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); -// case 'openAI': -// case 'openRouter': -// case 'openAICompatible': -// return sendOpenAIMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); -// case 'gemini': -// return sendGeminiMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); -// case 'ollama': -// return sendOllamaMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); -// case 'greptile': -// return sendGreptileMsg({ messages, onText, onFinalMessage, onError, voidConfig, abortRef }); -// default: -// onError(`Error: whichApi was ${voidConfig.default.whichApi}, which is not recognized!`) -// } -// } diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index 38c43bf6e..d92dfb8e9 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -11,7 +11,9 @@ import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions import { IUndoRedoElement, IUndoRedoService, UndoRedoElementType, UndoRedoGroup } from '../../../platform/undoRedo/common/undoRedo.js'; import { URI } from '../../../base/common/uri.js'; // import { IHistoryService } from '../../services/history/common/history.js'; +// import { openai } from '../../contrib/void/browser/out/void-imports.js' +// console.log('openai', openai) @extHostNamedCustomer(MainContext.MainThreadInlineDiff) diff --git a/src/vs/workbench/contrib/void/browser/.gitignore b/src/vs/workbench/contrib/void/browser/.gitignore new file mode 100644 index 000000000..89f9ac04a --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/.gitignore @@ -0,0 +1 @@ +out/ diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index 285fea2c5..30e4ecc92 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -13,6 +13,13 @@ import './browser/workbench.contribution.js'; //#endregion + +//#region --- void +// Void added this: +import './contrib/void/browser/void.contribution.js'; +//#endregion + + //#region --- workbench actions import './browser/actions/textInputActions.js'; diff --git a/void-imports/build-index.mjs b/void-imports/build-index.mjs new file mode 100755 index 000000000..ee90ea650 --- /dev/null +++ b/void-imports/build-index.mjs @@ -0,0 +1,20 @@ +import tsup from 'tsup' + +tsup.build({ + entry: [`void-imports.js`], + format: ['esm'], + sourcemap: false, + bundle: true, + clean: true, + minify: true, + outDir: '../src/vs/workbench/contrib/void/browser/out', + dts: false, + name: 'void-imports', + noExternal: [/.*/], // This bundles everything + platform: 'browser', // Important for browser compatibility + target: 'es2020', + // banner: { + // js: '/* eslint-disable */' + // } +}) + diff --git a/void-imports/package-lock.json b/void-imports/package-lock.json new file mode 100644 index 000000000..93f46f8b9 --- /dev/null +++ b/void-imports/package-lock.json @@ -0,0 +1,2081 @@ +{ + "name": "void-imports", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "void-imports", + "version": "1.0.0", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "openai": "^4.71.0" + }, + "devDependencies": { + "tsup": "^8.3.5", + "typescript": "^5.6.3" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", + "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz", + "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz", + "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", + "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz", + "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz", + "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz", + "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz", + "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz", + "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz", + "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz", + "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz", + "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz", + "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz", + "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz", + "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz", + "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz", + "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz", + "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz", + "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bundle-require": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", + "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/openai": { + "version": "4.71.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.71.0.tgz", + "integrity": "sha512-jeJ7+6cZvj+ZbIsbX/Ag8+pug2+vjKbrD/v3Hwp6uv3KZyWjSkZa5MdUshzpNC3jsFzakfbUhEEFQXsKWNgm/g==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz", + "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.4", + "@rollup/rollup-android-arm64": "4.24.4", + "@rollup/rollup-darwin-arm64": "4.24.4", + "@rollup/rollup-darwin-x64": "4.24.4", + "@rollup/rollup-freebsd-arm64": "4.24.4", + "@rollup/rollup-freebsd-x64": "4.24.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", + "@rollup/rollup-linux-arm-musleabihf": "4.24.4", + "@rollup/rollup-linux-arm64-gnu": "4.24.4", + "@rollup/rollup-linux-arm64-musl": "4.24.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", + "@rollup/rollup-linux-riscv64-gnu": "4.24.4", + "@rollup/rollup-linux-s390x-gnu": "4.24.4", + "@rollup/rollup-linux-x64-gnu": "4.24.4", + "@rollup/rollup-linux-x64-musl": "4.24.4", + "@rollup/rollup-win32-arm64-msvc": "4.24.4", + "@rollup/rollup-win32-ia32-msvc": "4.24.4", + "@rollup/rollup-win32-x64-msvc": "4.24.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/source-map/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/source-map/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/void-imports/package.json b/void-imports/package.json new file mode 100644 index 000000000..6e14f7659 --- /dev/null +++ b/void-imports/package.json @@ -0,0 +1,18 @@ +{ + "name": "void-imports", + "main": "index.js", + "type": "module", + "scripts": { + "build": "node build-index.mjs" + }, + "author": "", + "description": "", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "openai": "^4.71.0" + }, + "devDependencies": { + "tsup": "^8.3.5", + "typescript": "^5.6.3" + } +} diff --git a/void-imports/void-imports.js b/void-imports/void-imports.js new file mode 100644 index 000000000..34dfbc8eb --- /dev/null +++ b/void-imports/void-imports.js @@ -0,0 +1,5 @@ + + +export { default as openai } from 'openai' +export { default as anthropicAiSdk } from '@anthropic-ai/sdk' + From 75f97ea9e1b565e3e60f3349887a9e8c8f8535a1 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Tue, 5 Nov 2024 18:47:40 -0800 Subject: [PATCH 011/107] update streaming state --- .../api/browser/mainThreadInlineDiff.ts | 96 +++++++++---------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts index d92dfb8e9..344458f92 100644 --- a/src/vs/workbench/api/browser/mainThreadInlineDiff.ts +++ b/src/vs/workbench/api/browser/mainThreadInlineDiff.ts @@ -9,11 +9,9 @@ import { ICodeEditor } from '../../../editor/browser/editorBrowser.js'; import { IRange } from '../../../editor/common/core/range.js'; import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js'; import { IUndoRedoElement, IUndoRedoService, UndoRedoElementType, UndoRedoGroup } from '../../../platform/undoRedo/common/undoRedo.js'; -import { URI } from '../../../base/common/uri.js'; +import { IBulkEditService } from '../../../editor/browser/services/bulkEditService.js'; +import { WorkspaceEdit } from '../../../editor/common/languages.js'; // import { IHistoryService } from '../../services/history/common/history.js'; -// import { openai } from '../../contrib/void/browser/out/void-imports.js' - -// console.log('openai', openai) @extHostNamedCustomer(MainContext.MainThreadInlineDiff) @@ -28,6 +26,7 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline @ICodeEditorService private readonly _editorService: ICodeEditorService, // @IHistoryService private readonly _historyService: IHistoryService, // history service is the history of pressing alt left/right @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, // undoRedo service is the history of pressing ctrl+z + @IBulkEditService private readonly _bulkEditService: IBulkEditService, ) { super(); @@ -36,72 +35,69 @@ export class MainThreadInlineDiff extends Disposable implements MainThreadInline // this._wcHistoryService.addEntry() } - _streamingState: 'streaming' | 'idle' = 'idle' - - startStreaming(editor: ICodeEditor) { - - this._streamingState = 'streaming' - - // count all changes towards the group - + _streamingState: { type: 'streaming'; editGroup: UndoRedoGroup } | { type: 'idle' } = { type: 'idle' } - // const versionId = editor.getModel()?.getVersionId() + startStreaming(editorId: string) { + const editor = this._getEditor(editorId) + if (!editor) return - this._register(editor.onDidChangeModelContent((e) => { + const model = editor.getModel() + if (!model) return + // all changes made when streaming should be a part of the group so we can undo them all together + this._streamingState = { + type: 'streaming', + editGroup: new UndoRedoGroup() + } - // user presses undo (and there is something to undo) - if (e.isUndoing) { - // cancel the stream, then undo normally - return - } - // user presses redo (and there is something to redo) - if (e.isRedoing) { - // cancel the stream, then redo normally - return + // TODO probably need to convert this to a stack + const diffsSnapshotBefore = { placeholder: '' } + const diffsSnapshotAfter = { placeholder: '' } + const elt: IUndoRedoElement = { + type: UndoRedoElementType.Resource, + resource: model.uri, + label: 'Add Diffs', + code: 'undoredo.inlineDiff', + undo: () => { + // reapply diffareas and diffs here + console.log('reverting diffareas...', diffsSnapshotBefore.placeholder) + }, + redo: () => { + // reapply diffareas and diffs here + // when done, need to record diffSnapshotAfter + console.log('re-applying diffareas...', diffsSnapshotAfter.placeholder) } + } - // for good measure - if (e.isEolChange) { - // cancel stream and apply change normally - return - } + this._undoRedoService.pushElement(elt, this._streamingState.editGroup) - // ignore any other kind of change (make it not happen) - if (this._streamingState === 'streaming') { - // completely ignore the change - return - } + // ---------- START ---------- + editor.updateOptions({ readOnly: true }) - })); - // streamChange(){ + // ---------- WHEN DONE ---------- + editor.updateOptions({ readOnly: false }) - // } + } - // all changes made when streaming should be a part of the group so we can undo them all together - const group = new UndoRedoGroup() - const elt: IUndoRedoElement = { - type: UndoRedoElementType.Resource, - resource: URI.parse('file:///path/to/file.txt'), - label: 'Add Diffs', - code: 'undoredo.inlineDiff', - undo: () => { - // reapply diffareas and diffs here - }, - redo: () => { + streamChange(editorId: string, edit: WorkspaceEdit) { + const editor = this._getEditor(editorId) + if (!editor) return - // reapply diffareas and diffs here - } + if (this._streamingState.type !== 'streaming') { + console.error('Expected streamChange to be in state \'streaming\'.') + return } - this._undoRedoService.pushElement(elt, group) + // count all changes towards the group + this._bulkEditService.apply(edit, { undoRedoGroupId: this._streamingState.editGroup.id, }) + } From 4a629be2e2526dfca0b482584b7184a9f0914c9a Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Tue, 5 Nov 2024 23:41:55 -0800 Subject: [PATCH 012/107] add build script hack --- build/npm/dirs.js | 7 +++++-- build/npm/postinstall.js | 18 ++++++++++++++++++ void-imports/build-index.mjs | 2 +- void-imports/package-lock.json | 1 - 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/build/npm/dirs.js b/build/npm/dirs.js index bd3325024..cb0267852 100644 --- a/build/npm/dirs.js +++ b/build/npm/dirs.js @@ -7,8 +7,6 @@ const fs = require('fs'); // Complete list of directories where npm should be executed to install node modules const dirs = [ - 'extensions/void', // <-- Void - '', 'build', 'extensions', @@ -55,6 +53,11 @@ const dirs = [ 'test/smoke', '.vscode/extensions/vscode-selfhost-import-aid', '.vscode/extensions/vscode-selfhost-test-provider', + + // Void added these: + 'extensions/void', + 'void-imports', + ]; if (fs.existsSync(`${__dirname}/../../.build/distro/npm`)) { diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index e38c2cb00..f36c0ac83 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -139,3 +139,21 @@ for (let dir of dirs) { cp.execSync('git config pull.rebase merges'); cp.execSync('git config blame.ignoreRevsFile .git-blame-ignore-revs'); + + +// Void added this (inject void-imports into project): +const buildVoidImports = () => { + console.log('\n\nVoid is injecting void-imports...') + cp.execSync(`npm install`, { // this goes here, not in postinstall, because we need to + env: process.env, + cwd: path.join(__dirname, '..', '..', '/void-imports'), + stdio: 'inherit' + }); + cp.execSync(`node build-index.mjs`, { + env: process.env, + cwd: path.join(__dirname, '..', '..', '/void-imports'), + stdio: 'inherit' + }); + console.log('Done injecting void-imports.') +} +buildVoidImports() diff --git a/void-imports/build-index.mjs b/void-imports/build-index.mjs index ee90ea650..11aa38eee 100755 --- a/void-imports/build-index.mjs +++ b/void-imports/build-index.mjs @@ -6,7 +6,7 @@ tsup.build({ sourcemap: false, bundle: true, clean: true, - minify: true, + // minify: true, // no need to minify since it all gets bundled later outDir: '../src/vs/workbench/contrib/void/browser/out', dts: false, name: 'void-imports', diff --git a/void-imports/package-lock.json b/void-imports/package-lock.json index 93f46f8b9..7ac4c36ae 100644 --- a/void-imports/package-lock.json +++ b/void-imports/package-lock.json @@ -6,7 +6,6 @@ "packages": { "": { "name": "void-imports", - "version": "1.0.0", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", "openai": "^4.71.0" From ada31ccf90119d9012e27ab4ae2a6f8159ab164c Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 01:41:26 -0800 Subject: [PATCH 013/107] update build to work in general --- src/tsconfig.json | 2 + .../workbench/contrib/void/browser/.gitignore | 2 +- .../contrib/void/browser/void.contribution.ts | 2 + void-imports/.gitignore | 1 + void-imports/build-index.mjs | 62 ++++++++++++++----- void-imports/package-lock.json | 56 ++++++++++++++++- void-imports/package.json | 4 +- void-imports/void-imports.js | 5 -- 8 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 void-imports/.gitignore delete mode 100644 void-imports/void-imports.js diff --git a/src/tsconfig.json b/src/tsconfig.json index 88514beab..9510dc9df 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { + "jsx": "react", // <-- Void added this "esModuleInterop": true, "removeComments": false, "preserveConstEnums": true, @@ -50,6 +51,7 @@ "./vs/workbench/contrib/issue/electron-sandbox/issueReporter.js", "./typings", "./vs/**/*.ts", + "./vs/**/*.tsx", // <-- Void added this "vscode-dts/vscode.proposed.*.d.ts", "vscode-dts/vscode.d.ts" ] diff --git a/src/vs/workbench/contrib/void/browser/.gitignore b/src/vs/workbench/contrib/void/browser/.gitignore index 89f9ac04a..849ddff3b 100644 --- a/src/vs/workbench/contrib/void/browser/.gitignore +++ b/src/vs/workbench/contrib/void/browser/.gitignore @@ -1 +1 @@ -out/ +dist/ diff --git a/src/vs/workbench/contrib/void/browser/void.contribution.ts b/src/vs/workbench/contrib/void/browser/void.contribution.ts index eff8132e7..66a1ea304 100644 --- a/src/vs/workbench/contrib/void/browser/void.contribution.ts +++ b/src/vs/workbench/contrib/void/browser/void.contribution.ts @@ -17,6 +17,8 @@ import { ViewPaneContainer } from '../../../../workbench/browser/parts/views/vie import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js'; +import * as React from './dist/openai.js' +console.log('React', React) const voidViewIcon = registerIcon('void-view-icon', Codicon.search, localize('voidViewIcon', 'View icon of the Void chat view.')); diff --git a/void-imports/.gitignore b/void-imports/.gitignore new file mode 100644 index 000000000..c696023c5 --- /dev/null +++ b/void-imports/.gitignore @@ -0,0 +1 @@ +to_be_built/ diff --git a/void-imports/build-index.mjs b/void-imports/build-index.mjs index 11aa38eee..58d4ffbd1 100755 --- a/void-imports/build-index.mjs +++ b/void-imports/build-index.mjs @@ -1,20 +1,48 @@ import tsup from 'tsup' +import * as fs from 'fs' +import * as path from 'path' -tsup.build({ - entry: [`void-imports.js`], - format: ['esm'], - sourcemap: false, - bundle: true, - clean: true, - // minify: true, // no need to minify since it all gets bundled later - outDir: '../src/vs/workbench/contrib/void/browser/out', - dts: false, - name: 'void-imports', - noExternal: [/.*/], // This bundles everything - platform: 'browser', // Important for browser compatibility - target: 'es2020', - // banner: { - // js: '/* eslint-disable */' - // } -}) +const buildFiles = (imports, to_be_built_folder) => { + // create a file with name importName that imports importName and immediately re-exports it + for (const importName of imports) { + const content = `\ +export { default } from '${importName}' +export * from '${importName}' +` + const dir = path.dirname(importName); + const file = path.basename(importName); + + const fullPath = path.join(to_be_built_folder, dir, `${file}.ts`); + + // Create all necessary directories before writing the file + fs.mkdirSync(path.dirname(fullPath), { recursive: true }); + fs.writeFileSync(fullPath, content, 'utf8'); + } +} + +const compileFiles = async (imports, to_be_built_folder, outDir) => { + const fileEntries = imports.map((importName) => path.join(to_be_built_folder, `${importName}.ts`)) + await tsup.build({ + entry: fileEntries, + format: ['esm'], + sourcemap: false, + bundle: true, + clean: true, + // minify: true, // no need to minify since it all gets bundled later + outDir: path.join(outDir), + dts: false, + noExternal: [/.*/], // This bundles everything + platform: 'browser', // Important for browser compatibility + target: 'es2020', + }) +} + +const to_be_built_folder = 'to_be_built' +fs.rmSync(to_be_built_folder, { recursive: true, force: true }); + +const imports = ['openai', '@anthropic-ai/sdk', 'react', 'react-dom'] +buildFiles(imports, to_be_built_folder) + +const OUT_DIR = '../src/vs/workbench/contrib/void/browser/dist' +compileFiles(imports, to_be_built_folder, OUT_DIR) diff --git a/void-imports/package-lock.json b/void-imports/package-lock.json index 7ac4c36ae..eb4a06548 100644 --- a/void-imports/package-lock.json +++ b/void-imports/package-lock.json @@ -8,7 +8,9 @@ "name": "void-imports", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", - "openai": "^4.71.0" + "openai": "^4.71.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { "tsup": "^8.3.5", @@ -1230,6 +1232,12 @@ "node": ">=10" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, "node_modules/lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", @@ -1267,6 +1275,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1531,6 +1551,31 @@ "node": ">=6" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/readdirp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", @@ -1593,6 +1638,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/void-imports/package.json b/void-imports/package.json index 6e14f7659..a3fd576bd 100644 --- a/void-imports/package.json +++ b/void-imports/package.json @@ -9,7 +9,9 @@ "description": "", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", - "openai": "^4.71.0" + "openai": "^4.71.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { "tsup": "^8.3.5", diff --git a/void-imports/void-imports.js b/void-imports/void-imports.js deleted file mode 100644 index 34dfbc8eb..000000000 --- a/void-imports/void-imports.js +++ /dev/null @@ -1,5 +0,0 @@ - - -export { default as openai } from 'openai' -export { default as anthropicAiSdk } from '@anthropic-ai/sdk' - From 2814c63765279b0cca7608de8410e044747c7229 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 16:01:59 -0800 Subject: [PATCH 014/107] drag and drop extension into main --- .../vs/workbench/contrib/void/browser}/void/.eslintrc | 0 .../vs/workbench/contrib/void/browser}/void/.gitignore | 0 .../vs/workbench/contrib/void/browser}/void/.vscode-test.mjs | 0 .../workbench/contrib/void/browser}/void/.vscode/extensions.json | 0 .../vs/workbench/contrib/void/browser}/void/.vscode/launch.json | 0 .../vs/workbench/contrib/void/browser}/void/.vscode/settings.json | 0 .../vs/workbench/contrib/void/browser}/void/.vscode/tasks.json | 0 .../vs/workbench/contrib/void/browser}/void/.vscodeignore | 0 .../vs/workbench/contrib/void/browser}/void/README.md | 0 .../vs/workbench/contrib/void/browser}/void/build/build.js | 0 .../vs/workbench/contrib/void/browser}/void/package-lock.json | 0 .../vs/workbench/contrib/void/browser}/void/package.json | 0 .../contrib/void/browser}/void/src/common/sendLLMMessage.ts | 0 .../contrib/void/browser}/void/src/common/shared_types.ts | 0 .../contrib/void/browser}/void/src/common/systemPrompts.ts | 0 .../contrib/void/browser}/void/src/extension/DiffProvider.ts | 0 .../contrib/void/browser}/void/src/extension/applyDiffLazily.ts | 0 .../workbench/contrib/void/browser}/void/src/extension/ctrlK.ts | 0 .../contrib/void/browser}/void/src/extension/extension.ts | 0 .../void/src/extension/extensionLib/readFileContentOfUri.ts | 0 .../browser}/void/src/extension/extensionLib/updateWebviewHTML.ts | 0 .../contrib/void/browser}/void/src/extension/findDiffs.ts | 0 .../browser}/void/src/extension/providers/CtrlKWebviewProvider.ts | 0 .../void/src/extension/providers/SidebarWebviewProvider.ts | 0 .../contrib/void/browser}/void/src/test/extension.test.ts | 0 .../void/browser}/void/src/webviews/common/contextForConfig.tsx | 0 .../void/browser}/void/src/webviews/common/contextForProps.tsx | 0 .../void/browser}/void/src/webviews/common/contextForThreads.tsx | 0 .../void/browser}/void/src/webviews/common/getVscodeApi.ts | 0 .../contrib/void/browser}/void/src/webviews/common/mount.tsx | 0 .../contrib/void/browser}/void/src/webviews/common/posthog.ts | 0 .../contrib/void/browser}/void/src/webviews/ctrlk/CtrlK.tsx | 0 .../contrib/void/browser}/void/src/webviews/ctrlk/index.tsx | 0 .../contrib/void/browser}/void/src/webviews/diffline/DiffLine.tsx | 0 .../contrib/void/browser}/void/src/webviews/diffline/index.tsx | 0 .../contrib/void/browser}/void/src/webviews/sidebar/Sidebar.tsx | 0 .../void/browser}/void/src/webviews/sidebar/SidebarChat.tsx | 0 .../void/browser}/void/src/webviews/sidebar/SidebarSettings.tsx | 0 .../browser}/void/src/webviews/sidebar/SidebarThreadSelector.tsx | 0 .../contrib/void/browser}/void/src/webviews/sidebar/index.tsx | 0 .../browser}/void/src/webviews/sidebar/markdown/BlockCode.tsx | 0 .../void/src/webviews/sidebar/markdown/MarkdownRender.tsx | 0 .../workbench/contrib/void/browser}/void/src/webviews/styles.css | 0 .../vs/workbench/contrib/void/browser}/void/tailwind.config.js | 0 .../vs/workbench/contrib/void/browser}/void/tsconfig.json | 0 45 files changed, 0 insertions(+), 0 deletions(-) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.eslintrc (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.gitignore (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscode-test.mjs (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscode/extensions.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscode/launch.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscode/settings.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscode/tasks.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/.vscodeignore (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/README.md (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/build/build.js (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/package-lock.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/package.json (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/common/sendLLMMessage.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/common/shared_types.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/common/systemPrompts.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/DiffProvider.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/applyDiffLazily.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/ctrlK.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/extension.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/extensionLib/readFileContentOfUri.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/extensionLib/updateWebviewHTML.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/findDiffs.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/providers/CtrlKWebviewProvider.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/extension/providers/SidebarWebviewProvider.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/test/extension.test.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/contextForConfig.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/contextForProps.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/contextForThreads.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/getVscodeApi.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/mount.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/common/posthog.ts (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/ctrlk/CtrlK.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/ctrlk/index.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/diffline/DiffLine.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/diffline/index.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/Sidebar.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/SidebarChat.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/SidebarSettings.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/SidebarThreadSelector.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/index.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/markdown/BlockCode.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/sidebar/markdown/MarkdownRender.tsx (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/src/webviews/styles.css (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/tailwind.config.js (100%) rename {extensions => src/vs/workbench/contrib/void/browser}/void/tsconfig.json (100%) diff --git a/extensions/void/.eslintrc b/src/vs/workbench/contrib/void/browser/void/.eslintrc similarity index 100% rename from extensions/void/.eslintrc rename to src/vs/workbench/contrib/void/browser/void/.eslintrc diff --git a/extensions/void/.gitignore b/src/vs/workbench/contrib/void/browser/void/.gitignore similarity index 100% rename from extensions/void/.gitignore rename to src/vs/workbench/contrib/void/browser/void/.gitignore diff --git a/extensions/void/.vscode-test.mjs b/src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs similarity index 100% rename from extensions/void/.vscode-test.mjs rename to src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs diff --git a/extensions/void/.vscode/extensions.json b/src/vs/workbench/contrib/void/browser/void/.vscode/extensions.json similarity index 100% rename from extensions/void/.vscode/extensions.json rename to src/vs/workbench/contrib/void/browser/void/.vscode/extensions.json diff --git a/extensions/void/.vscode/launch.json b/src/vs/workbench/contrib/void/browser/void/.vscode/launch.json similarity index 100% rename from extensions/void/.vscode/launch.json rename to src/vs/workbench/contrib/void/browser/void/.vscode/launch.json diff --git a/extensions/void/.vscode/settings.json b/src/vs/workbench/contrib/void/browser/void/.vscode/settings.json similarity index 100% rename from extensions/void/.vscode/settings.json rename to src/vs/workbench/contrib/void/browser/void/.vscode/settings.json diff --git a/extensions/void/.vscode/tasks.json b/src/vs/workbench/contrib/void/browser/void/.vscode/tasks.json similarity index 100% rename from extensions/void/.vscode/tasks.json rename to src/vs/workbench/contrib/void/browser/void/.vscode/tasks.json diff --git a/extensions/void/.vscodeignore b/src/vs/workbench/contrib/void/browser/void/.vscodeignore similarity index 100% rename from extensions/void/.vscodeignore rename to src/vs/workbench/contrib/void/browser/void/.vscodeignore diff --git a/extensions/void/README.md b/src/vs/workbench/contrib/void/browser/void/README.md similarity index 100% rename from extensions/void/README.md rename to src/vs/workbench/contrib/void/browser/void/README.md diff --git a/extensions/void/build/build.js b/src/vs/workbench/contrib/void/browser/void/build/build.js similarity index 100% rename from extensions/void/build/build.js rename to src/vs/workbench/contrib/void/browser/void/build/build.js diff --git a/extensions/void/package-lock.json b/src/vs/workbench/contrib/void/browser/void/package-lock.json similarity index 100% rename from extensions/void/package-lock.json rename to src/vs/workbench/contrib/void/browser/void/package-lock.json diff --git a/extensions/void/package.json b/src/vs/workbench/contrib/void/browser/void/package.json similarity index 100% rename from extensions/void/package.json rename to src/vs/workbench/contrib/void/browser/void/package.json diff --git a/extensions/void/src/common/sendLLMMessage.ts b/src/vs/workbench/contrib/void/browser/void/src/common/sendLLMMessage.ts similarity index 100% rename from extensions/void/src/common/sendLLMMessage.ts rename to src/vs/workbench/contrib/void/browser/void/src/common/sendLLMMessage.ts diff --git a/extensions/void/src/common/shared_types.ts b/src/vs/workbench/contrib/void/browser/void/src/common/shared_types.ts similarity index 100% rename from extensions/void/src/common/shared_types.ts rename to src/vs/workbench/contrib/void/browser/void/src/common/shared_types.ts diff --git a/extensions/void/src/common/systemPrompts.ts b/src/vs/workbench/contrib/void/browser/void/src/common/systemPrompts.ts similarity index 100% rename from extensions/void/src/common/systemPrompts.ts rename to src/vs/workbench/contrib/void/browser/void/src/common/systemPrompts.ts diff --git a/extensions/void/src/extension/DiffProvider.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/DiffProvider.ts similarity index 100% rename from extensions/void/src/extension/DiffProvider.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/DiffProvider.ts diff --git a/extensions/void/src/extension/applyDiffLazily.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/applyDiffLazily.ts similarity index 100% rename from extensions/void/src/extension/applyDiffLazily.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/applyDiffLazily.ts diff --git a/extensions/void/src/extension/ctrlK.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/ctrlK.ts similarity index 100% rename from extensions/void/src/extension/ctrlK.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/ctrlK.ts diff --git a/extensions/void/src/extension/extension.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/extension.ts similarity index 100% rename from extensions/void/src/extension/extension.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/extension.ts diff --git a/extensions/void/src/extension/extensionLib/readFileContentOfUri.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/readFileContentOfUri.ts similarity index 100% rename from extensions/void/src/extension/extensionLib/readFileContentOfUri.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/readFileContentOfUri.ts diff --git a/extensions/void/src/extension/extensionLib/updateWebviewHTML.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/updateWebviewHTML.ts similarity index 100% rename from extensions/void/src/extension/extensionLib/updateWebviewHTML.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/updateWebviewHTML.ts diff --git a/extensions/void/src/extension/findDiffs.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts similarity index 100% rename from extensions/void/src/extension/findDiffs.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts diff --git a/extensions/void/src/extension/providers/CtrlKWebviewProvider.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts similarity index 100% rename from extensions/void/src/extension/providers/CtrlKWebviewProvider.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts diff --git a/extensions/void/src/extension/providers/SidebarWebviewProvider.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/providers/SidebarWebviewProvider.ts similarity index 100% rename from extensions/void/src/extension/providers/SidebarWebviewProvider.ts rename to src/vs/workbench/contrib/void/browser/void/src/extension/providers/SidebarWebviewProvider.ts diff --git a/extensions/void/src/test/extension.test.ts b/src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts similarity index 100% rename from extensions/void/src/test/extension.test.ts rename to src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts diff --git a/extensions/void/src/webviews/common/contextForConfig.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForConfig.tsx similarity index 100% rename from extensions/void/src/webviews/common/contextForConfig.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForConfig.tsx diff --git a/extensions/void/src/webviews/common/contextForProps.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForProps.tsx similarity index 100% rename from extensions/void/src/webviews/common/contextForProps.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForProps.tsx diff --git a/extensions/void/src/webviews/common/contextForThreads.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForThreads.tsx similarity index 100% rename from extensions/void/src/webviews/common/contextForThreads.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForThreads.tsx diff --git a/extensions/void/src/webviews/common/getVscodeApi.ts b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts similarity index 100% rename from extensions/void/src/webviews/common/getVscodeApi.ts rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts diff --git a/extensions/void/src/webviews/common/mount.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx similarity index 100% rename from extensions/void/src/webviews/common/mount.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx diff --git a/extensions/void/src/webviews/common/posthog.ts b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts similarity index 100% rename from extensions/void/src/webviews/common/posthog.ts rename to src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts diff --git a/extensions/void/src/webviews/ctrlk/CtrlK.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx similarity index 100% rename from extensions/void/src/webviews/ctrlk/CtrlK.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx diff --git a/extensions/void/src/webviews/ctrlk/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx similarity index 100% rename from extensions/void/src/webviews/ctrlk/index.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx diff --git a/extensions/void/src/webviews/diffline/DiffLine.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx similarity index 100% rename from extensions/void/src/webviews/diffline/DiffLine.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx diff --git a/extensions/void/src/webviews/diffline/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx similarity index 100% rename from extensions/void/src/webviews/diffline/index.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx diff --git a/extensions/void/src/webviews/sidebar/Sidebar.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/Sidebar.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/Sidebar.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/Sidebar.tsx diff --git a/extensions/void/src/webviews/sidebar/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarChat.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/SidebarChat.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarChat.tsx diff --git a/extensions/void/src/webviews/sidebar/SidebarSettings.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarSettings.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/SidebarSettings.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarSettings.tsx diff --git a/extensions/void/src/webviews/sidebar/SidebarThreadSelector.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarThreadSelector.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/SidebarThreadSelector.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarThreadSelector.tsx diff --git a/extensions/void/src/webviews/sidebar/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/index.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx diff --git a/extensions/void/src/webviews/sidebar/markdown/BlockCode.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/BlockCode.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/markdown/BlockCode.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/BlockCode.tsx diff --git a/extensions/void/src/webviews/sidebar/markdown/MarkdownRender.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/MarkdownRender.tsx similarity index 100% rename from extensions/void/src/webviews/sidebar/markdown/MarkdownRender.tsx rename to src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/MarkdownRender.tsx diff --git a/extensions/void/src/webviews/styles.css b/src/vs/workbench/contrib/void/browser/void/src/webviews/styles.css similarity index 100% rename from extensions/void/src/webviews/styles.css rename to src/vs/workbench/contrib/void/browser/void/src/webviews/styles.css diff --git a/extensions/void/tailwind.config.js b/src/vs/workbench/contrib/void/browser/void/tailwind.config.js similarity index 100% rename from extensions/void/tailwind.config.js rename to src/vs/workbench/contrib/void/browser/void/tailwind.config.js diff --git a/extensions/void/tsconfig.json b/src/vs/workbench/contrib/void/browser/void/tsconfig.json similarity index 100% rename from extensions/void/tsconfig.json rename to src/vs/workbench/contrib/void/browser/void/tsconfig.json From 1c32d3a1c9d8fa037b872ee3e7c5b4a5dad6900d Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 19:45:02 -0800 Subject: [PATCH 015/107] update build --- build/npm/dirs.js | 2 +- package-lock.json | 1542 +++++++++++- package.json | 7 + .../workbench/contrib/void/browser/.gitignore | 2 +- .../contrib/void/browser/registerViewPane.ts | 66 + .../contrib/void/browser/void.contribution.ts | 73 +- .../void/src/webviews/common/posthog.ts | 2 +- .../{voidViewPane.ts => voidViewPane.tsx} | 22 +- void-imports/build-index.mjs | 13 +- void-imports/package-lock.json | 2134 ----------------- void-imports/package.json | 20 - 11 files changed, 1618 insertions(+), 2265 deletions(-) create mode 100644 src/vs/workbench/contrib/void/browser/registerViewPane.ts rename src/vs/workbench/contrib/void/browser/{voidViewPane.ts => voidViewPane.tsx} (86%) delete mode 100644 void-imports/package-lock.json delete mode 100644 void-imports/package.json diff --git a/build/npm/dirs.js b/build/npm/dirs.js index cb0267852..ca8c27fe8 100644 --- a/build/npm/dirs.js +++ b/build/npm/dirs.js @@ -55,7 +55,7 @@ const dirs = [ '.vscode/extensions/vscode-selfhost-test-provider', // Void added these: - 'extensions/void', + // 'extensions/void', 'void-imports', ]; diff --git a/package-lock.json b/package-lock.json index 5833d14a2..16df50dbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,6 +53,7 @@ "yazl": "^2.4.3" }, "devDependencies": { + "@anthropic-ai/sdk": "^0.32.1", "@playwright/test": "^1.46.1", "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", @@ -63,6 +64,8 @@ "@types/minimist": "^1.2.1", "@types/mocha": "^9.1.1", "@types/node": "20.x", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/sinon": "^10.0.2", "@types/sinon-test": "^2.4.2", "@types/trusted-types": "^1.0.6", @@ -136,6 +139,7 @@ "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", "npm-run-all": "^4.1.5", + "openai": "^4.71.1", "opn": "^6.0.0", "original-fs": "^1.2.0", "os-browserify": "^0.3.0", @@ -145,6 +149,8 @@ "postcss-nesting": "^12.0.2", "pump": "^1.0.1", "rcedit": "^1.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "rimraf": "^2.2.8", "sinon": "^12.0.1", "sinon-test": "^3.1.3", @@ -155,6 +161,7 @@ "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", + "tsup": "^8.3.5", "typescript": "^5.7.0-dev.20240903", "util": "^0.12.4", "webpack": "^5.94.0", @@ -180,6 +187,32 @@ "node": ">=6.0.0" } }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", + "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@azure-rest/ai-translation-text": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/@azure-rest/ai-translation-text/-/ai-translation-text-1.0.0-beta.1.tgz", @@ -1079,6 +1112,414 @@ "node": ">=16" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1748,6 +2189,258 @@ "node": ">=18" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz", + "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz", + "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", + "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz", + "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz", + "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz", + "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz", + "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz", + "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz", + "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz", + "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz", + "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz", + "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz", + "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz", + "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz", + "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz", + "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz", + "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz", + "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2127,10 +2820,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/expect": { "version": "1.20.4", @@ -2247,6 +2941,34 @@ "form-data": "^4.0.0" } }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -3571,6 +4293,19 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -3634,6 +4369,19 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4548,6 +5296,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-require": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", + "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4582,6 +5346,16 @@ "node": ">=14.14.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -5326,6 +6100,16 @@ "proto-list": "~1.2.1" } }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5708,6 +6492,13 @@ "node": ">=8.0.0" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -6595,6 +7386,46 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6893,6 +7724,16 @@ "through": "~2.3.1" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -7272,6 +8113,21 @@ "pend": "~1.2.0" } }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -7734,6 +8590,27 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -10819,6 +11696,16 @@ "node": ">= 14" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/husky/-/husky-0.13.4.tgz", @@ -12070,6 +12957,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/js-base64": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", @@ -12646,14 +13543,25 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -12679,6 +13587,16 @@ "node": ">=4" } }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -12765,6 +13683,13 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", "dev": true }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -12787,6 +13712,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -13684,6 +14622,18 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", @@ -13834,6 +14784,26 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", @@ -14432,6 +15402,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.71.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.71.1.tgz", + "integrity": "sha512-C6JNMaQ1eijM0lrjiRUL3MgThVP5RdwNAghpbJFdW0t11LzmyqON8Eh8MuUuEZ+CeD6bgYl2Fkn2BoptVxv9Ug==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/opn": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", @@ -14959,10 +15966,11 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA= sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -15019,6 +16027,16 @@ "node": ">=0.10.0" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -15319,6 +16337,49 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/postcss-merge-longhand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz", @@ -16031,6 +17092,16 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -16110,6 +17181,33 @@ "integrity": "sha512-JkXJ0IrUcdupLoIx6gE4YcFaMVSGtu7kQf4NJoDJUnfBZGuATmJ2Yal2v55KTltp+WV8dGr7A0RtOzx6jmtM6Q==", "dev": true }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -16740,7 +17838,45 @@ "sprintf-js": "^1.1.2" }, "engines": { - "node": ">=8.0" + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz", + "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.4", + "@rollup/rollup-android-arm64": "4.24.4", + "@rollup/rollup-darwin-arm64": "4.24.4", + "@rollup/rollup-darwin-x64": "4.24.4", + "@rollup/rollup-freebsd-arm64": "4.24.4", + "@rollup/rollup-freebsd-x64": "4.24.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", + "@rollup/rollup-linux-arm-musleabihf": "4.24.4", + "@rollup/rollup-linux-arm64-gnu": "4.24.4", + "@rollup/rollup-linux-arm64-musl": "4.24.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", + "@rollup/rollup-linux-riscv64-gnu": "4.24.4", + "@rollup/rollup-linux-s390x-gnu": "4.24.4", + "@rollup/rollup-linux-x64-gnu": "4.24.4", + "@rollup/rollup-linux-x64-musl": "4.24.4", + "@rollup/rollup-win32-arm64-msvc": "4.24.4", + "@rollup/rollup-win32-ia32-msvc": "4.24.4", + "@rollup/rollup-win32-x64-msvc": "4.24.4", + "fsevents": "~2.3.2" } }, "node_modules/run-async": { @@ -16860,6 +17996,16 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -18168,6 +19314,127 @@ "postcss": "^8.4.31" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -18631,6 +19898,29 @@ "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI= sha512-jm9KjEWiDmtGLBrTqXEduGzlYTTlPaoDKdq5YRQhD0rYjo61ZNTYKZ/x5J4ajPSBH9wIYY5qm9GNG5otIKjtOA==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -18701,6 +19991,40 @@ "next-tick": "1" } }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -18834,15 +20158,6 @@ "node": ">=6" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -18879,6 +20194,13 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/ts-loader": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", @@ -19014,6 +20336,165 @@ "node": ">=0.6.x" } }, + "node_modules/tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^4.0.1", + "consola": "^3.2.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.24.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tsup/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tsup/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tsup/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/tsup/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -19430,15 +20911,6 @@ "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -19760,6 +21232,16 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/web-tree-sitter": { "version": "0.20.8", "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", diff --git a/package.json b/package.json index 92fc72759..bf0142cbc 100644 --- a/package.json +++ b/package.json @@ -115,6 +115,7 @@ "yazl": "^2.4.3" }, "devDependencies": { + "@anthropic-ai/sdk": "^0.32.1", "@playwright/test": "^1.46.1", "@swc/core": "1.3.62", "@types/cookie": "^0.3.3", @@ -125,6 +126,8 @@ "@types/minimist": "^1.2.1", "@types/mocha": "^9.1.1", "@types/node": "20.x", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/sinon": "^10.0.2", "@types/sinon-test": "^2.4.2", "@types/trusted-types": "^1.0.6", @@ -198,6 +201,7 @@ "mocha-junit-reporter": "^2.2.1", "mocha-multi-reporters": "^1.5.1", "npm-run-all": "^4.1.5", + "openai": "^4.71.1", "opn": "^6.0.0", "original-fs": "^1.2.0", "os-browserify": "^0.3.0", @@ -207,6 +211,8 @@ "postcss-nesting": "^12.0.2", "pump": "^1.0.1", "rcedit": "^1.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "rimraf": "^2.2.8", "sinon": "^12.0.1", "sinon-test": "^3.1.3", @@ -217,6 +223,7 @@ "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", + "tsup": "^8.3.5", "typescript": "^5.7.0-dev.20240903", "util": "^0.12.4", "webpack": "^5.94.0", diff --git a/src/vs/workbench/contrib/void/browser/.gitignore b/src/vs/workbench/contrib/void/browser/.gitignore index 849ddff3b..897c5fc64 100644 --- a/src/vs/workbench/contrib/void/browser/.gitignore +++ b/src/vs/workbench/contrib/void/browser/.gitignore @@ -1 +1 @@ -dist/ +void-imports/ diff --git a/src/vs/workbench/contrib/void/browser/registerViewPane.ts b/src/vs/workbench/contrib/void/browser/registerViewPane.ts new file mode 100644 index 000000000..c5c2c0cf8 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/registerViewPane.ts @@ -0,0 +1,66 @@ +import { Registry } from '../../../../platform/registry/common/platform.js'; +import { + Extensions as ViewContainerExtensions, IViewContainersRegistry, + ViewContainerLocation, IViewsRegistry, Extensions as ViewExtensions, +} from '../../../common/views.js'; + +import * as nls from '../../../../nls.js'; + +import { VoidViewPane } from './voidViewPane.js'; + +import { Codicon } from '../../../../base/common/codicons.js'; +import { localize } from '../../../../nls.js'; +import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js'; +import { ViewPaneContainer } from '../../../browser/parts/views/viewPaneContainer.js'; + +import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; +import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js'; + + +const voidThemeIcon = Codicon.search; +const voidViewIcon = registerIcon('void-view-icon', voidThemeIcon, localize('voidViewIcon', 'View icon of the Void chat view.')); + + +// compare against search.contribution.ts and https://app.greptile.com/chat/w1nsmt3lauwzculipycpn?repo=github%3Amain%3Amicrosoft%2Fvscode +// and debug.contribution.ts, scm.contribution.ts (source control) + +// called VIEWLET_ID in other places for some reason +const VIEW_CONTAINER_ID = 'workbench.view.void' + +// Register view container +const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); +const viewContainer = viewContainerRegistry.registerViewContainer({ + id: VIEW_CONTAINER_ID, + title: nls.localize2('void', 'Void'), // this is used to say "Void" (Ctrl + L) + ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [VIEW_CONTAINER_ID, { mergeViewWithContainerWhenSingleView: true }]), + hideIfEmpty: false, + icon: voidViewIcon, + order: 1, +}, ViewContainerLocation.AuxiliaryBar, { doNotRegisterOpenCommand: true, }); + + + +// Register search default location to the container (sidebar) +const viewsRegistry = Registry.as(ViewExtensions.ViewsRegistry); +viewsRegistry.registerViews([{ + id: VIEW_CONTAINER_ID, // not sure if we can change this + hideByDefault: false, // start open + containerIcon: voidViewIcon, + name: nls.localize2('void chat', "Chat"), // this says ... : CHAT + ctorDescriptor: new SyncDescriptor(VoidViewPane), + canToggleVisibility: false, + canMoveView: true, + openCommandActionDescriptor: { + id: viewContainer.id, + keybindings: { + primary: KeyMod.CtrlCmd | KeyCode.KeyL, // we don't need to disable the original ctrl+L (probably because it brings panel into focus first) + }, + order: 1 + // mnemonicTitle: nls.localize({ key: 'miViewSearch', comment: ['&& denotes a mnemonic'] }, "&&Search"), + } +}], viewContainer); + + +// TODO can add a configuration for the user to choose config options - see search.contribution.ts + + diff --git a/src/vs/workbench/contrib/void/browser/void.contribution.ts b/src/vs/workbench/contrib/void/browser/void.contribution.ts index 66a1ea304..54e870c07 100644 --- a/src/vs/workbench/contrib/void/browser/void.contribution.ts +++ b/src/vs/workbench/contrib/void/browser/void.contribution.ts @@ -1,74 +1,3 @@ -import { Registry } from '../../../../platform/registry/common/platform.js'; -import { - Extensions as ViewContainerExtensions, IViewContainersRegistry, - ViewContainerLocation, IViewsRegistry, Extensions as ViewExtensions, - IViewDescriptor -} from '../../../../workbench/common/views.js'; - -import * as nls from '../../../../nls.js'; - -import { VoidViewPane } from '../../../../workbench/contrib/void/browser/voidViewPane.js'; - -import { Codicon } from '../../../../base/common/codicons.js'; -import { localize } from '../../../../nls.js'; -import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js'; -import { ViewPaneContainer } from '../../../../workbench/browser/parts/views/viewPaneContainer.js'; - -import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; -import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js'; - -import * as React from './dist/openai.js' -console.log('React', React) - -const voidViewIcon = registerIcon('void-view-icon', Codicon.search, localize('voidViewIcon', 'View icon of the Void chat view.')); - - -// compare against search.contribution.ts and https://app.greptile.com/chat/w1nsmt3lauwzculipycpn?repo=github%3Amain%3Amicrosoft%2Fvscode -// and debug.contribution.ts, scm.contribution.ts (source control) - -const VIEW_CONTAINER_ID = 'workbench.view.void' // called VIEWLET_ID in other places for some reason - -// Register view container -const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); -const viewContainer = viewContainerRegistry.registerViewContainer({ - id: VIEW_CONTAINER_ID, - title: nls.localize2('void', 'Void'), // this is used to say "Void" (Ctrl + L) - ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [VIEW_CONTAINER_ID, { mergeViewWithContainerWhenSingleView: true }]), - hideIfEmpty: false, - icon: voidViewIcon, - order: 1, -}, ViewContainerLocation.AuxiliaryBar, { doNotRegisterOpenCommand: true }); - - - - - -// this is called a descriptor, but it's the actual View that gets used inside the view container -const VIEW_ID = VIEW_CONTAINER_ID // not sure if we can change this -const viewDescriptor: IViewDescriptor = { - id: VIEW_ID, - containerIcon: voidViewIcon, - name: nls.localize2('void chat', "Chat"), // this says ... : CHAT - ctorDescriptor: new SyncDescriptor(VoidViewPane), - canToggleVisibility: false, - canMoveView: true, - openCommandActionDescriptor: { - id: viewContainer.id, - keybindings: { - primary: KeyMod.CtrlCmd | KeyCode.KeyL, // we don't need to disable the original ctrl+L (probably because it brings panel into focus first) - }, - order: 1 - // mnemonicTitle: nls.localize({ key: 'miViewSearch', comment: ['&& denotes a mnemonic'] }, "&&Search"), - } -}; - - - - -// Register search default location to the container (sidebar) -Registry.as(ViewExtensions.ViewsRegistry).registerViews([viewDescriptor], viewContainer); - - -// TODO can add a configuration for the user to choose config options - see search.contribution.ts +import './registerViewPane.js' diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts index 106907283..72e95ccc1 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts +++ b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts @@ -17,4 +17,4 @@ export const initPosthog = () => { person_profiles: 'identified_only' // we only track events from identified users. We identify them in Sidebar } ) -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/void/browser/voidViewPane.ts b/src/vs/workbench/contrib/void/browser/voidViewPane.tsx similarity index 86% rename from src/vs/workbench/contrib/void/browser/voidViewPane.ts rename to src/vs/workbench/contrib/void/browser/voidViewPane.tsx index ccca0c32d..f1ffaf987 100644 --- a/src/vs/workbench/contrib/void/browser/voidViewPane.ts +++ b/src/vs/workbench/contrib/void/browser/voidViewPane.tsx @@ -1,7 +1,7 @@ -import { ViewPane } from '../../../../workbench/browser/parts/views/viewPane.js'; +import { ViewPane } from '../../../browser/parts/views/viewPane.js'; // import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; // import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -15,6 +15,8 @@ import { ViewPane } from '../../../../workbench/browser/parts/views/viewPane.js' // import { IViewDescriptorService } from 'vs/workbench/common/views'; // import { IHoverService } from 'vs/platform/hover/browser/hover'; +import React from './void-imports/react.js' +import { render } from './void-imports/react-dom.js' export class VoidViewPane extends ViewPane { @@ -34,6 +36,24 @@ export class VoidViewPane extends ViewPane { // super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService); // } + + + protected override renderBody(parent: HTMLElement): void { + super.renderBody(parent); + + + const x = <> + + + + + + render() + + + } } // register a singleton service that mounts the ViewPane here + + diff --git a/void-imports/build-index.mjs b/void-imports/build-index.mjs index 58d4ffbd1..5b4c8227f 100755 --- a/void-imports/build-index.mjs +++ b/void-imports/build-index.mjs @@ -1,4 +1,4 @@ -import tsup from 'tsup' +import tsup from 'tsup' // Void added tsup as a dependency import * as fs from 'fs' import * as path from 'path' @@ -6,8 +6,8 @@ const buildFiles = (imports, to_be_built_folder) => { // create a file with name importName that imports importName and immediately re-exports it for (const importName of imports) { const content = `\ -export { default } from '${importName}' -export * from '${importName}' +import * as mod from '${importName}' +export default mod ` const dir = path.dirname(importName); const file = path.basename(importName); @@ -24,7 +24,7 @@ const compileFiles = async (imports, to_be_built_folder, outDir) => { const fileEntries = imports.map((importName) => path.join(to_be_built_folder, `${importName}.ts`)) await tsup.build({ entry: fileEntries, - format: ['esm'], + format: ['cjs'], sourcemap: false, bundle: true, clean: true, @@ -34,6 +34,9 @@ const compileFiles = async (imports, to_be_built_folder, outDir) => { noExternal: [/.*/], // This bundles everything platform: 'browser', // Important for browser compatibility target: 'es2020', + banner: { + js: '/* eslint-disable */' + } }) } @@ -43,6 +46,6 @@ fs.rmSync(to_be_built_folder, { recursive: true, force: true }); const imports = ['openai', '@anthropic-ai/sdk', 'react', 'react-dom'] buildFiles(imports, to_be_built_folder) -const OUT_DIR = '../src/vs/workbench/contrib/void/browser/dist' +const OUT_DIR = '../src/vs/workbench/contrib/void/browser/void-imports' compileFiles(imports, to_be_built_folder, OUT_DIR) diff --git a/void-imports/package-lock.json b/void-imports/package-lock.json deleted file mode 100644 index eb4a06548..000000000 --- a/void-imports/package-lock.json +++ /dev/null @@ -1,2134 +0,0 @@ -{ - "name": "void-imports", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "void-imports", - "dependencies": { - "@anthropic-ai/sdk": "^0.32.1", - "openai": "^4.71.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "tsup": "^8.3.5", - "typescript": "^5.6.3" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", - "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz", - "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz", - "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz", - "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz", - "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz", - "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz", - "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz", - "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz", - "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz", - "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz", - "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz", - "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz", - "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz", - "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz", - "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz", - "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz", - "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz", - "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz", - "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/bundle-require": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", - "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/openai": { - "version": "4.71.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.71.0.tgz", - "integrity": "sha512-jeJ7+6cZvj+ZbIsbX/Ag8+pug2+vjKbrD/v3Hwp6uv3KZyWjSkZa5MdUshzpNC3jsFzakfbUhEEFQXsKWNgm/g==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz", - "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.4", - "@rollup/rollup-android-arm64": "4.24.4", - "@rollup/rollup-darwin-arm64": "4.24.4", - "@rollup/rollup-darwin-x64": "4.24.4", - "@rollup/rollup-freebsd-arm64": "4.24.4", - "@rollup/rollup-freebsd-x64": "4.24.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.4", - "@rollup/rollup-linux-arm-musleabihf": "4.24.4", - "@rollup/rollup-linux-arm64-gnu": "4.24.4", - "@rollup/rollup-linux-arm64-musl": "4.24.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4", - "@rollup/rollup-linux-riscv64-gnu": "4.24.4", - "@rollup/rollup-linux-s390x-gnu": "4.24.4", - "@rollup/rollup-linux-x64-gnu": "4.24.4", - "@rollup/rollup-linux-x64-musl": "4.24.4", - "@rollup/rollup-win32-arm64-msvc": "4.24.4", - "@rollup/rollup-win32-ia32-msvc": "4.24.4", - "@rollup/rollup-win32-x64-msvc": "4.24.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/source-map/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/source-map/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsup": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", - "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-require": "^5.0.0", - "cac": "^6.7.14", - "chokidar": "^4.0.1", - "consola": "^3.2.3", - "debug": "^4.3.7", - "esbuild": "^0.24.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.24.0", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.1", - "tinyglobby": "^0.2.9", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - } - } -} diff --git a/void-imports/package.json b/void-imports/package.json deleted file mode 100644 index a3fd576bd..000000000 --- a/void-imports/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "void-imports", - "main": "index.js", - "type": "module", - "scripts": { - "build": "node build-index.mjs" - }, - "author": "", - "description": "", - "dependencies": { - "@anthropic-ai/sdk": "^0.32.1", - "openai": "^4.71.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "tsup": "^8.3.5", - "typescript": "^5.6.3" - } -} From 70ce23862b9d53730b98ba4c7d3b2bff4295cbfe Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 20:50:09 -0800 Subject: [PATCH 016/107] back up build --- void-imports/build-to-be-built.ts | 3 +++ void-imports/compile-to-be-built.ts | 26 ++++++++++++++++++++ void-imports/{build-index.mjs => index.ts} | 28 +++++++++++----------- 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 void-imports/build-to-be-built.ts create mode 100644 void-imports/compile-to-be-built.ts rename void-imports/{build-index.mjs => index.ts} (62%) diff --git a/void-imports/build-to-be-built.ts b/void-imports/build-to-be-built.ts new file mode 100644 index 000000000..dc1b25a4e --- /dev/null +++ b/void-imports/build-to-be-built.ts @@ -0,0 +1,3 @@ +import * as path from 'path' +import * as fs from 'fs' + diff --git a/void-imports/compile-to-be-built.ts b/void-imports/compile-to-be-built.ts new file mode 100644 index 000000000..7f1eaf61d --- /dev/null +++ b/void-imports/compile-to-be-built.ts @@ -0,0 +1,26 @@ +import * as esbuild from 'esbuild' +import * as path from 'path' + +// import tsup from 'tsup' // Void added tsup as a dependency +// import * as path from 'path' + + +// export const compileFiles = async (imports: string[], src_folder: string, outDir: string) => { +// const fileEntries = imports.map((importName) => path.join(src_folder, `${importName}.ts`)) +// await tsup.build({ +// entry: fileEntries, +// format: ['cjs'], +// sourcemap: false, +// bundle: true, +// clean: true, +// // minify: true, // no need to minify since it all gets bundled later +// outDir: path.join(outDir), +// dts: false, +// noExternal: [/.*/], // This bundles everything +// platform: 'browser', // Important for browser compatibility +// target: 'es2020', +// banner: { +// js: '/* eslint-disable */' +// } +// }) +// } diff --git a/void-imports/build-index.mjs b/void-imports/index.ts similarity index 62% rename from void-imports/build-index.mjs rename to void-imports/index.ts index 5b4c8227f..d0b1886b2 100755 --- a/void-imports/build-index.mjs +++ b/void-imports/index.ts @@ -1,8 +1,8 @@ -import tsup from 'tsup' // Void added tsup as a dependency import * as fs from 'fs' import * as path from 'path' +import * as esbuild from 'esbuild' -const buildFiles = (imports, to_be_built_folder) => { +export const buildFiles = (imports, to_be_built_folder) => { // create a file with name importName that imports importName and immediately re-exports it for (const importName of imports) { const content = `\ @@ -20,19 +20,17 @@ export default mod } } -const compileFiles = async (imports, to_be_built_folder, outDir) => { - const fileEntries = imports.map((importName) => path.join(to_be_built_folder, `${importName}.ts`)) - await tsup.build({ - entry: fileEntries, - format: ['cjs'], - sourcemap: false, + + +export const compileFiles = async (imports: string[], srcFolder: string, outDir: string) => { + const entryPoints = imports.map(name => path.join(srcFolder, `${name}.ts`)) + + await esbuild.build({ + entryPoints, + outdir: outDir, bundle: true, - clean: true, - // minify: true, // no need to minify since it all gets bundled later - outDir: path.join(outDir), - dts: false, - noExternal: [/.*/], // This bundles everything - platform: 'browser', // Important for browser compatibility + format: 'iife', + platform: 'browser', target: 'es2020', banner: { js: '/* eslint-disable */' @@ -40,6 +38,8 @@ const compileFiles = async (imports, to_be_built_folder, outDir) => { }) } + + const to_be_built_folder = 'to_be_built' fs.rmSync(to_be_built_folder, { recursive: true, force: true }); From 6b268a44bbe792dee3a95d90a2efc04bdf131e44 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 21:46:17 -0800 Subject: [PATCH 017/107] backup again --- void-imports/index.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/void-imports/index.ts b/void-imports/index.ts index d0b1886b2..602518421 100755 --- a/void-imports/index.ts +++ b/void-imports/index.ts @@ -1,13 +1,13 @@ import * as fs from 'fs' import * as path from 'path' -import * as esbuild from 'esbuild' +import tsup from 'tsup' // Void added tsup as a dependency -export const buildFiles = (imports, to_be_built_folder) => { + +const buildFiles = (imports, to_be_built_folder) => { // create a file with name importName that imports importName and immediately re-exports it for (const importName of imports) { const content = `\ -import * as mod from '${importName}' -export default mod +export * from '${importName}' ` const dir = path.dirname(importName); const file = path.basename(importName); @@ -22,19 +22,22 @@ export default mod -export const compileFiles = async (imports: string[], srcFolder: string, outDir: string) => { - const entryPoints = imports.map(name => path.join(srcFolder, `${name}.ts`)) - await esbuild.build({ - entryPoints, - outdir: outDir, + +const compileFiles = async (imports, to_be_built_folder, outDir) => { + const fileEntries = imports.map((importName) => path.join(to_be_built_folder, `${importName}.ts`)) + await tsup.build({ + entry: fileEntries, + format: ['esm'], + sourcemap: false, bundle: true, - format: 'iife', - platform: 'browser', + clean: true, + // minify: true, // no need to minify since it all gets bundled later + outDir: path.join(outDir), + dts: true, + noExternal: [/.*/], // This bundles everything + platform: 'browser', // Important for browser compatibility target: 'es2020', - banner: { - js: '/* eslint-disable */' - } }) } From 3aece818910947b60c9c7e62374350fd01bff118 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Wed, 6 Nov 2024 23:18:45 -0800 Subject: [PATCH 018/107] move void files around --- package-lock.json | 657 +- package.json | 4 +- .../src/extension => misc}/DiffProvider.ts | 6 +- .../browser/{void/build => misc}/build.js | 0 .../{void/src/extension => misc}/extension.ts | 4 +- .../package.json => misc/oldpackage.json} | 0 .../{void/src/webviews => misc}/styles.css | 0 .../browser/{void => misc}/tailwind.config.js | 0 .../{void => sidebar}/.vscode/extensions.json | 0 .../{void => sidebar}/.vscode/launch.json | 0 .../{void => sidebar}/.vscode/settings.json | 0 .../{void => sidebar}/.vscode/tasks.json | 0 .../src/webviews => }/sidebar/Sidebar.tsx | 12 +- .../src/webviews => }/sidebar/SidebarChat.tsx | 8 +- .../webviews => }/sidebar/SidebarSettings.tsx | 2 +- .../sidebar/SidebarThreadSelector.tsx | 4 +- .../SidebarWebviewProvider.ts | 2 +- .../common => sidebar}/contextForConfig.tsx | 0 .../common => sidebar}/contextForProps.tsx | 0 .../common => sidebar}/contextForThreads.tsx | 0 .../contrib/void/browser/sidebar/index.tsx | 7 + .../sidebar/markdown/BlockCode.tsx | 0 .../sidebar/markdown/MarkdownRender.tsx | 2 +- .../src/webviews/common => util}/posthog.ts | 3 +- .../src/common => util}/sendLLMMessage.ts | 0 .../{void/src/common => util}/shared_types.ts | 0 .../src/common => util}/systemPrompts.ts | 0 .../contrib/void/browser/void/.eslintrc | 56 - .../contrib/void/browser/void/.gitignore | 5 - .../void/browser/void/.vscode-test.mjs | 5 - .../contrib/void/browser/void/.vscodeignore | 11 - .../contrib/void/browser/void/README.md | 11 - .../void/browser/void/package-lock.json | 9068 ----------------- .../void/src/extension/applyDiffLazily.ts | 181 - .../void/browser/void/src/extension/ctrlK.ts | 101 - .../extensionLib/readFileContentOfUri.ts | 14 - .../extensionLib/updateWebviewHTML.ts | 46 - .../browser/void/src/extension/findDiffs.ts | 132 - .../providers/CtrlKWebviewProvider.ts | 41 - .../browser/void/src/test/extension.test.ts | 15 - .../void/src/webviews/common/getVscodeApi.ts | 94 - .../void/src/webviews/common/mount.tsx | 66 - .../browser/void/src/webviews/ctrlk/CtrlK.tsx | 27 - .../browser/void/src/webviews/ctrlk/index.tsx | 7 - .../void/src/webviews/diffline/DiffLine.tsx | 29 - .../void/src/webviews/diffline/index.tsx | 7 - .../void/src/webviews/sidebar/index.tsx | 7 - .../contrib/void/browser/void/tsconfig.json | 31 - .../{voidViewPane.tsx => voidViewPane.ts} | 15 +- void-imports/README.txt | 1 + void-imports/build-to-be-built.ts | 3 - void-imports/compile-to-be-built.ts | 26 - void-imports/index.ts | 15 +- 53 files changed, 554 insertions(+), 10171 deletions(-) rename src/vs/workbench/contrib/void/browser/{void/src/extension => misc}/DiffProvider.ts (98%) rename src/vs/workbench/contrib/void/browser/{void/build => misc}/build.js (100%) rename src/vs/workbench/contrib/void/browser/{void/src/extension => misc}/extension.ts (98%) rename src/vs/workbench/contrib/void/browser/{void/package.json => misc/oldpackage.json} (100%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => misc}/styles.css (100%) rename src/vs/workbench/contrib/void/browser/{void => misc}/tailwind.config.js (100%) rename src/vs/workbench/contrib/void/browser/{void => sidebar}/.vscode/extensions.json (100%) rename src/vs/workbench/contrib/void/browser/{void => sidebar}/.vscode/launch.json (100%) rename src/vs/workbench/contrib/void/browser/{void => sidebar}/.vscode/settings.json (100%) rename src/vs/workbench/contrib/void/browser/{void => sidebar}/.vscode/tasks.json (100%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/Sidebar.tsx (72%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/SidebarChat.tsx (97%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/SidebarSettings.tsx (99%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/SidebarThreadSelector.tsx (96%) rename src/vs/workbench/contrib/void/browser/{void/src/extension/providers => sidebar}/SidebarWebviewProvider.ts (92%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews/common => sidebar}/contextForConfig.tsx (100%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews/common => sidebar}/contextForProps.tsx (100%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews/common => sidebar}/contextForThreads.tsx (100%) create mode 100644 src/vs/workbench/contrib/void/browser/sidebar/index.tsx rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/markdown/BlockCode.tsx (100%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews => }/sidebar/markdown/MarkdownRender.tsx (98%) rename src/vs/workbench/contrib/void/browser/{void/src/webviews/common => util}/posthog.ts (92%) rename src/vs/workbench/contrib/void/browser/{void/src/common => util}/sendLLMMessage.ts (100%) rename src/vs/workbench/contrib/void/browser/{void/src/common => util}/shared_types.ts (100%) rename src/vs/workbench/contrib/void/browser/{void/src/common => util}/systemPrompts.ts (100%) delete mode 100644 src/vs/workbench/contrib/void/browser/void/.eslintrc delete mode 100644 src/vs/workbench/contrib/void/browser/void/.gitignore delete mode 100644 src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs delete mode 100644 src/vs/workbench/contrib/void/browser/void/.vscodeignore delete mode 100644 src/vs/workbench/contrib/void/browser/void/README.md delete mode 100644 src/vs/workbench/contrib/void/browser/void/package-lock.json delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/applyDiffLazily.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/ctrlK.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/readFileContentOfUri.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/extensionLib/updateWebviewHTML.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/void/tsconfig.json rename src/vs/workbench/contrib/void/browser/{voidViewPane.tsx => voidViewPane.ts} (87%) create mode 100644 void-imports/README.txt delete mode 100644 void-imports/build-to-be-built.ts delete mode 100644 void-imports/compile-to-be-built.ts diff --git a/package-lock.json b/package-lock.json index 16df50dbf..2b9a985b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -158,11 +158,11 @@ "source-map-support": "^0.3.2", "style-loader": "^3.3.2", "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", "tsup": "^8.3.5", - "typescript": "^5.7.0-dev.20240903", + "tsx": "^4.19.2", + "typescript": "^5.6.3", "util": "^0.12.4", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", @@ -974,28 +974,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@csstools/selector-specificity": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz", @@ -2762,30 +2740,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -4349,15 +4303,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -4589,12 +4534,6 @@ "node": ">=14" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6274,12 +6213,6 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8902,6 +8835,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -13768,12 +13714,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -17729,6 +17669,16 @@ "node": ">= 0.6" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -20230,58 +20180,6 @@ "code-block-writer": "^12.0.0" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tsec": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/tsec/-/tsec-0.2.7.tgz", @@ -20516,6 +20414,489 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/tsx/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -20672,10 +21053,11 @@ "dev": true }, "node_modules/typescript": { - "version": "5.7.0-dev.20240903", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.0-dev.20240903.tgz", - "integrity": "sha512-XTUc5uVwBbLlT0v3FqTx9sDN1MLQnT5mwSC3JefCrcKT6Zv+rPcQE7HLKM9IsrNiM1tiaQvamJTgVH0S+UMH2A==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -20967,12 +21349,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "node_modules/v8-inspect-profiler": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/v8-inspect-profiler/-/v8-inspect-profiler-0.1.1.tgz", @@ -21870,15 +22246,6 @@ "node": ">= 4.0.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index bf0142cbc..c87592287 100644 --- a/package.json +++ b/package.json @@ -220,11 +220,11 @@ "source-map-support": "^0.3.2", "style-loader": "^3.3.2", "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", "tsec": "0.2.7", "tslib": "^2.6.3", "tsup": "^8.3.5", - "typescript": "^5.7.0-dev.20240903", + "tsx": "^4.19.2", + "typescript": "^5.6.3", "util": "^0.12.4", "webpack": "^5.94.0", "webpack-cli": "^5.1.4", diff --git a/src/vs/workbench/contrib/void/browser/void/src/extension/DiffProvider.ts b/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts similarity index 98% rename from src/vs/workbench/contrib/void/browser/void/src/extension/DiffProvider.ts rename to src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts index 853a544f8..032b08927 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/extension/DiffProvider.ts +++ b/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts @@ -1,11 +1,11 @@ import * as vscode from 'vscode'; -import { findDiffs } from './findDiffs'; +import { findDiffs } from './src/extension/findDiffs'; import { throttle } from 'lodash'; import { DiffArea, BaseDiff, Diff } from '../common/shared_types'; -import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; +import { readFileContentOfUri } from './src/extension/extensionLib/readFileContentOfUri'; import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; import { writeFileWithDiffInstructions } from '../common/systemPrompts'; -import { VoidConfig } from '../webviews/common/contextForConfig'; +import { VoidConfig } from './src/webviews/common/contextForConfig'; const THROTTLE_TIME = 100 diff --git a/src/vs/workbench/contrib/void/browser/void/build/build.js b/src/vs/workbench/contrib/void/browser/misc/build.js similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/build/build.js rename to src/vs/workbench/contrib/void/browser/misc/build.js diff --git a/src/vs/workbench/contrib/void/browser/void/src/extension/extension.ts b/src/vs/workbench/contrib/void/browser/misc/extension.ts similarity index 98% rename from src/vs/workbench/contrib/void/browser/void/src/extension/extension.ts rename to src/vs/workbench/contrib/void/browser/misc/extension.ts index ef975b67b..fb8b46f9e 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/extension/extension.ts +++ b/src/vs/workbench/contrib/void/browser/misc/extension.ts @@ -4,9 +4,9 @@ import { v4 as uuidv4 } from 'uuid' import { AbortRef } from '../common/sendLLMMessage'; import { MessageToSidebar, MessageFromSidebar, DiffArea, ChatThreads } from '../common/shared_types'; import { getVoidConfigFromPartial } from '../webviews/common/contextForConfig'; -import { DiffProvider } from './DiffProvider'; +import { DiffProvider } from '../../DiffProvider'; import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; -import { SidebarWebviewProvider } from './providers/SidebarWebviewProvider'; +import { SidebarWebviewProvider } from '../sidebar/SidebarWebviewProvider'; import { CtrlKWebviewProvider } from './providers/CtrlKWebviewProvider'; const roundRangeToLines = (selection: vscode.Selection) => { diff --git a/src/vs/workbench/contrib/void/browser/void/package.json b/src/vs/workbench/contrib/void/browser/misc/oldpackage.json similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/package.json rename to src/vs/workbench/contrib/void/browser/misc/oldpackage.json diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/styles.css b/src/vs/workbench/contrib/void/browser/misc/styles.css similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/styles.css rename to src/vs/workbench/contrib/void/browser/misc/styles.css diff --git a/src/vs/workbench/contrib/void/browser/void/tailwind.config.js b/src/vs/workbench/contrib/void/browser/misc/tailwind.config.js similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/tailwind.config.js rename to src/vs/workbench/contrib/void/browser/misc/tailwind.config.js diff --git a/src/vs/workbench/contrib/void/browser/void/.vscode/extensions.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/.vscode/extensions.json rename to src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json diff --git a/src/vs/workbench/contrib/void/browser/void/.vscode/launch.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/.vscode/launch.json rename to src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json diff --git a/src/vs/workbench/contrib/void/browser/void/.vscode/settings.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/.vscode/settings.json rename to src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json diff --git a/src/vs/workbench/contrib/void/browser/void/.vscode/tasks.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/.vscode/tasks.json rename to src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/Sidebar.tsx b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx similarity index 72% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/Sidebar.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx index 70bf1c3be..b04548de2 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/Sidebar.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx @@ -1,11 +1,7 @@ -import React, { useState, useEffect, useRef, useCallback, FormEvent } from "react" -import { CodeSelection, ChatMessage, MessageToSidebar } from "../../common/shared_types" -import { awaitVSCodeResponse, getVSCodeAPI, onMessageFromVSCode, useOnVSCodeMessage } from "../common/getVscodeApi" - -import { SidebarThreadSelector } from "./SidebarThreadSelector"; -import { SidebarChat } from "./SidebarChat"; -import { SidebarSettings } from "./SidebarSettings"; -import { identifyUser } from "../common/posthog"; +import React, { useState, useRef } from '../void-imports/react.js' +import { SidebarThreadSelector } from './SidebarThreadSelector.js'; +import { SidebarChat } from './SidebarChat.js'; +import { SidebarSettings } from './SidebarSettings.js'; const Sidebar = () => { diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx similarity index 97% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarChat.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx index 81591fa4e..746b51e6a 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx @@ -6,11 +6,11 @@ import MarkdownRender from "./markdown/MarkdownRender"; import BlockCode from "./markdown/BlockCode"; import { File, ChatMessage, CodeSelection } from "../../common/shared_types"; import * as vscode from 'vscode' -import { awaitVSCodeResponse, getVSCodeAPI, onMessageFromVSCode, useOnVSCodeMessage } from "../common/getVscodeApi"; -import { useThreads } from "../common/contextForThreads"; +import { awaitVSCodeResponse, getVSCodeAPI, onMessageFromVSCode, useOnVSCodeMessage } from "../util/getVscodeApi"; +import { useThreads } from "../util/contextForThreads"; import { sendLLMMessage } from "../../common/sendLLMMessage"; -import { useVoidConfig } from "../common/contextForConfig"; -import { captureEvent } from "../common/posthog"; +import { useVoidConfig } from "../util/contextForConfig"; +import { captureEvent } from "../util/posthog"; import { generateDiffInstructions } from "../../common/systemPrompts"; diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarSettings.tsx b/src/vs/workbench/contrib/void/browser/sidebar/SidebarSettings.tsx similarity index 99% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarSettings.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/SidebarSettings.tsx index f144fd112..48ff3eab0 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarSettings.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarSettings.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { configFields, useVoidConfig, VoidConfigField } from "../common/contextForConfig"; +import { configFields, useVoidConfig, VoidConfigField } from "../util/contextForConfig"; const SettingOfFieldAndParam = ({ field, param }: { field: VoidConfigField, param: string }) => { diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarThreadSelector.tsx b/src/vs/workbench/contrib/void/browser/sidebar/SidebarThreadSelector.tsx similarity index 96% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarThreadSelector.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/SidebarThreadSelector.tsx index 3d785d1bc..aa09456c6 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/SidebarThreadSelector.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarThreadSelector.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ThreadsProvider, useThreads } from "../common/contextForThreads"; +import { ThreadsProvider, useThreads } from "../util/contextForThreads"; const truncate = (s: string) => { @@ -76,4 +76,4 @@ export const SidebarThreadSelector = ({ onClose }: { onClose: () => void }) => { ) -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/void/browser/void/src/extension/providers/SidebarWebviewProvider.ts b/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts similarity index 92% rename from src/vs/workbench/contrib/void/browser/void/src/extension/providers/SidebarWebviewProvider.ts rename to src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts index 0ca1d8955..08191944d 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/extension/providers/SidebarWebviewProvider.ts +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts @@ -1,7 +1,7 @@ // renders the code from `src/sidebar` import * as vscode from 'vscode'; -import { updateWebviewHTML as _updateWebviewHTML } from '../extensionLib/updateWebviewHTML'; +import { updateWebviewHTML as _updateWebviewHTML } from './src/extension/extensionLib/updateWebviewHTML'; export class SidebarWebviewProvider implements vscode.WebviewViewProvider { public static readonly viewId = 'void.viewnumberone'; diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForConfig.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForConfig.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForProps.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForProps.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForThreads.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/common/contextForThreads.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx diff --git a/src/vs/workbench/contrib/void/browser/sidebar/index.tsx b/src/vs/workbench/contrib/void/browser/sidebar/index.tsx new file mode 100644 index 000000000..966a0a776 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/sidebar/index.tsx @@ -0,0 +1,7 @@ +// import React from "react" +// import Sidebar from "./Sidebar" +// import { mount } from "../util/mount" + +// this is the entry point that mounts the sidebar +mount() + diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/BlockCode.tsx b/src/vs/workbench/contrib/void/browser/sidebar/markdown/BlockCode.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/BlockCode.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/markdown/BlockCode.tsx diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/MarkdownRender.tsx b/src/vs/workbench/contrib/void/browser/sidebar/markdown/MarkdownRender.tsx similarity index 98% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/MarkdownRender.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/markdown/MarkdownRender.tsx index cbdb82d13..914800872 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/markdown/MarkdownRender.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/markdown/MarkdownRender.tsx @@ -1,7 +1,7 @@ import React, { JSX, useCallback, useEffect, useState } from "react" import { marked, MarkedToken, Token, TokensList } from "marked" import BlockCode from "./BlockCode" -import { getVSCodeAPI } from "../../common/getVscodeApi" +import { getVSCodeAPI } from "../../util/getVscodeApi" enum CopyButtonState { diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts b/src/vs/workbench/contrib/void/browser/util/posthog.ts similarity index 92% rename from src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts rename to src/vs/workbench/contrib/void/browser/util/posthog.ts index 72e95ccc1..cccf20102 100644 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/posthog.ts +++ b/src/vs/workbench/contrib/void/browser/util/posthog.ts @@ -1,5 +1,4 @@ -import posthog from 'posthog-js' - +import posthog from '../void-imports/posthog-js.js' export const identifyUser = (id: string) => { posthog.identify(id) diff --git a/src/vs/workbench/contrib/void/browser/void/src/common/sendLLMMessage.ts b/src/vs/workbench/contrib/void/browser/util/sendLLMMessage.ts similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/common/sendLLMMessage.ts rename to src/vs/workbench/contrib/void/browser/util/sendLLMMessage.ts diff --git a/src/vs/workbench/contrib/void/browser/void/src/common/shared_types.ts b/src/vs/workbench/contrib/void/browser/util/shared_types.ts similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/common/shared_types.ts rename to src/vs/workbench/contrib/void/browser/util/shared_types.ts diff --git a/src/vs/workbench/contrib/void/browser/void/src/common/systemPrompts.ts b/src/vs/workbench/contrib/void/browser/util/systemPrompts.ts similarity index 100% rename from src/vs/workbench/contrib/void/browser/void/src/common/systemPrompts.ts rename to src/vs/workbench/contrib/void/browser/util/systemPrompts.ts diff --git a/src/vs/workbench/contrib/void/browser/void/.eslintrc b/src/vs/workbench/contrib/void/browser/void/.eslintrc deleted file mode 100644 index f47a9afdb..000000000 --- a/src/vs/workbench/contrib/void/browser/void/.eslintrc +++ /dev/null @@ -1,56 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "plugins": [ - "@typescript-eslint", - "react", - "react-hooks" - ], - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended" - ], - "rules": { - "@typescript-eslint/naming-convention": [ - "warn", - { - "selector": "import", - "format": [ - "camelCase", - "PascalCase" - ] - } - ], - "curly": "off", - "eqeqeq": "warn", - "no-empty": "off", - "no-throw-literal": "warn", - "semi": "off", - "no-unused-vars": "off", - "react-hooks/exhaustive-deps": "warn" - }, - "ignorePatterns": [ - "out", - "dist", - "**/*.d.ts" - ], - "settings": { - "react": { - "version": "detect" - } - }, - "env": { - "browser": true, // enable browser globals linting (window, document, console, etc) - "es6": true, // enable ES6 linting - "node": true, // enable Node linting (things like Buffer which is used in file reading, etc) - "mocha": true // enable Mocha linting - } -} \ No newline at end of file diff --git a/src/vs/workbench/contrib/void/browser/void/.gitignore b/src/vs/workbench/contrib/void/browser/void/.gitignore deleted file mode 100644 index 0b60dfa12..000000000 --- a/src/vs/workbench/contrib/void/browser/void/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -out -dist -node_modules -.vscode-test/ -*.vsix diff --git a/src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs b/src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs deleted file mode 100644 index b62ba25f0..000000000 --- a/src/vs/workbench/contrib/void/browser/void/.vscode-test.mjs +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from '@vscode/test-cli'; - -export default defineConfig({ - files: 'out/test/**/*.test.js', -}); diff --git a/src/vs/workbench/contrib/void/browser/void/.vscodeignore b/src/vs/workbench/contrib/void/browser/void/.vscodeignore deleted file mode 100644 index 72aa0fe2e..000000000 --- a/src/vs/workbench/contrib/void/browser/void/.vscodeignore +++ /dev/null @@ -1,11 +0,0 @@ -.vscode/** -.vscode-test/** -src/** -.gitignore -.yarnrc -vsc-extension-quickstart.md -**/tsconfig.json -**/.eslintrc.json -**/*.map -**/*.ts -**/.vscode-test.* diff --git a/src/vs/workbench/contrib/void/browser/void/README.md b/src/vs/workbench/contrib/void/browser/void/README.md deleted file mode 100644 index d455ba30f..000000000 --- a/src/vs/workbench/contrib/void/browser/void/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Please see the `CONTRIBUTING.md` for information on how to contribute :)! - - -Here's an overview on how the extension works: - -- The extension mounts in `extension.ts`. - -- The Sidebar's HTML (everything in `sidebar/`) is built in React, and it's rendered by mounting a ` - - `; - - webview.html = webviewHTML - - webview.options = { - enableScripts: true, - localResourceRoots: [extensionUri] - }; -} diff --git a/src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts deleted file mode 100644 index 02d073a7e..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/extension/findDiffs.ts +++ /dev/null @@ -1,132 +0,0 @@ - -import { Range } from 'vscode'; -import { diffLines, Change } from 'diff'; -import { BaseDiff } from '../common/shared_types'; - - - -// class Range { -// range: any; -// constructor(startLine, startCol, endLine, endCol) { -// const range = { -// startLine, -// startCol, -// endLine, -// endCol, -// }; -// this.range = range; -// } -// } - - - -// Andrew diff algo: -export type SuggestedEdit = { - // start/end of current file - newRange: Range; - - // start/end of original file - originalRange: Range; - type: 'insertion' | 'deletion' | 'edit', - originalContent: string, // original content (originalfile[originalStart...originalEnd]) - newContent: string, -} - -export function findDiffs(oldStr: string, newStr: string) { - // an ordered list of every original line, line added to the new file, and line removed from the old file (order is unambiguous, think about it) - const lineByLineChanges: Change[] = diffLines(oldStr, newStr); - lineByLineChanges.push({ value: '' }) // add a dummy so we flush any streaks we haven't yet at the very end (!line.added && !line.removed) - - let oldFileLineNum: number = 0; - let newFileLineNum: number = 0; - - let streakStartInNewFile: number | undefined = undefined - let streakStartInOldFile: number | undefined = undefined - - let oldStrLines = oldStr.split('\n') - let newStrLines = newStr.split('\n') - - const replacements: BaseDiff[] = [] - for (let line of lineByLineChanges) { - - // no change on this line - if (!line.added && !line.removed) { - - // do nothing - - // if we were on a streak of +s and -s, end it - if (streakStartInNewFile !== undefined) { - let type: 'edit' | 'insertion' | 'deletion' = 'edit' - - let startLine = streakStartInNewFile - let endLine = newFileLineNum - 1 // don't include current line, the edit was up to this line but not including it - let startCol = 0 - let endCol = Number.MAX_SAFE_INTEGER - - let originalStartLine = streakStartInOldFile! - let originalEndLine = oldFileLineNum - 1 // don't include current line, the edit was up to this line but not including it - let originalStartCol = 0 - let originalEndCol = Number.MAX_SAFE_INTEGER - - let newContent = newStrLines.slice(startLine, endLine + 1).join('\n') - let originalContent = oldStrLines.slice(originalStartLine, originalEndLine + 1).join('\n') - - // if the range is empty, mark it as a deletion / insertion (both won't be true at once) - // DELETION - if (endLine === startLine - 1) { - type = 'deletion' - endLine = startLine - startCol = 0 - endCol = 0 - newContent += '\n' - } - - // INSERTION - else if (originalEndLine === originalStartLine - 1) { - type = 'insertion' - originalEndLine = originalStartLine - originalStartCol = 0 - originalEndCol = 0 - } - - const replacement: BaseDiff = { - type, - range: new Range(startLine, startCol, endLine, endCol), - code: newContent, - originalRange: new Range(originalStartLine, originalStartCol, originalEndLine, originalEndCol), - originalCode: originalContent, - } - - replacements.push(replacement) - - streakStartInNewFile = undefined - streakStartInOldFile = undefined - } - oldFileLineNum += line.count ?? 0; - newFileLineNum += line.count ?? 0; - } - - // line was removed from old file - else if (line.removed) { - // if we weren't on a streak, start one on this current line num - if (streakStartInNewFile === undefined) { - streakStartInNewFile = newFileLineNum - streakStartInOldFile = oldFileLineNum - } - oldFileLineNum += line.count ?? 0 // we processed the line so add 1 - } - - // line was added to new file - else if (line.added) { - // if we weren't on a streak, start one on this current line num - if (streakStartInNewFile === undefined) { - streakStartInNewFile = newFileLineNum - streakStartInOldFile = oldFileLineNum - } - newFileLineNum += line.count ?? 0; // we processed the line so add 1 - } - } // end for - - console.debug('Replacements', replacements) - return replacements -} diff --git a/src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts b/src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts deleted file mode 100644 index a8e2c881e..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/extension/providers/CtrlKWebviewProvider.ts +++ /dev/null @@ -1,41 +0,0 @@ -// renders the code from `src/sidebar` - -import * as vscode from 'vscode'; -import { updateWebviewHTML as _updateWebviewHTML, updateWebviewHTML } from '../extensionLib/updateWebviewHTML'; - - -export class CtrlKWebviewProvider { - - private readonly _extensionUri: vscode.Uri - - private _idPool = 0 - - - - constructor(context: vscode.ExtensionContext) { - this._extensionUri = context.extensionUri - } - - onPressCtrlK() { - - // // TODO if currently selecting a ctrl k element, just focus it and do nothing - - - // const inset = vscode.window.createWebviewTextEditorInset(editor, line, height); - - - // const newCtrlKId = this._idPool++ - // updateWebviewHTML(inset.webview, this._extensionUri, { jsOutLocation: 'dist/webviews/ctrlk/index.js', cssOutLocation: 'dist/webviews/styles.css' }, - // { id: newCtrlKId } - // ) - - // ctrlKWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+k', selection: { selectionStr, selectionRange, filePath } } satisfies MessageToSidebar)); - - - } - - onDisposeCtrlK() { - - } - -} diff --git a/src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts b/src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts deleted file mode 100644 index 4ca0ab419..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/test/extension.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as assert from 'assert'; - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -import * as vscode from 'vscode'; -// import * as myExtension from '../../extension'; - -suite('Extension Test Suite', () => { - vscode.window.showInformationMessage('Start all tests.'); - - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); - }); -}); diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts deleted file mode 100644 index cf9d53eaf..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/getVscodeApi.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { useEffect } from "react"; -import { MessageFromSidebar, MessageToSidebar, } from "../../common/shared_types"; -import { v4 as uuidv4 } from 'uuid'; - - -type Command = MessageToSidebar['type'] - -// messageType -> res[] -const onetimeCallbacks: { [C in Command]: ((res: any) => void)[] } = { - "ctrl+l": [], - "ctrl+k": [], - "files": [], - "partialVoidConfig": [], - "startNewThread": [], - "allThreads": [], - "toggleThreadSelector": [], - "toggleSettings": [], - "deviceId": [], -} - -// messageType -> id -> res -const callbacks: { [C in Command]: { [id: string]: ((res: any) => void) } } = { - "ctrl+l": {}, - "ctrl+k": {}, - "files": {}, - "partialVoidConfig": {}, - "startNewThread": {}, - "allThreads": {}, - "toggleThreadSelector": {}, - "toggleSettings": {}, - "deviceId": {} -} - - -// use this function to await responses -export const awaitVSCodeResponse = (c: C) => { - let result: Promise = new Promise((res, rej) => { - onetimeCallbacks[c].push(res) - }) - return result -} - - -// use this function to add a listener to a certain type of message -export const useOnVSCodeMessage = (messageType: C, fn: (e: MessageToSidebar & { type: C }) => void) => { - useEffect(() => { - const mType = messageType - const callbackId: string = uuidv4(); - // @ts-ignore - callbacks[mType][callbackId] = fn; - return () => { delete callbacks[mType][callbackId] } - }, [messageType, fn]) -} - - - -// this function gets called whenever sidebar receives a message - it should only mount once -export const onMessageFromVSCode = (m: MessageToSidebar) => { - // resolve all promises for this message type - for (let res of onetimeCallbacks[m.type]) { - res(m) - onetimeCallbacks[m.type].splice(0) // clear the array - } - // call the listener for this message type - for (let res of Object.values(callbacks[m.type])) { - res(m) - } -} - - - -type AcquireVsCodeApiType = () => { - postMessage(message: MessageFromSidebar): void; - // setState(state: any): void; // getState and setState are made obsolete by us using { retainContextWhenHidden: true } - // getState(): any; -}; - -// VS Code exposes the function acquireVsCodeApi() to us, this variable makes sure it only gets called once -let vsCodeApi: ReturnType | undefined; - -export function getVSCodeAPI(): ReturnType { - if (vsCodeApi) - return vsCodeApi; - - try { - // @ts-expect-error - // eslint-disable-next-line no-undef - vsCodeApi = acquireVsCodeApi(); - return vsCodeApi!; - } catch (error) { - console.error('Failed to acquire VS Code API:', error); - throw new Error('This script must be run in a VS Code webview context'); - } -} diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx deleted file mode 100644 index a07b46b70..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/common/mount.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useEffect } from "react"; -import * as ReactDOM from "react-dom/client" -import { MessageToSidebar } from "../../common/shared_types"; -import { getVSCodeAPI, awaitVSCodeResponse, onMessageFromVSCode } from "./getVscodeApi"; -import { initPosthog, identifyUser } from "./posthog"; -import { ThreadsProvider } from "./contextForThreads"; -import { ConfigProvider } from "./contextForConfig"; -import { PropsProvider } from "./contextForProps"; - -const ListenersAndTracking = () => { - // initialize posthog - useEffect(() => { - initPosthog() - }, []) - - // when we get the deviceid, identify the user - useEffect(() => { - getVSCodeAPI().postMessage({ type: 'getDeviceId' }); - awaitVSCodeResponse('deviceId').then((m => { - identifyUser(m.deviceId) - })) - }, []) - - // Receive messages from the VSCode extension - useEffect(() => { - const listener = (event: MessageEvent) => { - const m = event.data as MessageToSidebar; - onMessageFromVSCode(m) - } - window.addEventListener('message', listener); - return () => window.removeEventListener('message', listener) - }, []) - - return null -} - - - - -export const mount = (children: React.ReactNode) => { - - if (typeof document === "undefined") { - console.error("index.tsx error: document was undefined") - return - } - - // mount the sidebar on the id="root" element - const rootElement = document.getElementById("root")! - // console.log("Void root Element:", rootElement) - - const content = (<> - - - - - - {children} - - - - ) - - const root = ReactDOM.createRoot(rootElement) - root.render(content); - -} diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx deleted file mode 100644 index ac1670050..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/CtrlK.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React, { useState } from 'react'; -import { useOnVSCodeMessage } from '../common/getVscodeApi'; - - -export const CtrlK = () => { - - const [x, sx] = useState('abc') - - useOnVSCodeMessage('ctrl+k', () => { - console.log('Ctrl+K pressed') - sx('Pressed ctrl+k') - }) - - // const inset = vscode.window.createWebviewTextEditorInset(editor, 10, 10, {}) - // inset.webview.html = ` - // - // Hello World! - // - // `; - - return <> -
- {x} -
- -}; - diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx deleted file mode 100644 index 9141b713b..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/ctrlk/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react" -import { mount } from "../common/mount" -import { CtrlK } from "./CtrlK" - -// this is the entry point that mounts ctrlk -mount() - diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx deleted file mode 100644 index 6fbe8b6c7..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/DiffLine.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { useState } from 'react'; -import { useOnVSCodeMessage } from '../common/getVscodeApi'; -import { useVoidProps } from '../common/contextForProps'; - - -type props = { - text: string -} - -export const DiffLine = () => { - - const props = useVoidProps() - - console.log('props!', props) - - if (!props) { - return null - } - - // eslint-disable-next-line react/prop-types - const text = props.text - - return <> -
- {text} -
- -}; - diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx deleted file mode 100644 index dc9a59b99..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/diffline/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react" -import { mount } from "../common/mount" -import { DiffLine } from "./DiffLine" - -// this is the entry point that mounts diffline -mount() - diff --git a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx b/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx deleted file mode 100644 index 775de304b..000000000 --- a/src/vs/workbench/contrib/void/browser/void/src/webviews/sidebar/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react" -import Sidebar from "./Sidebar" -import { mount } from "../common/mount" - -// this is the entry point that mounts the sidebar -mount() - diff --git a/src/vs/workbench/contrib/void/browser/void/tsconfig.json b/src/vs/workbench/contrib/void/browser/void/tsconfig.json deleted file mode 100644 index 0eac21ecf..000000000 --- a/src/vs/workbench/contrib/void/browser/void/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "include": [ - "src/**/*", - "../../src/vscode-dts/vscode.d.ts", - ], - "exclude": [ - "node_modules" - ], - "compilerOptions": { - "jsx": "react", - "module": "Node16", - "target": "ES6", - "outDir": "out", - "types": [ - "node", - "mocha", - ], - "lib": [ - "dom", - "es6", - "dom.iterable", - ], - "sourceMap": true, - "rootDir": "src", - "strict": true, /* enable all strict type-checking options */ - /* Additional Checks */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - } -} diff --git a/src/vs/workbench/contrib/void/browser/voidViewPane.tsx b/src/vs/workbench/contrib/void/browser/voidViewPane.ts similarity index 87% rename from src/vs/workbench/contrib/void/browser/voidViewPane.tsx rename to src/vs/workbench/contrib/void/browser/voidViewPane.ts index f1ffaf987..1bbf86e10 100644 --- a/src/vs/workbench/contrib/void/browser/voidViewPane.tsx +++ b/src/vs/workbench/contrib/void/browser/voidViewPane.ts @@ -1,5 +1,6 @@ +import * as dom from '../../../../base/browser/dom.js'; import { ViewPane } from '../../../browser/parts/views/viewPane.js'; @@ -15,8 +16,8 @@ import { ViewPane } from '../../../browser/parts/views/viewPane.js'; // import { IViewDescriptorService } from 'vs/workbench/common/views'; // import { IHoverService } from 'vs/platform/hover/browser/hover'; -import React from './void-imports/react.js' -import { render } from './void-imports/react-dom.js' +// import { useState } from './void-imports/react.js'; +// const x = useState(); export class VoidViewPane extends ViewPane { @@ -41,14 +42,10 @@ export class VoidViewPane extends ViewPane { protected override renderBody(parent: HTMLElement): void { super.renderBody(parent); + const container = dom.append(parent, dom.$('.search-view')); + container.textContent = 'Hello Void!'; - const x = <> - - - - - - render() + console.log('Void container', container); } diff --git a/void-imports/README.txt b/void-imports/README.txt new file mode 100644 index 000000000..818e920f2 --- /dev/null +++ b/void-imports/README.txt @@ -0,0 +1 @@ +Use the command 'tsx' to run the main file here \ No newline at end of file diff --git a/void-imports/build-to-be-built.ts b/void-imports/build-to-be-built.ts deleted file mode 100644 index dc1b25a4e..000000000 --- a/void-imports/build-to-be-built.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as path from 'path' -import * as fs from 'fs' - diff --git a/void-imports/compile-to-be-built.ts b/void-imports/compile-to-be-built.ts deleted file mode 100644 index 7f1eaf61d..000000000 --- a/void-imports/compile-to-be-built.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as esbuild from 'esbuild' -import * as path from 'path' - -// import tsup from 'tsup' // Void added tsup as a dependency -// import * as path from 'path' - - -// export const compileFiles = async (imports: string[], src_folder: string, outDir: string) => { -// const fileEntries = imports.map((importName) => path.join(src_folder, `${importName}.ts`)) -// await tsup.build({ -// entry: fileEntries, -// format: ['cjs'], -// sourcemap: false, -// bundle: true, -// clean: true, -// // minify: true, // no need to minify since it all gets bundled later -// outDir: path.join(outDir), -// dts: false, -// noExternal: [/.*/], // This bundles everything -// platform: 'browser', // Important for browser compatibility -// target: 'es2020', -// banner: { -// js: '/* eslint-disable */' -// } -// }) -// } diff --git a/void-imports/index.ts b/void-imports/index.ts index 602518421..b8f97c959 100755 --- a/void-imports/index.ts +++ b/void-imports/index.ts @@ -1,14 +1,13 @@ import * as fs from 'fs' import * as path from 'path' -import tsup from 'tsup' // Void added tsup as a dependency +import * as tsup from 'tsup' - -const buildFiles = (imports, to_be_built_folder) => { - // create a file with name importName that imports importName and immediately re-exports it +const buildFiles = (imports: string[], to_be_built_folder: string) => { for (const importName of imports) { const content = `\ -export * from '${importName}' -` +export * from '${importName}'; +`; + const dir = path.dirname(importName); const file = path.basename(importName); @@ -23,8 +22,7 @@ export * from '${importName}' - -const compileFiles = async (imports, to_be_built_folder, outDir) => { +const compileFiles = async (imports: string[], to_be_built_folder: string, outDir: string) => { const fileEntries = imports.map((importName) => path.join(to_be_built_folder, `${importName}.ts`)) await tsup.build({ entry: fileEntries, @@ -38,6 +36,7 @@ const compileFiles = async (imports, to_be_built_folder, outDir) => { noExternal: [/.*/], // This bundles everything platform: 'browser', // Important for browser compatibility target: 'es2020', + outExtension: () => ({ js: '.js' }) }) } From 3fd435750366e6691c3827e3c7314e9c4abc9fe7 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 8 Nov 2024 02:23:11 -0800 Subject: [PATCH 019/107] progress migrating to native vscode --- package-lock.json | 26 + package.json | 2 + .../contrib/void/browser/registerMetrics.ts | 37 + .../contrib/void/browser/registerSettings.ts | 275 ++++++ .../contrib/void/browser/registerSidebar.ts | 306 +++++++ .../void/browser/registerThreadsHistory.ts | 137 +++ .../contrib/void/browser/registerViewPane.ts | 66 -- .../contrib/void/browser/sidebar/Sidebar.tsx | 58 +- .../void/browser/sidebar/contextForConfig.tsx | 522 +++++------ .../void/browser/sidebar/contextForProps.tsx | 36 - .../browser/sidebar/contextForThreads.tsx | 182 ++-- .../contrib/void/browser/sidebar/index.tsx | 7 - .../contrib/void/browser/util/mount.tsx | 61 ++ .../contrib/void/browser/util/shared_types.ts | 56 +- .../contrib/void/browser/void.contribution.ts | 10 +- .../contrib/void/browser/voidViewPane.ts | 56 -- void-imports/index.ts | 9 +- void-imports/package-lock.json | 817 ++++++++++++++++++ void-imports/package.json | 19 + .../util => void-imports}/sendLLMMessage.ts | 22 +- void-imports/tsconfig.json | 12 + 21 files changed, 2127 insertions(+), 589 deletions(-) create mode 100644 src/vs/workbench/contrib/void/browser/registerMetrics.ts create mode 100644 src/vs/workbench/contrib/void/browser/registerSettings.ts create mode 100644 src/vs/workbench/contrib/void/browser/registerSidebar.ts create mode 100644 src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts delete mode 100644 src/vs/workbench/contrib/void/browser/registerViewPane.ts delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/index.tsx create mode 100644 src/vs/workbench/contrib/void/browser/util/mount.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/voidViewPane.ts create mode 100644 void-imports/package-lock.json create mode 100644 void-imports/package.json rename {src/vs/workbench/contrib/void/browser/util => void-imports}/sendLLMMessage.ts (96%) create mode 100644 void-imports/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 2b9a985b7..82a0032e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -43,6 +44,7 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", + "ollama": "^0.5.9", "open": "^8.4.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", @@ -1554,6 +1556,15 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@google/generative-ai": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", + "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@gulp-sourcemaps/identity-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", @@ -15276,6 +15287,15 @@ "node": ">=0.10.0" } }, + "node_modules/ollama": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", + "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", + "license": "MIT", + "dependencies": { + "whatwg-fetch": "^3.6.20" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -21885,6 +21905,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", diff --git a/package.json b/package.json index c87592287..7b7b6aee9 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "update-build-ts-version": "npm install typescript@next && tsc -p ./build/tsconfig.build.json" }, "dependencies": { + "@google/generative-ai": "^0.21.0", "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "2.1.0", @@ -105,6 +106,7 @@ "native-keymap": "^3.3.5", "native-watchdog": "^1.4.1", "node-pty": "1.1.0-beta21", + "ollama": "^0.5.9", "open": "^8.4.2", "tas-client-umd": "0.2.0", "v8-inspect-profiler": "^0.1.1", diff --git a/src/vs/workbench/contrib/void/browser/registerMetrics.ts b/src/vs/workbench/contrib/void/browser/registerMetrics.ts new file mode 100644 index 000000000..4c256d301 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/registerMetrics.ts @@ -0,0 +1,37 @@ +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions'; +import { createDecorator } from '../../../../platform/instantiation/common/instantiation'; +import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry'; + +interface IMetricsService { + readonly _serviceBrand: undefined; +} + +const IMetricsService = createDecorator('inlineDiffService'); +class MetricsService extends Disposable implements IMetricsService { + _serviceBrand: undefined; + + constructor( + @ITelemetryService private readonly _telemetryService: ITelemetryService + ) { + super() + } + + init() { + + posthog.init('phc_UanIdujHiLp55BkUTjB1AuBXcasVkdqRwgnwRlWESH2', + { + api_host: 'https://us.i.posthog.com', + person_profiles: 'identified_only' // we only track events from identified users. We identify them in Sidebar + } + ) + + const deviceId = this._telemetryService.devDeviceId + console.debug('deviceId', deviceId) + + posthog.identify(deviceId) + } + +} + +registerSingleton(IMetricsService, MetricsService, InstantiationType.Eager); diff --git a/src/vs/workbench/contrib/void/browser/registerSettings.ts b/src/vs/workbench/contrib/void/browser/registerSettings.ts new file mode 100644 index 000000000..0297c0352 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/registerSettings.ts @@ -0,0 +1,275 @@ +import { Emitter, Event } from '../../../../base/common/event.js'; +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { IEncryptionService } from '../../../../platform/encryption/common/encryptionService.js'; +import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js'; +import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; +import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; + +const configEnum = (description: string, defaultVal: EnumArr[number], enumArr: EnumArr) => { + return { + description, + defaultVal, + enumArr, + } +} + +const configString = (description: string, defaultVal: string) => { + return { + description, + defaultVal, + enumArr: undefined, + } +} + +// fields you can customize (don't forget 'default' - it isn't included here!) +export const nonDefaultConfigFields = [ + 'anthropic', + 'openAI', + 'gemini', + 'greptile', + 'ollama', + 'openRouter', + 'openAICompatible', + 'azure', +] as const + + + +const voidConfigInfo: Record< + typeof nonDefaultConfigFields[number] | 'default', { + [prop: string]: { + description: string, + enumArr?: readonly string[] | undefined, + defaultVal: string, + }, + } +> = { + default: { + whichApi: configEnum( + "API Provider.", + 'anthropic', + nonDefaultConfigFields, + ), + + maxTokens: configEnum( + "Max number of tokens to output.", + '1024', + [ + "default", // this will be parseInt'd into NaN and ignored by the API. Anything that's not a number has this behavior. + "1024", + "2048", + "4096", + "8192" + ] as const, + ), + + }, + anthropic: { + apikey: configString('Anthropic API key.', ''), + model: configEnum( + "Anthropic model to use.", + 'claude-3-5-sonnet-20240620', + [ + "claude-3-5-sonnet-20240620", + "claude-3-opus-20240229", + "claude-3-sonnet-20240229", + "claude-3-haiku-20240307" + ] as const, + ), + }, + openAI: { + apikey: configString('OpenAI API key.', ''), + model: configEnum( + 'OpenAI model to use.', + 'gpt-4o', + [ + "o1-preview", + "o1-mini", + "gpt-4o", + "gpt-4o-2024-05-13", + "gpt-4o-2024-08-06", + "gpt-4o-mini", + "gpt-4o-mini-2024-07-18", + "gpt-4-turbo", + "gpt-4-turbo-2024-04-09", + "gpt-4-turbo-preview", + "gpt-4-0125-preview", + "gpt-4-1106-preview", + "gpt-4", + "gpt-4-0613", + "gpt-3.5-turbo-0125", + "gpt-3.5-turbo", + "gpt-3.5-turbo-1106" + ] as const + ), + }, + greptile: { + apikey: configString('Greptile API key.', ''), + githubPAT: configString('Github PAT that Greptile uses to access your repository', ''), + remote: configEnum( + 'Repo location', + 'github', + [ + 'github', + 'gitlab' + ] as const + ), + repository: configString('Repository identifier in "owner/repository" format.', ''), + branch: configString('Name of the branch to use.', 'main'), + }, + ollama: { + endpoint: configString( + 'The endpoint of your Ollama instance. Start Ollama by running `OLLAMA_ORIGINS="vscode-webview://*" ollama serve`.', + 'http://127.0.0.1:11434' + ), + // TODO we should allow user to select model inside Void, but for now we'll just let them handle the Ollama setup on their own + // model: configEnum( + // 'Ollama model to use.', + // 'llama3.1', + // ["codegemma", "codegemma:2b", "codegemma:7b", "codellama", "codellama:7b", "codellama:13b", "codellama:34b", "codellama:70b", "codellama:code", "codellama:python", "command-r", "command-r:35b", "command-r-plus", "command-r-plus:104b", "deepseek-coder-v2", "deepseek-coder-v2:16b", "deepseek-coder-v2:236b", "falcon2", "falcon2:11b", "firefunction-v2", "firefunction-v2:70b", "gemma", "gemma:2b", "gemma:7b", "gemma2", "gemma2:2b", "gemma2:9b", "gemma2:27b", "llama2", "llama2:7b", "llama2:13b", "llama2:70b", "llama3", "llama3:8b", "llama3:70b", "llama3-chatqa", "llama3-chatqa:8b", "llama3-chatqa:70b", "llama3-gradient", "llama3-gradient:8b", "llama3-gradient:70b", "llama3.1", "llama3.1:8b", "llama3.1:70b", "llama3.1:405b", "llava", "llava:7b", "llava:13b", "llava:34b", "llava-llama3", "llava-llama3:8b", "llava-phi3", "llava-phi3:3.8b", "mistral", "mistral:7b", "mistral-large", "mistral-large:123b", "mistral-nemo", "mistral-nemo:12b", "mixtral", "mixtral:8x7b", "mixtral:8x22b", "moondream", "moondream:1.8b", "openhermes", "openhermes:v2.5", "phi3", "phi3:3.8b", "phi3:14b", "phi3.5", "phi3.5:3.8b", "qwen", "qwen:7b", "qwen:14b", "qwen:32b", "qwen:72b", "qwen:110b", "qwen2", "qwen2:0.5b", "qwen2:1.5b", "qwen2:7b", "qwen2:72b", "smollm", "smollm:135m", "smollm:360m", "smollm:1.7b"] as const + // ), + }, + openRouter: { + model: configString( + 'OpenRouter model to use.', + 'openai/gpt-4o' + ), + apikey: configString('OpenRouter API key.', ''), + }, + openAICompatible: { + endpoint: configString('The baseUrl (exluding /chat/completions).', 'http://127.0.0.1:11434/v1'), + model: configString('The name of the model to use.', 'gpt-4o'), + apikey: configString('Your API key.', ''), + }, + azure: { + // "void.azure.apiKey": { + // "type": "string", + // "description": "Azure API key." + // }, + // "void.azure.deploymentId": { + // "type": "string", + // "description": "Azure API deployment ID." + // }, + // "void.azure.resourceName": { + // "type": "string", + // "description": "Name of the Azure OpenAI resource. Either this or `baseURL` can be used. \nThe resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/deployments/{modelId}{path}`" + // }, + // "void.azure.providerSettings": { + // "type": "object", + // "properties": { + // "baseURL": { + // "type": "string", + // "default": "https://${resourceName}.openai.azure.com/openai/deployments", + // "description": "Azure API base URL." + // }, + // "headers": { + // "type": "object", + // "description": "Custom headers to include in the requests." + // } + // } + // }, + }, + gemini: { + apikey: configString('Google API key.', ''), + model: configEnum( + 'Gemini model to use.', + 'gemini-1.5-flash', + [ + "gemini-1.5-flash", + "gemini-1.5-pro", + "gemini-1.5-flash-8b", + "gemini-1.0-pro" + ] as const + ), + }, +} + + +// this is the type that comes with metadata like desc, default val, etc +type VoidConfigInfo = typeof voidConfigInfo +export type VoidConfigField = keyof typeof voidConfigInfo // typeof configFields[number] + +// this is the type that specifies the user's actual config +export type PartialVoidConfig = { + [K in keyof typeof voidConfigInfo]?: { + [P in keyof typeof voidConfigInfo[K]]?: typeof voidConfigInfo[K][P]['defaultVal'] + } +} + +export type VoidConfig = { + [K in keyof typeof voidConfigInfo]: { + [P in keyof typeof voidConfigInfo[K]]: typeof voidConfigInfo[K][P]['defaultVal'] + } +} + + +const VOID_CONFIG_KEY = 'void.partialVoidConfig' + +export interface IVoidSettingsService { + readonly _serviceBrand: undefined; +} + +export const IVoidSettingsService = createDecorator('voidSettingsService'); +class VoidSettingsService extends Disposable implements IVoidSettingsService { + _serviceBrand: undefined; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + + async getPartialVoidConfig(): Promise { + const encryptedPartialConfig = this._storageService.get(VOID_CONFIG_KEY, StorageScope.APPLICATION) + + if (!encryptedPartialConfig) + return {} + + const partialVoidConfigStr = await this._encryptionService.decrypt(encryptedPartialConfig) + return JSON.parse(partialVoidConfigStr) + } + + + async getVoidConfig(): Promise { + const partialVoidConfig = await this.getPartialVoidConfig() + const config = {} as PartialVoidConfig + for (let field of [...nonDefaultConfigFields, 'default'] as const) { + config[field] = {} + for (let prop in voidConfigInfo[field]) { + config[field][prop] = partialVoidConfig[field]?.[prop]?.trim() || voidConfigInfo[field][prop].defaultVal + } + } + return config as VoidConfig + } + + + private async storePartialVoidConfig(partialVoidConfig: PartialVoidConfig) { + const encryptedPartialConfigStr = await this._encryptionService.encrypt(JSON.stringify(partialVoidConfig)) + this._storageService.store(VOID_CONFIG_KEY, encryptedPartialConfigStr, StorageScope.APPLICATION, StorageTarget.USER) + } + + + // Set field on PartialVoidConfig + async setField(field: K, param: keyof VoidConfigInfo[K], newVal: string) { + const partialVoidConfig = await this.getPartialVoidConfig() + + const newPartialConfig: PartialVoidConfig = { + ...partialVoidConfig, + [field]: { + ...partialVoidConfig[field], + [param]: newVal + } + } + await this.storePartialVoidConfig(newPartialConfig) + this._onDidChange.fire() + } + + + constructor( + @IStorageService private readonly _storageService: IStorageService, + @IEncryptionService private readonly _encryptionService: IEncryptionService, + ) { + super() + } + +} + +registerSingleton(IVoidSettingsService, VoidSettingsService, InstantiationType.Eager); diff --git a/src/vs/workbench/contrib/void/browser/registerSidebar.ts b/src/vs/workbench/contrib/void/browser/registerSidebar.ts new file mode 100644 index 000000000..27a5d1b0a --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/registerSidebar.ts @@ -0,0 +1,306 @@ +import { Registry } from '../../../../platform/registry/common/platform.js'; +import { + Extensions as ViewContainerExtensions, IViewContainersRegistry, + ViewContainerLocation, IViewsRegistry, Extensions as ViewExtensions, + IViewDescriptorService, +} from '../../../common/views.js'; + +import * as nls from '../../../../nls.js'; +import * as dom from '../../../../base/browser/dom.js'; + +import { Codicon } from '../../../../base/common/codicons.js'; +import { localize } from '../../../../nls.js'; +import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js'; +import { ViewPaneContainer } from '../../../browser/parts/views/viewPaneContainer.js'; + +import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; +import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js'; + + +import { IViewPaneOptions, ViewPane } from '../../../browser/parts/views/viewPane.js'; +import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js'; +import { ServicesAccessor } from '../../../../editor/browser/editorExtensions.js'; + +import { KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js'; +import { ContextKeyExpr, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; +import { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { Emitter, Event } from '../../../../base/common/event.js'; +import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js'; +import { IViewsService } from '../../../services/views/common/viewsService.js'; +import { IThreadHistoryService } from './registerThreadsHistory.js'; +import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; +import { IThemeService } from '../../../../platform/theme/common/themeService.js'; +import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js'; +import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js'; +import { IOpenerService } from '../../../../platform/opener/common/opener.js'; +import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; +import { IHoverService } from '../../../../platform/hover/browser/hover.js'; +import { IVoidSettingsService } from './registerSettings.js'; + + +// compare against search.contribution.ts and https://app.greptile.com/chat/w1nsmt3lauwzculipycpn?repo=github%3Amain%3Amicrosoft%2Fvscode +// and debug.contribution.ts, scm.contribution.ts (source control) + +type VoidSidebarState = { + isHistoryOpen: boolean + currentTab: 'chat' | 'settings' +} + + +// ---------- Define viewpane ---------- + +class VoidSidebarViewPane extends ViewPane { + + constructor( + options: IViewPaneOptions, + @IInstantiationService instantiationService: IInstantiationService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService, + @IConfigurationService configurationService: IConfigurationService, + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService, + @IContextMenuService contextMenuService: IContextMenuService, + @IKeybindingService keybindingService: IKeybindingService, + @IOpenerService openerService: IOpenerService, + @ITelemetryService telemetryService: ITelemetryService, + @IHoverService hoverService: IHoverService, + // Void: + @IVoidSidebarStateService private readonly _voidSidebarStateService: IVoidSidebarStateService, + @IThreadHistoryService private readonly _threadHistoryService: IThreadHistoryService, + @IVoidSettingsService private readonly _voidSettingsService: IVoidSettingsService, + // TODO chat service + ) { + super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService) + } + + + + protected override renderBody(parent: HTMLElement): void { + super.renderBody(parent); + + const { root, history, chat, settings } = dom.h('div@root', [ + dom.h('div@history', []), + dom.h('div@chat', []), + dom.h('div@settings', []), + ]) + root.style.display = 'flex'; + root.style.flexDirection = 'column'; + root.style.height = '100vh'; + root.style.width = '100%'; + + + dom.append(parent, root); + + this._renderHistory(history); + + } + + + private _renderHistory(element: HTMLElement) { + //
+ // setTab('chat')} /> + //
+ this._voidSidebarStateService.onDidChange(() => { + }) + + this._threadHistoryService.onDidChangeCurrentThread(() => { + + }) + + } + + private _renderSettings(element: HTMLElement) { + //
+ // + //
+ + } + + private _renderChat(element: HTMLElement) { + //
+ // + //
+ + } + +} + + + +// ---------- Register viewpane inside the void container ---------- + +const voidThemeIcon = Codicon.search; +const voidViewIcon = registerIcon('void-view-icon', voidThemeIcon, localize('voidViewIcon', 'View icon of the Void chat view.')); + +// called VIEWLET_ID in other places for some reason +const VOID_VIEW_CONTAINER_ID = 'workbench.view.void' +const SIDEBAR_VIEW_ID = VOID_VIEW_CONTAINER_ID // not sure if we can change this + +// Register view container +const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); +const viewContainer = viewContainerRegistry.registerViewContainer({ + id: VOID_VIEW_CONTAINER_ID, + title: nls.localize2('void', 'Void'), // this is used to say "Void" (Ctrl + L) + ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [VOID_VIEW_CONTAINER_ID, { mergeViewWithContainerWhenSingleView: true }]), + hideIfEmpty: false, + icon: voidViewIcon, + order: 1, +}, ViewContainerLocation.AuxiliaryBar, { doNotRegisterOpenCommand: true, }); + + + +// Register search default location to the container (sidebar) +const viewsRegistry = Registry.as(ViewExtensions.ViewsRegistry); +viewsRegistry.registerViews([{ + id: SIDEBAR_VIEW_ID, + hideByDefault: false, // start open + containerIcon: voidViewIcon, + name: nls.localize2('void chat', "Chat"), // this says ... : CHAT + ctorDescriptor: new SyncDescriptor(VoidSidebarViewPane), + canToggleVisibility: false, + canMoveView: true, + openCommandActionDescriptor: { + id: viewContainer.id, + keybindings: { + primary: KeyMod.CtrlCmd | KeyCode.KeyL, + }, + order: 1 + }, +}], viewContainer); + + + +// ---------- Register service that manages sidebar's state ---------- + +interface IVoidSidebarStateService { + readonly _serviceBrand: undefined; + setState(newState: Partial): void; + state: VoidSidebarState; + focusChat(): void; + blurChat(): void; + + onDidChange: Event; + onFocusChat: Event; + onBlurChat: Event; +} + + +const IVoidSidebarStateService = createDecorator('voidSidebarStateService'); +class VoidSidebarStateService extends Disposable implements IVoidSidebarStateService { + _serviceBrand: undefined; + + private readonly _onDidChange = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private readonly _onFocusChat = new Emitter(); + readonly onFocusChat: Event = this._onFocusChat.event; + + private readonly _onBlurChat = new Emitter(); + readonly onBlurChat: Event = this._onBlurChat.event; + + + // state + state: VoidSidebarState = { + isHistoryOpen: false, + currentTab: 'chat', + } + + constructor( + @IViewsService private readonly _viewsService: IViewsService, + ) { + super() + // auto open the view on mount (can view this as initializing state...) + this._viewsService.openView(SIDEBAR_VIEW_ID); + } + + setState(newState: Partial) { + // make sure view is open if the tab changes + if ('currentTab' in newState) + this._viewsService.openView(SIDEBAR_VIEW_ID); + + this.state = { ...this.state, ...newState } + this._onDidChange.fire() + } + + focusChat() { + this._onFocusChat.fire() + } + + blurChat() { + this._onBlurChat.fire() + } + +} + +registerSingleton(IVoidSidebarStateService, VoidSidebarStateService, InstantiationType.Eager); + + + +// ---------- Register commands and keybindings ---------- + +// Action: when press ctrl+L, show the sidebar chat and add to the selection +registerAction2(class extends Action2 { + constructor() { + super({ id: 'void.ctrl+l', title: 'Show Sidebar', keybinding: { primary: KeyMod.CtrlCmd | KeyCode.KeyL, weight: KeybindingWeight.WorkbenchContrib } }); + } + async run(accessor: ServicesAccessor): Promise { + const stateService = accessor.get(IVoidSidebarStateService) + stateService.setState({ isHistoryOpen: false, currentTab: 'chat' }) + stateService.focusChat() + } +}); + + +// History menu button +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'void.historyAction', + title: 'View past chats', + icon: { id: 'history' }, + menu: [{ id: MenuId.ViewTitle, group: 'navigation', when: ContextKeyExpr.equals('view', SIDEBAR_VIEW_ID), }] + }); + } + async run(accessor: ServicesAccessor): Promise { + const stateService = accessor.get(IVoidSidebarStateService) + stateService.setState({ isHistoryOpen: !stateService.state.isHistoryOpen }) + stateService.blurChat() + } +}) + +// New chat menu button +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'void.newChatAction', + title: 'View past chats', + icon: { id: 'add' }, + menu: [{ id: MenuId.ViewTitle, group: 'navigation', when: ContextKeyExpr.equals('view', SIDEBAR_VIEW_ID), }] + }); + } + async run(accessor: ServicesAccessor): Promise { + const stateService = accessor.get(IVoidSidebarStateService) + stateService.setState({ isHistoryOpen: false, currentTab: 'chat' }) + stateService.focusChat() + + const historyService = accessor.get(IThreadHistoryService) + historyService.startNewThread() + } +}) + +// Settings (API config) menu button +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'void.viewSettings', + title: 'Void settings', + icon: { id: 'settings-gear' }, + menu: [{ id: MenuId.ViewTitle, group: 'navigation', when: ContextKeyExpr.equals('view', SIDEBAR_VIEW_ID), }] + }); + } + async run(accessor: ServicesAccessor): Promise { + const stateService = accessor.get(IVoidSidebarStateService) + stateService.setState({ isHistoryOpen: false, currentTab: 'settings' }) + stateService.blurChat() + } +}) diff --git a/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts b/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts new file mode 100644 index 000000000..718624365 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts @@ -0,0 +1,137 @@ +import { Disposable } from '../../../../base/common/lifecycle.js'; +import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js'; +import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; +import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; + +import { URI } from '../../../../base/common/uri.js'; +import { Emitter, Event } from '../../../../base/common/event.js'; + +export type CodeSelection = { selectionStr: string, filePath: URI } + +export type ChatThreads = { + [id: string]: { + id: string; // store the id here too + createdAt: string; // ISO string + lastModified: string; // ISO string + messages: ChatMessage[]; + } +} + +type ChatMessage = + | { + role: "user"; + content: string; // content sent to the llm + displayContent: string; // content displayed to user + selection: CodeSelection | null; // the user's selection + files: URI[]; // the files sent in the message + } + | { + role: "assistant"; + content: string; // content received from LLM + displayContent: string | undefined; // content displayed to user (this is the same as content for now) + } + | { + role: "system"; + content: string; + displayContent?: undefined; + } + + +// a "thread" means a chat message history + +const createNewThread = () => { + const now = new Date().toISOString() + return { + id: new Date().getTime().toString(), + createdAt: now, + lastModified: now, + messages: [], + } +} + +const THREAD_STORAGE_KEY = 'void.threadsHistory' + +export interface IThreadHistoryService { + readonly _serviceBrand: undefined; + startNewThread(): void; + onDidChangeCurrentThread: Event; +} + +export const IThreadHistoryService = createDecorator('voidThreadHistoryService'); +class ThreadHistoryService extends Disposable implements IThreadHistoryService { + _serviceBrand: undefined; + + // the current thread id we are on + _currentThreadId: string | null = null + + // this fires when the current thread changes at all (a switch of currentThread, or a message added to it, etc) + private readonly _onDidChangeCurrentThread = new Emitter(); + readonly onDidChangeCurrentThread: Event = this._onDidChangeCurrentThread.event; + + + getAllThreads(): ChatThreads { + // storage is the source of truth for threads + const threads = this._storageService.get(THREAD_STORAGE_KEY, StorageScope.APPLICATION) + return threads ? JSON.parse(threads) : {} + } + + private _storeAllThreads(threads: ChatThreads) { + this._storageService.store(THREAD_STORAGE_KEY, JSON.stringify(threads), StorageScope.APPLICATION, StorageTarget.USER) + } + + getCurrentThread(): ChatThreads[string] | null { + const threads = this.getAllThreads() + return this._currentThreadId ? threads[this._currentThreadId] ?? null : null + } + + switchToThread(threadId: string) { + this._currentThreadId = threadId + this._onDidChangeCurrentThread.fire() + } + + + startNewThread() { + const newThread = createNewThread() + const currentThreads = this.getAllThreads() + this._storeAllThreads({ + ...currentThreads, + [newThread.id]: newThread + }) + this._currentThreadId = newThread.id + this._onDidChangeCurrentThread.fire() + } + + + addMessageToCurrentThread(message: ChatMessage) { + let currentThread: ChatThreads[string] + const allThreads = this.getAllThreads() + + if (this._currentThreadId && (this._currentThreadId in allThreads)) { + currentThread = allThreads[this._currentThreadId] + } + else { + currentThread = createNewThread() + this._currentThreadId = currentThread.id + } + + this._storeAllThreads({ + ...allThreads, + [currentThread.id]: { + ...currentThread, + lastModified: new Date().toISOString(), + messages: [...currentThread.messages, message], + } + }) + + // the current thread just changed (it had a message added to it) + this._onDidChangeCurrentThread.fire() + } + + constructor( + @IStorageService private readonly _storageService: IStorageService, + ) { + super() + } +} + +registerSingleton(IThreadHistoryService, ThreadHistoryService, InstantiationType.Eager); diff --git a/src/vs/workbench/contrib/void/browser/registerViewPane.ts b/src/vs/workbench/contrib/void/browser/registerViewPane.ts deleted file mode 100644 index c5c2c0cf8..000000000 --- a/src/vs/workbench/contrib/void/browser/registerViewPane.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Registry } from '../../../../platform/registry/common/platform.js'; -import { - Extensions as ViewContainerExtensions, IViewContainersRegistry, - ViewContainerLocation, IViewsRegistry, Extensions as ViewExtensions, -} from '../../../common/views.js'; - -import * as nls from '../../../../nls.js'; - -import { VoidViewPane } from './voidViewPane.js'; - -import { Codicon } from '../../../../base/common/codicons.js'; -import { localize } from '../../../../nls.js'; -import { registerIcon } from '../../../../platform/theme/common/iconRegistry.js'; -import { ViewPaneContainer } from '../../../browser/parts/views/viewPaneContainer.js'; - -import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js'; -import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js'; - - -const voidThemeIcon = Codicon.search; -const voidViewIcon = registerIcon('void-view-icon', voidThemeIcon, localize('voidViewIcon', 'View icon of the Void chat view.')); - - -// compare against search.contribution.ts and https://app.greptile.com/chat/w1nsmt3lauwzculipycpn?repo=github%3Amain%3Amicrosoft%2Fvscode -// and debug.contribution.ts, scm.contribution.ts (source control) - -// called VIEWLET_ID in other places for some reason -const VIEW_CONTAINER_ID = 'workbench.view.void' - -// Register view container -const viewContainerRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); -const viewContainer = viewContainerRegistry.registerViewContainer({ - id: VIEW_CONTAINER_ID, - title: nls.localize2('void', 'Void'), // this is used to say "Void" (Ctrl + L) - ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [VIEW_CONTAINER_ID, { mergeViewWithContainerWhenSingleView: true }]), - hideIfEmpty: false, - icon: voidViewIcon, - order: 1, -}, ViewContainerLocation.AuxiliaryBar, { doNotRegisterOpenCommand: true, }); - - - -// Register search default location to the container (sidebar) -const viewsRegistry = Registry.as(ViewExtensions.ViewsRegistry); -viewsRegistry.registerViews([{ - id: VIEW_CONTAINER_ID, // not sure if we can change this - hideByDefault: false, // start open - containerIcon: voidViewIcon, - name: nls.localize2('void chat', "Chat"), // this says ... : CHAT - ctorDescriptor: new SyncDescriptor(VoidViewPane), - canToggleVisibility: false, - canMoveView: true, - openCommandActionDescriptor: { - id: viewContainer.id, - keybindings: { - primary: KeyMod.CtrlCmd | KeyCode.KeyL, // we don't need to disable the original ctrl+L (probably because it brings panel into focus first) - }, - order: 1 - // mnemonicTitle: nls.localize({ key: 'miViewSearch', comment: ['&& denotes a mnemonic'] }, "&&Search"), - } -}], viewContainer); - - -// TODO can add a configuration for the user to choose config options - see search.contribution.ts - - diff --git a/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx index b04548de2..b3bf8ae37 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx @@ -10,35 +10,35 @@ const Sidebar = () => { const [tab, setTab] = useState<'threadSelector' | 'chat' | 'settings'>('chat') - // if they pressed the + to add a new chat - useOnVSCodeMessage('startNewThread', (m) => { - setTab('chat'); - chatInputRef.current?.focus(); - }) - - // ctrl+l should switch back to chat - useOnVSCodeMessage('ctrl+l', (m) => { - setTab('chat'); - chatInputRef.current?.focus(); - }) - - // if they toggled thread selector - useOnVSCodeMessage('toggleThreadSelector', (m) => { - if (tab === 'threadSelector') { - setTab('chat') - chatInputRef.current?.blur(); - } else - setTab('threadSelector') - }) - - // if they toggled settings - useOnVSCodeMessage('toggleSettings', (m) => { - if (tab === 'settings') { - setTab('chat') - chatInputRef.current?.blur(); - } else - setTab('settings') - }) + // // if they pressed the + to add a new chat + // useOnVSCodeMessage('startNewThread', (m) => { + // setTab('chat'); + // chatInputRef.current?.focus(); + // }) + + // // ctrl+l should switch back to chat + // useOnVSCodeMessage('ctrl+l', (m) => { + // setTab('chat'); + // chatInputRef.current?.focus(); + // }) + + // // if they toggled thread selector + // useOnVSCodeMessage('toggleThreadSelector', (m) => { + // if (tab === 'threadSelector') { + // setTab('chat') + // chatInputRef.current?.blur(); + // } else + // setTab('threadSelector') + // }) + + // // if they toggled settings + // useOnVSCodeMessage('toggleSettings', (m) => { + // if (tab === 'settings') { + // setTab('chat') + // chatInputRef.current?.blur(); + // } else + // setTab('settings') + // }) return <>
diff --git a/src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx index 5437bad5c..999f22820 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx @@ -1,289 +1,289 @@ -import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" -import { awaitVSCodeResponse, getVSCodeAPI, useOnVSCodeMessage } from "./getVscodeApi" +// import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" +// import { awaitVSCodeResponse, getVSCodeAPI, useOnVSCodeMessage } from "./getVscodeApi" -const configEnum = (description: string, defaultVal: EnumArr[number], enumArr: EnumArr) => { - return { - description, - defaultVal, - enumArr, - } -} +// const configEnum = (description: string, defaultVal: EnumArr[number], enumArr: EnumArr) => { +// return { +// description, +// defaultVal, +// enumArr, +// } +// } -const configString = (description: string, defaultVal: string) => { - return { - description, - defaultVal, - enumArr: undefined, - } -} +// const configString = (description: string, defaultVal: string) => { +// return { +// description, +// defaultVal, +// enumArr: undefined, +// } +// } -// fields you can customize (don't forget 'default' - it isn't included here!) -export const configFields = [ - 'anthropic', - 'openAI', - 'gemini', - 'greptile', - 'ollama', - 'openRouter', - 'openAICompatible', - 'azure', -] as const +// // fields you can customize (don't forget 'default' - it isn't included here!) +// export const configFields = [ +// 'anthropic', +// 'openAI', +// 'gemini', +// 'greptile', +// 'ollama', +// 'openRouter', +// 'openAICompatible', +// 'azure', +// ] as const -const voidConfigInfo: Record< - typeof configFields[number] | 'default', { - [prop: string]: { - description: string, - enumArr?: readonly string[] | undefined, - defaultVal: string, - }, - } -> = { - default: { - whichApi: configEnum( - "API Provider.", - 'anthropic', - configFields, - ), +// const voidConfigInfo: Record< +// typeof configFields[number] | 'default', { +// [prop: string]: { +// description: string, +// enumArr?: readonly string[] | undefined, +// defaultVal: string, +// }, +// } +// > = { +// default: { +// whichApi: configEnum( +// "API Provider.", +// 'anthropic', +// configFields, +// ), - maxTokens: configEnum( - "Max number of tokens to output.", - '1024', - [ - "default", // this will be parseInt'd into NaN and ignored by the API. Anything that's not a number has this behavior. - "1024", - "2048", - "4096", - "8192" - ] as const, - ), +// maxTokens: configEnum( +// "Max number of tokens to output.", +// '1024', +// [ +// "default", // this will be parseInt'd into NaN and ignored by the API. Anything that's not a number has this behavior. +// "1024", +// "2048", +// "4096", +// "8192" +// ] as const, +// ), - }, - anthropic: { - apikey: configString('Anthropic API key.', ''), - model: configEnum( - "Anthropic model to use.", - 'claude-3-5-sonnet-20240620', - [ - "claude-3-5-sonnet-20240620", - "claude-3-opus-20240229", - "claude-3-sonnet-20240229", - "claude-3-haiku-20240307" - ] as const, - ), - }, - openAI: { - apikey: configString('OpenAI API key.', ''), - model: configEnum( - 'OpenAI model to use.', - 'gpt-4o', - [ - "o1-preview", - "o1-mini", - "gpt-4o", - "gpt-4o-2024-05-13", - "gpt-4o-2024-08-06", - "gpt-4o-mini", - "gpt-4o-mini-2024-07-18", - "gpt-4-turbo", - "gpt-4-turbo-2024-04-09", - "gpt-4-turbo-preview", - "gpt-4-0125-preview", - "gpt-4-1106-preview", - "gpt-4", - "gpt-4-0613", - "gpt-3.5-turbo-0125", - "gpt-3.5-turbo", - "gpt-3.5-turbo-1106" - ] as const - ), - }, - greptile: { - apikey: configString('Greptile API key.', ''), - githubPAT: configString('Github PAT that Greptile uses to access your repository', ''), - remote: configEnum( - 'Repo location', - 'github', - [ - 'github', - 'gitlab' - ] as const - ), - repository: configString('Repository identifier in "owner/repository" format.', ''), - branch: configString('Name of the branch to use.', 'main'), - }, - ollama: { - endpoint: configString( - 'The endpoint of your Ollama instance. Start Ollama by running `OLLAMA_ORIGINS="vscode-webview://*" ollama serve`.', - 'http://127.0.0.1:11434' - ), - // TODO we should allow user to select model inside Void, but for now we'll just let them handle the Ollama setup on their own - // model: configEnum( - // 'Ollama model to use.', - // 'llama3.1', - // ["codegemma", "codegemma:2b", "codegemma:7b", "codellama", "codellama:7b", "codellama:13b", "codellama:34b", "codellama:70b", "codellama:code", "codellama:python", "command-r", "command-r:35b", "command-r-plus", "command-r-plus:104b", "deepseek-coder-v2", "deepseek-coder-v2:16b", "deepseek-coder-v2:236b", "falcon2", "falcon2:11b", "firefunction-v2", "firefunction-v2:70b", "gemma", "gemma:2b", "gemma:7b", "gemma2", "gemma2:2b", "gemma2:9b", "gemma2:27b", "llama2", "llama2:7b", "llama2:13b", "llama2:70b", "llama3", "llama3:8b", "llama3:70b", "llama3-chatqa", "llama3-chatqa:8b", "llama3-chatqa:70b", "llama3-gradient", "llama3-gradient:8b", "llama3-gradient:70b", "llama3.1", "llama3.1:8b", "llama3.1:70b", "llama3.1:405b", "llava", "llava:7b", "llava:13b", "llava:34b", "llava-llama3", "llava-llama3:8b", "llava-phi3", "llava-phi3:3.8b", "mistral", "mistral:7b", "mistral-large", "mistral-large:123b", "mistral-nemo", "mistral-nemo:12b", "mixtral", "mixtral:8x7b", "mixtral:8x22b", "moondream", "moondream:1.8b", "openhermes", "openhermes:v2.5", "phi3", "phi3:3.8b", "phi3:14b", "phi3.5", "phi3.5:3.8b", "qwen", "qwen:7b", "qwen:14b", "qwen:32b", "qwen:72b", "qwen:110b", "qwen2", "qwen2:0.5b", "qwen2:1.5b", "qwen2:7b", "qwen2:72b", "smollm", "smollm:135m", "smollm:360m", "smollm:1.7b"] as const - // ), - }, - openRouter: { - model: configString( - 'OpenRouter model to use.', - 'openai/gpt-4o' - ), - apikey: configString('OpenRouter API key.', ''), - }, - openAICompatible: { - endpoint: configString('The baseUrl (exluding /chat/completions).', 'http://127.0.0.1:11434/v1'), - model: configString('The name of the model to use.', 'gpt-4o'), - apikey: configString('Your API key.', ''), - }, - azure: { - // "void.azure.apiKey": { - // "type": "string", - // "description": "Azure API key." - // }, - // "void.azure.deploymentId": { - // "type": "string", - // "description": "Azure API deployment ID." - // }, - // "void.azure.resourceName": { - // "type": "string", - // "description": "Name of the Azure OpenAI resource. Either this or `baseURL` can be used. \nThe resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/deployments/{modelId}{path}`" - // }, - // "void.azure.providerSettings": { - // "type": "object", - // "properties": { - // "baseURL": { - // "type": "string", - // "default": "https://${resourceName}.openai.azure.com/openai/deployments", - // "description": "Azure API base URL." - // }, - // "headers": { - // "type": "object", - // "description": "Custom headers to include in the requests." - // } - // } - // }, - }, - gemini: { - apikey: configString('Google API key.', ''), - model: configEnum( - 'Gemini model to use.', - 'gemini-1.5-flash', - [ - "gemini-1.5-flash", - "gemini-1.5-pro", - "gemini-1.5-flash-8b", - "gemini-1.0-pro" - ] as const - ), - }, -} +// }, +// anthropic: { +// apikey: configString('Anthropic API key.', ''), +// model: configEnum( +// "Anthropic model to use.", +// 'claude-3-5-sonnet-20240620', +// [ +// "claude-3-5-sonnet-20240620", +// "claude-3-opus-20240229", +// "claude-3-sonnet-20240229", +// "claude-3-haiku-20240307" +// ] as const, +// ), +// }, +// openAI: { +// apikey: configString('OpenAI API key.', ''), +// model: configEnum( +// 'OpenAI model to use.', +// 'gpt-4o', +// [ +// "o1-preview", +// "o1-mini", +// "gpt-4o", +// "gpt-4o-2024-05-13", +// "gpt-4o-2024-08-06", +// "gpt-4o-mini", +// "gpt-4o-mini-2024-07-18", +// "gpt-4-turbo", +// "gpt-4-turbo-2024-04-09", +// "gpt-4-turbo-preview", +// "gpt-4-0125-preview", +// "gpt-4-1106-preview", +// "gpt-4", +// "gpt-4-0613", +// "gpt-3.5-turbo-0125", +// "gpt-3.5-turbo", +// "gpt-3.5-turbo-1106" +// ] as const +// ), +// }, +// greptile: { +// apikey: configString('Greptile API key.', ''), +// githubPAT: configString('Github PAT that Greptile uses to access your repository', ''), +// remote: configEnum( +// 'Repo location', +// 'github', +// [ +// 'github', +// 'gitlab' +// ] as const +// ), +// repository: configString('Repository identifier in "owner/repository" format.', ''), +// branch: configString('Name of the branch to use.', 'main'), +// }, +// ollama: { +// endpoint: configString( +// 'The endpoint of your Ollama instance. Start Ollama by running `OLLAMA_ORIGINS="vscode-webview://*" ollama serve`.', +// 'http://127.0.0.1:11434' +// ), +// // TODO we should allow user to select model inside Void, but for now we'll just let them handle the Ollama setup on their own +// // model: configEnum( +// // 'Ollama model to use.', +// // 'llama3.1', +// // ["codegemma", "codegemma:2b", "codegemma:7b", "codellama", "codellama:7b", "codellama:13b", "codellama:34b", "codellama:70b", "codellama:code", "codellama:python", "command-r", "command-r:35b", "command-r-plus", "command-r-plus:104b", "deepseek-coder-v2", "deepseek-coder-v2:16b", "deepseek-coder-v2:236b", "falcon2", "falcon2:11b", "firefunction-v2", "firefunction-v2:70b", "gemma", "gemma:2b", "gemma:7b", "gemma2", "gemma2:2b", "gemma2:9b", "gemma2:27b", "llama2", "llama2:7b", "llama2:13b", "llama2:70b", "llama3", "llama3:8b", "llama3:70b", "llama3-chatqa", "llama3-chatqa:8b", "llama3-chatqa:70b", "llama3-gradient", "llama3-gradient:8b", "llama3-gradient:70b", "llama3.1", "llama3.1:8b", "llama3.1:70b", "llama3.1:405b", "llava", "llava:7b", "llava:13b", "llava:34b", "llava-llama3", "llava-llama3:8b", "llava-phi3", "llava-phi3:3.8b", "mistral", "mistral:7b", "mistral-large", "mistral-large:123b", "mistral-nemo", "mistral-nemo:12b", "mixtral", "mixtral:8x7b", "mixtral:8x22b", "moondream", "moondream:1.8b", "openhermes", "openhermes:v2.5", "phi3", "phi3:3.8b", "phi3:14b", "phi3.5", "phi3.5:3.8b", "qwen", "qwen:7b", "qwen:14b", "qwen:32b", "qwen:72b", "qwen:110b", "qwen2", "qwen2:0.5b", "qwen2:1.5b", "qwen2:7b", "qwen2:72b", "smollm", "smollm:135m", "smollm:360m", "smollm:1.7b"] as const +// // ), +// }, +// openRouter: { +// model: configString( +// 'OpenRouter model to use.', +// 'openai/gpt-4o' +// ), +// apikey: configString('OpenRouter API key.', ''), +// }, +// openAICompatible: { +// endpoint: configString('The baseUrl (exluding /chat/completions).', 'http://127.0.0.1:11434/v1'), +// model: configString('The name of the model to use.', 'gpt-4o'), +// apikey: configString('Your API key.', ''), +// }, +// azure: { +// // "void.azure.apiKey": { +// // "type": "string", +// // "description": "Azure API key." +// // }, +// // "void.azure.deploymentId": { +// // "type": "string", +// // "description": "Azure API deployment ID." +// // }, +// // "void.azure.resourceName": { +// // "type": "string", +// // "description": "Name of the Azure OpenAI resource. Either this or `baseURL` can be used. \nThe resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/deployments/{modelId}{path}`" +// // }, +// // "void.azure.providerSettings": { +// // "type": "object", +// // "properties": { +// // "baseURL": { +// // "type": "string", +// // "default": "https://${resourceName}.openai.azure.com/openai/deployments", +// // "description": "Azure API base URL." +// // }, +// // "headers": { +// // "type": "object", +// // "description": "Custom headers to include in the requests." +// // } +// // } +// // }, +// }, +// gemini: { +// apikey: configString('Google API key.', ''), +// model: configEnum( +// 'Gemini model to use.', +// 'gemini-1.5-flash', +// [ +// "gemini-1.5-flash", +// "gemini-1.5-pro", +// "gemini-1.5-flash-8b", +// "gemini-1.0-pro" +// ] as const +// ), +// }, +// } -// this is the type that comes with metadata like desc, default val, etc -type VoidConfigInfo = typeof voidConfigInfo -export type VoidConfigField = keyof typeof voidConfigInfo // typeof configFields[number] +// // this is the type that comes with metadata like desc, default val, etc +// type VoidConfigInfo = typeof voidConfigInfo +// export type VoidConfigField = keyof typeof voidConfigInfo // typeof configFields[number] -// this is the type that specifies the user's actual config -export type PartialVoidConfig = { - [K in keyof typeof voidConfigInfo]?: { - [P in keyof typeof voidConfigInfo[K]]?: typeof voidConfigInfo[K][P]['defaultVal'] - } -} +// // this is the type that specifies the user's actual config +// export type PartialVoidConfig = { +// [K in keyof typeof voidConfigInfo]?: { +// [P in keyof typeof voidConfigInfo[K]]?: typeof voidConfigInfo[K][P]['defaultVal'] +// } +// } -export type VoidConfig = { - [K in keyof typeof voidConfigInfo]: { - [P in keyof typeof voidConfigInfo[K]]: typeof voidConfigInfo[K][P]['defaultVal'] - } -} +// export type VoidConfig = { +// [K in keyof typeof voidConfigInfo]: { +// [P in keyof typeof voidConfigInfo[K]]: typeof voidConfigInfo[K][P]['defaultVal'] +// } +// } -export const getVoidConfigFromPartial = (partialVoidConfig: PartialVoidConfig): VoidConfig => { - const config = {} as PartialVoidConfig - for (let field of [...configFields, 'default'] as const) { - config[field] = {} - for (let prop in voidConfigInfo[field]) { - config[field][prop] = partialVoidConfig[field]?.[prop]?.trim() || voidConfigInfo[field][prop].defaultVal - } - } - return config as VoidConfig -} +// export const getVoidConfigFromPartial = (partialVoidConfig: PartialVoidConfig): VoidConfig => { +// const config = {} as PartialVoidConfig +// for (let field of [...configFields, 'default'] as const) { +// config[field] = {} +// for (let prop in voidConfigInfo[field]) { +// config[field][prop] = partialVoidConfig[field]?.[prop]?.trim() || voidConfigInfo[field][prop].defaultVal +// } +// } +// return config as VoidConfig +// } -const defaultVoidConfig: VoidConfig = getVoidConfigFromPartial({}) +// const defaultVoidConfig: VoidConfig = getVoidConfigFromPartial({}) -// const [stateRef, setState] = useInstantState(initVal) -// setState instantly changes the value of stateRef instead of having to wait until the next render -const useInstantState = (initVal: T) => { - const stateRef = useRef(initVal) - const [_, setS] = useState(initVal) - const setState = useCallback((newVal: T) => { - setS(newVal); - stateRef.current = newVal; - }, []) - return [stateRef as React.RefObject, setState] as const // make s.current readonly - setState handles all changes -} +// // const [stateRef, setState] = useInstantState(initVal) +// // setState instantly changes the value of stateRef instead of having to wait until the next render +// const useInstantState = (initVal: T) => { +// const stateRef = useRef(initVal) +// const [_, setS] = useState(initVal) +// const setState = useCallback((newVal: T) => { +// setS(newVal); +// stateRef.current = newVal; +// }, []) +// return [stateRef as React.RefObject, setState] as const // make s.current readonly - setState handles all changes +// } -type SetConfigParamType = (field: K, param: keyof VoidConfigInfo[K], newVal: string) => void +// type SetConfigParamType = (field: K, param: keyof VoidConfigInfo[K], newVal: string) => void -type ConfigValueType = { - voidConfig: VoidConfig, - voidConfigInfo: VoidConfigInfo, - partialVoidConfig: PartialVoidConfig, - setConfigParam: SetConfigParamType -} +// type ConfigValueType = { +// voidConfig: VoidConfig, +// voidConfigInfo: VoidConfigInfo, +// partialVoidConfig: PartialVoidConfig, +// setConfigParam: SetConfigParamType +// } -const ConfigContext = createContext(undefined as unknown as ConfigValueType) +// const ConfigContext = createContext(undefined as unknown as ConfigValueType) -export function ConfigProvider({ children }: { children: ReactNode }) { - const [partialVoidConfig, setPartialVoidConfig] = useInstantState({}) // the user's selections - const [voidConfig, setVoidConfig] = useState(defaultVoidConfig) +// export function ConfigProvider({ children }: { children: ReactNode }) { +// const [partialVoidConfig, setPartialVoidConfig] = useInstantState({}) // the user's selections +// const [voidConfig, setVoidConfig] = useState(defaultVoidConfig) - // get the config on mount - useEffect(() => { - getVSCodeAPI().postMessage({ type: 'getPartialVoidConfig' }) - awaitVSCodeResponse('partialVoidConfig').then((m) => { - setPartialVoidConfig(m.partialVoidConfig) - const newFullConfig = getVoidConfigFromPartial(m.partialVoidConfig) - setVoidConfig(newFullConfig) - }) - }, [setPartialVoidConfig]) +// // get the config on mount +// useEffect(() => { +// getVSCodeAPI().postMessage({ type: 'getPartialVoidConfig' }) +// awaitVSCodeResponse('partialVoidConfig').then((m) => { +// setPartialVoidConfig(m.partialVoidConfig) +// const newFullConfig = getVoidConfigFromPartial(m.partialVoidConfig) +// setVoidConfig(newFullConfig) +// }) +// }, [setPartialVoidConfig]) - // return the provider - return ( { - const newPartialConfig: PartialVoidConfig = { - ...partialVoidConfig.current, - [field]: { - ...partialVoidConfig.current?.[field], - [param]: newVal - } - } - setPartialVoidConfig(newPartialConfig) - const newFullConfig = getVoidConfigFromPartial(newPartialConfig) - setVoidConfig(newFullConfig) - getVSCodeAPI().postMessage({ type: 'persistPartialVoidConfig', partialVoidConfig: newPartialConfig }) - } - }} - > - {children} - - ) -} +// // return the provider +// return ( { +// const newPartialConfig: PartialVoidConfig = { +// ...partialVoidConfig.current, +// [field]: { +// ...partialVoidConfig.current?.[field], +// [param]: newVal +// } +// } +// setPartialVoidConfig(newPartialConfig) +// const newFullConfig = getVoidConfigFromPartial(newPartialConfig) +// setVoidConfig(newFullConfig) +// getVSCodeAPI().postMessage({ type: 'persistPartialVoidConfig', partialVoidConfig: newPartialConfig }) +// } +// }} +// > +// {children} +// +// ) +// } -export function useVoidConfig(): ConfigValueType { - const context = useContext(ConfigContext) - if (context === undefined) { - throw new Error("useVoidConfig missing Provider") - } - return context -} +// export function useVoidConfig(): ConfigValueType { +// const context = useContext(ConfigContext) +// if (context === undefined) { +// throw new Error("useVoidConfig missing Provider") +// } +// return context +// } diff --git a/src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx deleted file mode 100644 index 6775fcb1f..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/contextForProps.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" - -const PropsContext = createContext(undefined as unknown as any) - -// provider for whatever came in data-void-props -export function PropsProvider({ children, rootElement }: { children: ReactNode, rootElement: HTMLElement }) { - - const [props, setProps] = useState(null) - - // update props when rootElement changes - useEffect(() => { - let props = rootElement.getAttribute("data-void-props") - let propsObj: object | null = null - if (props !== null) { - propsObj = JSON.parse(decodeURIComponent(props)) - } - setProps(propsObj) - }, [rootElement]) - - return ( - - {children} - - ) -} - -export function useVoidProps(): T | null { - // context is the "value" from above - const context: T | null | undefined = useContext(PropsContext) - // only undefined if has no provider - if (context === undefined) { - throw new Error("useVoidProps missing Provider") - } - return context -} - diff --git a/src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx b/src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx index d2ab97bea..c040be1cb 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx @@ -1,106 +1,106 @@ -import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" -import { ChatMessage, ChatThreads } from "../../common/shared_types" -import { awaitVSCodeResponse, getVSCodeAPI } from "./getVscodeApi" +// import React, { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState, } from "react" +// import { ChatMessage, ChatThreads } from "../../common/shared_types" +// import { awaitVSCodeResponse, getVSCodeAPI } from "./getVscodeApi" -// a "thread" means a chat message history -type ConfigForThreadsValueType = { - readonly getAllThreads: () => ChatThreads; - readonly getCurrentThread: () => ChatThreads[string] | null; - addMessageToHistory: (message: ChatMessage) => void; - switchToThread: (threadId: string) => void; - startNewThread: () => void; -} +// // a "thread" means a chat message history +// type ConfigForThreadsValueType = { +// readonly getAllThreads: () => ChatThreads; +// readonly getCurrentThread: () => ChatThreads[string] | null; +// addMessageToHistory: (message: ChatMessage) => void; +// switchToThread: (threadId: string) => void; +// startNewThread: () => void; +// } -const ThreadsContext = createContext(undefined as unknown as ConfigForThreadsValueType) +// const ThreadsContext = createContext(undefined as unknown as ConfigForThreadsValueType) -const createNewThread = () => { - const now = new Date().toISOString() - return { - id: new Date().getTime().toString(), - createdAt: now, - lastModified: now, - messages: [], - } -} +// const createNewThread = () => { +// const now = new Date().toISOString() +// return { +// id: new Date().getTime().toString(), +// createdAt: now, +// lastModified: now, +// messages: [], +// } +// } -// const [stateRef, setState] = useInstantState(initVal) -// setState instantly changes the value of stateRef instead of having to wait until the next render -const useInstantState = (initVal: T) => { - const stateRef = useRef(initVal) - const [_, setS] = useState(initVal) - const setState = useCallback((newVal: T) => { - setS(newVal); - stateRef.current = newVal; - }, []) - return [stateRef as React.RefObject, setState] as const // make s.current readonly - setState handles all changes -} +// // const [stateRef, setState] = useInstantState(initVal) +// // setState instantly changes the value of stateRef instead of having to wait until the next render +// const useInstantState = (initVal: T) => { +// const stateRef = useRef(initVal) +// const [_, setS] = useState(initVal) +// const setState = useCallback((newVal: T) => { +// setS(newVal); +// stateRef.current = newVal; +// }, []) +// return [stateRef as React.RefObject, setState] as const // make s.current readonly - setState handles all changes +// } -export function ThreadsProvider({ children }: { children: ReactNode }) { - const [allThreadsRef, setAllThreads] = useInstantState({}) - const [currentThreadIdRef, setCurrentThreadId] = useInstantState(null) +// export function ThreadsProvider({ children }: { children: ReactNode }) { +// const [allThreadsRef, setAllThreads] = useInstantState({}) +// const [currentThreadIdRef, setCurrentThreadId] = useInstantState(null) - // this loads allThreads in on mount - useEffect(() => { - getVSCodeAPI().postMessage({ type: 'getAllThreads' }) - awaitVSCodeResponse('allThreads') - .then(response => { - setAllThreads(response.threads) - }) - }, [setAllThreads]) +// // this loads allThreads in on mount +// useEffect(() => { +// getVSCodeAPI().postMessage({ type: 'getAllThreads' }) +// awaitVSCodeResponse('allThreads') +// .then(response => { +// setAllThreads(response.threads) +// }) +// }, [setAllThreads]) - return ( - allThreadsRef.current ?? {}, - getCurrentThread: () => currentThreadIdRef.current ? allThreadsRef.current?.[currentThreadIdRef.current] ?? null : null, - addMessageToHistory: (message: ChatMessage) => { - let currentThread: ChatThreads[string] - if (!(currentThreadIdRef.current === null || allThreadsRef.current === null)) { - currentThread = allThreadsRef.current[currentThreadIdRef.current] - } - else { - currentThread = createNewThread() - setCurrentThreadId(currentThread.id) - } +// return ( +// allThreadsRef.current ?? {}, +// getCurrentThread: () => currentThreadIdRef.current ? allThreadsRef.current?.[currentThreadIdRef.current] ?? null : null, +// addMessageToHistory: (message: ChatMessage) => { +// let currentThread: ChatThreads[string] +// if (!(currentThreadIdRef.current === null || allThreadsRef.current === null)) { +// currentThread = allThreadsRef.current[currentThreadIdRef.current] +// } +// else { +// currentThread = createNewThread() +// setCurrentThreadId(currentThread.id) +// } - setAllThreads({ - ...allThreadsRef.current, - [currentThread.id]: { - ...currentThread, - lastModified: new Date().toISOString(), - messages: [...currentThread.messages, message], - } - }) +// setAllThreads({ +// ...allThreadsRef.current, +// [currentThread.id]: { +// ...currentThread, +// lastModified: new Date().toISOString(), +// messages: [...currentThread.messages, message], +// } +// }) - getVSCodeAPI().postMessage({ type: "persistThread", thread: currentThread }) - }, - switchToThread: (threadId: string) => { - setCurrentThreadId(threadId); - }, - startNewThread: () => { - const newThread = createNewThread() - setAllThreads({ - ...allThreadsRef.current, - [newThread.id]: newThread - }) - setCurrentThreadId(newThread.id) - }, - }} - > - {children} - - ) -} +// getVSCodeAPI().postMessage({ type: "persistThread", thread: currentThread }) +// }, +// switchToThread: (threadId: string) => { +// setCurrentThreadId(threadId); +// }, +// startNewThread: () => { +// const newThread = createNewThread() +// setAllThreads({ +// ...allThreadsRef.current, +// [newThread.id]: newThread +// }) +// setCurrentThreadId(newThread.id) +// }, +// }} +// > +// {children} +// +// ) +// } -export function useThreads(): ConfigForThreadsValueType { - const context = useContext(ThreadsContext) - if (context === undefined) { - throw new Error("useThreads missing Provider") - } - return context -} +// export function useThreads(): ConfigForThreadsValueType { +// const context = useContext(ThreadsContext) +// if (context === undefined) { +// throw new Error("useThreads missing Provider") +// } +// return context +// } diff --git a/src/vs/workbench/contrib/void/browser/sidebar/index.tsx b/src/vs/workbench/contrib/void/browser/sidebar/index.tsx deleted file mode 100644 index 966a0a776..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -// import React from "react" -// import Sidebar from "./Sidebar" -// import { mount } from "../util/mount" - -// this is the entry point that mounts the sidebar -mount() - diff --git a/src/vs/workbench/contrib/void/browser/util/mount.tsx b/src/vs/workbench/contrib/void/browser/util/mount.tsx new file mode 100644 index 000000000..4962aa883 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/util/mount.tsx @@ -0,0 +1,61 @@ +// import React, { useEffect } from "react"; +// import * as ReactDOM from "react-dom/client" +// import { initPosthog, identifyUser } from "./posthog"; + +// const ListenersAndTracking = () => { +// // initialize posthog +// useEffect(() => { +// initPosthog() +// }, []) + +// // // when we get the deviceid, identify the user +// // useEffect(() => { +// // getVSCodeAPI().postMessage({ type: 'getDeviceId' }); +// // awaitVSCodeResponse('deviceId').then((m => { +// // identifyUser(m.deviceId) +// // })) +// // }, []) + +// // // Receive messages from the VSCode extension +// // useEffect(() => { +// // const listener = (event: MessageEvent) => { +// // const m = event.data as MessageToSidebar; +// // onMessageFromVSCode(m) +// // } +// // window.addEventListener('message', listener); +// // return () => window.removeEventListener('message', listener) +// // }, []) + +// return null +// } + + + + +// export const mount = (children: React.ReactNode) => { + +// if (typeof document === "undefined") { +// console.error("index.tsx error: document was undefined") +// return +// } + +// // mount the sidebar on the id="root" element +// const rootElement = document.getElementById("root")! +// // console.log("Void root Element:", rootElement) + +// const content = (<> +// + +// +// +// +// {children} +// +// +// +// ) + +// const root = ReactDOM.createRoot(rootElement) +// root.render(content); + +// } diff --git a/src/vs/workbench/contrib/void/browser/util/shared_types.ts b/src/vs/workbench/contrib/void/browser/util/shared_types.ts index 9fc6f820c..8b5132c34 100644 --- a/src/vs/workbench/contrib/void/browser/util/shared_types.ts +++ b/src/vs/workbench/contrib/void/browser/util/shared_types.ts @@ -2,9 +2,9 @@ import * as vscode from 'vscode'; import { PartialVoidConfig } from '../webviews/common/contextForConfig' -type CodeSelection = { selectionStr: string, filePath: vscode.Uri } +// type CodeSelection = { selectionStr: string, filePath: vscode.Uri } -type File = { filepath: vscode.Uri, content: string } +// type File = { filepath: vscode.Uri, content: string } // an area that is currently being diffed type DiffArea = { @@ -57,33 +57,33 @@ type MessageFromSidebar = ( ) -type ChatThreads = { - [id: string]: { - id: string; // store the id here too - createdAt: string; // ISO string - lastModified: string; // ISO string - messages: ChatMessage[]; - } -} +// type ChatThreads = { +// [id: string]: { +// id: string; // store the id here too +// createdAt: string; // ISO string +// lastModified: string; // ISO string +// messages: ChatMessage[]; +// } +// } -type ChatMessage = - | { - role: "user"; - content: string; // content sent to the llm - displayContent: string; // content displayed to user - selection: CodeSelection | null; // the user's selection - files: vscode.Uri[]; // the files sent in the message - } - | { - role: "assistant"; - content: string; // content received from LLM - displayContent: string | undefined; // content displayed to user (this is the same as content for now) - } - | { - role: "system"; - content: string; - displayContent?: undefined; - } +// type ChatMessage = +// | { +// role: "user"; +// content: string; // content sent to the llm +// displayContent: string; // content displayed to user +// selection: CodeSelection | null; // the user's selection +// files: vscode.Uri[]; // the files sent in the message +// } +// | { +// role: "assistant"; +// content: string; // content received from LLM +// displayContent: string | undefined; // content displayed to user (this is the same as content for now) +// } +// | { +// role: "system"; +// content: string; +// displayContent?: undefined; +// } export { BaseDiff, Diff, diff --git a/src/vs/workbench/contrib/void/browser/void.contribution.ts b/src/vs/workbench/contrib/void/browser/void.contribution.ts index 54e870c07..430f269d3 100644 --- a/src/vs/workbench/contrib/void/browser/void.contribution.ts +++ b/src/vs/workbench/contrib/void/browser/void.contribution.ts @@ -1,3 +1,11 @@ -import './registerViewPane.js' +// register Settings +import './registerSettings.js' +// register Sidebar chat +import './registerSidebar.js' +// register Posthog metrics +import './registerMetrics.js' + +// register Thread History +import './registerThreadsHistory.js' diff --git a/src/vs/workbench/contrib/void/browser/voidViewPane.ts b/src/vs/workbench/contrib/void/browser/voidViewPane.ts deleted file mode 100644 index 1bbf86e10..000000000 --- a/src/vs/workbench/contrib/void/browser/voidViewPane.ts +++ /dev/null @@ -1,56 +0,0 @@ - - -import * as dom from '../../../../base/browser/dom.js'; - -import { ViewPane } from '../../../browser/parts/views/viewPane.js'; - -// import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -// import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -// import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -// import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -// import { IViewPaneOptions, } from 'vs/workbench/browser/parts/views/viewPane'; -// import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -// import { IOpenerService } from 'vs/platform/opener/common/opener'; -// import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -// import { IThemeService } from 'vs/platform/theme/common/themeService'; -// import { IViewDescriptorService } from 'vs/workbench/common/views'; -// import { IHoverService } from 'vs/platform/hover/browser/hover'; - -// import { useState } from './void-imports/react.js'; -// const x = useState(); - -export class VoidViewPane extends ViewPane { - - // constructor( - // options: IViewPaneOptions, - // @IInstantiationService instantiationService: IInstantiationService, - // @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - // @IConfigurationService configurationService: IConfigurationService, - // @IContextKeyService contextKeyService: IContextKeyService, - // @IThemeService themeService: IThemeService, - // @IContextMenuService contextMenuService: IContextMenuService, - // @IKeybindingService keybindingService: IKeybindingService, - // @IOpenerService openerService: IOpenerService, - // @ITelemetryService telemetryService: ITelemetryService, - // @IHoverService hoverService: IHoverService, - // ) { - // super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService); - // } - - - - protected override renderBody(parent: HTMLElement): void { - super.renderBody(parent); - - const container = dom.append(parent, dom.$('.search-view')); - container.textContent = 'Hello Void!'; - - console.log('Void container', container); - - - } -} - -// register a singleton service that mounts the ViewPane here - - diff --git a/void-imports/index.ts b/void-imports/index.ts index b8f97c959..b72cc53df 100755 --- a/void-imports/index.ts +++ b/void-imports/index.ts @@ -2,7 +2,7 @@ import * as fs from 'fs' import * as path from 'path' import * as tsup from 'tsup' -const buildFiles = (imports: string[], to_be_built_folder: string) => { +const createFiles = (imports: string[], to_be_built_folder: string) => { for (const importName of imports) { const content = `\ export * from '${importName}'; @@ -43,10 +43,11 @@ const compileFiles = async (imports: string[], to_be_built_folder: string, outDi const to_be_built_folder = 'to_be_built' -fs.rmSync(to_be_built_folder, { recursive: true, force: true }); +// const imports = ['openai', '@anthropic-ai/sdk', 'react', 'react-dom'] +const imports = ['sendLLMMessage'] -const imports = ['openai', '@anthropic-ai/sdk', 'react', 'react-dom'] -buildFiles(imports, to_be_built_folder) +// fs.rmSync(to_be_built_folder, { recursive: true, force: true }); +// createFiles(imports, to_be_built_folder) const OUT_DIR = '../src/vs/workbench/contrib/void/browser/void-imports' compileFiles(imports, to_be_built_folder, OUT_DIR) diff --git a/void-imports/package-lock.json b/void-imports/package-lock.json new file mode 100644 index 000000000..2ddf6f9cb --- /dev/null +++ b/void-imports/package-lock.json @@ -0,0 +1,817 @@ +{ + "name": "void-imports", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "void-imports", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "@google/generative-ai": "^0.21.0", + "ollama": "^0.5.9", + "openai": "^4.71.1" + }, + "devDependencies": { + "tsx": "^4.19.2" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", + "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@google/generative-ai": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz", + "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/ollama": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.9.tgz", + "integrity": "sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==", + "license": "MIT", + "dependencies": { + "whatwg-fetch": "^3.6.20" + } + }, + "node_modules/openai": { + "version": "4.71.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.71.1.tgz", + "integrity": "sha512-C6JNMaQ1eijM0lrjiRUL3MgThVP5RdwNAghpbJFdW0t11LzmyqON8Eh8MuUuEZ+CeD6bgYl2Fkn2BoptVxv9Ug==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } +} diff --git a/void-imports/package.json b/void-imports/package.json new file mode 100644 index 000000000..66c07bcd1 --- /dev/null +++ b/void-imports/package.json @@ -0,0 +1,19 @@ +{ + "name": "void-imports", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "build": "tdx index.ts" + }, + "author": "", + "description": "", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "@google/generative-ai": "^0.21.0", + "ollama": "^0.5.9", + "openai": "^4.71.1" + }, + "devDependencies": { + "tsx": "^4.19.2" + } +} diff --git a/src/vs/workbench/contrib/void/browser/util/sendLLMMessage.ts b/void-imports/sendLLMMessage.ts similarity index 96% rename from src/vs/workbench/contrib/void/browser/util/sendLLMMessage.ts rename to void-imports/sendLLMMessage.ts index d079f3ff8..42e543b84 100644 --- a/src/vs/workbench/contrib/void/browser/util/sendLLMMessage.ts +++ b/void-imports/sendLLMMessage.ts @@ -2,9 +2,11 @@ import Anthropic from '@anthropic-ai/sdk'; import OpenAI from 'openai'; import { Ollama } from 'ollama/browser' import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; -import { VoidConfig } from '../webviews/common/contextForConfig' -import { captureEvent } from '../webviews/common/posthog'; -import { ChatMessage } from './shared_types'; +// import { VoidConfig } from '../webviews/common/contextForConfig' +// import { captureEvent } from '../webviews/common/posthog'; +// import { ChatMessage } from './shared_types'; + +type VoidConfig = any export type AbortRef = { current: (() => void) | null } @@ -324,13 +326,13 @@ export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ // only captures number of messages and message "shape", no actual code, instructions, prompts, etc const captureChatEvent = (eventId: string, extras?: object) => { - captureEvent(eventId, { - whichApi: voidConfig.default['whichApi'], - numMessages: messages?.length, - messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.content.length })), - version: '2024-11-02', - ...extras, - }) + // captureEvent(eventId, { + // whichApi: voidConfig.default['whichApi'], + // numMessages: messages?.length, + // messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.content.length })), + // version: '2024-11-02', + // ...extras, + // }) } const submit_time = new Date() diff --git a/void-imports/tsconfig.json b/void-imports/tsconfig.json new file mode 100644 index 000000000..7173d1de2 --- /dev/null +++ b/void-imports/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "NodeNext", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["to_be_built/**/*"], + "exclude": ["node_modules"] +} From 932e9fe9c61bb7d59b4289907aeef0ba97e7dcdb Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 8 Nov 2024 02:50:52 -0800 Subject: [PATCH 020/107] progress --- .../contrib/void/browser/registerMetrics.ts | 6 ++ .../contrib/void/browser/registerSettings.ts | 8 +- .../contrib/void/browser/registerSidebar.ts | 80 +++++++++++----- .../void/browser/registerThreadsHistory.ts | 15 ++- .../browser/sidebar/.vscode/extensions.json | 8 -- .../void/browser/sidebar/.vscode/launch.json | 22 ----- .../browser/sidebar/.vscode/settings.json | 18 ---- .../void/browser/sidebar/.vscode/tasks.json | 20 ---- .../contrib/void/browser/sidebar/Sidebar.tsx | 96 +++++++++---------- .../void/browser/sidebar/SidebarChat.tsx | 46 ++++----- .../browser/sidebar/SidebarWebviewProvider.ts | 46 ++++----- .../browser/{util => sidebar}/shared_types.ts | 0 .../{util => sidebar}/systemPrompts.ts | 0 .../contrib/void/browser/util/posthog.ts | 19 ---- 14 files changed, 175 insertions(+), 209 deletions(-) delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json rename src/vs/workbench/contrib/void/browser/{util => sidebar}/shared_types.ts (100%) rename src/vs/workbench/contrib/void/browser/{util => sidebar}/systemPrompts.ts (100%) delete mode 100644 src/vs/workbench/contrib/void/browser/util/posthog.ts diff --git a/src/vs/workbench/contrib/void/browser/registerMetrics.ts b/src/vs/workbench/contrib/void/browser/registerMetrics.ts index 4c256d301..45aa91f25 100644 --- a/src/vs/workbench/contrib/void/browser/registerMetrics.ts +++ b/src/vs/workbench/contrib/void/browser/registerMetrics.ts @@ -30,6 +30,12 @@ class MetricsService extends Disposable implements IMetricsService { console.debug('deviceId', deviceId) posthog.identify(deviceId) + + + // export const captureEvent = (eventId: string, properties: object) => { + // posthog.capture(eventId, properties) + // } + } } diff --git a/src/vs/workbench/contrib/void/browser/registerSettings.ts b/src/vs/workbench/contrib/void/browser/registerSettings.ts index 0297c0352..0862197cb 100644 --- a/src/vs/workbench/contrib/void/browser/registerSettings.ts +++ b/src/vs/workbench/contrib/void/browser/registerSettings.ts @@ -205,8 +205,14 @@ export type VoidConfig = { const VOID_CONFIG_KEY = 'void.partialVoidConfig' +type setFieldType = (field: K, param: keyof VoidConfigInfo[K], newVal: string) => Promise; + export interface IVoidSettingsService { readonly _serviceBrand: undefined; + onDidChange: Event; + getPartialVoidConfig(): Promise; + getVoidConfig(): Promise; + setField: setFieldType; } export const IVoidSettingsService = createDecorator('voidSettingsService'); @@ -248,7 +254,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { // Set field on PartialVoidConfig - async setField(field: K, param: keyof VoidConfigInfo[K], newVal: string) { + setField: setFieldType = async (field: K, param: keyof VoidConfigInfo[K], newVal: string) => { const partialVoidConfig = await this.getPartialVoidConfig() const newPartialConfig: PartialVoidConfig = { diff --git a/src/vs/workbench/contrib/void/browser/registerSidebar.ts b/src/vs/workbench/contrib/void/browser/registerSidebar.ts index 27a5d1b0a..01ac8b524 100644 --- a/src/vs/workbench/contrib/void/browser/registerSidebar.ts +++ b/src/vs/workbench/contrib/void/browser/registerSidebar.ts @@ -37,6 +37,8 @@ import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; import { IVoidSettingsService } from './registerSettings.js'; +import { IEditorService } from '../../../services/editor/common/editorService.js'; + // compare against search.contribution.ts and https://app.greptile.com/chat/w1nsmt3lauwzculipycpn?repo=github%3Amain%3Amicrosoft%2Fvscode @@ -78,20 +80,40 @@ class VoidSidebarViewPane extends ViewPane { protected override renderBody(parent: HTMLElement): void { super.renderBody(parent); - const { root, history, chat, settings } = dom.h('div@root', [ - dom.h('div@history', []), + //
+ + const { root, chat, history, settings } = dom.h('div@root', [ dom.h('div@chat', []), + dom.h('div@history', []), dom.h('div@settings', []), ]) root.style.display = 'flex'; root.style.flexDirection = 'column'; root.style.height = '100vh'; root.style.width = '100%'; - - dom.append(parent, root); + this._renderChat(chat); this._renderHistory(history); + this._renderSettings(settings); + } + + + private _renderChat(element: HTMLElement) { + //
+ // + //
+ + + + this._voidSidebarStateService.onDidChange(() => { + }) + + + this._voidSidebarStateService.onFocusChat(() => { + }) + this._voidSidebarStateService.onBlurChat(() => { + }) } @@ -116,12 +138,6 @@ class VoidSidebarViewPane extends ViewPane { } - private _renderChat(element: HTMLElement) { - //
- // - //
- - } } @@ -209,7 +225,7 @@ class VoidSidebarStateService extends Disposable implements IVoidSidebarStateSer @IViewsService private readonly _viewsService: IViewsService, ) { super() - // auto open the view on mount (can view this as initializing state...) + // auto open the view on mount (if it bothers you this is here, this is technically just initializing the state of the view) this._viewsService.openView(SIDEBAR_VIEW_ID); } @@ -247,44 +263,60 @@ registerAction2(class extends Action2 { const stateService = accessor.get(IVoidSidebarStateService) stateService.setState({ isHistoryOpen: false, currentTab: 'chat' }) stateService.focusChat() + + const selection = accessor.get(IEditorService).activeTextEditorControl?.getSelection() + + + // chat state: + // // if user pressed ctrl+l, add their selection to the sidebar + // useOnVSCodeMessage('ctrl+l', (m) => { + // setSelection(m.selection) + // const filepath = m.selection.filePath + + // // add current file to the context if it's not already in the files array + // if (!files.find(f => f.fsPath === filepath.fsPath)) + // setFiles(files => [...files, filepath]) + // }) + + } }); -// History menu button +// New chat menu button registerAction2(class extends Action2 { constructor() { super({ - id: 'void.historyAction', + id: 'void.newChatAction', title: 'View past chats', - icon: { id: 'history' }, + icon: { id: 'add' }, menu: [{ id: MenuId.ViewTitle, group: 'navigation', when: ContextKeyExpr.equals('view', SIDEBAR_VIEW_ID), }] }); } async run(accessor: ServicesAccessor): Promise { const stateService = accessor.get(IVoidSidebarStateService) - stateService.setState({ isHistoryOpen: !stateService.state.isHistoryOpen }) - stateService.blurChat() + stateService.setState({ isHistoryOpen: false, currentTab: 'chat' }) + stateService.focusChat() + + const historyService = accessor.get(IThreadHistoryService) + historyService.startNewThread() } }) -// New chat menu button +// History menu button registerAction2(class extends Action2 { constructor() { super({ - id: 'void.newChatAction', + id: 'void.historyAction', title: 'View past chats', - icon: { id: 'add' }, + icon: { id: 'history' }, menu: [{ id: MenuId.ViewTitle, group: 'navigation', when: ContextKeyExpr.equals('view', SIDEBAR_VIEW_ID), }] }); } async run(accessor: ServicesAccessor): Promise { const stateService = accessor.get(IVoidSidebarStateService) - stateService.setState({ isHistoryOpen: false, currentTab: 'chat' }) - stateService.focusChat() - - const historyService = accessor.get(IThreadHistoryService) - historyService.startNewThread() + stateService.setState({ isHistoryOpen: !stateService.state.isHistoryOpen }) + stateService.blurChat() } }) diff --git a/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts b/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts index 718624365..89fff739b 100644 --- a/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts +++ b/src/vs/workbench/contrib/void/browser/registerThreadsHistory.ts @@ -39,7 +39,7 @@ type ChatMessage = // a "thread" means a chat message history -const createNewThread = () => { +const newThreadObject = () => { const now = new Date().toISOString() return { id: new Date().getTime().toString(), @@ -91,8 +91,17 @@ class ThreadHistoryService extends Disposable implements IThreadHistoryService { startNewThread() { - const newThread = createNewThread() + + // if a thread with 0 messages already exists, switch to it const currentThreads = this.getAllThreads() + for (let threadId in currentThreads) { + if (currentThreads[threadId].messages.length === 0) { + this.switchToThread(threadId) + return + } + } + + const newThread = newThreadObject() this._storeAllThreads({ ...currentThreads, [newThread.id]: newThread @@ -110,7 +119,7 @@ class ThreadHistoryService extends Disposable implements IThreadHistoryService { currentThread = allThreads[this._currentThreadId] } else { - currentThread = createNewThread() + currentThread = newThreadObject() this._currentThreadId = currentThread.id } diff --git a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json deleted file mode 100644 index 186459d58..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/extensions.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "dbaeumer.vscode-eslint", - "ms-vscode.extension-test-runner" - ] -} diff --git a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json deleted file mode 100644 index 17ab1d570..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -// A launch configuration that compiles the extension and then opens it inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--enable-proposed-api=void.void", - ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - } - ] -} \ No newline at end of file diff --git a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json deleted file mode 100644 index 3100dfe2e..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/settings.json +++ /dev/null @@ -1,18 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - "out": false, - "**/node_modules": true - }, - "search.exclude": { - "out": true // set this to false to include "out" folder in search results - }, - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts - "typescript.tsc.autoDetect": "off", -} diff --git a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json b/src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json deleted file mode 100644 index 3b17e53b6..000000000 --- a/src/vs/workbench/contrib/void/browser/sidebar/.vscode/tasks.json +++ /dev/null @@ -1,20 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "group": { - "kind": "build", - "isDefault": true - } - } - ] -} diff --git a/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx index b3bf8ae37..23674faf9 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx @@ -1,63 +1,63 @@ -import React, { useState, useRef } from '../void-imports/react.js' -import { SidebarThreadSelector } from './SidebarThreadSelector.js'; -import { SidebarChat } from './SidebarChat.js'; -import { SidebarSettings } from './SidebarSettings.js'; +// import React, { useState, useRef } from '../void-imports/react.js' +// import { SidebarThreadSelector } from './SidebarThreadSelector.js'; +// import { SidebarChat } from './SidebarChat.js'; +// import { SidebarSettings } from './SidebarSettings.js'; -const Sidebar = () => { +// const Sidebar = () => { - const chatInputRef = useRef(null) +// const chatInputRef = useRef(null) - const [tab, setTab] = useState<'threadSelector' | 'chat' | 'settings'>('chat') +// const [tab, setTab] = useState<'threadSelector' | 'chat' | 'settings'>('chat') - // // if they pressed the + to add a new chat - // useOnVSCodeMessage('startNewThread', (m) => { - // setTab('chat'); - // chatInputRef.current?.focus(); - // }) +// // // if they pressed the + to add a new chat +// // useOnVSCodeMessage('startNewThread', (m) => { +// // setTab('chat'); +// // chatInputRef.current?.focus(); +// // }) - // // ctrl+l should switch back to chat - // useOnVSCodeMessage('ctrl+l', (m) => { - // setTab('chat'); - // chatInputRef.current?.focus(); - // }) +// // // ctrl+l should switch back to chat +// // useOnVSCodeMessage('ctrl+l', (m) => { +// // setTab('chat'); +// // chatInputRef.current?.focus(); +// // }) - // // if they toggled thread selector - // useOnVSCodeMessage('toggleThreadSelector', (m) => { - // if (tab === 'threadSelector') { - // setTab('chat') - // chatInputRef.current?.blur(); - // } else - // setTab('threadSelector') - // }) +// // // if they toggled thread selector +// // useOnVSCodeMessage('toggleThreadSelector', (m) => { +// // if (tab === 'threadSelector') { +// // setTab('chat') +// // chatInputRef.current?.blur(); +// // } else +// // setTab('threadSelector') +// // }) - // // if they toggled settings - // useOnVSCodeMessage('toggleSettings', (m) => { - // if (tab === 'settings') { - // setTab('chat') - // chatInputRef.current?.blur(); - // } else - // setTab('settings') - // }) +// // // if they toggled settings +// // useOnVSCodeMessage('toggleSettings', (m) => { +// // if (tab === 'settings') { +// // setTab('chat') +// // chatInputRef.current?.blur(); +// // } else +// // setTab('settings') +// // }) - return <> -
+// return <> +//
-
- setTab('chat')} /> -
+//
+// setTab('chat')} /> +//
-
- -
+//
+// +//
-
- -
+//
+// +//
-
- +//
+// -} +// } -export default Sidebar +// export default Sidebar diff --git a/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx index 746b51e6a..2b58705a3 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx @@ -147,6 +147,29 @@ const ChatBubble = ({ chatMessage }: { chatMessage: ChatMessage }) => { export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject }) => { + // // if they pressed the + to add a new chat + // useOnVSCodeMessage('startNewThread', (m) => { + // const allThreads = getAllThreads() + // // find a thread with 0 messages and switch to it + // for (let threadId in allThreads) { + // if (allThreads[threadId].messages.length === 0) { + // switchToThread(threadId) + // return + // } + // } + // // start a new thread + // startNewThread() + // }) + + // // if user pressed ctrl+l, add their selection to the sidebar + // useOnVSCodeMessage('ctrl+l', (m) => { + // setSelection(m.selection) + // const filepath = m.selection.filePath + + // // add current file to the context if it's not already in the files array + // if (!files.find(f => f.fsPath === filepath.fsPath)) + // setFiles(files => [...files, filepath]) + // }) // state of current message const [selection, setSelection] = useState(null) // the code the user is selecting @@ -167,29 +190,6 @@ export const SidebarChat = ({ chatInputRef }: { chatInputRef: React.RefObject { - const allThreads = getAllThreads() - // find a thread with 0 messages and switch to it - for (let threadId in allThreads) { - if (allThreads[threadId].messages.length === 0) { - switchToThread(threadId) - return - } - } - // start a new thread - startNewThread() - }) - - // if user pressed ctrl+l, add their selection to the sidebar - useOnVSCodeMessage('ctrl+l', (m) => { - setSelection(m.selection) - const filepath = m.selection.filePath - - // add current file to the context if it's not already in the files array - if (!files.find(f => f.fsPath === filepath.fsPath)) - setFiles(files => [...files, filepath]) - }) const isDisabled = !instructions diff --git a/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts b/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts index 08191944d..6cdc842e9 100644 --- a/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts +++ b/src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts @@ -1,30 +1,30 @@ -// renders the code from `src/sidebar` +// // renders the code from `src/sidebar` -import * as vscode from 'vscode'; -import { updateWebviewHTML as _updateWebviewHTML } from './src/extension/extensionLib/updateWebviewHTML'; +// import * as vscode from 'vscode'; +// import { updateWebviewHTML as _updateWebviewHTML } from './src/extension/extensionLib/updateWebviewHTML'; -export class SidebarWebviewProvider implements vscode.WebviewViewProvider { - public static readonly viewId = 'void.viewnumberone'; +// export class SidebarWebviewProvider implements vscode.WebviewViewProvider { +// public static readonly viewId = 'void.viewnumberone'; - public webview: Promise // used to send messages to the webview, resolved by _res in resolveWebviewView - private _res: (c: vscode.Webview) => void // used to resolve the webview +// public webview: Promise // used to send messages to the webview, resolved by _res in resolveWebviewView +// private _res: (c: vscode.Webview) => void // used to resolve the webview - private readonly _extensionUri: vscode.Uri +// private readonly _extensionUri: vscode.Uri - constructor(context: vscode.ExtensionContext) { - // const extensionPath = context.extensionPath // the directory where the extension is installed, might be useful later... was included in webviewProvider code - this._extensionUri = context.extensionUri +// constructor(context: vscode.ExtensionContext) { +// // const extensionPath = context.extensionPath // the directory where the extension is installed, might be useful later... was included in webviewProvider code +// this._extensionUri = context.extensionUri - let temp_res: typeof this._res | undefined = undefined - this.webview = new Promise((res, rej) => { temp_res = res }) - if (!temp_res) throw new Error("Void sidebar provider: resolver was undefined") - this._res = temp_res - } +// let temp_res: typeof this._res | undefined = undefined +// this.webview = new Promise((res, rej) => { temp_res = res }) +// if (!temp_res) throw new Error("Void sidebar provider: resolver was undefined") +// this._res = temp_res +// } - // called internally by vscode - resolveWebviewView(webviewView: vscode.WebviewView, context: vscode.WebviewViewResolveContext, token: vscode.CancellationToken,) { - const webview = webviewView.webview; - _updateWebviewHTML(webview, this._extensionUri, { jsOutLocation: 'dist/webviews/sidebar/index.js', cssOutLocation: 'dist/webviews/styles.css' }) - this._res(webview); // resolve webview and _webviewView - } -} +// // called internally by vscode +// resolveWebviewView(webviewView: vscode.WebviewView, context: vscode.WebviewViewResolveContext, token: vscode.CancellationToken,) { +// const webview = webviewView.webview; +// _updateWebviewHTML(webview, this._extensionUri, { jsOutLocation: 'dist/webviews/sidebar/index.js', cssOutLocation: 'dist/webviews/styles.css' }) +// this._res(webview); // resolve webview and _webviewView +// } +// } diff --git a/src/vs/workbench/contrib/void/browser/util/shared_types.ts b/src/vs/workbench/contrib/void/browser/sidebar/shared_types.ts similarity index 100% rename from src/vs/workbench/contrib/void/browser/util/shared_types.ts rename to src/vs/workbench/contrib/void/browser/sidebar/shared_types.ts diff --git a/src/vs/workbench/contrib/void/browser/util/systemPrompts.ts b/src/vs/workbench/contrib/void/browser/sidebar/systemPrompts.ts similarity index 100% rename from src/vs/workbench/contrib/void/browser/util/systemPrompts.ts rename to src/vs/workbench/contrib/void/browser/sidebar/systemPrompts.ts diff --git a/src/vs/workbench/contrib/void/browser/util/posthog.ts b/src/vs/workbench/contrib/void/browser/util/posthog.ts deleted file mode 100644 index cccf20102..000000000 --- a/src/vs/workbench/contrib/void/browser/util/posthog.ts +++ /dev/null @@ -1,19 +0,0 @@ -import posthog from '../void-imports/posthog-js.js' - -export const identifyUser = (id: string) => { - posthog.identify(id) -} - -export const captureEvent = (eventId: string, properties: object) => { - posthog.capture(eventId, properties) -} - -export const initPosthog = () => { - // We send absolutely no code to the server. We only track usage metrics like button clicks, etc. This might change and we might eventually add an opt-in or opt-out. - posthog.init('phc_UanIdujHiLp55BkUTjB1AuBXcasVkdqRwgnwRlWESH2', - { - api_host: 'https://us.i.posthog.com', - person_profiles: 'identified_only' // we only track events from identified users. We identify them in Sidebar - } - ) -} From b52f0d8dd7f58f26cafd61a5518301dc9bc2a41d Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Fri, 8 Nov 2024 17:29:40 -0800 Subject: [PATCH 021/107] misc --- src/vs/workbench/contrib/void/browser/registerSettings.ts | 1 + src/vs/workbench/contrib/void/browser/registerSidebar.ts | 5 +++-- .../browser/sidebar/{SidebarChat.tsx => !SidebarChat.tsx} | 0 .../sidebar/{SidebarSettings.tsx => !SidebarSettings.tsx} | 0 ...{SidebarThreadSelector.tsx => !SidebarThreadSelector.tsx} | 0 5 files changed, 4 insertions(+), 2 deletions(-) rename src/vs/workbench/contrib/void/browser/sidebar/{SidebarChat.tsx => !SidebarChat.tsx} (100%) rename src/vs/workbench/contrib/void/browser/sidebar/{SidebarSettings.tsx => !SidebarSettings.tsx} (100%) rename src/vs/workbench/contrib/void/browser/sidebar/{SidebarThreadSelector.tsx => !SidebarThreadSelector.tsx} (100%) diff --git a/src/vs/workbench/contrib/void/browser/registerSettings.ts b/src/vs/workbench/contrib/void/browser/registerSettings.ts index 0862197cb..c588c346f 100644 --- a/src/vs/workbench/contrib/void/browser/registerSettings.ts +++ b/src/vs/workbench/contrib/void/browser/registerSettings.ts @@ -272,6 +272,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { constructor( @IStorageService private readonly _storageService: IStorageService, @IEncryptionService private readonly _encryptionService: IEncryptionService, + // @ISecretStorageService private readonly _secretStorageService: ISecretStorageService, // could have used this, but it's clearer the way it is (+ slightly different eg StorageTarget.USER) ) { super() } diff --git a/src/vs/workbench/contrib/void/browser/registerSidebar.ts b/src/vs/workbench/contrib/void/browser/registerSidebar.ts index 01ac8b524..07e1f3f16 100644 --- a/src/vs/workbench/contrib/void/browser/registerSidebar.ts +++ b/src/vs/workbench/contrib/void/browser/registerSidebar.ts @@ -36,8 +36,9 @@ import { IKeybindingService } from '../../../../platform/keybinding/common/keybi import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { IHoverService } from '../../../../platform/hover/browser/hover.js'; -import { IVoidSettingsService } from './registerSettings.js'; +// import { IVoidSettingsService } from './registerSettings.js'; import { IEditorService } from '../../../services/editor/common/editorService.js'; +// import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js'; @@ -69,10 +70,10 @@ class VoidSidebarViewPane extends ViewPane { // Void: @IVoidSidebarStateService private readonly _voidSidebarStateService: IVoidSidebarStateService, @IThreadHistoryService private readonly _threadHistoryService: IThreadHistoryService, - @IVoidSettingsService private readonly _voidSettingsService: IVoidSettingsService, // TODO chat service ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService) + } diff --git a/src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/sidebar/!SidebarChat.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/sidebar/SidebarChat.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/!SidebarChat.tsx diff --git a/src/vs/workbench/contrib/void/browser/sidebar/SidebarSettings.tsx b/src/vs/workbench/contrib/void/browser/sidebar/!SidebarSettings.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/sidebar/SidebarSettings.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/!SidebarSettings.tsx diff --git a/src/vs/workbench/contrib/void/browser/sidebar/SidebarThreadSelector.tsx b/src/vs/workbench/contrib/void/browser/sidebar/!SidebarThreadSelector.tsx similarity index 100% rename from src/vs/workbench/contrib/void/browser/sidebar/SidebarThreadSelector.tsx rename to src/vs/workbench/contrib/void/browser/sidebar/!SidebarThreadSelector.tsx From 8da76e72dfa786ff12129b135c5c9ec855deadc9 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Sat, 9 Nov 2024 19:57:57 -0800 Subject: [PATCH 022/107] big changes + react build pipeline (broken) --- src/package.json | 3 - .../contrib/void/browser/misc/DiffProvider.ts | 778 +- .../contrib/void/browser/misc/extension.ts | 368 +- .../void/browser/misc/sendLLMMessage.ts | 395 + .../contrib/void/browser/react/README.js | 4 + .../contrib/void/browser/react/out/Sidebar.js | 23615 ++++++++++++++++ .../void/browser/react/out/Sidebar.js.map | 1 + .../browser/react/sidebar-tsx/Sidebar.tsx | 74 + .../browser/react/sidebar-tsx/SidebarChat.tsx | 350 + .../react/sidebar-tsx/SidebarSettings.tsx | 105 + .../sidebar-tsx/SidebarThreadSelector.tsx | 79 + .../browser/react/sidebar-tsx/shared_types.ts | 97 + .../sidebar-tsx}/systemPrompts.ts | 0 .../contrib/void/browser/react/tsup.config.js | 17 + .../util/mountFnGenerator.tsx} | 40 +- .../contrib/void/browser/registerMetrics.ts | 62 +- .../contrib/void/browser/registerSidebar.ts | 79 +- .../void/browser/sidebar/!SidebarChat.tsx | 359 - .../void/browser/sidebar/!SidebarSettings.tsx | 105 - .../sidebar/!SidebarThreadSelector.tsx | 79 - .../contrib/void/browser/sidebar/Sidebar.tsx | 63 - .../browser/sidebar/SidebarWebviewProvider.ts | 30 - .../void/browser/sidebar/contextForConfig.tsx | 289 - .../browser/sidebar/contextForThreads.tsx | 106 - .../browser/sidebar/markdown/BlockCode.tsx | 42 - .../sidebar/markdown/MarkdownRender.tsx | 223 - .../void/browser/sidebar/shared_types.ts | 97 - void-imports/.gitignore | 1 - void-imports/README.txt | 1 - void-imports/index.ts | 54 - void-imports/package-lock.json | 817 - void-imports/package.json | 19 - void-imports/sendLLMMessage.ts | 395 - void-imports/tsconfig.json | 12 - 34 files changed, 25389 insertions(+), 3370 deletions(-) delete mode 100644 src/package.json create mode 100644 src/vs/workbench/contrib/void/browser/misc/sendLLMMessage.ts create mode 100644 src/vs/workbench/contrib/void/browser/react/README.js create mode 100644 src/vs/workbench/contrib/void/browser/react/out/Sidebar.js create mode 100644 src/vs/workbench/contrib/void/browser/react/out/Sidebar.js.map create mode 100644 src/vs/workbench/contrib/void/browser/react/sidebar-tsx/Sidebar.tsx create mode 100644 src/vs/workbench/contrib/void/browser/react/sidebar-tsx/SidebarChat.tsx create mode 100644 src/vs/workbench/contrib/void/browser/react/sidebar-tsx/SidebarSettings.tsx create mode 100644 src/vs/workbench/contrib/void/browser/react/sidebar-tsx/SidebarThreadSelector.tsx create mode 100644 src/vs/workbench/contrib/void/browser/react/sidebar-tsx/shared_types.ts rename src/vs/workbench/contrib/void/browser/{sidebar => react/sidebar-tsx}/systemPrompts.ts (100%) create mode 100644 src/vs/workbench/contrib/void/browser/react/tsup.config.js rename src/vs/workbench/contrib/void/browser/{util/mount.tsx => react/util/mountFnGenerator.tsx} (51%) delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/!SidebarChat.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/!SidebarSettings.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/!SidebarThreadSelector.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/Sidebar.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/SidebarWebviewProvider.ts delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/contextForConfig.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/contextForThreads.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/markdown/BlockCode.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/markdown/MarkdownRender.tsx delete mode 100644 src/vs/workbench/contrib/void/browser/sidebar/shared_types.ts delete mode 100644 void-imports/.gitignore delete mode 100644 void-imports/README.txt delete mode 100755 void-imports/index.ts delete mode 100644 void-imports/package-lock.json delete mode 100644 void-imports/package.json delete mode 100644 void-imports/sendLLMMessage.ts delete mode 100644 void-imports/tsconfig.json diff --git a/src/package.json b/src/package.json deleted file mode 100644 index bedb411a9..000000000 --- a/src/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts b/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts index 032b08927..a361002b3 100644 --- a/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts +++ b/src/vs/workbench/contrib/void/browser/misc/DiffProvider.ts @@ -1,450 +1,450 @@ -import * as vscode from 'vscode'; -import { findDiffs } from './src/extension/findDiffs'; -import { throttle } from 'lodash'; -import { DiffArea, BaseDiff, Diff } from '../common/shared_types'; -import { readFileContentOfUri } from './src/extension/extensionLib/readFileContentOfUri'; -import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; -import { writeFileWithDiffInstructions } from '../common/systemPrompts'; -import { VoidConfig } from './src/webviews/common/contextForConfig'; +// import * as vscode from 'vscode'; +// import { findDiffs } from './src/extension/findDiffs'; +// import { throttle } from 'lodash'; +// import { DiffArea, BaseDiff, Diff } from '../common/shared_types'; +// import { readFileContentOfUri } from './src/extension/extensionLib/readFileContentOfUri'; +// import { AbortRef, sendLLMMessage } from '../common/sendLLMMessage'; +// import { writeFileWithDiffInstructions } from '../common/systemPrompts'; +// import { VoidConfig } from './src/webviews/common/contextForConfig'; -const THROTTLE_TIME = 100 +// const THROTTLE_TIME = 100 -// TODO in theory this should be disposed -const lightGrayDecoration = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(218 218 218 / .2)', - isWholeLine: true, -}) -const darkGrayDecoration = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgb(148 148 148 / .2)', - isWholeLine: true, -}) +// // TODO in theory this should be disposed +// const lightGrayDecoration = vscode.window.createTextEditorDecorationType({ +// backgroundColor: 'rgba(218 218 218 / .2)', +// isWholeLine: true, +// }) +// const darkGrayDecoration = vscode.window.createTextEditorDecorationType({ +// backgroundColor: 'rgb(148 148 148 / .2)', +// isWholeLine: true, +// }) -// responsible for displaying diffs and showing accept/reject buttons -export class DiffProvider implements vscode.CodeLensProvider { +// // responsible for displaying diffs and showing accept/reject buttons +// export class DiffProvider implements vscode.CodeLensProvider { - private _originalFileOfDocument: { [docUriStr: string]: string } = {} - private _diffAreasOfDocument: { [docUriStr: string]: DiffArea[] } = {} - private _diffsOfDocument: { [docUriStr: string]: Diff[] } = {} +// private _originalFileOfDocument: { [docUriStr: string]: string } = {} +// private _diffAreasOfDocument: { [docUriStr: string]: DiffArea[] } = {} +// private _diffsOfDocument: { [docUriStr: string]: Diff[] } = {} - private _diffareaidPool = 0 - private _diffidPool = 0 +// private _diffareaidPool = 0 +// private _diffidPool = 0 - private _extensionUri: vscode.Uri +// private _extensionUri: vscode.Uri - // used internally by vscode - private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); // signals a UI refresh on .fire() events - public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; +// // used internally by vscode +// private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); // signals a UI refresh on .fire() events +// public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; - // used internally by vscode - public provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult { - const docUriStr = document.uri.toString() - return this._diffsOfDocument[docUriStr]?.flatMap(diff => diff.lenses) ?? [] - } +// // used internally by vscode +// public provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult { +// const docUriStr = document.uri.toString() +// return this._diffsOfDocument[docUriStr]?.flatMap(diff => diff.lenses) ?? [] +// } - // declared by us, registered with vscode.languages.registerCodeLensProvider() - constructor(context: vscode.ExtensionContext) { - this._extensionUri = context.extensionUri +// // declared by us, registered with vscode.languages.registerCodeLensProvider() +// constructor(context: vscode.ExtensionContext) { +// this._extensionUri = context.extensionUri - console.log('Creating DisplayChangesProvider') +// console.log('Creating DisplayChangesProvider') - // this acts as a useEffect every time text changes - vscode.workspace.onDidChangeTextDocument((e) => { +// // this acts as a useEffect every time text changes +// vscode.workspace.onDidChangeTextDocument((e) => { - const editor = vscode.window.activeTextEditor +// const editor = vscode.window.activeTextEditor - if (!editor) return +// if (!editor) return - const docUriStr = editor.document.uri.toString() - const changes = e.contentChanges.map(c => ({ startLine: c.range.start.line, endLine: c.range.end.line, text: c.text, })) +// const docUriStr = editor.document.uri.toString() +// const changes = e.contentChanges.map(c => ({ startLine: c.range.start.line, endLine: c.range.end.line, text: c.text, })) - // on user change, grow/shrink/merge/delete diff areas - this.resizeDiffAreas(docUriStr, changes, 'currentFile') +// // on user change, grow/shrink/merge/delete diff areas +// this.resizeDiffAreas(docUriStr, changes, 'currentFile') - // refresh the diffAreas - this.refreshStylesAndDiffs(docUriStr) +// // refresh the diffAreas +// this.refreshStylesAndDiffs(docUriStr) - }) - } +// }) +// } - // used by us only - public createDiffArea(uri: vscode.Uri, partialDiffArea: Omit, originalFile: string) { +// // used by us only +// public createDiffArea(uri: vscode.Uri, partialDiffArea: Omit, originalFile: string) { - const uriStr = uri.toString() +// const uriStr = uri.toString() - this._originalFileOfDocument[uriStr] = originalFile +// this._originalFileOfDocument[uriStr] = originalFile - // make sure array is defined - if (!this._diffAreasOfDocument[uriStr]) this._diffAreasOfDocument[uriStr] = [] +// // make sure array is defined +// if (!this._diffAreasOfDocument[uriStr]) this._diffAreasOfDocument[uriStr] = [] - // remove all diffAreas that the new `diffArea` is overlapping with - this._diffAreasOfDocument[uriStr] = this._diffAreasOfDocument[uriStr].filter(da => { - const noOverlap = da.startLine > partialDiffArea.endLine || da.endLine < partialDiffArea.startLine - if (!noOverlap) return false - return true - }) +// // remove all diffAreas that the new `diffArea` is overlapping with +// this._diffAreasOfDocument[uriStr] = this._diffAreasOfDocument[uriStr].filter(da => { +// const noOverlap = da.startLine > partialDiffArea.endLine || da.endLine < partialDiffArea.startLine +// if (!noOverlap) return false +// return true +// }) - // add `diffArea` to storage - const diffArea = { - ...partialDiffArea, - diffareaid: this._diffareaidPool - } - this._diffAreasOfDocument[uriStr].push(diffArea) - this._diffareaidPool += 1 +// // add `diffArea` to storage +// const diffArea = { +// ...partialDiffArea, +// diffareaid: this._diffareaidPool +// } +// this._diffAreasOfDocument[uriStr].push(diffArea) +// this._diffareaidPool += 1 - return diffArea - } +// return diffArea +// } - // used by us only - // changes the start/line locations based on the changes that were recently made. does not change any of the diffs in the diff areas - // changes tells us how many lines were inserted/deleted so we can grow/shrink the diffAreas accordingly - public resizeDiffAreas(docUriStr: string, changes: { text: string, startLine: number, endLine: number }[], changesTo: 'originalFile' | 'currentFile') { +// // used by us only +// // changes the start/line locations based on the changes that were recently made. does not change any of the diffs in the diff areas +// // changes tells us how many lines were inserted/deleted so we can grow/shrink the diffAreas accordingly +// public resizeDiffAreas(docUriStr: string, changes: { text: string, startLine: number, endLine: number }[], changesTo: 'originalFile' | 'currentFile') { - const diffAreas = this._diffAreasOfDocument[docUriStr] || [] +// const diffAreas = this._diffAreasOfDocument[docUriStr] || [] - let endLine: 'originalEndLine' | 'endLine' - let startLine: 'originalStartLine' | 'startLine' +// let endLine: 'originalEndLine' | 'endLine' +// let startLine: 'originalStartLine' | 'startLine' - if (changesTo === 'originalFile') { - endLine = 'originalEndLine' as const - startLine = 'originalStartLine' as const - } else { - endLine = 'endLine' as const - startLine = 'startLine' as const - } +// if (changesTo === 'originalFile') { +// endLine = 'originalEndLine' as const +// startLine = 'originalStartLine' as const +// } else { +// endLine = 'endLine' as const +// startLine = 'startLine' as const +// } - for (const change of changes) { +// for (const change of changes) { - // here, `change.range` is the range of the original file that gets replaced with `change.text` +// // here, `change.range` is the range of the original file that gets replaced with `change.text` - // compute net number of newlines lines that were added/removed - const numNewLines = (change.text.match(/\n/g) || []).length - const numLineDeletions = change.endLine - change.startLine - const deltaNewlines = numNewLines - numLineDeletions +// // compute net number of newlines lines that were added/removed +// const numNewLines = (change.text.match(/\n/g) || []).length +// const numLineDeletions = change.endLine - change.startLine +// const deltaNewlines = numNewLines - numLineDeletions - // compute overlap with each diffArea and shrink/elongate the diffArea accordingly - for (const diffArea of diffAreas) { +// // compute overlap with each diffArea and shrink/elongate the diffArea accordingly +// for (const diffArea of diffAreas) { - // if the change is fully within the diffArea, elongate it by the delta amount of newlines - if (change.startLine >= diffArea[startLine] && change.endLine <= diffArea[endLine]) { - diffArea[endLine] += deltaNewlines - } - // check if the `diffArea` was fully deleted and remove it if so - if (diffArea[startLine] > diffArea[endLine]) { - //remove it - const index = diffAreas.findIndex(da => da === diffArea) - diffAreas.splice(index, 1) - } - - // TODO handle other cases where eg. the change overlaps many diffAreas - } +// // if the change is fully within the diffArea, elongate it by the delta amount of newlines +// if (change.startLine >= diffArea[startLine] && change.endLine <= diffArea[endLine]) { +// diffArea[endLine] += deltaNewlines +// } +// // check if the `diffArea` was fully deleted and remove it if so +// if (diffArea[startLine] > diffArea[endLine]) { +// //remove it +// const index = diffAreas.findIndex(da => da === diffArea) +// diffAreas.splice(index, 1) +// } + +// // TODO handle other cases where eg. the change overlaps many diffAreas +// } - // if a diffArea is below the last character of the change, shift the diffArea up/down by the delta amount of newlines - for (const diffArea of diffAreas) { - if (diffArea[startLine] > change.endLine) { - diffArea[startLine] += deltaNewlines - diffArea[endLine] += deltaNewlines - } - } +// // if a diffArea is below the last character of the change, shift the diffArea up/down by the delta amount of newlines +// for (const diffArea of diffAreas) { +// if (diffArea[startLine] > change.endLine) { +// diffArea[startLine] += deltaNewlines +// diffArea[endLine] += deltaNewlines +// } +// } - // TODO merge any diffAreas if they overlap with each other as a result from the shift +// // TODO merge any diffAreas if they overlap with each other as a result from the shift - } - } +// } +// } - // used by us only - // refreshes all the diffs inside each diff area, and refreshes the styles - public refreshStylesAndDiffs(docUriStr: string) { +// // used by us only +// // refreshes all the diffs inside each diff area, and refreshes the styles +// public refreshStylesAndDiffs(docUriStr: string) { - const editor = vscode.window.activeTextEditor // TODO the editor should be that of `docUri` and not necessarily the current editor - if (!editor) { - console.log('Error: No active editor!') - return; - } - const originalFile = this._originalFileOfDocument[docUriStr] - if (!originalFile) { - console.log('Error: No original file!') - return; - } +// const editor = vscode.window.activeTextEditor // TODO the editor should be that of `docUri` and not necessarily the current editor +// if (!editor) { +// console.log('Error: No active editor!') +// return; +// } +// const originalFile = this._originalFileOfDocument[docUriStr] +// if (!originalFile) { +// console.log('Error: No original file!') +// return; +// } - const diffAreas = this._diffAreasOfDocument[docUriStr] || [] - - // reset all diffs (we update them below) - this._diffsOfDocument[docUriStr] = [] - - // TODO!!!! - // vscode.languages.clearInlineDiffs(editor) - - // for each diffArea - for (const diffArea of diffAreas) { - - // get code inside of diffArea - const originalCode = originalFile.split('\n').slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - const currentCode = editor.document.getText(new vscode.Range(diffArea.startLine, 0, diffArea.endLine, Number.MAX_SAFE_INTEGER)).replace(/\r\n/g, '\n') - - // compute the diffs - const diffs = findDiffs(originalCode, currentCode) - - // add the diffs to `this._diffsOfDocument[docUriStr]` +// const diffAreas = this._diffAreasOfDocument[docUriStr] || [] + +// // reset all diffs (we update them below) +// this._diffsOfDocument[docUriStr] = [] + +// // TODO!!!! +// // vscode.languages.clearInlineDiffs(editor) + +// // for each diffArea +// for (const diffArea of diffAreas) { + +// // get code inside of diffArea +// const originalCode = originalFile.split('\n').slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') +// const currentCode = editor.document.getText(new vscode.Range(diffArea.startLine, 0, diffArea.endLine, Number.MAX_SAFE_INTEGER)).replace(/\r\n/g, '\n') + +// // compute the diffs +// const diffs = findDiffs(originalCode, currentCode) + +// // add the diffs to `this._diffsOfDocument[docUriStr]` - // if no diffs, set diffs to [] - if (!this._diffsOfDocument[docUriStr]) - this._diffsOfDocument[docUriStr] = [] +// // if no diffs, set diffs to [] +// if (!this._diffsOfDocument[docUriStr]) +// this._diffsOfDocument[docUriStr] = [] - // add each diff and its codelens to the document - for (let i = diffs.length - 1; i > -1; i -= 1) { - let suggestedDiff = diffs[i] +// // add each diff and its codelens to the document +// for (let i = diffs.length - 1; i > -1; i -= 1) { +// let suggestedDiff = diffs[i] - this._diffsOfDocument[docUriStr].push({ - ...suggestedDiff, - diffid: this._diffidPool, - // originalCode: suggestedDiff.deletedText, - lenses: [ - new vscode.CodeLens(suggestedDiff.range, { title: 'Accept', command: 'void.acceptDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }), - new vscode.CodeLens(suggestedDiff.range, { title: 'Reject', command: 'void.rejectDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }) - ] - }); - vscode.languages.addInlineDiff(editor, suggestedDiff.originalCode, suggestedDiff.range) - this._diffidPool += 1 - } +// this._diffsOfDocument[docUriStr].push({ +// ...suggestedDiff, +// diffid: this._diffidPool, +// // originalCode: suggestedDiff.deletedText, +// lenses: [ +// new vscode.CodeLens(suggestedDiff.range, { title: 'Accept', command: 'void.acceptDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }), +// new vscode.CodeLens(suggestedDiff.range, { title: 'Reject', command: 'void.rejectDiff', arguments: [{ diffid: this._diffidPool, diffareaid: diffArea.diffareaid }] }) +// ] +// }); +// vscode.languages.addInlineDiff(editor, suggestedDiff.originalCode, suggestedDiff.range) +// this._diffidPool += 1 +// } - } +// } - // for each diffArea, highlight its sweepIndex in dark gray - editor.setDecorations( - darkGrayDecoration, - (this._diffAreasOfDocument[docUriStr] - .filter(diffArea => diffArea.sweepIndex !== null) - .map(diffArea => { - let s = diffArea.sweepIndex! - return new vscode.Range(s, 0, s, 0) - }) - ) - ) - - // for each diffArea, highlight sweepIndex+1...end in light gray - editor.setDecorations( - lightGrayDecoration, - (this._diffAreasOfDocument[docUriStr] - .filter(diffArea => diffArea.sweepIndex !== null) - .map(diffArea => { - return new vscode.Range(diffArea.sweepIndex! + 1, 0, diffArea.endLine, 0) - }) - ) - ) +// // for each diffArea, highlight its sweepIndex in dark gray +// editor.setDecorations( +// darkGrayDecoration, +// (this._diffAreasOfDocument[docUriStr] +// .filter(diffArea => diffArea.sweepIndex !== null) +// .map(diffArea => { +// let s = diffArea.sweepIndex! +// return new vscode.Range(s, 0, s, 0) +// }) +// ) +// ) + +// // for each diffArea, highlight sweepIndex+1...end in light gray +// editor.setDecorations( +// lightGrayDecoration, +// (this._diffAreasOfDocument[docUriStr] +// .filter(diffArea => diffArea.sweepIndex !== null) +// .map(diffArea => { +// return new vscode.Range(diffArea.sweepIndex! + 1, 0, diffArea.endLine, 0) +// }) +// ) +// ) - // update code lenses - this._onDidChangeCodeLenses.fire() +// // update code lenses +// this._onDidChangeCodeLenses.fire() - } +// } - // called on void.acceptDiff - public async acceptDiff({ diffid, diffareaid }: { diffid: number, diffareaid: number }) { - const editor = vscode.window.activeTextEditor - if (!editor) - return +// // called on void.acceptDiff +// public async acceptDiff({ diffid, diffareaid }: { diffid: number, diffareaid: number }) { +// const editor = vscode.window.activeTextEditor +// if (!editor) +// return - const docUriStr = editor.document.uri.toString() +// const docUriStr = editor.document.uri.toString() - const diffIdx = this._diffsOfDocument[docUriStr].findIndex(diff => diff.diffid === diffid); - if (diffIdx === -1) { console.error('Error: DiffID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } +// const diffIdx = this._diffsOfDocument[docUriStr].findIndex(diff => diff.diffid === diffid); +// if (diffIdx === -1) { console.error('Error: DiffID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } - const diffareaIdx = this._diffAreasOfDocument[docUriStr].findIndex(diff => diff.diffareaid === diffareaid); - if (diffareaIdx === -1) { console.error('Error: DiffAreaID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } +// const diffareaIdx = this._diffAreasOfDocument[docUriStr].findIndex(diff => diff.diffareaid === diffareaid); +// if (diffareaIdx === -1) { console.error('Error: DiffAreaID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } - const diff = this._diffsOfDocument[docUriStr][diffIdx] - const originalFile = this._originalFileOfDocument[docUriStr] - const currentFile = await readFileContentOfUri(editor.document.uri) - - // Fixed: Handle newlines properly by splitting into lines and joining with proper newlines - const originalLines = originalFile.split('\n'); - const currentLines = currentFile.split('\n'); - - // Get the changed lines from current file - const changedLines = currentLines.slice(diff.range.start.line, diff.range.end.line + 1); - - // Create new original file content by replacing the affected lines - const newOriginalLines = [ - ...originalLines.slice(0, diff.originalRange.start.line), - ...changedLines, - ...originalLines.slice(diff.originalRange.end.line + 1) - ]; - - this._originalFileOfDocument[docUriStr] = newOriginalLines.join('\n'); - - // Update diff areas based on the change - this.resizeDiffAreas(docUriStr, [{ - text: changedLines.join('\n'), - startLine: diff.originalRange.start.line, - endLine: diff.originalRange.end.line - }], 'originalFile') - - // Check if diffArea should be removed - - const diffArea = this._diffAreasOfDocument[docUriStr][diffareaIdx] - - const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') - const originalArea = newOriginalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - - if (originalArea === currentArea) { - const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) - this._diffAreasOfDocument[docUriStr].splice(index, 1) - } - - this.refreshStylesAndDiffs(docUriStr) - } - - // called on void.rejectDiff - public async rejectDiff({ diffid, diffareaid }: { diffid: number, diffareaid: number }) { - const editor = vscode.window.activeTextEditor - if (!editor) - return - - const docUriStr = editor.document.uri.toString() - - const diffIdx = this._diffsOfDocument[docUriStr].findIndex(diff => diff.diffid === diffid); - if (diffIdx === -1) { console.error('Error: DiffID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } - - const diffareaIdx = this._diffAreasOfDocument[docUriStr].findIndex(diff => diff.diffareaid === diffareaid); - if (diffareaIdx === -1) { console.error('Error: DiffAreaID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } - - const diff = this._diffsOfDocument[docUriStr][diffIdx] - - // Apply the rejection by replacing with original code - // we don't have to edit the original or final file; just do a workspace edit so the code equals the original code - const workspaceEdit = new vscode.WorkspaceEdit(); - workspaceEdit.replace(editor.document.uri, diff.range, diff.originalCode) - await vscode.workspace.applyEdit(workspaceEdit) - - // Check if diffArea should be removed - const originalFile = this._originalFileOfDocument[docUriStr] - const currentFile = await readFileContentOfUri(editor.document.uri) - const diffArea = this._diffAreasOfDocument[docUriStr][diffareaIdx] - const currentLines = currentFile.split('\n'); - const originalLines = originalFile.split('\n'); - - const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') - const originalArea = originalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - - if (originalArea === currentArea) { - const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) - this._diffAreasOfDocument[docUriStr].splice(index, 1) - } - - this.refreshStylesAndDiffs(docUriStr) - } - - async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { - - - const promptContent = `\ -ORIGINAL_FILE -\`\`\` -${oldFileStr} -\`\`\` - -DIFF -\`\`\` -${diffRepr} -\`\`\` - -INSTRUCTIONS -Please finish writing the new file by applying the diff to the original file. Return ONLY the completion of the file, without any explanation. - -` - // make LLM complete the file to include the diff - await new Promise((resolve, reject) => { - sendLLMMessage({ - logging: { loggingName: 'streamChunk' }, - messages: [ - { role: 'system', content: writeFileWithDiffInstructions, }, - // TODO include more context too - { role: 'user', content: promptContent, } - ], - onText: (newText, fullText) => { - this._updateStream(docUri.toString(), diffArea, fullText) - }, - onFinalMessage: (fullText) => { - this._updateStream(docUri.toString(), diffArea, fullText) - resolve(); - }, - onError: (e) => { - console.error('Error rewriting file with diff', e); - resolve(); - }, - voidConfig, - abortRef, - }) - }) - - } - - - // used by us only - private _updateStream = throttle(async (docUriStr: string, diffArea: DiffArea, newDiffAreaCode: string) => { - - const editor = vscode.window.activeTextEditor // TODO the editor should be that of `docUri` and not necessarily the current editor - if (!editor) { - console.log('Error: No active editor!') - return; - } - - // original code all diffs are based on in the code - const originalDiffAreaCode = (this._originalFileOfDocument[docUriStr] || '').split('\n').slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') - - // figure out where to highlight based on where the AI is in the stream right now, use the last diff in findDiffs to figure that out - const diffs = findDiffs(originalDiffAreaCode, newDiffAreaCode) - const lastDiff = diffs?.[diffs.length - 1] ?? null - - // these are two different coordinate systems - new and old line number - let newFileEndLine: number // get new[0...newStoppingPoint] with line=newStoppingPoint highlighted - let oldFileStartLine: number // get original[oldStartingPoint...] - - if (!lastDiff) { - // if the writing is identical so far, display no changes - newFileEndLine = 0 - oldFileStartLine = 0 - } - else { - if (lastDiff.type === 'insertion') { - newFileEndLine = lastDiff.range.end.line - oldFileStartLine = lastDiff.originalRange.start.line - } - else if (lastDiff.type === 'deletion') { - newFileEndLine = lastDiff.range.start.line - oldFileStartLine = lastDiff.originalRange.start.line - } - else if (lastDiff.type === 'edit') { - newFileEndLine = lastDiff.range.end.line - oldFileStartLine = lastDiff.originalRange.start.line - } - else { - throw new Error(`updateStream: diff.type not recognized: ${lastDiff.type}`) - } - } - - // display - const newFileTop = newDiffAreaCode.split('\n').slice(0, newFileEndLine + 1).join('\n') - const oldFileBottom = originalDiffAreaCode.split('\n').slice(oldFileStartLine + 1, Infinity).join('\n') - - let newCode = `${newFileTop}\n${oldFileBottom}` - diffArea.sweepIndex = newFileEndLine - // replace oldDACode with newDACode with a vscode edit - - const workspaceEdit = new vscode.WorkspaceEdit(); - - const diffareaRange = new vscode.Range(diffArea.startLine, 0, diffArea.endLine, Number.MAX_SAFE_INTEGER) - workspaceEdit.replace(editor.document.uri, diffareaRange, newCode) - await vscode.workspace.applyEdit(workspaceEdit) - }, THROTTLE_TIME) - -} +// const diff = this._diffsOfDocument[docUriStr][diffIdx] +// const originalFile = this._originalFileOfDocument[docUriStr] +// const currentFile = await readFileContentOfUri(editor.document.uri) + +// // Fixed: Handle newlines properly by splitting into lines and joining with proper newlines +// const originalLines = originalFile.split('\n'); +// const currentLines = currentFile.split('\n'); + +// // Get the changed lines from current file +// const changedLines = currentLines.slice(diff.range.start.line, diff.range.end.line + 1); + +// // Create new original file content by replacing the affected lines +// const newOriginalLines = [ +// ...originalLines.slice(0, diff.originalRange.start.line), +// ...changedLines, +// ...originalLines.slice(diff.originalRange.end.line + 1) +// ]; + +// this._originalFileOfDocument[docUriStr] = newOriginalLines.join('\n'); + +// // Update diff areas based on the change +// this.resizeDiffAreas(docUriStr, [{ +// text: changedLines.join('\n'), +// startLine: diff.originalRange.start.line, +// endLine: diff.originalRange.end.line +// }], 'originalFile') + +// // Check if diffArea should be removed + +// const diffArea = this._diffAreasOfDocument[docUriStr][diffareaIdx] + +// const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') +// const originalArea = newOriginalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') + +// if (originalArea === currentArea) { +// const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) +// this._diffAreasOfDocument[docUriStr].splice(index, 1) +// } + +// this.refreshStylesAndDiffs(docUriStr) +// } + +// // called on void.rejectDiff +// public async rejectDiff({ diffid, diffareaid }: { diffid: number, diffareaid: number }) { +// const editor = vscode.window.activeTextEditor +// if (!editor) +// return + +// const docUriStr = editor.document.uri.toString() + +// const diffIdx = this._diffsOfDocument[docUriStr].findIndex(diff => diff.diffid === diffid); +// if (diffIdx === -1) { console.error('Error: DiffID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } + +// const diffareaIdx = this._diffAreasOfDocument[docUriStr].findIndex(diff => diff.diffareaid === diffareaid); +// if (diffareaIdx === -1) { console.error('Error: DiffAreaID could not be found: ', diffid, diffareaid, this._diffsOfDocument[docUriStr], this._diffAreasOfDocument[docUriStr]); return; } + +// const diff = this._diffsOfDocument[docUriStr][diffIdx] + +// // Apply the rejection by replacing with original code +// // we don't have to edit the original or final file; just do a workspace edit so the code equals the original code +// const workspaceEdit = new vscode.WorkspaceEdit(); +// workspaceEdit.replace(editor.document.uri, diff.range, diff.originalCode) +// await vscode.workspace.applyEdit(workspaceEdit) + +// // Check if diffArea should be removed +// const originalFile = this._originalFileOfDocument[docUriStr] +// const currentFile = await readFileContentOfUri(editor.document.uri) +// const diffArea = this._diffAreasOfDocument[docUriStr][diffareaIdx] +// const currentLines = currentFile.split('\n'); +// const originalLines = originalFile.split('\n'); + +// const currentArea = currentLines.slice(diffArea.startLine, diffArea.endLine + 1).join('\n') +// const originalArea = originalLines.slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') + +// if (originalArea === currentArea) { +// const index = this._diffAreasOfDocument[docUriStr].findIndex(da => da.diffareaid === diffArea.diffareaid) +// this._diffAreasOfDocument[docUriStr].splice(index, 1) +// } + +// this.refreshStylesAndDiffs(docUriStr) +// } + +// async startStreamingInDiffArea({ docUri, oldFileStr, diffRepr, diffArea, voidConfig, abortRef }: { docUri: vscode.Uri, oldFileStr: string, diffRepr: string, voidConfig: VoidConfig, diffArea: DiffArea, abortRef: AbortRef }) { + + +// const promptContent = `\ +// ORIGINAL_FILE +// \`\`\` +// ${oldFileStr} +// \`\`\` + +// DIFF +// \`\`\` +// ${diffRepr} +// \`\`\` + +// INSTRUCTIONS +// Please finish writing the new file by applying the diff to the original file. Return ONLY the completion of the file, without any explanation. + +// ` +// // make LLM complete the file to include the diff +// await new Promise((resolve, reject) => { +// sendLLMMessage({ +// logging: { loggingName: 'streamChunk' }, +// messages: [ +// { role: 'system', content: writeFileWithDiffInstructions, }, +// // TODO include more context too +// { role: 'user', content: promptContent, } +// ], +// onText: (newText, fullText) => { +// this._updateStream(docUri.toString(), diffArea, fullText) +// }, +// onFinalMessage: (fullText) => { +// this._updateStream(docUri.toString(), diffArea, fullText) +// resolve(); +// }, +// onError: (e) => { +// console.error('Error rewriting file with diff', e); +// resolve(); +// }, +// voidConfig, +// abortRef, +// }) +// }) + +// } + + +// // used by us only +// private _updateStream = throttle(async (docUriStr: string, diffArea: DiffArea, newDiffAreaCode: string) => { + +// const editor = vscode.window.activeTextEditor // TODO the editor should be that of `docUri` and not necessarily the current editor +// if (!editor) { +// console.log('Error: No active editor!') +// return; +// } + +// // original code all diffs are based on in the code +// const originalDiffAreaCode = (this._originalFileOfDocument[docUriStr] || '').split('\n').slice(diffArea.originalStartLine, diffArea.originalEndLine + 1).join('\n') + +// // figure out where to highlight based on where the AI is in the stream right now, use the last diff in findDiffs to figure that out +// const diffs = findDiffs(originalDiffAreaCode, newDiffAreaCode) +// const lastDiff = diffs?.[diffs.length - 1] ?? null + +// // these are two different coordinate systems - new and old line number +// let newFileEndLine: number // get new[0...newStoppingPoint] with line=newStoppingPoint highlighted +// let oldFileStartLine: number // get original[oldStartingPoint...] + +// if (!lastDiff) { +// // if the writing is identical so far, display no changes +// newFileEndLine = 0 +// oldFileStartLine = 0 +// } +// else { +// if (lastDiff.type === 'insertion') { +// newFileEndLine = lastDiff.range.end.line +// oldFileStartLine = lastDiff.originalRange.start.line +// } +// else if (lastDiff.type === 'deletion') { +// newFileEndLine = lastDiff.range.start.line +// oldFileStartLine = lastDiff.originalRange.start.line +// } +// else if (lastDiff.type === 'edit') { +// newFileEndLine = lastDiff.range.end.line +// oldFileStartLine = lastDiff.originalRange.start.line +// } +// else { +// throw new Error(`updateStream: diff.type not recognized: ${lastDiff.type}`) +// } +// } + +// // display +// const newFileTop = newDiffAreaCode.split('\n').slice(0, newFileEndLine + 1).join('\n') +// const oldFileBottom = originalDiffAreaCode.split('\n').slice(oldFileStartLine + 1, Infinity).join('\n') + +// let newCode = `${newFileTop}\n${oldFileBottom}` +// diffArea.sweepIndex = newFileEndLine +// // replace oldDACode with newDACode with a vscode edit + +// const workspaceEdit = new vscode.WorkspaceEdit(); + +// const diffareaRange = new vscode.Range(diffArea.startLine, 0, diffArea.endLine, Number.MAX_SAFE_INTEGER) +// workspaceEdit.replace(editor.document.uri, diffareaRange, newCode) +// await vscode.workspace.applyEdit(workspaceEdit) +// }, THROTTLE_TIME) + +// } diff --git a/src/vs/workbench/contrib/void/browser/misc/extension.ts b/src/vs/workbench/contrib/void/browser/misc/extension.ts index fb8b46f9e..813819f67 100644 --- a/src/vs/workbench/contrib/void/browser/misc/extension.ts +++ b/src/vs/workbench/contrib/void/browser/misc/extension.ts @@ -1,184 +1,184 @@ -import * as vscode from 'vscode'; - -import { v4 as uuidv4 } from 'uuid' -import { AbortRef } from '../common/sendLLMMessage'; -import { MessageToSidebar, MessageFromSidebar, DiffArea, ChatThreads } from '../common/shared_types'; -import { getVoidConfigFromPartial } from '../webviews/common/contextForConfig'; -import { DiffProvider } from '../../DiffProvider'; -import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; -import { SidebarWebviewProvider } from '../sidebar/SidebarWebviewProvider'; -import { CtrlKWebviewProvider } from './providers/CtrlKWebviewProvider'; - -const roundRangeToLines = (selection: vscode.Selection) => { - let endLine = selection.end.character === 0 ? selection.end.line - 1 : selection.end.line // e.g. if the user triple clicks, it selects column=0, line=line -> column=0, line=line+1 - return new vscode.Range(selection.start.line, 0, endLine, Number.MAX_SAFE_INTEGER) -} - -const getSelection = (editor: vscode.TextEditor) => { - // get the range of the selection and the file the user is in - const selectionRange = roundRangeToLines(editor.selection); - const selectionStr = editor.document.getText(selectionRange).trim(); - const filePath = editor.document.uri; - return { selectionStr, filePath } -} - -export function activate(context: vscode.ExtensionContext) { - - // 1. Mount the chat sidebar - const sidebarWebviewProvider = new SidebarWebviewProvider(context); - context.subscriptions.push( - vscode.window.registerWebviewViewProvider(SidebarWebviewProvider.viewId, sidebarWebviewProvider, { webviewOptions: { retainContextWhenHidden: true } }) - ); - - // 1.5 - const ctrlKWebviewProvider = new CtrlKWebviewProvider(context) - - - // 2. ctrl+l - context.subscriptions.push( - vscode.commands.registerCommand('void.ctrl+l', () => { - const editor = vscode.window.activeTextEditor - if (!editor) return - - // show the sidebar - vscode.commands.executeCommand('workbench.view.extension.voidViewContainer'); - // vscode.commands.executeCommand('vscode.moveViewToPanel', CustomViewProvider.viewId); // move to aux bar - - const { selectionStr, filePath } = getSelection(editor) - - // send message to the webview (Sidebar.tsx) - sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+l', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); - }) - ); - - // 2.5: ctrl+k - context.subscriptions.push( - vscode.commands.registerCommand('void.ctrl+k', () => { - console.log('CTRLK PRESSED') - const editor = vscode.window.activeTextEditor - if (!editor) return - - const { selectionStr, filePath } = getSelection(editor) - - // send message to the webview (Sidebar.tsx) - // ctrlKWebviewProvider.onPressCtrlK() - // sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+k', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); - }) - ); - - // 3. Show an approve/reject codelens above each change - const diffProvider = new DiffProvider(context); - context.subscriptions.push(vscode.languages.registerCodeLensProvider('*', diffProvider)); - - // 4. Add approve/reject commands - context.subscriptions.push(vscode.commands.registerCommand('void.acceptDiff', async (params) => { - diffProvider.acceptDiff(params) - })); - context.subscriptions.push(vscode.commands.registerCommand('void.rejectDiff', async (params) => { - diffProvider.rejectDiff(params) - })); - - // 5. Receive messages from sidebar - sidebarWebviewProvider.webview.then( - webview => { - - // top navigation bar commands - context.subscriptions.push(vscode.commands.registerCommand('void.startNewThread', async () => { - webview.postMessage({ type: 'startNewThread' } satisfies MessageToSidebar) - })) - context.subscriptions.push(vscode.commands.registerCommand('void.toggleThreadSelector', async () => { - webview.postMessage({ type: 'toggleThreadSelector' } satisfies MessageToSidebar) - })) - context.subscriptions.push(vscode.commands.registerCommand('void.toggleSettings', async () => { - webview.postMessage({ type: 'toggleSettings' } satisfies MessageToSidebar) - })); - - // Receive messages in the extension from the sidebar webview (messages are sent using `postMessage`) - webview.onDidReceiveMessage(async (m: MessageFromSidebar) => { - - const abortApplyRef: AbortRef = { current: null } - - if (m.type === 'requestFiles') { - - // get contents of all file paths - const files = await Promise.all( - m.filepaths.map(async (filepath) => ({ filepath, content: await readFileContentOfUri(filepath) })) - ) - - // send contents to webview - webview.postMessage({ type: 'files', files, } satisfies MessageToSidebar) - - } - else if (m.type === 'applyChanges') { - - const editor = vscode.window.activeTextEditor - if (!editor) { - vscode.window.showInformationMessage('No active editor!') - return - } - // create an area to show diffs - const partialDiffArea: Omit = { - startLine: 0, // in ctrl+L the start and end lines are the full document - endLine: editor.document.lineCount, - originalStartLine: 0, - originalEndLine: editor.document.lineCount, - sweepIndex: null, - } - const diffArea = diffProvider.createDiffArea(editor.document.uri, partialDiffArea, await readFileContentOfUri(editor.document.uri)) - - const docUri = editor.document.uri - const fileStr = await readFileContentOfUri(docUri) - const voidConfig = getVoidConfigFromPartial(context.globalState.get('partialVoidConfig') ?? {}) - - await diffProvider.startStreamingInDiffArea({ docUri, oldFileStr: fileStr, diffRepr: m.diffRepr, voidConfig, diffArea, abortRef: abortApplyRef }) - } - else if (m.type === 'getPartialVoidConfig') { - const partialVoidConfig = context.globalState.get('partialVoidConfig') ?? {} - webview.postMessage({ type: 'partialVoidConfig', partialVoidConfig } satisfies MessageToSidebar) - } - else if (m.type === 'persistPartialVoidConfig') { - const partialVoidConfig = m.partialVoidConfig - context.globalState.update('partialVoidConfig', partialVoidConfig) - } - else if (m.type === 'getAllThreads') { - const threads: ChatThreads = context.workspaceState.get('allThreads') ?? {} - webview.postMessage({ type: 'allThreads', threads } satisfies MessageToSidebar) - } - else if (m.type === 'persistThread') { - const threads: ChatThreads = context.workspaceState.get('allThreads') ?? {} - const updatedThreads: ChatThreads = { ...threads, [m.thread.id]: m.thread } - context.workspaceState.update('allThreads', updatedThreads) - } - else if (m.type === 'getDeviceId') { - let deviceId = context.globalState.get('void_deviceid') - if (!deviceId || typeof deviceId !== 'string') { - deviceId = uuidv4() - context.globalState.update('void_deviceid', deviceId) - } - webview.postMessage({ type: 'deviceId', deviceId: deviceId as string } satisfies MessageToSidebar) - } - else { - console.error('unrecognized command', m) - } - }) - } - ) - - - - - // Gets called when user presses ctrl + k (mounts ctrl+k-style codelens) - // TODO need to build this - // const ctrlKCodeLensProvider = new CtrlKCodeLensProvider(); - // context.subscriptions.push(vscode.languages.registerCodeLensProvider('*', ctrlKCodeLensProvider)); - // context.subscriptions.push( - // vscode.commands.registerCommand('void.ctrl+k', () => { - // const editor = vscode.window.activeTextEditor; - // if (!editor) - // return - // ctrlKCodeLensProvider.addNewCodeLens(editor.document, editor.selection); - // // vscode.commands.executeCommand('editor.action.showHover'); // apparently this refreshes the codelenses by having the internals call provideCodeLenses - // }) - // ) - -} +// import * as vscode from 'vscode'; + +// import { v4 as uuidv4 } from 'uuid' +// import { AbortRef } from '../common/sendLLMMessage'; +// import { MessageToSidebar, MessageFromSidebar, DiffArea, ChatThreads } from '../common/shared_types'; +// import { getVoidConfigFromPartial } from '../webviews/common/contextForConfig'; +// import { DiffProvider } from '../../DiffProvider'; +// import { readFileContentOfUri } from './extensionLib/readFileContentOfUri'; +// import { SidebarWebviewProvider } from '../sidebar/SidebarWebviewProvider'; +// import { CtrlKWebviewProvider } from './providers/CtrlKWebviewProvider'; + +// const roundRangeToLines = (selection: vscode.Selection) => { +// let endLine = selection.end.character === 0 ? selection.end.line - 1 : selection.end.line // e.g. if the user triple clicks, it selects column=0, line=line -> column=0, line=line+1 +// return new vscode.Range(selection.start.line, 0, endLine, Number.MAX_SAFE_INTEGER) +// } + +// const getSelection = (editor: vscode.TextEditor) => { +// // get the range of the selection and the file the user is in +// const selectionRange = roundRangeToLines(editor.selection); +// const selectionStr = editor.document.getText(selectionRange).trim(); +// const filePath = editor.document.uri; +// return { selectionStr, filePath } +// } + +// export function activate(context: vscode.ExtensionContext) { + +// // 1. Mount the chat sidebar +// const sidebarWebviewProvider = new SidebarWebviewProvider(context); +// context.subscriptions.push( +// vscode.window.registerWebviewViewProvider(SidebarWebviewProvider.viewId, sidebarWebviewProvider, { webviewOptions: { retainContextWhenHidden: true } }) +// ); + +// // 1.5 +// const ctrlKWebviewProvider = new CtrlKWebviewProvider(context) + + +// // 2. ctrl+l +// context.subscriptions.push( +// vscode.commands.registerCommand('void.ctrl+l', () => { +// const editor = vscode.window.activeTextEditor +// if (!editor) return + +// // show the sidebar +// vscode.commands.executeCommand('workbench.view.extension.voidViewContainer'); +// // vscode.commands.executeCommand('vscode.moveViewToPanel', CustomViewProvider.viewId); // move to aux bar + +// const { selectionStr, filePath } = getSelection(editor) + +// // send message to the webview (Sidebar.tsx) +// sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+l', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); +// }) +// ); + +// // 2.5: ctrl+k +// context.subscriptions.push( +// vscode.commands.registerCommand('void.ctrl+k', () => { +// console.log('CTRLK PRESSED') +// const editor = vscode.window.activeTextEditor +// if (!editor) return + +// const { selectionStr, filePath } = getSelection(editor) + +// // send message to the webview (Sidebar.tsx) +// // ctrlKWebviewProvider.onPressCtrlK() +// // sidebarWebviewProvider.webview.then(webview => webview.postMessage({ type: 'ctrl+k', selection: { selectionStr, filePath } } satisfies MessageToSidebar)); +// }) +// ); + +// // 3. Show an approve/reject codelens above each change +// const diffProvider = new DiffProvider(context); +// context.subscriptions.push(vscode.languages.registerCodeLensProvider('*', diffProvider)); + +// // 4. Add approve/reject commands +// context.subscriptions.push(vscode.commands.registerCommand('void.acceptDiff', async (params) => { +// diffProvider.acceptDiff(params) +// })); +// context.subscriptions.push(vscode.commands.registerCommand('void.rejectDiff', async (params) => { +// diffProvider.rejectDiff(params) +// })); + +// // 5. Receive messages from sidebar +// sidebarWebviewProvider.webview.then( +// webview => { + +// // top navigation bar commands +// context.subscriptions.push(vscode.commands.registerCommand('void.startNewThread', async () => { +// webview.postMessage({ type: 'startNewThread' } satisfies MessageToSidebar) +// })) +// context.subscriptions.push(vscode.commands.registerCommand('void.toggleThreadSelector', async () => { +// webview.postMessage({ type: 'toggleThreadSelector' } satisfies MessageToSidebar) +// })) +// context.subscriptions.push(vscode.commands.registerCommand('void.toggleSettings', async () => { +// webview.postMessage({ type: 'toggleSettings' } satisfies MessageToSidebar) +// })); + +// // Receive messages in the extension from the sidebar webview (messages are sent using `postMessage`) +// webview.onDidReceiveMessage(async (m: MessageFromSidebar) => { + +// const abortApplyRef: AbortRef = { current: null } + +// if (m.type === 'requestFiles') { + +// // get contents of all file paths +// const files = await Promise.all( +// m.filepaths.map(async (filepath) => ({ filepath, content: await readFileContentOfUri(filepath) })) +// ) + +// // send contents to webview +// webview.postMessage({ type: 'files', files, } satisfies MessageToSidebar) + +// } +// else if (m.type === 'applyChanges') { + +// const editor = vscode.window.activeTextEditor +// if (!editor) { +// vscode.window.showInformationMessage('No active editor!') +// return +// } +// // create an area to show diffs +// const partialDiffArea: Omit = { +// startLine: 0, // in ctrl+L the start and end lines are the full document +// endLine: editor.document.lineCount, +// originalStartLine: 0, +// originalEndLine: editor.document.lineCount, +// sweepIndex: null, +// } +// const diffArea = diffProvider.createDiffArea(editor.document.uri, partialDiffArea, await readFileContentOfUri(editor.document.uri)) + +// const docUri = editor.document.uri +// const fileStr = await readFileContentOfUri(docUri) +// const voidConfig = getVoidConfigFromPartial(context.globalState.get('partialVoidConfig') ?? {}) + +// await diffProvider.startStreamingInDiffArea({ docUri, oldFileStr: fileStr, diffRepr: m.diffRepr, voidConfig, diffArea, abortRef: abortApplyRef }) +// } +// else if (m.type === 'getPartialVoidConfig') { +// const partialVoidConfig = context.globalState.get('partialVoidConfig') ?? {} +// webview.postMessage({ type: 'partialVoidConfig', partialVoidConfig } satisfies MessageToSidebar) +// } +// else if (m.type === 'persistPartialVoidConfig') { +// const partialVoidConfig = m.partialVoidConfig +// context.globalState.update('partialVoidConfig', partialVoidConfig) +// } +// else if (m.type === 'getAllThreads') { +// const threads: ChatThreads = context.workspaceState.get('allThreads') ?? {} +// webview.postMessage({ type: 'allThreads', threads } satisfies MessageToSidebar) +// } +// else if (m.type === 'persistThread') { +// const threads: ChatThreads = context.workspaceState.get('allThreads') ?? {} +// const updatedThreads: ChatThreads = { ...threads, [m.thread.id]: m.thread } +// context.workspaceState.update('allThreads', updatedThreads) +// } +// else if (m.type === 'getDeviceId') { +// let deviceId = context.globalState.get('void_deviceid') +// if (!deviceId || typeof deviceId !== 'string') { +// deviceId = uuidv4() +// context.globalState.update('void_deviceid', deviceId) +// } +// webview.postMessage({ type: 'deviceId', deviceId: deviceId as string } satisfies MessageToSidebar) +// } +// else { +// console.error('unrecognized command', m) +// } +// }) +// } +// ) + + + + +// // Gets called when user presses ctrl + k (mounts ctrl+k-style codelens) +// // TODO need to build this +// // const ctrlKCodeLensProvider = new CtrlKCodeLensProvider(); +// // context.subscriptions.push(vscode.languages.registerCodeLensProvider('*', ctrlKCodeLensProvider)); +// // context.subscriptions.push( +// // vscode.commands.registerCommand('void.ctrl+k', () => { +// // const editor = vscode.window.activeTextEditor; +// // if (!editor) +// // return +// // ctrlKCodeLensProvider.addNewCodeLens(editor.document, editor.selection); +// // // vscode.commands.executeCommand('editor.action.showHover'); // apparently this refreshes the codelenses by having the internals call provideCodeLenses +// // }) +// // ) + +// } diff --git a/src/vs/workbench/contrib/void/browser/misc/sendLLMMessage.ts b/src/vs/workbench/contrib/void/browser/misc/sendLLMMessage.ts new file mode 100644 index 000000000..080e4c67a --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/misc/sendLLMMessage.ts @@ -0,0 +1,395 @@ +// import Anthropic from '@anthropic-ai/sdk'; +// import OpenAI from 'openai'; +// import { Ollama } from 'ollama/browser' +// import { Content, GoogleGenerativeAI, GoogleGenerativeAIError, GoogleGenerativeAIFetchError } from '@google/generative-ai'; +// // import { VoidConfig } from '../webviews/common/contextForConfig' +// // import { captureEvent } from '../webviews/common/posthog'; +// // import { ChatMessage } from './shared_types'; + +// type VoidConfig = any + +// export type AbortRef = { current: (() => void) | null } + +// export type OnText = (newText: string, fullText: string) => void + +// export type OnFinalMessage = (input: string) => void + +// export type LLMMessageAnthropic = { +// role: 'user' | 'assistant'; +// content: string; +// } + +// export type LLMMessage = { +// role: 'system' | 'user' | 'assistant'; +// content: string; +// } + +// type SendLLMMessageFnTypeInternal = (params: { +// messages: LLMMessage[]; +// onText: OnText; +// onFinalMessage: OnFinalMessage; +// onError: (error: string) => void; +// voidConfig: VoidConfig; + +// _setAborter: (aborter: () => void) => void; +// }) => void + +// type SendLLMMessageFnTypeExternal = (params: { +// messages: LLMMessage[]; +// onText: OnText; +// onFinalMessage: (fullText: string) => void; +// onError: (error: string) => void; +// voidConfig: VoidConfig | null; +// abortRef: AbortRef; + +// logging: { +// loggingName: string, +// }; +// }) => void + +// const parseMaxTokensStr = (maxTokensStr: string) => { +// // parse the string but only if the full string is a valid number, eg parseInt('100abc') should return NaN +// const int = isNaN(Number(maxTokensStr)) ? undefined : parseInt(maxTokensStr) +// if (Number.isNaN(int)) +// return undefined +// return int +// } + +// // Anthropic +// const sendAnthropicMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { + +// const anthropic = new Anthropic({ apiKey: voidConfig.anthropic.apikey, dangerouslyAllowBrowser: true }); // defaults to process.env["ANTHROPIC_API_KEY"] + +// // find system messages and concatenate them +// const systemMessage = messages +// .filter(msg => msg.role === 'system') +// .map(msg => msg.content) +// .join('\n'); + +// // remove system messages for Anthropic +// const anthropicMessages = messages.filter(msg => msg.role !== 'system') as LLMMessageAnthropic[] + +// const stream = anthropic.messages.stream({ +// system: systemMessage, +// messages: anthropicMessages, +// model: voidConfig.anthropic.model, +// max_tokens: parseMaxTokensStr(voidConfig.default.maxTokens)!, // this might be undefined, but it will just throw an error for the user +// }); + + +// // when receive text +// stream.on('text', (newText, fullText) => { +// onText(newText, fullText) +// }) + +// // when we get the final message on this stream (or when error/fail) +// stream.on('finalMessage', (claude_response) => { +// // stringify the response's content +// const content = claude_response.content.map(c => c.type === 'text' ? c.text : c.type).join('\n'); +// onFinalMessage(content) +// }) + +// stream.on('error', (error) => { +// // the most common error will be invalid API key (401), so we handle this with a nice message +// if (error instanceof Anthropic.APIError && error.status === 401) { +// onError('Invalid API key.') +// } +// else { +// onError(error.message) +// } +// }) + +// // TODO need to test this to make sure it works, it might throw an error +// _setAborter(() => stream.controller.abort()) + +// }; + +// // Gemini +// const sendGeminiMsg: SendLLMMessageFnTypeInternal = async ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { + +// let fullText = '' + +// const genAI = new GoogleGenerativeAI(voidConfig.gemini.apikey); +// const model = genAI.getGenerativeModel({ model: voidConfig.gemini.model }); + +// // remove system messages that get sent to Gemini +// // str of all system messages +// const systemMessage = messages +// .filter(msg => msg.role === 'system') +// .map(msg => msg.content) +// .join('\n'); + +// // Convert messages to Gemini format +// const geminiMessages: Content[] = messages +// .filter(msg => msg.role !== 'system') +// .map((msg, i) => ({ +// parts: [{ text: msg.content }], +// role: msg.role === 'assistant' ? 'model' : 'user' +// })) + +// model.generateContentStream({ contents: geminiMessages, systemInstruction: systemMessage, }) +// .then(async response => { +// _setAborter(() => response.stream.return(fullText)) + +// for await (const chunk of response.stream) { +// const newText = chunk.text(); +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); +// }) +// .catch((error) => { +// if (error instanceof GoogleGenerativeAIFetchError) { +// if (error.status === 400) { +// onError('Invalid API key.'); +// } +// else { +// onError(`${error.name}:\n${error.message}`); +// } +// } +// else { +// onError(error); +// } +// }) +// } + +// // OpenAI, OpenRouter, OpenAICompatible +// const sendOpenAIMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { + +// let fullText = '' + +// let openai: OpenAI +// let options: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming + +// const maxTokens = parseMaxTokensStr(voidConfig.default.maxTokens) + +// if (voidConfig.default.whichApi === 'openAI') { +// openai = new OpenAI({ apiKey: voidConfig.openAI.apikey, dangerouslyAllowBrowser: true }); +// options = { model: voidConfig.openAI.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else if (voidConfig.default.whichApi === 'openRouter') { +// openai = new OpenAI({ +// baseURL: 'https://openrouter.ai/api/v1', apiKey: voidConfig.openRouter.apikey, dangerouslyAllowBrowser: true, +// defaultHeaders: { +// 'HTTP-Referer': 'https://voideditor.com', // Optional, for including your app on openrouter.ai rankings. +// 'X-Title': 'Void Editor', // Optional. Shows in rankings on openrouter.ai. +// }, +// }); +// options = { model: voidConfig.openRouter.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else if (voidConfig.default.whichApi === 'openAICompatible') { +// openai = new OpenAI({ baseURL: voidConfig.openAICompatible.endpoint, apiKey: voidConfig.openAICompatible.apikey, dangerouslyAllowBrowser: true }) +// options = { model: voidConfig.openAICompatible.model, messages: messages, stream: true, max_completion_tokens: maxTokens } +// } +// else { +// console.error(`sendOpenAIMsg: invalid whichApi: ${voidConfig.default.whichApi}`) +// throw new Error(`voidConfig.whichAPI was invalid: ${voidConfig.default.whichApi}`) +// } + +// openai.chat.completions +// .create(options) +// .then(async response => { +// _setAborter(() => response.controller.abort()) +// // when receive text +// for await (const chunk of response) { +// const newText = chunk.choices[0]?.delta?.content || ''; +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); +// }) +// // when error/fail - this catches errors of both .create() and .then(for await) +// .catch(error => { +// if (error instanceof OpenAI.APIError) { +// if (error.status === 401) { +// onError('Invalid API key.'); +// } +// else { +// onError(`${error.name}:\n${error.message}`); +// } +// } +// else { +// onError(error); +// } +// }) + +// }; + +// // Ollama +// export const sendOllamaMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { + +// let fullText = '' + +// const ollama = new Ollama({ host: voidConfig.ollama.endpoint }) + +// ollama.chat({ +// model: voidConfig.ollama.model, +// messages: messages, +// stream: true, +// options: { num_predict: parseMaxTokensStr(voidConfig.default.maxTokens) } // this is max_tokens +// }) +// .then(async stream => { +// _setAborter(() => stream.abort()) +// // iterate through the stream +// for await (const chunk of stream) { +// const newText = chunk.message.content; +// fullText += newText; +// onText(newText, fullText); +// } +// onFinalMessage(fullText); + +// }) +// // when error/fail +// .catch(error => { +// onError(error) +// }) + +// }; + +// // Greptile +// // https://docs.greptile.com/api-reference/query +// // https://docs.greptile.com/quickstart#sample-response-streamed + +// const sendGreptileMsg: SendLLMMessageFnTypeInternal = ({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter }) => { + +// let fullText = '' + +// fetch('https://api.greptile.com/v2/query', { +// method: 'POST', +// headers: { +// 'Authorization': `Bearer ${voidConfig.greptile.apikey}`, +// 'X-Github-Token': `${voidConfig.greptile.githubPAT}`, +// 'Content-Type': `application/json`, +// }, +// body: JSON.stringify({ +// messages, +// stream: true, +// repositories: [voidConfig.greptile.repoinfo], +// }), +// }) +// // this is {message}\n{message}\n{message}...\n +// .then(async response => { +// const text = await response.text() +// console.log('got greptile', text) +// return JSON.parse(`[${text.trim().split('\n').join(',')}]`) +// }) +// // TODO make this actually stream, right now it just sends one message at the end +// // TODO add _setAborter() when add streaming +// .then(async responseArr => { + +// for (const response of responseArr) { +// const type: string = response['type'] +// const message = response['message'] + +// // when receive text +// if (type === 'message') { +// fullText += message +// onText(message, fullText) +// } +// else if (type === 'sources') { +// const { filepath, linestart: _, lineend: _2 } = message as { filepath: string; linestart: number | null; lineend: number | null } +// fullText += filepath +// onText(filepath, fullText) +// } +// // type: 'status' with an empty 'message' means last message +// else if (type === 'status') { +// if (!message) { +// onFinalMessage(fullText) +// } +// } +// } + +// }) +// .catch(e => { +// onError(e) +// }); + +// } + + + + + +// export const sendLLMMessage: SendLLMMessageFnTypeExternal = ({ +// messages, +// onText: onText_, +// onFinalMessage: onFinalMessage_, +// onError: onError_, +// abortRef: abortRef_, +// voidConfig, +// logging: { loggingName } +// }) => { +// if (!voidConfig) return; + +// // trim message content (Anthropic and other providers give an error if there is trailing whitespace) +// messages = messages.map(m => ({ ...m, content: m.content.trim() })) + +// // only captures number of messages and message "shape", no actual code, instructions, prompts, etc +// const captureChatEvent = (eventId: string, extras?: object) => { +// // captureEvent(eventId, { +// // whichApi: voidConfig.default['whichApi'], +// // numMessages: messages?.length, +// // messagesShape: messages?.map(msg => ({ role: msg.role, length: msg.content.length })), +// // version: '2024-11-02', +// // ...extras, +// // }) +// } +// const submit_time = new Date() + +// let _fullTextSoFar = '' +// let _aborter: (() => void) | null = null +// let _setAborter = (fn: () => void) => { _aborter = fn } +// let _didAbort = false + +// const onText = (newText: string, fullText: string) => { +// if (_didAbort) return +// onText_(newText, fullText) +// _fullTextSoFar = fullText +// } + +// const onFinalMessage = (fullText: string) => { +// if (_didAbort) return +// captureChatEvent(`${loggingName} - Received Full Message`, { messageLength: fullText.length, duration: new Date().getMilliseconds() - submit_time.getMilliseconds() }) +// onFinalMessage_(fullText) +// } + +// const onError = (error: string) => { +// if (_didAbort) return +// captureChatEvent(`${loggingName} - Error`, { error }) +// onError_(error) +// } + +// const onAbort = () => { +// captureChatEvent(`${loggingName} - Abort`, { messageLengthSoFar: _fullTextSoFar.length }) +// _aborter?.() +// _didAbort = true +// } +// abortRef_.current = onAbort + +// captureChatEvent(`${loggingName} - Sending Message`, { messageLength: messages[messages.length - 1]?.content.length }) + +// switch (voidConfig.default.whichApi) { +// case 'anthropic': +// sendAnthropicMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); +// break; +// case 'openAI': +// case 'openRouter': +// case 'openAICompatible': +// sendOpenAIMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); +// break; +// case 'gemini': +// sendGeminiMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); +// break; +// case 'ollama': +// sendOllamaMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); +// break; +// case 'greptile': +// sendGreptileMsg({ messages, onText, onFinalMessage, onError, voidConfig, _setAborter, }); +// break; +// default: +// onError(`Error: whichApi was ${voidConfig.default.whichApi}, which is not recognized!`) +// break; +// } + + +// } diff --git a/src/vs/workbench/contrib/void/browser/react/README.js b/src/vs/workbench/contrib/void/browser/react/README.js new file mode 100644 index 000000000..9c629e448 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/react/README.js @@ -0,0 +1,4 @@ +// tsup to build all react + +// build tailwind -> styles.css + diff --git a/src/vs/workbench/contrib/void/browser/react/out/Sidebar.js b/src/vs/workbench/contrib/void/browser/react/out/Sidebar.js new file mode 100644 index 000000000..36b5b2849 --- /dev/null +++ b/src/vs/workbench/contrib/void/browser/react/out/Sidebar.js @@ -0,0 +1,23615 @@ +import { VIEWPANE_FILTER_ACTION } from '../../../../../browser/parts/views/viewPane'; + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// ../../../../../../../node_modules/react/cjs/react.development.js +var require_react_development = __commonJS({ + "../../../../../../../node_modules/react/cjs/react.development.js"(exports, module) { + { + (function() { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var ReactVersion = "18.3.1"; + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactCurrentBatchConfig = { + transition: null + }; + var ReactCurrentActQueue = { + current: null, + // Used to reproduce behavior of `batchedUpdates` in legacy mode. + isBatchingLegacy: false, + didScheduleLegacyUpdate: false + }; + var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactDebugCurrentFrame = {}; + var currentExtraStackFrame = null; + function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } + } + { + ReactDebugCurrentFrame.setExtraStackFrame = function(stack) { + { + currentExtraStackFrame = stack; + } + }; + ReactDebugCurrentFrame.getCurrentStack = null; + ReactDebugCurrentFrame.getStackAddendum = function() { + var stack = ""; + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } + var impl = ReactDebugCurrentFrame.getCurrentStack; + if (impl) { + stack += impl() || ""; + } + return stack; + }; + } + var enableScopeAPI = false; + var enableCacheElement = false; + var enableTransitionTracing = false; + var enableLegacyHidden = false; + var enableDebugTracing = false; + var ReactSharedInternals = { + ReactCurrentDispatcher, + ReactCurrentBatchConfig, + ReactCurrentOwner + }; + { + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; + ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; + } + function warn(format) { + { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var didWarnStateUpdateForUnmountedComponent = {}; + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass"; + var warningKey = componentName + "." + callerName; + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName); + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } + } + var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function(publicInstance) { + return false; + }, + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function(publicInstance, callback, callerName) { + warnNoop(publicInstance, "forceUpdate"); + }, + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function(publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, "replaceState"); + }, + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function(publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, "setState"); + } + }; + var assign = Object.assign; + var emptyObject = {}; + { + Object.freeze(emptyObject); + } + function Component(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + Component.prototype.isReactComponent = {}; + Component.prototype.setState = function(partialState, callback) { + if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null) { + throw new Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); + } + this.updater.enqueueSetState(this, partialState, callback, "setState"); + }; + Component.prototype.forceUpdate = function(callback) { + this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); + }; + { + var deprecatedAPIs = { + isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."], + replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."] + }; + var defineDeprecationWarning = function(methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function() { + warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]); + return void 0; + } + }); + }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + function ComponentDummy() { + } + ComponentDummy.prototype = Component.prototype; + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); + pureComponentPrototype.constructor = PureComponent; + assign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; + function createRef() { + var refObject = { + current: null + }; + { + Object.seal(refObject); + } + return refObject; + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, "ref")) { + var getter = Object.getOwnPropertyDescriptor(config, "ref").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.ref !== void 0; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.key !== void 0; + } + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function() { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true + }); + } + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function() { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, "ref", { + get: warnAboutAccessingRef, + configurable: true + }); + } + function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + var ReactElement = function(type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type, + key, + ref, + props, + // Record the component responsible for creating this element. + _owner: owner + }; + { + element._store = {}; + Object.defineProperty(element._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + Object.defineProperty(element, "_self", { + configurable: false, + enumerable: false, + writable: false, + value: self + }); + Object.defineProperty(element, "_source", { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + return element; + }; + function createElement(type, config, children) { + var propName; + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + self = config.__self === void 0 ? null : config.__self; + source = config.__source === void 0 ? null : config.__source; + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + props.children = childArray; + } + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } + { + if (key || ref) { + var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; + } + function cloneElement(element, config, children) { + if (element === null || element === void 0) { + throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); + } + var propName; + var props = assign({}, element.props); + var key = element.key; + var ref = element.ref; + var self = element._self; + var source = element._source; + var owner = element._owner; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + var defaultProps; + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === void 0 && defaultProps !== void 0) { + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + return ReactElement(element.type, key, ref, self, source, owner, props); + } + function isValidElement(object) { + return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + var SEPARATOR = "."; + var SUBSEPARATOR = ":"; + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + "=": "=0", + ":": "=2" + }; + var escapedString = key.replace(escapeRegex, function(match) { + return escaperLookup[match]; + }); + return "$" + escapedString; + } + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; + function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, "$&/"); + } + function getElementKey(element, index) { + if (typeof element === "object" && element !== null && element.key != null) { + { + checkKeyStringCoercion(element.key); + } + return escape("" + element.key); + } + return index.toString(36); + } + function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + if (type === "undefined" || type === "boolean") { + children = null; + } + var invokeCallback = false; + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case "string": + case "number": + invokeCallback = true; + break; + case "object": + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + } + } + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); + var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + if (isArray(mappedChild)) { + var escapedChildKey = ""; + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + "/"; + } + mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { + checkKeyStringCoercion(mappedChild.key); + } + } + mappedChild = cloneAndReplaceKey( + mappedChild, + // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? ( + // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + // eslint-disable-next-line react-internal/safe-string-coercion + escapeUserProvidedKey("" + mappedChild.key) + "/" + ) : "") + childKey + ); + } + array.push(mappedChild); + } + return 1; + } + var child; + var nextName; + var subtreeCount = 0; + var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + if (typeof iteratorFn === "function") { + var iterableChildren = children; + { + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."); + } + didWarnAboutMaps = true; + } + } + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === "object") { + var childrenString = String(children); + throw new Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead."); + } + } + return subtreeCount; + } + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + var count = 0; + mapIntoArray(children, result, "", "", function(child) { + return func.call(context, child, count++); + }); + return result; + } + function countChildren(children) { + var n = 0; + mapChildren(children, function() { + n++; + }); + return n; + } + function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function() { + forEachFunc.apply(this, arguments); + }, forEachContext); + } + function toArray(children) { + return mapChildren(children, function(child) { + return child; + }) || []; + } + function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error("React.Children.only expected to receive a single React element child."); + } + return children; + } + function createContext(defaultValue) { + var context = { + $$typeof: REACT_CONTEXT_TYPE, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null, + // Add these to use same hidden class in VM as ServerContext + _defaultValue: null, + _globalName: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + { + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context + }; + Object.defineProperties(Consumer, { + Provider: { + get: function() { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Provider; + }, + set: function(_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function() { + return context._currentValue; + }, + set: function(_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function() { + return context._currentValue2; + }, + set: function(_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function() { + return context._threadCount; + }, + set: function(_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function() { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Consumer; + } + }, + displayName: { + get: function() { + return context.displayName; + }, + set: function(displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", displayName); + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); + context.Consumer = Consumer; + } + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + return context; + } + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); + thenable.then(function(moduleObject2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject2; + } + }, function(error2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var rejected = payload; + rejected._status = Rejected; + rejected._result = error2; + } + }); + if (payload._status === Uninitialized) { + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + if (payload._status === Resolved) { + var moduleObject = payload._result; + { + if (moduleObject === void 0) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", moduleObject); + } + } + { + if (!("default" in moduleObject)) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); + } + } + return moduleObject.default; + } else { + throw payload._result; + } + } + function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: Uninitialized, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + { + var defaultProps; + var propTypes; + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function() { + return defaultProps; + }, + set: function(newDefaultProps) { + error("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + defaultProps = newDefaultProps; + Object.defineProperty(lazyType, "defaultProps", { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function() { + return propTypes; + }, + set: function(newPropTypes) { + error("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + propTypes = newPropTypes; + Object.defineProperty(lazyType, "propTypes", { + enumerable: true + }); + } + } + }); + } + return lazyType; + } + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."); + } else if (typeof render !== "function") { + error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined."); + } + } + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"); + } + } + } + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!render.name && !render.displayName) { + render.displayName = name; + } + } + }); + } + return elementType; + } + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); + } + function isValidElementType(type) { + if (typeof type === "string" || typeof type === "function") { + return true; + } + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { + return true; + } + if (typeof type === "object" && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) { + return true; + } + } + return false; + } + function memo(type, compare) { + { + if (!isValidElementType(type)) { + error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type); + } + } + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type, + compare: compare === void 0 ? null : compare + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!type.name && !type.displayName) { + type.displayName = name; + } + } + }); + } + return elementType; + } + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + { + if (dispatcher === null) { + error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."); + } + } + return dispatcher; + } + function useContext(Context) { + var dispatcher = resolveDispatcher(); + { + if (Context._context !== void 0) { + var realContext = Context._context; + if (realContext.Consumer === Context) { + error("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"); + } else if (realContext.Provider === Context) { + error("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?"); + } + } + } + return dispatcher.useContext(Context); + } + function useState2(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); + } + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); + } + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); + } + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } + } + function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); + } + function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); + } + function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); + } + function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); + } + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component2) { + var prototype = Component2.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); + } + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType(ReactCurrentOwner.current.type); + if (name) { + return "\n\nCheck the render method of `" + name + "`."; + } + } + return ""; + } + function getSourceInfoErrorAddendum(source) { + if (source !== void 0) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ""); + var lineNumber = source.lineNumber; + return "\n\nCheck your code at " + fileName + ":" + lineNumber + "."; + } + return ""; + } + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== void 0) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + return ""; + } + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + return info; + } + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + var childOwner = ""; + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + { + setCurrentlyValidatingElement$1(element); + error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + setCurrentlyValidatingElement$1(null); + } + } + function validateChildKeys(node, parentType) { + if (typeof node !== "object") { + return; + } + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === "function") { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + function validatePropTypes(element) { + { + var type = element.type; + if (type === null || type === void 0 || typeof type === "string") { + return; + } + var propTypes; + if (typeof type === "function") { + propTypes = type.propTypes; + } else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, "prop", name, element); + } else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; + var _name = getComponentNameFromType(type); + error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown"); + } + if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) { + error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead."); + } + } + } + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== "children" && key !== "key") { + setCurrentlyValidatingElement$1(fragment); + error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error("Invalid attribute `ref` supplied to `React.Fragment`."); + setCurrentlyValidatingElement$1(null); + } + } + } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); + if (!validType) { + var info = ""; + if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { + info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = "null"; + } else if (isArray(type)) { + typeString = "array"; + } else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"; + info = " Did you accidentally export a JSX literal instead of a component?"; + } else { + typeString = typeof type; + } + { + error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info); + } + } + var element = createElement.apply(this, arguments); + if (element == null) { + return element; + } + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + warn("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead."); + } + Object.defineProperty(validatedFactory, "type", { + enumerable: false, + get: function() { + warn("Factory.type is deprecated. Access the class directly before passing it to createFactory."); + Object.defineProperty(this, "type", { + value: type + }); + return type; + } + }); + } + return validatedFactory; + } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + { + ReactCurrentBatchConfig.transition._updatedFibers = /* @__PURE__ */ new Set(); + } + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + if (updatedFibersCount > 10) { + warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."); + } + currentTransition._updatedFibers.clear(); + } + } + } + } + var didWarnAboutMessageChannel = false; + var enqueueTaskImpl = null; + function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + var requireString = ("require" + Math.random()).slice(0, 7); + var nodeRequire = module && module[requireString]; + enqueueTaskImpl = nodeRequire.call(module, "timers").setImmediate; + } catch (_err) { + enqueueTaskImpl = function(callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + if (typeof MessageChannel === "undefined") { + error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."); + } + } + } + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(void 0); + }; + } + } + return enqueueTaskImpl(task); + } + var actScopeDepth = 0; + var didWarnNoAwaitAct = false; + function act(callback) { + { + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + } + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + try { + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); + if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error2) { + popActScope(prevActScopeDepth); + throw error2; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + if (result !== null && typeof result === "object" && typeof result.then === "function") { + var thenableResult = result; + var wasAwaited = false; + var thenable = { + then: function(resolve, reject) { + wasAwaited = true; + thenableResult.then(function(returnValue2) { + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + recursivelyFlushAsyncActWork(returnValue2, resolve, reject); + } else { + resolve(returnValue2); + } + }, function(error2) { + popActScope(prevActScopeDepth); + reject(error2); + }); + } + }; + { + if (!didWarnNoAwaitAct && typeof Promise !== "undefined") { + Promise.resolve().then(function() { + }).then(function() { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"); + } + }); + } + } + return thenable; + } else { + var returnValue = result; + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + var _queue = ReactCurrentActQueue.current; + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } + var _thenable = { + then: function(resolve, reject) { + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + } + }; + return _thenable; + } else { + var _thenable2 = { + then: function(resolve, reject) { + resolve(returnValue); + } + }; + return _thenable2; + } + } + } + } + function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "); + } + actScopeDepth = prevActScopeDepth; + } + } + function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function() { + if (queue.length === 0) { + ReactCurrentActQueue.current = null; + resolve(returnValue); + } else { + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } + }); + } catch (error2) { + reject(error2); + } + } else { + resolve(returnValue); + } + } + } + var isFlushing = false; + function flushActQueue(queue) { + { + if (!isFlushing) { + isFlushing = true; + var i = 0; + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + callback = callback(true); + } while (callback !== null); + } + queue.length = 0; + } catch (error2) { + queue = queue.slice(i + 1); + throw error2; + } finally { + isFlushing = false; + } + } + } + } + var createElement$1 = createElementWithValidation; + var cloneElement$1 = cloneElementWithValidation; + var createFactory = createFactoryWithValidation; + var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray, + only: onlyChild + }; + exports.Children = Children; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; + exports.act = act; + exports.cloneElement = cloneElement$1; + exports.createContext = createContext; + exports.createElement = createElement$1; + exports.createFactory = createFactory; + exports.createRef = createRef; + exports.forwardRef = forwardRef; + exports.isValidElement = isValidElement; + exports.lazy = lazy; + exports.memo = memo; + exports.startTransition = startTransition; + exports.unstable_act = act; + exports.useCallback = useCallback; + exports.useContext = useContext; + exports.useDebugValue = useDebugValue; + exports.useDeferredValue = useDeferredValue; + exports.useEffect = useEffect; + exports.useId = useId; + exports.useImperativeHandle = useImperativeHandle; + exports.useInsertionEffect = useInsertionEffect; + exports.useLayoutEffect = useLayoutEffect; + exports.useMemo = useMemo; + exports.useReducer = useReducer; + exports.useRef = useRef; + exports.useState = useState2; + exports.useSyncExternalStore = useSyncExternalStore; + exports.useTransition = useTransition; + exports.version = ReactVersion; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// ../../../../../../../node_modules/react/index.js +var require_react = __commonJS({ + "../../../../../../../node_modules/react/index.js"(exports, module) { + { + module.exports = require_react_development(); + } + } +}); + +// ../../../../../../../node_modules/scheduler/cjs/scheduler.development.js +var require_scheduler_development = __commonJS({ + "../../../../../../../node_modules/scheduler/cjs/scheduler.development.js"(exports) { + { + (function() { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var enableSchedulerDebugging = false; + var enableProfiling = false; + var frameYieldMs = 5; + function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); + } + function peek(heap) { + return heap.length === 0 ? null : heap[0]; + } + function pop(heap) { + if (heap.length === 0) { + return null; + } + var first = heap[0]; + var last = heap.pop(); + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } + return first; + } + function siftUp(heap, node, i) { + var index = i; + while (index > 0) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + if (compare(parent, node) > 0) { + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + return; + } + } + } + function siftDown(heap, node, i) { + var index = i; + var length = heap.length; + var halfLength = length >>> 1; + while (index < halfLength) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; + if (compare(left, node) < 0) { + if (rightIndex < length && compare(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (rightIndex < length && compare(right, node) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + return; + } + } + } + function compare(a, b) { + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; + } + var ImmediatePriority = 1; + var UserBlockingPriority = 2; + var NormalPriority = 3; + var LowPriority = 4; + var IdlePriority = 5; + function markTaskErrored(task, ms) { + } + var hasPerformanceNow = typeof performance === "object" && typeof performance.now === "function"; + if (hasPerformanceNow) { + var localPerformance = performance; + exports.unstable_now = function() { + return localPerformance.now(); + }; + } else { + var localDate = Date; + var initialTime = localDate.now(); + exports.unstable_now = function() { + return localDate.now() - initialTime; + }; + } + var maxSigned31BitInt = 1073741823; + var IMMEDIATE_PRIORITY_TIMEOUT = -1; + var USER_BLOCKING_PRIORITY_TIMEOUT = 250; + var NORMAL_PRIORITY_TIMEOUT = 5e3; + var LOW_PRIORITY_TIMEOUT = 1e4; + var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt; + var taskQueue = []; + var timerQueue = []; + var taskIdCounter = 1; + var currentTask = null; + var currentPriorityLevel = NormalPriority; + var isPerformingWork = false; + var isHostCallbackScheduled = false; + var isHostTimeoutScheduled = false; + var localSetTimeout = typeof setTimeout === "function" ? setTimeout : null; + var localClearTimeout = typeof clearTimeout === "function" ? clearTimeout : null; + var localSetImmediate = typeof setImmediate !== "undefined" ? setImmediate : null; + typeof navigator !== "undefined" && navigator.scheduling !== void 0 && navigator.scheduling.isInputPending !== void 0 ? navigator.scheduling.isInputPending.bind(navigator.scheduling) : null; + function advanceTimers(currentTime) { + var timer = peek(timerQueue); + while (timer !== null) { + if (timer.callback === null) { + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); + } else { + return; + } + timer = peek(timerQueue); + } + } + function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } + } + function flushWork(hasTimeRemaining, initialTime2) { + isHostCallbackScheduled = false; + if (isHostTimeoutScheduled) { + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + try { + var currentTime; if (enableProfiling) ; else { + return workLoop(hasTimeRemaining, initialTime2); + } + } finally { + currentTask = null; + currentPriorityLevel = previousPriorityLevel; + isPerformingWork = false; + } + } + function workLoop(hasTimeRemaining, initialTime2) { + var currentTime = initialTime2; + advanceTimers(currentTime); + currentTask = peek(taskQueue); + while (currentTask !== null && !enableSchedulerDebugging) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) { + break; + } + var callback = currentTask.callback; + if (typeof callback === "function") { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = exports.unstable_now(); + if (typeof continuationCallback === "function") { + currentTask.callback = continuationCallback; + } else { + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } + advanceTimers(currentTime); + } else { + pop(taskQueue); + } + currentTask = peek(taskQueue); + } + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + return false; + } + } + function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; + default: + priorityLevel = NormalPriority; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_next(eventHandler) { + var priorityLevel; + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + priorityLevel = NormalPriority; + break; + default: + priorityLevel = currentPriorityLevel; + break; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function() { + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + } + function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = exports.unstable_now(); + var startTime2; + if (typeof options === "object" && options !== null) { + var delay = options.delay; + if (typeof delay === "number" && delay > 0) { + startTime2 = currentTime + delay; + } else { + startTime2 = currentTime; + } + } else { + startTime2 = currentTime; + } + var timeout; + switch (priorityLevel) { + case ImmediatePriority: + timeout = IMMEDIATE_PRIORITY_TIMEOUT; + break; + case UserBlockingPriority: + timeout = USER_BLOCKING_PRIORITY_TIMEOUT; + break; + case IdlePriority: + timeout = IDLE_PRIORITY_TIMEOUT; + break; + case LowPriority: + timeout = LOW_PRIORITY_TIMEOUT; + break; + case NormalPriority: + default: + timeout = NORMAL_PRIORITY_TIMEOUT; + break; + } + var expirationTime = startTime2 + timeout; + var newTask = { + id: taskIdCounter++, + callback, + priorityLevel, + startTime: startTime2, + expirationTime, + sortIndex: -1 + }; + if (startTime2 > currentTime) { + newTask.sortIndex = startTime2; + push(timerQueue, newTask); + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + if (isHostTimeoutScheduled) { + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } + requestHostTimeout(handleTimeout, startTime2 - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + return newTask; + } + function unstable_pauseExecution() { + } + function unstable_continueExecution() { + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + function unstable_getFirstCallbackNode() { + return peek(taskQueue); + } + function unstable_cancelCallback(task) { + task.callback = null; + } + function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; + } + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; + var frameInterval = frameYieldMs; + var startTime = -1; + function shouldYieldToHost() { + var timeElapsed = exports.unstable_now() - startTime; + if (timeElapsed < frameInterval) { + return false; + } + return true; + } + function requestPaint() { + } + function forceFrameRate(fps) { + if (fps < 0 || fps > 125) { + console["error"]("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"); + return; + } + if (fps > 0) { + frameInterval = Math.floor(1e3 / fps); + } else { + frameInterval = frameYieldMs; + } + } + var performWorkUntilDeadline = function() { + if (scheduledHostCallback !== null) { + var currentTime = exports.unstable_now(); + startTime = currentTime; + var hasTimeRemaining = true; + var hasMoreWork = true; + try { + hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + } finally { + if (hasMoreWork) { + schedulePerformWorkUntilDeadline(); + } else { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } + } + } else { + isMessageLoopRunning = false; + } + }; + var schedulePerformWorkUntilDeadline; + if (typeof localSetImmediate === "function") { + schedulePerformWorkUntilDeadline = function() { + localSetImmediate(performWorkUntilDeadline); + }; + } else if (typeof MessageChannel !== "undefined") { + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + schedulePerformWorkUntilDeadline = function() { + port.postMessage(null); + }; + } else { + schedulePerformWorkUntilDeadline = function() { + localSetTimeout(performWorkUntilDeadline, 0); + }; + } + function requestHostCallback(callback) { + scheduledHostCallback = callback; + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + schedulePerformWorkUntilDeadline(); + } + } + function requestHostTimeout(callback, ms) { + taskTimeoutID = localSetTimeout(function() { + callback(exports.unstable_now()); + }, ms); + } + function cancelHostTimeout() { + localClearTimeout(taskTimeoutID); + taskTimeoutID = -1; + } + var unstable_requestPaint = requestPaint; + var unstable_Profiling = null; + exports.unstable_IdlePriority = IdlePriority; + exports.unstable_ImmediatePriority = ImmediatePriority; + exports.unstable_LowPriority = LowPriority; + exports.unstable_NormalPriority = NormalPriority; + exports.unstable_Profiling = unstable_Profiling; + exports.unstable_UserBlockingPriority = UserBlockingPriority; + exports.unstable_cancelCallback = unstable_cancelCallback; + exports.unstable_continueExecution = unstable_continueExecution; + exports.unstable_forceFrameRate = forceFrameRate; + exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; + exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; + exports.unstable_next = unstable_next; + exports.unstable_pauseExecution = unstable_pauseExecution; + exports.unstable_requestPaint = unstable_requestPaint; + exports.unstable_runWithPriority = unstable_runWithPriority; + exports.unstable_scheduleCallback = unstable_scheduleCallback; + exports.unstable_shouldYield = shouldYieldToHost; + exports.unstable_wrapCallback = unstable_wrapCallback; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// ../../../../../../../node_modules/scheduler/index.js +var require_scheduler = __commonJS({ + "../../../../../../../node_modules/scheduler/index.js"(exports, module) { + { + module.exports = require_scheduler_development(); + } + } +}); + +// ../../../../../../../node_modules/react-dom/cjs/react-dom.development.js +var require_react_dom_development = __commonJS({ + "../../../../../../../node_modules/react-dom/cjs/react-dom.development.js"(exports) { + { + (function() { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var React3 = require_react(); + var Scheduler = require_scheduler(); + var ReactSharedInternals = React3.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var suppressWarning = false; + function setSuppressWarning(newSuppressWarning) { + { + suppressWarning = newSuppressWarning; + } + } + function warn(format) { + { + if (!suppressWarning) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + if (!suppressWarning) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var FunctionComponent = 0; + var ClassComponent = 1; + var IndeterminateComponent = 2; + var HostRoot = 3; + var HostPortal = 4; + var HostComponent = 5; + var HostText = 6; + var Fragment = 7; + var Mode = 8; + var ContextConsumer = 9; + var ContextProvider = 10; + var ForwardRef = 11; + var Profiler = 12; + var SuspenseComponent = 13; + var MemoComponent = 14; + var SimpleMemoComponent = 15; + var LazyComponent = 16; + var IncompleteClassComponent = 17; + var DehydratedFragment = 18; + var SuspenseListComponent = 19; + var ScopeComponent = 21; + var OffscreenComponent = 22; + var LegacyHiddenComponent = 23; + var CacheComponent = 24; + var TracingMarkerComponent = 25; + var enableClientRenderFallbackOnTextMismatch = true; + var enableNewReconciler = false; + var enableLazyContextPropagation = false; + var enableLegacyHidden = false; + var enableSuspenseAvoidThisFallback = false; + var disableCommentsAsDOMContainers = true; + var enableCustomElementPropertySupport = false; + var warnAboutStringRefs = true; + var enableSchedulingProfiler = true; + var enableProfilerTimer = true; + var enableProfilerCommitHooks = true; + var allNativeEvents = /* @__PURE__ */ new Set(); + var registrationNameDependencies = {}; + var possibleRegistrationNames = {}; + function registerTwoPhaseEvent(registrationName, dependencies) { + registerDirectEvent(registrationName, dependencies); + registerDirectEvent(registrationName + "Capture", dependencies); + } + function registerDirectEvent(registrationName, dependencies) { + { + if (registrationNameDependencies[registrationName]) { + error("EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", registrationName); + } + } + registrationNameDependencies[registrationName] = dependencies; + { + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; + if (registrationName === "onDoubleClick") { + possibleRegistrationNames.ondblclick = registrationName; + } + } + for (var i = 0; i < dependencies.length; i++) { + allNativeEvents.add(dependencies[i]); + } + } + var canUseDOM = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined"); + var hasOwnProperty = Object.prototype.hasOwnProperty; + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkAttributeStringCoercion(value, attributeName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before before using it here.", attributeName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function checkPropStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` prop is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkCSSPropertyStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkHtmlStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided HTML markup uses a value of unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function checkFormFieldValueStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + var RESERVED = 0; + var STRING = 1; + var BOOLEANISH_STRING = 2; + var BOOLEAN = 3; + var OVERLOADED_BOOLEAN = 4; + var NUMERIC = 5; + var POSITIVE_NUMERIC = 6; + var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var VALID_ATTRIBUTE_NAME_REGEX = new RegExp("^[" + ATTRIBUTE_NAME_START_CHAR + "][" + ATTRIBUTE_NAME_CHAR + "]*$"); + var illegalAttributeNameCache = {}; + var validatedAttributeNameCache = {}; + function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; + } + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + illegalAttributeNameCache[attributeName] = true; + { + error("Invalid attribute name: `%s`", attributeName); + } + return false; + } + function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null) { + return propertyInfo.type === RESERVED; + } + if (isCustomComponentTag) { + return false; + } + if (name.length > 2 && (name[0] === "o" || name[0] === "O") && (name[1] === "n" || name[1] === "N")) { + return true; + } + return false; + } + function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } + switch (typeof value) { + case "function": + // $FlowIssue symbol is perfectly valid here + case "symbol": + return true; + case "boolean": { + if (isCustomComponentTag) { + return false; + } + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix2 = name.toLowerCase().slice(0, 5); + return prefix2 !== "data-" && prefix2 !== "aria-"; + } + } + default: + return false; + } + } + function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { + if (value === null || typeof value === "undefined") { + return true; + } + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { + return true; + } + if (isCustomComponentTag) { + return false; + } + if (propertyInfo !== null) { + switch (propertyInfo.type) { + case BOOLEAN: + return !value; + case OVERLOADED_BOOLEAN: + return value === false; + case NUMERIC: + return isNaN(value); + case POSITIVE_NUMERIC: + return isNaN(value) || value < 1; + } + } + return false; + } + function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; + } + function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL2, removeEmptyString) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL2; + this.removeEmptyString = removeEmptyString; + } + var properties = {}; + var reservedProps = [ + "children", + "dangerouslySetInnerHTML", + // TODO: This prevents the assignment of defaultValue to regular + // elements (not just inputs). Now that ReactDOMInput assigns to the + // defaultValue property -- do we need this? + "defaultValue", + "defaultChecked", + "innerHTML", + "suppressContentEditableWarning", + "suppressHydrationWarning", + "style" + ]; + reservedProps.forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + RESERVED, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(_ref) { + var name = _ref[0], attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["contentEditable", "draggable", "spellCheck", "value"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEANISH_STRING, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEANISH_STRING, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "allowFullScreen", + "async", + // Note: there is a special case that prevents it from being written to the DOM + // on the client side because the browsers are inconsistent. Instead we call focus(). + "autoFocus", + "autoPlay", + "controls", + "default", + "defer", + "disabled", + "disablePictureInPicture", + "disableRemotePlayback", + "formNoValidate", + "hidden", + "loop", + "noModule", + "noValidate", + "open", + "playsInline", + "readOnly", + "required", + "reversed", + "scoped", + "seamless", + // Microdata + "itemScope" + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEAN, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "checked", + // Note: `option.selected` is not updated if `select.multiple` is + // disabled with `removeAttribute`. We have special logic for handling this. + "multiple", + "muted", + "selected" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEAN, + true, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "capture", + "download" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + OVERLOADED_BOOLEAN, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "cols", + "rows", + "size", + "span" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + POSITIVE_NUMERIC, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["rowSpan", "start"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + NUMERIC, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + var CAMELIZE = /[\-\:]([a-z])/g; + var capitalize = function(token) { + return token[1].toUpperCase(); + }; + [ + "accent-height", + "alignment-baseline", + "arabic-form", + "baseline-shift", + "cap-height", + "clip-path", + "clip-rule", + "color-interpolation", + "color-interpolation-filters", + "color-profile", + "color-rendering", + "dominant-baseline", + "enable-background", + "fill-opacity", + "fill-rule", + "flood-color", + "flood-opacity", + "font-family", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-variant", + "font-weight", + "glyph-name", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "horiz-adv-x", + "horiz-origin-x", + "image-rendering", + "letter-spacing", + "lighting-color", + "marker-end", + "marker-mid", + "marker-start", + "overline-position", + "overline-thickness", + "paint-order", + "panose-1", + "pointer-events", + "rendering-intent", + "shape-rendering", + "stop-color", + "stop-opacity", + "strikethrough-position", + "strikethrough-thickness", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "text-anchor", + "text-decoration", + "text-rendering", + "underline-position", + "underline-thickness", + "unicode-bidi", + "unicode-range", + "units-per-em", + "v-alphabetic", + "v-hanging", + "v-ideographic", + "v-mathematical", + "vector-effect", + "vert-adv-y", + "vert-origin-x", + "vert-origin-y", + "word-spacing", + "writing-mode", + "xmlns:xlink", + "x-height" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "xlink:actuate", + "xlink:arcrole", + "xlink:role", + "xlink:show", + "xlink:title", + "xlink:type" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + "http://www.w3.org/1999/xlink", + false, + // sanitizeURL + false + ); + }); + [ + "xml:base", + "xml:lang", + "xml:space" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + "http://www.w3.org/XML/1998/namespace", + false, + // sanitizeURL + false + ); + }); + ["tabIndex", "crossOrigin"].forEach(function(attributeName) { + properties[attributeName] = new PropertyInfoRecord( + attributeName, + STRING, + false, + // mustUseProperty + attributeName.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + var xlinkHref = "xlinkHref"; + properties[xlinkHref] = new PropertyInfoRecord( + "xlinkHref", + STRING, + false, + // mustUseProperty + "xlink:href", + "http://www.w3.org/1999/xlink", + true, + // sanitizeURL + false + ); + ["src", "href", "action", "formAction"].forEach(function(attributeName) { + properties[attributeName] = new PropertyInfoRecord( + attributeName, + STRING, + false, + // mustUseProperty + attributeName.toLowerCase(), + // attributeName + null, + // attributeNamespace + true, + // sanitizeURL + true + ); + }); + var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; + var didWarn = false; + function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + error("A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed %s.", JSON.stringify(url)); + } + } + } + function getValueForProperty(node, name, expected, propertyInfo) { + { + if (propertyInfo.mustUseProperty) { + var propertyName = propertyInfo.propertyName; + return node[propertyName]; + } else { + { + checkAttributeStringCoercion(expected, name); + } + if (propertyInfo.sanitizeURL) { + sanitizeURL("" + expected); + } + var attributeName = propertyInfo.attributeName; + var stringValue = null; + if (propertyInfo.type === OVERLOADED_BOOLEAN) { + if (node.hasAttribute(attributeName)) { + var value = node.getAttribute(attributeName); + if (value === "") { + return true; + } + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return value; + } + if (value === "" + expected) { + return expected; + } + return value; + } + } else if (node.hasAttribute(attributeName)) { + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return node.getAttribute(attributeName); + } + if (propertyInfo.type === BOOLEAN) { + return expected; + } + stringValue = node.getAttribute(attributeName); + } + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return stringValue === null ? expected : stringValue; + } else if (stringValue === "" + expected) { + return expected; + } else { + return stringValue; + } + } + } + } + function getValueForAttribute(node, name, expected, isCustomComponentTag) { + { + if (!isAttributeNameSafe(name)) { + return; + } + if (!node.hasAttribute(name)) { + return expected === void 0 ? void 0 : null; + } + var value = node.getAttribute(name); + { + checkAttributeStringCoercion(expected, name); + } + if (value === "" + expected) { + return expected; + } + return value; + } + } + function setValueForProperty(node, name, value, isCustomComponentTag) { + var propertyInfo = getPropertyInfo(name); + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { + return; + } + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { + value = null; + } + if (isCustomComponentTag || propertyInfo === null) { + if (isAttributeNameSafe(name)) { + var _attributeName = name; + if (value === null) { + node.removeAttribute(_attributeName); + } else { + { + checkAttributeStringCoercion(value, name); + } + node.setAttribute(_attributeName, "" + value); + } + } + return; + } + var mustUseProperty = propertyInfo.mustUseProperty; + if (mustUseProperty) { + var propertyName = propertyInfo.propertyName; + if (value === null) { + var type = propertyInfo.type; + node[propertyName] = type === BOOLEAN ? false : ""; + } else { + node[propertyName] = value; + } + return; + } + var attributeName = propertyInfo.attributeName, attributeNamespace = propertyInfo.attributeNamespace; + if (value === null) { + node.removeAttribute(attributeName); + } else { + var _type = propertyInfo.type; + var attributeValue; + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { + attributeValue = ""; + } else { + { + { + checkAttributeStringCoercion(value, attributeName); + } + attributeValue = "" + value; + } + if (propertyInfo.sanitizeURL) { + sanitizeURL(attributeValue.toString()); + } + } + if (attributeNamespace) { + node.setAttributeNS(attributeNamespace, attributeName, attributeValue); + } else { + node.setAttribute(attributeName, attributeValue); + } + } + } + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_SCOPE_TYPE = Symbol.for("react.scope"); + var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); + var REACT_CACHE_TYPE = Symbol.for("react.cache"); + var REACT_TRACING_MARKER_TYPE = Symbol.for("react.tracing_marker"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var assign = Object.assign; + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + function describeFiber(fiber) { + fiber._debugOwner ? fiber._debugOwner.type : null; + fiber._debugSource; + switch (fiber.tag) { + case HostComponent: + return describeBuiltInComponentFrame(fiber.type); + case LazyComponent: + return describeBuiltInComponentFrame("Lazy"); + case SuspenseComponent: + return describeBuiltInComponentFrame("Suspense"); + case SuspenseListComponent: + return describeBuiltInComponentFrame("SuspenseList"); + case FunctionComponent: + case IndeterminateComponent: + case SimpleMemoComponent: + return describeFunctionComponentFrame(fiber.type); + case ForwardRef: + return describeFunctionComponentFrame(fiber.type.render); + case ClassComponent: + return describeClassComponentFrame(fiber.type); + default: + return ""; + } + } + function getStackByFiberInDevAndProd(workInProgress2) { + try { + var info = ""; + var node = workInProgress2; + do { + info += describeFiber(node); + node = node.return; + } while (node); + return info; + } catch (x) { + return "\nError generating stack: " + x.message + "\n" + x.stack; + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + function getWrappedName$1(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ""; + return outerType.displayName || (functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName); + } + function getContextName$1(type) { + return type.displayName || "Context"; + } + function getComponentNameFromFiber(fiber) { + var tag = fiber.tag, type = fiber.type; + switch (tag) { + case CacheComponent: + return "Cache"; + case ContextConsumer: + var context = type; + return getContextName$1(context) + ".Consumer"; + case ContextProvider: + var provider = type; + return getContextName$1(provider._context) + ".Provider"; + case DehydratedFragment: + return "DehydratedFragment"; + case ForwardRef: + return getWrappedName$1(type, type.render, "ForwardRef"); + case Fragment: + return "Fragment"; + case HostComponent: + return type; + case HostPortal: + return "Portal"; + case HostRoot: + return "Root"; + case HostText: + return "Text"; + case LazyComponent: + return getComponentNameFromType(type); + case Mode: + if (type === REACT_STRICT_MODE_TYPE) { + return "StrictMode"; + } + return "Mode"; + case OffscreenComponent: + return "Offscreen"; + case Profiler: + return "Profiler"; + case ScopeComponent: + return "Scope"; + case SuspenseComponent: + return "Suspense"; + case SuspenseListComponent: + return "SuspenseList"; + case TracingMarkerComponent: + return "TracingMarker"; + // The display name for this tags come from the user-provided type: + case ClassComponent: + case FunctionComponent: + case IncompleteClassComponent: + case IndeterminateComponent: + case MemoComponent: + case SimpleMemoComponent: + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + break; + } + return null; + } + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var current = null; + var isRendering = false; + function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; + } + var owner = current._debugOwner; + if (owner !== null && typeof owner !== "undefined") { + return getComponentNameFromFiber(owner); + } + } + return null; + } + function getCurrentFiberStackInDev() { + { + if (current === null) { + return ""; + } + return getStackByFiberInDevAndProd(current); + } + } + function resetCurrentFiber() { + { + ReactDebugCurrentFrame.getCurrentStack = null; + current = null; + isRendering = false; + } + } + function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } + } + function getCurrentFiber() { + { + return current; + } + } + function setIsRendering(rendering) { + { + isRendering = rendering; + } + } + function toString(value) { + return "" + value; + } + function getToStringValue(value) { + switch (typeof value) { + case "boolean": + case "number": + case "string": + case "undefined": + return value; + case "object": + { + checkFormFieldValueStringCoercion(value); + } + return value; + default: + return ""; + } + } + var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true + }; + function checkControlledValueProps(tagName, props) { + { + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { + error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`."); + } + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { + error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`."); + } + } + } + function isCheckable(elem) { + var type = elem.type; + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === "input" && (type === "checkbox" || type === "radio"); + } + function getTracker(node) { + return node._valueTracker; + } + function detachTracker(node) { + node._valueTracker = null; + } + function getValueFromNode(node) { + var value = ""; + if (!node) { + return value; + } + if (isCheckable(node)) { + value = node.checked ? "true" : "false"; + } else { + value = node.value; + } + return value; + } + function trackValueOnNode(node) { + var valueField = isCheckable(node) ? "checked" : "value"; + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + { + checkFormFieldValueStringCoercion(node[valueField]); + } + var currentValue = "" + node[valueField]; + if (node.hasOwnProperty(valueField) || typeof descriptor === "undefined" || typeof descriptor.get !== "function" || typeof descriptor.set !== "function") { + return; + } + var get2 = descriptor.get, set2 = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function() { + return get2.call(this); + }, + set: function(value) { + { + checkFormFieldValueStringCoercion(value); + } + currentValue = "" + value; + set2.call(this, value); + } + }); + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + var tracker = { + getValue: function() { + return currentValue; + }, + setValue: function(value) { + { + checkFormFieldValueStringCoercion(value); + } + currentValue = "" + value; + }, + stopTracking: function() { + detachTracker(node); + delete node[valueField]; + } + }; + return tracker; + } + function track(node) { + if (getTracker(node)) { + return; + } + node._valueTracker = trackValueOnNode(node); + } + function updateValueIfChanged(node) { + if (!node) { + return false; + } + var tracker = getTracker(node); + if (!tracker) { + return true; + } + var lastValue = tracker.getValue(); + var nextValue = getValueFromNode(node); + if (nextValue !== lastValue) { + tracker.setValue(nextValue); + return true; + } + return false; + } + function getActiveElement(doc) { + doc = doc || (typeof document !== "undefined" ? document : void 0); + if (typeof doc === "undefined") { + return null; + } + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } + } + var didWarnValueDefaultValue = false; + var didWarnCheckedDefaultChecked = false; + var didWarnControlledToUncontrolled = false; + var didWarnUncontrolledToControlled = false; + function isControlled(props) { + var usesChecked = props.type === "checkbox" || props.type === "radio"; + return usesChecked ? props.checked != null : props.value != null; + } + function getHostProps(element, props) { + var node = element; + var checked = props.checked; + var hostProps = assign({}, props, { + defaultChecked: void 0, + defaultValue: void 0, + value: void 0, + checked: checked != null ? checked : node._wrapperState.initialChecked + }); + return hostProps; + } + function initWrapperState(element, props) { + { + checkControlledValueProps("input", props); + if (props.checked !== void 0 && props.defaultChecked !== void 0 && !didWarnCheckedDefaultChecked) { + error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type); + didWarnCheckedDefaultChecked = true; + } + if (props.value !== void 0 && props.defaultValue !== void 0 && !didWarnValueDefaultValue) { + error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type); + didWarnValueDefaultValue = true; + } + } + var node = element; + var defaultValue = props.defaultValue == null ? "" : props.defaultValue; + node._wrapperState = { + initialChecked: props.checked != null ? props.checked : props.defaultChecked, + initialValue: getToStringValue(props.value != null ? props.value : defaultValue), + controlled: isControlled(props) + }; + } + function updateChecked(element, props) { + var node = element; + var checked = props.checked; + if (checked != null) { + setValueForProperty(node, "checked", checked, false); + } + } + function updateWrapper(element, props) { + var node = element; + { + var controlled = isControlled(props); + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { + error("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"); + didWarnUncontrolledToControlled = true; + } + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { + error("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"); + didWarnControlledToUncontrolled = true; + } + } + updateChecked(element, props); + var value = getToStringValue(props.value); + var type = props.type; + if (value != null) { + if (type === "number") { + if (value === 0 && node.value === "" || // We explicitly want to coerce to number here if possible. + // eslint-disable-next-line + node.value != value) { + node.value = toString(value); + } + } else if (node.value !== toString(value)) { + node.value = toString(value); + } + } else if (type === "submit" || type === "reset") { + node.removeAttribute("value"); + return; + } + { + if (props.hasOwnProperty("value")) { + setDefaultValue(node, props.type, value); + } else if (props.hasOwnProperty("defaultValue")) { + setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); + } + } + { + if (props.checked == null && props.defaultChecked != null) { + node.defaultChecked = !!props.defaultChecked; + } + } + } + function postMountWrapper(element, props, isHydrating2) { + var node = element; + if (props.hasOwnProperty("value") || props.hasOwnProperty("defaultValue")) { + var type = props.type; + var isButton = type === "submit" || type === "reset"; + if (isButton && (props.value === void 0 || props.value === null)) { + return; + } + var initialValue = toString(node._wrapperState.initialValue); + if (!isHydrating2) { + { + if (initialValue !== node.value) { + node.value = initialValue; + } + } + } + { + node.defaultValue = initialValue; + } + } + var name = node.name; + if (name !== "") { + node.name = ""; + } + { + node.defaultChecked = !node.defaultChecked; + node.defaultChecked = !!node._wrapperState.initialChecked; + } + if (name !== "") { + node.name = name; + } + } + function restoreControlledState(element, props) { + var node = element; + updateWrapper(node, props); + updateNamedCousins(node, props); + } + function updateNamedCousins(rootNode, props) { + var name = props.name; + if (props.type === "radio" && name != null) { + var queryRoot = rootNode; + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } + { + checkAttributeStringCoercion(name, "name"); + } + var group = queryRoot.querySelectorAll("input[name=" + JSON.stringify("" + name) + '][type="radio"]'); + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } + var otherProps = getFiberCurrentPropsFromNode(otherNode); + if (!otherProps) { + throw new Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."); + } + updateValueIfChanged(otherNode); + updateWrapper(otherNode, otherProps); + } + } + } + function setDefaultValue(node, type, value) { + if ( + // Focused number inputs synchronize on blur. See ChangeEventPlugin.js + type !== "number" || getActiveElement(node.ownerDocument) !== node + ) { + if (value == null) { + node.defaultValue = toString(node._wrapperState.initialValue); + } else if (node.defaultValue !== toString(value)) { + node.defaultValue = toString(value); + } + } + } + var didWarnSelectedSetOnOption = false; + var didWarnInvalidChild = false; + var didWarnInvalidInnerHTML = false; + function validateProps(element, props) { + { + if (props.value == null) { + if (typeof props.children === "object" && props.children !== null) { + React3.Children.forEach(props.children, function(child) { + if (child == null) { + return; + } + if (typeof child === "string" || typeof child === "number") { + return; + } + if (!didWarnInvalidChild) { + didWarnInvalidChild = true; + error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to