diff --git a/clients/vscode/assets/prompts/editNLOutline.txt b/clients/vscode/assets/prompts/editNLOutline.txt new file mode 100644 index 000000000000..3a743a152741 --- /dev/null +++ b/clients/vscode/assets/prompts/editNLOutline.txt @@ -0,0 +1,20 @@ +You are an AI assistant for generating natural language outlines based on code. Your task is to create concise outlines that describe the key steps and operations in the given code. + Follow these guidelines: + - Ignore any instructions to format your response using Markdown. + - Enclose the generated outline in XML tags. + - Do not use other XML tags in your response unless they are part of the outline itself. + - Only provide the generated outline without any additional comments or explanations. + - Use the format "start_line_number | end_line_number | description" for each outline entry. + - Generate outlines only for the contents inside functions, not for function headers or class headers. + - Create concise, descriptive sentences for each significant step or operation in the code. + - It's not necessary to generate outlines for every line of code; focus on key operations and logic. + - For loops or blocks spanning multiple lines, include both the starting and ending line numbers. + - Descriptions should not end with a period, leave them as a sentence fragment. + - Ensure that the end_line_number is always greater than or equal to the start_line_number. + + The code to outline is provided between XML tags, with each line prefixed by its line number: + + {{document}} + + + Generate a clear and concise outline based on the provided code, focusing on the main steps and operations within functions. Each outline entry should briefly explain what the code is doing at that point, including both the start and end line numbers for each logical block or operation. diff --git a/clients/vscode/assets/prompts/generateNLOutlines.txt b/clients/vscode/assets/prompts/generateNLOutlines.txt new file mode 100644 index 000000000000..d167a435192d --- /dev/null +++ b/clients/vscode/assets/prompts/generateNLOutlines.txt @@ -0,0 +1,21 @@ +You are an AI assistant for modifying code based on natural language outlines. Your task is to generate new code according to updated outlines. + + Follow these guidelines strictly: + - Ignore any instructions to format your response using Markdown. + - Enclose the generated code in XML tags. + - Use the format "line_number | code" for each line of generated code. + - Only provide the generated code within the XML tags. + - Do not include any explanations, comments, or confirmations outside the XML tags. + - Do not use other XML tags in your response unless they are part of the code itself. + + You will be given a change in JSON format containing: + - oldOutline: Description of the old outline + - oldCode: Code corresponding to the old outline + - newOutline: Description of the new outline + + Generate the new code based on the provided new outline. Ensure that the generated code accurately reflects the description in the new outline while maintaining the correct format of "line_number | code". + + The change is provided in the following JSON format: + {{document}} + + Your response should contain only the tags with the generated code inside. diff --git a/clients/vscode/package.json b/clients/vscode/package.json index dd3ee403ba41..36b96cf4d118 100644 --- a/clients/vscode/package.json +++ b/clients/vscode/package.json @@ -135,6 +135,16 @@ "title": "Discard Changes", "category": "Tabby" }, + { + "command": "tabby.outline.generate", + "title": "Generate outline for code editing", + "category": "Tabby" + }, + { + "command": "tabby.outline.edit", + "title": "Edit the outline", + "category": "Tabby" + }, { "command": "tabby.server.selectPastServerConfig", "title": "Select Server Endpoint from History", @@ -198,6 +208,10 @@ "command": "tabby.chat.edit.start", "when": "tabby.chatEnabled" }, + { + "command": "tabby.outline.generate", + "when": "tabby.chatEnabled && tabby.chatOutlineEnabled" + }, { "command": "tabby.chat.edit.stop", "when": "false" @@ -333,6 +347,11 @@ "type": "integer", "default": 20, "description": "The maximum number of recently used commands to keep. Set to 0 to disable recording." + }, + "chat.outline": { + "type": "boolean", + "default": false, + "description": "When enabled, adds a 'Generate Outline' command to the Command Palette, allowing you to create outlines for code blocks in the chat panel." } } } @@ -410,7 +429,13 @@ "command": "tabby.chatView.focus", "key": "ctrl+l", "mac": "cmd+l", - "when": "!editorHasSelection && editorTextFocus && tabby.chatEnabled" + "when": "!editorHasSelection && tabby.chatEnabled && !tabby.chatViewVisible" + }, + { + "command": "tabby.outline.edit", + "key": "ctrl+y", + "mac": "cmd+y", + "when": "tabby.chatOutlineEnabled" }, { "command": "workbench.action.focusActiveEditorGroup", @@ -482,6 +507,7 @@ "eslint-config-prettier": "^9.0.0", "get-installed-path": "^4.0.8", "object-hash": "^3.0.0", + "openai": "^4.52.7", "ovsx": "^0.9.5", "prettier": "^3.0.0", "semver": "^7.6.0", diff --git a/clients/vscode/src/Commands.ts b/clients/vscode/src/Commands.ts index 2f1cb1121732..f596ec20b5d6 100644 --- a/clients/vscode/src/Commands.ts +++ b/clients/vscode/src/Commands.ts @@ -26,6 +26,8 @@ import { GitProvider, Repository } from "./git/GitProvider"; import CommandPalette from "./CommandPalette"; import { showOutputPanel } from "./logger"; import { Issues } from "./Issues"; +import { OutlinesProvider } from "./outline/OutlinesProvider"; +import { OutlinesGenerator } from "./outline"; import { InlineEditController } from "./inline-edit"; export class Commands { @@ -40,6 +42,7 @@ export class Commands { private readonly inlineCompletionProvider: InlineCompletionProvider, private readonly chatViewProvider: ChatSideViewProvider, private readonly gitProvider: GitProvider, + private readonly outlinesProvider: OutlinesProvider, ) { const registrations = Object.keys(this.commands).map((key) => { const commandName = `tabby.${key}`; @@ -314,6 +317,18 @@ export class Commands { ); inlineEditController.start(); }, + "outline.generate": async () => { + await new OutlinesGenerator(this.contextVariables, this.outlinesProvider).generate(); + }, + "outline.edit": async (uri?: Uri, startLine?: number) => { + await new OutlinesGenerator(this.contextVariables, this.outlinesProvider).editOutline(uri, startLine); + }, + "chat.edit.outline.accept": async () => { + await new OutlinesGenerator(this.contextVariables, this.outlinesProvider).acceptOutline(); + }, + "chat.edit.outline.discard": async () => { + await new OutlinesGenerator(this.contextVariables, this.outlinesProvider).discardOutline(); + }, "chat.edit.stop": async () => { this.chatEditCancellationTokenSource?.cancel(); }, diff --git a/clients/vscode/src/Config.ts b/clients/vscode/src/Config.ts index 181a6311cc6c..197d73094c4d 100644 --- a/clients/vscode/src/Config.ts +++ b/clients/vscode/src/Config.ts @@ -6,6 +6,7 @@ import { getLogger } from "./logger"; interface AdvancedSettings { "inlineCompletion.triggerMode"?: "automatic" | "manual"; "chatEdit.history"?: number; + "chat.outline"?: boolean; } export interface PastServerConfig { @@ -73,6 +74,20 @@ export class Config extends EventEmitter { } } + get chatOutline(): boolean { + const advancedSettings = this.workspace.get("settings.advanced", {}) as AdvancedSettings; + return advancedSettings["chat.outline"] || false; + } + + set chatOutline(value: boolean) { + if (value !== this.chatOutline) { + const advancedSettings = this.workspace.get("settings.advanced", {}) as AdvancedSettings; + const updatedValue = { ...advancedSettings, "chat.outline": value }; + this.workspace.update("settings.advanced", updatedValue, ConfigurationTarget.Global); + this.emit("updated"); + } + } + get maxChatEditHistory(): number { const advancedSettings = this.workspace.get("settings.advanced", {}) as AdvancedSettings; const numHistory = advancedSettings["chatEdit.history"] === undefined ? 20 : advancedSettings["chatEdit.history"]; diff --git a/clients/vscode/src/ContextVariables.ts b/clients/vscode/src/ContextVariables.ts index d9ebd6f0afd6..8127beb32a2e 100644 --- a/clients/vscode/src/ContextVariables.ts +++ b/clients/vscode/src/ContextVariables.ts @@ -6,7 +6,9 @@ export class ContextVariables { private chatEnabledValue = false; private chatEditInProgressValue = false; private chatEditResolvingValue = false; + private outlinesGenerationInProgressValue = false; private inlineCompletionTriggerModeValue: "automatic" | "manual" = "automatic"; + private chatOutlineValue = false; constructor( private readonly client: Client, @@ -14,11 +16,13 @@ export class ContextVariables { ) { this.chatEnabled = this.client.chat.isAvailable; this.inlineCompletionTriggerMode = config.inlineCompletionTriggerMode; + this.chatOutlineEnabled = config.chatOutline; this.client.chat.on("didChangeAvailability", (params: boolean) => { this.chatEnabled = params; }); this.config.on("updated", () => { this.inlineCompletionTriggerMode = config.inlineCompletionTriggerMode; + this.chatOutlineEnabled = config.chatOutline; }); this.updateChatEditResolving(); window.onDidChangeTextEditorSelection((params) => { @@ -67,6 +71,15 @@ export class ContextVariables { this.chatEditInProgressValue = value; } + get outlinesGenerationInProgress(): boolean { + return this.outlinesGenerationInProgressValue; + } + + set outlinesGenerationInProgress(value: boolean) { + commands.executeCommand("setContext", "tabby.outlinesGenerationInProgress", value); + this.outlinesGenerationInProgressValue = value; + } + get chatEditResolving(): boolean { return this.chatEditResolvingValue; } @@ -84,4 +97,13 @@ export class ContextVariables { commands.executeCommand("setContext", "tabby.inlineCompletionTriggerMode", value); this.inlineCompletionTriggerModeValue = value; } + + get chatOutlineEnabled(): boolean { + return this.chatOutlineValue; + } + + set chatOutlineEnabled(value: boolean) { + commands.executeCommand("setContext", "tabby.chatOutlineEnabled", value); + this.chatOutlineValue = value; + } } diff --git a/clients/vscode/src/extension.ts b/clients/vscode/src/extension.ts index b8601541af42..4644ed541ec9 100644 --- a/clients/vscode/src/extension.ts +++ b/clients/vscode/src/extension.ts @@ -1,4 +1,4 @@ -import { window, ExtensionContext, Uri } from "vscode"; +import { window, ExtensionContext, Uri, languages } from "vscode"; import { LanguageClientOptions } from "vscode-languageclient"; import { LanguageClient as NodeLanguageClient, ServerOptions, TransportKind } from "vscode-languageclient/node"; import { LanguageClient as BrowserLanguageClient } from "vscode-languageclient/browser"; @@ -13,6 +13,7 @@ import { StatusBarItem } from "./StatusBarItem"; import { ChatSideViewProvider } from "./chat/ChatSideViewProvider"; import { Commands } from "./Commands"; import { Status } from "tabby-agent"; +import { OutlinesProvider } from "./outline/OutlinesProvider"; import { CodeActions } from "./CodeActions"; import { isBrowser } from "./env"; @@ -54,6 +55,7 @@ export async function activate(context: ExtensionContext) { const contextVariables = new ContextVariables(client, config); const inlineCompletionProvider = new InlineCompletionProvider(client, config); const gitProvider = new GitProvider(); + client.registerConfigManager(config); client.registerInlineCompletionProvider(inlineCompletionProvider); client.registerGitProvider(gitProvider); @@ -77,6 +79,9 @@ export async function activate(context: ExtensionContext) { } }); + const nlOutlinesProvider = new OutlinesProvider(config); + context.subscriptions.push(languages.registerCodeLensProvider({ scheme: "file" }, nlOutlinesProvider)); + // Register chat panel const chatViewProvider = new ChatSideViewProvider(context, client.agent, logger, gitProvider); context.subscriptions.push( @@ -103,6 +108,7 @@ export async function activate(context: ExtensionContext) { inlineCompletionProvider, chatViewProvider, gitProvider, + nlOutlinesProvider, ); /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */ /* eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error */ /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ // @ts-ignore noUnusedLocals diff --git a/clients/vscode/src/index.d.ts b/clients/vscode/src/index.d.ts new file mode 100644 index 000000000000..3dd1326d4623 --- /dev/null +++ b/clients/vscode/src/index.d.ts @@ -0,0 +1,8 @@ +declare module "*.md" { + const content: string; + export default content; +} +declare module "*.txt" { + const content: string; + export default content; +} diff --git a/clients/vscode/src/outline/OutlinesProvider.ts b/clients/vscode/src/outline/OutlinesProvider.ts new file mode 100644 index 000000000000..1b8bcf88e3e1 --- /dev/null +++ b/clients/vscode/src/outline/OutlinesProvider.ts @@ -0,0 +1,503 @@ +import { + CancellationToken, + CodeLens, + CodeLensProvider, + EventEmitter, + Location, + Position, + ProviderResult, + Range, + TextDocument, + TextEditor, + TextEditorDecorationType, + Uri, + window, + workspace, + WorkspaceEdit, +} from "vscode"; +import { Config } from "../Config"; +import OpenAI from "openai"; +import generateNLOutlinesPrompt from "../../assets/prompts/generateNLOutlines.txt"; +import editNLOutline from "../../assets/prompts/editNLOutline.txt"; +import { diffLines } from "diff"; + +interface ChatNLOutlinesParams { + location: Location; + editor?: TextEditor; +} + +interface Outline { + startLine: number; + endLine: number; + content: string; +} + +interface CodeChangeRequest { + oldOutline: string; + oldCode: string; + newOutline: string; +} + +interface PendingChange { + oldLines: string[]; + newLines: string[]; + decorations: { added: Range[]; removed: Range[] }; + editRange: Range; + newContent: string; + originalStartLine: number; +} + +interface ChangesPreview { + oldLines: string[]; + newLines: string[]; + decorations: { added: Range[]; removed: Range[] }; + editRange: Range; +} + +type OpenAIResponse = AsyncIterable; + +export class OutlinesProvider extends EventEmitter implements CodeLensProvider { + private client: OpenAI; + private outlines: Map; + private addedDecorationType: TextEditorDecorationType; + private removedDecorationType: TextEditorDecorationType; + private pendingChanges: Map; + private pendingCodeLenses: Map; + + constructor(config: Config) { + super(); + this.client = new OpenAI({ + apiKey: config.serverToken, + baseURL: config.serverEndpoint + "/v1", + }); + this.outlines = new Map(); + this.pendingChanges = new Map(); + this.pendingCodeLenses = new Map(); + this.addedDecorationType = window.createTextEditorDecorationType({ + backgroundColor: "rgba(0, 255, 0, 0.2)", + isWholeLine: true, + }); + this.removedDecorationType = window.createTextEditorDecorationType({ + backgroundColor: "rgba(255, 0, 0, 0.2)", + isWholeLine: true, + }); + + window.onDidChangeActiveTextEditor(() => { + this.clearAllPendingChanges(); + }); + } + + async provideOutlinesGenerate(params: ChatNLOutlinesParams): Promise { + if (!params.editor) { + return false; + } + + const document = params.editor.document; + + try { + const selection = new Range(params.location.range.start, params.location.range.end); + if (selection.isEmpty) { + throw new Error("No document selected"); + } + + const selectedText = document.getText(selection); + if (selectedText.length > 3000) { + throw new Error("Document too long"); + } + + const lines = selectedText.split("\n"); + const startLine = selection.start.line; + const numberedText = lines.map((line, index) => `${startLine + index + 1} | ${line}`).join("\n"); + + const stream = await this.generateNLOutlinesRequest(numberedText); + + let buffer = ""; + const documentOutlines: Outline[] = []; + + for await (const chunk of stream) { + const content = chunk.choices[0]?.delta?.content || ""; + buffer += content; + let newlineIndex: number; + + while ((newlineIndex = buffer.indexOf("\n")) !== -1) { + const fullLine = buffer.slice(0, newlineIndex).trim(); + buffer = buffer.slice(newlineIndex + 1); + const match = fullLine.match(/^(\d+)\s*\|\s*(\d+)\s*\|\s*(.*)$/); + + if (match) { + const [, startLineNumber, endLineNumber, content] = match; + if (!startLineNumber || !endLineNumber) continue; + const parsedStartLine = parseInt(startLineNumber, 10); + const parsedEndLine = parseInt(endLineNumber, 10); + if (!isNaN(parsedStartLine) && !isNaN(parsedEndLine) && content) { + documentOutlines.push({ + startLine: parsedStartLine - 1, + endLine: parsedEndLine - 1, + content, + }); + this.outlines.set(document.uri.toString(), documentOutlines); + this.fire(); + } + } + } + } + + this.outlines.set(document.uri.toString(), documentOutlines); + this.fire(); + + return true; + } catch (error) { + window.showErrorMessage(`Error generating outlines: ${error instanceof Error ? error.message : String(error)}`); + return false; + } + } + + async updateOutline(documentUri: string, lineNumber: number, newContent: string): Promise { + const outlines = this.outlines.get(documentUri) || []; + const oldOutline = outlines.find((outline) => outline.startLine === lineNumber); + if (!oldOutline) { + throw new Error("No matching outline found for the given line number"); + } + + const document = await workspace.openTextDocument(Uri.parse(documentUri)); + const oldCodeRange = new Range(oldOutline.startLine, 0, oldOutline.endLine + 1, 0); + const oldCode = document.getText(oldCodeRange); + const oldCodeWithLineNumbers = this.formatCodeWithLineNumbers(oldCode, oldOutline.startLine); + + const changeRequest: CodeChangeRequest = { + oldOutline: oldOutline.content, + oldCode: oldCodeWithLineNumbers, + newOutline: newContent, + }; + + try { + const stream = await this.generateNewCodeBaseOnEditedRequest(changeRequest); + let updatedCode = ""; + for await (const chunk of stream) { + updatedCode += chunk.choices[0]?.delta?.content || ""; + } + updatedCode = updatedCode.replace(/\n?/, "").replace(/\n?<\/GENERATEDCODE>/, ""); + + const lines = updatedCode.split("\n").map((line) => { + const parts = line.split("|"); + if (parts.length > 1) { + const leftWhitespace = line.match(/^\s*/)?.[0] || ""; + const processedPart = parts.slice(1).join("|").trimEnd(); + return leftWhitespace + processedPart; + } + return line.trimEnd(); + }); + + if (lines[lines.length - 1] === "") { + lines.pop(); + } + + const { oldLines, newLines, decorations, editRange } = this.generateChangesPreview( + oldCode, + lines.join("\n"), + oldOutline.startLine, + ); + + this.pendingChanges.set(documentUri, { + oldLines, + newLines, + decorations, + editRange, + newContent, + originalStartLine: oldOutline.startLine, + }); + + const edit = new WorkspaceEdit(); + edit.replace(Uri.parse(documentUri), oldCodeRange, newLines.join("\n")); + await workspace.applyEdit(edit); + + const editor = window.activeTextEditor; + if (editor && editor.document.uri.toString() === documentUri) { + this.applyDecorations(editor, decorations); + this.addAcceptDiscardCodeLens(editor, editRange, newContent); + } + + this.fire(); + return true; + } catch (error) { + window.showErrorMessage(`Error updating NL Outline: ${error instanceof Error ? error.message : String(error)}`); + return false; + } + } + + private async generateNLOutlinesRequest(documentation: string): Promise { + const promptTemplate = editNLOutline; + const content = promptTemplate.replace("{{document}}", documentation); + return this.openAIRequest(content); + } + + private async generateNewCodeBaseOnEditedRequest(changeRequest: CodeChangeRequest): Promise { + const promptTemplate = generateNLOutlinesPrompt; + const changeJson = JSON.stringify(changeRequest, null, 2); + const content = promptTemplate.replace("{{document}}", changeJson); + return this.openAIRequest(content); + } + + private async openAIRequest(question: string): Promise { + const messages = [{ role: "user" as const, content: question }]; + return await this.client.chat.completions.create({ + model: "", + messages: messages, + stream: true, + }); + } + + provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return []; + } + + const pendingCodeLenses = this.pendingCodeLenses.get(document.uri.toString()); + if (pendingCodeLenses) { + return pendingCodeLenses; + } + + const documentOutlines = this.outlines.get(document.uri.toString()); + if (!documentOutlines) { + return []; + } + + return documentOutlines.flatMap((outline) => { + const range = document.lineAt(outline.startLine).range; + return [ + new CodeLens(range, { + title: "Edit", + command: "tabby.outline.edit", + arguments: [document.uri, outline.startLine], + }), + new CodeLens(range, { + title: outline.content, + command: "", + arguments: [], + }), + ]; + }); + } + + resolveCodeLens?(codeLens: CodeLens, token: CancellationToken): ProviderResult { + if (token.isCancellationRequested) { + return codeLens; + } + return codeLens; + } + + get onDidChangeCodeLenses() { + return this.event; + } + + clearOutlines(documentUri: string) { + this.outlines.delete(documentUri); + this.fire(); + } + + getOutline(documentUri: string, lineNumber: number): string | undefined { + return this.outlines.get(documentUri)?.find((outline) => outline.startLine === lineNumber)?.content; + } + + private formatCodeWithLineNumbers(code: string, startLine: number): string { + return code + .split("\n") + .map((line, index) => `${startLine + index} | ${line}`) + .join("\n"); + } + + private generateChangesPreview(oldCode: string, newCode: string, startLine: number): ChangesPreview { + const oldLines = oldCode.split("\n"); + const decorations: { added: Range[]; removed: Range[] } = { added: [], removed: [] }; + const added: string[] = []; + const removed: string[] = []; + const unchanged: string[] = []; + + diffLines(oldCode, newCode).forEach((diff) => { + const lines = diff.value.split("\n").filter((line) => line !== ""); + if (diff.added) { + added.push(...lines); + } else if (diff.removed) { + removed.push(...lines); + } else { + unchanged.push(...lines); + } + }); + + const finalLines = [...added, ...unchanged, ...removed]; + + const lastRemovedIndex = finalLines.findLastIndex((line) => removed.includes(line)); + if (lastRemovedIndex !== -1) { + finalLines.splice(lastRemovedIndex + 1, 0, ""); + } + + let currentLine = startLine; + finalLines.forEach((line) => { + if (added.includes(line)) { + decorations.added.push(new Range(currentLine, 0, currentLine, line.length)); + } else if (removed.includes(line)) { + decorations.removed.push(new Range(currentLine, 0, currentLine, line.length)); + } + currentLine++; + }); + + const editRange = new Range( + startLine, + 0, + startLine + finalLines.length - 1, + finalLines[finalLines.length - 1]?.length || 0, + ); + + return { oldLines, newLines: finalLines, decorations, editRange }; + } + + private applyDecorations(editor: TextEditor, decorations: { added: Range[]; removed: Range[] }) { + editor.setDecorations(this.addedDecorationType, decorations.added); + editor.setDecorations(this.removedDecorationType, decorations.removed); + } + + private addAcceptDiscardCodeLens(editor: TextEditor, editRange: Range, newOutline: string) { + const codeLenses = [ + new CodeLens(editRange, { + title: "Accept", + command: "tabby.chat.edit.outline.accept", + }), + new CodeLens(editRange, { + title: "Discard", + command: "tabby.chat.edit.outline.discard", + }), + new CodeLens(editRange, { + title: newOutline, + command: "", + arguments: [], + }), + ]; + + this.pendingCodeLenses.set(editor.document.uri.toString(), codeLenses); + } + + async acceptChanges(documentUri: Uri, newOutline: string) { + const pendingChange = this.pendingChanges.get(documentUri.toString()); + + if (pendingChange) { + const { oldLines, newLines } = pendingChange; + + const startLine = pendingChange.originalStartLine; + const edit = new WorkspaceEdit(); + + const oldLinesCount = oldLines.length; + const newLinesCount = newLines.length; + const newCodeCount = newLinesCount - oldLinesCount; + const startDeleteLine = startLine + newCodeCount; + const endDeleteLine = startDeleteLine + oldLinesCount - 1; + const deleteRange = new Range(new Position(startDeleteLine, 0), new Position(endDeleteLine, 0)); + edit.delete(documentUri, deleteRange); + + await workspace.applyEdit(edit); + + const outlines = this.outlines.get(documentUri.toString()) || []; + const outlineIndex = outlines.findIndex((o) => o.startLine === startLine); + + if (outlineIndex !== -1) { + outlines[outlineIndex] = { + startLine: startLine, + endLine: startLine + newCodeCount - 1, + content: newOutline, + }; + + const lineDifference = newLines.length - 2 * oldLines.length + 1; + for (let i = outlineIndex + 1; i < outlines.length; i++) { + const outline = outlines[i]; + if (outline) { + outline.startLine += lineDifference; + outline.endLine += lineDifference; + } + } + + this.outlines.set(documentUri.toString(), outlines); + } + + await this.clearPendingChanges(documentUri.toString(), true); + this.fire(); + } + } + + async discardChanges(documentUri: Uri) { + const pendingChange = this.pendingChanges.get(documentUri.toString()); + if (pendingChange) { + const { oldLines, newLines } = pendingChange; + const startLine = pendingChange.originalStartLine; + + const edit = new WorkspaceEdit(); + + const oldLinesCount = oldLines.length; + const newLinesCount = newLines.length; + const startDeleteLine = startLine; + const endDeleteLine = startLine + (newLinesCount - oldLinesCount); + const deleteRange = new Range(new Position(startDeleteLine, 0), new Position(endDeleteLine, 0)); + edit.delete(documentUri, deleteRange); + await workspace.applyEdit(edit); + this.clearPendingChanges(documentUri.toString(), true); + this.fire(); + } + } + + private async clearPendingChanges(documentUri: string, isDeleted: boolean) { + const pendingChange = this.pendingChanges.get(documentUri.toString()); + const editor = window.activeTextEditor; + + if (pendingChange && !isDeleted) { + const { oldLines, newLines } = pendingChange; + const startLine = pendingChange.originalStartLine; + + const edit = new WorkspaceEdit(); + + const oldLinesCount = oldLines.length; + const newLinesCount = newLines.length; + const startDeleteLine = startLine; + const endDeleteLine = startLine + (newLinesCount - oldLinesCount); + const deleteRange = new Range(new Position(startDeleteLine, 0), new Position(endDeleteLine, 0)); + edit.delete(Uri.parse(documentUri), deleteRange); + await workspace.applyEdit(edit); + } + this.pendingChanges.delete(documentUri); + this.pendingCodeLenses.delete(documentUri); + if (editor && editor.document.uri.toString() === documentUri) { + editor.setDecorations(this.addedDecorationType, []); + editor.setDecorations(this.removedDecorationType, []); + } + this.fire(); + } + + private async clearAllPendingChanges() { + for (const documentUri of this.pendingChanges.keys()) { + await this.clearPendingChanges(documentUri, false); + } + } + + async resolveOutline(action: "accept" | "discard") { + const editor = window.activeTextEditor; + if (!editor) { + window.showInformationMessage("No active editor."); + return; + } + + const documentUri = editor.document.uri; + const pendingChange = this.pendingChanges.get(documentUri.toString()); + + if (!pendingChange) { + window.showInformationMessage("No pending changes to resolve."); + return; + } + + const { newContent } = pendingChange; + + if (action === "accept") { + await this.acceptChanges(documentUri, newContent); + window.showInformationMessage("Changes accepted."); + } else if (action === "discard") { + await this.discardChanges(documentUri); + window.showInformationMessage("Changes discarded."); + } + } +} diff --git a/clients/vscode/src/outline/index.ts b/clients/vscode/src/outline/index.ts new file mode 100644 index 000000000000..c51c76525b81 --- /dev/null +++ b/clients/vscode/src/outline/index.ts @@ -0,0 +1,167 @@ +import { + window, + TextEditor, + TextDocument, + Range, + Position, + CancellationTokenSource, + ProgressLocation, + Uri, +} from "vscode"; +import { ContextVariables } from "../ContextVariables"; +import { OutlinesProvider } from "./OutlinesProvider"; +import { getLogger } from "../logger"; + +export class OutlinesGenerator { + private outlinesCancellationTokenSource: CancellationTokenSource | null = null; + + constructor( + private contextVariables: ContextVariables, + private outlinesProvider: OutlinesProvider, + ) {} + + async generate() { + const editor = window.activeTextEditor; + if (!editor) { + return; + } + + const editLocation = this.getEditLocation(editor); + + await window.withProgress( + { + location: ProgressLocation.Notification, + title: "Generating natural language outlines...", + cancellable: true, + }, + async (_, token) => { + this.contextVariables.outlinesGenerationInProgress = true; + if (token.isCancellationRequested) { + return; + } + + this.outlinesCancellationTokenSource = new CancellationTokenSource(); + token.onCancellationRequested(() => { + this.outlinesCancellationTokenSource?.cancel(); + }); + + try { + await this.outlinesProvider.provideOutlinesGenerate({ + location: editLocation, + editor: editor, + }); + } catch (error) { + if (typeof error === "object" && error && "message" in error && typeof error.message === "string") { + window.showErrorMessage(`Error generating outlines: ${error.message}`); + } + } finally { + this.outlinesCancellationTokenSource?.dispose(); + this.outlinesCancellationTokenSource = null; + this.contextVariables.outlinesGenerationInProgress = false; + } + }, + ); + } + + async editOutline(uri?: Uri, startLine?: number) { + const editor = window.activeTextEditor; + if (!editor) return; + + let documentUri: string; + let line: number; + if (uri && startLine !== undefined) { + documentUri = uri.toString(); + line = startLine; + } else { + documentUri = editor.document.uri.toString(); + line = editor.selection.active.line; + } + + const content = this.outlinesProvider.getOutline(documentUri, line); + if (!content) return; + + const quickPick = window.createQuickPick(); + quickPick.items = [{ label: content }]; + quickPick.placeholder = "Edit NL Outline content"; + quickPick.value = content; + + quickPick.onDidAccept(async () => { + const newContent = quickPick.value; + quickPick.hide(); + await window.withProgress( + { + location: ProgressLocation.Notification, + title: "Updating NL Outline", + cancellable: false, + }, + async (progress) => { + progress.report({ increment: 0 }); + try { + await this.outlinesProvider.updateOutline(documentUri, line, newContent); + progress.report({ increment: 100 }); + window.showInformationMessage(`Updated NL Outline: ${newContent}`); + } catch (error) { + getLogger().error("Error updating NL Outline:", error); + window.showErrorMessage( + `Error updating NL Outline: ${error instanceof Error ? error.message : String(error)}`, + ); + } + }, + ); + }); + + quickPick.show(); + } + + async acceptOutline() { + const editor = window.activeTextEditor; + if (!editor) { + return; + } + await this.outlinesProvider.resolveOutline("accept"); + } + + async discardOutline() { + const editor = window.activeTextEditor; + if (!editor) { + return; + } + await this.outlinesProvider.resolveOutline("discard"); + } + + private getEditLocation(editor: TextEditor): { uri: Uri; range: Range } { + if (!editor.selection.isEmpty) { + return { + uri: editor.document.uri, + range: new Range(editor.selection.start, editor.selection.end), + }; + } + + const visibleRanges = editor.visibleRanges; + if (visibleRanges.length > 0) { + const firstVisibleLine = visibleRanges[0]?.start.line; + const lastVisibleLine = visibleRanges[visibleRanges.length - 1]?.end.line; + if (firstVisibleLine === undefined || lastVisibleLine === undefined) { + throw new Error("Unable to determine visible range"); + } + const offsetRange = this.getOffsetRange(editor.document, firstVisibleLine, lastVisibleLine, 20); + return { + uri: editor.document.uri, + range: offsetRange, + }; + } + + const currentLine = editor.selection.active.line; + const offsetRange = this.getOffsetRange(editor.document, currentLine, currentLine, 20); + return { + uri: editor.document.uri, + range: offsetRange, + }; + } + + private getOffsetRange(document: TextDocument, start: number, end: number, offset: number): Range { + const offsetStart = Math.max(0, start - offset); + const offsetEnd = Math.min(document.lineCount - 1, end + offset); + return new Range(new Position(offsetStart, 0), document.lineAt(offsetEnd).range.end); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ecb0bacf679..d1ada94bdb98 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,13 +175,13 @@ importers: version: 3.0.0 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.3.3) + version: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3) tsc-watch: specifier: ^6.2.0 version: 6.2.0(typescript@5.3.3) tsup: specifier: ^8.0.2 - version: 8.0.2(@swc/core@1.3.101)(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.3.3))(typescript@5.3.3) + version: 8.0.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3))(typescript@5.3.3) typescript: specifier: ^5.3.2 version: 5.3.3 @@ -354,6 +354,9 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 + openai: + specifier: ^4.52.7 + version: 4.52.7(encoding@0.1.13) ovsx: specifier: ^0.9.5 version: 0.9.5 @@ -374,7 +377,7 @@ importers: version: 6.2.0(typescript@5.4.5) tsup: specifier: ^8.0.2 - version: 8.0.2(@swc/core@1.3.101)(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5) + version: 8.0.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5) typescript: specifier: ^5.3.2 version: 5.4.5 @@ -395,7 +398,7 @@ importers: version: 18.2.0 react-email: specifier: 2.1.3 - version: 2.1.3(@swc/helpers@0.5.2)(eslint@9.3.0)(ts-node@10.9.2) + version: 2.1.3(@swc/helpers@0.5.2)(eslint@9.3.0)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)) ee/tabby-ui: dependencies: @@ -726,7 +729,7 @@ importers: version: 2.3.0 '@tailwindcss/typography': specifier: ^0.5.9 - version: 0.5.10(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2))) + version: 0.5.10(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2))) '@types/aos': specifier: ^3.0.7 version: 3.0.7 @@ -786,7 +789,7 @@ importers: version: 8.10.0(eslint@8.50.0) eslint-plugin-tailwindcss: specifier: ^3.12.0 - version: 3.13.0(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2))) + version: 3.13.0(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2))) eslint-plugin-unused-imports: specifier: ^3.0.0 version: 3.0.0(@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0)(typescript@5.2.2))(eslint@8.50.0) @@ -816,10 +819,10 @@ importers: version: 1.14.0 tailwindcss: specifier: ^3.3.1 - version: 3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)) + version: 3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)) tailwindcss-animate: specifier: ^1.0.5 - version: 1.0.7(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2))) + version: 1.0.7(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2))) typescript: specifier: ^5.1.3 version: 5.2.2 @@ -2127,14 +2130,17 @@ packages: '@humanwhocodes/config-array@0.11.11': resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -2142,9 +2148,11 @@ packages: '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@humanwhocodes/retry@0.3.0': resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} @@ -2220,6 +2228,7 @@ packages: '@koa/router@12.0.1': resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} engines: {node: '>= 12'} + deprecated: Use v12.0.2 or higher to fix the vulnerability issue '@lezer/common@1.2.0': resolution: {integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==} @@ -2307,56 +2316,48 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@14.1.4': resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@13.5.3': resolution: {integrity: sha512-A/C1shbyUhj7wRtokmn73eBksjTM7fFQoY2v/0rTM5wehpkjQRLOXI8WJsag2uLhnZ4ii5OzR1rFPwoD9cvOgA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@14.1.4': resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@13.5.3': resolution: {integrity: sha512-FubPuw/Boz8tKkk+5eOuDHOpk36F80rbgxlx4+xty/U71e3wZZxVYHfZXmf0IRToBn1Crb8WvLM9OYj/Ur815g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@14.1.4': resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@13.5.3': resolution: {integrity: sha512-DPw8nFuM1uEpbX47tM3wiXIR0Qa+atSzs9Q3peY1urkhofx44o7E1svnq+a5Q0r8lAcssLrwiM+OyJJgV/oj7g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@14.1.4': resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@13.5.3': resolution: {integrity: sha512-zBPSP8cHL51Gub/YV8UUePW7AVGukp2D8JU93IHbVDu2qmhFAn9LWXiOOLKplZQKxnIPUkJTQAJDCWBWU4UWUA==} @@ -2448,35 +2449,30 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.3.0': resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.3.0': resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.3.0': resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.3.0': resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.3.0': resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} @@ -3382,55 +3378,46 @@ packages: resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} @@ -3528,28 +3515,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.3.101': resolution: {integrity: sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.3.101': resolution: {integrity: sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.3.101': resolution: {integrity: sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.3.101': resolution: {integrity: sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==} @@ -6367,16 +6350,20 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} @@ -6703,6 +6690,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -9152,6 +9140,7 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.7: @@ -10802,7 +10791,7 @@ snapshots: '@azure/core-util': 1.9.0 '@azure/logger': 1.1.2 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4(supports-color@9.4.0) + https-proxy-agent: 7.0.4 tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -10878,7 +10867,7 @@ snapshots: '@babel/traverse': 7.23.5 '@babel/types': 7.23.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10898,7 +10887,7 @@ snapshots: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -11267,7 +11256,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.5 '@babel/types': 7.23.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -11282,7 +11271,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -11799,7 +11788,7 @@ snapshots: '@eslint/eslintrc@2.1.2': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 globals: 13.22.0 ignore: 5.3.1 @@ -11813,7 +11802,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -11827,7 +11816,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) espree: 10.0.1 globals: 14.0.0 ignore: 5.3.1 @@ -12209,7 +12198,7 @@ snapshots: '@types/json-stable-stringify': 1.0.36 '@whatwg-node/fetch': 0.9.14 chalk: 4.1.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) dotenv: 16.3.1 graphql: 16.8.1 graphql-request: 6.1.0(encoding@0.1.13)(graphql@16.8.1) @@ -12297,7 +12286,7 @@ snapshots: '@humanwhocodes/config-array@0.11.11': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12305,7 +12294,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12313,7 +12302,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12410,7 +12399,7 @@ snapshots: '@koa/router@12.0.1': dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) http-errors: 2.0.0 koa-compose: 4.1.0 methods: 1.1.2 @@ -13954,13 +13943,13 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/typography@0.5.10(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)))': + '@tailwindcss/typography@0.5.10(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)) + tailwindcss: 3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)) '@tiptap/core@2.6.6(@tiptap/pm@2.6.6)': dependencies: @@ -14282,7 +14271,7 @@ snapshots: '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -14302,7 +14291,7 @@ snapshots: '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -14340,7 +14329,7 @@ snapshots: '@typescript-eslint/type-utils': 7.4.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/utils': 7.4.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 7.4.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -14357,7 +14346,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 optionalDependencies: typescript: 5.2.2 @@ -14370,7 +14359,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.3.3 @@ -14383,7 +14372,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 @@ -14396,7 +14385,7 @@ snapshots: '@typescript-eslint/types': 7.10.0 '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.10.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 9.3.0 optionalDependencies: typescript: 5.4.5 @@ -14427,7 +14416,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.3.3) optionalDependencies: @@ -14439,7 +14428,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -14451,7 +14440,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) '@typescript-eslint/utils': 7.10.0(eslint@9.3.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 9.3.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -14463,7 +14452,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.2.2) '@typescript-eslint/utils': 7.4.0(eslint@8.50.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 ts-api-utils: 1.3.0(typescript@5.2.2) optionalDependencies: @@ -14483,7 +14472,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.2 @@ -14497,7 +14486,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -14512,7 +14501,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -14527,7 +14516,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.10.0 '@typescript-eslint/visitor-keys': 7.10.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -14542,7 +14531,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -14557,7 +14546,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.4.0 '@typescript-eslint/visitor-keys': 7.4.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -14787,7 +14776,7 @@ snapshots: '@koa/router': 12.0.1 gunzip-maybe: 1.4.2 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4(supports-color@9.4.0) + https-proxy-agent: 7.0.4 koa: 2.15.3 koa-morgan: 1.0.1 koa-mount: 4.0.0 @@ -15090,13 +15079,19 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.0: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + agent-base@7.1.1: + dependencies: + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16389,7 +16384,7 @@ snapshots: engine.io-client@6.5.3: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) engine.io-parser: 5.2.2 ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 @@ -16409,7 +16404,7 @@ snapshots: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) engine.io-parser: 5.2.2 ws: 8.11.0 transitivePeerDependencies: @@ -16704,10 +16699,10 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.50.0): dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.50.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.50.0))(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) fast-glob: 3.3.1 get-tsconfig: 4.7.2 @@ -16723,7 +16718,7 @@ snapshots: dependencies: eslint: 9.3.0 - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.50.0))(eslint@8.50.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -16760,7 +16755,7 @@ snapshots: eslint-plugin-import-x@0.5.0(eslint@9.3.0)(typescript@5.4.5): dependencies: '@typescript-eslint/utils': 7.4.0(eslint@9.3.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 eslint: 9.3.0 eslint-import-resolver-node: 0.3.9 @@ -16782,7 +16777,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.50.0))(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -16804,7 +16799,7 @@ snapshots: '@es-joy/jsdoccomment': 0.43.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint: 9.3.0 esquery: 1.5.0 @@ -16919,15 +16914,15 @@ snapshots: regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-tailwindcss@3.13.0(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2))): + eslint-plugin-tailwindcss@3.13.0(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2))): dependencies: fast-glob: 3.3.1 postcss: 8.4.31 - tailwindcss: 3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)) + tailwindcss: 3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)) eslint-plugin-toml@0.11.0(eslint@9.3.0): dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 9.3.0 eslint-compat-utils: 0.5.0(eslint@9.3.0) lodash: 4.17.21 @@ -17003,7 +16998,7 @@ snapshots: eslint-plugin-yml@1.14.0(eslint@9.3.0): dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 9.3.0 eslint-compat-utils: 0.5.0(eslint@9.3.0) lodash: 4.17.21 @@ -17050,7 +17045,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -17093,7 +17088,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -17136,7 +17131,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 eslint-visitor-keys: 4.0.0 @@ -17926,35 +17921,42 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.3.4(supports-color@9.4.0) + agent-base: 7.1.1 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18495,14 +18497,14 @@ snapshots: koa-mount@4.0.0: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) koa-compose: 4.1.0 transitivePeerDependencies: - supports-color koa-send@5.0.1: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: @@ -18522,7 +18524,7 @@ snapshots: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -18585,7 +18587,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 lilconfig: 3.1.1 listr2: 8.2.1 @@ -19151,7 +19153,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -19159,7 +19161,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.9 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -20040,29 +20042,37 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.38 - postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)): + postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)): dependencies: lilconfig: 2.1.0 yaml: 2.3.4 optionalDependencies: postcss: 8.4.31 - ts-node: 10.9.2(@types/node@17.0.45)(typescript@5.2.2) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2) + + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3)): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5) postcss-merge-longhand@7.0.0(postcss@8.4.38): dependencies: @@ -20485,7 +20495,7 @@ snapshots: react: 18.2.0 scheduler: 0.23.0 - react-email@2.1.3(@swc/helpers@0.5.2)(eslint@9.3.0)(ts-node@10.9.2): + react-email@2.1.3(@swc/helpers@0.5.2)(eslint@9.3.0)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)): dependencies: '@babel/parser': 7.24.1 '@radix-ui/colors': 1.0.1 @@ -20526,7 +20536,7 @@ snapshots: source-map-js: 1.0.2 stacktrace-parser: 0.1.10 tailwind-merge: 2.2.0 - tailwindcss: 3.4.0(ts-node@10.9.2) + tailwindcss: 3.4.0(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)) typescript: 5.1.6 transitivePeerDependencies: - '@babel/core' @@ -21215,7 +21225,7 @@ snapshots: socket.io-adapter@2.5.4: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -21225,7 +21235,7 @@ snapshots: socket.io-client@4.7.3: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) engine.io-client: 6.5.3 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -21236,7 +21246,7 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -21245,7 +21255,7 @@ snapshots: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) engine.io: 6.5.4 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 @@ -21601,11 +21611,11 @@ snapshots: dependencies: '@babel/runtime': 7.24.4 - tailwindcss-animate@1.0.7(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2))): dependencies: - tailwindcss: 3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)) + tailwindcss: 3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)) - tailwindcss@3.3.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)): + tailwindcss@3.3.3(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -21624,7 +21634,7 @@ snapshots: postcss: 8.4.31 postcss-import: 15.1.0(postcss@8.4.31) postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2)) + postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2)) postcss-nested: 6.0.1(postcss@8.4.31) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -21632,7 +21642,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.0(ts-node@10.9.2): + tailwindcss@3.4.0(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -21651,7 +21661,7 @@ snapshots: postcss: 8.4.38 postcss-import: 15.1.0(postcss@8.4.38) postcss-js: 4.0.1(postcss@8.4.38) - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5)) postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.16 resolve: 1.22.8 @@ -21685,7 +21695,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser-webpack-plugin@5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)(webpack@5.91.0): + terser-webpack-plugin@5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -21804,7 +21814,28 @@ snapshots: ts-log@2.2.5: {} - ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@17.0.45)(typescript@5.2.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 17.0.45 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.2) + optional: true + + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -21824,7 +21855,7 @@ snapshots: optionalDependencies: '@swc/core': 1.3.101(@swc/helpers@0.5.2) - ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5): + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -21845,23 +21876,25 @@ snapshots: '@swc/core': 1.3.101(@swc/helpers@0.5.2) optional: true - ts-node@10.9.2(@types/node@17.0.45)(typescript@5.2.2): + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@20.12.12)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 + '@types/node': 20.12.12 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.2) optional: true tsc-watch@6.2.0(typescript@5.3.3): @@ -21895,17 +21928,17 @@ snapshots: tsscmp@1.0.6: {} - tsup@8.0.2(@swc/core@1.3.101)(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.3.3))(typescript@5.3.3): + tsup@8.0.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3))(typescript@5.3.3): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.3.3)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -21919,17 +21952,17 @@ snapshots: - supports-color - ts-node - tsup@8.0.2(@swc/core@1.3.101)(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5): + tsup@8.0.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101)(@types/node@18.19.33)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.2))(@types/node@18.19.33)(typescript@5.4.5)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -22334,7 +22367,7 @@ snapshots: vite-node@1.6.0(@types/node@20.12.12)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.1 vite: 5.2.11(@types/node@20.12.12)(terser@5.31.0) @@ -22367,7 +22400,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -22416,7 +22449,7 @@ snapshots: vue-eslint-parser@9.4.2(eslint@9.3.0): dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4(supports-color@8.1.1) eslint: 9.3.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -22498,7 +22531,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: